Skip to content

Commit

Permalink
Add: enum for API types
Browse files Browse the repository at this point in the history
  • Loading branch information
DUB1401 committed Sep 29, 2023
1 parent b36f04a commit 6366a10
Show file tree
Hide file tree
Showing 6 changed files with 161 additions and 131 deletions.
44 changes: 26 additions & 18 deletions Source/Callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from Source.Configurator import Configurator
from Source.BotsManager import BotsManager
from MessageEditor import MessageEditor
from Source.Datasets import API_Types
from Source.Functions import *
from threading import Thread
from time import sleep
Expand All @@ -15,7 +16,7 @@ class Callback:
# Обрабатывает очередь сообщений.
def __SenderThread(self):
# Запись в лог отладочной информации: поток очереди отправки запущен.
logging.debug("Callback API sender thread started.")
logging.debug("[Callback API] Sender thread started.")

# Пока сообщение не отправлено.
while True:
Expand Down Expand Up @@ -89,19 +90,22 @@ def __SenderThread(self):
# Описание исключения.
Description = str(ExceptionData)

# Если исключение вызвано частыми запросами, то выждать указанный интервал.
# Если исключение вызвано частыми запросами.
if "Too Many Requests" in Description:
# Запись в лог предупреждения: слишком много запросов.
logging.warning("[Callback API] Too many requests to Telegram. Waiting...")
# Выждать указанный исключением интервал.
sleep(int(Description.split()[-1]) + 1)

else:
# Запись в лог ошибки: исключение Telegram.
logging.error("Telegram exception: \"" + Description + "\".")
logging.error("[Callback API] Telegram exception: \"" + Description + "\".")
# Удаление первого сообщения в очереди отправки.
self.__MessagesBufer.pop(0)

except Exception as ExceptionData:
# Запись в лог ошибки: исключение.
logging.error("Exception: \"" + str(ExceptionData) + "\".")
logging.error("[Callback API] Exception: \"" + str(ExceptionData) + "\".")
# Удаление первого сообщения в очереди отправки.
self.__MessagesBufer.pop(0)

Expand All @@ -111,12 +115,12 @@ def __SenderThread(self):

else:
# Запись в лог отладочной информации: поток очереди отправки оставновлен.
logging.debug("Callback API sender thread stopped.")
logging.debug("[Callback API] Sender thread stopped.")
# Остановка потока.
break

# Отправляет сообщение в группу Telegram через буфер ожидания.
def __SendMessage(self, PostObject: dict, Source: str):
def __SendMessage(self, PostObject: dict, Source: str, LaunchSenderThread: bool = True):
# Состояние: есть ли запрещённые слова в посте.
HasBlacklistWords = False
# Конфигурация источника.
Expand Down Expand Up @@ -168,27 +172,34 @@ def __SendMessage(self, PostObject: dict, Source: str):
SupportedTypes.append(Type)

# Получение вложений.
MessageStruct["attachments"] = GetAttachments(PostObject["attachments"], Source, SupportedTypes, PostObject["id"])
MessageStruct["attachments"] = GetAttachments(PostObject["attachments"], Source, SupportedTypes, PostObject["id"], API_Types.Callback)

# Помещение поста в очередь на отправку.
self.__MessagesBufer.append(MessageStruct)

else:
# Запись в лог отладочной информации: пост был проигнорирован.
logging.info(f"Source: \"{Source}\". Post with ID " + str(PostObject["id"]) + " was ignored.")
logging.info(f"[Callback API] Source: \"{Source}\". Post with ID " + str(PostObject["id"]) + " was ignored.")

# Активировать поток отправки, если не активен.
# Если указано, активировать поток отправки сообщений.
if LaunchSenderThread == True:
self.__StartSenderThread()

# Запускает поток отправки сообщений, если тот уже не запущен.
def __StartSenderThread(self):

# Если поток отправки не функционирует, то запустить его.
if self.__Sender.is_alive() == False:
self.__Sender = Thread(target = self.__SenderThread, name = "VK-Telegram Poster (Callback API sender)")
self.__Sender = Thread(target = self.__SenderThread, name = "[Open API] Sender.")
self.__Sender.start()

# Конструктор: задаёт глобальные настройки, обработчик конфигураций и менеджер подключений к ботам.
def __init__(self, Settings: dict, ConfiguratorObject: Configurator, BotsManagerObject: BotsManager):

#---> Генерация динамических свойств.
#==========================================================================================#
# Поток отправки сообщений.
self.__Sender = Thread(target = self.__SenderThread)
self.__Sender = Thread(target = self.__SenderThread, name = "[Callback API] Sender.")
# Конфигурации.
self.__Configurations = ConfiguratorObject
# Экзмепляры обработчиков постов.
Expand All @@ -200,11 +211,8 @@ def __init__(self, Settings: dict, ConfiguratorObject: Configurator, BotsManager
# Очередь отложенных сообщений.
self.__MessagesBufer = list()

# Запуск потока обработки буфера сообщений.
self.__Sender.start()

# Инициализация экзепляров ботов.
for ConfigName in self.__Configurations.getConfigsNames("Callback"):
for ConfigName in self.__Configurations.getConfigsNames(API_Types.Callback):
# Конфигурация источника.
Config = self.__Configurations.getConfig(ConfigName)
# Инициализация подключения к боту.
Expand All @@ -213,7 +221,7 @@ def __init__(self, Settings: dict, ConfiguratorObject: Configurator, BotsManager
# Добавляет сообщение в очередь отправки.
def AddMessageToBufer(self, CallbackRequest: dict, Source: str):
# Запись в лог сообщения: получен новый пост.
logging.info(f"Source: \"{Source}\". New post with ID " + str(CallbackRequest["object"]["id"]) + ".")
logging.info(f"[Callback API] Source: \"{Source}\". New post with ID " + str(CallbackRequest["object"]["id"]) + ".")

# Проверка работы потоков.
for Index in range(0, len(self.__PostsEditorsThreads)):
Expand All @@ -223,6 +231,6 @@ def AddMessageToBufer(self, CallbackRequest: dict, Source: str):
self.__PostsEditorsThreads.pop(Index)

# Добавление потока обработчика поста в список.
self.__PostsEditorsThreads.append(Thread(target = self.__SendMessage, args = (CallbackRequest["object"], Source)))
self.__PostsEditorsThreads.append(Thread(target = self.__SendMessage, args = (CallbackRequest["object"], Source), name = "[Callback API] Post editor."))
# Запуск потока обработчика поста в список.
self.__PostsEditorsThreads[-1].start()
66 changes: 30 additions & 36 deletions Source/Configurator.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from Source.Datasets import API_Types
from dublib.Methods import ReadJSON

import os
Expand Down Expand Up @@ -49,50 +50,43 @@ def getConfig(self, ConfigName: str) -> dict:
return self.__Configurations[ConfigName]

# Возвращает список конфигураций. Поддерживает фильтрацию по типу API.
def getConfigsNames(self, API_Type: str | None = None) -> list[str]:
def getConfigsNames(self, API_Type: API_Types | None = None) -> list[str]:
# Список конфигурация.
Configs = list()

# Если не указана спецификация API.
if API_Type == None:
Configs = self.__Configurations.keys()

# Если запрошен список конфигураций для Callback API.
elif API_Type.lower() == "callback":

# Для каждой конфигурации проверить соответствие типу API.
for Name in self.__Configurations.keys():
if self.__Configurations[Name]["api"].lower() == "callback":
Configs.append(Name)

else:

# Для каждой конфигурации.
for ConfigName in self.__Configurations.keys():

# Если запрошен список конфигураций для Open API.
elif API_Type.lower() == "open":

# Для каждой конфигурации проверить соответствие типу API.
for Name in self.__Configurations.keys():
if self.__Configurations[Name]["api"].lower() == "open":
Configs.append(Name)
# Если конфигурация соответствует искомому API, то записать её название.
if self.__Configurations[ConfigName]["api"].lower() == API_Type.value.lower():
Configs.append(ConfigName)

return Configs

# Возвращает словарь с количеством модулей, требующих конкретный API.
def getRequiredAPI(self) -> dict:
# Список API.
API = {
"Callback": 0,
"Open": 0
API_Types.Callback: 0,
API_Types.LongPoll: 0,
API_Types.Open: 0
}
# Для каждой конфигурации.
for ConfigName in self.__Configurations.keys():

# Для каждого типа API.
for API_Type in list(API_Types):

# Если конфигурация требует Callback API.
if self.__Configurations[ConfigName]["api"].lower() == "callback":
API["Callback"] += 1

# Если конфигурация требует Open API.
if self.__Configurations[ConfigName]["api"].lower() == "open":
API["Open"] += 1
# Для каждой конфигурации.
for ConfigName in self.__Configurations.keys():

# Если конфигурация соответствует API.
if self.__Configurations[ConfigName]["api"].lower() == API_Type.value.lower():
API[API_Type] += 1

return API

Expand All @@ -112,18 +106,18 @@ def getTokens(self):
return TokensList

# Обновляет конфигурации с указанным типом API.
def updateConfigs(self, API_Type: str):
# Список конфигураций с Open API.
OpenConfigs = list()
def updateConfigs(self, API_Type: API_Types):
# Список конфигураций с указанный API.
SelectedConfigs = list()

# Для каждой конфигурации.
for ConfigName in self.__Configurations.keys():

# Если конфигурация требует Open API.
if self.__Configurations[ConfigName]["api"].lower() == API_Type:
OpenConfigs.append(ConfigName)
# Если конфигурация требует указанный API.
if self.__Configurations[ConfigName]["api"].lower() == API_Type.value.lower():
SelectedConfigs.append(ConfigName)

# Для каждого файла конфигурации с Open API.
for Filename in OpenConfigs:
# Для каждого файла конфигурации с указанный API.
for Filename in SelectedConfigs:
# Прочитать конфигурацию в словарь.
self.__Configurations[Filename] = ReadJSON("Config/" + Filename + ".json")
13 changes: 13 additions & 0 deletions Source/Datasets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from enum import Enum

# Перечисление типов API
class API_Types(Enum):

#==========================================================================================#
# >>>>> СТАТИЧЕСКИЕ СВОЙСТВА <<<<< #
#==========================================================================================#

# Типы API.
Callback = "Callback"
LongPoll = "LongPoll"
Open = "Open"
6 changes: 4 additions & 2 deletions Source/Functions.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from Source.Datasets import API_Types

import requests
import logging
import os
Expand Down Expand Up @@ -29,7 +31,7 @@ def EscapeCharacters(Post: str) -> str:
return Post

# Получает URL вложения и загружает его.
def GetAttachments(PostAttachements: dict, Source: str, SupportedTypes: list[str], PostID: int) -> list:
def GetAttachments(PostAttachements: dict, Source: str, SupportedTypes: list[str], PostID: int, API_Type: API_Types) -> list:
# Список вложений.
Attachements = list()

Expand Down Expand Up @@ -99,6 +101,6 @@ def GetAttachments(PostAttachements: dict, Source: str, SupportedTypes: list[str
Attachements.append(Bufer)

# Запись в лог сообщения: количество.
logging.info(f"Source: \"{Source}\". Post with ID {PostID} contains " + str(len(Attachements)) + " supported attachments.")
logging.info(f"[{API_Type.value} API] Source: \"{Source}\". Post with ID {PostID} contains " + str(len(Attachements)) + " supported attachments.")

return Attachements
Loading

0 comments on commit 6366a10

Please sign in to comment.