-
Notifications
You must be signed in to change notification settings - Fork 1
/
wu_protocol.py
156 lines (125 loc) · 5.12 KB
/
wu_protocol.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env python
from twisted.internet import task
from twisted.words.xish import domish
from twisted.words.protocols.jabber.jid import JID
from wokkel.xmppim import MessageProtocol, PresenceClientProtocol
from wokkel.xmppim import AvailablePresence
from wokkel.client import XMPPHandler
import wu_commands
import wu_config
import models
class WhatsupProtocol(MessageProtocol, PresenceClientProtocol):
def __init__(self):
super(WhatsupProtocol, self).__init__()
self._watching=-1
self._users=-1
def connectionInitialized(self):
MessageProtocol.connectionInitialized(self)
PresenceClientProtocol.connectionInitialized(self)
def connectionMade(self):
print "Connected!"
self.commands=wu_commands.all_commands
print "Loaded commands: ", `self.commands.keys()`
# send initial presence
self.update_presence()
def update_presence(self):
session=models.Session()
try:
watching=session.query(models.Watch).count()
users=session.query(models.User).count()
if watching != self._watching or users != self._users:
status="Watching %s URLs for %s users" % (watching, users)
self.available(None, None, {None: status})
self._watching = watching
self._users = users
finally:
session.close()
def connectionLost(self, reason):
print "Disconnected!"
def typing_notification(self, jid):
"""Send a typing notification to the given jid."""
msg = domish.Element((None, "message"))
msg["to"] = jid
msg["from"] = wu_config.SCREEN_NAME
msg.addElement(('jabber:x:event', 'x')).addElement("composing")
self.send(msg)
def send_plain(self, jid, content):
msg = domish.Element((None, "message"))
msg["to"] = jid
msg["from"] = wu_config.SCREEN_NAME
msg["type"] = 'chat'
msg.addElement("body", content=content)
self.send(msg)
def get_user(self, msg, session):
jid=JID(msg['from'])
try:
rv=models.User.by_jid(jid.userhost(), session)
except:
print "Getting user without the jid in the DB (%s)" % jid.full()
rv=models.User.update_status(jid.userhost(), None, session)
self.subscribe(jid)
return rv;
def onMessage(self, msg):
if msg["type"] == 'chat' and hasattr(msg, "body") and msg.body:
self.typing_notification(msg['from'])
a=str(msg.body).split(' ', 1)
args = None
if len(a) > 1:
args=a[1]
if self.commands.has_key(a[0].lower()):
session=models.Session()
try:
self.commands[a[0].lower()](self.get_user(msg, session),
self, args, session)
session.commit()
finally:
session.close()
else:
self.send_plain(msg['from'], 'No such command: ' + a[0])
self.update_presence()
# presence stuff
def availableReceived(self, entity, show=None, statuses=None, priority=0):
print "Available from %s (%s, %s)" % (entity.full(), show, statuses)
models.User.update_status(entity.userhost(), show)
def unavailableReceived(self, entity, statuses=None):
print "Unavailable from %s" % entity.userhost()
models.User.update_status(entity.userhost(), 'unavailable')
def subscribedReceived(self, entity):
print "Subscribe received from %s" % (entity.userhost())
welcome_message="""Welcome to whatsup.
I'll look at web pages so you don't have to. The most basic thing you can do to add a monitor is the following:
watch http://www.mywebsite.com/
But I can do more. Type "help" for more info.
"""
self.send_plain(entity.full(), welcome_message)
for a in wu_config.ADMINS:
self.send_plain(a, "New subscriber: " + entity.userhost())
def unsubscribedReceived(self, entity):
print "Unsubscribed received from %s" % (entity.userhost())
models.User.update_status(entity.userhost(), 'unsubscribed')
self.unsubscribe(entity)
self.unsubscribed(entity)
def subscribeReceived(self, entity):
print "Subscribe received from %s" % (entity.userhost())
self.subscribe(entity)
self.subscribed(entity)
self.update_presence()
def unsubscribeReceived(self, entity):
print "Unsubscribe received from %s" % (entity.userhost())
models.User.update_status(entity.userhost(), 'unsubscribed')
self.unsubscribe(entity)
self.unsubscribed(entity)
self.update_presence()
# From https://mailman.ik.nu/pipermail/twisted-jabber/2008-October/000171.html
class KeepAlive(XMPPHandler):
interval = 300
lc = None
def connectionInitialized(self):
self.lc = task.LoopingCall(self.ping)
self.lc.start(self.interval)
def connectionLost(self, *args):
if self.lc:
self.lc.stop()
def ping(self):
print "Stayin' alive"
self.send(" ")