Ehforwardbot学习

efb-wechat-cutecat-slave到python-cutecat-ihttp的下发流程

这个部分,是用到了CuteCatChannel的bot对象,这个bot对象本身是ihttp的cutecat对象,两个项目就联系起来了。

而ihttp的cutecat是一个httpapi的实现+flask。api的实现就是用来下发的,flask是用来接收的。

  1. 请求的源头,通过cutecatchannel的send_message函数,通过{.bot.(实际功能)(其他参数)}调用来触发到bot的call_action.
  2. 调用httpapi的下发,实际上在httpapi里面并没有约定函数的名称,思路是统一重定向到call_action函数,方案是触发到父类api的__getattr__函数完成重定向,并将函数名作为参数给call_action。
  3. 最后call_action将对应字段调整封装到json,然后由request下发给可爱猫插件。

待搞清楚:发送文件是怎么发送,从代码里面看,是{‘name’ : filename , ‘url’: self.self_url + msg.file.name}作为json的message字段下发,然后预计可爱猫收到以后,会主动上来获取?猜测是通过ihttp的_handle_event方法来处理。实际上也用到了flask的接收请求流程。

python-cutecat-ihttp到cutecat-slave的上发流程

这部分没有理太清楚,两个难点,一个是不理解flask的机制,获取信息以后到底怎么调用,另外一个是装饰器怎么传递调用。

说点弄懂的:

  1. cutecatchannel类初始化的时候,通过bus的subscribe,将自己的具体每个event类型实现注册给eventbus的subscribe。
  2. ihttp获取到信息以后,通过_handle_event,将收到的请求注册为一个event对象,然后通过注册为message对象来修改event的type。
  3. 如果有文件,就把文件的地址解析到可爱猫的地址。
  4. 然后把event对象通过eventbus来处理,这个bus的把每条消息都通过run_funcs来按每个注册过的event类型实现处理。

待搞清楚:

  1. flask收到请求,如何传给_handle_event.
  2. 装饰器是怎么来注册的?是对象初始化的时候就会跑一遍来注册上?

coordinate机制

coordinate的机制比较简单,代码清晰,就是先轮询middleware,然后再根据deliver_to字段决定往master还是slave发送。

msg对象一般要为以下格式,注册为Message的对象。

msg = Message(
uid=”{uni_id}”.format(uni_id=str(int(time.time()))),
type=MsgType.Text,
chat=chat,
author=author,
deliver_to=coordinator.master,
)
coordinator.send_message(msg)

待搞清楚:middleware的注册机制,应该是和python的setup.py相关。

发表评论

Proudly powered by WordPress | Theme: Looks Blog by Crimson Themes.