Origin #2

Merged
Whyverum merged 35 commits from origin into master 2024-12-23 18:17:17 +03:00
Showing only changes of commit 03cf587919 - Show all commits

View File

@@ -1,53 +1,29 @@
# BotLibrary/library/bots.py # BotLibrary/library/bots.py
# Создание и настройка бота в одном файле # Создание и настройка бота в одном файле
import pytz
from tzlocal import get_localzone
from datetime import datetime
from aiogram import Dispatcher, Bot, F from aiogram import Dispatcher, Bot, F
from aiogram.client.default import DefaultBotProperties from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode from aiogram.enums import ParseMode
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from config import bot_token, BotVariables from .time import *
from configs import bot_token, BotVariables
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("bot_token", "dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info") __all__ = ("dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info")
log_type = "Bot" log_type = "Bot"
# Получение времени по UTC
utc_now = datetime.now(pytz.utc)
# Получение локального времени хоста (с использованием локального часового пояса)
local_tz = get_localzone() # Автоматически определяет локальный часовой пояс
local_now = utc_now.astimezone(local_tz)
# Получение московского времени
moscow_tz = pytz.timezone("Europe/Moscow")
moscow_now = utc_now.astimezone(moscow_tz)
# Форматирование времени UTC
utc_time = utc_now.strftime("%Y-%m-%d %H:%M:%S") + " (UTC)"
# Форматирование времени хоста со сдвигом
utc_offset_host = local_now.utcoffset().total_seconds() / 3600 # Смещение в часах
host_time = local_now.strftime("%Y-%m-%d %H:%M:%S") + f" (UTC{int(utc_offset_host):+})"
# Форматирование московского времени со сдвигом
utc_offset_moscow = moscow_now.utcoffset().total_seconds() / 3600 # Смещение в часах
moscow_time = moscow_now.strftime("%Y-%m-%d %H:%M:%S") + f" (UTC{int(utc_offset_moscow):+})"
# Создание экземпляра диспатчера и его параметров # Создание экземпляра диспатчера и его параметров
dp = Dispatcher() dp = Dispatcher()
dp["started_at"] = host_time dp["started_at"] = host_time
dp["started_at_msk"] = moscow_time dp["started_at_msk"] = get_choice_time(TimeVariable.choice_utc_msk)
dp["is_active"] = True # Флаг активности бота dp["is_active"] = True # Флаг активности бота
dp["logs"] = [] dp["logs"] = []
dp["users"] = {} dp["users"] = {}
dp["sessions"] = {} dp["sessions"] = {}
dp["task_queue"] = [] dp["task_queue"] = []
dp["config"] = {"max_connections": 100, "retry_interval": 5, "time_format": BotVariables.time_format} dp["configs"] = {"max_connections": 100, "retry_interval": 5, "time_format": TimeVariable.format}
dp["metrics"] = {"messages_received": 0, "messages_sent": 0, "errors": 0} dp["metrics"] = {"messages_received": 0, "messages_sent": 0, "errors": 0}
dp["modules"] = {} dp["modules"] = {}
dp["state"] = {} dp["state"] = {}
@@ -58,21 +34,33 @@ dp["database"] = None
# Объявление экземпляров и переменных # Объявление экземпляров и переменных
bot = Bot(token=bot_token, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) # Объявление бота bot_properties = DefaultBotProperties(
scheduler = AsyncIOScheduler(timezone=BotVariables.time_zone) # Создание планировщика parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений
disable_notification=True, # Отключаем уведомления при отправке сообщений
protect_content=True, # Защищаем содержимое сообщений от копирования
allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на другое сообщение
# link_preview=LinkPreviewOptions(), # Настройка для предварительного просмотра ссылок
link_preview_is_disabled=True, # Отключаем предварительный просмотр ссылок
show_caption_above_media=False, # Показываем подпись выше медиа
)
bot = Bot(token=bot_token, default=bot_properties) # Объявление бота
scheduler = AsyncIOScheduler(timezone=get_time_zone()) # Создание планировщика
F_Media = F.photo | F.files | F.video | F.animation | F.voice | F.video_note # Фильтр-медиа F_Media = F.photo | F.files | F.video | F.animation | F.voice | F.video_note # Фильтр-медиа
# Класс для хранения данных о боте (некоторые переменные даны как шаблон) # Класс для хранения данных о боте (некоторые переменные даны как шаблон)
class BotInfo: class BotInfo:
# Статические переменные для хранения данных # Статические переменные для хранения данных
id = 10000000 id = None
first_name = "TESTBOT" first_name = None
last_name = "" last_name = None
username = "testbot" username = None
description = None
short_description = None
can_join_groups = None can_join_groups = None
can_read_all_group_messages = None can_read_all_group_messages = None
language_code = BotVariables.language language_code = BotVariables.language
prefixs = BotVariables.prefixs
is_premium = None is_premium = None
added_to_attachment_menu = None added_to_attachment_menu = None
supports_inline_queries = None supports_inline_queries = None
@@ -86,13 +74,16 @@ class BotInfo:
cls.first_name = bot_info.first_name cls.first_name = bot_info.first_name
cls.last_name = bot_info.last_name cls.last_name = bot_info.last_name
cls.username = bot_info.username cls.username = bot_info.username
cls.can_join_groups = bot_info.can_join_groups cls.description = getattr(bot_info, 'description', '') # Default to empty string if no description
cls.can_read_all_group_messages = bot_info.can_read_all_group_messages cls.short_description = getattr(bot_info, 'description', '')
cls.language_code = bot_info.language_code
cls.is_premium = bot_info.is_premium cls.is_premium = bot_info.is_premium
cls.added_to_attachment_menu = bot_info.added_to_attachment_menu cls.added_to_attachment_menu = bot_info.added_to_attachment_menu
cls.supports_inline_queries = bot_info.supports_inline_queries cls.supports_inline_queries = bot_info.supports_inline_queries
cls.can_connect_to_business = bot_info.can_connect_to_business cls.can_connect_to_business = bot_info.can_connect_to_business
cls.has_main_web_app = bot_info.has_main_web_app cls.has_main_web_app = bot_info.has_main_web_app
cls.can_join_groups = getattr(bot_info, 'can_join_groups', None) # Default to None if no attribute
cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', None) # Default to None
# Функция получения данных о боте # Функция получения данных о боте
@@ -110,12 +101,14 @@ async def bot_get_info():
'first_name': bot_info_data.first_name, 'first_name': bot_info_data.first_name,
'last_name': bot_info_data.last_name, 'last_name': bot_info_data.last_name,
'username': bot_info_data.username, 'username': bot_info_data.username,
'can_join_groups': bot_info_data.can_join_groups, 'description': getattr(bot_info_data, 'description', ''),
'can_read_all_group_messages': bot_info_data.can_read_all_group_messages, 'short_description': getattr(bot_info_data, 'description', ''),
'language_code': BotVariables.language, 'language_code': bot_info_data.language_code,
'prefixs': BotVariables.prefixs,
'is_premium': bot_info_data.is_premium, 'is_premium': bot_info_data.is_premium,
'added_to_attachment_menu': bot_info_data.added_to_attachment_menu, 'added_to_attachment_menu': bot_info_data.added_to_attachment_menu,
'supports_inline_queries': bot_info_data.supports_inline_queries, 'supports_inline_queries': bot_info_data.supports_inline_queries,
'can_connect_to_business': bot_info_data.can_connect_to_business, 'can_connect_to_business': bot_info_data.can_connect_to_business,
'has_main_web_app': bot_info_data.has_main_web_app, 'has_main_web_app': bot_info_data.has_main_web_app,
'can_join_groups': getattr(bot_info_data, 'can_join_groups', None),
} }