Initial commit
This commit is contained in:
commit
37df134314
6 changed files with 239 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*~
|
||||
*.pyo
|
76
cacert.pem
Normal file
76
cacert.pem
Normal file
|
@ -0,0 +1,76 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
|
||||
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
|
||||
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
|
||||
Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
|
||||
BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
|
||||
MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
|
||||
ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
|
||||
CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
|
||||
8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
|
||||
zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
|
||||
fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
|
||||
w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
|
||||
G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
|
||||
epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
|
||||
laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
|
||||
QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
|
||||
fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
|
||||
YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
|
||||
ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
|
||||
gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
|
||||
MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
|
||||
IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
|
||||
dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
|
||||
czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
|
||||
dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
|
||||
aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
|
||||
AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
|
||||
b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
|
||||
ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
|
||||
nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
|
||||
18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
|
||||
gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
|
||||
Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
|
||||
sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
|
||||
SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
|
||||
CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
|
||||
GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
|
||||
zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
|
||||
omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
|
||||
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
|
||||
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
|
||||
Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS
|
||||
BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v
|
||||
cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB
|
||||
AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9
|
||||
4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB
|
||||
Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J
|
||||
0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ
|
||||
FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx
|
||||
bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q
|
||||
SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb
|
||||
6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV
|
||||
m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g
|
||||
eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG
|
||||
kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7
|
||||
6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG
|
||||
CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc
|
||||
aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB
|
||||
gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w
|
||||
aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6
|
||||
tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0
|
||||
nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M
|
||||
77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV
|
||||
Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L
|
||||
ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM
|
||||
zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU
|
||||
rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF
|
||||
YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT
|
||||
oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu
|
||||
FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
|
||||
0m6lG5kngOcLqagA
|
||||
-----END CERTIFICATE-----
|
0
connection/__init__.py
Normal file
0
connection/__init__.py
Normal file
132
connection/xmpp.py
Normal file
132
connection/xmpp.py
Normal file
|
@ -0,0 +1,132 @@
|
|||
from pyxmpp.all import JID, Message
|
||||
from pyxmpp.streamtls import TLSSettings
|
||||
from pyxmpp.client import Client
|
||||
from pyxmpp.jabber.muc import *
|
||||
from pyxmpp.interface import implements
|
||||
from pyxmpp.interfaces import *
|
||||
|
||||
class MessageHandler:
|
||||
implements(IMessageHandlersProvider)
|
||||
|
||||
def __init__(self, client):
|
||||
self.client = client
|
||||
|
||||
def get_message_handlers(self):
|
||||
return [
|
||||
("normal", self.message),
|
||||
]
|
||||
|
||||
def message(self, stanza):
|
||||
return Message(
|
||||
to_jid=stanza.get_from(),
|
||||
from_jid=stanza.get_to(),
|
||||
stanza_type=stanza.get_type(),
|
||||
subject=stanza.get_subject(),
|
||||
body=stanza.get_body())
|
||||
|
||||
class MucHandler(MucRoomHandler):
|
||||
def message_received(self, user, stanza):
|
||||
if(user.same_as(self.room_state.me)):
|
||||
return
|
||||
|
||||
self.room_state.send_message(stanza.get_body()[::-1])
|
||||
|
||||
def user_joined(self, user, stanza):
|
||||
if(not self.room_state.joined or user.same_as(self.room_state.me)):
|
||||
return
|
||||
|
||||
self.room_state.send_message('Willkommen, ' + user.nick)
|
||||
|
||||
class PresenceHandler(object):
|
||||
implements(IPresenceHandlersProvider)
|
||||
|
||||
def __init__(self, client):
|
||||
self.client = client
|
||||
|
||||
def get_presence_handlers(self):
|
||||
return [
|
||||
(None, self.presence),
|
||||
("unavailable", self.presence),
|
||||
("subscribe", self.presence_control),
|
||||
("subscribed", self.presence_control),
|
||||
("unsubscribe", self.presence_control),
|
||||
("unsubscribed", self.presence_control),
|
||||
]
|
||||
|
||||
def presence(self,stanza):
|
||||
msg=u"%s has become " % (stanza.get_from())
|
||||
t=stanza.get_type()
|
||||
if t=="unavailable":
|
||||
msg+=u"unavailable"
|
||||
else:
|
||||
msg+=u"available"
|
||||
|
||||
show=stanza.get_show()
|
||||
if show:
|
||||
msg+=u"(%s)" % (show,)
|
||||
|
||||
status=stanza.get_status()
|
||||
if status:
|
||||
msg+=u": "+status
|
||||
print msg
|
||||
|
||||
def presence_control(self,stanza):
|
||||
msg=unicode(stanza.get_from())
|
||||
t=stanza.get_type()
|
||||
if t=="subscribe":
|
||||
msg+=u" has requested presence subscription."
|
||||
elif t=="subscribed":
|
||||
msg+=u" has accepted our presence subscription request."
|
||||
elif t=="unsubscribe":
|
||||
msg+=u" has canceled his subscription of our."
|
||||
elif t=="unsubscribed":
|
||||
msg+=u" has canceled our subscription of his presence."
|
||||
|
||||
print msg
|
||||
|
||||
return stanza.make_accept_response()
|
||||
|
||||
class VersionHandler(object):
|
||||
implements(IIqHandlersProvider, IFeaturesProvider)
|
||||
|
||||
def __init__(self, client):
|
||||
self.client = client
|
||||
|
||||
def get_features(self):
|
||||
return ["jabber:iq:version"]
|
||||
|
||||
def get_iq_get_handlers(self):
|
||||
return [
|
||||
("query", "jabber:iq:version", self.get_version),
|
||||
]
|
||||
|
||||
def get_iq_set_handlers(self):
|
||||
return []
|
||||
|
||||
def get_version(self,iq):
|
||||
iq=iq.make_result_response()
|
||||
q=iq.new_query("jabber:iq:version")
|
||||
q.newTextChild(q.ns(),"name","Curunir XMPP-Bot")
|
||||
q.newTextChild(q.ns(),"version","0.1")
|
||||
return iq
|
||||
|
||||
|
||||
class XMPPConnection(Client):
|
||||
_jid = JID('curunir@jabber.ccc.de/Orthanc')
|
||||
_password = ''
|
||||
_cert_file = 'cacert.pem'
|
||||
|
||||
def __init__(self):
|
||||
Client.__init__(self, self._jid, self._password, tls_settings = TLSSettings(require = True, cacert_file = self._cert_file))
|
||||
|
||||
self.interface_providers = [
|
||||
MessageHandler(self),
|
||||
PresenceHandler(self),
|
||||
VersionHandler(self)
|
||||
]
|
||||
|
||||
def authorized(self):
|
||||
Client.authorized(self)
|
||||
self.room_manager = MucRoomManager(self.stream)
|
||||
self.room_manager.set_handlers()
|
||||
self.room_manager.join(JID('c3hl@conference.jabber.ccc.de'), 'curunir', MucHandler(), history_maxstanzas=0)
|
8
curunir
Executable file
8
curunir
Executable file
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
APP=`basename $0`
|
||||
DIR=`dirname $0`
|
||||
|
||||
cd "$DIR"
|
||||
export PYTHONPATH="$PYTHONPATH:."
|
||||
exec /usr/bin/env python -OO "$APP.py" "$@"
|
21
curunir.py
Normal file
21
curunir.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
from connection.xmpp import XMPPConnection
|
||||
|
||||
import signal, sys
|
||||
|
||||
run = True
|
||||
|
||||
def exithandler(signum, frame):
|
||||
global run
|
||||
run = False
|
||||
|
||||
signal.signal(signal.SIGINT, exithandler)
|
||||
signal.signal(signal.SIGTERM, exithandler)
|
||||
signal.signal(signal.SIGQUIT, exithandler)
|
||||
|
||||
connection = XMPPConnection()
|
||||
connection.connect()
|
||||
|
||||
while run:
|
||||
connection.stream.loop_iter(1)
|
||||
|
||||
connection.disconnect()
|
Reference in a new issue