async def handle_event(self, evt: Event) -> None: if self.filter_matrix_event(evt): return self.log.debug("Received event: %s", evt) if evt.type == EventType.ROOM_MEMBER: evt: StateEvent if evt.content.membership == Membership.INVITE: await self.handle_invite(evt.room_id, UserID(evt.state_key), evt.sender) elif evt.type in (EventType.ROOM_MESSAGE, EventType.STICKER): evt: MessageEvent if evt.type != EventType.ROOM_MESSAGE: evt.content.msgtype = MessageType(str(evt.type)) await self.handle_message(evt.room_id, evt.sender, evt.content, evt.event_id) elif evt.type == EventType.ROOM_REDACTION: evt: RedactionEvent await self.handle_redaction(evt.room_id, evt.sender, evt.redacts) elif evt.type == EventType.PRESENCE: await self.handle_presence(evt) elif evt.type == EventType.TYPING: await self.handle_typing(evt) elif evt.type == EventType.RECEIPT: await self.handle_receipt(evt)
def __init__(self, bot: 'GitHubBot') -> None: self.bot = bot self.log = self.bot.log.getChild("webhook") self.msgtype = MessageType(bot.config["message_options.msgtype"]) or MessageType.NOTICE PendingAggregation.timeout = int(bot.config["message_options.aggregation_timeout"]) self.messages = TemplateManager(self.bot.config, "messages") self.templates = TemplateManager(self.bot.config, "templates") self.pending_aggregations = defaultdict(lambda: deque())
async def int_handle_event(self, evt: Event) -> None: if isinstance(evt, StateEvent) and evt.type == EventType.ROOM_MEMBER and self.e2ee: await self.e2ee.handle_member_event(evt) if self.filter_matrix_event(evt): return self.log.trace("Received event: %s", evt) start_time = time.time() if evt.type == EventType.ROOM_MEMBER: evt: StateEvent prev_content = evt.unsigned.prev_content or MemberStateEventContent() prev_membership = prev_content.membership if prev_content else Membership.JOIN if evt.content.membership == Membership.INVITE: await self.int_handle_invite(evt.room_id, UserID(evt.state_key), evt.sender, evt.event_id) elif evt.content.membership == Membership.LEAVE: if prev_membership == Membership.BAN: await self.handle_unban(evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id) elif prev_membership == Membership.INVITE: if evt.sender == evt.state_key: await self.handle_reject(evt.room_id, UserID(evt.state_key), evt.content.reason, evt.event_id) else: await self.handle_disinvite(evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id) elif evt.sender == evt.state_key: await self.handle_leave(evt.room_id, UserID(evt.state_key), evt.event_id) else: await self.handle_kick(evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id) elif evt.content.membership == Membership.BAN: await self.handle_ban(evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id) elif evt.content.membership == Membership.JOIN: if prev_membership != Membership.JOIN: await self.handle_join(evt.room_id, UserID(evt.state_key), evt.event_id) else: await self.handle_member_info_change(evt.room_id, UserID(evt.state_key), evt.content, prev_content, evt.event_id) elif evt.type in (EventType.ROOM_MESSAGE, EventType.STICKER): evt: MessageEvent if evt.type != EventType.ROOM_MESSAGE: evt.content.msgtype = MessageType(str(evt.type)) await self.handle_message(evt.room_id, evt.sender, evt.content, evt.event_id) elif evt.type == EventType.ROOM_ENCRYPTED and self.e2ee: await self.handle_encrypted(evt) elif evt.type == EventType.ROOM_ENCRYPTION: await self.handle_encryption(evt) else: if evt.type.is_state and isinstance(evt, StateEvent): await self.handle_state_event(evt) else: await self.handle_event(evt) await self.log_event_handle_duration(evt, time.time() - start_time)
async def handle_event(self, event: Event) -> None: self.log.debug("Handle event") domain = self.config['homeserver.domain'] namespace = self.config['appservice.namespace'] event_type: str = event.get("type", "m.unknown") room_id: Optional[RoomID] = event.get("room_id", None) event_id: Optional[EventID] = event.get("event_id", None) sender: Optional[UserID] = event.get("sender", None) content: Dict = event.get("content", {}) self.log.debug(f"Event {event}") self.log.debug(f"Event type: {event.type}") self.log.debug(f"Event room_id: {room_id}") self.log.debug(f"Event sender: {sender}") self.log.debug(f"Event content: {content}") if event.type == EventType.ROOM_MEMBER: event: StateEvent prev_content = event.unsigned.prev_content or MemberStateEventContent( ) prev_membership = prev_content.membership if prev_content else Membership.JOIN if event.content.membership == Membership.LEAVE: if event.sender == event.state_key: await self.sl.matrix_user_left(UserID(event.state_key), event.room_id, event.event_id) elif event.content.membership == Membership.JOIN: if prev_membership != Membership.JOIN: await self.sl.matrix_user_joined(UserID(event.state_key), event.room_id, event.event_id) elif event.type in (EventType.ROOM_MESSAGE, EventType.STICKER): event: MessageEvent if event.type != EventType.ROOM_MESSAGE: event.content.msgtype = MessageType(str(event.type)) await self.handle_message(event.room_id, event.sender, event.content, event.event_id)
async def int_handle_event(self, evt: Event, send_bridge_checkpoint: bool = True) -> None: if isinstance(evt, StateEvent) and evt.type == EventType.ROOM_MEMBER and self.e2ee: await self.e2ee.handle_member_event(evt) if not await self.allow_matrix_event(evt): return self.log.trace("Received event: %s", evt) if send_bridge_checkpoint: self.send_bridge_checkpoint(evt) start_time = time.time() if evt.type == EventType.ROOM_MEMBER: evt: StateEvent unsigned = evt.unsigned or StateUnsigned() prev_content = unsigned.prev_content or MemberStateEventContent() prev_membership = prev_content.membership if prev_content else Membership.JOIN if evt.content.membership == Membership.INVITE: if prev_membership == Membership.KNOCK: await self.handle_accept_knock( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) else: await self.int_handle_invite(evt) elif evt.content.membership == Membership.LEAVE: if prev_membership == Membership.BAN: await self.handle_unban( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) elif prev_membership == Membership.INVITE: if evt.sender == evt.state_key: await self.handle_reject( evt.room_id, UserID(evt.state_key), evt.content.reason, evt.event_id ) else: await self.handle_disinvite( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) elif prev_membership == Membership.KNOCK: if evt.sender == evt.state_key: await self.handle_retract_knock( evt.room_id, UserID(evt.state_key), evt.content.reason, evt.event_id ) else: await self.handle_reject_knock( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) elif evt.sender == evt.state_key: await self.handle_leave(evt.room_id, UserID(evt.state_key), evt.event_id) else: await self.handle_kick( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) elif evt.content.membership == Membership.BAN: await self.handle_ban( evt.room_id, UserID(evt.state_key), evt.sender, evt.content.reason, evt.event_id, ) elif evt.content.membership == Membership.JOIN: if prev_membership != Membership.JOIN: await self.handle_join(evt.room_id, UserID(evt.state_key), evt.event_id) else: await self.handle_member_info_change( evt.room_id, UserID(evt.state_key), evt.content, prev_content, evt.event_id ) elif evt.content.membership == Membership.KNOCK: await self.handle_knock( evt.room_id, UserID(evt.state_key), evt.content.reason, evt.event_id, ) elif evt.type in (EventType.ROOM_MESSAGE, EventType.STICKER): evt: MessageEvent if evt.type != EventType.ROOM_MESSAGE: evt.content.msgtype = MessageType(str(evt.type)) await self.handle_message(evt.room_id, evt.sender, evt.content, evt.event_id) elif evt.type == EventType.ROOM_ENCRYPTED: await self.handle_encrypted(evt) elif evt.type == EventType.ROOM_ENCRYPTION: await self.handle_encryption(evt) else: if evt.type.is_state and isinstance(evt, StateEvent): await self.handle_state_event(evt) elif evt.type.is_ephemeral and isinstance( evt, (PresenceEvent, TypingEvent, ReceiptEvent) ): await self.handle_ephemeral_event(evt) else: await self.handle_event(evt) await self.log_event_handle_duration(evt, time.time() - start_time)
def reload_config(self) -> None: self.messages.reload() self.templates.reload() self.msgtype = MessageType(self.bot.config["message_options.msgtype"]) or MessageType.NOTICE PendingAggregation.timeout = int(self.bot.config["message_options.aggregation_timeout"])