Mercurial > libervia-backend
annotate sat/plugins/plugin_exp_list_of_interest.py @ 3317:83f25da66bec
core (memory): files are now public by default except for those in root directory:
using public permissions by default makes permissions change more easy as we don't have to
recursively change all permissions of sub files when changing directory. Root directories
are private by default.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 01 Aug 2020 16:02:41 +0200 |
parents | 9a174abafdee |
children | 56ee491c0df6 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT plugin to detect language (experimental) |
3136 | 5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 from sat.core.i18n import _ |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from sat.core.constants import Const as C |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from sat.core.log import getLogger |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
23 from sat.tools.common import data_format |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from wokkel import disco, iwokkel, pubsub |
3028 | 25 from zope.interface import implementer |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from twisted.internet import defer |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
27 from twisted.words.protocols.jabber import error as jabber_error, jid |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from twisted.words.xish import domish |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 log = getLogger(__name__) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 PLUGIN_INFO = { |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 C.PI_NAME: "List of Interest", |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 C.PI_IMPORT_NAME: "LIST_INTEREST", |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 C.PI_TYPE: "EXP", |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_PROTOCOLS: [], |
3028 | 39 C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0329"], |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_RECOMMENDATIONS: [], |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_MAIN: "ListInterest", |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_HANDLER: "yes", |
3028 | 43 C.PI_DESCRIPTION: _("Experimental handling of interesting XMPP locations"), |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 } |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 NS_LIST_INTEREST = "https://salut-a-toi/protocol/list-interest:0" |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 class ListInterest(object): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 namespace = NS_LIST_INTEREST |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 def __init__(self, host): |
3028 | 53 log.info(_("List of Interest plugin initialization")) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 self.host = host |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 self._p = self.host.plugins["XEP-0060"] |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
56 host.bridge.addMethod( |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
57 "interestsList", |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
58 ".plugin", |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
59 in_sign="ssss", |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
60 out_sign="aa{ss}", |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
61 method=self._listInterests, |
3028 | 62 async_=True, |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
63 ) |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
64 host.bridge.addMethod( |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
65 "interestsRegisterFileSharing", |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
66 ".plugin", |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
67 in_sign="sssssss", |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
68 out_sign="", |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
69 method=self._registerFileSharing, |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
70 async_=True, |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
71 ) |
3303
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
72 host.bridge.addMethod( |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
73 "interestRetract", |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
74 ".plugin", |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
75 in_sign="sss", |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
76 out_sign="", |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
77 method=self._interestRetract, |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
78 async_=True, |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
79 ) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 def getHandler(self, client): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 return ListInterestHandler(self) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 @defer.inlineCallbacks |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 def createNode(self, client): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 try: |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 # TODO: check auto-create, no need to create node first if available |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 options = {self._p.OPT_ACCESS_MODEL: self._p.ACCESS_WHITELIST} |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 yield self._p.createNode( |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 client, |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 client.jid.userhostJID(), |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 nodeIdentifier=NS_LIST_INTEREST, |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 options=options, |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 ) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 except jabber_error.StanzaError as e: |
3028 | 96 if e.condition == "conflict": |
97 log.debug(_("requested node already exists")) | |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 @defer.inlineCallbacks |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 def registerPubsub(self, client, namespace, service, node, item_id=None, |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
101 creator=False, name=None, element=None, extra=None): |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 """Register an interesting element in personal list |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 @param namespace(unicode): namespace of the interest |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 this is used as a cache, to avoid the need to retrieve the item only to get |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 its namespace |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
107 @param service(jid.JID): target pubsub service |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 @param node(unicode): target pubsub node |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 @param item_id(unicode, None): target pubsub id |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 @param creator(bool): True if client's profile is the creator of the node |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 This is used a cache, to avoid the need to retrieve affiliations |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 @param name(unicode, None): name of the interest |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 @param element(domish.Element, None): element to attach |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 may be used to cache some extra data |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
115 @param extra(dict, None): extra data, key can be: |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
116 - thumb_url: http(s) URL of a thumbnail |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 """ |
2940
ef554aca3eb1
plugin list interest: initialise extra with an empty dict if not set in registerPubsub
Goffi <goffi@goffi.org>
parents:
2936
diff
changeset
|
118 if extra is None: |
ef554aca3eb1
plugin list interest: initialise extra with an empty dict if not set in registerPubsub
Goffi <goffi@goffi.org>
parents:
2936
diff
changeset
|
119 extra = {} |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 yield self.createNode(client) |
3028 | 121 interest_elt = domish.Element((NS_LIST_INTEREST, "interest")) |
122 interest_elt["namespace"] = namespace | |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 if name is not None: |
3028 | 124 interest_elt['name'] = name |
125 thumb_url = extra.get('thumb_url') | |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
126 if thumb_url: |
3028 | 127 interest_elt['thumb_url'] = thumb_url |
128 pubsub_elt = interest_elt.addElement("pubsub") | |
129 pubsub_elt["service"] = service.full() | |
130 pubsub_elt["node"] = node | |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 if item_id is not None: |
3028 | 132 pubsub_elt["item"] = item_id |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 if creator: |
3028 | 134 pubsub_elt["creator"] = C.BOOL_TRUE |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 if element is not None: |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 pubsub_elt.addChild(element) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 item_elt = pubsub.Item(payload=interest_elt) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 yield self._p.publish( |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 client, client.jid.userhostJID(), NS_LIST_INTEREST, items=[item_elt] |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 ) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
142 def _registerFileSharing( |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
143 self, service, repos_type, namespace, path, name, extra_raw, |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
144 profile |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
145 ): |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
146 client = self.host.getClient(profile) |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
147 extra = data_format.deserialise(extra_raw) |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
148 |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
149 return defer.ensureDeferred(self.registerFileSharing( |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
150 client, jid.JID(service), repos_type or None, namespace or None, path or None, |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
151 name or None, extra |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
152 )) |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
153 |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
154 |
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
155 async def registerFileSharing( |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
156 self, client, service, repos_type=None, namespace=None, path=None, name=None, |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
157 extra=None): |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
158 """Register an interesting file repository in personal list |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
159 |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
160 @param service(jid.JID): service of the file repository |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
161 @param repos_type(unicode): type of the repository |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
162 @param namespace(unicode, None): namespace of the repository |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
163 @param path(unicode, None): path of the repository |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
164 @param name(unicode, None): name of the repository |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
165 @param extra(dict, None): same as [registerPubsub] |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
166 """ |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
167 if extra is None: |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
168 extra = {} |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
169 await self.createNode(client) |
3028 | 170 interest_elt = domish.Element((NS_LIST_INTEREST, "interest")) |
171 interest_elt["namespace"] = self.host.getNamespace("fis") | |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
172 if name is not None: |
3028 | 173 interest_elt['name'] = name |
174 thumb_url = extra.get('thumb_url') | |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
175 if thumb_url: |
3028 | 176 interest_elt['thumb_url'] = thumb_url |
177 file_sharing_elt = interest_elt.addElement("file_sharing") | |
178 file_sharing_elt["service"] = service.full() | |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
179 if repos_type is not None: |
3028 | 180 file_sharing_elt["type"] = repos_type |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
181 if namespace is not None: |
3028 | 182 file_sharing_elt["namespace"] = namespace |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
183 if path is not None: |
3028 | 184 file_sharing_elt["path"] = path |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
185 item_elt = pubsub.Item(payload=interest_elt) |
3299
83795ff8a633
plugin list of interest: expose `interestsRegisterFileSharing` to bridge + use coroutines
Goffi <goffi@goffi.org>
parents:
3270
diff
changeset
|
186 await self._p.publish( |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
187 client, client.jid.userhostJID(), NS_LIST_INTEREST, items=[item_elt] |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
188 ) |
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
189 |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
190 def _listInterestsSerialise(self, interests_data): |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
191 interests = [] |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
192 for item_elt in interests_data[0]: |
3304
9a174abafdee
plugin list of interests: added `id` to data + fixed key conflict:
Goffi <goffi@goffi.org>
parents:
3303
diff
changeset
|
193 interest_data = {"id": item_elt['id']} |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
194 interest_elt = item_elt.interest |
3028 | 195 if interest_elt.hasAttribute('namespace'): |
196 interest_data['namespace'] = interest_elt.getAttribute('namespace') | |
197 if interest_elt.hasAttribute('name'): | |
198 interest_data['name'] = interest_elt.getAttribute('name') | |
199 if interest_elt.hasAttribute('thumb_url'): | |
200 interest_data['thumb_url'] = interest_elt.getAttribute('thumb_url') | |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
201 elt = interest_elt.firstChildElement() |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
202 if elt.uri != NS_LIST_INTEREST: |
3028 | 203 log.warning("unexpected child element, ignoring: {xml}".format( |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
204 xml = elt.toXml())) |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
205 continue |
3028 | 206 if elt.name == 'pubsub': |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
207 interest_data.update({ |
3028 | 208 "type": "pubsub", |
209 "service": elt['service'], | |
210 "node": elt['node'], | |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
211 }) |
3028 | 212 for attr in ('item', 'creator'): |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
213 if elt.hasAttribute(attr): |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
214 interest_data[attr] = elt[attr] |
3028 | 215 elif elt.name == 'file_sharing': |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
216 interest_data.update({ |
3028 | 217 "type": "file_sharing", |
218 "service": elt['service'], | |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
219 }) |
3028 | 220 if elt.hasAttribute('type'): |
221 interest_data['subtype'] = elt['type'] | |
3304
9a174abafdee
plugin list of interests: added `id` to data + fixed key conflict:
Goffi <goffi@goffi.org>
parents:
3303
diff
changeset
|
222 for attr in ('files_namespace', 'path'): |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
223 if elt.hasAttribute(attr): |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
224 interest_data[attr] = elt[attr] |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
225 else: |
3028 | 226 log.warning("unknown element, ignoring: {xml}".format(xml=elt.toXml())) |
2933
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
227 continue |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
228 interests.append(interest_data) |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
229 |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
230 return interests |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
231 |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
232 def _listInterests(self, service, node, namespace, profile): |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
233 service = jid.JID(service) if service else None |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
234 node = node or None |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
235 namespace = namespace or None |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
236 client = self.host.getClient(profile) |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
237 d = self.listInterests(client, service, node, namespace) |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
238 d.addCallback(self._listInterestsSerialise) |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
239 return d |
47df940738a7
plugin list of interest: added an interestsList bridge method + handle thumb_url
Goffi <goffi@goffi.org>
parents:
2913
diff
changeset
|
240 |
2913
672e6be3290f
plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents:
2912
diff
changeset
|
241 @defer.inlineCallbacks |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
242 def listInterests(self, client, service=None, node=None, namespace=None): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
243 """Retrieve list of interests |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
245 @param service(jid.JID, None): service to use |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
246 None to use own PEP |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 @param node(unicode, None): node to use |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 None to use default node |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
249 @param namespace(unicode, None): filter interests of this namespace |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 None to retrieve all interests |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
251 @return: same as [XEP_0060.getItems] |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
252 """ |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
253 # TODO: if a MAM filter were available, it would improve performances |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
254 if not node: |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 node = NS_LIST_INTEREST |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
256 items, metadata = yield self._p.getItems(client, service, node) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
257 if namespace is not None: |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
258 filtered_items = [] |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
259 for item in items: |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 try: |
3028 | 261 interest_elt = next(item.elements(NS_LIST_INTEREST, "interest")) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 except StopIteration: |
3028 | 263 log.warning(_("Missing interest element: {xml}").format( |
3270
0c3b7ee2628f
plugin list of interest: fixed wrong variable used in a log
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
264 xml=item.toXml())) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
265 continue |
3028 | 266 if interest_elt.getAttribute("namespace") == namespace: |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 filtered_items.append(item) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
268 items = filtered_items |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
269 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 defer.returnValue((items, metadata)) |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 |
3303
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
272 def _interestRetract(self, service_s, item_id, profile_key): |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
273 d = self._p._retractItem( |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
274 service_s, NS_LIST_INTEREST, item_id, True, profile_key) |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
275 d.addCallback(lambda __: None) |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
276 return d |
f17379123571
plugin list of interest: new "interestRetract" method
Goffi <goffi@goffi.org>
parents:
3299
diff
changeset
|
277 |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
278 |
3028 | 279 @implementer(iwokkel.IDisco) |
2912
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 class ListInterestHandler(XMPPHandler): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
281 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 def __init__(self, plugin_parent): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
283 self.plugin_parent = plugin_parent |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
284 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
286 return [ |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
287 disco.DiscoFeature(NS_LIST_INTEREST), |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
288 ] |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
289 |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
290 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
a3faf1c86596
plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
291 return [] |