package com.huixinpn.dionysus.controller;
import com.huixinpn.dionysus.domain.chat.ChatMessage;
import com.huixinpn.dionysus.domain.chat.Room;
import com.huixinpn.dionysus.domain.chat.ServerMessage;
import com.huixinpn.dionysus.domain.user.User;
import com.huixinpn.dionysus.repository.chat.ChatMessageRepository;
import com.huixinpn.dionysus.service.ActiveUserService;
import com.huixinpn.dionysus.service.RoomService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.stereotype.Controller;
import java.security.Principal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@Controller
public class ChatController {
@Autowired
private SimpMessagingTemplate simp;
@Autowired
private ActiveUserService activeUserService;
@Autowired
private ChatMessageRepository chatMessageRepository;
@Autowired
private RoomService roomService;
@MessageMapping("/chat/{id}")
public void handleChat(Message<Object> message, @Payload ChatMessage chatMessage,
@DestinationVariable("id") String id) throws Exception {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message);
Principal userPrincipal = headerAccessor.getUser();
String userName = userPrincipal.getName();
User userDetail = (User)(((UsernamePasswordAuthenticationToken)userPrincipal).getPrincipal());
//UserState userState= activeUserService.getActiveUser(id, userName);
Room room = roomService.getRoom(id);
DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String dateStr =format.format(new Date());
if (room != null){
if (room.getOpen()){
chatMessage.setRoom(room);
chatMessage.setSender(userDetail);
chatMessageRepository.save(chatMessage);
ServerMessage serverMessage = new ServerMessage(chatMessage.getContent(), userName, userDetail.getId(), userDetail.getAvatar(),dateStr );
simp.convertAndSend("/topic/chat/" + id + "/messages", serverMessage);
}
else{
ServerMessage serverMessage = new ServerMessage("此聊天室已关闭", "汇心小编", dateStr);
simp.convertAndSend("/topic/chat/" + id + "/messages", serverMessage);
}
}
else {
ServerMessage serverMessage = new ServerMessage("此聊天室不存在", "汇心小编", dateStr);
simp.convertAndSend("/topic/chat/" + id + "/messages", serverMessage);
}
}
@MessageMapping("/activeUsers/{id}")
public void activeUsers(Message<Object> message, @DestinationVariable("id") String id) throws Exception{
Principal user = message.getHeaders().get(SimpMessageHeaderAccessor.USER_HEADER, Principal.class);
activeUserService.mark(id, user.getName());
}
}