mirror of
https://github.com/MrSedan/neuro-reply-bot-reworked.git
synced 2026-01-14 21:49:42 +03:00
Finally fixed media groups
This commit is contained in:
@@ -9,6 +9,7 @@ from handlers.message_handlers.post_command import PostCommand
|
|||||||
from handlers.message_handlers.reply_to_user import ReplyToUserCommand
|
from handlers.message_handlers.reply_to_user import ReplyToUserCommand
|
||||||
from handlers.message_handlers.settings_command import SettingsCommand
|
from handlers.message_handlers.settings_command import SettingsCommand
|
||||||
from handlers.message_handlers.update_settings import UpdateSettingsCommand
|
from handlers.message_handlers.update_settings import UpdateSettingsCommand
|
||||||
|
from handlers.middlewares.media_group import MediaGroupMiddleware
|
||||||
from handlers.middlewares.user import AdminMiddleware
|
from handlers.middlewares.user import AdminMiddleware
|
||||||
from neuroapi.types import BotSettings as BotSettingsType
|
from neuroapi.types import BotSettings as BotSettingsType
|
||||||
|
|
||||||
@@ -24,9 +25,12 @@ class AdminCommands(Handler):
|
|||||||
InfoCommand,
|
InfoCommand,
|
||||||
(UpdateSettingsCommand, PostCommand(self.bot).handler),
|
(UpdateSettingsCommand, PostCommand(self.bot).handler),
|
||||||
EditCommand,
|
EditCommand,
|
||||||
NewPostCommand,
|
|
||||||
NewPostSoloCommand,
|
|
||||||
PostCommand,
|
PostCommand,
|
||||||
SettingsCommand,
|
SettingsCommand,
|
||||||
|
])
|
||||||
|
self.router.message.middleware(MediaGroupMiddleware())
|
||||||
|
self.add_handlers([
|
||||||
|
NewPostCommand,
|
||||||
|
NewPostSoloCommand,
|
||||||
ReplyToUserCommand
|
ReplyToUserCommand
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,22 +1,11 @@
|
|||||||
from aiogram import types
|
from aiogram import types
|
||||||
from aiogram.filters import Filter
|
from aiogram.filters import Filter
|
||||||
|
|
||||||
from neuroapi import neuroapi
|
|
||||||
|
|
||||||
|
|
||||||
class NewPostFilter(Filter):
|
class NewPostFilter(Filter):
|
||||||
async def __call__(self, message: types.Message) -> bool:
|
async def __call__(self, message: types.Message) -> bool:
|
||||||
if message.media_group_id is None or message.content_type != 'photo':
|
if message.media_group_id is None or message.content_type != 'photo':
|
||||||
return False
|
return False
|
||||||
# if (message.caption and message.caption.startswith('/newpost '))
|
|
||||||
# try:
|
|
||||||
# await neuroapi.post.get_by_media_group_id(message.media_group_id)
|
|
||||||
# except:
|
|
||||||
# if not (message.caption.startswith('/newpost ') if message.caption else False):
|
|
||||||
# return False
|
|
||||||
# await neuroapi.post.new(message.caption.replace(
|
|
||||||
# '/newpost ', ''), str(message.from_user.id), str(message.media_group_id), message.caption_entities)
|
|
||||||
# await message.answer('Пост успешно добавлен!')
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
from aiogram import types
|
from aiogram import types
|
||||||
|
|
||||||
import neuroapi.types as neuroTypes
|
|
||||||
from handlers.filters.new_post import NewPostFilter, NewSoloPostFilter
|
from handlers.filters.new_post import NewPostFilter, NewSoloPostFilter
|
||||||
from neuroapi import neuroapi
|
from neuroapi import neuroapi
|
||||||
|
|
||||||
@@ -9,13 +10,17 @@ from .handler import MessageHandlerABC
|
|||||||
|
|
||||||
class NewPostCommand(MessageHandlerABC):
|
class NewPostCommand(MessageHandlerABC):
|
||||||
filter = NewPostFilter()
|
filter = NewPostFilter()
|
||||||
async def _command(self, message: types.Message):
|
async def _command(self, message: types.Message, album: List[types.Message]):
|
||||||
created = await neuroapi.image.add(str(message.from_user.id), message.photo[-1].file_id, message.has_media_spoiler, message.message_id, message.caption if message.caption else '', message.media_group_id, message.caption_entities, message)
|
sorted_album = sorted(album, key=lambda x: x.message_id)
|
||||||
if created: await message.answer('Пост успешно добавлен!')
|
if (not sorted_album[0].caption.startswith('/newpost ') if sorted_album[0].caption else True):
|
||||||
|
return
|
||||||
|
for mes in sorted_album:
|
||||||
|
await neuroapi.image.add(str(message.from_user.id), mes.photo[-1].file_id, mes.has_media_spoiler, mes.message_id, mes.caption if mes.caption else '', mes.media_group_id, mes.caption_entities, mes)
|
||||||
|
await message.answer(f'Пост успешно добавлен!')
|
||||||
|
|
||||||
|
|
||||||
class NewPostSoloCommand(MessageHandlerABC):
|
class NewPostSoloCommand(MessageHandlerABC):
|
||||||
filter = NewSoloPostFilter()
|
filter = NewSoloPostFilter()
|
||||||
async def _command(self, message: types.Message):
|
async def _command(self, message: types.Message):
|
||||||
#FIXME: Починить добавление постов с одной картинкой, выводит ошибку на /info
|
await neuroapi.image.add(str(message.from_user.id), message.photo[-1].file_id, message.has_media_spoiler, message.message_id, message.caption, None, message.caption_entities, message)
|
||||||
await neuroapi.image.add(str(message.from_user.id), message.photo[-1].file_id, message.has_media_spoiler, message.message_id, message.caption, None, message.caption_entities)
|
|
||||||
await message.answer('Пост успешно добавлен!')
|
await message.answer('Пост успешно добавлен!')
|
||||||
@@ -14,7 +14,6 @@ class PostCommand(MessageHandlerABC):
|
|||||||
settings = neuroTypes.BotSettings.get_instance()
|
settings = neuroTypes.BotSettings.get_instance()
|
||||||
try:
|
try:
|
||||||
post = await neuroapi.post.get_post_to_post()
|
post = await neuroapi.post.get_post_to_post()
|
||||||
print(post)
|
|
||||||
if (post):
|
if (post):
|
||||||
images = MediaGroupBuilder(
|
images = MediaGroupBuilder(
|
||||||
caption=post.text + '\n\nПредложка: @neur0w0men_reply_bot', caption_entities=post.message_entities)
|
caption=post.text + '\n\nПредложка: @neur0w0men_reply_bot', caption_entities=post.message_entities)
|
||||||
|
|||||||
35
handlers/middlewares/media_group.py
Normal file
35
handlers/middlewares/media_group.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import asyncio
|
||||||
|
from typing import Any, Awaitable, Callable, Dict, List, Union
|
||||||
|
|
||||||
|
from aiogram import BaseMiddleware, types
|
||||||
|
from aiogram.types import Message, TelegramObject
|
||||||
|
|
||||||
|
DEFAULT_DELAY = .6
|
||||||
|
class MediaGroupMiddleware(BaseMiddleware):
|
||||||
|
"""Middleware for handling telegram media groups
|
||||||
|
|
||||||
|
Big thanks to https://github.com/WhiteMemory99 for this
|
||||||
|
"""
|
||||||
|
ALBUM_DATA: Dict[str, List[Message]] = {}
|
||||||
|
|
||||||
|
def __init__(self, delay: Union[int, float] = DEFAULT_DELAY):
|
||||||
|
self.delay = delay
|
||||||
|
|
||||||
|
async def __call__(
|
||||||
|
self,
|
||||||
|
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
|
||||||
|
event: Message,
|
||||||
|
data: Dict[str, Any],
|
||||||
|
) -> Any:
|
||||||
|
if not event.media_group_id:
|
||||||
|
return await handler(event, data)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.ALBUM_DATA[event.media_group_id].append(event)
|
||||||
|
return # Don't propagate the event
|
||||||
|
except KeyError:
|
||||||
|
self.ALBUM_DATA[event.media_group_id] = [event]
|
||||||
|
await asyncio.sleep(self.delay)
|
||||||
|
data["album"] = self.ALBUM_DATA.pop(event.media_group_id)
|
||||||
|
|
||||||
|
return await handler(event, data)
|
||||||
1
main.py
1
main.py
@@ -16,7 +16,6 @@ from neuroapi.types import NeuroApiBot
|
|||||||
|
|
||||||
async def delay_bot()->None:
|
async def delay_bot()->None:
|
||||||
config = Config()
|
config = Config()
|
||||||
print(config)
|
|
||||||
if config.token is None or config.token == '':
|
if config.token is None or config.token == '':
|
||||||
logging.warning('Delay bot needs token in environment')
|
logging.warning('Delay bot needs token in environment')
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -33,4 +33,3 @@ class Image(ApiMethod):
|
|||||||
data = await response.json()
|
data = await response.json()
|
||||||
if 'statusCode' in data:
|
if 'statusCode' in data:
|
||||||
raise Exception(data['message'])
|
raise Exception(data['message'])
|
||||||
return data['created']
|
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ class Post(ApiMethod):
|
|||||||
return neuroTypes.Post.from_dict(data)
|
return neuroTypes.Post.from_dict(data)
|
||||||
|
|
||||||
async def get_by_media_group_id(self, media_group_id: str):
|
async def get_by_media_group_id(self, media_group_id: str):
|
||||||
response = requests.get(
|
async with ClientSession() as session:
|
||||||
self.api_url+f'/post/get-by-media-group-id/{media_group_id}')
|
response = await session.get(self.api_url+f'/post/get-by-media-group-id/{media_group_id}')
|
||||||
data = response.json()
|
data = await response.json()
|
||||||
if 'statusCode' in data:
|
if 'statusCode' in data:
|
||||||
raise Exception(data['message'])
|
raise Exception(data['message'])
|
||||||
return neuroTypes.Post.from_dict(data)
|
return neuroTypes.Post.from_dict(data)
|
||||||
|
|||||||
@@ -34,5 +34,4 @@ class Post(ApiModel):
|
|||||||
obj = super().to_dict()
|
obj = super().to_dict()
|
||||||
obj['message_entities'] = json.dumps(obj['message_entities'])
|
obj['message_entities'] = json.dumps(obj['message_entities'])
|
||||||
obj['media_group_id'] = str(obj['media_group_id'])
|
obj['media_group_id'] = str(obj['media_group_id'])
|
||||||
print(obj)
|
|
||||||
return obj
|
return obj
|
||||||
Reference in New Issue
Block a user