diff --git a/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java b/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java index b16a694..66c812a 100644 --- a/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java +++ b/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java @@ -48,6 +48,7 @@ public class MiraiMain implements Closeable { bot = BotFactoryJvm.newBot(Long.parseLong(botProperties.getProperty("bot.qq", "0")), Base64.decodeBase64(botProperties.getProperty("bot.password", "")), configuration); Events.subscribeAlways(GroupMessageEvent.class, this::executeMessageEvent); Events.subscribeAlways(FriendMessageEvent.class, this::executeMessageEvent); + Events.subscribeAlways(TempMessageEvent.class, this::executeMessageEvent); Events.subscribeAlways(BotMuteEvent.class, event -> BotEventHandler.setMuteState(event.getGroup().getId(), true)); Events.subscribeAlways(BotUnmuteEvent.class, @@ -70,13 +71,13 @@ public class MiraiMain implements Closeable { ((GroupMessageEvent) message).getGroup().getBotMuteRemaining() != 0); } } - BotEventHandler.executeMessageEvent(new MiraiMessageEvent(message)); + BotEventHandler.executeMessageEvent(MiraiMessageEvent.covertEventObject(message)); } /** * 关闭机器人 */ - public void close() { + public synchronized void close() { if(bot == null) { return; } diff --git a/src/main/java/net/lamgc/cgj/bot/framework/mirai/message/MiraiMessageEvent.java b/src/main/java/net/lamgc/cgj/bot/framework/mirai/message/MiraiMessageEvent.java index 035e804..ff982dd 100644 --- a/src/main/java/net/lamgc/cgj/bot/framework/mirai/message/MiraiMessageEvent.java +++ b/src/main/java/net/lamgc/cgj/bot/framework/mirai/message/MiraiMessageEvent.java @@ -2,8 +2,11 @@ package net.lamgc.cgj.bot.framework.mirai.message; import net.lamgc.cgj.bot.message.MessageSender; import net.lamgc.cgj.bot.message.MessageSource; +import net.mamoe.mirai.message.FriendMessageEvent; import net.mamoe.mirai.message.GroupMessageEvent; import net.mamoe.mirai.message.MessageEvent; +import net.mamoe.mirai.message.TempMessageEvent; +import net.mamoe.mirai.message.data.MessageChain; import net.mamoe.mirai.message.data.MessageUtils; import java.util.Objects; @@ -13,6 +16,13 @@ public class MiraiMessageEvent extends net.lamgc.cgj.bot.event.MessageEvent { private final MessageEvent messageObject; private final MessageSender messageSender; + /** + * 通过Mirai的MessageEvent转换成应用支持的MessageEvent. + * @deprecated 请使用 {@link #covertEventObject(MessageEvent)}方法转换. + * @param message 消息对象 + * @see #covertEventObject(MessageEvent) + */ + @Deprecated public MiraiMessageEvent(MessageEvent message) { super(message instanceof GroupMessageEvent ? ((GroupMessageEvent) message).getGroup().getId() : 0, message.getSender().getId(), getMessageBodyWithoutSource(message.getMessage().toString())); @@ -24,6 +34,41 @@ public class MiraiMessageEvent extends net.lamgc.cgj.bot.event.MessageEvent { } } + /** + * 通过解析好的信息构造MessageEvent + * @param messageObject 消息原始对象 + * @param groupId 群组Id, 非群聊或无需使用群聊时, 该参数为0 + * @param qqId 发送者Id, 不能为0 + * @param message 原始消息内容对象, 由构造方法内部解析 + */ + private MiraiMessageEvent(MessageEvent messageObject, long groupId, long qqId, MessageChain message) { + super(groupId, qqId, getMessageBodyWithoutSource(message.toString())); + this.messageObject = Objects.requireNonNull(messageObject, "messageObject is null"); + this.messageSender = new MiraiMessageSender(messageObject.getSender(), + groupId != 0 ? MessageSource.Group : MessageSource.Private); + } + + /** + * 将Mirai原始MessageEvent转换成应用支持的MessageEvent对象 + * @param event 原始消息对象 + * @return 原始消息对象所对应的应用MessageEvent对象. + * @throws IllegalArgumentException 当出现不支持的Mirai {@link MessageEvent}实现时将抛出异常. + * @see MessageEvent 原始消息对象 + * @see net.lamgc.cgj.bot.event.MessageEvent 应用消息对象 + */ + public static MiraiMessageEvent covertEventObject(MessageEvent event) throws IllegalArgumentException { + if(event instanceof GroupMessageEvent) { + return new MiraiMessageEvent(event, + ((GroupMessageEvent) event).getGroup().getId(), event.getSender().getId(), event.getMessage()); + } else if(event instanceof FriendMessageEvent) { + return new MiraiMessageEvent(event, 0, event.getSender().getId(), event.getMessage()); + } else if(event instanceof TempMessageEvent) { + return new MiraiMessageEvent(event, 0, event.getSender().getId(), event.getMessage()); + } else { + throw new IllegalArgumentException("Unsupported event type: " + event.toString()); + } + } + /** * 将ContactMessage获得的消息内容删除 Mirai:source 并返回. *

该做法比较保守, 防止Mirai:source位置出现变动.