From 74fb51a5a72af666128694157c4a0b570f39ebdb Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:05:32 +0300 Subject: [PATCH 01/15] req --- requirements.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b20b21f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +certifi==2024.8.30 +charset-normalizer==3.4.0 +idna==3.10 +pyTelegramBotAPI==4.1.1 +requests==2.32.3 +urllib3==2.2.3 -- 2.45.2 From 90899c0e64d7340d2e42c9b3bfe2bf860f58be72 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:07:27 +0300 Subject: [PATCH 02/15] fix --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 90f9ad2..6e3d341 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ WORKDIR /usr/src/app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . -ENTRYPOINT ["python", "entrypoint.py"] +ENTRYPOINT ["python", "main.py"] -- 2.45.2 From 2506b7a7a06522c80b58b5cb5ec27b45d3fc9bf9 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:09:00 +0300 Subject: [PATCH 03/15] fix --- daemons/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemons/base.py b/daemons/base.py index 7201992..bd6fd00 100644 --- a/daemons/base.py +++ b/daemons/base.py @@ -1,3 +1,3 @@ -class Base: +class Daemon: def execute(self): raise NotImplemented -- 2.45.2 From ba6b903c571337b0b81370cb2e7a3abd40275624 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:10:50 +0300 Subject: [PATCH 04/15] fix --- daemons/poll.py | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/daemons/poll.py b/daemons/poll.py index 362ec52..31df367 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -12,27 +12,28 @@ class Daemon(base.Daemon): self.telegram_pollers: dict[str, dict[str, multiprocessing.Process|None]] = {} def execute(self): - bots = platform.platform_client.get_config('bots') - for project_name, project in bots.items(): - if project_name not in self.telegram_pollers: - self.telegram_pollers[project_name] = {} - for bot_name, bot_info in project.items(): - if bot_name not in self.telegram_pollers[project_name]: - self.telegram_pollers[project_name][bot_name] = None - process = self.telegram_pollers[project_name][bot_name] - if bot_info.get('poll_enabled'): - if process is not None and process.is_alive: - continue - new_process = multiprocessing.Process(target=self.start_polling, args=[bot_info['secrets']['telegram_token'], bot_info['queue']]) - new_process.start() - self.telegram_pollers[project_name][bot_name] = new_process - else: - if process is None: - continue - if process.is_alive: - process.terminate() + while True: + bots = platform.platform_client.get_config('bots') + for project_name, project in bots.items(): + if project_name not in self.telegram_pollers: + self.telegram_pollers[project_name] = {} + for bot_name, bot_info in project.items(): + if bot_name not in self.telegram_pollers[project_name]: self.telegram_pollers[project_name][bot_name] = None - time.sleep(10) + process = self.telegram_pollers[project_name][bot_name] + if bot_info.get('poll_enabled'): + if process is not None and process.is_alive: + continue + new_process = multiprocessing.Process(target=self.start_polling, args=[bot_info['secrets']['telegram_token'], bot_info['queue']]) + new_process.start() + self.telegram_pollers[project_name][bot_name] = new_process + else: + if process is None: + continue + if process.is_alive: + process.terminate() + self.telegram_pollers[project_name][bot_name] = None + time.sleep(10) def start_polling(telegram_token, queue): bot = telebot.TeleBot(telegram_token) -- 2.45.2 From 652d0618fd5917653faf92e4b765c16850148d77 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:14:36 +0300 Subject: [PATCH 05/15] fix --- daemons/poll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemons/poll.py b/daemons/poll.py index 31df367..c925ded 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -35,7 +35,7 @@ class Daemon(base.Daemon): self.telegram_pollers[project_name][bot_name] = None time.sleep(10) - def start_polling(telegram_token, queue): + def start_polling(self, telegram_token, queue): bot = telebot.TeleBot(telegram_token) @bot.message_handler() def do_action(message): -- 2.45.2 From 274529bb1a6eaccf0cd86efb168b05d58e33af60 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:19:05 +0300 Subject: [PATCH 06/15] fix --- daemons/poll.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/daemons/poll.py b/daemons/poll.py index c925ded..65415e9 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -23,16 +23,22 @@ class Daemon(base.Daemon): process = self.telegram_pollers[project_name][bot_name] if bot_info.get('poll_enabled'): if process is not None and process.is_alive: + print(f'process for {project_name} {bot_name} is alive') continue new_process = multiprocessing.Process(target=self.start_polling, args=[bot_info['secrets']['telegram_token'], bot_info['queue']]) + print(f'starting process for {project_name} {bot_name} is alive') new_process.start() self.telegram_pollers[project_name][bot_name] = new_process + print(f'started process for {project_name} {bot_name} is alive') else: - if process is None: + if process is None or not process.is_alive: + print(f'process for {project_name} {bot_name} is not alive') continue if process.is_alive: + print(f'terminating process for {project_name} {bot_name}') process.terminate() self.telegram_pollers[project_name][bot_name] = None + print(f'terminated process for {project_name} {bot_name}') time.sleep(10) def start_polling(self, telegram_token, queue): -- 2.45.2 From 8c09bef1e95987458157e4c5f2745cb657f25800 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:26:13 +0300 Subject: [PATCH 07/15] fix --- daemons/poll.py | 4 ++-- local_platform.json | 19 +++++++++++++++++++ main.py | 22 ++++++++++++---------- utils/platform.py | 2 +- 4 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 local_platform.json diff --git a/daemons/poll.py b/daemons/poll.py index 65415e9..755140d 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -26,10 +26,10 @@ class Daemon(base.Daemon): print(f'process for {project_name} {bot_name} is alive') continue new_process = multiprocessing.Process(target=self.start_polling, args=[bot_info['secrets']['telegram_token'], bot_info['queue']]) - print(f'starting process for {project_name} {bot_name} is alive') + print(f'starting process for {project_name} {bot_name}') new_process.start() self.telegram_pollers[project_name][bot_name] = new_process - print(f'started process for {project_name} {bot_name} is alive') + print(f'started process for {project_name} {bot_name}') else: if process is None or not process.is_alive: print(f'process for {project_name} {bot_name} is not alive') diff --git a/local_platform.json b/local_platform.json new file mode 100644 index 0000000..055dbfd --- /dev/null +++ b/local_platform.json @@ -0,0 +1,19 @@ +{ + "configs": { + "bots": { + "pizda-bot": { + "telegram-bot": { + "type": "telegram", + "poll_enabled": true, + "mailbox_enabled": false, + "queue": "pizda_bot_worker", + "secrets": { + "telegram_token": "5652624181:AAFFVjcHJjea7wlW6MRaxjFY_eu2XWPwOns" + } + } + } + } + }, + "experiments": {}, + "platform_staff": {} +} \ No newline at end of file diff --git a/main.py b/main.py index 49ce915..d76a671 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,17 @@ import sys -arg = sys.argv[-1] +# arg = sys.argv[-1] +arg = 'poll' -if arg == "poll": - print("poll is starting") - from daemons.poll import Daemon -elif arg == 'mailbox': - print("mailbox is starting") - from daemons.mailbox import Daemon -else: - raise ValueError(f"Unknown param {arg}") +if __name__ == '__main__': + if arg == "poll": + print("poll is starting") + from daemons.poll import Daemon + elif arg == 'mailbox': + print("mailbox is starting") + from daemons.mailbox import Daemon + else: + raise ValueError(f"Unknown param {arg}") -Daemon().execute() + Daemon().execute() diff --git a/utils/platform.py b/utils/platform.py index 9b4e864..4b5068d 100644 --- a/utils/platform.py +++ b/utils/platform.py @@ -88,6 +88,6 @@ class PlatformClient: platform_client = PlatformClient( 'Botalka', - os.getenv('STAGE'), + os.getenv('STAGE', 'local'), need_poll=True, ) -- 2.45.2 From 8a01f9ce5d3255980a5beb6b1a1c902d595670ab Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 04:32:17 +0300 Subject: [PATCH 08/15] fix --- daemons/poll.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/daemons/poll.py b/daemons/poll.py index 755140d..b700fc5 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -34,11 +34,10 @@ class Daemon(base.Daemon): if process is None or not process.is_alive: print(f'process for {project_name} {bot_name} is not alive') continue - if process.is_alive: - print(f'terminating process for {project_name} {bot_name}') - process.terminate() - self.telegram_pollers[project_name][bot_name] = None - print(f'terminated process for {project_name} {bot_name}') + print(f'terminating process for {project_name} {bot_name}') + process.terminate() + self.telegram_pollers[project_name][bot_name] = None + print(f'terminated process for {project_name} {bot_name}') time.sleep(10) def start_polling(self, telegram_token, queue): -- 2.45.2 From e0db9bb6055254a0264f75af309461fb0e1e5274 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 11:10:08 +0300 Subject: [PATCH 09/15] fix --- .gitignore | 2 ++ daemons/poll.py | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 849d3ca..0740544 100644 --- a/.gitignore +++ b/.gitignore @@ -117,3 +117,5 @@ GitHub.sublime-settings !.vscode/launch.json !.vscode/extensions.json .history + +local_platform.json diff --git a/daemons/poll.py b/daemons/poll.py index b700fc5..e2c65be 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -1,5 +1,5 @@ import telebot -import multiprocessing +import threading import time from daemons import base @@ -9,7 +9,7 @@ from utils import queues class Daemon(base.Daemon): def __init__(self): - self.telegram_pollers: dict[str, dict[str, multiprocessing.Process|None]] = {} + self.telegram_bots: dict[str, dict[str, tuple[telebot.TeleBot, threading.Thread]|None]] = {} def execute(self): while True: @@ -20,28 +20,30 @@ class Daemon(base.Daemon): for bot_name, bot_info in project.items(): if bot_name not in self.telegram_pollers[project_name]: self.telegram_pollers[project_name][bot_name] = None - process = self.telegram_pollers[project_name][bot_name] + internal_bot_info = self.telegram_pollers[project_name][bot_name] if bot_info.get('poll_enabled'): - if process is not None and process.is_alive: - print(f'process for {project_name} {bot_name} is alive') - continue - new_process = multiprocessing.Process(target=self.start_polling, args=[bot_info['secrets']['telegram_token'], bot_info['queue']]) + if internal_bot_info is not None: + bot, thread = internal_bot_info + if thread.is_alive: + print(f'process for {project_name} {bot_name} is alive') + continue + bot = telebot.TeleBot(bot_info['secrets']['telegram_token']) + thread = threading.Thread(target=self.start_polling, args=[bot, bot_info['queue']]) print(f'starting process for {project_name} {bot_name}') - new_process.start() - self.telegram_pollers[project_name][bot_name] = new_process + thread.start() + self.telegram_pollers[project_name][bot_name] = (bot, thread) print(f'started process for {project_name} {bot_name}') else: - if process is None or not process.is_alive: + if internal_bot_info is None or not internal_bot_info[1].is_alive: print(f'process for {project_name} {bot_name} is not alive') continue print(f'terminating process for {project_name} {bot_name}') - process.terminate() + internal_bot_info[0].stop_bot() self.telegram_pollers[project_name][bot_name] = None print(f'terminated process for {project_name} {bot_name}') time.sleep(10) - def start_polling(self, telegram_token, queue): - bot = telebot.TeleBot(telegram_token) + def start_polling(self, bot, queue): @bot.message_handler() def do_action(message): queues.set_task(queue, message.json, 1) -- 2.45.2 From f80b147a5bdbefb334c2f58c0dcb1c50f654af9c Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 11:12:11 +0300 Subject: [PATCH 10/15] fix --- daemons/poll.py | 10 +++++----- local_platform.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/daemons/poll.py b/daemons/poll.py index e2c65be..91a9d11 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -15,12 +15,12 @@ class Daemon(base.Daemon): while True: bots = platform.platform_client.get_config('bots') for project_name, project in bots.items(): - if project_name not in self.telegram_pollers: - self.telegram_pollers[project_name] = {} + if project_name not in self.telegram_bots: + self.telegram_bots[project_name] = {} for bot_name, bot_info in project.items(): - if bot_name not in self.telegram_pollers[project_name]: - self.telegram_pollers[project_name][bot_name] = None - internal_bot_info = self.telegram_pollers[project_name][bot_name] + if bot_name not in self.telegram_bots[project_name]: + self.telegram_bots[project_name][bot_name] = None + internal_bot_info = self.telegram_bots[project_name][bot_name] if bot_info.get('poll_enabled'): if internal_bot_info is not None: bot, thread = internal_bot_info diff --git a/local_platform.json b/local_platform.json index 055dbfd..ca986b4 100644 --- a/local_platform.json +++ b/local_platform.json @@ -4,7 +4,7 @@ "pizda-bot": { "telegram-bot": { "type": "telegram", - "poll_enabled": true, + "poll_enabled": false, "mailbox_enabled": false, "queue": "pizda_bot_worker", "secrets": { -- 2.45.2 From 2eee8bc1fa99472288c4d19e6cd8fbf82bd4f72f Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 11:15:07 +0300 Subject: [PATCH 11/15] fix --- daemons/poll.py | 4 ++-- local_platform.json | 2 +- main.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/daemons/poll.py b/daemons/poll.py index 91a9d11..a2c26a7 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -31,7 +31,7 @@ class Daemon(base.Daemon): thread = threading.Thread(target=self.start_polling, args=[bot, bot_info['queue']]) print(f'starting process for {project_name} {bot_name}') thread.start() - self.telegram_pollers[project_name][bot_name] = (bot, thread) + self.telegram_bots[project_name][bot_name] = (bot, thread) print(f'started process for {project_name} {bot_name}') else: if internal_bot_info is None or not internal_bot_info[1].is_alive: @@ -39,7 +39,7 @@ class Daemon(base.Daemon): continue print(f'terminating process for {project_name} {bot_name}') internal_bot_info[0].stop_bot() - self.telegram_pollers[project_name][bot_name] = None + self.telegram_bots[project_name][bot_name] = None print(f'terminated process for {project_name} {bot_name}') time.sleep(10) diff --git a/local_platform.json b/local_platform.json index ca986b4..055dbfd 100644 --- a/local_platform.json +++ b/local_platform.json @@ -4,7 +4,7 @@ "pizda-bot": { "telegram-bot": { "type": "telegram", - "poll_enabled": false, + "poll_enabled": true, "mailbox_enabled": false, "queue": "pizda_bot_worker", "secrets": { diff --git a/main.py b/main.py index d76a671..b1f1648 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,8 @@ import sys -# arg = sys.argv[-1] -arg = 'poll' +arg = sys.argv[-1] +# arg = 'poll' if __name__ == '__main__': if arg == "poll": -- 2.45.2 From 1b788ff2b2cccc6dada34d0e41c41bf1eeb2ddf8 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 11:20:32 +0300 Subject: [PATCH 12/15] fix --- local_platform.json | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 local_platform.json diff --git a/local_platform.json b/local_platform.json deleted file mode 100644 index 055dbfd..0000000 --- a/local_platform.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "configs": { - "bots": { - "pizda-bot": { - "telegram-bot": { - "type": "telegram", - "poll_enabled": true, - "mailbox_enabled": false, - "queue": "pizda_bot_worker", - "secrets": { - "telegram_token": "5652624181:AAFFVjcHJjea7wlW6MRaxjFY_eu2XWPwOns" - } - } - } - } - }, - "experiments": {}, - "platform_staff": {} -} \ No newline at end of file -- 2.45.2 From 4042ce13d0f0cb6daaef55fd2c5da40081e414a8 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 14:45:46 +0300 Subject: [PATCH 13/15] fix --- daemons/poll.py | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/daemons/poll.py b/daemons/poll.py index a2c26a7..412c4bd 100644 --- a/daemons/poll.py +++ b/daemons/poll.py @@ -9,7 +9,7 @@ from utils import queues class Daemon(base.Daemon): def __init__(self): - self.telegram_bots: dict[str, dict[str, tuple[telebot.TeleBot, threading.Thread]|None]] = {} + self.telegram_bots: dict[str, dict[str, telebot.TeleBot|None]] = {} def execute(self): while True: @@ -20,31 +20,28 @@ class Daemon(base.Daemon): for bot_name, bot_info in project.items(): if bot_name not in self.telegram_bots[project_name]: self.telegram_bots[project_name][bot_name] = None - internal_bot_info = self.telegram_bots[project_name][bot_name] + bot = self.telegram_bots[project_name][bot_name] if bot_info.get('poll_enabled'): - if internal_bot_info is not None: - bot, thread = internal_bot_info - if thread.is_alive: - print(f'process for {project_name} {bot_name} is alive') - continue - bot = telebot.TeleBot(bot_info['secrets']['telegram_token']) - thread = threading.Thread(target=self.start_polling, args=[bot, bot_info['queue']]) + if bot is not None: + print(f'process for {project_name} {bot_name} is alive') + continue print(f'starting process for {project_name} {bot_name}') - thread.start() - self.telegram_bots[project_name][bot_name] = (bot, thread) + bot = telebot.TeleBot(bot_info['secrets']['telegram_token']) + self.start_polling(bot, bot_info['queue']) + self.telegram_bots[project_name][bot_name] = bot print(f'started process for {project_name} {bot_name}') else: - if internal_bot_info is None or not internal_bot_info[1].is_alive: + if bot is None: print(f'process for {project_name} {bot_name} is not alive') continue print(f'terminating process for {project_name} {bot_name}') - internal_bot_info[0].stop_bot() + bot.stop_bot() self.telegram_bots[project_name][bot_name] = None print(f'terminated process for {project_name} {bot_name}') time.sleep(10) - def start_polling(self, bot, queue): + def start_polling(self, bot: telebot.TeleBot, queue: str): @bot.message_handler() - def do_action(message): + def do_action(message: telebot.types.Message): queues.set_task(queue, message.json, 1) - bot.polling() + threading.Thread(target=bot.polling).start() -- 2.45.2 From c08a02073f4a71a4d30ac31d419126c9c13a1d32 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 16:13:49 +0300 Subject: [PATCH 14/15] fix --- daemons/mailbox.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemons/mailbox.py b/daemons/mailbox.py index 9d531a4..d3a041c 100644 --- a/daemons/mailbox.py +++ b/daemons/mailbox.py @@ -20,6 +20,8 @@ class Daemon(base.Daemon, queues.TasksHandlerMixin): if bot['type'] == 'telegram': token = bot['secrets']['telegram_token'] self.process_telegram(token, payload['body']) + else: + print('Unknown bot type:', bot['type']) def process_telegram(self, token, payload): try: -- 2.45.2 From e7ce0cb6afc81c0baf7f0671d468f81958bdf659 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Wed, 27 Nov 2024 16:17:59 +0300 Subject: [PATCH 15/15] fix --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 6e3d341..5375a3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,5 @@ WORKDIR /usr/src/app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . +ENV PYTHONUNBUFFERED 1 ENTRYPOINT ["python", "main.py"] -- 2.45.2