js小白,想知道一下inspect是如何实现的?

RT,目前有三个疑问:
1.根据着开发文档一步步走的话,可以用ctx.on方法实现与inspect相同的功能,但只在群聊模式下可用,私聊无法使用。
2.如何以ctx.command的方式来实现呢,会话状态都是保存利用ctx.on捕捉到session,如何在使用命令时捕捉到该session,实现inspect,这个session到底是什么。
3.ctx.on里的第一个参数event,具体都能监听哪些事件?目前只看到了message一个。
附上代码(菜只因,有一点实力但不多,非计算机专业,纯粹是以前高中学过一点点C++

  ctx.on('message', (session) => {
    if (session.content === '状态') {
      let now_message_status = [session.event.platform, session.event.message.id, session.event.channel.id, session.event.guild.id, session.event.user.id, session.selfId]
      session.send('平台名: '+now_message_status[0]+'\n'+'消息ID: '+now_message_status[1]+'\n'+'频道ID: '+now_message_status[2]+'\n'+'群组ID: '+now_message_status[3]+'\n'+'用户ID: '+now_message_status[4]+'\n'+'事件自身ID: '+now_message_status[5]+'\n此状态来自于cfri-test插件')
    }
  })
2 个赞

借助Blockly可视化插件,大概梳理出来了用cmd.action实现的方法,那就是把{session}作为action回调函数的第一个参数,即为action回调函数的Argv对象,那这个Argv对象内又有些什么呢?
看文档,这个{session}是作为Argv对象中的options选项列表传进去了?

2 个赞

.action的回调函数会将Argv对象作为第一个参数传入,这在开发指南的指令开发章节就说过了

是把Argv对象中的session属性解构赋值给session变量了

2 个赞

对象解构赋值这块借助chatgpt完全理解了(大嘘),有一个新问题:session是在ctx监听器被触发时就会创建的吗?
另外,对于第1点的问题,inspect在沙盒私聊下群组id为空白,在QQ频道私聊时正常,不抛出错误。
我查看log,guildid在沙盒私聊下无法读取,抛内部错误,在QQ频道私聊时又正常了,查看文档发现私聊不属于任何群组,inspect如何做到这一点的?

2 个赞

https://github.com/koishijs/koishi/blob/8d8c4f9f5540c23b0f055fd29c07000eaf832988/plugins/common/inspect/src/index.ts

不过你为啥不直接看 inspect 插件的源码……

1 个赞

忙着问chatgpt类型定义去了,完全忘了这事…
看了一下,大佬的思路是基于本地化的考虑,将其输出到文件里再发出去,还有用h.parse对消息类型的判断如果对api不熟的话可能基本想不到,我就一股脑塞程序逻辑里了
能跑就行.jpg
另外,session.quote 和 text 这俩大概能猜到是啥作用,但是文档上没有具体讲解
对于 session.guildId,它的完整写法是 session.event.channel.id,但是如果直接读取后者,会直接抛error,但若直接读取前者,则只会输出undefined,这是资源提升规则的原因吗

2 个赞

session.guildId的完整写法是session.event.guild.id

这是因为你读取的时候,event没有channel属性,是undefined,所以后面的id相当于在读取undefined的属性,就会报错,前者为什么不会报错就显而易见了,这是js的基本知识,你可能需要了解一下可选链
https://zh.javascript.info/optional-chaining

2 个赞