Skip to content

Latest commit

 

History

History

ex04_reply

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

example 04 好看的菜盘:向用户发消息的各种花活

在 khl.py 中,指令的第一个参数固定是 TextMsg 类型,这个 TextMsg 代表着用户触发指令的那条消息:

  • 比如我们在 ex01 中用到的 !hello
  • 还有 ex03 中的 !roll 1 100
  • 这些消息都会被包装成 TextMsg 类型,传递给指令

有来就有往,既然用户给我们发消息了,那很自然的,我们也经常需要把指令的运行结果用消息发送给用户

khl.py 也为大家包装好了一些发送消息的便利方法,这些便利方法就像菜盘一样,一个好看的菜盘装菜,肯定是要香的:

reply

TextMsg 中有一系列的 reply_xxxx() 方法:

  • reply(): 对应客户端中的「回复」功能,最简单、最直接、最好用的回复方法
  • reply_temp(): temp 代表这是给用户回复一个「临时消息」
    • 问:临时消息是个啥?
    • 答:临时消息是开黑啦特有的一个功能,有以下特性:
      • 在重启客户端、刷新网页后就消失
      • 仅特定(可自行指定)的人可见
    • 试试就懂了,收到临时消息之后重开下客户端/刷新下网页,你就会发现消息马上就不见
  • reply_card(): 给用户回复一个「卡片消息」
    • 问:卡片消息又是个啥?这菜盘里的新东西好多!
    • 答:卡片消息其实只是一种「更好看、更好玩的消息」
      • 大家不用急着学,之后会专门讲的,有兴趣的话可以先看看官方文档:卡片消息
  • reply_card_temp(): 顾名思义,这就是给用户回复一个临时的卡片消息
    • 因为这是一个缝合怪方法,所以这里就不再展开了,大家用一用就懂

send

哎,reply 这个菜盘看起来很能装啊,为啥又来了一个 send?是不是有点重叠?

其实这两个的使用情景是不同的:

  • reply 是针对一条特定的消息进行回复,这是一个有明确对象、有依赖关系的动作
  • send 则是向一个频道进行发送消息,没有指向对象、不需要依赖其他消息

说完了区别,我们来看看怎么用:

send_xxxx() 系列方法其实不在 TextMsg 中,而是在 TextMsg.ctx

  • 问:多出来的这个 ctx 是什么?
  • 答:ctxcontext (上下文) 的缩写,代表了一条 TextMsg 所处在的环境
    • ctx 中记录了一些很好用的东西,比如:
      • 消息所在的频道 channel
      • 消息所在的服务器 guild
      • 消息的发送者 author
      • 消息的接收者 bot
        • 注意!bot 是被放在这里的,如果你不使用闭包特性写指令的话,会经常用到这个
        • 我们教程都是用闭包特性的,大家不用担心,闭包相关的内容后面也会讲

讲完了位置,我们来看看咋用:

  • ctx.send(): 最简单、最直接、最好用的发消息方法
  • ctx.send_temp(): 向 ctx 发一个临时消息(临时消息的说明请看上面~)
    • 注意!因为 send 没有指向对象,所以要手动指定临时消息的接收者,这是和 reply_temp() 不同的地方
  • ctx.send_card(): 向 ctx 发一个卡片消息(卡片消息的说明请看上面~)
  • ctx.send_card_temp(): 向 ctx 发一个临时卡片消息(同样见上)

使用示例

大家可以直接看 ex04.py 第 22~32 行,当然也推荐自己动手试试看!只看菜谱不动手的人,等锅都生锈了都学不会做饭