from yuxi.channel.extensions.xmpp.types import InboundXmppMessage, ResolvedXmppAccount from yuxi.channel.message.models import GroupContext, MessageType, PeerInfo, UnifiedMessage from yuxi.channel.routing.models import PeerKind def xmpp_stanza_to_unified( inbound: InboundXmppMessage, account: ResolvedXmppAccount, ) -> UnifiedMessage: is_group = inbound.msg_type == "groupchat" peer_kind = PeerKind.GROUP if is_group else PeerKind.DIRECT sender = PeerInfo( kind=peer_kind, id=inbound.from_bare, display_name=inbound.muc_nick or inbound.from_bare, ) group = None if is_group and inbound.room_jid: group = GroupContext(id=inbound.room_jid, name=inbound.room_jid) target_id = inbound.room_jid if is_group else inbound.from_bare return UnifiedMessage( msg_id=inbound.stanza_id or inbound.msg_id, channel_type="xmpp", account_id=account.account_id, content=inbound.body, sender=sender, message_type=MessageType.TEXT, group=group, timestamp=inbound.timestamp, raw_payload=inbound.raw, metadata={ "room_jid": inbound.room_jid, "muc_nick": inbound.muc_nick, "thread_id": inbound.thread_id, "was_mentioned": inbound.mentions_bot, "target_id": target_id, }, conversation_label=inbound.muc_nick if is_group else inbound.from_bare, surface="xmpp", originating_channel="xmpp", )