nonebot-plugin-send-anything-anywhere
nonebot-plugin-send-anything-anywhere copied to clipboard
[Proposal] Support OpenID
~~又是因为QQ~~
因为某些平台回使用 OpenID,即 Bot 看不到真实的用户 ID 和群号,只能看到 OpenID。对于不同的 Bot,对应同一个用户的 OpenID 是不一样的。这种情况下 auto select bot 功能将直接G,原先的 paltform_target 也需要进行改变。
- 新建一个 PlatformTarget 的 mixin 或者基类,作为所有 OpenID 的基类
- 在这个基类中记录 BotID,auto select bot 时按照这个 BotID 选择对应机器人
以上改动对于用户(下游开发者)来说应该是无感知的
没想明白BotSpecifier设计用于什么
这个botid什么时候被赋值
如果是extract_c2c_message_event
或extract_group_at_message_event
的话我觉得没必要
因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息
现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行
没想明白BotSpecifier设计用于什么 这个botid什么时候被赋值 如果是
extract_c2c_message_event
或extract_group_at_message_event
的话我觉得没必要 因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行
我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。 像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。
没想明白BotSpecifier设计用于什么 这个botid什么时候被赋值 如果是
extract_c2c_message_event
或extract_group_at_message_event
的话我觉得没必要 因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行
我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。 像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。
那是要再维护一个list存target么 其他适配器可以直接获取所有target但是QQ没有这个接口 我能想到的就只有收到消息之后把target存起来 但是这个维护的target又只用于发送主动消息,这么看就感觉没有必要
目前 saa 中 target 的设计目标是可以直接通过 send_to(target) 将对应的消息发送到指定的目标(群或频道)中,与具体是哪个机器人发送无关。所以最开始的设计中,是不包含 bot_id 的,因为当时所有的群组信息都与机器人无关。
但是 QQ群 这个 openid 是与 bot_id 绑定的,不同机器人获取到相同群组的 openid 不同,意味着,如果你需要发送到指定 openid 里,必须使用其对应的 bot 发送,不然会发送失败。所以为了支持这种平台,只能让 target 中附带 bot_id,找到对应 openid 的机器人发送。这样可以保持 target 的语义。
那是要再维护一个list存target么
现在 auto select 里已经有一个 list 了呀。
其他适配器可以直接获取所有target但是QQ没有这个接口
是的,所以 QQ 没法使用 auto_select 功能。
我能想到的就只有收到消息之后把target存起来 但是这个维护的target又只用于发送主动消息,这么看就感觉没有必要
bison 的使用场景就是订阅时记录需要主动推送的 target,等有新消息之后,直接通过这个 target 发送到对应平台。不知道你这里说的没必要是什么意思?
主动信息的场景我想到的就是在对方没有发送消息的时候主动发送,如果是这样这时list里并没有保存有对应的botid,则无法推送主动消息
QQ的被动消息时间限制是5分钟,主动消息每天限制4条 这么看的话,存botid的使用场景那就只有被动消息但是超时回复 所以我觉得没有很大必要(
主动发送消息也需要自己构造一个target吧,那还得插件开发者自己制定bot吗? 能拿到target实例的地方应该只有matcher?
如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier
~~但如果需要适配的话我抽空把这个feat完善了~~
如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier
继承的原因不是开发者关不关心的问题,而是我上面所说的 不同机器人获取到相同群组的 openid 不同。
https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/unique-id.html 举例
不同 bot 在单聊场景,获取到的用户唯一识别 openid 不一样,称为 user_openid 不同 bot 在群聊场景,获取到的群唯一识别号 openid 不一样,称为 group_openid 相同 bot 在不同的群,获取到同一个用户在群内的唯一识别号 openid 不一样,称为 member_openid
如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier
继承的原因不是开发者关不关心的问题,而是我上面所说的 不同机器人获取到相同群组的 openid 不同。
https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/unique-id.html 举例 不同 bot 在单聊场景,获取到的用户唯一识别 openid 不一样,称为 user_openid 不同 bot 在群聊场景,获取到的群唯一识别号 openid 不一样,称为 group_openid 相同 bot 在不同的群,获取到同一个用户在群内的唯一识别号 openid 不一样,称为 member_openid
我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么
https://github.com/MountainDash/nonebot-plugin-send-anything-anywhere/pull/124 我想的实现是这样,而不是在target上用botid区分target
那我请问你们打算如何实现openid的auto select bot
我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么
#124 我想的实现是这样,而不是在target上用botid区分target
你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。
我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么
#124 我想的实现是这样,而不是在target上用botid区分target
你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。
那就直接在BOT_CACHE里存,还加个botid干嘛
从功能上来说: 在使用 OpenID 的场景下,原来 auto_select_bot 的功能肯定是用不了了的——一个 OpenID 只对一个 bot 有效,那么通过这个 OpenID 只能选择这个 bot,其他 bot 都发送不到这个 OpenID。但是,这里想尽可能保证 QQ Platform 的使用和其它 Platform 一致,需要保证新的 OpenID PlatformTarget 既可以序列化反序列化,也可以实现 auto select 的方法(但是退化为只选择那个 Bot) 从语义上来说: OpenID 是和 bot id 强绑定的,脱离了 bot id 的 OpenID 是不完整的。
如果直接存在 BOT_CACHE 里,那么重启就没了,之前获取到的 OpenIDTarget 就找不到这个 OpenID 到底属于哪个 bot 了,自然就发不出去了。而且 OpenID 不是 bot 之外的用户可以获取的,所以单独通过 OpenID 构造 Target 并不是设计目标。我们希望上层开发者把 Target 当作一个可序列化的黑盒,通过 extract_target() 获取,不需要用户构造(特别是 OpenID 这种场景下)
那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ
现在也就QQ适配器 需要这玩意应该
现在也就QQ适配器 需要这玩意应该
那我就只给adapter-qq写 look forward to my pr plz
那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ
这个隔壁 PR 已经做了(指 #121
那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ
这个隔壁 PR 已经做了(指 #121
所以现在adapter-qq到底谁在维护(((( pr这么多越看越乱orz
(其实我pr之前就做好了捏,然后我没理解你们的设计目的然后rebase掉了那个commit
目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情
目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情
这么说我pr没打算合了么(
(一样样来)