[Add] MiraiMain 增加对临时消息的支持;

[Change] MiraiMessageEvent 调整消息对象转换的方式, 通过静态方法转换Mirai的MessageEvent;
This commit is contained in:
LamGC 2020-06-01 15:55:31 +08:00
parent d45cd8aab5
commit 3f6c87da3c
2 changed files with 48 additions and 2 deletions

View File

@ -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); 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(GroupMessageEvent.class, this::executeMessageEvent);
Events.subscribeAlways(FriendMessageEvent.class, this::executeMessageEvent); Events.subscribeAlways(FriendMessageEvent.class, this::executeMessageEvent);
Events.subscribeAlways(TempMessageEvent.class, this::executeMessageEvent);
Events.subscribeAlways(BotMuteEvent.class, Events.subscribeAlways(BotMuteEvent.class,
event -> BotEventHandler.setMuteState(event.getGroup().getId(), true)); event -> BotEventHandler.setMuteState(event.getGroup().getId(), true));
Events.subscribeAlways(BotUnmuteEvent.class, Events.subscribeAlways(BotUnmuteEvent.class,
@ -70,13 +71,13 @@ public class MiraiMain implements Closeable {
((GroupMessageEvent) message).getGroup().getBotMuteRemaining() != 0); ((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) { if(bot == null) {
return; return;
} }

View File

@ -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.MessageSender;
import net.lamgc.cgj.bot.message.MessageSource; import net.lamgc.cgj.bot.message.MessageSource;
import net.mamoe.mirai.message.FriendMessageEvent;
import net.mamoe.mirai.message.GroupMessageEvent; import net.mamoe.mirai.message.GroupMessageEvent;
import net.mamoe.mirai.message.MessageEvent; 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 net.mamoe.mirai.message.data.MessageUtils;
import java.util.Objects; import java.util.Objects;
@ -13,6 +16,13 @@ public class MiraiMessageEvent extends net.lamgc.cgj.bot.event.MessageEvent {
private final MessageEvent messageObject; private final MessageEvent messageObject;
private final MessageSender messageSender; private final MessageSender messageSender;
/**
* 通过Mirai的MessageEvent转换成应用支持的MessageEvent.
* @deprecated 请使用 {@link #covertEventObject(MessageEvent)}方法转换.
* @param message 消息对象
* @see #covertEventObject(MessageEvent)
*/
@Deprecated
public MiraiMessageEvent(MessageEvent message) { public MiraiMessageEvent(MessageEvent message) {
super(message instanceof GroupMessageEvent ? ((GroupMessageEvent) message).getGroup().getId() : 0, super(message instanceof GroupMessageEvent ? ((GroupMessageEvent) message).getGroup().getId() : 0,
message.getSender().getId(), getMessageBodyWithoutSource(message.getMessage().toString())); 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 并返回. * 将ContactMessage获得的消息内容删除 Mirai:source 并返回.
* <p>该做法比较保守, 防止Mirai:source位置出现变动.</p> * <p>该做法比较保守, 防止Mirai:source位置出现变动.</p>