Coverage for slidge/core/dispatcher/disco.py: 95%
39 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 08:17 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-04 08:17 +0000
1import logging
2from typing import TYPE_CHECKING, Any, Optional
4import sqlalchemy as sa
5from slixmpp.exceptions import XMPPError
6from slixmpp.plugins.xep_0030.stanza.items import DiscoItems
7from slixmpp.types import OptJid
9from ...db.models import Room
10from .util import DispatcherMixin
12if TYPE_CHECKING:
13 from slidge.core.gateway import BaseGateway
16class DiscoMixin(DispatcherMixin):
17 __slots__: list[str] = []
19 def __init__(self, xmpp: "BaseGateway") -> None:
20 super().__init__(xmpp)
22 xmpp.plugin["xep_0030"].set_node_handler(
23 "get_info",
24 jid=None,
25 node=None,
26 handler=self.get_info,
27 )
29 xmpp.plugin["xep_0030"].set_node_handler(
30 "get_items",
31 jid=None,
32 node=None,
33 handler=self.get_items,
34 )
36 async def get_info(
37 self, jid: OptJid, node: Optional[str], ifrom: OptJid, data: Any
38 ):
39 if ifrom == self.xmpp.boundjid.bare or jid in (self.xmpp.boundjid.bare, None):
40 return self.xmpp.plugin["xep_0030"].static.get_info(jid, node, ifrom, data)
42 if ifrom is None:
43 raise XMPPError("subscription-required")
45 assert jid is not None
46 session = await self._get_session_from_jid(jid=ifrom)
48 log.debug("Looking for entity: %s", jid)
50 entity = await session.get_contact_or_group_or_participant(jid)
52 if entity is None:
53 raise XMPPError("item-not-found")
55 return await entity.get_disco_info(jid, node)
57 async def get_items(
58 self, jid: OptJid, node: Optional[str], ifrom: OptJid, data: Any
59 ):
60 if ifrom is None:
61 raise XMPPError("bad-request")
63 if jid != self.xmpp.boundjid.bare:
64 return DiscoItems()
66 assert ifrom is not None
67 session = await self._get_session_from_jid(ifrom)
69 d = DiscoItems()
70 with self.xmpp.store.session() as orm:
71 for room in orm.execute(
72 sa.select(Room)
73 .options(sa.orm.load_only(Room.jid, Room.name))
74 .filter_by(user=session.user)
75 .order_by(Room.name)
76 ).scalars():
77 d.add_item(room.jid, name=room.name)
79 return d
82log = logging.getLogger(__name__)