comparison browser_side/plugin_xep_0085.py @ 223:624a87377412

browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
author souliane <souliane@mailoo.org>
date Thu, 26 Sep 2013 11:13:40 +0200
parents
children ce5b33f499c5
comparison
equal deleted inserted replaced
222:759fd7386e1e 223:624a87377412
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 # SAT plugin for Chat State Notifications Protocol (xep-0085)
5 # Copyright (C) 2013 Adrien Cossa (souliane@mailoo.org)
6
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20 from pyjamas.Timer import Timer
21
22
23 # Copy of the map from sat/src/plugins/plugin_xep_0085
24 TRANSITIONS = {"active": {"next_state": "inactive", "delay": 120},
25 "inactive": {"next_state": "gone", "delay": 480},
26 "gone": {"next_state": "", "delay": 0},
27 "composing": {"next_state": "paused", "delay": 30},
28 "paused": {"next_state": "inactive", "delay": 450}
29 }
30
31
32 class ChatStateMachine:
33 """This is an adapted version of the ChatStateMachine from sat/src/plugins/plugin_xep_0085
34 which manage a timer on the web browser and keep it synchronized with the timer that runs
35 on the backend. This is only needed to avoid calling the bridge method chatStateComposing
36 too often ; accuracy is not needed so we can ignore the delay of the communication between
37 the web browser and the backend (the timer on the web browser always starts a bit before).
38 /!\ Keep this file up to date if you modify the one in the sat plugins directory.
39 """
40 def __init__(self, host, target_s):
41
42 self.host = host
43 self.target_s = target_s
44 self.started = False
45 self.state = None
46 self.timer = None
47
48 def _onEvent(self, state):
49 """Pyjamas callback takes no extra argument so we need this trick"""
50 # Here we should check the value of the parameter "Send chat state notifications"
51 # but this costs two messages. It's even better to call chatStateComposing
52 # with a doubt, it will be checked by the back-end anyway before sending
53 # the actual notifications to the other client.
54 if state == "composing" and not self.started:
55 return
56 self.started = True
57 self.next_state = state
58 self.__onEvent()
59
60 def __onEvent(self):
61 # print "on event %s" % self.next_state
62 state = self.next_state
63 self.next_state = ""
64 if state != self.state and state == "composing":
65 self.host.bridge.call('chatStateComposing', None, self.target_s)
66 self.state = state
67 if not self.timer is None:
68 self.timer.cancel()
69
70 if not state in TRANSITIONS:
71 return
72 if not "next_state" in TRANSITIONS[state]:
73 return
74 if not "delay" in TRANSITIONS[state]:
75 return
76 next_state = TRANSITIONS[state]["next_state"]
77 delay = TRANSITIONS[state]["delay"]
78 if next_state == "" or delay < 0:
79 return
80 self.next_state = next_state
81 # pyjamas timer in milliseconds
82 self.timer = Timer(delay * 1000, self.__onEvent)