Skip to content

Commit

Permalink
feat(Bot): 支持冷却时间 & 戳一戳
Browse files Browse the repository at this point in the history
  • Loading branch information
Dituon committed Jan 20, 2025
1 parent 1ed4d8b commit 0f5ed4b
Show file tree
Hide file tree
Showing 16 changed files with 426 additions and 39 deletions.
9 changes: 1 addition & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,11 @@

以下功能尚未实现。如需使用这些功能,可选择 [6.2-latest](https://github.com/Dituon/petpet/tree/6.2-latest) 版本。

**Mirai**
**Bot**

- [ ] 响应私聊消息
- [ ] 响应群聊戳一戳
- [ ] Message Hook
- [ ] 消息事件同步锁

**Onebot**

- [ ] 响应私聊消息
- [ ] 响应群聊戳一戳

**Core**

- [ ] 重采样缩放
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package moe.dituon.petpet.bot.qq.mirai;

import moe.dituon.petpet.bot.qq.mirai.handler.MiraiGroupMessageHandler;
import moe.dituon.petpet.bot.qq.mirai.handler.MiraiGroupNudgeHandler;
import moe.dituon.petpet.bot.qq.mirai.handler.MiraiMessageHandler;
import moe.dituon.petpet.bot.qq.mirai.handler.MiraiSentMessageHandler;
import moe.dituon.petpet.service.BaseService;
Expand Down Expand Up @@ -87,5 +88,10 @@ public void onEnable() {
GlobalEventChannel.INSTANCE.subscribeAlways(GroupTempMessageSyncEvent.class, sentMessageHandler::handle);
}
}

if (config.getProbability() > 0) {
var nudgeHandler = new MiraiGroupNudgeHandler(service);
GlobalEventChannel.INSTANCE.subscribeAlways(NudgeEvent.class, nudgeHandler::handle);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ object MiraiPluginConfig : AutoSavePluginConfig("PetPet") {
@ValueDescription("GIF缩放阈值/尺寸 (暂时不可用)")
val gifMaxSize: List<Int> by value(listOf(200, 200, 32))

@ValueDescription("GIF 质量, 1为质量最佳, 超过20不会有明显性能提升")
@ValueDescription("GIF 质量, 1 为质量最佳, 超过 20 不会有明显性能提升")
val gifQuality: Int by value(5)

@ValueDescription("是否使用 headless 模式")
Expand All @@ -71,7 +71,7 @@ object MiraiPluginConfig : AutoSavePluginConfig("PetPet") {
// @ValueDescription("是否启用消息注入 (详见文档)")
// val messageHook: Boolean by value(false)

@ValueDescription("触发图片生成后的用户冷却时长, 填入-1则禁用, 单位为毫秒")
@ValueDescription("触发图片生成后的用户冷却时长 (毫秒), 设为 0 禁用")
val userCoolDown:Long by value(Cooler.DEFAULT_USER_COOLDOWN)

@ValueDescription("触发图片生成后的群聊冷却时长 (同上)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import moe.dituon.petpet.bot.BotSendEvent;
import moe.dituon.petpet.core.context.RequestContext;
import moe.dituon.petpet.core.utils.image.EncodedImage;
import net.mamoe.mirai.Bot;
import net.mamoe.mirai.event.events.MessageEvent;
import net.mamoe.mirai.message.data.ForwardMessageBuilder;
import net.mamoe.mirai.message.data.MessageChain;
Expand All @@ -16,17 +17,17 @@
import java.util.stream.Collectors;

public class ScriptMiraiBotSendEvent extends BotSendEvent {
public final MessageEvent event;
public final Bot bot;
protected List<MessageChainBuilder> messageBuilderList = null;
protected int messageGroupIndex = 0;

public ScriptMiraiBotSendEvent(
MessageEvent event,
Bot bot,
RequestContext requestContext,
@Nullable File basePath
) {
super(requestContext, basePath);
this.event = event;
this.bot = bot;
}

protected MessageChainBuilder getMessageBuilder() {
Expand Down Expand Up @@ -59,7 +60,7 @@ public void response(String text) {

@Override
public void responseImage(EncodedImage image) {
var img = event.getSubject().uploadImage(
var img = bot.getAsFriend().uploadImage(
ExternalResource.create(image.bytes)
);
getMessageBuilder().add(img);
Expand All @@ -70,10 +71,10 @@ public void responseImage(EncodedImage image) {
*/
public List<MessageChain> getResponseMessage() {
if (isResponseInForward) {
var fb = new ForwardMessageBuilder(event.getBot().getAsFriend(), messageBuilderList.size());
var fb = new ForwardMessageBuilder(bot.getAsFriend(), messageBuilderList.size());
for (MessageChainBuilder mb : messageBuilderList) {
if (mb.isEmpty()) continue;
fb.add(event.getBot(), mb.build());
fb.add(bot, mb.build());
}
return List.of(new MessageChainBuilder(1).append(fb.build()).build());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ protected void replyMessage(EncodedImage image) {

@Override
protected BotSendEvent buildBotSendEvent(PetpetScriptModel script, RequestContext context) {
return new ScriptMiraiBotSendEvent(groupMessageEvent, context, script.getBasePath());
return new ScriptMiraiBotSendEvent(groupMessageEvent.getBot(), context, script.getBasePath());
}

@Override
Expand All @@ -68,5 +68,10 @@ protected void replyMessage(BotSendEvent e) {
this.groupMessageEvent.getGroup().sendMessage(new QuoteReply(groupMessageEvent.getMessage()).plus(msg));
}
}

@Override
protected boolean inGroupContext() {
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package moe.dituon.petpet.bot.qq.mirai.handler;

import moe.dituon.petpet.bot.BotSendEvent;
import moe.dituon.petpet.bot.qq.handler.QQNudgeEventHandler;
import moe.dituon.petpet.bot.qq.mirai.MiraiBotService;
import moe.dituon.petpet.bot.qq.mirai.MiraiUtils;
import moe.dituon.petpet.bot.qq.mirai.ScriptMiraiBotSendEvent;
import moe.dituon.petpet.core.context.RequestContext;
import moe.dituon.petpet.core.utils.image.EncodedImage;
import moe.dituon.petpet.script.PetpetScriptModel;
import net.mamoe.mirai.contact.Group;
import net.mamoe.mirai.contact.Member;
import net.mamoe.mirai.contact.MemberKt;
import net.mamoe.mirai.contact.User;
import net.mamoe.mirai.event.events.NudgeEvent;

import java.io.IOException;

public class MiraiGroupNudgeHandler extends QQNudgeEventHandler {
protected final MiraiBotService service;
public MiraiGroupNudgeHandler(MiraiBotService service) {
super(service);
this.service = service;
}

public void handle(NudgeEvent event) {
new MiraiNudgeContext(event).handleNudge();
}

public class MiraiNudgeContext extends NudgeContext {
protected final NudgeEvent event;
public MiraiNudgeContext(NudgeEvent event) {
this.event = event;
super.permission = service.getPermission(event.getSubject().getId());
}

@Override
protected String getTargetId() {
return String.valueOf(event.getTarget().getId());
}

@Override
protected String getTargetName() {
return event.getTarget().getNick();
}

@Override
protected boolean senderHasGroupPermission() {
return false;
}

@Override
protected BotSendEvent buildBotSendEvent(PetpetScriptModel script, RequestContext context) {
return new ScriptMiraiBotSendEvent(event.getBot(), context, script.getBasePath());
}

@Override
protected String getBotName() {
return event.getBot().getNick();
}

@Override
protected String getBotId() {
return String.valueOf(event.getBot().getId());
}

@Override
protected String getSenderName() {
return event.getFrom().getNick();
}

@Override
protected String getSenderId() {
return String.valueOf(event.getFrom().getId());
}

@Override
protected String getSubjectName() {
var subject = event.getSubject();
if (subject instanceof Group) {
return ((Group) subject).getName();
} else if (subject instanceof User) {
return ((User) subject).getNick();
}
return getSubjectId();
}

@Override
protected String getSubjectId() {
return String.valueOf(event.getSubject().getId());
}

@Override
protected void replyMessage(String text) {
event.getSubject().sendMessage(text);
}

@Override
protected void replyMessage(EncodedImage image) {
try {
service.uploadImage(image.bytes, event.getSubject());
} catch (IOException e) {
replyMessage("上传图像时出错: " + e.getMessage());
throw new IllegalStateException(e);
}
}

@Override
protected void replyMessage(BotSendEvent e) {
for (var msg : ((ScriptMiraiBotSendEvent) e).getResponseMessage()) {
this.event.getSubject().sendMessage(msg);
}
}

@Override
protected boolean inGroupContext() {
return true;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ protected boolean senderHasGroupPermission() {

@Override
protected BotSendEvent buildBotSendEvent(PetpetScriptModel script, RequestContext context) {
return new ScriptMiraiBotSendEvent(messageEvent, context, script.getBasePath());
return new ScriptMiraiBotSendEvent(messageEvent.getBot(), context, script.getBasePath());
}

@Override
Expand Down Expand Up @@ -109,5 +109,10 @@ protected void replyMessage(BotSendEvent e) {
this.messageEvent.getSubject().sendMessage(msg);
}
}

@Override
protected boolean inGroupContext() {
return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,38 @@
import java.util.stream.Collectors;

public class ScriptOnebotSendEvent extends BotSendEvent {
public final MessageEvent event;
public final OnebotBotService service;
protected ArrayList<List<String>> messageGroupList = null;
protected int messageGroupIndex = 0;
protected final boolean isGroupEvent;
protected final int messageId;

public ScriptOnebotSendEvent(
OnebotBotService service,
MessageEvent event,
RequestContext requestContext,
@Nullable File basePath
) {
this(
service,
event instanceof GroupMessageEvent,
event.getJson().getAsJsonObject().get("message_id").getAsInt(),
requestContext,
basePath
);
}

public ScriptOnebotSendEvent(
OnebotBotService service,
boolean isGroupEvent,
int messageId,
RequestContext requestContext,
@Nullable File basePath
) {
super(requestContext, basePath);
this.service = service;
this.event = event;
this.isGroupEvent = isGroupEvent;
this.messageId = messageId;
}

@Override
Expand Down Expand Up @@ -77,12 +95,12 @@ protected void nextMessageGroup() {
if (messageGroupList.isEmpty()) {
return null;
}
if (!isResponseInForward && event instanceof GroupMessageEvent) {
if (!isResponseInForward && isGroupEvent) {
return messageGroupList.stream()
.filter(msgs -> !msgs.isEmpty())
.map(msgs ->
"[{\"type\": \"reply\",\"data\": {\"id\": \""
+ ((GroupMessageEvent) event).getMessageId()
+ messageId
+ "\"}},"
+ String.join(",", msgs)
+ "]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import cn.evolvefield.onebot.client.handler.EventBus
import cn.evolvefield.onebot.client.listener.EventListener
import cn.evolvefield.onebot.sdk.event.message.GroupMessageEvent
import cn.evolvefield.onebot.sdk.event.message.PrivateMessageEvent
import cn.evolvefield.onebot.sdk.event.notice.NotifyNoticeEvent
import moe.dituon.petpet.bot.qq.onebot.handler.OnebotGroupMessageHandler
import moe.dituon.petpet.bot.qq.onebot.handler.OnebotGroupNudgeHandler
import moe.dituon.petpet.bot.qq.onebot.handler.OnebotMessageHandler
import moe.dituon.petpet.bot.qq.onebot.handler.OnebotSentMessageHandler
import moe.dituon.petpet.service.EnvironmentChecker
Expand Down Expand Up @@ -97,5 +99,12 @@ suspend fun main() {
}
}

if (config.nudgeProbability > 0) {
val groupNudgeHandler = OnebotGroupNudgeHandler(service)
EventBus.addListener(object : EventListener<NotifyNoticeEvent> {
override suspend fun onMessage(e: NotifyNoticeEvent) = groupNudgeHandler.handle(e)
})
}

log.info("Petpet Onebot 客户端启动完毕, 发送 ${config.command} 以触发默认模板...")
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ data class OnebotConfig(
@Comment("重连休息时间 (毫秒)")
val retryRestMills: Long = 60_000L,

@Comment("心跳包检测时间 (秒),设为0关闭检测")
@Comment("心跳包检测时间 (秒),设为 0 关闭检测")
val heartbeatCheckSeconds: Int = 60,


Expand Down Expand Up @@ -82,7 +82,7 @@ data class OnebotConfig(
// @Comment("GIF缩放阈值/尺寸 (暂时不可用)")
// val gifMaxSize: List<Int> = listOf(200, 200, 32),

@Comment("GIF质量, 1为质量最佳, 超过20不会有明显性能提升")
@Comment("GIF 质量, 1 为质量最佳, 超过 20 不会有明显性能提升")
val gifQuality: Int = 5,

@Comment("是否启用 headless 模式")
Expand All @@ -100,7 +100,7 @@ data class OnebotConfig(
// @Comment("是否启用消息注入 (详见文档)")
// val messageHook: Boolean = false,

@Comment("触发图片生成后的用户冷却时长 (毫秒), 设为-1禁用")
@Comment("触发图片生成后的用户冷却时长 (毫秒), 设为 0 禁用")
val userCooldownTime: Long = Cooler.DEFAULT_USER_COOLDOWN,

@Comment("触发图片生成后的群聊冷却时长 (同上)")
Expand Down
Loading

0 comments on commit 0f5ed4b

Please sign in to comment.