Mercurial > libervia-web
annotate src/browser/sat_browser/plugin_xep_0085.py @ 995:f88325b56a6a
server: dynamic pages first draft:
/!\ new dependency: autobahn
This patch introduce server part of dynamic pages.
Dynamic pages use websockets to establish constant connection with a Libervia page, allowing to receive real time data or update it.
The feature is activated by specifying "dynamic = true" in the page.
Once activated, page can implement "on_data" method which will be called when data are sent by the page.
To send data the other way, the page can use request.sendData.
The new "registerSignal" method allows to use an "on_signal" method to be called each time given signal is received, with automatic (and optional) filtering on profile.
New renderPartial and renderAndUpdate method allow to append new HTML elements to the dynamic page.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 03 Jan 2018 01:10:12 +0100 (2018-01-03) |
parents | f8a7a046ff9c |
children |
rev | line source |
---|---|
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
3 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
4 # SAT plugin for Chat State Notifications Protocol (xep-0085) |
818 | 5 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org) |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
6 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
11 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
16 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
19 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
20 from pyjamas.Timer import Timer |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
21 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
22 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
23 # Copy of the map from sat/src/plugins/plugin_xep_0085 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
24 TRANSITIONS = {"active": {"next_state": "inactive", "delay": 120}, |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
25 "inactive": {"next_state": "gone", "delay": 480}, |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
26 "gone": {"next_state": "", "delay": 0}, |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
27 "composing": {"next_state": "paused", "delay": 30}, |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
28 "paused": {"next_state": "inactive", "delay": 450} |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
29 } |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
30 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
31 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
32 class ChatStateMachine: |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
33 """This is an adapted version of the ChatStateMachine from sat/src/plugins/plugin_xep_0085 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
34 which manage a timer on the web browser and keep it synchronized with the timer that runs |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
35 on the backend. This is only needed to avoid calling the bridge method chatStateComposing |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
36 too often ; accuracy is not needed so we can ignore the delay of the communication between |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
37 the web browser and the backend (the timer on the web browser always starts a bit before). |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
38 /!\ Keep this file up to date if you modify the one in the sat plugins directory. |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
39 """ |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
40 def __init__(self, host, target_s): |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
41 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
42 self.host = host |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
43 self.target_s = target_s |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
44 self.started = False |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
45 self.state = None |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
46 self.timer = None |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
47 |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
48 def _onEvent(self, state): |
582
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
49 # Pyjamas callback takes no extra argument so we need this trick |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
50 |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
51 # Here we should check the value of the parameter "Send chat state notifications" |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
52 # but this costs two messages. It's even better to call chatStateComposing |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
53 # with a doubt, it will be checked by the back-end anyway before sending |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
54 # the actual notifications to the other client. |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
55 if state == "composing" and not self.started: |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
56 return |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
57 self.started = True |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
58 self.next_state = state |
422
20c508f9b32a
browser side: fixed bad use of Timer
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
59 self.__onEvent(None) |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
60 |
422
20c508f9b32a
browser side: fixed bad use of Timer
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
61 def __onEvent(self, timer): |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
62 state = self.next_state |
582
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
63 |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
64 assert(state in TRANSITIONS) |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
65 transition = TRANSITIONS[state] |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
66 assert("next_state" in transition and "delay" in transition) |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
67 |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
68 if state != self.state and state == "composing": |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
69 self.host.bridge.call('chatStateComposing', None, self.target_s) |
582
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
70 |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
71 self.state = state |
582
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
72 if self.timer is not None: |
223
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
73 self.timer.cancel() |
624a87377412
browser_side, plugin XEP-0085: limit the number of bridge methods calls for "chatStateComposing".
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
74 |
582
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
75 if transition["next_state"] and transition["delay"] > 0: |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
76 self.next_state = transition["next_state"] |
c6380dd30602
plugin XEP-0085: follow the changes in sat plugin
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
77 self.timer = Timer(transition["delay"] * 1000, self.__onEvent) # pyjamas timer is in milliseconds |