XEP-047: Room Activity Indicators
Implement the XEP
This commit is contained in:
11
slixmpp/plugins/xep_0437/__init__.py
Normal file
11
slixmpp/plugins/xep_0437/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
"""
|
||||
Slixmpp: The Slick XMPP Library
|
||||
Copyright (C) 2020 Mathieu Pasquet
|
||||
This file is part of Slixmpp.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
from slixmpp.plugins.base import register_plugin
|
||||
from slixmpp.plugins.xep_0437.rai import XEP_0437
|
||||
|
||||
register_plugin(XEP_0437)
|
||||
67
slixmpp/plugins/xep_0437/rai.py
Normal file
67
slixmpp/plugins/xep_0437/rai.py
Normal file
@@ -0,0 +1,67 @@
|
||||
"""
|
||||
Slixmpp: The Slick XMPP Library
|
||||
Copyright (C) 2020 Mathieu Pasquet
|
||||
This file is part of Slixmpp.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
from typing import Iterable, Optional
|
||||
|
||||
from slixmpp import JID
|
||||
from slixmpp.plugins import BasePlugin
|
||||
from slixmpp.stanza import Presence
|
||||
from slixmpp.xmlstream.matcher import StanzaPath
|
||||
from slixmpp.xmlstream.handler import Callback
|
||||
|
||||
from slixmpp.plugins.xep_0437 import stanza
|
||||
|
||||
|
||||
class XEP_0437(BasePlugin):
|
||||
name = 'xep_0437'
|
||||
description = 'XEP-0437: Room Activity Indicators'
|
||||
stanza = stanza
|
||||
namespace = stanza.NS
|
||||
|
||||
def plugin_init(self):
|
||||
stanza.register_plugins()
|
||||
self.xmpp.register_handler(Callback(
|
||||
'RAI Received',
|
||||
StanzaPath("presence/rai"),
|
||||
self._handle_rai,
|
||||
))
|
||||
self.xmpp.register_handler(Callback(
|
||||
'RAI Activity Received',
|
||||
StanzaPath("presence/rai/activity"),
|
||||
self._handle_rai_activity,
|
||||
))
|
||||
|
||||
def plugin_end(self):
|
||||
self.xmpp.remove_handler('RAI received')
|
||||
self.xmpp.remove_handler('RAI Activity received')
|
||||
|
||||
def _handle_rai(self, presence: Presence):
|
||||
self.xmpp.event('room_activity_bare', presence)
|
||||
|
||||
def _handle_rai_activity(self, presence: Presence):
|
||||
self.xmpp.event('room_activity', presence)
|
||||
|
||||
def subscribe(self, service: JID, *,
|
||||
pfrom: Optional[JID] = None):
|
||||
"""
|
||||
Subscribe to room activty on a MUC service.
|
||||
:param JID service: MUC service
|
||||
"""
|
||||
pres = self.xmpp.make_presence(pto=service, pfrom=pfrom)
|
||||
pres.enable('rai')
|
||||
pres.send()
|
||||
|
||||
def unsubscribe(self, service: JID, *,
|
||||
pfrom: Optional[JID] = None):
|
||||
"""
|
||||
Unsubscribe from room activty on a MUC service.
|
||||
:param JID service: MUC service
|
||||
"""
|
||||
pres = self.xmpp.make_presence(
|
||||
pto=service, pfrom=pfrom, ptype='unavailable',
|
||||
)
|
||||
pres.send()
|
||||
47
slixmpp/plugins/xep_0437/stanza.py
Normal file
47
slixmpp/plugins/xep_0437/stanza.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""
|
||||
Slixmpp: The Slick XMPP Library
|
||||
Copyright (C) 2020 Mathieu Pasquet
|
||||
This file is part of Slixmpp.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from typing import Iterable
|
||||
from slixmpp import JID, Presence
|
||||
from slixmpp.xmlstream import (
|
||||
ElementBase,
|
||||
register_stanza_plugin,
|
||||
)
|
||||
|
||||
NS = 'urn:xmpp:rai:0'
|
||||
|
||||
class RAI(ElementBase):
|
||||
name = 'rai'
|
||||
plugin_attrib = 'rai'
|
||||
namespace = NS
|
||||
interfaces = {'activities'}
|
||||
|
||||
def get_activities(self) -> Iterable[JID]:
|
||||
return [JID(el.xml.text) for el in self if isinstance(el, Activity)]
|
||||
|
||||
def del_activities(self):
|
||||
for el in self.xml.findall('{%s}activity' % NS):
|
||||
self.xml.remove(el)
|
||||
|
||||
def set_activities(self, activities: Iterable[JID]):
|
||||
self.del_activities()
|
||||
for jid in activities:
|
||||
act = Activity()
|
||||
act.xml.text = str(jid)
|
||||
self.append(act)
|
||||
|
||||
|
||||
class Activity(ElementBase):
|
||||
name = 'activity'
|
||||
plugin_attrib = 'activity'
|
||||
namespace = NS
|
||||
|
||||
|
||||
def register_plugins():
|
||||
register_stanza_plugin(RAI, Activity, iterable=True)
|
||||
register_stanza_plugin(Presence, RAI)
|
||||
Reference in New Issue
Block a user