package com.chughes.dip.controller; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.chughes.dip.chat.Message; import com.chughes.dip.chat.Post; import com.chughes.dip.chat.UIChat; import com.chughes.dip.chat.UIChatRequest; import com.chughes.dip.data.ChatRepository; import com.chughes.dip.data.GameRepository; import com.chughes.dip.data.UserRepository; import com.chughes.dip.game.UserGameEntity; import com.chughes.dip.user.UserDetailsImpl; import com.chughes.dip.user.UserEntity; @Controller public class ChatController { @Autowired UserRepository us; @Autowired ChatRepository cr; @Autowired GameRepository gr; @PreAuthorize("hasRole('PLAYER')") @RequestMapping(value="/forum") public String forum(Model m){ m.addAttribute("topics", cr.getTopics()); return "forum"; } @PreAuthorize("hasRole('PLAYER')") @RequestMapping(value="/JSONchat") public @ResponseBody String post(@RequestBody UIChat chat){ Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth.getPrincipal() instanceof UserDetailsImpl){ UserDetailsImpl user = (UserDetailsImpl)auth.getPrincipal(); UserEntity ue = us.getUserEntity(user.getId()); Post p = new Post(); p.setAuthor(ue); //strip html and save p.setText(chat.getMessage().replaceAll("\\<.*?>","")); p.setTimestamp(new Date()); System.out.println(chat.getTo()); if (chat.getTo() != -1){ cr.savePost(p); Post parent = cr.getTopic(chat.getTo()); parent.getReplies().add(p); cr.savePost(parent); }else{ p.setToplevel(true); p.setSubject(chat.getSubject()); cr.savePost(p); } return "success"; } return "fail"; } @RequestMapping(value="/game/JSONchat") public @ResponseBody Map<String, Integer> chat(@RequestBody UIChat chat){ UserDetailsImpl user = null; Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth.getPrincipal() instanceof UserDetails){ UserDetails user1 = (UserDetails)auth.getPrincipal(); user = (UserDetailsImpl) user1; //UserEntity ue = us.getUserEntity(user.getId()); //System.out.println(user.getUsername()+" is Logged In"); UserGameEntity uge = gr.inGameUser(chat.getGameid(), user.getId()); if (uge != null){ UserGameEntity gu = null; if (chat.getTo() != -1){ gu = gr.inGameUser(chat.getTo()); } if (uge.getGame().getPlayers().contains(gu) || chat.getTo() == -1){ Message m = new Message(); m.setText(chat.getMessage()); m.setTimestamp(new Date()); m.setFrom(uge); uge.getMessages().add(m); if (gu != null){ gu.getMessages().add(m); gu.setUnread(true); m.setTo(gu); } cr.saveMessage(m); gr.saveInGameUser(uge); if (gu != null)gr.saveInGameUser(gu); return Collections.singletonMap("success", 1); } } } return null; } @RequestMapping(value="/game/JSONmessages") public @ResponseBody List<SortedMap<String, String>> retreiveChat(@RequestBody UIChatRequest request){ UserDetailsImpl user = null; Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth.getPrincipal() instanceof UserDetails){ UserDetails user1 = (UserDetails)auth.getPrincipal(); user = (UserDetailsImpl) user1; UserGameEntity uge = gr.inGameUser(request.getGameid(), user.getId()); if (uge != null){ List<SortedMap<String,String>> result = new ArrayList<SortedMap<String,String>>(); uge.setUnread(false); List<Object[]> re = cr.getMessages(user.getId(), request); Map<Integer, Long> read = uge.getReadlog(); for (Object[] m : re) { if (m.length == 5){ SortedMap<String,String> mess = new TreeMap<String,String>(); mess.put("id", ((Integer) m[0]).toString()); mess.put("text", (String) m[1]); mess.put("fromid", ((Integer) m[2]).toString()); mess.put("fromuser", (String) m[3]); if (m[4] != null){ if (read.get(request.getFromid()) == null || ((Date) m[4]).getTime() > read.get(request.getFromid()))mess.put("new", "true"); else mess.put("new", "false"); mess.put("timestamp", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format((Date) m[4])); }else{ mess.put("timestamp", new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(new Date(959212800l))); } result.add(mess); } } read.remove(request.getFromid()); read.put(request.getFromid(), new Date().getTime()); gr.saveInGameUser(uge); return result; } } return null; } }