comparison src/browser/plugin_xep_0085.py @ 449:981ed669d3b3

/!\ reorganize all the file hierarchy, move the code and launching script to src: - browser_side --> src/browser - public --> src/browser_side/public - libervia.py --> src/browser/libervia_main.py - libervia_server --> src/server - libervia_server/libervia.sh --> src/libervia.sh - twisted --> src/twisted - new module src/common - split constants.py in 3 files: - src/common/constants.py - src/browser/constants.py - src/server/constants.py - output --> html (generated by pyjsbuild during the installation) - new option/parameter "data_dir" (-d) to indicates the directory containing html and server_css - setup.py installs libervia to the following paths: - src/common --> <LIB>/libervia/common - src/server --> <LIB>/libervia/server - src/twisted --> <LIB>/twisted - html --> <SHARE>/libervia/html - server_side --> <SHARE>libervia/server_side - LIBERVIA_INSTALL environment variable takes 2 new options with prompt confirmation: - clean: remove previous installation directories - purge: remove building and previous installation directories You may need to update your sat.conf and/or launching script to update the following options/parameters: - ssl_certificate - data_dir
author souliane <souliane@mailoo.org>
date Tue, 20 May 2014 06:41:16 +0200
parents browser_side/plugin_xep_0085.py@20c508f9b32a
children
comparison
equal deleted inserted replaced
448:14c35f7f1ef5 449:981ed669d3b3
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)