232 lines
8.7 KiB
Python
232 lines
8.7 KiB
Python
|
#!/usr/bin/python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import slixmpp
|
||
|
from slixmpp.exceptions import IqError, IqTimeout
|
||
|
#import slixmpp.plugins.xep_0060.stanza.pubsub as pubsub
|
||
|
import slixmpp.plugins.xep_0059.rsm as rsm
|
||
|
|
||
|
class XmppPubsub:
|
||
|
|
||
|
# TODO max-items might be limited (CanChat: 255), so iterate from a bigger number to a smaller.
|
||
|
# NOTE This function was copied from atomtopubsub
|
||
|
def create_node_atom(xmpp_instance, jid, node, title, subtitle, access_model):
|
||
|
jid_from = str(xmpp_instance.boundjid) if xmpp_instance.is_component else None
|
||
|
iq = xmpp_instance.Iq(stype='set',
|
||
|
sto=jid,
|
||
|
sfrom=jid_from)
|
||
|
iq['pubsub']['create']['node'] = node
|
||
|
form = iq['pubsub']['configure']['form']
|
||
|
form['type'] = 'submit'
|
||
|
form.addField('pubsub#access_model',
|
||
|
ftype='list-single',
|
||
|
value=access_model)
|
||
|
form.addField('pubsub#deliver_payloads',
|
||
|
ftype='boolean',
|
||
|
value=0)
|
||
|
form.addField('pubsub#description',
|
||
|
ftype='text-single',
|
||
|
value=subtitle)
|
||
|
form.addField('pubsub#max_items',
|
||
|
ftype='text-single',
|
||
|
value='255')
|
||
|
form.addField('pubsub#notify_retract',
|
||
|
ftype='boolean',
|
||
|
value=1)
|
||
|
form.addField('pubsub#persist_items',
|
||
|
ftype='boolean',
|
||
|
value=1)
|
||
|
form.addField('pubsub#send_last_published_item',
|
||
|
ftype='text-single',
|
||
|
value='never')
|
||
|
form.addField('pubsub#title',
|
||
|
ftype='text-single',
|
||
|
value=title)
|
||
|
form.addField('pubsub#type',
|
||
|
ftype='text-single',
|
||
|
value='http://www.w3.org/2005/Atom')
|
||
|
return iq
|
||
|
|
||
|
def create_node_config(xmpp_instance, jid):
|
||
|
jid_from = str(xmpp_instance.boundjid) if xmpp_instance.is_component else None
|
||
|
iq = xmpp_instance.Iq(stype='set',
|
||
|
sto=jid,
|
||
|
sfrom=jid_from)
|
||
|
iq['pubsub']['create']['node'] = 'xmpp:blasta:configuration:0'
|
||
|
form = iq['pubsub']['configure']['form']
|
||
|
form['type'] = 'submit'
|
||
|
form.addField('pubsub#access_model',
|
||
|
ftype='list-single',
|
||
|
value='whitelist')
|
||
|
form.addField('pubsub#deliver_payloads',
|
||
|
ftype='boolean',
|
||
|
value=0)
|
||
|
form.addField('pubsub#description',
|
||
|
ftype='text-single',
|
||
|
value='Settings of the Blasta PubSub bookmarks system')
|
||
|
form.addField('pubsub#max_items',
|
||
|
ftype='text-single',
|
||
|
value='30')
|
||
|
form.addField('pubsub#notify_retract',
|
||
|
ftype='boolean',
|
||
|
value=1)
|
||
|
form.addField('pubsub#persist_items',
|
||
|
ftype='boolean',
|
||
|
value=1)
|
||
|
form.addField('pubsub#send_last_published_item',
|
||
|
ftype='text-single',
|
||
|
value='never')
|
||
|
form.addField('pubsub#title',
|
||
|
ftype='text-single',
|
||
|
value='Blasta Settings')
|
||
|
form.addField('pubsub#type',
|
||
|
ftype='text-single',
|
||
|
value='settings')
|
||
|
return iq
|
||
|
|
||
|
async def del_node_item(xmpp_instance, pubsub, node, item_id):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].retract(
|
||
|
pubsub, node, item_id, timeout=5, notify=None)
|
||
|
result = iq
|
||
|
except IqError as e:
|
||
|
result = e.iq['error']['text']
|
||
|
print(e)
|
||
|
except IqTimeout as e:
|
||
|
result = 'Timeout'
|
||
|
print(e)
|
||
|
print(result)
|
||
|
return result
|
||
|
|
||
|
def get_iterator(xmpp_instance, pubsub, node, max_items, iterator):
|
||
|
iterator = xmpp_instance.plugin['xep_0060'].get_items(
|
||
|
pubsub, node, timeout=5, max_items=max_items, iterator=iterator)
|
||
|
return iterator
|
||
|
|
||
|
async def get_node_configuration(xmpp_instance, pubsub, node):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].get_node_config(
|
||
|
pubsub, node)
|
||
|
return iq
|
||
|
except (IqError, IqTimeout) as e:
|
||
|
print(e)
|
||
|
|
||
|
async def get_node_item(xmpp_instance, pubsub, node, item_id):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].get_item(
|
||
|
pubsub, node, item_id, timeout=5)
|
||
|
result = iq
|
||
|
except IqError as e:
|
||
|
result = e.iq['error']['text']
|
||
|
print(e)
|
||
|
except IqTimeout as e:
|
||
|
result = 'Timeout'
|
||
|
print(e)
|
||
|
return result
|
||
|
|
||
|
async def get_node_item_ids(xmpp_instance, pubsub, node):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0030'].get_items(
|
||
|
pubsub, node)
|
||
|
# Broken. See https://codeberg.org/poezio/slixmpp/issues/3548
|
||
|
#iq = await xmpp_instance.plugin['xep_0060'].get_item_ids(
|
||
|
# pubsub, node, timeout=5)
|
||
|
result = iq
|
||
|
except IqError as e:
|
||
|
if e.iq['error']['text'] == 'Node not found':
|
||
|
result = 'Node not found'
|
||
|
elif e.iq['error']['condition'] == 'item-not-found':
|
||
|
result = 'Item not found'
|
||
|
else:
|
||
|
result = None
|
||
|
print(e)
|
||
|
except IqTimeout as e:
|
||
|
result = 'Timeout'
|
||
|
print(e)
|
||
|
return result
|
||
|
|
||
|
async def get_node_item_private(xmpp_instance, node, item_id):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0223'].retrieve(
|
||
|
node, item_id, timeout=5)
|
||
|
result = iq
|
||
|
except IqError as e:
|
||
|
result = e.iq['error']['text']
|
||
|
print(e)
|
||
|
except IqTimeout as e:
|
||
|
result = 'Timeout'
|
||
|
print(e)
|
||
|
return result
|
||
|
|
||
|
async def get_node_items(xmpp_instance, pubsub, node, item_ids=None, max_items=None):
|
||
|
try:
|
||
|
if max_items:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].get_items(
|
||
|
pubsub, node, timeout=5)
|
||
|
it = xmpp_instance.plugin['xep_0060'].get_items(
|
||
|
pubsub, node, timeout=5, max_items=max_items, iterator=True)
|
||
|
q = rsm.Iq()
|
||
|
q['to'] = pubsub
|
||
|
q['disco_items']['node'] = node
|
||
|
async for item in rsm.ResultIterator(q, 'disco_items', '10'):
|
||
|
print(item['disco_items']['items'])
|
||
|
|
||
|
else:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].get_items(
|
||
|
pubsub, node, timeout=5, item_ids=item_ids)
|
||
|
result = iq
|
||
|
except IqError as e:
|
||
|
if e.iq['error']['text'] == 'Node not found':
|
||
|
result = 'Node not found'
|
||
|
elif e.iq['error']['condition'] == 'item-not-found':
|
||
|
result = 'Item not found'
|
||
|
else:
|
||
|
result = None
|
||
|
print(e)
|
||
|
except IqTimeout as e:
|
||
|
result = 'Timeout'
|
||
|
print(e)
|
||
|
return result
|
||
|
|
||
|
async def get_nodes(xmpp_instance):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].get_nodes()
|
||
|
return iq
|
||
|
except (IqError, IqTimeout) as e:
|
||
|
print(e)
|
||
|
|
||
|
async def is_node_exist(xmpp_instance, node_name):
|
||
|
iq = await XmppPubsub.get_nodes(xmpp_instance)
|
||
|
nodes = iq['disco_items']['items']
|
||
|
for node in nodes:
|
||
|
if node[1] == node_name:
|
||
|
return True
|
||
|
|
||
|
async def publish_node_item(xmpp_instance, jid, node, item_id, payload):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0060'].publish(
|
||
|
jid, node, id=item_id, payload=payload)
|
||
|
print(iq)
|
||
|
return iq
|
||
|
except (IqError, IqTimeout) as e:
|
||
|
print(e)
|
||
|
|
||
|
async def publish_node_item_private(xmpp_instance, node, item_id, stanza):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0223'].store(
|
||
|
stanza, node, item_id)
|
||
|
print(iq)
|
||
|
return iq
|
||
|
except (IqError, IqTimeout) as e:
|
||
|
print(e)
|
||
|
if e.iq['error']['text'] == 'Field does not match: access_model':
|
||
|
return 'Error: Could not set private bookmark due to Access Model mismatch'
|
||
|
|
||
|
async def set_node_private(xmpp_instance, node):
|
||
|
try:
|
||
|
iq = await xmpp_instance.plugin['xep_0223'].configure(node)
|
||
|
print(iq)
|
||
|
return iq
|
||
|
except (IqError, IqTimeout) as e:
|
||
|
print(e)
|