Source code for spotted.handlers.report_spot

"""report callback"""

from telegram import Update
from telegram.error import Forbidden
from telegram.ext import (
    CallbackContext,
    CallbackQueryHandler,
    CommandHandler,
    ConversationHandler,
    MessageHandler,
    filters,
)

from spotted.data import Config, Report, User
from spotted.utils import EventInfo, conv_cancel

from .constants import INVALID_MESSAGE_TYPE_ERROR, ConversationState


[docs] def report_spot_conv_handler() -> ConversationHandler: """Creates the report (user) conversation handler. The states are: - reporting_spot: submit the reason of the report. Expects text Returns: conversation handler """ return ConversationHandler( entry_points=[CallbackQueryHandler(report_spot_callback, pattern=r"^report\.*")], states={ ConversationState.REPORTING_SPOT.value: [ MessageHandler(~filters.COMMAND & ~filters.UpdateType.EDITED_MESSAGE & filters.TEXT, report_spot_msg) ], }, fallbacks=[CommandHandler("cancel", conv_cancel("report"))], allow_reentry=False, per_chat=False, )
[docs] async def report_spot_callback(update: Update, context: CallbackContext) -> int: """Handles the report callback. Args: update: update event context: context passed by the handler Returns: next state of the conversation """ info = EventInfo.from_callback(update, context) abusive_message_id = info.message.reply_to_message.message_id if Config.post_get("comments") else info.message_id report = Report.get_post_report(user_id=info.user_id, channel_id=info.chat_id, c_message_id=abusive_message_id) user = User(info.user_id) if user.is_banned: await info.answer_callback_query(text="Sei stato bannato, non puoi segnalare post") return ConversationState.END.value if report is not None: # this user has already reported this post await info.answer_callback_query(text="Hai già segnalato questo post") return ConversationState.END.value try: await info.bot.forward_message(chat_id=info.user_id, from_chat_id=info.chat_id, message_id=abusive_message_id) await info.bot.send_message( chat_id=info.user_id, text="Scrivi il motivo della segnalazione del post, altrimenti digita /cancel" ) await info.answer_callback_query(text="Segnala in privato tramite il bot") except Forbidden: await info.answer_callback_query( text=f"Assicurati di aver avviato la chat con {Config.settings_get('bot_tag')}" ) return ConversationState.END.value info.user_data["current_post_reported"] = f"{info.chat_id},{abusive_message_id}" return ConversationState.REPORTING_SPOT.value
[docs] async def report_spot_msg(update: Update, context: CallbackContext) -> int: """Handles the reply to the key "Report". Checks the message the user wants to report, and goes to the final step Args: update: update event context: context passed by the handler Returns: next state of the conversation """ info = EventInfo.from_message(update, context) if not info.is_private_chat: return ConversationState.REPORTING_SPOT.value if not info.is_valid_message_type: # the type is NOT supported await info.bot.send_message(chat_id=info.chat_id, text=INVALID_MESSAGE_TYPE_ERROR) return ConversationState.REPORTING_SPOT.value if context.user_data is None or "current_post_reported" not in context.user_data: return ConversationState.END.value chat_id = Config.post_get("admin_group_id") # should be admin group channel_id, target_message_id = context.user_data["current_post_reported"].split(",") await info.bot.forward_message(chat_id=chat_id, from_chat_id=channel_id, message_id=target_message_id) admin_message = await info.bot.sendMessage(chat_id=chat_id, text="🚨🚨 SEGNALAZIONE 🚨🚨\n\n" + info.text) await info.bot.send_message( chat_id=info.chat_id, text="Gli admins verificheranno quanto accaduto. Grazie per la collaborazione!" ) Report.create_post_report( user_id=info.user_id, channel_id=channel_id, c_message_id=target_message_id, admin_message=admin_message ) return ConversationState.END.value