Skip to content

Commit f9a82e8

Browse files
committed
update onebot/latest & /onebot/latest/text API to get phantomGroup & crystalGroup msg only
1 parent d456d9a commit f9a82e8

5 files changed

Lines changed: 96 additions & 7 deletions

File tree

.idea/workspace.xml

Lines changed: 6 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/phantoms/phantomsbackend/controller/OneBotController.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ public class OneBotController {
3434
@Value("${napcat.default-group-id}")
3535
private String defaultGroupId;
3636

37+
@Value("${napcat.phantom-group-id}")
38+
private String phantomGroupId;
39+
40+
@Value("${napcat.crystal-group-id}")
41+
private String crystalGroupId;
42+
3743
@Autowired
3844
private final OneBotService oneBotService;
3945
private final ObjectMapper objectMapper;
@@ -92,7 +98,7 @@ public ResponseEntity<String> handleOneBotRequest(@RequestBody Map<String, Objec
9298
@GetMapping("/onebot/latest")
9399
@Operation(
94100
summary = "获取最新消息",
95-
description = "获取最新的聊天消息记录",
101+
description = "获取最新的聊天消息记录(只包含Phantom和Crystal群组)",
96102
responses = {
97103
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "获取成功"),
98104
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@@ -101,7 +107,7 @@ public ResponseEntity<String> handleOneBotRequest(@RequestBody Map<String, Objec
101107
public ResponseEntity<List<ChatRecordDTO>> getLatestMessages(
102108
@Parameter(description = "返回消息数量限制,默认30条") @RequestParam(defaultValue = "30") int limit) {
103109
try {
104-
List<ChatRecordDTO> latestMessages = oneBotService.getLatestMessages(limit);
110+
List<ChatRecordDTO> latestMessages = oneBotService.getLatestMessagesByGroups(limit, List.of(phantomGroupId, crystalGroupId));
105111
return ResponseEntity.ok(latestMessages);
106112
} catch (Exception e) {
107113
logger.error("Error fetching latest messages: {}", e.getMessage(), e);
@@ -112,7 +118,7 @@ public ResponseEntity<List<ChatRecordDTO>> getLatestMessages(
112118
@GetMapping("/onebot/latest/text")
113119
@Operation(
114120
summary = "获取最新文本消息",
115-
description = "获取最新的纯文本聊天消息记录",
121+
description = "获取最新的纯文本聊天消息记录(只包含Phantom和Crystal群组)",
116122
responses = {
117123
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "获取成功"),
118124
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@@ -121,7 +127,7 @@ public ResponseEntity<List<ChatRecordDTO>> getLatestMessages(
121127
public ResponseEntity<List<ChatRecord>> getLatestTextMessages(
122128
@Parameter(description = "返回消息数量限制,默认30条") @RequestParam(defaultValue = "30") int limit) {
123129
try {
124-
List<ChatRecord> latestMessages = oneBotService.getLatestTextMessages(limit);
130+
List<ChatRecord> latestMessages = oneBotService.getLatestTextMessagesByGroups(limit, List.of(phantomGroupId, crystalGroupId));
125131
return ResponseEntity.ok(latestMessages);
126132
} catch (Exception e) {
127133
logger.error("Error fetching latest messages: {}", e.getMessage(), e);

src/main/java/com/phantoms/phantomsbackend/repository/primary/onebot/PrimaryChatRecordRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ public interface PrimaryChatRecordRepository extends JpaRepository<ChatRecord, L
2222
@Query(value = "SELECT * FROM onebot.chat_records cr WHERE cr.message LIKE '%type=text%' ORDER BY cr.created_at DESC LIMIT ?1", nativeQuery = true)
2323
List<ChatRecord> findTopByOrderByCreatedAtDescWithText(int limit);
2424

25+
// 根据群组ID列表查询最新的几条消息
26+
@Query(value = "SELECT * FROM onebot.chat_records cr WHERE cr.qq_group_id IN (:groupIds) ORDER BY cr.created_at DESC LIMIT :limit", nativeQuery = true)
27+
List<ChatRecord> findTopByGroupsOrderByCreatedAtDesc(@org.springframework.data.repository.query.Param("groupIds") List<Long> groupIds, @org.springframework.data.repository.query.Param("limit") int limit);
28+
29+
// 根据群组ID列表查询最新的几条文本消息
30+
@Query(value = "SELECT * FROM onebot.chat_records cr WHERE cr.qq_group_id IN (:groupIds) AND cr.message LIKE '%type=text%' ORDER BY cr.created_at DESC LIMIT :limit", nativeQuery = true)
31+
List<ChatRecord> findTopByGroupsOrderByCreatedAtDescWithText(@org.springframework.data.repository.query.Param("groupIds") List<Long> groupIds, @org.springframework.data.repository.query.Param("limit") int limit);
32+
2533
// 查询最新的3条消息,按群组分组
2634
@Query(value = "SELECT * FROM onebot.chat_records cr WHERE cr.qq_group_id = ?1 ORDER BY cr.created_at DESC LIMIT 3", nativeQuery = true)
2735
List<ChatRecord> findTop3ByGroupIdOrderByCreatedAtDesc(Long groupId);

src/main/java/com/phantoms/phantomsbackend/service/OneBotService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ public interface OneBotService {
1414

1515
List<ChatRecordDTO> getLatestMessages(@RequestParam(defaultValue = "30") int limit) throws IOException;
1616

17+
List<ChatRecordDTO> getLatestMessagesByGroups(int limit, List<String> groupIds) throws IOException;
18+
1719
List<ChatRecord> getLatestTextMessages(@RequestParam(defaultValue = "30") int limit);
1820

21+
List<ChatRecord> getLatestTextMessagesByGroups(int limit, List<String> groupIds);
22+
1923
void sendGroupMessage(String message, String groupId) throws Exception;
2024

2125
void sendGroupImage(String imageUrl, String groupId) throws Exception;

src/main/java/com/phantoms/phantomsbackend/service/impl/OneBotServiceImpl.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,67 @@ public List<ChatRecordDTO> getLatestMessages(int limit) throws IOException {
376376
return chatRecordDTOs;
377377
}
378378

379+
@Override
380+
public List<ChatRecordDTO> getLatestMessagesByGroups(int limit, List<String> groupIds) throws IOException {
381+
List<Long> groupIdLongs = groupIds.stream().map(Long::parseLong).collect(Collectors.toList());
382+
List<ChatRecord> chatRecords = chatRecordRepository.findTopByGroupsOrderByCreatedAtDesc(groupIdLongs, limit);
383+
List<ChatRecordDTO> chatRecordDTOs = new ArrayList<>();
384+
385+
// 统计所有需要查询的群组ID
386+
Set<Long> groups = chatRecords.stream()
387+
.map(ChatRecord::getGroupId)
388+
.filter(Objects::nonNull)
389+
.collect(Collectors.toSet());
390+
391+
// 缓存每个群组的成员列表
392+
Map<Long, Map<Long, String>> groupMemberMap = new HashMap<>();
393+
394+
for (Long groupId : groups) {
395+
Map<Long, String> memberMap = getGroupMemberMap(groupId);
396+
groupMemberMap.put(groupId, memberMap);
397+
}
398+
399+
for (ChatRecord chatRecord : chatRecords) {
400+
ChatRecordDTO chatRecordDTO = new ChatRecordDTO();
401+
chatRecordDTO.setId(chatRecord.getId());
402+
chatRecordDTO.setMessageType(chatRecord.getMessageType());
403+
chatRecordDTO.setUserId(chatRecord.getUserId());
404+
chatRecordDTO.setGroupId(chatRecord.getGroupId());
405+
chatRecordDTO.setMessage(chatRecord.getMessage());
406+
chatRecordDTO.setTimestamp(chatRecord.getTimestamp());
407+
chatRecordDTO.setCreatedAt(chatRecord.getCreatedAt());
408+
chatRecordDTO.setUpdatedAt(chatRecord.getUpdatedAt());
409+
410+
try {
411+
Long groupId = chatRecord.getGroupId();
412+
Map<Long, String> memberMap = groupMemberMap.get(groupId);
413+
414+
if (memberMap != null) {
415+
Long userId = chatRecord.getUserId();
416+
String nickname = getNicknameFromMemberMap(memberMap, userId);
417+
if (nickname == null) {
418+
nickname = "Unknown" + userId;
419+
}
420+
chatRecordDTO.setNickname(nickname);
421+
} else {
422+
Long userId = chatRecord.getUserId();
423+
String nickname = "Unknown" + userId;
424+
chatRecordDTO.setNickname(nickname);
425+
}
426+
427+
} catch (Exception e) {
428+
logger.error("[ERROR] 设置昵称时发生错误: {}", e.getMessage(), e);
429+
Long userId = chatRecord.getUserId();
430+
String defaultNickname = "ErrorUnknown" + userId;
431+
chatRecordDTO.setNickname(defaultNickname);
432+
}
433+
434+
chatRecordDTOs.add(chatRecordDTO);
435+
}
436+
437+
return chatRecordDTOs;
438+
}
439+
379440
/**
380441
* 从memberMap中获取昵称 - 修复了Key类型不匹配的问题
381442
*/
@@ -414,6 +475,13 @@ public List<ChatRecord> getLatestTextMessages(int limit) {
414475
return chatRecordRepository.findTopByOrderByCreatedAtDescWithText(limit);
415476
}
416477

478+
@Override
479+
public List<ChatRecord> getLatestTextMessagesByGroups(int limit, List<String> groupIds) {
480+
List<Long> groupIdLongs = groupIds.stream().map(Long::parseLong).collect(Collectors.toList());
481+
// 查询最新的几条文本消息,只返回指定群组的消息
482+
return chatRecordRepository.findTopByGroupsOrderByCreatedAtDescWithText(groupIdLongs, limit);
483+
}
484+
417485
@Override
418486
public void sendGroupMessage(String message, String groupId) throws Exception {
419487
String targetGroupId = groupId != null ? groupId : defaultGroupId;

0 commit comments

Comments
 (0)