-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.py
122 lines (110 loc) · 3.89 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
"""
Модуль для запуска бота.
"""
# pylint: skip-file
import asyncio
import logging
import signal
import sys
from bot_init import bot
from commands import (
echo_command,
gpt_command,
help_command,
ping_command,
shutdown_command,
status_command,
uptime_command,
user_role_command,
)
from commands.post_admin import (
restart_command,
update_command,
admin_info_command,
bunker_command,
admin_presets_command,
game_rules_command
)
from commands.db_ss import (
multi_akk_db_command,
)
from commands.adt_team import (
add_role_command,
add_vacation_command,
end_vacation_command,
extend_vacation_command,
new_team_command,
remove_role_command,
remove_team_command,
team_help_command,
tweak_team_command,
)
from commands.dbCommand import info_command, status_command, help_command
from commands.github import (
achang_command,
check_workflows,
forks_command,
github_processor,
milestones_command,
pr_changelog_send,
review_command,
)
from commands.misc.shutdows_deff import (
shutdown_def,
) # Для выполнения завершающих операций
from config import DISCORD_KEY
from events import on_command, on_error, on_message, on_ready, update_status
# Настройка логирования
logging.basicConfig(
level=logging.INFO, # Уровень логирования
format="%(asctime)s - %(levelname)s - %(message)s", # Формат сообщений
handlers=[
logging.FileHandler("bot_logs.log"), # Логирование в файл
logging.StreamHandler(sys.stdout), # Логирование в консоль
],
)
async def shutdown(signal_type=None):
"""
Завершаем работу бота, выполняя все необходимые завершающие операции.
:param signal_type: Тип сигнала, если он передан
"""
logging.info(
"Получен сигнал: %s. Завершаем работу...",
signal_type.name if signal_type else "Manual Exit",
)
try:
await shutdown_def() # Выполнение завершающих операций
await bot.close() # Закрытие соединения бота
except Exception as e:
logging.error("Ошибка при завершении работы бота: %s", e)
finally:
sys.exit(0) # Принудительное завершение процесса
def setup_signal_handlers():
"""
Настроить обработчики сигналов для корректного завершения работы бота.
"""
if sys.platform == "win32":
logging.warning(
"Сигналы SIGINT и SIGTERM не поддерживаются на Windows."
)
else:
loop = asyncio.get_event_loop()
for sig in (signal.SIGINT, signal.SIGTERM):
loop.add_signal_handler(
sig, lambda s=sig: asyncio.create_task(shutdown(s))
)
async def main():
"""
Основная функция для запуска бота.
"""
try:
setup_signal_handlers() # Настройка обработчиков сигналов
logging.info("Запуск бота...")
await bot.start(DISCORD_KEY) # Запуск бота с токеном
except (KeyboardInterrupt, SystemExit):
await shutdown() # Обработка принудительного завершения
except Exception as e:
logging.error("Неожиданная ошибка при запуске бота: %s", e)
await shutdown()
if __name__ == "__main__":
bot.run(DISCORD_KEY) # Запуск бота, без asyncio.run()