|
@@ -0,0 +1,153 @@
|
|
|
+package com.zanxiang.game.module.manage.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.zanxiang.game.module.manage.pojo.params.ChatSubmitParam;
|
|
|
+import com.zanxiang.game.module.manage.pojo.params.GameUserChatListParam;
|
|
|
+import com.zanxiang.game.module.manage.pojo.vo.GameUserChatVO;
|
|
|
+import com.zanxiang.game.module.manage.service.IGameService;
|
|
|
+import com.zanxiang.game.module.manage.service.IGameUserChatService;
|
|
|
+import com.zanxiang.game.module.manage.service.IGameUserRoleService;
|
|
|
+import com.zanxiang.game.module.mybatis.entity.Game;
|
|
|
+import com.zanxiang.game.module.mybatis.entity.GameUserChat;
|
|
|
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
|
|
|
+import com.zanxiang.game.module.mybatis.mapper.GameUserChatMapper;
|
|
|
+import com.zanxiang.module.util.DateUtil;
|
|
|
+import com.zanxiang.module.util.JsonUtil;
|
|
|
+import com.zanxiang.module.util.bean.BeanUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.logging.log4j.util.Strings;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.LocalTime;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.function.Consumer;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author : lingfeng
|
|
|
+ * @time : 2025-03-12
|
|
|
+ * @description : 角色聊天记录
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class GameUserChatServiceImpl extends ServiceImpl<GameUserChatMapper, GameUserChat> implements IGameUserChatService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IGameService gameService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IGameUserRoleService gameUserRoleService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<Long, String> chatGameMap() {
|
|
|
+ return Collections.singletonMap(12L, "仙剑奇侠传");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<GameUserChatVO> listOfPage(GameUserChatListParam param) {
|
|
|
+ return super.page(param.toPage(), new LambdaQueryWrapper<GameUserChat>()
|
|
|
+ .eq(Strings.isNotBlank(param.getRoleId()), GameUserChat::getRoleId, param.getRoleId())
|
|
|
+ .like(Strings.isNotBlank(param.getRoleName()), GameUserChat::getRoleName, param.getRoleName())
|
|
|
+ .ge(param.getChatStart() != null, GameUserChat::getChatTime,
|
|
|
+ param.getChatStart() == null ? null : LocalDateTime.of(param.getChatStart(), LocalTime.MIN))
|
|
|
+ .le(param.getChatEnd() != null, GameUserChat::getChatTime,
|
|
|
+ param.getChatEnd() == null ? null : LocalDateTime.of(param.getChatEnd(), LocalTime.MAX))
|
|
|
+ .orderByDesc(GameUserChat::getCreateTime)
|
|
|
+ ).convert(this::toVO);
|
|
|
+ }
|
|
|
+
|
|
|
+ private GameUserChatVO toVO(GameUserChat gameUserChat) {
|
|
|
+ if (gameUserChat == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return BeanUtil.copy(gameUserChat, GameUserChatVO.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void addGameUserChat(ChatSubmitParam param) {
|
|
|
+ List<Long> gameIdList = getGameIdBySuperGameId(param.getGameId());
|
|
|
+ if (CollectionUtils.isEmpty(gameIdList)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //构造聊天记录对象
|
|
|
+ GameUserChat chat = this.transform(param);
|
|
|
+ //补充玩家公会信息, 区服信息
|
|
|
+ this.processRoleInfo(gameIdList, chat.getRoleId(), chat::setGuildId, chat::setGuildName,
|
|
|
+ role -> {
|
|
|
+ chat.setServerName(role.getServerName());
|
|
|
+ if (Strings.isBlank(chat.getRoleName())) {
|
|
|
+ chat.setRoleName(role.getRoleName());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //补充被私聊玩家公会信息, 区服信息
|
|
|
+ this.processRoleInfo(gameIdList, chat.getChatRoleId(), chat::setChatRoleGuildId, chat::setChatRoleGuildName,
|
|
|
+ role -> {
|
|
|
+ chat.setChatRoleName(role.getRoleName());
|
|
|
+ chat.setChatRoleServerName(role.getServerName());
|
|
|
+ if (Strings.isBlank(chat.getServerId())) {
|
|
|
+ chat.setChatRoleServerId(role.getServerId());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //保存聊天记录
|
|
|
+ super.save(chat);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void processRoleInfo(List<Long> gameIds, String roleId, Consumer<String> guildIdSetter,
|
|
|
+ Consumer<String> guildNameSetter, Consumer<GameUserRole> serverInfoSetter) {
|
|
|
+ if (Strings.isBlank(roleId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Optional.ofNullable(this.getGameUserRole(gameIds, roleId)).ifPresent(gameUserRole -> {
|
|
|
+ Optional.ofNullable(JsonUtil.toMap(gameUserRole.getExtra(), Map.class, String.class))
|
|
|
+ .ifPresent(extraMap -> {
|
|
|
+ Optional.ofNullable(extraMap.get("countryId"))
|
|
|
+ .filter(Strings::isNotBlank)
|
|
|
+ .ifPresent(guildIdSetter);
|
|
|
+ Optional.ofNullable(extraMap.get("country"))
|
|
|
+ .filter(Strings::isNotBlank)
|
|
|
+ .ifPresent(guildNameSetter);
|
|
|
+ });
|
|
|
+ serverInfoSetter.accept(gameUserRole);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Long> getGameIdBySuperGameId(Long superGameId) {
|
|
|
+ return gameService.list(new LambdaQueryWrapper<Game>()
|
|
|
+ .select(Game::getId)
|
|
|
+ .eq(Game::getSuperGameId, superGameId)
|
|
|
+ ).stream().map(Game::getId).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ private GameUserRole getGameUserRole(List<Long> gameIdList, String roleId) {
|
|
|
+ return gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
|
|
|
+ .eq(GameUserRole::getRoleId, roleId)
|
|
|
+ .in(GameUserRole::getGameId, gameIdList)
|
|
|
+ .orderByDesc(GameUserRole::getUpdateTime)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private GameUserChat transform(ChatSubmitParam param) {
|
|
|
+ Map<String, Object> chatContentMap = param.getChatContentMap();
|
|
|
+ return GameUserChat.builder()
|
|
|
+ .supperGameId(param.getGameId())
|
|
|
+ .serverId(param.getServerId())
|
|
|
+ .roleId(chatContentMap.containsKey("role_id") ? chatContentMap.get("role_id").toString() : null)
|
|
|
+ .roleName(chatContentMap.containsKey("role_name") ? chatContentMap.get("role_name").toString() : null)
|
|
|
+ .chatTime(chatContentMap.containsKey("chatTime") ? DateUtil.parseLocalDateTime(chatContentMap.get("chatTime").toString()) : null)
|
|
|
+ .content(chatContentMap.containsKey("content") ? chatContentMap.get("content").toString() : null)
|
|
|
+ .channel(chatContentMap.containsKey("channel") ? chatContentMap.get("channel").toString() : null)
|
|
|
+ .chatRoleId(chatContentMap.containsKey("chat_role_id") ? chatContentMap.get("chat_role_id").toString() : null)
|
|
|
+ .chatRoleServerId(chatContentMap.containsKey("chat_role_server_id") ? chatContentMap.get("chat_role_server_id").toString() : null)
|
|
|
+ .sourceData(JsonUtil.toString(param))
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+}
|