update README
[gaetalk.git] / chatmain.py
blobb7ba6bea81c1e996bb9ac332f10f5c8e53aa2af5
1 #!/usr/bin/env python2
2 # vim:fileencoding=utf-8
4 import logging
5 import datetime
6 from google.appengine.api import xmpp
7 from google.appengine.ext import webapp
8 from google.appengine.ext.webapp.util import run_wsgi_app
9 from google.appengine.api import taskqueue
11 import gaetalk
12 import config
13 import utils
15 class XMPPSub(webapp.RequestHandler):
16 '''被人加好友了~可能被触发多次'''
17 def post(self):
18 jid = self.request.get('from')
19 gaetalk.try_add_user(jid)
21 class XMPPUnsub(webapp.RequestHandler):
22 def post(self):
23 # 注意:由于 gtalk 客户端的错误处理,提供了一个使用命令离开的方式
24 jid = self.request.get('from')
25 L = utils.MemLock('delete_user')
26 L.require()
27 try:
28 gaetalk.del_user(jid)
29 finally:
30 L.release()
32 class XMPPMsg(webapp.RequestHandler):
33 def post(self):
34 try:
35 message = xmpp.Message(self.request.POST)
36 gaetalk.handle_message(message)
37 except xmpp.InvalidMessageError:
38 logging.info('InvalidMessageError: %r' % self.request.POST)
40 class XMPPAvail(webapp.RequestHandler):
41 def post(self):
42 '''show 可以是 away、dnd(忙碌)或空(在线)'''
43 jid, resource = self.request.get('from').split('/', 1)
44 status = self.request.get('status')
45 show = self.request.get('show')
46 logging.debug(u'%s 的状态: %s (%s)' % (jid, status, show))
47 try:
48 show = gaetalk.STATUS_CODE[show]
49 except KeyError:
50 logging.error('%s has sent an incorrect show code %s' % (jid, show))
51 return
52 try:
53 gaetalk.send_status(self.request.get('from'))
54 except xmpp.Error:
55 logging.error('Error while sending presence to %s' % jid)
56 return
57 u = gaetalk.get_user_by_jid(jid)
58 if u is not None:
59 modified = False
60 if resource not in u.resources:
61 u.resources.append(resource)
62 modified = True
63 if u.avail != show:
64 if u.avail == gaetalk.OFFLINE:
65 u.last_online_date = datetime.datetime.now()
66 u.avail = show
67 modified = True
68 if modified:
69 gaetalk.log_onoff(u, show, resource)
70 u.put()
71 if config.warnGtalk105 and resource.startswith('Talk.v105'):
72 xmpp.send_message(jid, u'您的客户端使用明文传输数据,为了大家的安全,请使用Gtalk英文版或者其它使用SSL加密的客户端。')
73 else:
74 gaetalk.try_add_user(jid, show, resource)
76 class XMPPUnavail(webapp.RequestHandler):
77 def post(self):
78 jid, resource = self.request.get('from').split('/', 1)
79 logging.info(u'%s 下线了' % jid)
80 taskqueue.add(url='/_admin/queue', queue_name='userunavailable', params={'jid': jid, 'resource': resource})
82 class XMPPProbe(webapp.RequestHandler):
83 def post(self):
84 fulljid = self.request.get('from')
85 try:
86 gaetalk.send_status(fulljid)
87 except xmpp.Error:
88 logging.error('Error while sending presence to %s' % fulljid)
90 class XMPPDummy(webapp.RequestHandler):
91 def post(self):
92 pass
94 class UserUnavailable(webapp.RequestHandler):
95 def post(self):
96 jid = self.request.get('jid')
97 resource = self.request.get('resource')
98 u = gaetalk.get_user_by_jid(jid)
99 if u is not None:
100 if resource in u.resources:
101 u.resources.remove(resource)
102 if not u.resources:
103 u.avail = gaetalk.OFFLINE
104 u.last_offline_date = datetime.datetime.now()
105 u.put()
106 gaetalk.log_onoff(u, gaetalk.OFFLINE, resource)
108 application = webapp.WSGIApplication(
110 ('/_ah/xmpp/subscription/subscribed/', XMPPSub),
111 ('/_ah/xmpp/subscription/unsubscribed/', XMPPUnsub),
112 ('/_ah/xmpp/message/chat/', XMPPMsg),
113 ('/_ah/xmpp/presence/available/', XMPPAvail),
114 ('/_ah/xmpp/presence/unavailable/', XMPPUnavail),
115 ('/_ah/xmpp/presence/probe/', XMPPProbe),
116 ('/_ah/xmpp/subscription/subscribe/', XMPPDummy),
117 ('/_ah/xmpp/subscription/unsubscribe/', XMPPDummy),
118 ('/_admin/queue', UserUnavailable),
120 debug=True)
122 def main():
123 run_wsgi_app(application)
125 if __name__ == "__main__":
126 main()