-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
149 lines (113 loc) · 4.47 KB
/
main.py
File metadata and controls
149 lines (113 loc) · 4.47 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
""" ... """
import asyncio
import datetime
import logging
import os
import sys
import aiogram.types
import peewee
from aiogram.fsm.state import any_state
from aiogram.fsm.storage.memory import MemoryStorage
from glQiwiApi import QiwiP2PClient
import settings
# Добавляем папки с библиотеками и модулями в path
sys.path.extend(settings.LIBS)
import ezqr
import response_system
import response_system.core.responses
import gls
import template
import userdata
from template_for_aiogram import aiogram_syntax
logger = logging.getLogger('peewee')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
logger = logging.getLogger(__name__)
def get_BaseModel(db):
""" Функция возвращающая базовую модель peewee
для переданной базы данных """
class BaseModel(peewee.Model):
""" Базовая модель """
class Meta:
database = db
@classmethod
def select_by_id(cls, pk):
return cls.select().where(cls._meta.primary_key == pk)
return BaseModel
def log_uncaught_exceptions(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))
async def main():
""" Точка входа в программу """
os.makedirs(settings.LOGGING_DIRECTORY, exist_ok=True)
logging_filename = os.path.join(
settings.LOGGING_DIRECTORY,
datetime.datetime.now().strftime(
settings.LOGGING_FILENAME_FORMAT
)
)
logging.basicConfig(
level=settings.LOGGING_LEVEL,
format=settings.LOGGING_FORMAT,
filename=logging_filename,
filemode='a'
)
sys.excepthook = log_uncaught_exceptions
logger.info("Starting bot")
print("Starting bot")
template.set_default_syntax(aiogram_syntax)
response_system.core.responses.__debugging__ = settings.DEBUG
# noinspection PyUnresolvedReferences
import template_extensions
# Инициализация ботов
gls.storage = MemoryStorage()
userdata.__storage__ = gls.storage
gls.bot = aiogram.Bot(token=settings.BOT_TOKEN, parse_mode=settings.DEFAULT_PARSE_MODE)
dispatcher = aiogram.Dispatcher(gls.storage)
dispatcher.message.middleware(
response_system.middleware.MessageResponseMiddleware()
)
dispatcher.callback_query.middleware(
response_system.middleware.CallbackQueryResponseMiddleware()
)
gls.operator_bot = aiogram.Bot(token=settings.OPERATOR_BOT_TOKEN, parse_mode=settings.DEFAULT_PARSE_MODE)
operator_dispatcher = aiogram.Dispatcher(gls.storage)
operator_dispatcher.message.middleware(
response_system.middleware.MessageResponseMiddleware()
)
operator_dispatcher.callback_query.middleware(
response_system.middleware.CallbackQueryResponseMiddleware()
)
# Инициализация клиента qiwi
gls.qiwi = QiwiP2PClient(secret_p2p=settings.PAYMENTS_TOKEN)
# Инициализация подключения к базе данных
gls.db = peewee.PostgresqlDatabase(settings.DATABASE_URI)
gls.BaseModel = get_BaseModel(gls.db)
ezqr.set_default_db(gls.db)
# Подключаем router-ы
from apps.routers import routers
for router in routers:
dispatcher.include_router(router)
from apps.routers import operator_routers
for router in operator_routers:
operator_dispatcher.include_router(router)
@dispatcher.callback_query(any_state, aiogram.F.data == 'delete-this')
@operator_dispatcher.callback_query(any_state, aiogram.F.data == 'delete-this')
async def delete_this_handler(_):
""" Handler для удаления сообщения, которое он обрабатывает """
return response_system.delete()
# Разрешаем циклические зависимости в базе данных
for model in gls.BaseModel.__subclasses__():
peewee.DeferredForeignKey.resolve(model)
# Инициализация событий
# noinspection PyUnresolvedReferences
import events
# Запускаем ботов
await asyncio.gather(
dispatcher.start_polling(gls.bot),
operator_dispatcher.start_polling(gls.operator_bot)
)
if __name__ == '__main__':
asyncio.run(main())