import datetime import time import random import os import pandas as pd from sms import prepare_sms LOCK_PATH = "output\\alarms.lock" ALARM_DB = "output\\alarms.feather" WAIT_FOR_NEXT_MESSAGE = 60 def process_dataframe(df): now = datetime.datetime.now() records = df.to_dict("records") for alarm in records: if (~alarm["is_sent"]) & (alarm["time"] < now): try: prepare_sms(alarm["phone_number"], alarm["content"], True) # Update alarms status alarm["is_sent"] = True # print("SMS send to " + alarm["phone_number"]) # sleep to avoid reaching time.sleep(random.randint(1, 8)) except Exception as exp: print( "Echec lors de l'envoie du SMS au " + alarm["phone_number"], exp, ) # Transform back the data into dataframe return pd.DataFrame.from_dict(records) def main(): if os.path.exists(LOCK_PATH): print("The program is already running") else: # Touch the Lock File with open(LOCK_PATH, "w") as f: f.write("") try: # Read data from database df = pd.read_feather(ALARM_DB) completion = df.is_sent.mean() print(f"Message send {completion*100:02.0f}%") try: while True: df = process_dataframe(df) df.to_feather(ALARM_DB) now = datetime.datetime.now() sms_sent = df.is_sent.mean() if sms_sent > completion: print(f"Message send {sms_sent*100:02.0f}%") completion = sms_sent if completion == 1: break delta = df[~df.is_sent].time.min() - now time.sleep(delta.total_seconds() + 1) except KeyboardInterrupt: pass finally: df.to_feather(ALARM_DB) finally: print("The program is done") # Remove the lock file os.remove(LOCK_PATH) if __name__ == "__main__": main()