mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-16 04:18:17 +08:00
fix(qq): handle non-Map data in DISPATCH events (#185)
This commit is contained in:
parent
2d3afa6550
commit
b26bca1584
@ -424,7 +424,7 @@ public class QQChannelAdapter extends AbstractChannelAdapter {
|
|||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OP_HELLO -> handleHello((Map<String, Object>) data, ws);
|
case OP_HELLO -> handleHello((Map<String, Object>) data, ws);
|
||||||
case OP_DISPATCH -> handleDispatch(eventType, (Map<String, Object>) data);
|
case OP_DISPATCH -> handleDispatch(eventType, data);
|
||||||
case OP_HEARTBEAT_ACK -> log.trace("[qq] Heartbeat ACK received");
|
case OP_HEARTBEAT_ACK -> log.trace("[qq] Heartbeat ACK received");
|
||||||
case OP_RECONNECT -> {
|
case OP_RECONNECT -> {
|
||||||
log.info("[qq] Server requested reconnect");
|
log.info("[qq] Server requested reconnect");
|
||||||
@ -515,34 +515,51 @@ public class QQChannelAdapter extends AbstractChannelAdapter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理 DISPATCH 事件
|
* 处理 DISPATCH 事件
|
||||||
|
* <p>
|
||||||
|
* `data` payload shape varies by event: object for messages/READY, empty string for RESUMED.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private void handleDispatch(String eventType, Map<String, Object> data) {
|
private void handleDispatch(String eventType, Object data) {
|
||||||
if (eventType == null || data == null) return;
|
if (eventType == null) return;
|
||||||
|
|
||||||
switch (eventType) {
|
switch (eventType) {
|
||||||
|
case "RESUMED" -> {
|
||||||
|
// RESUMED carries no payload (`d` is an empty string); don't read from it.
|
||||||
|
reconnectAttempts = 0;
|
||||||
|
connectionState.set(ConnectionState.CONNECTED);
|
||||||
|
lastError = null;
|
||||||
|
log.info("[qq] RESUMED successfully");
|
||||||
|
}
|
||||||
case "READY" -> {
|
case "READY" -> {
|
||||||
sessionId = (String) data.get("session_id");
|
if (!(data instanceof Map<?, ?> map)) {
|
||||||
|
log.warn("[qq] READY event has non-object data: {}", data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, Object> readyData = (Map<String, Object>) map;
|
||||||
|
sessionId = (String) readyData.get("session_id");
|
||||||
reconnectAttempts = 0;
|
reconnectAttempts = 0;
|
||||||
quickDisconnectCount = 0;
|
quickDisconnectCount = 0;
|
||||||
connectionState.set(ConnectionState.CONNECTED);
|
connectionState.set(ConnectionState.CONNECTED);
|
||||||
lastError = null;
|
lastError = null;
|
||||||
log.info("[qq] READY received, session_id={}", sessionId);
|
log.info("[qq] READY received, session_id={}", sessionId);
|
||||||
}
|
}
|
||||||
case "RESUMED" -> {
|
case "C2C_MESSAGE_CREATE" -> dispatchMessage("c2c", eventType, data);
|
||||||
reconnectAttempts = 0;
|
case "GROUP_AT_MESSAGE_CREATE" -> dispatchMessage("group", eventType, data);
|
||||||
connectionState.set(ConnectionState.CONNECTED);
|
case "AT_MESSAGE_CREATE" -> dispatchMessage("guild", eventType, data);
|
||||||
lastError = null;
|
case "DIRECT_MESSAGE_CREATE" -> dispatchMessage("dm", eventType, data);
|
||||||
log.info("[qq] RESUMED successfully");
|
|
||||||
}
|
|
||||||
case "C2C_MESSAGE_CREATE" -> handleMessageEvent("c2c", data);
|
|
||||||
case "GROUP_AT_MESSAGE_CREATE" -> handleMessageEvent("group", data);
|
|
||||||
case "AT_MESSAGE_CREATE" -> handleMessageEvent("guild", data);
|
|
||||||
case "DIRECT_MESSAGE_CREATE" -> handleMessageEvent("dm", data);
|
|
||||||
default -> log.debug("[qq] Unhandled event: {}", eventType);
|
default -> log.debug("[qq] Unhandled event: {}", eventType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void dispatchMessage(String messageType, String eventType, Object data) {
|
||||||
|
if (!(data instanceof Map<?, ?> map)) {
|
||||||
|
log.warn("[qq] {} event has non-object data, skipping: {}", eventType, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
handleMessageEvent(messageType, (Map<String, Object>) map);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理消息事件(C2C / Group / Guild / DM)
|
* 处理消息事件(C2C / Group / Guild / DM)
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user