From cd59cd93b4eceee7b5f948a19d4e78371348fcd0 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 27 Jun 2024 10:29:27 +0800
Subject: [PATCH] 后台

---
 src/main/java/cc/mrbird/febs/mall/vo/ApiGamePlayerVo.java           |    3 +
 src/main/java/cc/mrbird/febs/mall/service/impl/GameServiceImpl.java |   66 ++++++++++++++++++++++++++++-----
 src/main/java/cc/mrbird/febs/websocket/HttpAuthHandler.java         |    7 +++
 src/main/java/cc/mrbird/febs/mall/quartz/RedisLinkHoldJob.java      |   25 ++++++++++++
 src/main/java/cc/mrbird/febs/websocket/WebSocketRes.java            |    9 ++++
 src/main/java/cc/mrbird/febs/websocket/WsAuthInterceptor.java       |    2 
 6 files changed, 100 insertions(+), 12 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/RedisLinkHoldJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/RedisLinkHoldJob.java
new file mode 100644
index 0000000..9d13ed5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/RedisLinkHoldJob.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.mall.quartz;
+
+import cc.mrbird.febs.common.utils.RedisUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wzy
+ * @date 2022-06-07
+ **/
+@Slf4j
+@Component
+public class RedisLinkHoldJob {
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+
+    @Scheduled(cron = "0/5 * * * * ?")
+    public void redisLinkHold() {
+        redisUtils.set("redis_link_hold", 1);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/GameServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/GameServiceImpl.java
index 6218867..ad6c898 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/GameServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/GameServiceImpl.java
@@ -3,10 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.enumerates.*;
 import cc.mrbird.febs.common.exception.FebsException;
-import cc.mrbird.febs.common.utils.AppContants;
-import cc.mrbird.febs.common.utils.LoginUserUtil;
-import cc.mrbird.febs.common.utils.MallUtils;
-import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.common.utils.*;
 import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.mapper.*;
@@ -14,10 +11,12 @@
 import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
 import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
 import cc.mrbird.febs.mall.vo.*;
+import cc.mrbird.febs.websocket.WebSocketRes;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
@@ -100,6 +99,14 @@
         Integer partner = ObjectUtil.isEmpty(mallMember.getPartner()) ? 2 : mallMember.getPartner();
         if(AppContants.MEMBER_PARTNER_NO == partner){
             throw new FebsException("用户没有创建房间的权限!");
+        }
+
+        QueryWrapper<GameRoom> gameRoomQuery = new QueryWrapper<>();
+        gameRoomQuery.eq("owner_member_id",memberId);
+        gameRoomQuery.ne("state",GameRoom.STATE_DONE);
+        List<GameRoom> gameRoomsExists = gameRoomMapper.selectList(gameRoomQuery);
+        if(CollUtil.isNotEmpty(gameRoomsExists)){
+            throw new FebsException("房间已创建!房间码为:"+gameRoomsExists.get(0).getPassword());
         }
 
         Integer roomType = apiCreateRoomDto.getRoomType();
@@ -192,7 +199,10 @@
         /**
          * 给房间里面的所有人发送一个开始的信息
          */
-        this.sendMsgByRoomId(roomId,"START:"+gameGame.getId());
+        WebSocketRes webSocketRes = new WebSocketRes();
+        webSocketRes.setCode(200);
+        webSocketRes.setMsg(gameGame.getId().toString());
+        this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString());
 
         ApiStartGameVo apiStartGameVo = new ApiStartGameVo();
         apiStartGameVo.setRoomType(gameRoom.getRoomType());
@@ -364,7 +374,13 @@
         /**
          * 给房间里面的所有人发送一个开始的信息
          */
-        this.sendMsgByRoomId(roomId,"TZ:"+gameGame.getId());
+
+
+        WebSocketRes webSocketRes = new WebSocketRes();
+        webSocketRes.setCode(200);
+        webSocketRes.setMsg(gameId.toString());
+        this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString());
+//        this.sendMsgByRoomId(roomId,"TZ:"+gameGame.getId());
 
         return new FebsResponse().success().message("操作成功");
     }
@@ -391,6 +407,24 @@
         if(GameRoom.STATE_DONE == gameRoom.getState()){
             throw new FebsException("房间已失效");
         }
+
+        QueryWrapper<GameRoomChild> roomChildQueryWrapper = new QueryWrapper<>();
+        roomChildQueryWrapper.eq("member_id",memberId);
+        List<GameRoomChild> roomChildExists = gameRoomChildMapper.selectList(roomChildQueryWrapper);
+        if(CollUtil.isNotEmpty(roomChildExists)){
+            List<Long> roomIds = roomChildExists.stream().map(GameRoomChild::getRoomId).collect(Collectors.toList());
+
+            QueryWrapper<GameRoom> roomQuery = new QueryWrapper<>();
+            roomQuery.in("id",roomIds);
+            List<GameRoom> gameRooms = gameRoomMapper.selectList(roomQuery);
+            List<GameRoom> collect = gameRooms.stream().filter(room -> room.getState() != GameRoom.STATE_DONE).collect(Collectors.toList());
+            if(CollUtil.isNotEmpty(collect)){
+                if(collect.size() > 1){
+                    throw new FebsException("请回到房间,房间码:"+collect.get(0).getPassword());
+                }
+            }
+        }
+
 
         ApiGamePlayerVo apiGamePlayerVo = new ApiGamePlayerVo();
 
@@ -440,6 +474,10 @@
         apiGamePlayerVo.setPassword(gameRoom.getPassword());
         apiGamePlayerVo.setState(gameRoom.getState());
         apiGamePlayerVo.setGameTime(gameRoom.getGameTime());
+
+        Long ownerMemberId = gameRoom.getOwnerMemberId();
+        MallMember mallMember = mallMemberMapper.selectById(ownerMemberId);
+        apiGamePlayerVo.setRoomOwner(mallMember.getAccountLogin());
 
         QueryWrapper<GameGame> gameGameQueryWrapper = new QueryWrapper<>();
         gameGameQueryWrapper.eq("room_id",gameRoom.getId());
@@ -517,7 +555,11 @@
         //结算 todo 改成rabbitMq消息推送,注意游戏主表的状态变化
         this.perkGameGameChild(gameId,firstNum,secondNum);
 
-        this.sendMsgByRoomId(roomId,"DONE:"+gameId);
+        WebSocketRes webSocketRes = new WebSocketRes();
+        webSocketRes.setCode(200);
+        webSocketRes.setMsg(gameId.toString());
+        this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString());
+//        this.sendMsgByRoomId(roomId,"DONE:"+gameId);
 
         ApiEndGameVo apiEndGameVo = new ApiEndGameVo();
         apiEndGameVo.setRoomId(roomId);
@@ -725,7 +767,7 @@
         Long memberId = LoginUserUtil.getLoginUser().getId();
         Long roomId = apiExistGameDto.getRoomId();
         /**
-         * 删除房间子表的数据
+         * 更新房间子表的数据
          */
         MallMember mallMember = mallMemberMapper.selectById(memberId);
         QueryWrapper<GameRoomChild> gameRoomChildQueryWrapper = new QueryWrapper<>();
@@ -743,11 +785,15 @@
                 gameRoom.setState(GameRoom.STATE_DONE);
                 gameRoomMapper.updateById(gameRoom);
 
-                this.sendMsgByRoomId(roomId,"OVER");
+                WebSocketRes webSocketRes = new WebSocketRes();
+                webSocketRes.setCode(200);
+                webSocketRes.setMsg("OVER");
+                this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString());
+//                this.sendMsgByRoomId(roomId,"OVER");
             }
         }
         //断开websocket
-        WsSessionManager.remove(mallMember.getInviteId());
+        WsSessionManager.removeAndClose(mallMember.getInviteId());
 
         return new FebsResponse().success();
     }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiGamePlayerVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiGamePlayerVo.java
index 7faa634..ad91a82 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/ApiGamePlayerVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiGamePlayerVo.java
@@ -35,6 +35,9 @@
     @ApiModelProperty(value = "房间类型 1-初级房2-土豪房3-尊爵房")
     private Integer roomType;//房间类型 1-初级房2-土豪房3-尊爵房
 
+    @ApiModelProperty(value = "房主昵称")
+    private String roomOwner;//房间类型 1-初级房2-土豪房3-尊爵房
+
     @ApiModelProperty(value = "房间状态0-未开始1-正常2-结束")
     private Integer state;//房间状态0-未开始1-正常2-结束
 
diff --git a/src/main/java/cc/mrbird/febs/websocket/HttpAuthHandler.java b/src/main/java/cc/mrbird/febs/websocket/HttpAuthHandler.java
index f4b6696..240eae1 100644
--- a/src/main/java/cc/mrbird/febs/websocket/HttpAuthHandler.java
+++ b/src/main/java/cc/mrbird/febs/websocket/HttpAuthHandler.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.websocket;
 
+import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.web.socket.CloseStatus;
@@ -32,7 +33,11 @@
     @Override
     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
         log.info("收到消息--{}", message.getPayload());
-        session.sendMessage(message);
+        WebSocketRes webSocketRes = new WebSocketRes();
+        webSocketRes.setCode(200);
+        webSocketRes.setMsg("PONG");
+        TextMessage textMessage = new TextMessage(JSONUtil.parse(webSocketRes).toString());
+        session.sendMessage(textMessage);
     }
 
     @Override
diff --git a/src/main/java/cc/mrbird/febs/websocket/WebSocketRes.java b/src/main/java/cc/mrbird/febs/websocket/WebSocketRes.java
new file mode 100644
index 0000000..519d619
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/websocket/WebSocketRes.java
@@ -0,0 +1,9 @@
+package cc.mrbird.febs.websocket;
+
+import lombok.Data;
+
+@Data
+public class WebSocketRes {
+    private Integer code;
+    private String msg;
+}
diff --git a/src/main/java/cc/mrbird/febs/websocket/WsAuthInterceptor.java b/src/main/java/cc/mrbird/febs/websocket/WsAuthInterceptor.java
index 131b79a..f62a686 100644
--- a/src/main/java/cc/mrbird/febs/websocket/WsAuthInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/websocket/WsAuthInterceptor.java
@@ -26,7 +26,7 @@
     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
 //        log.info("拦截器,握手前");
         Map<String, String> params = parseParameterMap(request.getURI().getQuery());
-
+        //invite_id_时间戳 例如:45656161_4554848489的加密
         String token = params.get("token");
         if (StrUtil.isNotBlank(token)) {
             String inviteId = token;

--
Gitblit v1.9.1