-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathchatmain.py
executable file
·126 lines (113 loc) · 3.94 KB
/
chatmain.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
#!/usr/bin/env python2
# vim:fileencoding=utf-8
import logging
import datetime
from google.appengine.api import xmpp
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import taskqueue
import gaetalk
import config
import utils
class XMPPSub(webapp.RequestHandler):
'''被人加好友了~可能被触发多次'''
def post(self):
jid = self.request.get('from')
gaetalk.try_add_user(jid)
class XMPPUnsub(webapp.RequestHandler):
def post(self):
# 注意:由于 gtalk 客户端的错误处理,提供了一个使用命令离开的方式
jid = self.request.get('from')
L = utils.MemLock('delete_user')
L.require()
try:
gaetalk.del_user(jid)
finally:
L.release()
class XMPPMsg(webapp.RequestHandler):
def post(self):
try:
message = xmpp.Message(self.request.POST)
gaetalk.handle_message(message)
except xmpp.InvalidMessageError:
logging.info('InvalidMessageError: %r' % self.request.POST)
class XMPPAvail(webapp.RequestHandler):
def post(self):
'''show 可以是 away、dnd(忙碌)或空(在线)'''
jid, resource = self.request.get('from').split('/', 1)
status = self.request.get('status')
show = self.request.get('show')
logging.debug(u'%s 的状态: %s (%s)' % (jid, status, show))
try:
show = gaetalk.STATUS_CODE[show]
except KeyError:
logging.error('%s has sent an incorrect show code %s' % (jid, show))
return
try:
gaetalk.send_status(self.request.get('from'))
except xmpp.Error:
logging.error('Error while sending presence to %s' % jid)
return
u = gaetalk.get_user_by_jid(jid)
if u is not None:
modified = False
if resource not in u.resources:
u.resources.append(resource)
modified = True
if u.avail != show:
if u.avail == gaetalk.OFFLINE:
u.last_online_date = datetime.datetime.now()
u.avail = show
modified = True
if modified:
gaetalk.log_onoff(u, show, resource)
u.put()
if config.warnGtalk105 and resource.startswith('Talk.v105'):
xmpp.send_message(jid, u'您的客户端使用明文传输数据,为了大家的安全,请使用Gtalk英文版或者其它使用SSL加密的客户端。')
else:
gaetalk.try_add_user(jid, show, resource)
class XMPPUnavail(webapp.RequestHandler):
def post(self):
jid, resource = self.request.get('from').split('/', 1)
logging.info(u'%s 下线了' % jid)
taskqueue.add(url='/_admin/queue', queue_name='userunavailable', params={'jid': jid, 'resource': resource})
class XMPPProbe(webapp.RequestHandler):
def post(self):
fulljid = self.request.get('from')
try:
gaetalk.send_status(fulljid)
except xmpp.Error:
logging.error('Error while sending presence to %s' % fulljid)
class XMPPDummy(webapp.RequestHandler):
def post(self):
pass
class UserUnavailable(webapp.RequestHandler):
def post(self):
jid = self.request.get('jid')
resource = self.request.get('resource')
u = gaetalk.get_user_by_jid(jid)
if u is not None:
if resource in u.resources:
u.resources.remove(resource)
if not u.resources:
u.avail = gaetalk.OFFLINE
u.last_offline_date = datetime.datetime.now()
u.put()
gaetalk.log_onoff(u, gaetalk.OFFLINE, resource)
application = webapp.WSGIApplication(
[
('/_ah/xmpp/subscription/subscribed/', XMPPSub),
('/_ah/xmpp/subscription/unsubscribed/', XMPPUnsub),
('/_ah/xmpp/message/chat/', XMPPMsg),
('/_ah/xmpp/presence/available/', XMPPAvail),
('/_ah/xmpp/presence/unavailable/', XMPPUnavail),
('/_ah/xmpp/presence/probe/', XMPPProbe),
('/_ah/xmpp/subscription/subscribe/', XMPPDummy),
('/_ah/xmpp/subscription/unsubscribe/', XMPPDummy),
('/_admin/queue', UserUnavailable),
],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()