ソースを参照

websocket 实现

yangyale 1 年間 前
コミット
7cc61a9006

+ 2 - 0
src/main/java/com/hy/modules/bz/service/IBzAnchorStudioService.java

@@ -37,4 +37,6 @@ public interface IBzAnchorStudioService extends IService<BzAnchorStudio> {
      * @return
      */
     BzAnchorStudio stopStudio(String roomId);
+
+    BzAnchorStudio getByRoomId(String roomId);
 }

+ 8 - 0
src/main/java/com/hy/modules/bz/service/impl/BzAnchorStudioServiceImpl.java

@@ -72,4 +72,12 @@ public class BzAnchorStudioServiceImpl extends ServiceImpl<BzAnchorStudioMapper,
         return null;
     }
 
+    @Override
+    public BzAnchorStudio getByRoomId(String roomId) {
+        QueryWrapper<BzAnchorStudio> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("room_id", roomId)
+                .eq("status","open");
+        return getOne(queryWrapper,false);
+    }
+
 }

+ 9 - 0
src/main/java/com/hy/modules/bz/utils/Constants.java

@@ -0,0 +1,9 @@
+package com.hy.modules.bz.utils;
+
+public class Constants {
+    public static final String TOKEN_PRIFIX = "user:";
+
+    public static final String GIFT_CODE = "tk_gift";
+
+    public static final String MESSAGE_TYPE_CODE = "type";
+}

+ 2 - 2
src/main/java/com/hy/modules/bz/webapi/service/impl/WebApiServiceImpl.java

@@ -19,13 +19,13 @@ import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
+import static com.hy.modules.bz.utils.Constants.TOKEN_PRIFIX;
+
 @Service
 public class WebApiServiceImpl implements WebApiService {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    private static final String TOKEN_PRIFIX = "user:";
-
     @Resource
     private IBzPlayerService playerService;
 

+ 63 - 1
src/main/java/com/hy/modules/bz/websocket/BarrageWebSocketServer.java

@@ -1,17 +1,34 @@
 package com.hy.modules.bz.websocket;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.hy.common.websocket.AbstractWebSocketServer;
+import com.hy.modules.bz.domain.BzAnchorStudio;
+import com.hy.modules.bz.domain.BzGiftRecord;
 import com.hy.modules.bz.service.IBzAnchorStudioService;
 import com.hy.modules.bz.service.IBzGiftRecordService;
 import com.hy.modules.bz.service.IBzPlayerService;
+import com.hy.modules.bz.websocket.message.GiftMessage;
+import com.hy.modules.bz.websocket.message.MessageType;
+import com.hy.modules.sys.domain.SysDictData;
+import com.hy.modules.sys.service.SysDictDataService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.socket.WebSocketSession;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import static com.hy.modules.bz.utils.Constants.*;
 
 public class BarrageWebSocketServer extends AbstractWebSocketServer {
 
     private static final String PLATFORM = "tiktok";
 
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
     @Resource
     private IBzPlayerService playerService;
 
@@ -21,6 +38,9 @@ public class BarrageWebSocketServer extends AbstractWebSocketServer {
     @Resource
     private IBzGiftRecordService giftRecordService;
 
+    @Resource
+    private SysDictDataService sysDictDataService;
+
     @Override
     public void handleOpen(WebSocketSession session) {
 
@@ -28,12 +48,54 @@ public class BarrageWebSocketServer extends AbstractWebSocketServer {
 
     @Override
     public void handleClose(WebSocketSession session) {
-
+        anchorStudioService.stopStudio(session.getAttributes().get(TOKEN_PRIFIX).toString());
     }
 
     @Override
     public void handleMessage(String message, WebSocketSession session) {
+        JSONObject object = JSON.parseObject(message);
+        if(MessageType.GiftMessage.equals(MessageType.getMessageType(object.getString(MESSAGE_TYPE_CODE)))){
+            // 暂时只处理礼物消息
+            GiftMessage giftMessage = JSON.parseObject(message, GiftMessage.class);
+            if(!session.getAttributes().containsKey(TOKEN_PRIFIX)){
+                session.getAttributes().put(TOKEN_PRIFIX, giftMessage.getToken());
+            }
+            saveGiftRecord(giftMessage);
+        }
+
+    }
+
+    private BigDecimal getGiftScore(String giftName) throws RuntimeException{
+        List<SysDictData> giftList = sysDictDataService.selectByCode(GIFT_CODE);
+
+        for (SysDictData dictData : giftList) {
+            if(dictData.getDataLabel().equals(giftName)){
+                return new BigDecimal(dictData.getDataValue());
+            }
+        }
+
+        throw new RuntimeException("No such gift: "+giftName);
+    }
 
+    private void saveGiftRecord(GiftMessage giftMessage){
+        BigDecimal score = getGiftScore(giftMessage.getGiftName());
+        BzAnchorStudio anchorStudio = anchorStudioService.getByRoomId(giftMessage.getToken());
+        BzGiftRecord giftRecord = new BzGiftRecord();
+        giftRecord.setAnchorCode(anchorStudio.getCode());
+        giftRecord.setAnchorId(anchorStudio.getAnchorId());
+        giftRecord.setAnchorNickName(anchorStudio.getAnchorNickName());
+        giftRecord.setGiftCount(Long.valueOf(giftMessage.getGiftCount()));
+        giftRecord.setGiftInfo(giftMessage.getGiftName());
+        giftRecord.setGiftValue(score);
+        giftRecord.setPlatform(anchorStudio.getPlatform());
+        giftRecord.setPublishTime(new Date());
+        giftRecord.setRoomId(giftMessage.getToken());
+        giftRecord.setStatus("finished");
+        giftRecord.setStudioId(anchorStudio.getId());
+        giftRecord.setGame(anchorStudio.getGameName());
+        giftRecord.setUserId(giftMessage.getName());
+        giftRecord.setUserNickName(giftMessage.getName());
+        giftRecordService.save(giftRecord);
     }
 
     @Override

+ 21 - 0
src/main/java/com/hy/modules/bz/websocket/message/BaseMessage.java

@@ -0,0 +1,21 @@
+package com.hy.modules.bz.websocket.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class BaseMessage implements Serializable {
+
+    private String type;
+
+    private String name;
+
+    @JSONField(name = "head_img")
+    private String headImg;
+
+    private String content;
+
+    private String token;
+}

+ 13 - 0
src/main/java/com/hy/modules/bz/websocket/message/GiftMessage.java

@@ -0,0 +1,13 @@
+package com.hy.modules.bz.websocket.message;
+
+import lombok.Data;
+
+@Data
+public class GiftMessage extends BaseMessage{
+
+    private String giftName;
+
+    private String giftId;
+
+    private int giftCount;
+}

+ 20 - 0
src/main/java/com/hy/modules/bz/websocket/message/MessageType.java

@@ -0,0 +1,20 @@
+package com.hy.modules.bz.websocket.message;
+
+public enum MessageType {
+    GiftMessage,
+    LikeMessage,
+    ChatMessage,
+    MemberMessage;
+
+    public static MessageType getMessageType(String type)
+    {
+        for (MessageType messageType : MessageType.values())
+        {
+            if (messageType.name().equals(type))
+            {
+                return messageType;
+            }
+        }
+        return null;
+    }
+}