Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0085.py @ 922:c897c8d321b3
core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 22 Mar 2014 15:34:05 +0100 |
parents | 1a759096ccbd |
children | 301b342c697a |
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 _ |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
908
diff
changeset
|
21 from sat.core.constants import Const as C |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
22 from sat.core import exceptions |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
23 from logging import info |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
24 from wokkel import disco, iwokkel |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
25 from zope.interface import implements |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
26 from twisted.words.protocols.jabber.jid import JID |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
27 try: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
28 from twisted.words.protocols.xmlstream import XMPPHandler |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
29 except ImportError: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
30 from wokkel.subprotocols import XMPPHandler |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
31 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
|
32 from twisted.words.xish import domish |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
33 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
34 NS_XMPP_CLIENT = "jabber:client" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
35 NS_CHAT_STATES = "http://jabber.org/protocol/chatstates" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
36 CHAT_STATES = ["active", "inactive", "gone", "composing", "paused"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
37 MESSAGE_TYPES = ["chat", "groupchat"] |
643
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
38 PARAM_KEY = "Notifications" |
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
39 PARAM_NAME = "Enable chat state notifications" |
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
40 ENTITY_KEY = PARAM_KEY + "_" + PARAM_NAME |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
41 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
42 PLUGIN_INFO = { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
43 "name": "Chat State Notifications Protocol Plugin", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
44 "import_name": "XEP-0085", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
45 "type": "XEP", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
46 "protocols": ["XEP-0085"], |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
47 "dependencies": [], |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
48 "main": "XEP_0085", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
49 "handler": "yes", |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
50 "description": _("""Implementation of Chat State Notifications Protocol""") |
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 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
54 # Describe the internal transitions that are triggered |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
55 # by a timer. Beside that, external transitions can be |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
56 # runned to target the states "active" or "composing". |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
57 # Delay is specified here in seconds. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
58 TRANSITIONS = { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
59 "active": {"next_state": "inactive", "delay": 120}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
60 "inactive": {"next_state": "gone", "delay": 480}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
61 "gone": {"next_state": "", "delay": 0}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
62 "composing": {"next_state": "paused", "delay": 30}, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
63 "paused": {"next_state": "inactive", "delay": 450} |
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 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
67 class UnknownChatStateException(Exception): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
68 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
69 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
|
70 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
71 pass |
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 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
74 class XEP_0085(object): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
75 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
76 Implementation for XEP 0085 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
77 """ |
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 <params> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
80 <individual> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
81 <category name="%(category_name)s" label="%(category_label)s"> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
82 <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
|
83 </category> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
84 </individual> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
85 </params> |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
86 """ % { |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
87 'category_name': PARAM_KEY, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
88 'category_label': _(PARAM_KEY), |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
89 'param_name': PARAM_NAME, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
90 'param_label': _('Enable chat state notifications') |
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 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
93 def __init__(self, host): |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
94 info(_("Chat State Notifications plugin initialization")) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
95 self.host = host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
96 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
97 # 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
|
98 host.memory.updateParams(self.params) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
99 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
100 # triggers from core |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
101 host.trigger.add("MessageReceived", self.messageReceivedTrigger) |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
102 host.trigger.add("sendMessage", self.sendMessageTrigger) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
103 host.trigger.add("paramUpdateTrigger", self.paramUpdateTrigger) |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
104 # TODO: handle profile disconnection (free memory in entity data) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
105 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
106 # args: to_s (jid as string), profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
107 host.bridge.addMethod("chatStateComposing", ".plugin", in_sign='ss', |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
108 out_sign='', method=self.chatStateComposing) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
109 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
110 # args: from (jid as string), state in CHAT_STATES, profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
111 host.bridge.addSignal("chatStateReceived", ".plugin", signature='sss') |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
112 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
113 def getHandler(self, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
114 return XEP_0085_handler(self, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
115 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
116 def updateEntityData(self, entity_jid, value, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
117 """ |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
118 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
|
119 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
|
120 @param entity_jid: contact's JID, or '@ALL@' to update all contacts. |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
908
diff
changeset
|
121 @param value: True, False or C.PROF_KEY_NONE to delete the entity data |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
122 @param profile: current profile |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
123 """ |
643
262d9d9ad27a
plugin XEP-0085: renamed category and parameter
souliane <souliane@mailoo.org>
parents:
636
diff
changeset
|
124 self.host.memory.updateEntityData(entity_jid, ENTITY_KEY, value, profile) |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
908
diff
changeset
|
125 if not value or value == C.PROF_KEY_NONE: |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
126 # disable chat state for this or these contact(s) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
127 self.host.bridge.chatStateReceived(unicode(entity_jid), "", profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
128 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
129 def paramUpdateTrigger(self, name, value, category, type, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
130 """ |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
131 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
|
132 @param name: parameter name |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
133 @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
|
134 @param category: parameter category |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
135 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
136 if (category, name) == (PARAM_KEY, PARAM_NAME): |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
908
diff
changeset
|
137 self.updateEntityData("@ALL@", True if value == "true" else C.PROF_KEY_NONE, profile) |
868
967b94ef821e
plugin XEP-0085: fixed bad trigger return value
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
138 return False |
967b94ef821e
plugin XEP-0085: fixed bad trigger return value
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
139 return True |
967b94ef821e
plugin XEP-0085: fixed bad trigger return value
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
140 |
663 | 141 def messageReceivedTrigger(self, message, post_treat, profile): |
636
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 Update the entity cache when we receive a message with body. |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
144 Check for a chat state in the message and signal frontends. |
636
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 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
|
147 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
148 |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
149 from_jid = JID(message.getAttribute("from")) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
150 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
|
151 domish.generateElementsNamed(message.elements(), name="body").next() |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
152 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
|
153 domish.generateElementsNamed(message.elements(), name="active").next() |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
154 # contact enabled Chat State Notifications |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
155 self.updateEntityData(from_jid, True, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
156 except StopIteration: |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
157 if message.getAttribute('type') == 'chat': |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
158 # contact didn't enable Chat State Notifications |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
159 self.updateEntityData(from_jid, False, profile) |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
160 return True |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
161 except StopIteration: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
162 pass |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
163 |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
164 # send our next "composing" states to any MUC and to the contacts who enabled the feature |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
165 self.__chatStateInit(from_jid, message.getAttribute("type"), profile) |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
166 |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
659
diff
changeset
|
167 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
|
168 message.getAttribute("type") in MESSAGE_TYPES |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
169 and child.name in CHAT_STATES |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
170 and child.defaultUri == NS_CHAT_STATES] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
171 for state in state_list: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
172 # there must be only one state according to the XEP |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
173 if state != 'gone' or message.getAttribute('type') != 'groupchat': |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
174 self.host.bridge.chatStateReceived(message.getAttribute("from"), state, profile) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
175 break |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
176 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
177 |
922
c897c8d321b3
core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
178 def sendMessageTrigger(self, mess_data, pre_xml_treatments, post_xml_treatments, profile): |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
179 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
180 Eventually add the chat state to the message and initiate |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
181 the state machine when sending an "active" state. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
182 """ |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
183 def treatment(mess_data): |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
184 message = mess_data['xml'] |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
185 to_jid = JID(message.getAttribute("to")) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
186 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
|
187 return mess_data |
697
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
188 try: |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
189 # 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
|
190 domish.generateElementsNamed(message.elements(), name="body").next() |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
191 message.addElement('active', NS_CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
192 # 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
|
193 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
|
194 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
|
195 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
|
196 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
|
197 assert(state in CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
198 message.addElement(state, NS_CHAT_STATES) |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
199 return mess_data |
0c84fb112d70
core: sendMessage triggers now use a treatments deferred;
Goffi <goffi@goffi.org>
parents:
663
diff
changeset
|
200 |
922
c897c8d321b3
core: sendMessageTrigger now manage pre and post treatments, which happen before or after XML generation
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
201 post_xml_treatments.addCallback(treatment) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
202 return True |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
203 |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
204 def __checkActivation(self, to_jid, forceEntityData, profile): |
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 @param to_joid: the contact's JID |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
207 @param forceEntityData: if set to True, a non-existing |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
208 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
|
209 @param: current profile |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
210 @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
|
211 """ |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
212 # check if the parameter is active |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
213 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
|
214 return False |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
215 # check if notifications should be sent to this contact |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
216 try: |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
217 type_ = self.host.memory.getEntityData(to_jid, ['type'], profile)['type'] |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
218 if type_ == 'groupchat': # always send to groupchat |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
219 return True |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
220 except (exceptions.UnknownEntityError, KeyError): |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
221 pass # private chat |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
222 try: |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
223 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
|
224 except (exceptions.UnknownEntityError, KeyError): |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
225 if forceEntityData: |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
226 # enable it for the first time |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
227 self.updateEntityData(to_jid, True, profile) |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
228 return True |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
229 # wait for the first message before sending states |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
230 return False |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
231 |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
232 def __chatStateInit(self, to_jid, mess_type, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
233 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
234 Data initialization for the chat state machine. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
235 """ |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
236 # TODO: use also the resource in map key (not for groupchat) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
237 to_jid = to_jid.userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
238 if mess_type is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
239 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
240 if not hasattr(self, "map"): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
241 self.map = {} |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
242 profile_map = self.map.setdefault(profile, {}) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
243 if not to_jid in profile_map: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
244 machine = ChatStateMachine(self.host, to_jid, |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
245 mess_type, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
246 self.map[profile][to_jid] = machine |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
247 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
248 def __chatStateActive(self, to_jid, mess_type, profile_key): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
249 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
250 Launch the chat state machine on "active" state. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
251 """ |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
252 # TODO: use also the JID resource in the map key (not for groupchat) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
253 to_jid = to_jid.userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
254 profile = self.host.memory.getProfileName(profile_key) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
255 if profile is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
256 raise exceptions.ProfileUnknownError |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
257 return |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
258 self.__chatStateInit(to_jid, mess_type, profile) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
259 self.map[profile][to_jid]._onEvent("active") |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
260 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
261 def chatStateComposing(self, to_jid_s, profile_key): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
262 """ |
654
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
263 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
|
264 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
|
265 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
|
266 data associated to the target JID. |
5c5cf5bca240
plugin XEP-0085: improvement for sending "composing" state
souliane <souliane@mailoo.org>
parents:
643
diff
changeset
|
267 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
|
268 """ |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
269 # TODO: use also the JID resource in the map key (not for groupchat) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
270 to_jid = JID(to_jid_s).userhostJID() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
271 profile = self.host.memory.getProfileName(profile_key) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
272 if profile is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
273 raise exceptions.ProfileUnknownError |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
274 return |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
275 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
|
276 return |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
277 try: |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
278 self.map[profile][to_jid]._onEvent("composing") |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
279 except (KeyError, AttributeError): |
659
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
280 # no message has been sent/received since the notifications |
b6c22d9f593a
plugin xep-0085: bug fix + improvement
souliane <souliane@mailoo.org>
parents:
654
diff
changeset
|
281 # 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
|
282 pass |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
283 |
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 class ChatStateMachine: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
286 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
287 This class represents a chat state, between one profile and |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
288 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
|
289 to the other. The initialization is done through the "active" |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
290 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
|
291 "composing" can be set externally (through the bridge by a |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
292 frontend). Other states are automatically set with the timer. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
293 """ |
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 __init__(self, host, to_jid, mess_type, profile): |
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 Initialization need to store the target, message type |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
298 and a profile for sending later messages. |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
299 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
300 self.host = host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
301 self.to_jid = to_jid |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
302 self.mess_type = mess_type |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
303 self.profile = profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
304 self.state = None |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
305 self.timer = None |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
306 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
307 def _onEvent(self, state): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
308 """ |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
309 Move to the specified state, eventually send the |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
310 notification to the contact (the "active" state is |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
311 automatically sent with each message) and set the timer. |
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 state != self.state and state != "active": |
908
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
314 if state != 'gone' or self.mess_type != 'groupchat': |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
315 # send a new message without body |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
316 self.host.sendMessage(self.to_jid, '', '', self.mess_type, |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
317 extra={"chat_state": state}, |
2ef523f0b5c3
plugin XEP-0085: bug fixes, especially for groupchat messages
souliane <souliane@mailoo.org>
parents:
868
diff
changeset
|
318 profile_key=self.profile) |
636
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
319 self.state = state |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
320 if not self.timer is None: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
321 self.timer.cancel() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
322 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
323 if not state in TRANSITIONS: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
324 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
325 if not "next_state" in TRANSITIONS[state]: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
326 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
327 if not "delay" in TRANSITIONS[state]: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
328 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
329 next_state = TRANSITIONS[state]["next_state"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
330 delay = TRANSITIONS[state]["delay"] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
331 if next_state == "" or delay < 0: |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
332 return |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
333 self.timer = Timer(delay, self._onEvent, [next_state]) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
334 self.timer.start() |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
335 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
336 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
337 class XEP_0085_handler(XMPPHandler): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
338 implements(iwokkel.IDisco) |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
339 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
340 def __init__(self, plugin_parent, profile): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
341 self.plugin_parent = plugin_parent |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
342 self.host = plugin_parent.host |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
343 self.profile = profile |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
344 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
345 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
346 return [disco.DiscoFeature(NS_CHAT_STATES)] |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
347 |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
348 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
7ea6d5a86e58
plugin XEP-0085: Chat State Notifications
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
349 return [] |