Files
appointment_tool/workers/wait_sms_worker.py
T
2022-04-20 23:02:55 +02:00

88 lines
3.4 KiB
Python

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))
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'))