Skip to main content

人类的本质

调整好项目的结构之后,我们来编写一个复读机插件。

plugins 文件夹中新建一个 repeat.py 文件。现在,你的目录应该像这样:

miraicle-example├── plugins│   ├── __init__.py│   ├── repeat.py│   └── hello.py└── bot.py

首先来设定一下:如果一条群消息被重复了 3 次,这个时候 bot 就会对这条消息进行复读。

按照这样的思路,我们可以写出以下代码:

repeat.py
import miraicle
msg_repeat = Nonerepeat_times = 0

@miraicle.Mirai.receiver('GroupMessage')def repeat(bot: miraicle.Mirai, msg: miraicle.GroupMessage):    global msg_repeat, repeat_times    if msg == msg_repeat:        repeat_times += 1    else:        msg_repeat = msg        repeat_times = 1    if repeat_times == 3:        bot.send_group_msg(group=msg.group, msg=msg)
info

GroupMessageFriendMessageTempMessage 类均继承自 Message 类。而 Message 对等号做了重载:只要两个 Message 对象中的消息链列表相等,这两条消息就会被认为是相等的,而不用考虑它们是否在同一时间,由同一个账号发送。

__init__.py 文件中加入这个插件:

__init__.py
__all__ = ['hello', 'repeat']

运行程序。当你在群里重复发送 3 次相同的消息,你的 bot 也会跟着复读了。

然而,你也许发现了,这样的复读是对 bot 接收到的所有群消息进行的。这意味着,如果你和你的 bot 同时在 A、B、C 3 个群里,你在 A 群发送了一条消息,接着先后在 B 群、C 群发送了同样的消息,bot 会在 C 群对这条消息进行复读。再比如说,当某个群里一条消息被重复了 2 次,突然另一个群里来了一条消息,第一个群里的复读就被打断了。也就是说,现在这个 bot 的复读是跨群的,这样显然不合常理。

我们可以使用一个字典来记录每个群内正在重复的消息,以及重复的次数。一旦某个群内同一条消息重复 3 次,bot 就会复读这条消息。修改后的代码如下:

repeat.py
import miraicle
msg_dict = {}

@miraicle.Mirai.receiver('GroupMessage')def repeat(bot: miraicle.Mirai, msg: miraicle.GroupMessage):    group = msg.group    if group not in msg_dict:        msg_dict[group] = {'msg_repeat': msg, 'repeat_times': 1}    elif msg_dict[group]['msg_repeat'] == msg:        msg_dict[group]['repeat_times'] += 1    else:        msg_dict[group] = {'msg_repeat': msg, 'repeat_times': 1}    if msg_dict[group]['repeat_times'] == 3:        bot.send_group_msg(group=msg.group, msg=msg)

怎么样,现在你的 bot 是不是离人类的本质又近了一步?