diff --git a/modem/frame_handler_beacon.py b/modem/frame_handler_beacon.py index 1b0e0148..7a88dc20 100644 --- a/modem/frame_handler_beacon.py +++ b/modem/frame_handler_beacon.py @@ -4,6 +4,7 @@ import data_frame_factory import frame_handler import datetime from message_system_db_beacon import DatabaseManagerBeacon +from message_system_db_messages import DatabaseManagerMessages from message_system_db_manager import DatabaseManager @@ -15,3 +16,6 @@ class BeaconFrameHandler(frame_handler.FrameHandler): self.details["snr"], self.details['frame']["gridsquare"] ) + + # set message to queued if beacon received + DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) diff --git a/modem/message_system_db_messages.py b/modem/message_system_db_messages.py index 6b87cf2b..255b8ab5 100644 --- a/modem/message_system_db_messages.py +++ b/modem/message_system_db_messages.py @@ -201,4 +201,44 @@ class DatabaseManagerMessages(DatabaseManager): session.rollback() self.log(f"An error occurred while marking message {message_id} as read: {e}") finally: - session.remove() \ No newline at end of file + session.remove() + + def set_message_to_queued_for_callsign(self, callsign): + session = self.get_thread_scoped_session() + try: + # Find the 'failed' status object + failed_status = session.query(Status).filter_by(name='failed').first() + # Find the 'queued' status object + queued_status = session.query(Status).filter_by(name='queued').first() + + # Ensure both statuses are found + if not failed_status or not queued_status: + self.log("Failed or queued status not found", isWarning=True) + return + + # Query for messages with the specified callsign, 'failed' status, and fewer than 10 attempts + messages = session.query(P2PMessage) \ + .filter(P2PMessage.origin_callsign == callsign) \ + .filter(P2PMessage.status_id == failed_status.id) \ + .filter(P2PMessage.attempt < 10) \ + .all() + + if messages: + # Update each message's status to 'queued' + for message in messages: + # Increment attempt count using the existing function + self.increment_message_attempts(message.id) + + message.status_id = queued_status.id + self.log(f"Set message {message.id} to queued and incremented attempt") + + session.commit() + return {'status': 'success', 'message': f'{len(messages)} message(s) set to queued'} + else: + return {'status': 'failure', 'message': 'No eligible messages found'} + except Exception as e: + session.rollback() + self.log(f"An error occurred while setting messages to queued: {e}", isWarning=True) + return {'status': 'failure', 'message': str(e)} + finally: + session.remove()