|  | @@ -7,10 +7,8 @@ import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.enums.KfRoomMsgOwnerEnum;
 |  |  import com.zanxiang.game.module.manage.enums.KfRoomMsgOwnerEnum;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
 |  |  import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
 |  |  import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
 | 
											
												
													
														|  | -import com.zanxiang.game.module.manage.pojo.dto.GameAppletDTO;
 |  | 
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.pojo.dto.KfWebSocketMsgDTO;
 |  |  import com.zanxiang.game.module.manage.pojo.dto.KfWebSocketMsgDTO;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.pojo.params.KfWebSocketMsgParam;
 |  |  import com.zanxiang.game.module.manage.pojo.params.KfWebSocketMsgParam;
 | 
											
												
													
														|  | -import com.zanxiang.game.module.manage.service.IGameAppletService;
 |  | 
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.service.IKfRoomMsgService;
 |  |  import com.zanxiang.game.module.manage.service.IKfRoomMsgService;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.service.IKfRoomService;
 |  |  import com.zanxiang.game.module.manage.service.IKfRoomService;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.manage.service.IKfSessionUserService;
 |  |  import com.zanxiang.game.module.manage.service.IKfSessionUserService;
 | 
											
										
											
												
													
														|  | @@ -20,6 +18,7 @@ import com.zanxiang.game.module.mybatis.entity.KfRoomMsg;
 | 
											
												
													
														|  |  import com.zanxiang.game.module.mybatis.entity.KfSessionUser;
 |  |  import com.zanxiang.game.module.mybatis.entity.KfSessionUser;
 | 
											
												
													
														|  |  import com.zanxiang.module.redis.service.IDistributedLockComponent;
 |  |  import com.zanxiang.module.redis.service.IDistributedLockComponent;
 | 
											
												
													
														|  |  import com.zanxiang.module.util.JsonUtil;
 |  |  import com.zanxiang.module.util.JsonUtil;
 | 
											
												
													
														|  | 
 |  | +import com.zanxiang.module.util.bean.BeanUtil;
 | 
											
												
													
														|  |  import lombok.extern.slf4j.Slf4j;
 |  |  import lombok.extern.slf4j.Slf4j;
 | 
											
												
													
														|  |  import org.apache.logging.log4j.util.Strings;
 |  |  import org.apache.logging.log4j.util.Strings;
 | 
											
												
													
														|  |  import org.springframework.beans.factory.annotation.Autowired;
 |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
											
										
											
												
													
														|  | @@ -30,10 +29,7 @@ import reactor.util.function.Tuple2;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import java.io.IOException;
 |  |  import java.io.IOException;
 | 
											
												
													
														|  |  import java.time.LocalDateTime;
 |  |  import java.time.LocalDateTime;
 | 
											
												
													
														|  | -import java.util.HashMap;
 |  | 
 | 
											
												
													
														|  | -import java.util.List;
 |  | 
 | 
											
												
													
														|  | -import java.util.Map;
 |  | 
 | 
											
												
													
														|  | -import java.util.Objects;
 |  | 
 | 
											
												
													
														|  | 
 |  | +import java.util.*;
 | 
											
												
													
														|  |  import java.util.concurrent.TimeUnit;
 |  |  import java.util.concurrent.TimeUnit;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
										
											
												
													
														|  | @@ -49,9 +45,6 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
 | 
											
												
													
														|  |      @Autowired
 |  |      @Autowired
 | 
											
												
													
														|  |      private KfMsgWebSocketSessionRegistry kfMsgWebSocketSessionRegistry;
 |  |      private KfMsgWebSocketSessionRegistry kfMsgWebSocketSessionRegistry;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    @Autowired
 |  | 
 | 
											
												
													
														|  | -    private IGameAppletService gameAppletService;
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |      @Autowired
 |  |      @Autowired
 | 
											
												
													
														|  |      private IKfRoomService kfRoomService;
 |  |      private IKfRoomService kfRoomService;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -98,42 +91,40 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
 | 
											
												
													
														|  |          //处理不同类型的消息
 |  |          //处理不同类型的消息
 | 
											
												
													
														|  |          switch (webSocketMsgType) {
 |  |          switch (webSocketMsgType) {
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_CONNECT_HEART_BEAT:
 |  |              case WEBSOCKET_MSG_CONNECT_HEART_BEAT:
 | 
											
												
													
														|  | -                log.error("收到客户端心跳消息, param : {}", JsonUtil.toString(param));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("收到客户端心跳消息, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_KF_HAND_SHAKE:
 |  |              case WEBSOCKET_MSG_KF_HAND_SHAKE:
 | 
											
												
													
														|  | -                log.error("首次握手, kfUserId : {}", SecurityUtil.getUserId());
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("首次握手, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  kfHandShake(session, webSocketMsgType);
 |  |                  kfHandShake(session, webSocketMsgType);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_KF_CREATE_CONNECT:
 |  |              case WEBSOCKET_MSG_KF_CREATE_CONNECT:
 | 
											
												
													
														|  | -                log.error("创建连接, kfUserId : {}, gameId : {}", SecurityUtil.getUserId(), gameId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("创建连接, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  kfCreateConnect(session, webSocketMsgType, gameId);
 |  |                  kfCreateConnect(session, webSocketMsgType, gameId);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_USER_CONNECT_JOIN:
 |  |              case WEBSOCKET_MSG_USER_CONNECT_JOIN:
 | 
											
												
													
														|  | -                log.error("玩家接入, kfUserId : {}, gameId : {}", SecurityUtil.getUserId(), gameId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("玩家接入, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  userConnectJoin(session, param);
 |  |                  userConnectJoin(session, param);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_ROOM_HISTORY:
 |  |              case WEBSOCKET_MSG_ROOM_HISTORY:
 | 
											
												
													
														|  | -                log.error("获取房间历史消息, kfUserId : {}, gameId : {}, roomId : {}",
 |  | 
 | 
											
												
													
														|  | -                        SecurityUtil.getUserId(), gameId, param.getRoomId());
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("获取房间历史消息, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  msgRoomHistory(session, param);
 |  |                  msgRoomHistory(session, param);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_KF_SEND:
 |  |              case WEBSOCKET_MSG_KF_SEND:
 | 
											
												
													
														|  | -                // 客服发送消息,可以添加对应的处理逻辑
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("客服发送消息, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  | 
 |  | +                fkSendMsg(session, param);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_FINISH_ROOM_LIST:
 |  |              case WEBSOCKET_MSG_FINISH_ROOM_LIST:
 | 
											
												
													
														|  | -                log.error("获取已结束房间列表, kfUserId : {}, gameId : {}", SecurityUtil.getUserId(), gameId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("获取已结束房间列表, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  finishRoomList(session, param);
 |  |                  finishRoomList(session, param);
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_FINISH_SESSION:
 |  |              case WEBSOCKET_MSG_FINISH_SESSION:
 | 
											
												
													
														|  | -                log.error("结束会话, kfUserId : {}, gameId : {}, roomId : {}",
 |  | 
 | 
											
												
													
														|  | -                        SecurityUtil.getUserId(), gameId, param.getRoomId());
 |  | 
 | 
											
												
													
														|  | 
 |  | +                log.error("结束会话, kfUserId : {}, param : {}", SecurityUtil.getUserId(), JsonUtil.toString(param));
 | 
											
												
													
														|  |                  kfFinishSession(session, webSocketMsgType, gameId, param.getRoomId());
 |  |                  kfFinishSession(session, webSocketMsgType, gameId, param.getRoomId());
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              case WEBSOCKET_MSG_QUICK_REPLY:
 |  |              case WEBSOCKET_MSG_QUICK_REPLY:
 | 
											
												
													
														|  |                  // 快捷回复,可以添加对应的处理逻辑
 |  |                  // 快捷回复,可以添加对应的处理逻辑
 | 
											
												
													
														|  |                  break;
 |  |                  break;
 | 
											
												
													
														|  |              default:
 |  |              default:
 | 
											
												
													
														|  | -                // 未知消息类型,可以添加对应的处理逻辑
 |  | 
 | 
											
												
													
														|  |                  this.sendMessage(session, KfWebSocketMsgDTO.fail(webSocketMsgType, "参数错误, 未知的消息类型"));
 |  |                  this.sendMessage(session, KfWebSocketMsgDTO.fail(webSocketMsgType, "参数错误, 未知的消息类型"));
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -169,15 +160,21 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      private void fkSendMsg(WebSocketSession session, KfWebSocketMsgParam param) {
 |  |      private void fkSendMsg(WebSocketSession session, KfWebSocketMsgParam param) {
 | 
											
												
													
														|  | -        //查询小程序信息
 |  | 
 | 
											
												
													
														|  | -        GameAppletDTO gameAppletDTO = gameAppletService.getByGameId(param.getGameId());
 |  | 
 | 
											
												
													
														|  | -        if (gameAppletDTO == null) {
 |  | 
 | 
											
												
													
														|  | -            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(),
 |  | 
 | 
											
												
													
														|  | -                    "参数错误, 小程序信息不存在, param : " + JsonUtil.toString(param)));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (param.getRoomId() == null) {
 | 
											
												
													
														|  | 
 |  | +            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "参数错误,roomId为空"));
 | 
											
												
													
														|  | 
 |  | +            return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        KfRoom kfRoom = kfRoomService.getById(param.getRoomId());
 | 
											
												
													
														|  | 
 |  | +        if (kfRoom == null) {
 | 
											
												
													
														|  | 
 |  | +            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "参数错误,房间信息不存在"));
 | 
											
												
													
														|  |              return;
 |  |              return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        //发送消息
 |  | 
 | 
											
												
													
														|  |          KfWebSocketMsgParam.MsgContentBean msgContent = param.getMsgContent();
 |  |          KfWebSocketMsgParam.MsgContentBean msgContent = param.getMsgContent();
 | 
											
												
													
														|  | 
 |  | +        if (msgContent == null) {
 | 
											
												
													
														|  | 
 |  | +            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "参数错误,消息内容不可为空"));
 | 
											
												
													
														|  | 
 |  | +            return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        //发送消息
 | 
											
												
													
														|  |          Map<String, Object> msgParamMap = new HashMap<>(3);
 |  |          Map<String, Object> msgParamMap = new HashMap<>(3);
 | 
											
												
													
														|  |          msgParamMap.put("touser", param.getOpenId());
 |  |          msgParamMap.put("touser", param.getOpenId());
 | 
											
												
													
														|  |          //文本
 |  |          //文本
 | 
											
										
											
												
													
														|  | @@ -189,18 +186,45 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          //图片
 |  |          //图片
 | 
											
												
													
														|  |          if (Objects.equals(msgContent.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE)) {
 |  |          if (Objects.equals(msgContent.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE)) {
 | 
											
												
													
														|  | -//            Map<String, Object> imageMap = new HashMap<>(1);
 |  | 
 | 
											
												
													
														|  | -//            imageMap.put("media_id", msgContent.getText());
 |  | 
 | 
											
												
													
														|  | -//            msgParamMap.put("msgtype", KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE.getValue());
 |  | 
 | 
											
												
													
														|  | -//            msgParamMap.put(KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE.getValue(), imageMap);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            Map<String, Object> imageMap = new HashMap<>(1);
 | 
											
												
													
														|  | 
 |  | +            //图片需要上传到腾讯, 转成 media_id
 | 
											
												
													
														|  | 
 |  | +            imageMap.put("media_id", "media_id");
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +            msgParamMap.put("msgtype", KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE.getValue());
 | 
											
												
													
														|  | 
 |  | +            msgParamMap.put(KfRoomMsgTypeEnum.KF_MSG_TYPE_IMAGE.getValue(), imageMap);
 | 
											
												
													
														|  |              this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(),
 |  |              this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(),
 | 
											
												
													
														|  | -                    "发图片的逻辑还没写完, 先发文本, param : " + JsonUtil.toString(param)));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    "发图片上传素材的逻辑还没写完, 先发文本, param : " + JsonUtil.toString(param)));
 | 
											
												
													
														|  | 
 |  | +            return;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        //调腾讯接口发送消息
 | 
											
												
													
														|  | 
 |  | +        Tuple2<Long, String> tuple2 = wxApiService.sendCustomMessageApi(param.getGameId(), msgParamMap);
 | 
											
												
													
														|  | 
 |  | +        Long result = tuple2.getT1();
 | 
											
												
													
														|  | 
 |  | +        //发送失败, 通知返回通知客户端
 | 
											
												
													
														|  | 
 |  | +        if (result != 0) {
 | 
											
												
													
														|  | 
 |  | +            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), tuple2.getT2()));
 | 
											
												
													
														|  |              return;
 |  |              return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        wxApiService.sendCustomMessageApi(gameAppletDTO, msgParamMap);
 |  | 
 | 
											
												
													
														|  | -        //发送失败, 通知返回
 |  | 
 | 
											
												
													
														|  |          //发送成功, 消息入库
 |  |          //发送成功, 消息入库
 | 
											
												
													
														|  | 
 |  | +        kfRoomMsgService.save(this.transform(param.getGameId(), kfRoom, msgContent));
 | 
											
												
													
														|  | 
 |  | +        this.sendMessage(session, KfWebSocketMsgDTO.ok(param.getWebSocketMsgType()));
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    private KfRoomMsg transform(Long gameId, KfRoom kfRoom, KfWebSocketMsgParam.MsgContentBean msgContent) {
 | 
											
												
													
														|  | 
 |  | +        return KfRoomMsg.builder()
 | 
											
												
													
														|  | 
 |  | +                .msgId(UUID.randomUUID().toString().replace("-", ""))
 | 
											
												
													
														|  | 
 |  | +                .msgType(msgContent.getMsgType().getValue())
 | 
											
												
													
														|  | 
 |  | +                .gameId(gameId)
 | 
											
												
													
														|  | 
 |  | +                .openId(kfRoom.getOpenId())
 | 
											
												
													
														|  | 
 |  | +                .userId(kfRoom.getUserId())
 | 
											
												
													
														|  | 
 |  | +                .kfUserId(kfRoom.getKfUserId())
 | 
											
												
													
														|  | 
 |  | +                .readStatus(Boolean.TRUE)
 | 
											
												
													
														|  | 
 |  | +                .roomId(kfRoom.getId())
 | 
											
												
													
														|  | 
 |  | +                .msgOwner(KfRoomMsgOwnerEnum.KF_MSG_OWNER_KF.getValue())
 | 
											
												
													
														|  | 
 |  | +                .content(JsonUtil.toString(BeanUtil.copy(msgContent, KfWebSocketMsgDTO.MsgContentBean.class)))
 | 
											
												
													
														|  | 
 |  | +                .source(JsonUtil.toString(msgContent))
 | 
											
												
													
														|  | 
 |  | +                .createTime(LocalDateTime.now())
 | 
											
												
													
														|  | 
 |  | +                .updateTime(LocalDateTime.now())
 | 
											
												
													
														|  | 
 |  | +                .build();
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      private void kfFinishSession(WebSocketSession session, KfWebSocketMsgEnum webSocketMsgType, Long gameId, Long roomId) {
 |  |      private void kfFinishSession(WebSocketSession session, KfWebSocketMsgEnum webSocketMsgType, Long gameId, Long roomId) {
 | 
											
										
											
												
													
														|  | @@ -274,11 +298,15 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
 | 
											
												
													
														|  |                  .set(KfSessionUser::getUpdateTime, LocalDateTime.now())
 |  |                  .set(KfSessionUser::getUpdateTime, LocalDateTime.now())
 | 
											
												
													
														|  |                  .eq(KfSessionUser::getOpenId, param.getOpenId())
 |  |                  .eq(KfSessionUser::getOpenId, param.getOpenId())
 | 
											
												
													
														|  |          );
 |  |          );
 | 
											
												
													
														|  | 
 |  | +        //玩家信息
 | 
											
												
													
														|  | 
 |  | +        KfSessionUser kfSessionUser = kfSessionUserService.getById(param.getOpenId());
 | 
											
												
													
														|  |          //房间更新
 |  |          //房间更新
 | 
											
												
													
														|  |          Long roomId = kfRoomService.userJoinRoom(param.getOpenId(), param.getGameId());
 |  |          Long roomId = kfRoomService.userJoinRoom(param.getOpenId(), param.getGameId());
 | 
											
												
													
														|  |          //玩家未读消息更新到房间
 |  |          //玩家未读消息更新到房间
 | 
											
												
													
														|  |          kfRoomMsgService.update(new LambdaUpdateWrapper<KfRoomMsg>()
 |  |          kfRoomMsgService.update(new LambdaUpdateWrapper<KfRoomMsg>()
 | 
											
												
													
														|  |                  .set(KfRoomMsg::getRoomId, roomId)
 |  |                  .set(KfRoomMsg::getRoomId, roomId)
 | 
											
												
													
														|  | 
 |  | +                .set(KfRoomMsg::getUserId, kfSessionUser == null ? null : kfSessionUser.getUserId())
 | 
											
												
													
														|  | 
 |  | +                .set(KfRoomMsg::getKfUserId, SecurityUtil.getUserId())
 | 
											
												
													
														|  |                  .set(KfRoomMsg::getUpdateTime, LocalDateTime.now())
 |  |                  .set(KfRoomMsg::getUpdateTime, LocalDateTime.now())
 | 
											
												
													
														|  |                  .eq(KfRoomMsg::getOpenId, param.getOpenId())
 |  |                  .eq(KfRoomMsg::getOpenId, param.getOpenId())
 | 
											
												
													
														|  |                  .eq(KfRoomMsg::getGameId, param.getGameId())
 |  |                  .eq(KfRoomMsg::getGameId, param.getGameId())
 |