async def init_puppet_event_bridge(self, puppet: Puppet): """ init puppet event stream """ log.info('init_puppet_event_bridge() <%s>', puppet) event_names = PUPPET_EVENT_DICT.keys() for event_name in event_names: if event_name == 'dong': def dong_listener(payload: EventDongPayload): log.debug('receive <dong> event <%s>', payload) self.emit('dong', payload.data) # feed food to the dog food = WatchdogFood(timeout=30) self._watchdog.feed(food) puppet.on('dong', dong_listener) elif event_name == 'error': async def error_listener(payload: EventErrorPayload): log.info('receive <error> event <%s>', payload) self.emit('error', payload) await self.on_error(payload) puppet.on('error', error_listener) elif event_name == 'heart-beat': async def heartbeat_listener(payload: EventHeartbeatPayload): log.info('receive <heart-beat> event <%s>', payload) self.emit('heartbeat', payload.data) await self.on_heartbeat(payload) puppet.on('heart-beat', heartbeat_listener) elif event_name == 'friendship': async def friendship_listener(payload: EventFriendshipPayload): log.info('receive <friendship> event <%s>', payload) friendship = self.Friendship.load(payload.friendship_id) await friendship.ready() self.emit('friendship', friendship) friendship.contact().emit('friendship', friendship) await self.on_friendship(friendship) puppet.on('friendship', friendship_listener) elif event_name == 'login': async def login_listener(payload: EventLoginPayload): # set login contact_id self.contact_id = payload.contact_id log.info('receive <login> event <%s>', payload) contact = self.Contact.load(payload.contact_id) await contact.ready() self.emit('login', Contact) await self.on_login(contact) puppet.on('login', login_listener) elif event_name == 'logout': async def logout_listener(payload: EventLogoutPayload): # TODO -> should to ContactSelf log.info('receive <logout> event <%s>', payload) contact = self.Contact.load(payload.contact_id) await contact.ready() self.emit('logout', Contact) await self.on_logout(contact) puppet.on('logout', logout_listener) elif event_name == 'message': async def message_listener(payload: EventMessagePayload): log.debug('receive <message> event <%s>', payload) msg = self.Message.load(payload.message_id) await msg.ready() log.info('receive message <%s>', msg) self.emit('message', msg) await self.on_message(msg) room = msg.room() if room is not None: room.emit('message', room) puppet.on('message', message_listener) elif event_name == 'ready': async def ready_listener(payload: EventReadyPayload): log.info('receive <ready> event <%s>') self.emit('ready', payload) self._ready_state.on(True) await self.on_ready(payload) puppet.on('ready', ready_listener) elif event_name == 'room-invite': async def room_invite_listener(payload: EventRoomInvitePayload): log.info('receive <room-invite> event <%s>') invitation = self.RoomInvitation.load( payload.room_invitation_id) self.emit('room-invite', invitation) await self.on_room_invite(invitation) puppet.on('room-invite', room_invite_listener) elif event_name == 'room-join': async def room_join_listener(payload: EventRoomJoinPayload): log.info('receive <room-join> event <%s>') room = self.Room.load(payload.room_id) await room.ready() invitees = [self.Contact.load(invitee_id) for invitee_id in payload.invited_ids] for invitee in invitees: await invitee.ready() inviter = self.Contact.load(payload.inviter_id) await inviter.ready() date = datetime.fromtimestamp(payload.time_stamp) self.emit('room-join', room, invitees, inviter, date) await self.on_room_join(room, invitees, inviter, date) room.emit('join', invitees, inviter, date) puppet.on('room-join', room_join_listener) elif event_name == 'room-leave': async def room_leave_listener(payload: EventRoomLeavePayload): log.info('receive <room-leave> event <%s>') room = self.Room.load(payload.room_id) # room info is dirty now await room.ready(force_sync=True) leavers = [self.Contact.load(inviter_id) for inviter_id in payload.removed_ids] for leaver in leavers: await leaver.ready() remover = self.Contact.load(payload.remover_id) await remover.ready() date = datetime.fromtimestamp(payload.time_stamp) self.emit('room-leave', room, leavers, remover, date) await self.on_room_leave(room, leavers, remover, date) room.emit('leave', leavers, remover, date) if self.puppet.self_id() in payload.removed_ids: pass # await self.puppet.room_payload(payload.room_id) # await self.puppet.room_member_payload_dirty( # payload.room_id) puppet.on('room-leave', room_leave_listener) elif event_name == 'room-topic': async def room_topic_listener(payload: EventRoomTopicPayload): log.info('receive <room-topic> event <%s>') room = self.Room.load(payload.room_id) await room.ready() changer = self.Contact.load(payload.changer_id) await changer.ready() date = datetime.fromtimestamp(payload.time_stamp) self.emit('room-topic', room, payload.new_topic, payload.old_topic, changer, date) await self.on_room_topic(room, payload.new_topic, payload.old_topic, changer, date) room.emit('topic', payload.new_topic, payload.old_topic, changer, date) puppet.on('room-topic', room_topic_listener) elif event_name == 'scan': async def scan_listener(payload: EventScanPayload): log.info('receive <scan> event <%s>') qr_code = '' if payload.qrcode is None \ else payload.qrcode if payload.status == ScanStatus.Waiting: qr_terminal(qr_code) self.emit('scan', payload.status, qr_code, payload.data) await self.on_scan(payload.status, qr_code, payload.data) puppet.on('scan', scan_listener) elif event_name == 'reset': log.info('receive <reset> event <%s>') else: raise ValueError(f'event_name <{event_name}> unsupported!') log.info('initPuppetEventBridge() puppet.on(%s) (listenerCount:%s) ' 'registering...', event_name, puppet.listener_count(event_name))
async def init_puppet_event_bridge(self, puppet: Puppet): """ init puppet event stream """ log.info('init_puppet_event_bridge() <%s>', puppet) event_names = PUPPET_EVENT_DICT.keys() for event_name in event_names: if event_name == 'dong': def dong_listener(payload: EventDongPayload): log.debug('receive <dong> event <%s>', payload) self.emit('dong', payload.data) # feed food to the dog food = WatchdogFood(timeout=30) if self._watchdog: self._watchdog.feed(food) puppet.on('dong', dong_listener) elif event_name == 'error': async def error_listener(payload: EventErrorPayload): if isinstance(payload, EventErrorPayload): log.info('receive <error> event <%s>', payload) self.emit('error', payload) await self.on_error(payload) else: log.error('internal error <%s>', payload) puppet.on('error', error_listener) elif event_name == 'heart-beat': async def heartbeat_listener(payload: EventHeartbeatPayload): log.info('receive <heart-beat> event <%s>', payload) self.emit('heartbeat', payload.data) await self.on_heartbeat(payload) puppet.on('heart-beat', heartbeat_listener) elif event_name == 'friendship': async def friendship_listener(payload: EventFriendshipPayload): log.info('receive <friendship> event <%s>', payload) friendship = self.Friendship.load(payload.friendship_id) await friendship.ready() self.emit('friendship', friendship) # this method will cause _events error, refer to # :https://github.com/wechaty/python-wechaty/issues/122 # and this feature is considering to be removed, refer to # https://github.com/wechaty/python-wechaty/issues/127 # friendship.contact().emit('friendship', friendship) await self.on_friendship(friendship) await self._plugin_manager.emit_events( 'friendship', friendship) puppet.on('friendship', friendship_listener) elif event_name == 'login': async def login_listener(payload: EventLoginPayload): # init the plugins await self._plugin_manager.init_plugins() # set login contact_id self.contact_id = payload.contact_id log.info('receive <login> event <%s>', payload) contact = self.ContactSelf.load(payload.contact_id) await contact.ready() self.emit('login', contact) await self.on_login(contact) # emit the login event to plugins await self._plugin_manager.emit_events('login', contact) puppet.on('login', login_listener) elif event_name == 'logout': async def logout_listener(payload: EventLogoutPayload): # TODO -> should to ContactSelf log.info('receive <logout> event <%s>', payload) contact = self.ContactSelf.load(payload.contact_id) await contact.ready() self.emit('logout', contact) await self.on_logout(contact) # emit the logout event to plugins await self._plugin_manager.emit_events('logout', contact) puppet.on('logout', logout_listener) elif event_name == 'message': async def message_listener(payload: EventMessagePayload): log.debug('receive <message> event <%s>', payload) msg = self.Message.load(payload.message_id) await msg.ready() log.info('receive message <%s>', msg) self.emit('message', msg) await self.on_message(msg) room = msg.room() if room is not None: room.emit('message', room) # emit the message event to plugins await self._plugin_manager.emit_events('message', msg) puppet.on('message', message_listener) elif event_name == 'ready': async def ready_listener(payload: EventReadyPayload): log.info('receive <ready> event <%s>') self.emit('ready', payload) self._ready_state.on(True) await self.on_ready(payload) puppet.on('ready', ready_listener) elif event_name == 'room-invite': async def room_invite_listener( payload: EventRoomInvitePayload): log.info('receive <room-invite> event <%s>') invitation = self.RoomInvitation.load( payload.room_invitation_id) self.emit('room-invite', invitation) await self.on_room_invite(invitation) # emit the room-invite event to plugins await self._plugin_manager.emit_events( 'room-invite', invitation) puppet.on('room-invite', room_invite_listener) elif event_name == 'room-join': async def room_join_listener(payload: EventRoomJoinPayload): log.info('receive <room-join> event <%s>') room = self.Room.load(payload.room_id) await room.ready() invitees = [ self.Contact.load(invitee_id) for invitee_id in payload.invited_ids ] for invitee in invitees: await invitee.ready() inviter = self.Contact.load(payload.inviter_id) await inviter.ready() # timestamp is from hostie-server, but the value range is # 10^10 ~ 10^13 # refer to # :https://github.com/wechaty/python-wechaty/issues/1290 date = timestamp_to_date(payload.timestamp) self.emit('room-join', room, invitees, inviter, date) await self.on_room_join(room, invitees, inviter, date) room.emit('join', invitees, inviter, date) # emit the room-join event to plugins await self._plugin_manager.emit_events( 'room-join', room, invitees, inviter, date) puppet.on('room-join', room_join_listener) elif event_name == 'room-leave': async def room_leave_listener(payload: EventRoomLeavePayload): log.info('receive <room-leave> event <%s>') room = self.Room.load(payload.room_id) # room info is dirty now await room.ready(force_sync=True) leavers = [ self.Contact.load(inviter_id) for inviter_id in payload.removed_ids ] for leaver in leavers: await leaver.ready() remover = self.Contact.load(payload.remover_id) await remover.ready() date = timestamp_to_date(payload.timestamp) self.emit('room-leave', room, leavers, remover, date) await self.on_room_leave(room, leavers, remover, date) room.emit('leave', leavers, remover, date) if self.puppet.self_id() in payload.removed_ids: pass # await self.puppet.room_payload(payload.room_id) # await self.puppet.room_member_payload_dirty( # payload.room_id) # emit the room-leave event to plugins await self._plugin_manager.emit_events( 'room-leave', leavers, remover, date) puppet.on('room-leave', room_leave_listener) elif event_name == 'room-topic': async def room_topic_listener(payload: EventRoomTopicPayload): log.info('receive <room-topic> event <%s>') room = self.Room.load(payload.room_id) await room.ready() changer = self.Contact.load(payload.changer_id) await changer.ready() date = timestamp_to_date(payload.timestamp) self.emit('room-topic', room, payload.new_topic, payload.old_topic, changer, date) await self.on_room_topic(room, payload.new_topic, payload.old_topic, changer, date) room.emit('topic', payload.new_topic, payload.old_topic, changer, date) # emit the room-topic to plugins await self._plugin_manager.emit_events( 'room-topic', room, payload.new_topic, payload.old_topic, changer, date) puppet.on('room-topic', room_topic_listener) elif event_name == 'scan': async def scan_listener(payload: EventScanPayload): log.info('receive <scan> event <%s>') qr_code = '' if payload.qrcode is None \ else payload.qrcode if payload.status == ScanStatus.Waiting: qr_terminal(qr_code) self.emit('scan', payload.status, qr_code, payload.data) await self.on_scan(payload.status, qr_code, payload.data) # emit the scan event to plugins await self._plugin_manager.emit_events( 'scan', payload.status, qr_code, payload.data) puppet.on('scan', scan_listener) elif event_name == 'reset': log.info('receive <reset> event <%s>') else: raise WechatyOperationError( f'event_name <{event_name}> unsupported!') log.info( 'initPuppetEventBridge() puppet.on(%s) (listenerCount:%s) ' 'registering...', event_name, puppet.listener_count(event_name))