Advertisement
xm4dn355x

event loop for tasks

Sep 24th, 2020 (edited)
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.38 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #####################################################################################################################
  3. #                                                                                                                   #
  4. # Скрипт для экспериментов                                                                                          #
  5. #                                                                                                                   #
  6. # MIT License                                                                                                       #
  7. # Copyright (c) 2020 Michael Nikitenko                                                                              #
  8. #                                                                                                                   #
  9. #####################################################################################################################
  10.  
  11.  
  12. from datetime import datetime
  13. from datetime import timedelta
  14. from time import sleep
  15. import threading
  16. import psycopg2
  17. from psycopg2.extras import DictCursor
  18.  
  19.  
  20. # Globals
  21. ALERTS_LIST = []
  22.  
  23. # DB Connection
  24. conn = psycopg2.connect(dbname='alerts_bot', user='alerts_bot', password='alerts_bot', host='localhost')
  25. cursor = conn.cursor(cursor_factory=DictCursor)
  26. cursor.execute("""SET TIMEZONE='Asia/Yekaterinburg';""")
  27.  
  28.  
  29. def make_alert(id, timer_delay, chat_id, message):
  30.     """Создает событие оповещения"""
  31.     t = threading.Timer(timer_delay, send_alert, args=(id, chat_id, message,))
  32.     t.start()
  33.     return t
  34.  
  35.  
  36. def send_alert(id, chat_id, message):   # TODO: Переделать замоканную функцию под метод бота.
  37.     """Отправка оповещения"""
  38.     print(f'alert: {chat_id} {message} {datetime.now()}')
  39.     pop_allert(id)
  40.     change_alert_status_in_db(id)
  41.  
  42.  
  43. def calculate_timer_delay(alert_time):
  44.     """Высчитывает время до оповещения"""
  45.     res = alert_time.replace(tzinfo=None) - datetime.now().replace(tzinfo=None)
  46.     if res < timedelta(seconds=0):
  47.         res = timedelta(seconds=5)
  48.     return res
  49.  
  50.  
  51. def add_alert(id, time, chat_id, message):
  52.     """Создает событие оповещения и добавляет его в список"""
  53.     timer_delay = calculate_timer_delay(time)
  54.     timer_delay = float(timer_delay.seconds)
  55.     thread = make_alert(id, timer_delay, chat_id, message)
  56.     ALERTS_LIST.append({'id': id, 'thread': thread})
  57.  
  58.  
  59. def pop_allert(id):
  60.     """Удаляет событие оповещения из списка"""
  61.     for alert in ALERTS_LIST:
  62.         if alert['id'] == id:
  63.             ALERTS_LIST.remove(alert)
  64.  
  65.  
  66. def generate_message(username):
  67.     """Генерирует сообщение, которое нужно отправить в чат"""
  68.     return f"@{username} Обратный отсчет окончен. Отчитайтесь пожалуйста"
  69.  
  70.  
  71. def get_alerts_list_from_db():
  72.     """Получает список всех неотработавших таймеров"""
  73.     cursor.execute("""SELECT id, chat_id, username, time FROM alerts WHERE status = FALSE""")
  74.     return cursor.fetchall()
  75.  
  76.  
  77. def change_alert_status_in_db(id):
  78.     """Изменяет статус таймера на отработанный в БД"""
  79.     cursor.execute(f"""UPDATE alerts SET status = TRUE WHERE id = {int(id)};""")
  80.     conn.commit()
  81.  
  82.  
  83. def run_timers_event_loop():
  84.     """Запускает ивент луп с таймерами"""
  85.     x = threading.Thread(target=timers_event_loop)
  86.     return x
  87.  
  88.  
  89. def timers_event_loop():
  90.     """Event loop для обработки тасков с таймерами"""
  91.     while True:
  92.         alerts_list = get_alerts_list_from_db()
  93.         for alert in alerts_list:
  94.             add_flag = True
  95.             for timer in ALERTS_LIST:
  96.                 if int(timer['id']) == alert['id']:
  97.                     add_flag = False
  98.             if add_flag:
  99.                 add_alert(
  100.                     id=alert['id'],
  101.                     time=alert['time'],
  102.                     chat_id=alert['chat_id'],
  103.                     message=generate_message(alert['username'])
  104.                 )
  105.         sleep(5)
  106.  
  107.  
  108. if __name__ == '__main__':
  109.     event_loop = run_timers_event_loop()
  110.     event_loop.start()
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement