Mercurial > libervia-backend
annotate sat_frontends/jp/output_std.py @ 3254:6cf4bd6972c2
core, frontends: avatar refactoring:
/!\ huge commit
Avatar logic has been reworked around the IDENTITY plugin: plugins able to handle avatar
or other identity related metadata (like nicknames) register to IDENTITY plugin in the
same way as for other features like download/upload. Once registered, IDENTITY plugin will
call them when suitable in order of priority, and handle caching.
Methods to manage those metadata from frontend now use serialised data.
For now `avatar` and `nicknames` are handled:
- `avatar` is now a dict with `path` + metadata like `media_type`, instead of just a string
path
- `nicknames` is now a list of nicknames in order of priority. This list is never empty,
and `nicknames[0]` should be the preferred nickname to use by frontends in most cases.
In addition to contact specified nicknames, user set nickname (the one set in roster) is
used in priority when available.
Among the side changes done with this commit, there are:
- a new `contactGet` bridge method to get roster metadata for a single contact
- SatPresenceProtocol.send returns a Deferred to check when it has actually been sent
- memory's methods to handle entities data now use `client` as first argument
- metadata filter can be specified with `getIdentity`
- `getAvatar` and `setAvatar` are now part of the IDENTITY plugin instead of XEP-0054 (and
there signature has changed)
- `isRoom` and `getBareOrFull` are now part of XEP-0045 plugin
- jp avatar/get command uses `xdg-open` first when available for `--show` flag
- `--no-cache` has been added to jp avatar/get and identity/get
- jp identity/set has been simplified, explicit options (`--nickname` only for now) are
used instead of `--field`. `--field` may come back in the future if necessary for extra
data.
- QuickContactList `SetContact` now handle None as a value, and doesn't use it to delete the
metadata anymore
- improved cache handling for `metadata` and `nicknames` in quick frontend
- new `default` argument in QuickContactList `getCache`
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 14 Apr 2020 21:00:33 +0200 |
parents | 559a625a236b |
children | be6d91572633 |
rev | line source |
---|---|
3137 | 1 #! /usr/bin/env python3 |
2 | |
1950 | 3 |
4 # jp: a SàT command line tool | |
3136 | 5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
1950 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 """Standard outputs""" | |
20 | |
21 | |
22 from sat_frontends.jp.constants import Const as C | |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
23 from sat_frontends.tools import jid |
2194
322948499db0
jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents:
2186
diff
changeset
|
24 from sat.tools.common.ansi import ANSI as A |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
25 from sat.tools.common import date_utils |
1950 | 26 import json |
27 | |
2156
8f96c242fa89
jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents:
1950
diff
changeset
|
28 __outputs__ = ["Simple", "Json"] |
3028 | 29 SIMPLE = "simple" |
30 JSON = "json" | |
31 JSON_RAW = "json_raw" | |
1950 | 32 |
33 | |
2156
8f96c242fa89
jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents:
1950
diff
changeset
|
34 class Simple(object): |
1950 | 35 """Default outputs""" |
36 | |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
37 def __init__(self, host): |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
38 self.host = host |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
39 host.register_output(C.OUTPUT_TEXT, SIMPLE, self.simple_print) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
40 host.register_output(C.OUTPUT_LIST, SIMPLE, self.list) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
41 host.register_output(C.OUTPUT_DICT, SIMPLE, self.dict) |
2233
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
42 host.register_output(C.OUTPUT_LIST_DICT, SIMPLE, self.list_dict) |
2296
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
43 host.register_output(C.OUTPUT_DICT_DICT, SIMPLE, self.dict_dict) |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
44 host.register_output(C.OUTPUT_MESS, SIMPLE, self.messages) |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
45 host.register_output(C.OUTPUT_COMPLEX, SIMPLE, self.simple_print) |
1950 | 46 |
2156
8f96c242fa89
jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents:
1950
diff
changeset
|
47 def simple_print(self, data): |
3028 | 48 self.host.disp(str(data)) |
1950 | 49 |
50 def list(self, data): | |
3028 | 51 self.host.disp("\n".join(data)) |
1950 | 52 |
2296
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
53 def dict(self, data, indent=0, header_color=C.A_HEADER): |
2194
322948499db0
jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents:
2186
diff
changeset
|
54 options = self.host.parse_output_options() |
3028 | 55 self.host.check_output_options({"no-header"}, options) |
56 show_header = not "no-header" in options | |
57 for k, v in data.items(): | |
2194
322948499db0
jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents:
2186
diff
changeset
|
58 if show_header: |
3028 | 59 header = A.color(header_color, k) + ": " |
2194
322948499db0
jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents:
2186
diff
changeset
|
60 else: |
3028 | 61 header = "" |
2194
322948499db0
jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents:
2186
diff
changeset
|
62 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
63 self.host.disp( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
64 ( |
3028 | 65 "{indent}{header}{value}".format( |
66 indent=indent * " ", header=header, value=v | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
67 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
68 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
69 ) |
2156
8f96c242fa89
jp (outputs): added OUTPUT_COMPLEX type for data which are more complex than key/value dictionaries
Goffi <goffi@goffi.org>
parents:
1950
diff
changeset
|
70 |
2233
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
71 def list_dict(self, data): |
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
72 for idx, datum in enumerate(data): |
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
73 if idx: |
3028 | 74 self.host.disp("\n") |
2233
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
75 self.dict(datum) |
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
76 |
2296
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
77 def dict_dict(self, data): |
3028 | 78 for key, sub_dict in data.items(): |
2296
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
79 self.host.disp(A.color(C.A_HEADER, key)) |
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
80 self.dict(sub_dict, indent=4, header_color=C.A_SUBHEADER) |
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
81 |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
82 def messages(self, data): |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
83 # TODO: handle lang, and non chat message (normal, headline) |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
84 for mess_data in data: |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
85 (uid, timestamp, from_jid, to_jid, message, subject, mess_type, |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
86 extra) = mess_data |
3028 | 87 time_str = date_utils.date_fmt(timestamp, "auto_day", |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
88 tz_info=date_utils.TZ_LOCAL) |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
89 from_jid = jid.JID(from_jid) |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
90 if mess_type == C.MESS_TYPE_GROUPCHAT: |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
91 nick = from_jid.resource |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
92 else: |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
93 nick = from_jid.node |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
94 |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
95 if self.host.own_jid is not None and self.host.own_jid.bare == from_jid.bare: |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
96 nick_color = A.BOLD + A.FG_BLUE |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
97 else: |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
98 nick_color = A.BOLD + A.FG_YELLOW |
3028 | 99 message = list(message.values())[0] if message else "" |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
100 |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
101 self.host.disp(A.color( |
3028 | 102 A.FG_CYAN, '['+time_str+'] ', |
103 nick_color, nick, A.RESET, A.BOLD, '> ', | |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
104 A.RESET, message)) |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
105 |
1950 | 106 |
107 class Json(object): | |
108 """outputs in json format""" | |
109 | |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
110 def __init__(self, host): |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
111 self.host = host |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
112 host.register_output(C.OUTPUT_TEXT, JSON, self.dump) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
113 host.register_output(C.OUTPUT_LIST, JSON, self.dump_pretty) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
114 host.register_output(C.OUTPUT_LIST, JSON_RAW, self.dump) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
115 host.register_output(C.OUTPUT_DICT, JSON, self.dump_pretty) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
116 host.register_output(C.OUTPUT_DICT, JSON_RAW, self.dump) |
2233
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
117 host.register_output(C.OUTPUT_LIST_DICT, JSON, self.dump_pretty) |
bf998d8626d9
jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents:
2194
diff
changeset
|
118 host.register_output(C.OUTPUT_LIST_DICT, JSON_RAW, self.dump) |
2296
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
119 host.register_output(C.OUTPUT_DICT_DICT, JSON, self.dump_pretty) |
1a64fd7b648d
jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents:
2233
diff
changeset
|
120 host.register_output(C.OUTPUT_DICT_DICT, JSON_RAW, self.dump) |
2707
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
121 host.register_output(C.OUTPUT_MESS, JSON, self.dump_pretty) |
b156b78b8f9a
jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
122 host.register_output(C.OUTPUT_MESS, JSON_RAW, self.dump) |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
123 host.register_output(C.OUTPUT_COMPLEX, JSON, self.dump_pretty) |
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
124 host.register_output(C.OUTPUT_COMPLEX, JSON_RAW, self.dump) |
1950 | 125 |
126 def dump(self, data): | |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
127 self.host.disp(json.dumps(data, default=str)) |
1950 | 128 |
129 def dump_pretty(self, data): | |
2161
62dfa6e02f54
jp (base, blog, output(std)): fixed bad unicode handling in stdout, use of jp.disp instead of simple print
Goffi <goffi@goffi.org>
parents:
2156
diff
changeset
|
130 self.host.disp(json.dumps(data, indent=4, default=str)) |