package com.xe.demo.common.netty;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.annotation.OnConnect;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import com.corundumstudio.socketio.annotation.OnEvent;
import com.xe.demo.common.pojo.CacheMap;
import com.xe.demo.common.pojo.MessageInfo;
import com.xe.demo.common.pojo.MessageRoom;
import com.xe.demo.model.User;
import com.xe.demo.service.UserService;
@Component
public class MessageEventHandler {
private static Map clientMap = new HashMap();
@Autowired
private UserService userService;
// 添加connect事件,当客户端发起连接时调用,本文中将clientid与sessionid存入数据库
// 方便后面发送消息时查找到对应的目标client,
@OnConnect
public void onConnect(SocketIOClient client) {
String uid = client.getHandshakeData().getSingleUrlParam("uid");
if(!clientMap.containsKey(uid)){
clientMap.put(uid, client);
}
User user = userService.queryUser(new User(uid, null));
if (user != null) {
user.setOnline(1);
userService.update(user);
}
}
// 添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息
@OnDisconnect
public void onDisconnect(SocketIOClient client) {
String uid = client.getHandshakeData().getSingleUrlParam("uid");
clientMap.remove(uid);
User user = userService.queryUser(new User(uid, null));
if (user != null) {
user.setOnline(0);
userService.update(user);
if(1 != user.getType()){//非客服用户
Map value = userService.queryCustomerInfo(uid);
//清除对应的缓存值
CacheMap.remove(value);
}
}
}
// 消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
@OnEvent(value = "sendMsg")
public void sendMsg(SocketIOClient client, AckRequest request, MessageInfo sendData) {
client.sendEvent("sendMsg", sendData);
String tagUid = sendData.getTagUid();
SocketIOClient tagClient = clientMap.get(tagUid);
if(null != tagClient){
tagClient.sendEvent("sendMsg", sendData);
if(1 != sendData.getSrcType()){//非客服用户
//该客服服务的用户列表
@SuppressWarnings("unchecked")
List> list = (List>) CacheMap.getValue(tagUid);
if(null == list){
list = new ArrayList>();
}
//当前用户信息
Map map = userService.queryCustomerInfo(sendData.getSrcUid());
if(!list.contains(map)){//第一次访问,放入缓存
list.add(map);
//存放缓存
CacheMap.setValue(tagUid, list);
}
}
}
}
// 加入聊天室
@SuppressWarnings("unchecked")
@OnEvent(value = "joinRoom")
public void joinRoom(SocketIOClient client, MessageRoom sendData) {
List list = (List) CacheMap.getValue("ROOM");
if(null == list){
list = new ArrayList();
}
if(!list.contains(client)){
list.add(client);
CacheMap.setValue("ROOM", list);
//在线用户列表
List userList = (List) CacheMap.getValue("ROOM_USERS");
if(null == userList){
userList = new ArrayList();
}
//新加入聊天室
if(!userList.contains(sendData.getNickname())){
userList.add(sendData.getNickname());
CacheMap.setValue("ROOM_USERS", userList);
}
sendData.setOnlineUsers(userList);
sendData.setOnlineCount(userList.size());
}
broadcast("joinRoom", sendData);
}
//退出聊天室
@SuppressWarnings("unchecked")
@OnEvent(value = "outRoom")
public void outRoom(SocketIOClient client, MessageRoom sendData) {
List list = (List) CacheMap.getValue("ROOM");
list.remove(client);
CacheMap.setValue("ROOM", list);
//在线用户列表
List userList = (List) CacheMap.getValue("ROOM_USERS");
userList.remove(sendData.getNickname());
CacheMap.setValue("ROOM_USERS", userList);
sendData.setOnlineUsers(userList);
sendData.setOnlineCount(userList.size());
broadcast("outRoom", sendData);
}
// 聊天室聊天
@OnEvent(value = "chatRoom")
public void chatRoom(SocketIOClient client, MessageRoom sendData) {
broadcast("chatRoom", sendData);
}
//聊天室广播
private void broadcast(String cmd, MessageRoom sendData){
@SuppressWarnings("unchecked")
List list = (List) CacheMap.getValue("ROOM");
for(SocketIOClient client: list){
client.sendEvent(cmd, sendData);
}
}
}