annotate libervia/cli/output_std.py @ 4219:1b5cf2ee1d86

plugin XEP-0384, XEP-0391: download missing devices list: when a peer jid was not in our roster, devices list was not retrieved, resulting in failed en/decryption. This patch does check it and download missing devices list in necessary. There is no subscription managed yet, so the list won't be updated in case of new devices, this should be addressed at some point.
author Goffi <goffi@goffi.org>
date Tue, 05 Mar 2024 17:31:36 +0100
parents 47401850dec6
children 0d7bb4df2343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
1 #! /usr/bin/env python3
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
4075
47401850dec6 refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents: 4074
diff changeset
4 # Libervia CLI
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 """Standard outputs"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
21
4075
47401850dec6 refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents: 4074
diff changeset
22 from libervia.cli.constants import Const as C
4074
26b7ed2817da refactoring: rename `sat_frontends` to `libervia.frontends`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
23 from libervia.frontends.tools import jid
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3640
diff changeset
24 from libervia.backend.tools.common.ansi import ANSI as A
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3640
diff changeset
25 from libervia.backend.tools.common import date_utils
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 import json
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
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"]
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
29
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
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
31 class Simple(object):
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 """Default outputs"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
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
34 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
35 self.host = host
3640
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
36 host.register_output(C.OUTPUT_TEXT, C.OUTPUT_NAME_SIMPLE, self.simple_print)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
37 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_SIMPLE, self.list)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
38 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_SIMPLE, self.dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
39 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_SIMPLE, self.list_dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
40 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_SIMPLE, self.dict_dict)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
41 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_SIMPLE, self.messages)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
42 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_SIMPLE, self.simple_print)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
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
44 def simple_print(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
45 self.host.disp(str(data))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 def list(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
48 self.host.disp("\n".join(data))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
2296
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
50 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
51 options = self.host.parse_output_options()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
52 self.host.check_output_options({"no-header"}, options)
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
53 show_header = not "no-header" in options
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
54 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
55 if show_header:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
56 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
57 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
58 header = ""
2194
322948499db0 jp (output dict): added color and no-header option
Goffi <goffi@goffi.org>
parents: 2186
diff changeset
59
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
60 self.host.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 (
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
62 "{indent}{header}{value}".format(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
63 indent=indent * " ", header=header, value=v
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
66 )
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
67
2233
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
68 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
69 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
70 if idx:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
71 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
72 self.dict(datum)
bf998d8626d9 jp (output): added LIST_DICT output, to handle list of dictionaries
Goffi <goffi@goffi.org>
parents: 2194
diff changeset
73
2296
1a64fd7b648d jp (standard output): added simple, json and json_raw for OUTPUT_DICT_DICT
Goffi <goffi@goffi.org>
parents: 2233
diff changeset
74 def dict_dict(self, data):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
75 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
76 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
77 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
78
2707
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
79 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
80 # 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
81 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
82 (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
83 extra) = mess_data
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
84 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
85 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
86 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
87 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
88 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
89 else:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
90 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
91
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 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
93 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
94 else:
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 nick_color = A.BOLD + A.FG_YELLOW
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
96 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
97
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
98 self.host.disp(A.color(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
99 A.FG_CYAN, '['+time_str+'] ',
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
100 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
101 A.RESET, message))
b156b78b8f9a jp (output): new OUTPUT_MESS output to handle data containing chat messages
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
102
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
103
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 class Json(object):
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 """outputs in json format"""
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
106
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
107 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
108 self.host = host
3640
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
109 host.register_output(C.OUTPUT_TEXT, C.OUTPUT_NAME_JSON, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
110 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
111 host.register_output(C.OUTPUT_LIST, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
112 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
113 host.register_output(C.OUTPUT_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
114 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
115 host.register_output(C.OUTPUT_LIST_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
116 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
117 host.register_output(C.OUTPUT_DICT_DICT, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
118 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
119 host.register_output(C.OUTPUT_MESS, C.OUTPUT_NAME_JSON_RAW, self.dump)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
120 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_JSON, self.dump_pretty)
f4c02bdb2d91 CLI: use global constants for output names
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
121 host.register_output(C.OUTPUT_COMPLEX, C.OUTPUT_NAME_JSON_RAW, self.dump)
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
122
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 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
124 self.host.disp(json.dumps(data, default=str))
1950
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
125
227a4e617549 jp: --output option:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 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
127 self.host.disp(json.dumps(data, indent=4, default=str))