import datetime import json import logging import threading import time from typing import Union from gsmmodem.modem import Sms import params from definitions import SMS_TIMEOUT from notification.AcceptedResultPojo import get_accepted_result_from from notification.mailer import Mailer from pojo.SimInfoPojo import SimInfoPojo from pojo.serial_modem import SerialModem from utils.excel_reader import ExcelHelper class WaitSmsWorker: HERMES_RDV = "HERMES RDV" ACCEPT_SENTENCE = "We are pleased to confirm your appointment" def __init__(self, serial_modem: SerialModem): self.serial_modem = serial_modem self.logger = logging.getLogger("WaitSmsWorker") def handle_sms(self, sms): self.logger.info( "sms received for phone:{}(ccid:{})".format(self.serial_modem.phone_number, self.serial_modem.ccid)) self.logger.info( u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, sms.text)) if self.serial_modem.phone_number: self.check_sms(sms, int(self.serial_modem.phone_number)) params.oracle_log_sender.send_sms_reception_log(sms.number, sms.text, self.serial_modem.ccid) def run(self): t = threading.Thread(target=self.start_wait) t.start() def start_wait(self): try: self.serial_modem.modem.deleteMultipleStoredSms(memory="SM") except Exception as error: print(error) self.serial_modem.modem.smsReceivedCallback = self.handle_sms self.serial_modem.modem.smsTextMode = False self.logger.info('Waiting for SMS message, for phone number ' + str(self.serial_modem.phone_number)) listen_at = time.time() while True: # self.logger.info("sleep for 2s in thread({})".format(threading.currentThread().name)) time.sleep(5) # check whether timeout now = time.time() if (listen_at + SMS_TIMEOUT) < now: self.logger.info("time out for {}, switch to next contact".format(self.serial_modem.phone_number)) # save the contact in timeout self.serial_modem.modem.close() return @staticmethod def find_info_via_ccid(ccid) -> Union[None, SimInfoPojo]: sim_list = ExcelHelper().read_sim_info() found_sim_list = [contact for contact in sim_list if contact.ccid.replace("F", "") == ccid.replace("F", "")] if len(found_sim_list) > 0: print(found_sim_list[0].to_firestore_dict()) return found_sim_list[0] else: return None def check_sms(self, sms: Sms, phone: int): self.logger.info("核查 sms") if sms.number == self.HERMES_RDV: if self.ACCEPT_SENTENCE in sms.text: self.logger.info("收到来自hermes的短信,准备发送邮件") mailer = Mailer() result_pojo = params.firebase_store_manager.find_appointment_detail_via_phone( str(datetime.date.today()), phone) accepted_result = get_accepted_result_from(sms, result_pojo) mailer.send_email(accepted_result) if __name__ == '__main__': worker = WaitSmsWorker(None) sms = Sms("HERMES RDV", "We are pleased to confirm your appointment. You will be welcomed on Apr 14, 2022 in our store at 17 rue de Sèvres at 4:45 PM. The given hour may be subje") worker.check_sms(sms, int('613467904'))