Skip to content

Latest commit

 

History

History

ex05_event

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

example 05 开点小灶:事件处理

现在我们的 Bot 可以用 send/reply 等等功能来给服务器发消息,也可以用指令来响应服务器发来的消息,可以说机器人也好好的长大成人,没有什么基本能力问题了

不过就像是湘菜师傅干了十几年就可能会想想不放辣椒的菜是什么口味,我们也会自然地想想我们的 Bot 还可以有什么功能和能力,所以该开点小灶了

这里我们来讲讲 khl 中「看不见」的那些神奇功能

时时清醒:修改消息提醒

有的时候,你可能会多次编辑某一条消息,乃至于忘记自己什么时候修改过这个消息。这时候就可以让机器人登场,来提醒你消息已经被修改过啦!

ex05.py的18-19行,这里设置了需要Bot观测的Event事件UPDATED_MESSAGE(消息更新)

@bot.on_event(EventTypes.UPDATED_MESSAGE)
async def update_reminder(b: Bot, event: Event):

使用b.fetch_public_channel功能可以获取到发生eventChannel Object(利用频道ID访问khl后台获取Channel Object

查看官方API文档【频道相关事件】,就可以看到event.body的字段结构;也可以使用print(event.body)打印出字段结构。body中的channel_id就是event发生的地点(即发生了消息修改事件的文字频道)

在用datetime.fromtimestamp转换时间戳为正常时间格式,确认消息更新的时间后,我们让Bot向发生这个event的频道发送一条提醒消息

    channel = await b.fetch_public_channel(event.body['channel_id'])
    updated_at = datetime.fromtimestamp(event.body["updated_at"] / 1000)  # ms timestamp -> POSIX timestamp
    await b.send(channel, f'msg {event.body["msg_id"]} was updated at {updated_at}')

小心谨慎:删除消息提醒

除了可以观测消息更新之外,Bot还可以得知那一条消息被删除了,并向删除了消息的频道发送一条提醒

async def delete_catcher(b: Bot, event: Event):
    channel = await b.fetch_public_channel(event.body['channel_id'])
    await b.send(channel, f'msg {event.body["msg_id"]} was deleted...')

我们可以将这个函数添加为一个需要处理的事件,方便下次让Bot在另外一个地方调用这个事件

bot.add_event_handler(EventTypes.DELETED_MESSAGE, delete_catcher)

下面是一个删除/修改消息提醒的示例图

example