Skip to content

Commit

Permalink
Add filter for resolved reports
Browse files Browse the repository at this point in the history
  • Loading branch information
Lamroy95 committed Nov 22, 2023
1 parent 69c8878 commit 5ab9c74
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
16 changes: 16 additions & 0 deletions app/filters/reports.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from aiogram import types
from aiogram.filters import BaseFilter

from app.infrastructure.database.models import Chat
from app.infrastructure.database.repo.report import ReportRepo


class HasResolvedReport(BaseFilter):
"""Check if reported message already resolved report"""

async def __call__(
self, message: types.Message, chat: Chat, report_repo: ReportRepo
) -> bool:
return await report_repo.has_resolved_report(
chat_id=chat.chat_id, message_id=message.reply_to_message.message_id
)
31 changes: 30 additions & 1 deletion app/handlers/moderator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
HasTargetFilter,
TargetHasPermissions,
)
from app.filters.reports import HasResolvedReport
from app.handlers import keyboards as kb
from app.infrastructure.database.models import Chat, ChatSettings, ReportStatus, User
from app.infrastructure.database.repo.report import ReportRepo
Expand Down Expand Up @@ -48,6 +49,7 @@
@router.message(
F.chat.type.in_(["group", "supergroup"]),
HasTargetFilter(),
~HasResolvedReport(),
Command("report", "admin", "spam", prefix="/!@"),
)
async def report_message(
Expand All @@ -59,9 +61,10 @@ async def report_message(
report_repo: ReportRepo,
):
logger.info(
"user {user} report for message {message}",
"User {user} reported message {message} in chat {chat}",
user=message.from_user.id,
message=message.message_id,
chat=message.chat.id,
)
answer_message = "Спасибо за сообщение. Мы обязательно разберёмся"
admins_mention = await get_mentions_admins(message.chat, bot)
Expand All @@ -82,6 +85,17 @@ async def report_message(
await set_report_bot_reply(report, bot_reply, report_repo)


@router.message(
F.chat.type.in_(["group", "supergroup"]),
HasTargetFilter(),
HasResolvedReport(),
Command("report", "admin", "spam", prefix="/!@"),
)
async def report_already_reported(message: types.Message):
reply = await message.reply("Сообщение уже было рассмотрено ранее")
asyncio.create_task(cleanup_command_dialog(reply, True, delay=60))


@router.message(
F.chat.type == "private",
Command("report", "admin", "spam", prefix="/!@"),
Expand Down Expand Up @@ -306,6 +320,11 @@ async def approve_report_handler(
chat_settings: ChatSettings,
report_repo: ReportRepo,
):
logger.info(
"Moderator {moderator} approved report {report}",
moderator=callback_query.from_user.id,
report=callback_data.report_id,
)
first_report, *linked_reports = await resolve_report(
report_id=callback_data.report_id,
resolved_by=user,
Expand Down Expand Up @@ -350,6 +369,11 @@ async def decline_report_handler(
bot: Bot,
report_repo: ReportRepo,
):
logger.info(
"Moderator {moderator} declined report {report}",
moderator=callback_query.from_user.id,
report=callback_data.report_id,
)
first_report, *linked_reports = await resolve_report(
report_id=callback_data.report_id,
resolved_by=user,
Expand All @@ -371,6 +395,11 @@ async def cancel_report_handler(
user: User,
report_repo: ReportRepo,
):
logger.info(
"User {user} cancelled report {report}",
user=callback_query.from_user.id,
report=callback_data.report_id,
)
await cancel_report(
report_id=callback_data.report_id,
resolved_by=user,
Expand Down
13 changes: 13 additions & 0 deletions app/infrastructure/database/repo/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,18 @@ async def get_linked_pending_reports(self, report_id: int) -> Iterable[Report]:
)
.prefetch_related("chat", "reporter")
.order_by("created_time")
.using_db(self.session)
.all()
)

async def has_resolved_report(self, chat_id: int, message_id: int) -> bool:
"""Return True, if provided message has reports with status Approved or Declined"""
return await (
Report.filter(
chat__chat_id=chat_id,
reported_message_id=message_id,
status__in=[ReportStatus.APPROVED.value, ReportStatus.DECLINED.value],
)
.using_db(self.session)
.exists()
)

0 comments on commit 5ab9c74

Please sign in to comment.