efb-wechat-cutecat-slave到python-cutecat-ihttp的下发流程
这个部分,是用到了CuteCatChannel的bot对象,这个bot对象本身是ihttp的cutecat对象,两个项目就联系起来了。
而ihttp的cutecat是一个httpapi的实现+flask。api的实现就是用来下发的,flask是用来接收的。
- 请求的源头,通过cutecatchannel的send_message函数,通过{.bot.(实际功能)(其他参数)}调用来触发到bot的call_action.
 - 调用httpapi的下发,实际上在httpapi里面并没有约定函数的名称,思路是统一重定向到call_action函数,方案是触发到父类api的__getattr__函数完成重定向,并将函数名作为参数给call_action。
 - 最后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的机制,获取信息以后到底怎么调用,另外一个是装饰器怎么传递调用。
说点弄懂的:
- cutecatchannel类初始化的时候,通过bus的subscribe,将自己的具体每个event类型实现注册给eventbus的subscribe。
 - ihttp获取到信息以后,通过_handle_event,将收到的请求注册为一个event对象,然后通过注册为message对象来修改event的type。
 - 如果有文件,就把文件的地址解析到可爱猫的地址。
 - 然后把event对象通过eventbus来处理,这个bus的把每条消息都通过run_funcs来按每个注册过的event类型实现处理。
 
待搞清楚:
- flask收到请求,如何传给_handle_event.
 - 装饰器是怎么来注册的?是对象初始化的时候就会跑一遍来注册上?
 
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相关。