XiaMoHuaHuo_CN
本帖最后由 XiaMoHuaHuo_CN 于 2023-1-18 12:22 编辑

目前正在开发QQ频道API,使用的是xiaoye-bot/qqbot-sdk: QQ官方机器人 SDK For Java (github.com)但是使用事件时存在以下问题:
  1. [11:34:30 ERROR]: [org.java_websocket.drafts.Draft_6455] Runtime exception during onWebsocketMessage
  2. java.lang.IllegalStateException: GuildAtEvent may only be triggered synchronously.
  3.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:660) ~[paper-api-1.19.3-R0.1-SNAPSHOT.jar:?]
  4.         at moe.xmcn.guildbot.qqguildbot.api.EventTool.onAtMessage(EventTool.kt:17) ~[QQGuildBotMC-0.1.0.jar:?]
  5.         at me.zhenxin.qqbot.websocket.Event.onDispatch(Event.java:154) ~[QQGuildBotMC-0.1.0.jar:?]
  6.         at me.zhenxin.qqbot.websocket.Client.onMessage(Client.java:70) ~[QQGuildBotMC-0.1.0.jar:?]
  7.         at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:636) ~[QQGuildBotMC-0.1.0.jar:?]
  8.         at org.java_websocket.drafts.Draft_6455.processFrameText(Draft_6455.java:986) ~[QQGuildBotMC-0.1.0.jar:?]
  9.         at org.java_websocket.drafts.Draft_6455.processFrame(Draft_6455.java:910) ~[QQGuildBotMC-0.1.0.jar:?]
  10.         at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:401) ~[QQGuildBotMC-0.1.0.jar:?]
  11.         at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:233) ~[QQGuildBotMC-0.1.0.jar:?]
  12.         at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:516) ~[QQGuildBotMC-0.1.0.jar:?]
  13.         at java.lang.Thread.run(Thread.java:833) ~[?:?]
  14. [11:34:30 INFO]: [me.zhenxin.qqbot.websocket.Client] 发生错误: GuildAtEvent may only be triggered synchronously.
  15. [11:34:30 WARN]: java.lang.IllegalStateException: GuildAtEvent may only be triggered synchronously.
  16. [11:34:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:660)
  17. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//moe.xmcn.guildbot.qqguildbot.api.EventTool.onAtMessage(EventTool.kt:17)
  18. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//me.zhenxin.qqbot.websocket.Event.onDispatch(Event.java:154)
  19. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//me.zhenxin.qqbot.websocket.Client.onMessage(Client.java:70)
  20. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:636)
  21. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.drafts.Draft_6455.processFrameText(Draft_6455.java:986)
  22. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.drafts.Draft_6455.processFrame(Draft_6455.java:910)
  23. [11:34:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:660)
  24. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//moe.xmcn.guildbot.qqguildbot.api.EventTool.onAtMessage(EventTool.kt:17)
  25. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//me.zhenxin.qqbot.websocket.Event.onDispatch(Event.java:154)
  26. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//me.zhenxin.qqbot.websocket.Client.onMessage(Client.java:70)
  27. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:636)
  28. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.drafts.Draft_6455.processFrameText(Draft_6455.java:986)
  29. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.drafts.Draft_6455.processFrame(Draft_6455.java:910)
  30. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:401)
  31. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:233)
  32. [11:34:30 WARN]:        at QQGuildBotMC-0.1.0.jar//org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:516)
  33. [11:34:30 WARN]:        at java.base/java.lang.Thread.run(Thread.java:833)
复制代码
事件代码为:


  1. package moe.xmcn.guildbot.qqguildbot.api.bukkit;

  2. import me.zhenxin.qqbot.api.ApiManager;
  3. import me.zhenxin.qqbot.entity.Guild;
  4. import me.zhenxin.qqbot.entity.MessageAttachment;
  5. import me.zhenxin.qqbot.entity.MessageEmbed;
  6. import me.zhenxin.qqbot.entity.User;
  7. import me.zhenxin.qqbot.entity.ark.MessageArk;
  8. import me.zhenxin.qqbot.event.AtMessageEvent;
  9. import org.bukkit.event.Event;
  10. import org.bukkit.event.HandlerList;
  11. import org.jetbrains.annotations.NotNull;

  12. import java.time.LocalDateTime;

  13. public class GuildAtEvent extends Event {
  14.     @NotNull
  15.     private final ApiManager api;
  16.     @NotNull
  17.     private final AtMessageEvent event;
  18.     private static final HandlerList handlers = new HandlerList();

  19.     public GuildAtEvent(@NotNull ApiManager api, @NotNull AtMessageEvent event) {
  20.         this.api = api;
  21.         this.event = event;
  22.     }

  23.     @NotNull
  24.     public final String getMessage() {
  25.         return event.getMessage().getContent();
  26.     }

  27.     @NotNull
  28.     public final String getMessageId() {
  29.         return event.getMessage().getId();
  30.     }

  31.     @NotNull
  32.     public final String getChannelId() {
  33.         return event.getMessage().getChannelId();
  34.     }

  35.     @NotNull
  36.     public final MessageArk getArk() {
  37.         return event.getMessage().getArk();
  38.     }

  39.     @NotNull
  40.     public final User getAuthor() {
  41.         return event.getMessage().getAuthor();
  42.     }

  43.     @NotNull
  44.     public final MessageAttachment[] getAttachments() {
  45.         return event.getMessage().getAttachments();
  46.     }

  47.     @NotNull
  48.     public final LocalDateTime getEditedTimestamp() {
  49.         return event.getMessage().getEditedTimestamp();
  50.     }

  51.     @NotNull
  52.     public final MessageEmbed[] getEmbeds() {
  53.         return event.getMessage().getEmbeds();
  54.     }

  55.     @NotNull
  56.     public final LocalDateTime getTimestamp() {
  57.         return event.getMessage().getTimestamp();
  58.     }

  59.     @NotNull
  60.     public final String getSrcGuildId() {
  61.         return event.getMessage().getSrcGuildId();
  62.     }

  63.     @NotNull
  64.     public final String getGuildId() {
  65.         return event.getMessage().getGuildId();
  66.     }

  67.     public @NotNull HandlerList getHandlers() { return handlers; }
  68.     public static HandlerList getHandlerList() { return handlers; }

  69. }
复制代码
个人判断为主线程事件不能在异步线程调用,是否有解决方案?
使用主线程任务回调事件解决