Commit 8f08104b authored by Philipp Hörist's avatar Philipp Hörist

Fix xsend example

Fixes #71
parent f37f2c9d
......@@ -2,18 +2,20 @@
import sys
import os
import nbxmpp
import time
import logging
try:
from gi.repository import GObject as gobject
except Exception:
import gobject
import nbxmpp
from nbxmpp.const import Realm
from nbxmpp.const import Event
from gi.repository import GLib
if sys.platform in ('win32', 'darwin'):
import certifi
consoleloghandler = logging.StreamHandler()
root_log = logging.getLogger('nbxmpp')
#root_log.setLevel('DEBUG')
root_log.addHandler(consoleloghandler)
log = logging.getLogger('nbxmpp')
log.setLevel('INFO')
log.addHandler(consoleloghandler)
if len(sys.argv) < 2:
print("Syntax: xsend JID text")
......@@ -34,42 +36,93 @@ for mandatory in ['jid', 'password']:
print('Please point ~/.xsend config file to valid JID for sending messages.')
sys.exit(0)
class Connection:
def __init__(self):
self.jid = nbxmpp.protocol.JID(jidparams['jid'])
self.password = jidparams['password']
self.sm = nbxmpp.Smacks(self) # Stream Management
self.client_cert = None
self.idle_queue = nbxmpp.idlequeue.get_idlequeue()
self.client = None
def on_auth(self, con, auth):
if not auth:
print('could not authenticate!')
sys.exit()
print('authenticated using ' + auth)
self.send_message(to_jid, text)
def _on_auth_successful(self):
print('authenticated')
self.client.bind()
def on_connected(self, con, con_type):
def _on_connection_active(self):
print('Connection active')
self.client.RegisterHandler('message', self._on_message)
self.send_presence()
def _on_auth_failed(self, reason, text):
log.debug("Couldn't authenticate")
log.error(reason, text)
exit()
def _on_message(self, con, stanza):
print('message received')
print(stanza.getBody())
def _on_connected(self, con, con_type):
print('connected with ' + con_type)
auth = self.client.auth(self.jid.getNode(), self.password, resource=self.jid.getResource(), sasl=1, on_auth=self.on_auth)
self.client.auth(self.jid.getNode(),
get_password=self._get_password,
resource=self.jid.getResource())
def get_password(self, cb, mech):
cb(self.password)
def _get_password(self, mech, password_cb):
password_cb(self.password)
def on_connection_failed(self):
def _on_connection_failed(self):
print('could not connect!')
def _event_dispatcher(self, realm, event, data):
pass
if realm == Realm.CONNECTING:
if event == Event.AUTH_SUCCESSFUL:
log.info(event)
self._on_auth_successful()
elif event == Event.AUTH_FAILED:
log.error(event)
log.error(data)
self._on_auth_failed(*data)
elif event == Event.SESSION_FAILED:
log.error(event)
elif event == Event.BIND_FAILED:
log.error(event)
elif event == Event.CONNECTION_ACTIVE:
log.info(event)
self._on_connection_active()
return
def connect(self):
idle_queue = nbxmpp.idlequeue.get_idlequeue()
self.client = nbxmpp.NonBlockingClient(self.jid.getDomain(), idle_queue, caller=self)
self.con = self.client.connect(self.on_connected, self.on_connection_failed, secure_tuple=('tls', '', '', None, None))
cacerts = ''
if sys.platform in ('win32', 'darwin'):
cacerts = certifi.where()
self.client = nbxmpp.NonBlockingClient(self.jid.getDomain(),
self.idle_queue,
caller=self)
self.client.connect(self._on_connected,
self._on_connection_failed,
secure_tuple=('tls', cacerts, '', None, None, False))
if sys.platform == 'win32':
timeout, in_seconds = 20, None
else:
timeout, in_seconds = 100, False
def send_message(self, to_jid, text):
id_ = self.client.send(nbxmpp.protocol.Message(to_jid, text, typ='chat'))
print('sent message with id ' + id_)
gobject.timeout_add(1000, self.quit)
if in_seconds:
GLib.timeout_add_seconds(timeout, self.process_connections)
else:
GLib.timeout_add(timeout, self.process_connections)
def send_presence(self):
presence = nbxmpp.Presence()
self.client.send(presence)
def quit(self):
self.disconnect()
......@@ -78,8 +131,28 @@ class Connection:
def disconnect(self):
self.client.start_disconnect()
def process_connections(self):
try:
self.idle_queue.process()
except Exception:
# Otherwise, an exception will stop our loop
if sys.platform == 'win32':
# On Windows process() calls select.select(), so we need this
# executed as often as possible.
timeout, in_seconds = 1, None
else:
timeout, in_seconds = 100, False
if in_seconds:
GLib.timeout_add_seconds(timeout, self.process_connections)
else:
GLib.timeout_add(timeout, self.process_connections)
raise
return True # renew timeout (loop for ever)
con = Connection()
con.connect()
ml = gobject.MainLoop()
ml = GLib.MainLoop()
ml.run()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment