更好的帮助系统,支持长短两种命令形式
[gaetalk.git] / chatmain.py
blob7350915ca8e74e2950eb5a0b93fc4dd4f4815505
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
10 import lilytalk
11 import config
12 import utils
14 class XMPPSub(webapp.RequestHandler):
15 '''被人加好友了~可能被触发多次'''
16 def post(self):
17 jid = self.request.get('from')
18 u = lilytalk.get_user_by_jid(jid)
19 lilytalk.try_add_user(jid)
21 class XMPPUnsub(webapp.RequestHandler):
22 def post(self):
23 jid = self.request.get('from')
24 L = utils.MemLock('delete_user')
25 L.require()
26 try:
27 u = lilytalk.get_user_by_jid(jid)
28 if u is not None:
29 if u.jid == config.root:
30 xmpp.send_message(jid, u'root 用户:离开前请确定你已做好善后工作!')
31 lilytalk.log_onoff(u, lilytalk.LEAVE)
32 lilytalk.send_to_all(u'%s 已经离开' % u.nick)
33 u.delete()
34 logging.info(u'%s 已经离开' % jid)
35 finally:
36 L.release()
38 class XMPPMsg(webapp.RequestHandler):
39 def post(self):
40 try:
41 message = xmpp.Message(self.request.POST)
42 lilytalk.handle_message(message)
43 except xmpp.InvalidMessageError:
44 logging.info('InvalidMessageError: %r' % self.request.POST)
46 class XMPPAvail(webapp.RequestHandler):
47 def post(self):
48 '''show 可以是 away、dnd(忙碌)或空(在线)'''
49 jid, resource = self.request.get('from').split('/', 1)
50 status = self.request.get('status')
51 show = self.request.get('show')
52 logging.debug(u'%s 的状态: %s (%s)' % (jid, status, show))
53 show = lilytalk.STATUS_CODE[show]
54 xmpp.send_presence(self.request.get('from'),
55 status=lilytalk.notice)
56 u = lilytalk.get_user_by_jid(jid)
57 if u is not None:
58 modified = False
59 if resource not in u.resources:
60 u.resources.append(resource)
61 modified = True
62 if u.avail != show:
63 if u.avail == lilytalk.OFFLINE:
64 u.last_online_date = datetime.datetime.now()
65 u.avail = show
66 modified = True
67 if modified:
68 lilytalk.log_onoff(u, show, resource)
69 u.put()
70 if config.warnGtalk105 and resource.startswith('Talk.v105'):
71 xmpp.send_message(jid, u'您的客户端使用明文传输数据,这样不安全,请使用Gtalk英文版或者其它客户端。')
72 else:
73 lilytalk.try_add_user(jid, show, resource)
75 class XMPPUnavail(webapp.RequestHandler):
76 def post(self):
77 jid, resource = self.request.get('from').split('/', 1)
78 status = self.request.get('status')
79 logging.info(u'%s 下线了' % jid)
80 u = lilytalk.get_user_by_jid(jid)
81 if u is not None:
82 if resource in u.resources:
83 u.resources.remove(resource)
84 if not u.resources:
85 u.avail = lilytalk.OFFLINE
86 u.last_offline_date = datetime.datetime.now()
87 u.put()
88 lilytalk.log_onoff(u, lilytalk.OFFLINE, resource)
90 class XMPPProbe(webapp.RequestHandler):
91 def post(self):
92 fulljid = self.request.get('from')
93 xmpp.send_presence(self.request.get('from'),
94 status=lilytalk.notice)
96 class XMPPDummy(webapp.RequestHandler):
97 def post(self):
98 pass
100 application = webapp.WSGIApplication(
102 ('/_ah/xmpp/subscription/subscribed/', XMPPSub),
103 ('/_ah/xmpp/subscription/unsubscribed/', XMPPUnsub),
104 ('/_ah/xmpp/message/chat/', XMPPMsg),
105 ('/_ah/xmpp/presence/available/', XMPPAvail),
106 ('/_ah/xmpp/presence/unavailable/', XMPPUnavail),
107 ('/_ah/xmpp/presence/probe/', XMPPProbe),
108 ('/_ah/xmpp/subscription/subscribe/', XMPPDummy),
109 ('/_ah/xmpp/subscription/unsubscribe/', XMPPDummy),
111 debug=True)
113 def main():
114 run_wsgi_app(application)
116 if __name__ == "__main__":
117 main()