diff --git a/flanabot/bots/flana_bot.py b/flanabot/bots/flana_bot.py
index 7090d5a..e6f9b1d 100644
--- a/flanabot/bots/flana_bot.py
+++ b/flanabot/bots/flana_bot.py
@@ -11,7 +11,7 @@ import pymongo
import pytz
from flanaapis import InstagramLoginError, MediaNotFoundError, PlaceNotFoundError
from flanautils import return_if_first_empty
-from multibot import BadRoleError, MultiBot, Role, bot_mentioned, constants as multibot_constants, group, inline, owner
+from multibot import BadRoleError, MultiBot, RegisteredCallback, Role, bot_mentioned, constants as multibot_constants, group, inline, owner
from flanabot import constants
from flanabot.bots.connect_4_bot import Connect4Bot
@@ -30,12 +30,19 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
Chat = Chat
Message = Message
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.tunnel_chat = None
+ self.owner_chat = None
+
# -------------------------------------------------------- #
# ------------------- PROTECTED METHODS ------------------ #
# -------------------------------------------------------- #
def _add_handlers(self):
super()._add_handlers()
+ self.register(self._on_activate_tunnel, (multibot_constants.KEYWORDS['activate'], constants.KEYWORDS['tunnel']))
+
self.register(self._on_bye, multibot_constants.KEYWORDS['bye'])
self.register(self._on_config, multibot_constants.KEYWORDS['config'])
@@ -45,6 +52,8 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
self.register(self._on_database_messages_simple, (multibot_constants.KEYWORDS['last'], multibot_constants.KEYWORDS['message'], multibot_constants.KEYWORDS['simple']))
+ self.register(self._on_deactivate_tunnel, (multibot_constants.KEYWORDS['deactivate'], constants.KEYWORDS['tunnel']))
+
self.register(self._on_delete, multibot_constants.KEYWORDS['delete'])
self.register(self._on_delete, (multibot_constants.KEYWORDS['delete'], multibot_constants.KEYWORDS['message']))
@@ -63,6 +72,8 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
self.register(self._on_roles, (multibot_constants.KEYWORDS['activate'], multibot_constants.KEYWORDS['role']))
self.register(self._on_roles, (multibot_constants.KEYWORDS['deactivate'], multibot_constants.KEYWORDS['role']))
+ self.register(self._on_tunnel_message, always=True)
+
self.register(self._on_users, multibot_constants.KEYWORDS['user'])
self.register_button(self._on_config_button_press, ButtonsGroup.CONFIG)
@@ -122,6 +133,21 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
# ---------------------------------------------- #
# HANDLERS #
# ---------------------------------------------- #
+ async def _on_activate_tunnel(self, message: Message):
+ keywords = (*multibot_constants.KEYWORDS['activate'], *constants.KEYWORDS['tunnel'])
+ try:
+ chat_id_or_name = next(part for part in flanautils.remove_accents(message.text.lower()).split() if not flanautils.cartesian_product_string_matching(part, keywords, multibot_constants.PARSER_MIN_SCORE_DEFAULT))
+ except StopIteration:
+ return
+
+ chat_id_or_name = flanautils.cast_number(chat_id_or_name, raise_exception=False)
+ if (chat := await self.get_chat(chat_id_or_name)) or (chat := await self.get_chat(await self.get_user(chat_id_or_name))):
+ self.tunnel_chat = chat
+ self.owner_chat = await self.get_chat(self.owner_id) or await self.get_chat(await self.get_user(self.owner_id))
+ await self.send(f"Túnel abierto con {chat.name}{f' ({chat.group_name})' if chat.group_name else ''}.", message)
+ else:
+ await self.send_error('Chat inválido.', message)
+
async def _on_bye(self, message: Message):
if message.chat.is_private or self.is_bot_mentioned(message):
await self.send_bye(message)
@@ -193,6 +219,11 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
async def _on_database_messages_simple(self, message: Message):
await self._on_database_messages(message, simple=True)
+ async def _on_deactivate_tunnel(self, message: Message):
+ self.tunnel_chat = None
+ self.owner_chat = None
+ await self.send('Túnel desactivado.', message)
+
@inline(False)
async def _on_delete(self, message: Message):
if message.replied_message:
@@ -350,6 +381,28 @@ class FlanaBot(Connect4Bot, PenaltyBot, PollBot, ScraperBot, UberEatsBot, Weathe
message.buttons_info.presser_user.save()
+ async def _on_tunnel_message(self, message: Message):
+ if (
+ not self.tunnel_chat
+ or
+ self._parse_callbacks(
+ message.text,
+ [
+ RegisteredCallback(..., (multibot_constants.KEYWORDS['activate'], constants.KEYWORDS['tunnel'])),
+ RegisteredCallback(..., (multibot_constants.KEYWORDS['deactivate'], constants.KEYWORDS['tunnel']))
+ ]
+ )
+ ):
+ return
+
+ if message.chat.is_private and message.author.id == self.owner_id:
+ if message.text:
+ await self.send(message.text, self.tunnel_chat)
+ else:
+ await self.send('No puedo enviar un mensaje sin texto.', self.tunnel_chat)
+ elif message.chat == self.tunnel_chat:
+ await self.send(message.text if message.text else '', self.owner_chat)
+
@group
@bot_mentioned
async def _on_users(self, message: Message):