Skip to content

Latest commit

 

History

History

ex08_add_reaction

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

example 08 互动起来:消息回应

在之前的exp05中,我们知道bot可以处理一些Event事件

interface.py中,你可以看到更多EventTypes的具体事件。

其中,消息回应涉及到的事件是ADDED_REACTION

观测回应:设置evnet事件

ex08.py的13-15行,这里我们设置了bot去观测事件ADDED_REACTION

@bot.on_event(EventTypes.ADDED_REACTION)
async def reaction_reminder(b:Bot,event:Event):

在观测到用户给某一条消息添加回应后,bot会发送一条消息,告知用户添加了表情回应

    # fetch channel of the REACTION event
    channel = await b.fetch_public_channel(event.body['channel_id']) 
    # send a messge to inform user at current channel
    await b.send(channel,f"you add reaction{event.body['emoji']['id']}") 

建议先使用print(event.body)了解event.body的结构。当然,你还可以去阅读官方API文档【频道相关事件】来了解这部分内容。

  • 22年6月下旬KOOK统一了emoji显示的格式,修复了同一个emoji会有两个['emoji']['id']的BUG。
{'channel_id': '添加回应的文字频道id', 'emoji': {'id': '💜', 'name': '💜'}, 'user_id': '添加回应的用户id', 'msg_id': '添加了回应的消息id'}

添加角色:通过特定emoji为用户添加特定角色

了解了上面的event方式后,你现在可以让机器人来为用户添加角色。这在一些服务器的“上色频道”中非常好用。

既然要让机器人根据emoji添加不同的角色,首先我们需要制作一个emoji和角色对应的card messgae

@bot.command()
async def RoleSet(msg:Message):
    cm = CardMessage()
    c1 = Card(Module.Header('Add reaction to get a role for yourself!'), Module.Context('Waiting for more roles...'))
    c1.append(Module.Divider())
    c1.append(Module.Section('「:pig:」test1  「:tiger:」test2\n'))
    cm.append(c1)
    await msg.ctx.channel.send(cm)

需要注意的是,['emoji']['id']和KOOK所用emoji网站Webfx上的编号有所不同。如果想让机器人发送的消息里面包含emoji,需要使用Webfx网站上的编号;而如果想实现判断用户回应的emoji,则需要使用event.body["emoji"]['id']

最好的办法当然是用print把卡片消息中包含的emoji对应的event.body["emoji"]['id']打印出来

当我们知道了回应表情的['emoji']['id']和服务器的角色ID(role_id)后,就可以在用户给这条卡片消息添加回应后,让机器人根据回应表情的['emoji']['id']来设置不同的角色


ex08.py的30-41行,在设置角色之前,我们先要通过Bot获取服务器id,返回一个服务器对象【Guild】;并获取添加了回应的用户对象【User

    # need to fetch_guild first
    g = await b.fetch_guild('5134217138075250') # input guild_id here
    # fetch user who ADDED_REACTION
    u = await b.fetch_user(event.body['user_id'])
    # fetch channel of the REACTION event
    channel = await b.fetch_public_channel(event.body['channel_id']) 

在服务器管理后台中,你可以右键复制用户角色(role)的ID并给机器人设置上,这样机器人才能给用户添加角色

  • 22年6月下旬KOOK统一了emoji显示的格式,修复了同一个emoji会有两个['emoji']['id']的BUG。为了避免KOOK后续可能还会修改['emoji']['id'],本exp代码中if的判断一定要以当前打印的['emoji']['id']为准,否则会因为id不同导致无法正常匹配。

  • 注意:第39行的role_id传参是int类型,而不是str

if判断的代码示例如下

    if event.body["emoji"]['id'] == '🐷':
        await g.grant_role(u,4465168)
        await b.send(channel,f"grant_role 4465168 for you",temp_target_id=event.body['user_id']) 
    elif event.body["emoji"]['id'] == '🐯':
        await g.grant_role(u,4469565)
        await b.send(channel,f"grant_role 4469565 for you",temp_target_id=event.body['user_id']) 

这里建议添加一个判断语句,来保证设置角色功能只对某一条消息生效。要不然就乱套啦!

if event.body['msg_id'] == '消息ID' 

自己动手:丰衣足食

除了添加角色后,机器人还可以撤销用户的角色,给服务器添加/删除用户角色

你可以查看khl/guild.py中的函数接口,尝试使用这些功能

引用大佬的话:“只看菜谱不动手的人,等锅都生锈了都学不会做饭”


下面是让机器人通过emoji设置用户角色的示例图

example