Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Proposal] Support OpenID #113

Open
felinae98 opened this issue Nov 13, 2023 · 19 comments
Open

[Proposal] Support OpenID #113

felinae98 opened this issue Nov 13, 2023 · 19 comments

Comments

@felinae98
Copy link
Collaborator

又是因为QQ

因为某些平台回使用 OpenID,即 Bot 看不到真实的用户 ID 和群号,只能看到 OpenID。对于不同的 Bot,对应同一个用户的 OpenID 是不一样的。这种情况下 auto select bot 功能将直接G,原先的 paltform_target 也需要进行改变。

  1. 新建一个 PlatformTarget 的 mixin 或者基类,作为所有 OpenID 的基类
  2. 在这个基类中记录 BotID,auto select bot 时按照这个 BotID 选择对应机器人

以上改动对于用户(下游开发者)来说应该是无感知的

@Dreamail
Copy link
Contributor

没想明白BotSpecifier设计用于什么
这个botid什么时候被赋值
如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要
因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了
记录botid的方法我觉得不可行

@he0119
Copy link
Contributor

he0119 commented Nov 26, 2023

没想明白BotSpecifier设计用于什么
这个botid什么时候被赋值
如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要
因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了
记录botid的方法我觉得不可行

我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。
像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。

@Dreamail
Copy link
Contributor

没想明白BotSpecifier设计用于什么
这个botid什么时候被赋值
如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要
因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了
记录botid的方法我觉得不可行

我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。
像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。

那是要再维护一个list存target么
其他适配器可以直接获取所有target但是QQ没有这个接口
我能想到的就只有收到消息之后把target存起来
但是这个维护的target又只用于发送主动消息,这么看就感觉没有必要

@he0119
Copy link
Contributor

he0119 commented Nov 26, 2023

目前 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 发送到对应平台。不知道你这里说的没必要是什么意思?

@Dreamail
Copy link
Contributor

Dreamail commented Nov 26, 2023

主动信息的场景我想到的就是在对方没有发送消息的时候主动发送,如果是这样这时list里并没有保存有对应的botid,则无法推送主动消息

QQ的被动消息时间限制是5分钟,主动消息每天限制4条
这么看的话,存botid的使用场景那就只有被动消息但是超时回复
所以我觉得没有很大必要(

主动发送消息也需要自己构造一个target吧,那还得插件开发者自己制定bot吗?
能拿到target实例的地方应该只有matcher?

如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier

但如果需要适配的话我抽空把这个feat完善了

@he0119
Copy link
Contributor

he0119 commented Nov 26, 2023

如果是要实现开发者不关心由哪个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

@Dreamail
Copy link
Contributor

Dreamail commented Nov 26, 2023

如果是要实现开发者不关心由哪个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所要做的么

#124 我想的实现是这样,而不是在target上用botid区分target

@Dreamail
Copy link
Contributor

那我请问你们打算如何实现openid的auto select bot

@he0119
Copy link
Contributor

he0119 commented Nov 26, 2023

我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么

#124 我想的实现是这样,而不是在target上用botid区分target

你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。

@Dreamail
Copy link
Contributor

我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么

#124 我想的实现是这样,而不是在target上用botid区分target

你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。

那就直接在BOT_CACHE里存,还加个botid干嘛

@felinae98
Copy link
Collaborator Author

从功能上来说:
在使用 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 这种场景下)

@Dreamail
Copy link
Contributor

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔
是打算全部adapter都实现BotSpecifier还是只有QQ

Copy link
Contributor

现在也就QQ适配器 需要这玩意应该

@Dreamail
Copy link
Contributor

现在也就QQ适配器 需要这玩意应该

那我就只给adapter-qq写
look forward to my pr plz

@felinae98
Copy link
Collaborator Author

felinae98 commented Nov 27, 2023

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ

这个隔壁 PR 已经做了(指 #121

@Dreamail
Copy link
Contributor

Dreamail commented Nov 27, 2023

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ

这个隔壁 PR 已经做了(指 #121

所以现在adapter-qq到底谁在维护((((
pr这么多越看越乱orz

(其实我pr之前就做好了捏,然后我没理解你们的设计目的然后rebase掉了那个commit

@felinae98
Copy link
Collaborator Author

目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情

@Dreamail
Copy link
Contributor

目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情

这么说我pr没打算合了么(

@felinae98
Copy link
Collaborator Author

(一样样来)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants