Правки по ruff + mypy

This commit is contained in:
Денис Семёнов 2025-07-25 00:52:16 +03:00
parent 8f93cf36e4
commit 354c296fed
41 changed files with 166 additions and 96 deletions

View File

@ -70,7 +70,8 @@ class BaseConnection:
- dict (если is_return_raw=True) - dict (если is_return_raw=True)
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
if not self.bot.session: if not self.bot.session:
self.bot.session = ClientSession( self.bot.session = ClientSession(
@ -100,7 +101,8 @@ class BaseConnection:
raw = await r.json() raw = await r.json()
if is_return_raw: return raw if is_return_raw:
return raw
model = model(**raw) # type: ignore model = model(**raw) # type: ignore

View File

@ -220,7 +220,7 @@ class Dispatcher:
continue continue
for key in kwargs.copy().keys(): for key in kwargs.copy().keys():
if not key in func_args: if key not in func_args:
del kwargs[key] del kwargs[key]
await handler.func_event(event_object, **kwargs) await handler.func_event(event_object, **kwargs)
@ -248,8 +248,11 @@ class Dispatcher:
while True: while True:
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
try: try:
events: Dict = await self.bot.get_updates() # type: ignore events: Dict = await self.bot.get_updates()
except AsyncioTimeoutError: except AsyncioTimeoutError:
continue continue
@ -260,11 +263,11 @@ class Dispatcher:
await asyncio.sleep(GET_UPDATES_RETRY_DELAY) await asyncio.sleep(GET_UPDATES_RETRY_DELAY)
continue continue
self.bot.marker_updates = events.get('marker') # type: ignore self.bot.marker_updates = events.get('marker')
processed_events = await process_update_request( processed_events = await process_update_request(
events=events, events=events,
bot=self.bot # type: ignore bot=self.bot
) )
for event in processed_events: for event in processed_events:
@ -276,7 +279,7 @@ class Dispatcher:
except Exception as e: except Exception as e:
logger_dp.error(f'Общая ошибка при обработке событий: {e.__class__} - {e}') logger_dp.error(f'Общая ошибка при обработке событий: {e.__class__} - {e}')
async def handle_webhook(self, bot: Bot, host: str = '0.0.0.0', port: int = 8080): async def handle_webhook(self, bot: Bot, host: str = '127.0.0.1', port: int = 8080):
""" """
Запускает FastAPI-приложение для приёма обновлений через вебхук. Запускает FastAPI-приложение для приёма обновлений через вебхук.
@ -288,12 +291,15 @@ class Dispatcher:
@webhook_app.post('/') @webhook_app.post('/')
async def _(request: Request): async def _(request: Request):
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
try: try:
event_json = await request.json() event_json = await request.json()
event_object = await process_update_webhook( event_object = await process_update_webhook(
event_json=event_json, event_json=event_json,
bot=self.bot # type: ignore bot=self.bot
) )
await self.handle(event_object) await self.handle(event_object)
@ -308,7 +314,7 @@ class Dispatcher:
port=port port=port
) )
async def init_serve(self, bot: Bot, host: str = '0.0.0.0', port: int = 8080, **kwargs): async def init_serve(self, bot: Bot, host: str = '127.0.0.1', port: int = 8080, **kwargs):
""" """
Запускает сервер для обработки входящих вебхуков. Запускает сервер для обработки входящих вебхуков.

View File

@ -48,7 +48,8 @@ class AddAdminChat(BaseConnection):
AddedListAdminChat: Результат операции с информацией об успешности. AddedListAdminChat: Результат операции с информацией об успешности.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}

View File

@ -45,7 +45,8 @@ class AddMembersChat(BaseConnection):
AddedMembersChat: Результат операции с информацией об успешности добавления. AddedMembersChat: Результат операции с информацией об успешности добавления.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}

View File

@ -48,14 +48,19 @@ class ChangeInfo(BaseConnection):
User: Объект с обновленными данными бота User: Объект с обновленными данными бота
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}
if self.name: json['name'] = self.name if self.name:
if self.description: json['description'] = self.description json['name'] = self.name
if self.commands: json['commands'] = [command.model_dump() for command in self.commands] if self.description:
if self.photo: json['photo'] = self.photo json['description'] = self.description
if self.commands:
json['commands'] = [command.model_dump() for command in self.commands]
if self.photo:
json['photo'] = self.photo
return await super().request( return await super().request(
method=HTTPMethod.PATCH, method=HTTPMethod.PATCH,

View File

@ -39,7 +39,8 @@ class DeleteMeFromMessage(BaseConnection):
DeletedBotFromChat: Результат операции удаления. DeletedBotFromChat: Результат операции удаления.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.DELETE, method=HTTPMethod.DELETE,
path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ME, path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ME,

View File

@ -38,7 +38,9 @@ class DeleteChat(BaseConnection):
DeletedChat: Результат операции удаления чата. DeletedChat: Результат операции удаления чата.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.DELETE, method=HTTPMethod.DELETE,
path=ApiPath.CHATS.value + '/' + str(self.chat_id), path=ApiPath.CHATS.value + '/' + str(self.chat_id),

View File

@ -40,7 +40,9 @@ class DeleteMessage(BaseConnection):
DeletedMessage: Результат операции удаления сообщения. DeletedMessage: Результат операции удаления сообщения.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['message_id'] = self.message_id params['message_id'] = self.message_id

View File

@ -38,7 +38,10 @@ class DeletePinMessage(BaseConnection):
Returns: Returns:
DeletedPinMessage: Результат операции удаления закреплённого сообщения. DeletedPinMessage: Результат операции удаления закреплённого сообщения.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.DELETE, method=HTTPMethod.DELETE,
path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.PIN, path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.PIN,

View File

@ -1,11 +1,5 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from ..methods.types.deleted_pin_message import DeletedPinMessage
from ..enums.http_method import HTTPMethod
from ..enums.api_path import ApiPath
from ..enums.upload_type import UploadType
from ..connection.base import BaseConnection from ..connection.base import BaseConnection

View File

@ -64,14 +64,16 @@ class EditChat(BaseConnection):
Chat: Обновлённый объект чата. Chat: Обновлённый объект чата.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}
if self.icon: if self.icon:
dump = self.icon.model_dump() dump = self.icon.model_dump()
counter = Counter(dump.values()) counter = Counter(dump.values())
if not None in counter or \ if None not in counter or \
not counter[None] == 2: not counter[None] == 2:
raise MaxIconParamsException( raise MaxIconParamsException(
@ -81,9 +83,12 @@ class EditChat(BaseConnection):
json['icon'] = dump json['icon'] = dump
if self.title: json['title'] = self.title if self.title:
if self.pin: json['pin'] = self.pin json['title'] = self.title
if self.notify: json['notify'] = self.notify if self.pin:
json['pin'] = self.pin
if self.notify:
json['notify'] = self.notify
return await super().request( return await super().request(
method=HTTPMethod.PATCH, method=HTTPMethod.PATCH,

View File

@ -66,14 +66,17 @@ class EditMessage(BaseConnection):
EditedMessage: Обновлённое сообщение. EditedMessage: Обновлённое сообщение.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
json: Dict[str, Any] = {'attachments': []} json: Dict[str, Any] = {'attachments': []}
params['message_id'] = self.message_id params['message_id'] = self.message_id
if not self.text is None: json['text'] = self.text if self.text is not None:
json['text'] = self.text
if self.attachments: if self.attachments:
@ -91,9 +94,12 @@ class EditMessage(BaseConnection):
else: else:
json['attachments'].append(att.model_dump()) json['attachments'].append(att.model_dump())
if not self.link is None: json['link'] = self.link.model_dump() if self.link is not None:
if not self.notify is None: json['notify'] = self.notify json['link'] = self.link.model_dump()
if not self.parse_mode is None: json['format'] = self.parse_mode.value if self.notify is not None:
json['notify'] = self.notify
if self.parse_mode is not None:
json['format'] = self.parse_mode.value
await asyncio.sleep(self.bot.after_input_media_delay) await asyncio.sleep(self.bot.after_input_media_delay)

View File

@ -39,7 +39,9 @@ class GetChatById(BaseConnection):
Chat: Объект чата с полной информацией. Chat: Объект чата с полной информацией.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.CHATS.value + '/' + str(self.id), path=ApiPath.CHATS.value + '/' + str(self.id),

View File

@ -49,7 +49,9 @@ class GetChatByLink(BaseConnection):
Chat: Объект с информацией о чате. Chat: Объект с информацией о чате.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.CHATS.value + '/' + self.link[-1], path=ApiPath.CHATS.value + '/' + self.link[-1],

View File

@ -46,7 +46,10 @@ class GetChats(BaseConnection):
Returns: Returns:
Chats: Объект с данными по списку чатов. Chats: Объект с данными по списку чатов.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['count'] = self.count params['count'] = self.count

View File

@ -42,7 +42,10 @@ class GetListAdminChat(BaseConnection):
Returns: Returns:
GettedListAdminChat: Объект с информацией о администраторах чата. GettedListAdminChat: Объект с информацией о администраторах чата.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.CHATS.value + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ADMINS, path=ApiPath.CHATS.value + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ADMINS,

View File

@ -32,7 +32,10 @@ class GetMe(BaseConnection):
Returns: Returns:
User: Объект пользователя с полной информацией. User: Объект пользователя с полной информацией.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.ME, path=ApiPath.ME,

View File

@ -42,7 +42,10 @@ class GetMeFromChat(BaseConnection):
Returns: Returns:
ChatMember: Информация о боте как участнике чата. ChatMember: Информация о боте как участнике чата.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ME, path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.MEMBERS + ApiPath.ME,

View File

@ -57,14 +57,19 @@ class GetMembersChat(BaseConnection):
Returns: Returns:
GettedMembersChat: Объект с данными по участникам чата. GettedMembersChat: Объект с данными по участникам чата.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
if self.user_ids: if self.user_ids:
params['user_ids'] = ','.join([str(user_id) for user_id in self.user_ids]) params['user_ids'] = ','.join([str(user_id) for user_id in self.user_ids])
if self.marker: params['marker'] = self.marker if self.marker:
if self.count: params['marker'] = self.count params['marker'] = self.marker
if self.count:
params['marker'] = self.count
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,

View File

@ -59,10 +59,14 @@ class GetMessages(BaseConnection):
Returns: Returns:
Messages: Объект с полученными сообщениями. Messages: Объект с полученными сообщениями.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
if self.chat_id: params['chat_id'] = self.chat_id if self.chat_id:
params['chat_id'] = self.chat_id
if self.message_ids: if self.message_ids:
params['message_ids'] = ','.join(self.message_ids) params['message_ids'] = ','.join(self.message_ids)

View File

@ -37,7 +37,10 @@ class GetPinnedMessage(BaseConnection):
Returns: Returns:
GettedPin: Объект с информацией о закреплённом сообщении. GettedPin: Объект с информацией о закреплённом сообщении.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.PIN, path=ApiPath.CHATS + '/' + str(self.chat_id) + ApiPath.PIN,

View File

@ -1,8 +1,6 @@
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING, Dict from typing import TYPE_CHECKING, Dict
from ..types.updates import UpdateUnion
from ..enums.http_method import HTTPMethod from ..enums.http_method import HTTPMethod
from ..enums.api_path import ApiPath from ..enums.api_path import ApiPath
@ -45,7 +43,10 @@ class GetUpdates(BaseConnection):
Returns: Returns:
UpdateUnion: Объединённый тип данных обновлений. UpdateUnion: Объединённый тип данных обновлений.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['limit'] = self.limit params['limit'] = self.limit

View File

@ -43,7 +43,10 @@ class GetUploadURL(BaseConnection):
Returns: Returns:
GettedUploadUrl: Результат с URL для загрузки. GettedUploadUrl: Результат с URL для загрузки.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['type'] = self.type.value params['type'] = self.type.value

View File

@ -38,7 +38,10 @@ class GetVideo(BaseConnection):
Returns: Returns:
Video: Объект с информацией о видео. Video: Объект с информацией о видео.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.GET, method=HTTPMethod.GET,
path=ApiPath.VIDEOS.value + '/' + self.video_token, path=ApiPath.VIDEOS.value + '/' + self.video_token,

View File

@ -52,7 +52,10 @@ class PinMessage(BaseConnection):
Returns: Returns:
PinnedMessage: Объект с информацией о закреплённом сообщении. PinnedMessage: Объект с информацией о закреплённом сообщении.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}
json['message_id'] = self.message_id json['message_id'] = self.message_id

View File

@ -46,7 +46,10 @@ class RemoveAdmin(BaseConnection):
Returns: Returns:
RemovedAdmin: Объект с результатом отмены прав администратора. RemovedAdmin: Объект с результатом отмены прав администратора.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
return await super().request( return await super().request(
method=HTTPMethod.DELETE, method=HTTPMethod.DELETE,
path=ApiPath.CHATS + '/' + str(self.chat_id) + \ path=ApiPath.CHATS + '/' + str(self.chat_id) + \

View File

@ -54,7 +54,9 @@ class RemoveMemberChat(BaseConnection):
RemovedMemberChat: Результат удаления участника. RemovedMemberChat: Результат удаления участника.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['chat_id'] = self.chat_id params['chat_id'] = self.chat_id

View File

@ -49,7 +49,9 @@ class SendAction(BaseConnection):
Returns: Returns:
SendedAction: Результат выполнения запроса. SendedAction: Результат выполнения запроса.
""" """
assert self.bot is not None
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
json: Dict[str, Any] = {} json: Dict[str, Any] = {}

View File

@ -55,15 +55,19 @@ class SendCallback(BaseConnection):
SendedCallback: Объект с результатом отправки callback. SendedCallback: Объект с результатом отправки callback.
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
params['callback_id'] = self.callback_id params['callback_id'] = self.callback_id
json: Dict[str, Any] = {} json: Dict[str, Any] = {}
if self.message: json['message'] = self.message.model_dump() if self.message:
if self.notification: json['notification'] = self.notification json['message'] = self.message.model_dump()
if self.notification:
json['notification'] = self.notification
return await super().request( return await super().request(
method=HTTPMethod.POST, method=HTTPMethod.POST,

View File

@ -70,13 +70,17 @@ class SendMessage(BaseConnection):
SendedMessage или Error SendedMessage или Error
""" """
assert self.bot is not None if self.bot is None:
raise RuntimeError('Bot не инициализирован')
params = self.bot.params.copy() params = self.bot.params.copy()
json: Dict[str, Any] = {'attachments': []} json: Dict[str, Any] = {'attachments': []}
if self.chat_id: params['chat_id'] = self.chat_id if self.chat_id:
elif self.user_id: params['user_id'] = self.user_id params['chat_id'] = self.chat_id
elif self.user_id:
params['user_id'] = self.user_id
json['text'] = self.text json['text'] = self.text
@ -96,9 +100,13 @@ class SendMessage(BaseConnection):
else: else:
json['attachments'].append(att.model_dump()) json['attachments'].append(att.model_dump())
if not self.link is None: json['link'] = self.link.model_dump() if self.link is not None:
json['link'] = self.link.model_dump()
json['notify'] = self.notify json['notify'] = self.notify
if not self.parse_mode is None: json['format'] = self.parse_mode.value
if self.parse_mode is not None:
json['format'] = self.parse_mode.value
await asyncio.sleep(self.bot.after_input_media_delay) await asyncio.sleep(self.bot.after_input_media_delay)

View File

@ -21,4 +21,4 @@ class SendedCallback(BaseModel):
bot: Optional[Any] = Field(default=None, exclude=True) bot: Optional[Any] = Field(default=None, exclude=True)
if TYPE_CHECKING: if TYPE_CHECKING:
bot: Optional[Bot] bot: Optional[Bot] # type: ignore

View File

@ -1,8 +1,6 @@
from typing import TYPE_CHECKING, Any, List, Optional, Union from typing import TYPE_CHECKING, Any, List, Optional, Union
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from ...exceptions.download_file import NotAvailableForDownload
from ...types.attachments.upload import AttachmentUpload from ...types.attachments.upload import AttachmentUpload
from ...types.attachments.buttons import InlineButtonUnion from ...types.attachments.buttons import InlineButtonUnion
from ...types.users import User from ...types.users import User

View File

@ -20,5 +20,4 @@ class ChatButton(Button):
chat_title: Optional[str] = None chat_title: Optional[str] = None
chat_description: Optional[str] = None chat_description: Optional[str] = None
start_payload: Optional[str] = None start_payload: Optional[str] = None
chat_title: Optional[str] = None
uuid: Optional[int] = None uuid: Optional[int] = None

View File

@ -1,5 +1,3 @@
from pydantic import BaseModel
from ....enums.button_type import ButtonType from ....enums.button_type import ButtonType
from .button import Button from .button import Button

View File

@ -1,5 +1,3 @@
from typing import Optional
from ....enums.button_type import ButtonType from ....enums.button_type import ButtonType
from .button import Button from .button import Button

View File

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING, Any, Literal, Optional from typing import TYPE_CHECKING, Any, Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from ...enums.attachment import AttachmentType from ...enums.attachment import AttachmentType

View File

@ -1,16 +1,10 @@
from __future__ import annotations from __future__ import annotations
from typing import TYPE_CHECKING
import puremagic import puremagic
from ..enums.upload_type import UploadType from ..enums.upload_type import UploadType
if TYPE_CHECKING:
from io import BytesIO
class InputMedia: class InputMedia:
""" """
Класс для представления медиафайла. Класс для представления медиафайла.

View File

@ -1,4 +1,4 @@
from typing import List, Optional, TYPE_CHECKING, Union from typing import List, Optional, Union
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@ -21,12 +21,6 @@ from ..attachments.video import Video
from ..attachments.audio import Audio from ..attachments.audio import Audio
if TYPE_CHECKING:
from ...bot import Bot
from ...types.chats import Chat
from ...types.users import User
class MessageForCallback(BaseModel): class MessageForCallback(BaseModel):
""" """
@ -110,6 +104,9 @@ class MessageCallback(Update):
Результат вызова send_callback бота. Результат вызова send_callback бота.
""" """
if self.bot is None:
raise RuntimeError('Bot не инициализирован')
message = MessageForCallback() message = MessageForCallback()
message.text = new_text message.text = new_text
@ -118,7 +115,6 @@ class MessageCallback(Update):
message.notify = notify message.notify = notify
message.format = format message.format = format
assert self.bot is not None
return await self.bot.send_callback( return await self.bot.send_callback(
callback_id=self.callback.callback_id, callback_id=self.callback.callback_id,
message=message, message=message,

View File

@ -1,5 +1,5 @@
from __future__ import annotations from __future__ import annotations
from typing import Optional, TYPE_CHECKING from typing import Optional
from .update import Update from .update import Update

View File

@ -28,9 +28,9 @@ class Update(BaseModel):
chat: Optional[Any] = Field(default=None, exclude=True) chat: Optional[Any] = Field(default=None, exclude=True)
if TYPE_CHECKING: if TYPE_CHECKING:
bot: Optional[Bot] bot: Optional[Bot] # type: ignore
from_user: Optional[User] from_user: Optional[User] # type: ignore
chat: Optional[Chat] chat: Optional[Chat] # type: ignore
class Config: class Config:
arbitrary_types_allowed=True arbitrary_types_allowed=True

View File

@ -53,8 +53,10 @@ async def process_input_media(
if att.type in (UploadType.VIDEO, UploadType.AUDIO): if att.type in (UploadType.VIDEO, UploadType.AUDIO):
if upload.token is None: if upload.token is None:
assert bot.session is not None
await bot.session.close() if bot.session is not None:
await bot.session.close()
raise MaxUploadFileFailed('По неизвестной причине token не был получен') raise MaxUploadFileFailed('По неизвестной причине token не был получен')
token = upload.token token = upload.token