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.utils.TokenStatusManager; 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.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.socket.WebSocketSession; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import static com.hy.modules.bz.utils.Constants.*; public class BarrageWebSocketServer extends AbstractWebSocketServer { private static final String PLATFORM = "tiktok"; public static final String PATH = "/barrage/war"; private final Logger logger = LoggerFactory.getLogger(getClass()); private static final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8); @Resource private IBzAnchorStudioService anchorStudioService; @Resource private IBzGiftRecordService giftRecordService; @Resource private SysDictDataService sysDictDataService; @Resource private StringRedisTemplate stringRedisTemplate; @Value("${websocket.reconnect.time}") private int reconnectTime; @Override public void handleOpen(WebSocketSession session) { } @Override public void handleClose(WebSocketSession session) { TokenStatusManager.getInstance().sendSignal(session.getAttributes().get(TOKEN_PRIFIX).toString()); executor.schedule(() -> { if(TokenStatusManager.getInstance().isInSignal(session.getAttributes().get(TOKEN_PRIFIX).toString())){ BzAnchorStudio anchorStudio = anchorStudioService.stopStudio(session.getAttributes().get(TOKEN_PRIFIX).toString()); if(null != anchorStudio){ stringRedisTemplate.delete(TOKEN_PRIFIX.concat(anchorStudio.getAnchorName())); } } },reconnectTime, TimeUnit.SECONDS); } @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 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 public void handleError(WebSocketSession session, Throwable error) { } }