Delay telegram notification sending by appending multiple messages to queue and after minute of inactivity clear the queue by sending all messages

This commit is contained in:
Eriks Karls 2019-10-14 13:44:31 +03:00
parent ffa2fc109c
commit 6c9a9e920d

View File

@ -2,7 +2,7 @@ import datetime
import decimal import decimal
import hashlib import hashlib
import random import random
import sys import threading
import time import time
import traceback import traceback
from collections import deque from collections import deque
@ -1154,6 +1154,8 @@ class TelegramBot:
api_url = "" api_url = ""
player_name = "" player_name = ""
__last_time: datetime.datetime = None __last_time: datetime.datetime = None
__next_time: datetime.datetime = None
__threads: List[threading.Thread] = []
def do_init(self, chat_id: int, token: str, player_name: str = ""): def do_init(self, chat_id: int, token: str, player_name: str = ""):
self.chat_id = chat_id self.chat_id = chat_id
@ -1168,16 +1170,16 @@ class TelegramBot:
if not self.__initialized: if not self.__initialized:
self.__queue.append(message) self.__queue.append(message)
return True return True
if self.player_name: self.__queue.append(message)
message = f"Player *{self.player_name}*\n" + message self.__threads = [t for t in self.__threads if not t.is_alive()]
if utils.good_timedelta(utils.now(), datetime.timedelta(seconds=-1)) <= self.__last_time: self.__next_time = utils.good_timedelta(utils.now(), datetime.timedelta(minutes=1))
tb = traceback.extract_stack() if not self.__threads:
message += "\n\n```\n{}\n```".format( name = "send_telegram".format(threading.active_count() - 1)
"\n".join([' File "{}", line {}, in {}'.format(l.filename, l.lineno, l.name) for l in tb]) send_thread = threading.Thread(target=self.__send_messages, name=name)
) send_thread.start()
response = post(self.api_url, json=dict(chat_id=self.chat_id, text=message, parse_mode="Markdown")) self.__threads.append(send_thread)
self.__last_time = utils.now()
return response.json().get('ok') return True
def report_free_bhs(self, battles: List[Tuple[int, int, int, int, datetime.timedelta]]): def report_free_bhs(self, battles: List[Tuple[int, int, int, int, datetime.timedelta]]):
battle_links = [] battle_links = []
@ -1201,3 +1203,17 @@ class TelegramBot:
def report_medal(self, msg): def report_medal(self, msg):
self.send_message(f"New award: *{msg}*") self.send_message(f"New award: *{msg}*")
def __send_messages(self):
while self.__next_time > utils.now():
utils.silent_sleep(utils.get_sleep_seconds(self.__next_time))
message = "\n\n\n\n".join(self.__queue)
if self.player_name:
message = f"Player *{self.player_name}*\n" + message
response = post(self.api_url, json=dict(chat_id=self.chat_id, text=message, parse_mode="Markdown"))
self.__last_time = utils.now()
if response.json().get('ok'):
self.__queue = []
return True
return False