comparison src/browser/sat_browser/plugin_xep_0085.py @ 467:97c72fe4a5f2

browser_side: import fixes: - moved browser modules in a sat_browser packages, to avoid import conflicts with std lib (e.g. logging), and let pyjsbuild work normaly - refactored bad import practices: classes are most of time not imported directly, module is imported instead.
author Goffi <goffi@goffi.org>
date Mon, 09 Jun 2014 22:15:26 +0200
parents src/browser/plugin_xep_0085.py@981ed669d3b3
children c6380dd30602
comparison
equal deleted inserted replaced
466:01880aa8ea2d 467:97c72fe4a5f2
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 # SAT plugin for Chat State Notifications Protocol (xep-0085)
5 # Copyright (C) 2013, 2014 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(None)
59
60 def __onEvent(self, timer):
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)