mirror of
https://github.com/SebastianObi/LXMF-Tools.git
synced 2025-12-22 10:27:12 +00:00
Added telemetry to announce
This commit is contained in:
@@ -95,6 +95,10 @@ RNS_CONNECTION = None
|
||||
LXMF_CONNECTION = None
|
||||
MATRIX_CONNECTION = None
|
||||
|
||||
ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
@@ -1570,11 +1574,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1688,6 +1710,10 @@ auto_save_data = False
|
||||
periodic_save_data = True
|
||||
periodic_save_data_interval = 1 #Minutes
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1851,6 +1877,16 @@ matrix_to_lxmf_deleted =
|
||||
|
||||
any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -93,6 +93,50 @@ ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
MSG_FIELD_ICON = 0x04
|
||||
MSG_FIELD_FILE_ATTACHMENTS = 0x05
|
||||
MSG_FIELD_IMAGE = 0x06
|
||||
MSG_FIELD_AUDIO = 0x07
|
||||
MSG_FIELD_THREAD = 0x08
|
||||
MSG_FIELD_COMMANDS = 0x09
|
||||
MSG_FIELD_RESULTS = 0x0A
|
||||
|
||||
MSG_FIELD_ANSWER = 0xA0
|
||||
MSG_FIELD_ATTACHMENT = 0xA1
|
||||
MSG_FIELD_COMMANDS_EXECUTE = 0xA2
|
||||
MSG_FIELD_COMMANDS_RESULT = 0xA3
|
||||
MSG_FIELD_CONTACT = 0xA4
|
||||
MSG_FIELD_DATA = 0xA5
|
||||
MSG_FIELD_DELETE = 0xA6
|
||||
MSG_FIELD_EDIT = 0xA7
|
||||
MSG_FIELD_GROUP = 0xA8
|
||||
MSG_FIELD_HASH = 0xA9
|
||||
MSG_FIELD_ICON_MENU = 0xAA
|
||||
MSG_FIELD_ICON_SRC = 0xAB
|
||||
MSG_FIELD_KEYBOARD = 0xAC
|
||||
MSG_FIELD_KEYBOARD_INLINE = 0xAD
|
||||
MSG_FIELD_LOCATION = 0xAE
|
||||
MSG_FIELD_POLL = 0xAF
|
||||
MSG_FIELD_POLL_ANSWER = 0xB0
|
||||
MSG_FIELD_REACTION = 0xB1
|
||||
MSG_FIELD_RECEIPT = 0xB2
|
||||
MSG_FIELD_SCHEDULED = 0xB3
|
||||
MSG_FIELD_SILENT = 0xB4
|
||||
MSG_FIELD_SRC = 0xB5
|
||||
MSG_FIELD_STATE = 0xB6
|
||||
MSG_FIELD_STICKER = 0xB7
|
||||
MSG_FIELD_TELEMETRY_DB = 0xB8
|
||||
MSG_FIELD_TELEMETRY_PEER = 0xB9
|
||||
MSG_FIELD_TELEMETRY_COMMANDS = 0xBA
|
||||
MSG_FIELD_TEMPLATE = 0xBB
|
||||
MSG_FIELD_TOPIC = 0xBC
|
||||
MSG_FIELD_TYPE = 0xBD
|
||||
MSG_FIELD_TYPE_FIELDS = 0xBE
|
||||
MSG_FIELD_VOICE = 0xBF
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
# LXMF Class
|
||||
@@ -1315,11 +1359,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1427,6 +1489,10 @@ name =
|
||||
# This is controllable with a MQTT message.
|
||||
power = Yes
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1626,6 +1692,16 @@ mqtt_to_lxmf_length_max = 0 #0=any length
|
||||
|
||||
any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -87,6 +87,54 @@ RNS_CONNECTION = None
|
||||
LXMF_CONNECTION = None
|
||||
RIVESCRIPT_CONNECTION = None
|
||||
|
||||
ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
MSG_FIELD_ICON = 0x04
|
||||
MSG_FIELD_FILE_ATTACHMENTS = 0x05
|
||||
MSG_FIELD_IMAGE = 0x06
|
||||
MSG_FIELD_AUDIO = 0x07
|
||||
MSG_FIELD_THREAD = 0x08
|
||||
MSG_FIELD_COMMANDS = 0x09
|
||||
MSG_FIELD_RESULTS = 0x0A
|
||||
|
||||
MSG_FIELD_ANSWER = 0xA0
|
||||
MSG_FIELD_ATTACHMENT = 0xA1
|
||||
MSG_FIELD_COMMANDS_EXECUTE = 0xA2
|
||||
MSG_FIELD_COMMANDS_RESULT = 0xA3
|
||||
MSG_FIELD_CONTACT = 0xA4
|
||||
MSG_FIELD_DATA = 0xA5
|
||||
MSG_FIELD_DELETE = 0xA6
|
||||
MSG_FIELD_EDIT = 0xA7
|
||||
MSG_FIELD_GROUP = 0xA8
|
||||
MSG_FIELD_HASH = 0xA9
|
||||
MSG_FIELD_ICON_MENU = 0xAA
|
||||
MSG_FIELD_ICON_SRC = 0xAB
|
||||
MSG_FIELD_KEYBOARD = 0xAC
|
||||
MSG_FIELD_KEYBOARD_INLINE = 0xAD
|
||||
MSG_FIELD_LOCATION = 0xAE
|
||||
MSG_FIELD_POLL = 0xAF
|
||||
MSG_FIELD_POLL_ANSWER = 0xB0
|
||||
MSG_FIELD_REACTION = 0xB1
|
||||
MSG_FIELD_RECEIPT = 0xB2
|
||||
MSG_FIELD_SCHEDULED = 0xB3
|
||||
MSG_FIELD_SILENT = 0xB4
|
||||
MSG_FIELD_SRC = 0xB5
|
||||
MSG_FIELD_STATE = 0xB6
|
||||
MSG_FIELD_STICKER = 0xB7
|
||||
MSG_FIELD_TELEMETRY_DB = 0xB8
|
||||
MSG_FIELD_TELEMETRY_PEER = 0xB9
|
||||
MSG_FIELD_TELEMETRY_COMMANDS = 0xBA
|
||||
MSG_FIELD_TEMPLATE = 0xBB
|
||||
MSG_FIELD_TOPIC = 0xBC
|
||||
MSG_FIELD_TYPE = 0xBD
|
||||
MSG_FIELD_TYPE_FIELDS = 0xBE
|
||||
MSG_FIELD_VOICE = 0xBF
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
# LXMF Class
|
||||
@@ -1130,11 +1178,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1236,6 +1302,10 @@ enabled = True
|
||||
# Name of the program. Only for display in the log or program startup.
|
||||
name = Echo Test
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1353,6 +1423,16 @@ send_length_max = 0 #0=any length
|
||||
|
||||
any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -85,6 +85,54 @@ CONFIG = None
|
||||
RNS_CONNECTION = None
|
||||
LXMF_CONNECTION = None
|
||||
|
||||
ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
MSG_FIELD_ICON = 0x04
|
||||
MSG_FIELD_FILE_ATTACHMENTS = 0x05
|
||||
MSG_FIELD_IMAGE = 0x06
|
||||
MSG_FIELD_AUDIO = 0x07
|
||||
MSG_FIELD_THREAD = 0x08
|
||||
MSG_FIELD_COMMANDS = 0x09
|
||||
MSG_FIELD_RESULTS = 0x0A
|
||||
|
||||
MSG_FIELD_ANSWER = 0xA0
|
||||
MSG_FIELD_ATTACHMENT = 0xA1
|
||||
MSG_FIELD_COMMANDS_EXECUTE = 0xA2
|
||||
MSG_FIELD_COMMANDS_RESULT = 0xA3
|
||||
MSG_FIELD_CONTACT = 0xA4
|
||||
MSG_FIELD_DATA = 0xA5
|
||||
MSG_FIELD_DELETE = 0xA6
|
||||
MSG_FIELD_EDIT = 0xA7
|
||||
MSG_FIELD_GROUP = 0xA8
|
||||
MSG_FIELD_HASH = 0xA9
|
||||
MSG_FIELD_ICON_MENU = 0xAA
|
||||
MSG_FIELD_ICON_SRC = 0xAB
|
||||
MSG_FIELD_KEYBOARD = 0xAC
|
||||
MSG_FIELD_KEYBOARD_INLINE = 0xAD
|
||||
MSG_FIELD_LOCATION = 0xAE
|
||||
MSG_FIELD_POLL = 0xAF
|
||||
MSG_FIELD_POLL_ANSWER = 0xB0
|
||||
MSG_FIELD_REACTION = 0xB1
|
||||
MSG_FIELD_RECEIPT = 0xB2
|
||||
MSG_FIELD_SCHEDULED = 0xB3
|
||||
MSG_FIELD_SILENT = 0xB4
|
||||
MSG_FIELD_SRC = 0xB5
|
||||
MSG_FIELD_STATE = 0xB6
|
||||
MSG_FIELD_STICKER = 0xB7
|
||||
MSG_FIELD_TELEMETRY_DB = 0xB8
|
||||
MSG_FIELD_TELEMETRY_PEER = 0xB9
|
||||
MSG_FIELD_TELEMETRY_COMMANDS = 0xBA
|
||||
MSG_FIELD_TEMPLATE = 0xBB
|
||||
MSG_FIELD_TOPIC = 0xBC
|
||||
MSG_FIELD_TYPE = 0xBD
|
||||
MSG_FIELD_TYPE_FIELDS = 0xBE
|
||||
MSG_FIELD_VOICE = 0xBF
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
# LXMF Class
|
||||
@@ -1161,11 +1209,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1257,6 +1323,10 @@ enabled = True
|
||||
# Name of the program. Only for display in the log or program startup.
|
||||
name = CMD
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1374,6 +1444,16 @@ send_length_max = 0 #0=any length
|
||||
|
||||
#any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -2134,7 +2134,7 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = CONFIG["telemetry"].getint("state_data")
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
@@ -2251,23 +2251,13 @@ DEFAULT_CONFIG_OVERRIDE = '''# This is the user configuration file to override t
|
||||
# This file can be used to clearly summarize all settings that deviate from the default.
|
||||
# This also has the advantage that all changed settings can be kept when updating the program.
|
||||
|
||||
#### LXMF connection settings ####
|
||||
|
||||
[lxmf]
|
||||
|
||||
# The name will be visible to other peers
|
||||
# on the network, and included in announces.
|
||||
# It is also used in the group description/info.
|
||||
display_name = Distribution Group
|
||||
|
||||
# Set propagation node automatically.
|
||||
propagation_node_auto = True
|
||||
|
||||
# Try to deliver a message via the LXMF propagation network,
|
||||
# if a direct delivery to the recipient is not possible.
|
||||
try_propagation_on_fail = Yes
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
|
||||
@@ -4226,7 +4226,7 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = CONFIG["telemetry"].getint("state_data")
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
@@ -4391,16 +4391,12 @@ DEFAULT_CONFIG_OVERRIDE = '''# This is the user configuration file to override t
|
||||
# This also has the advantage that all changed settings can be kept when updating the program.
|
||||
|
||||
|
||||
#### Main program settings ####
|
||||
[main]
|
||||
|
||||
# Default language.
|
||||
lng = en # en/de
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
|
||||
# The name will be visible to other peers
|
||||
# on the network, and included in announces.
|
||||
# It is also used in the group description/info.
|
||||
@@ -4414,7 +4410,6 @@ propagation_node_auto = True
|
||||
try_propagation_on_fail = Yes
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
@@ -4424,9 +4419,7 @@ state_enabled = False
|
||||
state_data = 0
|
||||
|
||||
|
||||
#### Cluster settings ####
|
||||
[cluster]
|
||||
|
||||
# Enable/Disable this functionality.
|
||||
enabled = True
|
||||
|
||||
@@ -4443,9 +4436,7 @@ type = cluster
|
||||
display_name = County/Region/City
|
||||
|
||||
|
||||
#### Router settings ####
|
||||
[router]
|
||||
|
||||
# Enable/Disable router functionality.
|
||||
enabled = True
|
||||
|
||||
@@ -4455,9 +4446,7 @@ enabled = True
|
||||
display_name = Country,Country/Region
|
||||
|
||||
|
||||
#### High availability settings ####
|
||||
[high_availability]
|
||||
|
||||
# Enable/Disable this functionality.
|
||||
enabled = False
|
||||
|
||||
@@ -4468,9 +4457,7 @@ role = master
|
||||
peer =
|
||||
|
||||
|
||||
#### Statistic/Counter settings ####
|
||||
[statistic]
|
||||
|
||||
# Enable/Disable this functionality.
|
||||
enabled = True
|
||||
'''
|
||||
|
||||
@@ -87,6 +87,50 @@ ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
MSG_FIELD_ICON = 0x04
|
||||
MSG_FIELD_FILE_ATTACHMENTS = 0x05
|
||||
MSG_FIELD_IMAGE = 0x06
|
||||
MSG_FIELD_AUDIO = 0x07
|
||||
MSG_FIELD_THREAD = 0x08
|
||||
MSG_FIELD_COMMANDS = 0x09
|
||||
MSG_FIELD_RESULTS = 0x0A
|
||||
|
||||
MSG_FIELD_ANSWER = 0xA0
|
||||
MSG_FIELD_ATTACHMENT = 0xA1
|
||||
MSG_FIELD_COMMANDS_EXECUTE = 0xA2
|
||||
MSG_FIELD_COMMANDS_RESULT = 0xA3
|
||||
MSG_FIELD_CONTACT = 0xA4
|
||||
MSG_FIELD_DATA = 0xA5
|
||||
MSG_FIELD_DELETE = 0xA6
|
||||
MSG_FIELD_EDIT = 0xA7
|
||||
MSG_FIELD_GROUP = 0xA8
|
||||
MSG_FIELD_HASH = 0xA9
|
||||
MSG_FIELD_ICON_MENU = 0xAA
|
||||
MSG_FIELD_ICON_SRC = 0xAB
|
||||
MSG_FIELD_KEYBOARD = 0xAC
|
||||
MSG_FIELD_KEYBOARD_INLINE = 0xAD
|
||||
MSG_FIELD_LOCATION = 0xAE
|
||||
MSG_FIELD_POLL = 0xAF
|
||||
MSG_FIELD_POLL_ANSWER = 0xB0
|
||||
MSG_FIELD_REACTION = 0xB1
|
||||
MSG_FIELD_RECEIPT = 0xB2
|
||||
MSG_FIELD_SCHEDULED = 0xB3
|
||||
MSG_FIELD_SILENT = 0xB4
|
||||
MSG_FIELD_SRC = 0xB5
|
||||
MSG_FIELD_STATE = 0xB6
|
||||
MSG_FIELD_STICKER = 0xB7
|
||||
MSG_FIELD_TELEMETRY_DB = 0xB8
|
||||
MSG_FIELD_TELEMETRY_PEER = 0xB9
|
||||
MSG_FIELD_TELEMETRY_COMMANDS = 0xBA
|
||||
MSG_FIELD_TEMPLATE = 0xBB
|
||||
MSG_FIELD_TOPIC = 0xBC
|
||||
MSG_FIELD_TYPE = 0xBD
|
||||
MSG_FIELD_TYPE_FIELDS = 0xBE
|
||||
MSG_FIELD_VOICE = 0xBF
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
# LXMF Class
|
||||
@@ -1261,11 +1305,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1349,20 +1411,20 @@ DEFAULT_CONFIG_OVERRIDE = '''# This is the user configuration file to override t
|
||||
# This file can be used to clearly summarize all settings that deviate from the default.
|
||||
# This also has the advantage that all changed settings can be kept when updating the program.
|
||||
|
||||
#### LXMF connection settings ####
|
||||
|
||||
[lxmf]
|
||||
|
||||
# The name will be visible to other peers
|
||||
# on the network, and included in announces.
|
||||
# It is also used in the group description/info.
|
||||
display_name = Distribution Group
|
||||
|
||||
# Set propagation node automatically.
|
||||
propagation_node_auto = True
|
||||
|
||||
# Try to deliver a message via the LXMF propagation network,
|
||||
# if a direct delivery to the recipient is not possible.
|
||||
try_propagation_on_fail = Yes
|
||||
|
||||
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
@@ -1379,6 +1441,10 @@ enabled = True
|
||||
# Name of the program. Only for display in the log or program startup.
|
||||
name = Distribution Group
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1499,6 +1565,16 @@ timestamp = client #client/server
|
||||
# Use title/fields.
|
||||
title = Yes
|
||||
fields = Yes
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -1317,11 +1317,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1426,6 +1444,10 @@ auto_save_data = True
|
||||
periodic_save_data = True
|
||||
periodic_save_data_interval = 30 #Minutes
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1559,6 +1581,16 @@ fields_remove =
|
||||
|
||||
any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -754,9 +754,6 @@ def lxmf_message_received_callback(message):
|
||||
value["timestamp_client"] = message.timestamp
|
||||
value["timestamp_server"] = time.time()
|
||||
|
||||
if "password" in value:
|
||||
value["password"] = str(base64.b32encode(value["password"]))
|
||||
|
||||
CACHE["in"][str(uuid.uuid4())] = value
|
||||
CACHE_CHANGE = True
|
||||
except:
|
||||
@@ -1442,42 +1439,55 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
display_name = CONFIG["lxmf"]["display_name"]
|
||||
announce_data = None
|
||||
if CONFIG["features"].getboolean("announce_data"):
|
||||
section = "data"
|
||||
if CONFIG.has_section(section):
|
||||
type_fields = {}
|
||||
for (key, val) in CONFIG.items(section):
|
||||
if key == "config_lxm":
|
||||
try:
|
||||
if val != "":
|
||||
val = base64.urlsafe_b64decode(val.replace("lxm://", "").replace("/", "")+"==")
|
||||
val = msgpack.unpackb(val)
|
||||
if val and "data" in val:
|
||||
type_fields["config"] = val["data"]["data"]
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
if "=" in val or ";" in val:
|
||||
type_fields[key] = {}
|
||||
keys = val.split(";")
|
||||
for val in keys:
|
||||
val = val.split("=")
|
||||
if len(val) == 2:
|
||||
type_fields[key][val[0]] = val_to_val(val[1])
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["features"].getboolean("announce_data"):
|
||||
section = "data"
|
||||
if CONFIG.has_section(section):
|
||||
type_fields = {}
|
||||
for (key, val) in CONFIG.items(section):
|
||||
if key == "config_lxm":
|
||||
try:
|
||||
if val != "":
|
||||
val = base64.urlsafe_b64decode(val.replace("lxm://", "").replace("/", "")+"==")
|
||||
val = msgpack.unpackb(val)
|
||||
if val and "data" in val:
|
||||
type_fields["config"] = val["data"]["data"]
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
type_fields[key] = val
|
||||
if len(type_fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["lxmf"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: {MSG_FIELD_TYPE_FIELDS: type_fields}}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
if "=" in val or ";" in val:
|
||||
type_fields[key] = {}
|
||||
keys = val.split(";")
|
||||
for val in keys:
|
||||
val = val.split("=")
|
||||
if len(val) == 2:
|
||||
type_fields[key][val[0]] = val_to_val(val[1])
|
||||
else:
|
||||
type_fields[key] = val
|
||||
if len(type_fields) > 0:
|
||||
fields[MSG_FIELD_TYPE_FIELDS] = type_fields
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=display_name,
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
announce_data=announce_data,
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
@@ -1564,11 +1574,13 @@ DEFAULT_CONFIG_OVERRIDE = '''# This is the user configuration file to override t
|
||||
# This file can be used to clearly summarize all settings that deviate from the default.
|
||||
# This also has the advantage that all changed settings can be kept when updating the program.
|
||||
|
||||
|
||||
[lxmf]
|
||||
display_name = LXMF Provisioning Server
|
||||
announce_periodic = Yes
|
||||
announce_periodic_interval = 15 #Minutes
|
||||
|
||||
|
||||
[features]
|
||||
announce_data = True
|
||||
account_add = True
|
||||
@@ -1577,11 +1589,13 @@ account_del = True
|
||||
account_prove = True
|
||||
telemetry = False
|
||||
|
||||
|
||||
[processing]
|
||||
interval = 60 #Seconds
|
||||
interval_in = 10 #Seconds
|
||||
interval_out = 120 #Seconds
|
||||
|
||||
|
||||
[data]
|
||||
v_s = 0.0.0 #Version software
|
||||
u_s = #URL Software
|
||||
@@ -1589,6 +1603,15 @@ i_s = #Info Software
|
||||
cmd = #CMD
|
||||
config = #Config
|
||||
config_lxm = #Config as lxm string
|
||||
|
||||
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
@@ -1605,6 +1628,10 @@ enabled = True
|
||||
# Name of the program. Only for display in the log or program startup.
|
||||
name = LXMF Provisioning Server
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = True
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1726,6 +1753,16 @@ i_s = #Info Software
|
||||
cmd = #CMD
|
||||
config = #Config
|
||||
config_lxm = #Config as lxm string
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
@@ -92,6 +92,54 @@ LXMF_CONNECTION = None
|
||||
SESSION = {}
|
||||
TERMINAL = None
|
||||
|
||||
ANNOUNCE_DATA_CONTENT = 0x00
|
||||
ANNOUNCE_DATA_FIELDS = 0x01
|
||||
ANNOUNCE_DATA_TITLE = 0x02
|
||||
|
||||
MSG_FIELD_EMBEDDED_LXMS = 0x01
|
||||
MSG_FIELD_TELEMETRY = 0x02
|
||||
MSG_FIELD_TELEMETRY_STREAM = 0x03
|
||||
MSG_FIELD_ICON = 0x04
|
||||
MSG_FIELD_FILE_ATTACHMENTS = 0x05
|
||||
MSG_FIELD_IMAGE = 0x06
|
||||
MSG_FIELD_AUDIO = 0x07
|
||||
MSG_FIELD_THREAD = 0x08
|
||||
MSG_FIELD_COMMANDS = 0x09
|
||||
MSG_FIELD_RESULTS = 0x0A
|
||||
|
||||
MSG_FIELD_ANSWER = 0xA0
|
||||
MSG_FIELD_ATTACHMENT = 0xA1
|
||||
MSG_FIELD_COMMANDS_EXECUTE = 0xA2
|
||||
MSG_FIELD_COMMANDS_RESULT = 0xA3
|
||||
MSG_FIELD_CONTACT = 0xA4
|
||||
MSG_FIELD_DATA = 0xA5
|
||||
MSG_FIELD_DELETE = 0xA6
|
||||
MSG_FIELD_EDIT = 0xA7
|
||||
MSG_FIELD_GROUP = 0xA8
|
||||
MSG_FIELD_HASH = 0xA9
|
||||
MSG_FIELD_ICON_MENU = 0xAA
|
||||
MSG_FIELD_ICON_SRC = 0xAB
|
||||
MSG_FIELD_KEYBOARD = 0xAC
|
||||
MSG_FIELD_KEYBOARD_INLINE = 0xAD
|
||||
MSG_FIELD_LOCATION = 0xAE
|
||||
MSG_FIELD_POLL = 0xAF
|
||||
MSG_FIELD_POLL_ANSWER = 0xB0
|
||||
MSG_FIELD_REACTION = 0xB1
|
||||
MSG_FIELD_RECEIPT = 0xB2
|
||||
MSG_FIELD_SCHEDULED = 0xB3
|
||||
MSG_FIELD_SILENT = 0xB4
|
||||
MSG_FIELD_SRC = 0xB5
|
||||
MSG_FIELD_STATE = 0xB6
|
||||
MSG_FIELD_STICKER = 0xB7
|
||||
MSG_FIELD_TELEMETRY_DB = 0xB8
|
||||
MSG_FIELD_TELEMETRY_PEER = 0xB9
|
||||
MSG_FIELD_TELEMETRY_COMMANDS = 0xBA
|
||||
MSG_FIELD_TEMPLATE = 0xBB
|
||||
MSG_FIELD_TOPIC = 0xBC
|
||||
MSG_FIELD_TYPE = 0xBD
|
||||
MSG_FIELD_TYPE_FIELDS = 0xBE
|
||||
MSG_FIELD_VOICE = 0xBF
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
# Terminal Class
|
||||
@@ -1317,11 +1365,29 @@ def setup(path=None, path_rns=None, path_log=None, loglevel=None, service=False)
|
||||
if path is None:
|
||||
path = PATH
|
||||
|
||||
announce_data = CONFIG["lxmf"]["display_name"]
|
||||
if CONFIG["main"].getboolean("fields_announce"):
|
||||
fields = {}
|
||||
if CONFIG["telemetry"].getboolean("location_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_LOCATION] = [CONFIG["telemetry"].getfloat("location_lat"), CONFIG["telemetry"].getfloat("location_lon")]
|
||||
except:
|
||||
pass
|
||||
if CONFIG["telemetry"].getboolean("state_enabled"):
|
||||
try:
|
||||
fields[MSG_FIELD_STATE] = [CONFIG["telemetry"].getint("state_data"), int(time.time())]
|
||||
except:
|
||||
pass
|
||||
if len(fields) > 0:
|
||||
announce_data = {ANNOUNCE_DATA_CONTENT: CONFIG["rns_server"]["display_name"].encode("utf-8"), ANNOUNCE_DATA_TITLE: None, ANNOUNCE_DATA_FIELDS: fields}
|
||||
log("LXMF - Configured announce data: "+str(announce_data), LOG_DEBUG)
|
||||
announce_data = msgpack.packb(announce_data)
|
||||
|
||||
LXMF_CONNECTION = lxmf_connection(
|
||||
storage_path=path,
|
||||
destination_name=CONFIG["lxmf"]["destination_name"],
|
||||
destination_type=CONFIG["lxmf"]["destination_type"],
|
||||
display_name=CONFIG["lxmf"]["display_name"],
|
||||
announce_data=announce_data,
|
||||
announce_hidden=CONFIG["lxmf"].getboolean("announce_hidden"),
|
||||
send_delay=CONFIG["lxmf"]["send_delay"],
|
||||
desired_method=CONFIG["lxmf"]["desired_method"],
|
||||
@@ -1417,6 +1483,10 @@ enabled = True
|
||||
# Name of the program. Only for display in the log or program startup.
|
||||
name = Terminal
|
||||
|
||||
# Transport extended data in the announce.
|
||||
# This is needed for the integration of advanced client apps.
|
||||
fields_announce = False
|
||||
|
||||
|
||||
#### LXMF connection settings ####
|
||||
[lxmf]
|
||||
@@ -1557,6 +1627,16 @@ replace_unnecessary_characters = True
|
||||
|
||||
#any
|
||||
#2858b7a096899116cd529559cc679ffe
|
||||
|
||||
|
||||
#### Telemetry settings ####
|
||||
[telemetry]
|
||||
location_enabled = False
|
||||
location_lat = 0
|
||||
location_lon = 0
|
||||
|
||||
state_enabled = False
|
||||
state_data = 0
|
||||
'''
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user