Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0085.py @ 823:300b4de701a6
jp: short option for progress is now -P instead of -g, so -g can be used for groups
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 17 Feb 2014 18:57:09 +0100 |
parents | 1fe00f0c9a91 |
children | 967b94ef821e |
rev | line source |
---|---|
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
3 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
4 # SAT plugin for Chat State Notifications Protocol (xep-0085) |
811 | 5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Adrien Cossa (souliane@mailoo.org) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
6 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
11 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
16 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
19 |
771 | 20 from sat.core.i18n import _ |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
21 from sat.core import exceptions |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
22 from logging import info |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
23 from wokkel import disco, iwokkel |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
24 from zope.interface import implements |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
25 from twisted.words.protocols.jabber.jid import JID |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
26 try: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
27 from twisted.words.protocols.xmlstream import XMPPHandler |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
28 except ImportError: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
29 from wokkel.subprotocols import XMPPHandler |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
30 from threading import Timer |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
659
diff
changeset
|
31 from twisted.words.xish import domish |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
32 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
33 NS_XMPP_CLIENT = "jabber:client" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
34 NS_CHAT_STATES = "http://jabber.org/protocol/chatstates" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
35 CHAT_STATES = ["active", "inactive", "gone", "composing", "paused"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
36 MESSAGE_TYPES = ["chat", "groupchat"] |
643
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
37 PARAM_KEY = "Notifications" |
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
38 PARAM_NAME = "Enable chat state notifications" |
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
39 ENTITY_KEY = PARAM_KEY + "_" + PARAM_NAME |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
40 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
41 PLUGIN_INFO = { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
42 "name": "Chat State Notifications Protocol Plugin", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
43 "import_name": "XEP-0085", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
44 "type": "XEP", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
45 "protocols": ["XEP-0085"], |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
46 "dependencies": [], |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
47 "main": "XEP_0085", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
48 "handler": "yes", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
49 "description": _("""Implementation of Chat State Notifications Protocol""") |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
50 } |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
51 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
52 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
53 # Describe the internal transitions that are triggered |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
54 # by a timer. Beside that, external transitions can be |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
55 # runned to target the states "active" or "composing". |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
56 # Delay is specified here in seconds. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
57 TRANSITIONS = { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
58 "active": {"next_state": "inactive", "delay": 120}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
59 "inactive": {"next_state": "gone", "delay": 480}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
60 "gone": {"next_state": "", "delay": 0}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
61 "composing": {"next_state": "paused", "delay": 30}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
62 "paused": {"next_state": "inactive", "delay": 450} |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
63 } |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
64 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
65 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
66 class UnknownChatStateException(Exception): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
67 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
68 This error is raised when an unknown chat state is used. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
69 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
70 pass |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
71 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
72 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
73 class XEP_0085(object): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
74 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
75 Implementation for XEP 0085 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
76 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
77 params = """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
78 <params> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
79 <individual> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
80 <category name="%(category_name)s" label="%(category_label)s"> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
81 <param name="%(param_name)s" label="%(param_label)s" value="true" type="bool" security="0"/> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
82 </category> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
83 </individual> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
84 </params> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
85 """ % { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
86 'category_name': PARAM_KEY, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
87 'category_label': _(PARAM_KEY), |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
88 'param_name': PARAM_NAME, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
89 'param_label': _('Enable chat state notifications') |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
90 } |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
91 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
92 def __init__(self, host): |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
93 info(_("Chat State Notifications plugin initialization")) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
94 self.host = host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
95 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
96 # parameter value is retrieved before each use |
662
4f747d7fde8c
core: importParams renamed to updateParams: it now updates the parameter instead of appending children if it find an existing one.
Goffi <goffi@goffi.org>
parents:
660
diff
changeset
|
97 host.memory.updateParams(self.params) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
98 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
99 # triggers from core |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
100 host.trigger.add("MessageReceived", self.messageReceivedTrigger) |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
101 host.trigger.add("sendMessage", self.sendMessageTrigger) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
102 host.trigger.add("paramUpdateTrigger", self.paramUpdateTrigger) |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
103 # TODO: handle profile disconnection (free memory in entity data) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
104 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
105 # args: to_s (jid as string), profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
106 host.bridge.addMethod("chatStateComposing", ".plugin", in_sign='ss', |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
107 out_sign='', method=self.chatStateComposing) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
108 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
109 # args: from (jid as string), state in CHAT_STATES, profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
110 host.bridge.addSignal("chatStateReceived", ".plugin", signature='sss') |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
111 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
112 def getHandler(self, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
113 return XEP_0085_handler(self, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
114 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
115 def updateEntityData(self, entity_jid, value, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
116 """ |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
117 Update the entity data of the given profile for one or all contacts. |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
118 Reset the chat state(s) display if the notification has been disabled. |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
119 @param entity_jid: contact's JID, or '@ALL@' to update all contacts. |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
120 @param value: True, False or '@NONE@' to delete the entity data |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
121 @param profile: current profile |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
122 """ |
643
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
123 self.host.memory.updateEntityData(entity_jid, ENTITY_KEY, value, profile) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
124 if not value or value == "@NONE@": |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
125 # disable chat state for this or these contact(s) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
126 self.host.bridge.chatStateReceived(unicode(entity_jid), "", profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
127 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
128 def paramUpdateTrigger(self, name, value, category, type, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
129 """ |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
130 Reset all the existing chat state entity data associated with this profile after a parameter modification. |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
131 @param name: parameter name |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
132 @param value: "true" to activate the notifications, or any other value to delete it |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
133 @param category: parameter category |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
134 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
135 if (category, name) == (PARAM_KEY, PARAM_NAME): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
136 self.updateEntityData("@ALL@", True if value == "true" else "@NONE@", profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
137 |
663 | 138 def messageReceivedTrigger(self, message, post_treat, profile): |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
139 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
140 Update the entity cache when we receive a message with body. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
141 Check for a check state in the incoming message and broadcast signal. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
142 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
143 if not self.host.memory.getParamA(PARAM_NAME, PARAM_KEY, profile_key=profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
144 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
145 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
146 try: |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
659
diff
changeset
|
147 domish.generateElementsNamed(message.elements(), name="body").next() |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
148 from_jid = JID(message.getAttribute("from")) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
149 try: |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
659
diff
changeset
|
150 domish.generateElementsNamed(message.elements(), name="active").next() |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
151 # contact enabled Chat State Notifications |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
152 self.updateEntityData(from_jid, True, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
153 # init to send following "composing" state |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
154 self.__chatStateInit(from_jid, message.getAttribute("type"), profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
155 except StopIteration: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
156 # contact didn't enable Chat State Notifications |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
157 self.updateEntityData(from_jid, False, profile) |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
158 return True |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
159 except StopIteration: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
160 pass |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
161 |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
659
diff
changeset
|
162 state_list = [child.name for child in message.elements() if |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
163 message.getAttribute("type") in MESSAGE_TYPES |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
164 and child.name in CHAT_STATES |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
165 and child.defaultUri == NS_CHAT_STATES] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
166 for state in state_list: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
167 # there must be only one state according to the XEP |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
168 self.host.bridge.chatStateReceived(message.getAttribute("from"), state, profile) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
169 break |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
170 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
171 |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
172 def sendMessageTrigger(self, mess_data, treatments, profile): |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
173 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
174 Eventually add the chat state to the message and initiate |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
175 the state machine when sending an "active" state. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
176 """ |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
177 def treatment(mess_data): |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
178 message = mess_data['xml'] |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
179 to_jid = JID(message.getAttribute("to")) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
180 if not self.__checkActivation(to_jid, forceEntityData=True, profile=profile): |
724
6edd9bda4e3f
plugin XEP-0085: fixed bad return value for sendMessage trigger's post treatment
Goffi <goffi@goffi.org>
parents:
698
diff
changeset
|
181 return mess_data |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
182 try: |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
183 # message with a body always mean active state |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
184 domish.generateElementsNamed(message.elements(), name="body").next() |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
185 message.addElement('active', NS_CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
186 # launch the chat state machine (init the timer) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
187 self.__chatStateActive(to_jid, mess_data["type"], profile) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
188 except StopIteration: |
698
d731ae066158
core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents:
697
diff
changeset
|
189 if "chat_state" in mess_data["extra"]: |
d731ae066158
core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents:
697
diff
changeset
|
190 state = mess_data["extra"].pop("chat_state") |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
191 assert(state in CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
192 message.addElement(state, NS_CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
193 return mess_data |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
194 |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
195 treatments.addCallback(treatment) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
196 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
197 |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
198 def __checkActivation(self, to_jid, forceEntityData, profile): |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
199 """ |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
200 @param to_joid: the contact's JID |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
201 @param forceEntityData: if set to True, a non-existing |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
202 entity data will be considered to be True (and initialized) |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
203 @param: current profile |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
204 @return: True if the notifications should be sent to this JID. |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
205 """ |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
206 # check if the parameter is active |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
207 if not self.host.memory.getParamA(PARAM_NAME, PARAM_KEY, profile_key=profile): |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
208 return False |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
209 # check if notifications should be sent to this contact |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
210 try: |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
211 return self.host.memory.getEntityData(to_jid, [ENTITY_KEY], profile)[ENTITY_KEY] |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
212 except (exceptions.UnknownEntityError, KeyError): |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
213 if forceEntityData: |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
214 # enable it for the first time |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
215 self.updateEntityData(to_jid, True, profile) |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
216 return True |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
217 # wait for the first message before sending states |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
218 return False |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
219 |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
220 def __chatStateInit(self, to_jid, mess_type, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
221 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
222 Data initialization for the chat state machine. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
223 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
224 # TODO: use also the resource in map key |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
225 to_jid = to_jid.userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
226 if mess_type is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
227 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
228 if not hasattr(self, "map"): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
229 self.map = {} |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
230 profile_map = self.map.setdefault(profile, {}) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
231 if not to_jid in profile_map: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
232 machine = ChatStateMachine(self.host, to_jid, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
233 mess_type, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
234 self.map[profile][to_jid] = machine |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
235 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
236 def __chatStateActive(self, to_jid, mess_type, profile_key): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
237 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
238 Launch the chat state machine on "active" state. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
239 """ |
654
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
240 # TODO: use also the JID resource in the map key |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
241 to_jid = to_jid.userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
242 profile = self.host.memory.getProfileName(profile_key) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
243 if profile is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
244 raise exceptions.ProfileUnknownError |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
245 return |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
246 self.__chatStateInit(to_jid, mess_type, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
247 self.map[profile][to_jid]._onEvent("active") |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
248 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
249 def chatStateComposing(self, to_jid_s, profile_key): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
250 """ |
654
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
251 Move to the "composing" state. Since this method is called |
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
252 from the front-end, it needs to check the values of the |
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
253 parameter "Send chat state notifications" and the entity |
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
254 data associated to the target JID. |
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
255 TODO: try to optimize this method which is called often |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
256 """ |
654
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
257 # TODO: use also the JID resource in the map key |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
258 to_jid = JID(to_jid_s).userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
259 profile = self.host.memory.getProfileName(profile_key) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
260 if profile is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
261 raise exceptions.ProfileUnknownError |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
262 return |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
263 if not self.__checkActivation(to_jid, forceEntityData=False, profile=profile): |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
264 return |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
265 try: |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
266 self.map[profile][to_jid]._onEvent("composing") |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
267 except AttributeError: |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
268 # no message has been sent/received since the notifications |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
269 # have been enabled, it's better to wait for a first one |
654
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
270 pass |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
271 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
272 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
273 class ChatStateMachine: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
274 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
275 This class represents a chat state, between one profile and |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
276 one target contact. A timer is used to move from one state |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
277 to the other. The initialization is done through the "active" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
278 state which is internally set when a message is sent. The state |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
279 "composing" can be set externally (through the bridge by a |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
280 frontend). Other states are automatically set with the timer. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
281 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
282 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
283 def __init__(self, host, to_jid, mess_type, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
284 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
285 Initialization need to store the target, message type |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
286 and a profile for sending later messages. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
287 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
288 self.host = host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
289 self.to_jid = to_jid |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
290 self.mess_type = mess_type |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
291 self.profile = profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
292 self.state = None |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
293 self.timer = None |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
294 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
295 def _onEvent(self, state): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
296 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
297 Move to the specified state, eventually send the |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
298 notification to the contact (the "active" state is |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
299 automatically sent with each message) and set the timer. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
300 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
301 if state != self.state and state != "active": |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
302 # send a new message without body |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
303 self.host.sendMessage(self.to_jid, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
304 '', |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
305 '', |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
306 self.mess_type, |
698
d731ae066158
core: sendMessage's options parameter has been renamed to extra to be consistent with newMessage
Goffi <goffi@goffi.org>
parents:
697
diff
changeset
|
307 extra={"chat_state": state}, |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
308 profile_key=self.profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
309 self.state = state |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
310 if not self.timer is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
311 self.timer.cancel() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
312 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
313 if not state in TRANSITIONS: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
314 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
315 if not "next_state" in TRANSITIONS[state]: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
316 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
317 if not "delay" in TRANSITIONS[state]: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
318 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
319 next_state = TRANSITIONS[state]["next_state"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
320 delay = TRANSITIONS[state]["delay"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
321 if next_state == "" or delay < 0: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
322 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
323 self.timer = Timer(delay, self._onEvent, [next_state]) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
324 self.timer.start() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
325 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
326 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
327 class XEP_0085_handler(XMPPHandler): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
328 implements(iwokkel.IDisco) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
329 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
330 def __init__(self, plugin_parent, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
331 self.plugin_parent = plugin_parent |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
332 self.host = plugin_parent.host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
333 self.profile = profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
334 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
335 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
336 return [disco.DiscoFeature(NS_CHAT_STATES)] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
337 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
338 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
339 return [] |