From 7463bd05efbe98b8748bb551d78c0a439754745f Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:26:56 +0100 Subject: [PATCH 01/12] adjusted adif and udp logging --- freedata_gui/src/js/eventHandler.js | 32 +++++++++++++++++ freedata_server/adif_udp_logger.py | 51 ++++++++++++++------------- freedata_server/api/freedata.py | 4 +-- freedata_server/event_manager.py | 17 ++++++++- freedata_server/wavelog_api_logger.py | 23 +++++++----- 5 files changed, 91 insertions(+), 36 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index 853ab447..ee24b2ad 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -153,6 +153,38 @@ export function eventDispatcher(data) { loadAllData(); return; + case "message-logging": + if (data.endpoint === "adif") { + if (data.status === true) { + const message = ` + +
+ ${i18next.t('popups.loggingsuccess')}: + ${data.endpoint} +
+ ${i18next.t('popups.loggingsuccessmessage')} +
+
+ + `; + displayToast("success", "bi-check-circle", message, 5000); + } else { + const message = ` +
+ ${i18next.t('popups.loggingfailed')}: + ${data.endpoint} +
+ ${i18next.t('popups.loggingfailedmessage')} +
+
+ `; + displayToast("warning", "bi-exclamation-circle", message, 5000); + } + } + return; + + + case "frame-handler": switch (data.received) { case "CQ": diff --git a/freedata_server/adif_udp_logger.py b/freedata_server/adif_udp_logger.py index 835c998c..2a863834 100644 --- a/freedata_server/adif_udp_logger.py +++ b/freedata_server/adif_udp_logger.py @@ -1,42 +1,43 @@ -""" -This module provides a utility function to send ADIF-formatted QSO data over UDP. -It reads configuration settings from a provided dictionary to determine if ADIF UDP logging is enabled, -and if so, retrieves the destination host and port. Using a UDP socket, it encodes the ADIF data as UTF-8 and -sends it to the specified server. -""" - - import socket import structlog +import threading -def send_adif_qso_data(config, adif_data): +def send_adif_qso_data(config, event_manager, adif_data): """ - Sends ADIF QSO data to the specified server via UDP. + Sends ADIF QSO data to the specified server via UDP in a non-blocking manner. Parameters: - server_ip (str): IP address of the server. - server_port (int): Port of the server. + config (dict): Configuration settings. + event_manager: An event manager to log success/failure. adif_data (str): ADIF-formatted QSO data. """ - log = structlog.get_logger() - # If False then exit the function + # Check if ADIF UDP logging is enabled adif = config['QSO_LOGGING'].get('enable_adif_udp', 'False') - if not adif: - return # exit as we don't want to log ADIF UDP + return # Exit if ADIF UDP logging is disabled adif_log_host = config['QSO_LOGGING'].get('adif_udp_host', '127.0.0.1') adif_log_port = int(config['QSO_LOGGING'].get('adif_udp_port', '2237')) - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: + def send_thread(): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + # Set a timeout of 3 seconds to avoid blocking indefinitely + sock.settimeout(3) + try: + sock.sendto(adif_data.encode('utf-8'), (adif_log_host, adif_log_port)) + log.info(f"[CHAT] ADIF QSO data sent to: {adif_log_host}:{adif_log_port}") + event_manager.freedata_logging(type="udp", status=True) + except socket.timeout: + log.info(f"[CHAT] Timeout occurred sending ADIF data to {adif_log_host}:{adif_log_port}") + event_manager.freedata_logging(type="udp", status=False) + except Exception as e: + log.info(f"[CHAT] Error sending ADIF data: {e}") + event_manager.freedata_logging(type="udp", status=False) + finally: + sock.close() - # Send the ADIF data to the server - sock.sendto(adif_data.encode('utf-8'), (adif_log_host, adif_log_port)) - log.info(f"[CHAT] ADIF QSO data sent to: {adif_log_host}:{adif_log_port} {adif_data.encode('utf-8')}") - except Exception as e: - log.info(f"[CHAT] Error sending ADIF data: {e}") - finally: - sock.close() + # Run the sending function in a separate thread + thread = threading.Thread(target=send_thread, daemon=True) + thread.start() diff --git a/freedata_server/api/freedata.py b/freedata_server/api/freedata.py index 2c5c05d8..43babeab 100644 --- a/freedata_server/api/freedata.py +++ b/freedata_server/api/freedata.py @@ -86,8 +86,8 @@ async def post_freedata_message_adif_log(message_id: str, request:Request): return # Send the ADIF data via UDP - adif_udp_logger.send_adif_qso_data(request.app.config_manager.read(), adif_output) - wavelog_api_logger.send_wavelog_qso_data(request.app.config_manager.read(), adif_output) + adif_udp_logger.send_adif_qso_data(request.app.config_manager.read(), request.app.event_manager, adif_output) + wavelog_api_logger.send_wavelog_qso_data(request.app.config_manager.read(), request.app.event_manager, adif_output) return api_response(adif_output) @router.patch("/messages/{message_id}", summary="Update Message by ID", tags=["FreeDATA"], responses={ diff --git a/freedata_server/event_manager.py b/freedata_server/event_manager.py index bce15ec5..e3d782ff 100644 --- a/freedata_server/event_manager.py +++ b/freedata_server/event_manager.py @@ -238,4 +238,19 @@ class EventManager: Args: message_id (any, optional): The ID of the changed message. Defaults to None. """ - self.broadcast({"message-db": "changed", "message_id": message_id}) \ No newline at end of file + self.broadcast({"message-db": "changed", "message_id": message_id}) + + def freedata_logging(self, type, status): + """Broadcasts a FreeDATA logging event. + + This method broadcasts an event related to FreeDATA logging, + indicating the type of logging endpoint and its status. It is + used to inform other parts of the application about logging + activities. + + Args: + type (str): The type of logging endpoint (e.g., "file", "websocket"). + status (any): The status of the logging operation. + """ + + self.broadcast({"type": "message-logging", "endpoint": type, "status": status}) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index 9d83a224..6371043a 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -1,8 +1,8 @@ import requests -import re +import threading import structlog -def send_wavelog_qso_data(config, wavelog_data): +def send_wavelog_qso_data(config, event_manager, wavelog_data): """ Sends wavelog QSO data to the specified server via API call. @@ -41,9 +41,16 @@ def send_wavelog_qso_data(config, wavelog_data): "string": wavelog_data } - try: - response = requests.post(url, headers=headers, json=data) - response.raise_for_status() # Raise an error for bad status codes - log.info(f"[CHAT] Wavelog API: {wavelog_data}") - except requests.exceptions.RequestException as e: - log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") + def send_api(): + try: + response = requests.post(url, headers=headers, json=data) + response.raise_for_status() # Raise an error for bad status codes + log.info(f"[CHAT] Wavelog API: {wavelog_data}") + event_manager.freedata_logging(type="adif", status=True) + except requests.exceptions.RequestException as e: + log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") + event_manager.freedata_logging(type="adif", status=False) + + # Run the API call in a background thread to avoid blocking the main thread + thread = threading.Thread(target=send_api, daemon=True) + thread.start() \ No newline at end of file From 25fa8a828f7d9ed8294b65936345d3df8f48fed1 Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Fri, 14 Mar 2025 15:04:52 +0100 Subject: [PATCH 02/12] clean up some popup for errormessages --- freedata_gui/src/js/eventHandler.js | 2 +- freedata_server/wavelog_api_logger.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index ee24b2ad..ee5fbe9b 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -154,7 +154,7 @@ export function eventDispatcher(data) { return; case "message-logging": - if (data.endpoint === "adif") { + if (data.endpoint === "wavelog") { if (data.status === true) { const message = ` diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index 6371043a..3f2c3cb2 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -37,7 +37,7 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): data = { "key": wavelog_api_key, "station_profile_id": "1", - "type": "adif", + "type": "wavelog", "string": wavelog_data } @@ -46,10 +46,10 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): response = requests.post(url, headers=headers, json=data) response.raise_for_status() # Raise an error for bad status codes log.info(f"[CHAT] Wavelog API: {wavelog_data}") - event_manager.freedata_logging(type="adif", status=True) + event_manager.freedata_logging(type="wavelog", status=True) except requests.exceptions.RequestException as e: log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") - event_manager.freedata_logging(type="adif", status=False) + event_manager.freedata_logging(type="wavelog", status=False) # Run the API call in a background thread to avoid blocking the main thread thread = threading.Thread(target=send_api, daemon=True) From 9cfedb4627afad8e70fade8efa1aec495f08e66d Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Fri, 14 Mar 2025 18:24:41 +0100 Subject: [PATCH 03/12] added better text for the popup error message --- freedata_gui/src/js/eventHandler.js | 34 +++++++++++++-------------- freedata_server/event_manager.py | 4 ++-- freedata_server/wavelog_api_logger.py | 17 ++++++++++++-- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index ee5fbe9b..a1c876d0 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -156,28 +156,26 @@ export function eventDispatcher(data) { case "message-logging": if (data.endpoint === "wavelog") { if (data.status === true) { - const message = ` - -
- ${i18next.t('popups.loggingsuccess')}: - ${data.endpoint} -
- ${i18next.t('popups.loggingsuccessmessage')} -
-
- + const message = ` +
+ ${i18next.t('popups.loggingsuccess')}: + ${data.endpoint} +
+ ${i18next.t('popups.loggingsuccessmessage')} +
+
`; displayToast("success", "bi-check-circle", message, 5000); } else { - const message = ` + const message = `
- ${i18next.t('popups.loggingfailed')}: - ${data.endpoint} -
- ${i18next.t('popups.loggingfailedmessage')} -
-
- `; + ${i18next.t('Wavelog post failed')}: + ${data.message} +
+ ${i18next.t('Wavelog post failed')} +
+ + `; displayToast("warning", "bi-exclamation-circle", message, 5000); } } diff --git a/freedata_server/event_manager.py b/freedata_server/event_manager.py index e3d782ff..5d7c55f6 100644 --- a/freedata_server/event_manager.py +++ b/freedata_server/event_manager.py @@ -240,7 +240,7 @@ class EventManager: """ self.broadcast({"message-db": "changed", "message_id": message_id}) - def freedata_logging(self, type, status): + def freedata_logging(self, type, status, message): """Broadcasts a FreeDATA logging event. This method broadcasts an event related to FreeDATA logging, @@ -253,4 +253,4 @@ class EventManager: status (any): The status of the logging operation. """ - self.broadcast({"type": "message-logging", "endpoint": type, "status": status}) + self.broadcast({"type": "message-logging", "endpoint": type, "status": status, "message": message}) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index 3f2c3cb2..0a1e7894 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -2,6 +2,7 @@ import requests import threading import structlog + def send_wavelog_qso_data(config, event_manager, wavelog_data): """ Sends wavelog QSO data to the specified server via API call. @@ -41,15 +42,27 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): "string": wavelog_data } + def extract_between(text, start_marker, end_marker): + start = text.find(start_marker) + if start == -1: + return None # Marker not found + start += len(start_marker) # Move past the start marker + end = text.find(end_marker, start) + if end == -1: + return text[start:] # If end marker not found, take rest of the string + return text[start:end] + def send_api(): try: response = requests.post(url, headers=headers, json=data) response.raise_for_status() # Raise an error for bad status codes log.info(f"[CHAT] Wavelog API: {wavelog_data}") - event_manager.freedata_logging(type="wavelog", status=True) +# event_manager.freedata_logging(type="wavelog", status=True) + event_manager.freedata_logging(type="wavelog", status=False, message=f"QSO added") except requests.exceptions.RequestException as e: log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") - event_manager.freedata_logging(type="wavelog", status=False) + #FIXME format the output to get the actual error + event_manager.freedata_logging(type="wavelog", status=False, message=f"Wavelog error check log") # Run the API call in a background thread to avoid blocking the main thread thread = threading.Thread(target=send_api, daemon=True) From fac1518d7fd43197543f34edc2f842b32b2fa1d0 Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Fri, 14 Mar 2025 18:34:32 +0100 Subject: [PATCH 04/12] added better text for the popup error message --- freedata_gui/src/js/eventHandler.js | 4 ++-- freedata_server/wavelog_api_logger.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index a1c876d0..60bdf52c 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -158,10 +158,10 @@ export function eventDispatcher(data) { if (data.status === true) { const message = `
- ${i18next.t('popups.loggingsuccess')}: + ${i18next.t('Wavelog posted')}: ${data.endpoint}
- ${i18next.t('popups.loggingsuccessmessage')} + ${i18next.t('Wavelog posted')}
`; diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index 0a1e7894..b374b4c5 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -57,8 +57,7 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): response = requests.post(url, headers=headers, json=data) response.raise_for_status() # Raise an error for bad status codes log.info(f"[CHAT] Wavelog API: {wavelog_data}") -# event_manager.freedata_logging(type="wavelog", status=True) - event_manager.freedata_logging(type="wavelog", status=False, message=f"QSO added") + event_manager.freedata_logging(type="wavelog", status=True, message=f"QSO added") except requests.exceptions.RequestException as e: log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") #FIXME format the output to get the actual error From 7fc72c6084555cf0b81ec1c08d72626ffa051a9a Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Fri, 14 Mar 2025 19:33:23 +0100 Subject: [PATCH 05/12] added better text for the popup error message --- freedata_server/api/freedata.py | 2 +- freedata_server/wavelog_api_logger.py | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/freedata_server/api/freedata.py b/freedata_server/api/freedata.py index 43babeab..cf1e1cb7 100644 --- a/freedata_server/api/freedata.py +++ b/freedata_server/api/freedata.py @@ -85,7 +85,7 @@ async def post_freedata_message_adif_log(message_id: str, request:Request): if not adif_output: return - # Send the ADIF data via UDP + # Send the ADIF data via UDP and/or wavelog adif_udp_logger.send_adif_qso_data(request.app.config_manager.read(), request.app.event_manager, adif_output) wavelog_api_logger.send_wavelog_qso_data(request.app.config_manager.read(), request.app.event_manager, adif_output) return api_response(adif_output) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index b374b4c5..e89e28ab 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -42,16 +42,6 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): "string": wavelog_data } - def extract_between(text, start_marker, end_marker): - start = text.find(start_marker) - if start == -1: - return None # Marker not found - start += len(start_marker) # Move past the start marker - end = text.find(end_marker, start) - if end == -1: - return text[start:] # If end marker not found, take rest of the string - return text[start:end] - def send_api(): try: response = requests.post(url, headers=headers, json=data) @@ -61,7 +51,7 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): except requests.exceptions.RequestException as e: log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") #FIXME format the output to get the actual error - event_manager.freedata_logging(type="wavelog", status=False, message=f"Wavelog error check log") + event_manager.freedata_logging(type="wavelog", status=False, message=f"{e}") # Run the API call in a background thread to avoid blocking the main thread thread = threading.Thread(target=send_api, daemon=True) From e698bcdcfc08c02f05f6915a4c11ff7bfeb536e7 Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Sat, 15 Mar 2025 10:13:57 +0100 Subject: [PATCH 06/12] fixed a bug with wrong reference to wavelog --- freedata_server/wavelog_api_logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index e89e28ab..bf291611 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -38,7 +38,7 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): data = { "key": wavelog_api_key, "station_profile_id": "1", - "type": "wavelog", + "type": "adif", "string": wavelog_data } From 0e8e71b45e68f68bb7dc4c19466f5334b982a999 Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Sat, 15 Mar 2025 14:40:56 +0100 Subject: [PATCH 07/12] start formating --- freedata_server/wavelog_api_logger.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index bf291611..e3c7da8d 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -51,7 +51,23 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): except requests.exceptions.RequestException as e: log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") #FIXME format the output to get the actual error - event_manager.freedata_logging(type="wavelog", status=False, message=f"{e}") + error_text = f"{e}" + + if error_text.startswith("401 Client Error:") or error_text.startswith("Failed to parse:"): + error_first_line, _, remaining_string = error_text.partition(": ") + error_second_line, _, last_part = remaining_string.partition((": ")) + error_formated = f"{error_first_line}
{error_second_line}
{last_part}" + + elif error_text.startswith("HTTPConnectionPool"): + error_first_line, _, remaining_string = error_text.partition(": ") + error_second_line, _, second_part = remaining_string.partition((": ")) + error_third_line, _, last_part = second_part.partition(("(Caused by NewConnectionError('")) + error_formated = f"{error_first_line}
{error_second_line}
{error_third_line}
{last_part.rstrip("'))")}" + + else: + error_formated = f"{e}" + + event_manager.freedata_logging(type="wavelog", status=False, message=f"{error_formated}") # Run the API call in a background thread to avoid blocking the main thread thread = threading.Thread(target=send_api, daemon=True) From b97c972bc297c2d655d7e81f828e76402b08f7ab Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Mon, 17 Mar 2025 08:37:41 +0100 Subject: [PATCH 08/12] better formating for the gui regarding wavelog --- freedata_gui/src/js/eventHandler.js | 4 ++-- freedata_server/event_manager.py | 1 + freedata_server/wavelog_api_logger.py | 15 ++++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index 60bdf52c..a8c7f2bd 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -159,7 +159,7 @@ export function eventDispatcher(data) { const message = `
${i18next.t('Wavelog posted')}: - ${data.endpoint} + ${data.message}
${i18next.t('Wavelog posted')}
@@ -169,7 +169,7 @@ export function eventDispatcher(data) { } else { const message = `
- ${i18next.t('Wavelog post failed')}: + ${i18next.t('Wavelog error')}: ${data.message}
${i18next.t('Wavelog post failed')} diff --git a/freedata_server/event_manager.py b/freedata_server/event_manager.py index 5d7c55f6..867d30cf 100644 --- a/freedata_server/event_manager.py +++ b/freedata_server/event_manager.py @@ -251,6 +251,7 @@ class EventManager: Args: type (str): The type of logging endpoint (e.g., "file", "websocket"). status (any): The status of the logging operation. + message (str): The message to be displayed """ self.broadcast({"type": "message-logging", "endpoint": type, "status": status, "message": message}) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index e3c7da8d..6d931246 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -1,6 +1,7 @@ import requests import threading import structlog +import re def send_wavelog_qso_data(config, event_manager, wavelog_data): @@ -43,11 +44,18 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): } def send_api(): + print(wavelog_data) try: response = requests.post(url, headers=headers, json=data) response.raise_for_status() # Raise an error for bad status codes log.info(f"[CHAT] Wavelog API: {wavelog_data}") - event_manager.freedata_logging(type="wavelog", status=True, message=f"QSO added") + + callsign_start = wavelog_data.find(f">") + 1 + callsign_end = wavelog_data.find(f"{error_second_line}
{error_third_line}
{last_part.rstrip("'))")}" + elif error_text.startswith("400 Client Error:"): + #TODO maybe use https://github.com/wavelog/wavelog/wiki/API#apilogbook_check_callsign + #to check for duplicate in log then format a proper error message. + #if its not in the log return a regular 400 client error + error_formated = f"400 Client Error: duplicate log?" else: error_formated = f"{e}" From 11ef6e659dd39663881d925a0e04246ac5f5aab6 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:43:59 +0100 Subject: [PATCH 09/12] reduced error logging --- freedata_server/wavelog_api_logger.py | 28 ++------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index 6d931246..b056cf45 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -44,7 +44,6 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): } def send_api(): - print(wavelog_data) try: response = requests.post(url, headers=headers, json=data) response.raise_for_status() # Raise an error for bad status codes @@ -56,31 +55,8 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): event_manager.freedata_logging(type="wavelog", status=True, message=f"QSO with {call_value} added to log") - except requests.exceptions.RequestException as e: - log.warning(f"[WAVELOG ADIF API EXCEPTION]: {e}") - #FIXME format the output to get the actual error - error_text = f"{e}" - - if error_text.startswith("401 Client Error:") or error_text.startswith("Failed to parse:"): - error_first_line, _, remaining_string = error_text.partition(": ") - error_second_line, _, last_part = remaining_string.partition((": ")) - error_formated = f"{error_first_line}
{error_second_line}
{last_part}" - - elif error_text.startswith("HTTPConnectionPool"): - error_first_line, _, remaining_string = error_text.partition(": ") - error_second_line, _, second_part = remaining_string.partition((": ")) - error_third_line, _, last_part = second_part.partition(("(Caused by NewConnectionError('")) - error_formated = f"{error_first_line}
{error_second_line}
{error_third_line}
{last_part.rstrip("'))")}" - - elif error_text.startswith("400 Client Error:"): - #TODO maybe use https://github.com/wavelog/wavelog/wiki/API#apilogbook_check_callsign - #to check for duplicate in log then format a proper error message. - #if its not in the log return a regular 400 client error - error_formated = f"400 Client Error: duplicate log?" - else: - error_formated = f"{e}" - - event_manager.freedata_logging(type="wavelog", status=False, message=f"{error_formated}") + except Exception as e: + event_manager.freedata_logging(type="wavelog", status=False, message=f"{e}") # Run the API call in a background thread to avoid blocking the main thread thread = threading.Thread(target=send_api, daemon=True) From 9373c10823454fee5751652a05e0588f63ff2cec Mon Sep 17 00:00:00 2001 From: LA3QMA Date: Mon, 17 Mar 2025 12:24:38 +0100 Subject: [PATCH 10/12] Added locale for wavelog popup --- freedata_gui/src/js/eventHandler.js | 10 +++++----- freedata_gui/src/locales/en_English.json | 6 +++++- freedata_gui/src/locales/no_Norsk.json | 6 +++++- freedata_server/wavelog_api_logger.py | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index a8c7f2bd..46df6b73 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -158,10 +158,10 @@ export function eventDispatcher(data) { if (data.status === true) { const message = `
- ${i18next.t('Wavelog posted')}: - ${data.message} + ${i18next.t('popups.wavelogposted')}: + ${i18next.t('popups.wavelogqsowith')}${data.message}${i18next.t('popups.wavelogqsoadded')}
- ${i18next.t('Wavelog posted')} + ${i18next.t('popups.wavelogposted')}
`; @@ -169,10 +169,10 @@ export function eventDispatcher(data) { } else { const message = `
- ${i18next.t('Wavelog error')}: + ${i18next.t('popups.wavelogerror')}: ${data.message}
- ${i18next.t('Wavelog post failed')} + ${i18next.t('popups.wavelogerror')}
`; diff --git a/freedata_gui/src/locales/en_English.json b/freedata_gui/src/locales/en_English.json index 815a42e1..7fe9ca2c 100644 --- a/freedata_gui/src/locales/en_English.json +++ b/freedata_gui/src/locales/en_English.json @@ -33,7 +33,11 @@ "bytesperminute": "Bytes per minute", "transmissionfailedwith": "Transmission FAILED with", "confirmingtransmissionwith": "Confirming transmission with", - "receivedbytes": "Received Bytes" + "receivedbytes": "Received Bytes", + "wavelogposted": "Wavelog API", + "wavelogqsowith": "QSO with", + "wavelogqsoadded": "added to the log.", + "wavelogerror": "Wavelog failed" }, "navbar": { "frequency_help": "What's the frequency, Kenneth?", diff --git a/freedata_gui/src/locales/no_Norsk.json b/freedata_gui/src/locales/no_Norsk.json index c839266f..e1ee520b 100644 --- a/freedata_gui/src/locales/no_Norsk.json +++ b/freedata_gui/src/locales/no_Norsk.json @@ -33,7 +33,11 @@ "bytesperminute": "Byte per minutt", "transmissionfailedwith": "Overføring MISLYKKET med", "confirmingtransmissionwith": "Bekrefter overføring med", - "receivedbytes": "Mottatte bytes" + "receivedbytes": "Mottatte bytes", + "wavelogposted": "Wavelog API", + "wavelogqsowith": "QSO med", + "wavelogqsoadded": "lagt til i loggen.", + "wavelogerror": "Wavelog feilet" }, "navbar": { "frequency_help": "Hva er frekvensen, Kenneth?", diff --git a/freedata_server/wavelog_api_logger.py b/freedata_server/wavelog_api_logger.py index b056cf45..385b3338 100644 --- a/freedata_server/wavelog_api_logger.py +++ b/freedata_server/wavelog_api_logger.py @@ -1,7 +1,6 @@ import requests import threading import structlog -import re def send_wavelog_qso_data(config, event_manager, wavelog_data): @@ -53,7 +52,8 @@ def send_wavelog_qso_data(config, event_manager, wavelog_data): callsign_end = wavelog_data.find(f" Date: Mon, 17 Mar 2025 14:58:37 +0100 Subject: [PATCH 11/12] Refactored ADIF locale and added it to both udp and wavelog --- freedata_gui/src/js/eventHandler.js | 12 ++++++------ freedata_gui/src/locales/en_English.json | 8 ++++---- freedata_gui/src/locales/no_Norsk.json | 8 ++++---- freedata_server/adif_udp_logger.py | 13 ++++++++++--- freedata_server/wavelog_api_logger.py | 1 - 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index 46df6b73..bcb5dc05 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -154,14 +154,14 @@ export function eventDispatcher(data) { return; case "message-logging": - if (data.endpoint === "wavelog") { + if (data.endpoint === "wavelog" || data.endpoint === "udp") { if (data.status === true) { const message = `
- ${i18next.t('popups.wavelogposted')}: - ${i18next.t('popups.wavelogqsowith')}${data.message}${i18next.t('popups.wavelogqsoadded')} + ${i18next.t('popups.adiflog_header')}: + ${i18next.t('popups.adiflog_text1')}${data.message}${i18next.t('popups.adiflog_text2')}
- ${i18next.t('popups.wavelogposted')} + ${data.endpoint} ${i18next.t('popups.adiflog_header')}
`; @@ -169,10 +169,10 @@ export function eventDispatcher(data) { } else { const message = `
- ${i18next.t('popups.wavelogerror')}: + ${i18next.t('popups.adiflog_header')}: ${data.message}
- ${i18next.t('popups.wavelogerror')} + ${data.endpoint} ${i18next.t('popups.adiflog_error')}
`; diff --git a/freedata_gui/src/locales/en_English.json b/freedata_gui/src/locales/en_English.json index 7fe9ca2c..4d8717cc 100644 --- a/freedata_gui/src/locales/en_English.json +++ b/freedata_gui/src/locales/en_English.json @@ -34,10 +34,10 @@ "transmissionfailedwith": "Transmission FAILED with", "confirmingtransmissionwith": "Confirming transmission with", "receivedbytes": "Received Bytes", - "wavelogposted": "Wavelog API", - "wavelogqsowith": "QSO with", - "wavelogqsoadded": "added to the log.", - "wavelogerror": "Wavelog failed" + "adiflog_header": "ADIF", + "adiflog_text1": "QSO with", + "adiflog_text2": "added to the log.", + "adiflog_error": "ADIF export error" }, "navbar": { "frequency_help": "What's the frequency, Kenneth?", diff --git a/freedata_gui/src/locales/no_Norsk.json b/freedata_gui/src/locales/no_Norsk.json index e1ee520b..ba8be539 100644 --- a/freedata_gui/src/locales/no_Norsk.json +++ b/freedata_gui/src/locales/no_Norsk.json @@ -34,10 +34,10 @@ "transmissionfailedwith": "Overføring MISLYKKET med", "confirmingtransmissionwith": "Bekrefter overføring med", "receivedbytes": "Mottatte bytes", - "wavelogposted": "Wavelog API", - "wavelogqsowith": "QSO med", - "wavelogqsoadded": "lagt til i loggen.", - "wavelogerror": "Wavelog feilet" + "adiflog_header": "ADIF", + "adiflog_text1": "QSO med", + "adiflog_text2": "lagt til i loggen.", + "adiflog_error": "ADIF export feilet" }, "navbar": { "frequency_help": "Hva er frekvensen, Kenneth?", diff --git a/freedata_server/adif_udp_logger.py b/freedata_server/adif_udp_logger.py index 2a863834..a8a835cf 100644 --- a/freedata_server/adif_udp_logger.py +++ b/freedata_server/adif_udp_logger.py @@ -25,16 +25,23 @@ def send_adif_qso_data(config, event_manager, adif_data): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Set a timeout of 3 seconds to avoid blocking indefinitely sock.settimeout(3) + + callsign_start = adif_data.find(f">") + 1 + callsign_end = adif_data.find(f" Date: Mon, 17 Mar 2025 17:23:02 +0100 Subject: [PATCH 12/12] Refactored ADIF locale strings and added it to both udp and wavelog --- freedata_gui/src/js/eventHandler.js | 10 +++++----- freedata_gui/src/locales/en_English.json | 8 ++++---- freedata_gui/src/locales/no_Norsk.json | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/freedata_gui/src/js/eventHandler.js b/freedata_gui/src/js/eventHandler.js index bcb5dc05..b1c12ccb 100644 --- a/freedata_gui/src/js/eventHandler.js +++ b/freedata_gui/src/js/eventHandler.js @@ -158,10 +158,10 @@ export function eventDispatcher(data) { if (data.status === true) { const message = `
- ${i18next.t('popups.adiflog_header')}: - ${i18next.t('popups.adiflog_text1')}${data.message}${i18next.t('popups.adiflog_text2')} + ${i18next.t('popups.adiflogheader')}: + ${i18next.t('popups.adiflogtext1')}${data.message}${i18next.t('popups.adiflogtext2')}
- ${data.endpoint} ${i18next.t('popups.adiflog_header')} + ${data.endpoint} ${i18next.t('popups.adiflogheader')}
`; @@ -169,10 +169,10 @@ export function eventDispatcher(data) { } else { const message = `
- ${i18next.t('popups.adiflog_header')}: + ${i18next.t('popups.adiflogheader')}: ${data.message}
- ${data.endpoint} ${i18next.t('popups.adiflog_error')} + ${data.endpoint} ${i18next.t('popups.adiflogerror')}
`; diff --git a/freedata_gui/src/locales/en_English.json b/freedata_gui/src/locales/en_English.json index 4d8717cc..4069dc05 100644 --- a/freedata_gui/src/locales/en_English.json +++ b/freedata_gui/src/locales/en_English.json @@ -34,10 +34,10 @@ "transmissionfailedwith": "Transmission FAILED with", "confirmingtransmissionwith": "Confirming transmission with", "receivedbytes": "Received Bytes", - "adiflog_header": "ADIF", - "adiflog_text1": "QSO with", - "adiflog_text2": "added to the log.", - "adiflog_error": "ADIF export error" + "adiflogheader": "ADIF", + "adiflogtext1": "QSO with", + "adiflogtext2": "added to the log.", + "adiflogerror": "ADIF export error" }, "navbar": { "frequency_help": "What's the frequency, Kenneth?", diff --git a/freedata_gui/src/locales/no_Norsk.json b/freedata_gui/src/locales/no_Norsk.json index ba8be539..3b4c20b7 100644 --- a/freedata_gui/src/locales/no_Norsk.json +++ b/freedata_gui/src/locales/no_Norsk.json @@ -34,10 +34,10 @@ "transmissionfailedwith": "Overføring MISLYKKET med", "confirmingtransmissionwith": "Bekrefter overføring med", "receivedbytes": "Mottatte bytes", - "adiflog_header": "ADIF", - "adiflog_text1": "QSO med", - "adiflog_text2": "lagt til i loggen.", - "adiflog_error": "ADIF export feilet" + "adiflogheader": "ADIF", + "adiflogtext1": "QSO med", + "adiflogtext2": "lagt til i loggen.", + "adiflogerror": "ADIF export feilet" }, "navbar": { "frequency_help": "Hva er frekvensen, Kenneth?",