BarrageWebSocketServer.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package com.hy.modules.bz.websocket;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.hy.common.websocket.AbstractWebSocketServer;
  5. import com.hy.modules.bz.domain.BzAnchorStudio;
  6. import com.hy.modules.bz.domain.BzGiftRecord;
  7. import com.hy.modules.bz.service.IBzAnchorStudioService;
  8. import com.hy.modules.bz.service.IBzGiftRecordService;
  9. import com.hy.modules.bz.utils.TokenStatusManager;
  10. import com.hy.modules.bz.websocket.message.GiftMessage;
  11. import com.hy.modules.bz.websocket.message.MessageType;
  12. import com.hy.modules.sys.domain.SysDictData;
  13. import com.hy.modules.sys.service.SysDictDataService;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Value;
  17. import org.springframework.data.redis.core.StringRedisTemplate;
  18. import org.springframework.web.socket.WebSocketSession;
  19. import javax.annotation.Resource;
  20. import java.math.BigDecimal;
  21. import java.util.Date;
  22. import java.util.List;
  23. import java.util.concurrent.ScheduledThreadPoolExecutor;
  24. import java.util.concurrent.TimeUnit;
  25. import static com.hy.modules.bz.utils.Constants.*;
  26. public class BarrageWebSocketServer extends AbstractWebSocketServer {
  27. private static final String PLATFORM = "tiktok";
  28. public static final String PATH = "/barrage/war";
  29. private final Logger logger = LoggerFactory.getLogger(getClass());
  30. private static final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8);
  31. @Resource
  32. private IBzAnchorStudioService anchorStudioService;
  33. @Resource
  34. private IBzGiftRecordService giftRecordService;
  35. @Resource
  36. private SysDictDataService sysDictDataService;
  37. @Resource
  38. private StringRedisTemplate stringRedisTemplate;
  39. @Value("${websocket.reconnect.time}")
  40. private int reconnectTime;
  41. @Override
  42. public void handleOpen(WebSocketSession session) {
  43. }
  44. @Override
  45. public void handleClose(WebSocketSession session) {
  46. TokenStatusManager.getInstance().sendSignal(session.getAttributes().get(TOKEN_PRIFIX).toString());
  47. executor.schedule(() -> {
  48. if(TokenStatusManager.getInstance().isInSignal(session.getAttributes().get(TOKEN_PRIFIX).toString())){
  49. BzAnchorStudio anchorStudio = anchorStudioService.stopStudio(session.getAttributes().get(TOKEN_PRIFIX).toString());
  50. if(null != anchorStudio){
  51. stringRedisTemplate.delete(TOKEN_PRIFIX.concat(anchorStudio.getAnchorName()));
  52. }
  53. }
  54. },reconnectTime, TimeUnit.SECONDS);
  55. }
  56. @Override
  57. public void handleMessage(String message, WebSocketSession session) {
  58. JSONObject object = JSON.parseObject(message);
  59. if(MessageType.GiftMessage.equals(MessageType.getMessageType(object.getString(MESSAGE_TYPE_CODE)))){
  60. // 暂时只处理礼物消息
  61. GiftMessage giftMessage = JSON.parseObject(message, GiftMessage.class);
  62. if(!session.getAttributes().containsKey(TOKEN_PRIFIX)){
  63. session.getAttributes().put(TOKEN_PRIFIX, giftMessage.getToken());
  64. }
  65. saveGiftRecord(giftMessage);
  66. }
  67. }
  68. private BigDecimal getGiftScore(String giftName) throws RuntimeException{
  69. List<SysDictData> giftList = sysDictDataService.selectByCode(GIFT_CODE);
  70. for (SysDictData dictData : giftList) {
  71. if(dictData.getDataLabel().equals(giftName)){
  72. return new BigDecimal(dictData.getDataValue());
  73. }
  74. }
  75. throw new RuntimeException("No such gift: "+giftName);
  76. }
  77. private void saveGiftRecord(GiftMessage giftMessage){
  78. BigDecimal score = getGiftScore(giftMessage.getGiftName());
  79. BzAnchorStudio anchorStudio = anchorStudioService.getByRoomId(giftMessage.getToken());
  80. BzGiftRecord giftRecord = new BzGiftRecord();
  81. giftRecord.setAnchorCode(anchorStudio.getCode());
  82. giftRecord.setAnchorId(anchorStudio.getAnchorId());
  83. giftRecord.setAnchorNickName(anchorStudio.getAnchorNickName());
  84. giftRecord.setGiftCount(Long.valueOf(giftMessage.getGiftCount()));
  85. giftRecord.setGiftInfo(giftMessage.getGiftName());
  86. giftRecord.setGiftValue(score);
  87. giftRecord.setPlatform(anchorStudio.getPlatform());
  88. giftRecord.setPublishTime(new Date());
  89. giftRecord.setRoomId(giftMessage.getToken());
  90. giftRecord.setStatus("finished");
  91. giftRecord.setStudioId(anchorStudio.getId());
  92. giftRecord.setGame(anchorStudio.getGameName());
  93. giftRecord.setUserId(giftMessage.getName());
  94. giftRecord.setUserNickName(giftMessage.getName());
  95. giftRecordService.save(giftRecord);
  96. }
  97. @Override
  98. public void handleError(WebSocketSession session, Throwable error) {
  99. }
  100. }