diff --git a/flanabot/bots/flana_bot.py b/flanabot/bots/flana_bot.py
index 8026116..f36fe85 100644
--- a/flanabot/bots/flana_bot.py
+++ b/flanabot/bots/flana_bot.py
@@ -15,7 +15,7 @@ import plotly.graph_objects
import pymongo
from flanaapis import InstagramLoginError, MediaNotFoundError, Place, PlaceNotFoundError, WeatherEmoji, instagram, tiktok, twitter
from flanautils import Media, MediaType, NotFoundError, OrderedSet, Source, TimeUnits, TraceMetadata, return_if_first_empty
-from multibot import Action, BadRoleError, BotAction, MultiBot, SendError, User, admin, bot_mentioned, constants as multibot_constants, group, ignore_self_message, inline, reply
+from multibot import Action, BadRoleError, BotAction, ButtonsGroup, MultiBot, SendError, User, admin, bot_mentioned, constants as multibot_constants, group, ignore_self_message, inline, reply
from flanabot import constants
from flanabot.models import Chat, Message, Punishment, WeatherChart
@@ -37,6 +37,10 @@ class FlanaBot(MultiBot, ABC):
self.register(self._on_bye, multibot_constants.KEYWORDS['bye'])
+ self.register(self._on_choose, constants.KEYWORDS['choose'])
+ self.register(self._on_choose, constants.KEYWORDS['random'])
+ self.register(self._on_choose, (constants.KEYWORDS['choose'], constants.KEYWORDS['random']))
+
self.register(self._on_config_list_show, multibot_constants.KEYWORDS['config'])
self.register(self._on_config_list_show, (multibot_constants.KEYWORDS['show'], multibot_constants.KEYWORDS['config']))
@@ -79,6 +83,8 @@ class FlanaBot(MultiBot, ABC):
self.register(self._on_delete_original_config_show, (multibot_constants.KEYWORDS['delete'], multibot_constants.KEYWORDS['message'], multibot_constants.KEYWORDS['config']))
self.register(self._on_delete_original_config_show, (multibot_constants.KEYWORDS['show'], multibot_constants.KEYWORDS['delete'], multibot_constants.KEYWORDS['message'], multibot_constants.KEYWORDS['config']))
+ self.register(self._on_dice, constants.KEYWORDS['dice'])
+
self.register(self._on_hello, multibot_constants.KEYWORDS['hello'])
self.register(self._on_new_message_default, default=True)
@@ -88,6 +94,10 @@ class FlanaBot(MultiBot, ABC):
self.register(self._on_no_delete_original, (multibot_constants.KEYWORDS['negate'], multibot_constants.KEYWORDS['delete'], multibot_constants.KEYWORDS['message']))
self.register(self._on_no_delete_original, (multibot_constants.KEYWORDS['deactivate'], multibot_constants.KEYWORDS['delete'], multibot_constants.KEYWORDS['message']))
+ self.register(self._on_poll, constants.KEYWORDS['poll'])
+
+ self.register_button(self._on_poll_button_press, ButtonsGroup.POLL)
+
self.register(self._on_punish, constants.KEYWORDS['punish'])
self.register(self._on_punish, (multibot_constants.KEYWORDS['deactivate'], constants.KEYWORDS['unpunish']))
self.register(self._on_punish, (multibot_constants.KEYWORDS['deactivate'], multibot_constants.KEYWORDS['permission']))
@@ -131,8 +141,8 @@ class FlanaBot(MultiBot, ABC):
self.register(self._on_weather_chart_config_show, (constants.KEYWORDS['weather_chart'], multibot_constants.KEYWORDS['config']))
self.register(self._on_weather_chart_config_show, (multibot_constants.KEYWORDS['show'], constants.KEYWORDS['weather_chart'], multibot_constants.KEYWORDS['config']))
- self.register_button(self._on_config_button_press, list(Chat.DEFAULT_CONFIG.keys()))
- self.register_button(self._on_weather_button_press, WeatherEmoji.values)
+ self.register_button(self._on_config_button_press, ButtonsGroup.CONFIG)
+ self.register_button(self._on_weather_button_press, ButtonsGroup.WEATHER)
async def _change_config(self, config_name: str, message: Message, value: bool = None):
if value is None:
@@ -174,18 +184,6 @@ class FlanaBot(MultiBot, ABC):
else:
await self.send(f'Castigado durante {TimeUnits(seconds=punishment_seconds).to_words()}.', message)
- @staticmethod
- def _get_config_buttons(config: dict | Chat | Message) -> list[list[str]]:
- match config:
- case Chat() as chat:
- config = chat.config
- case Message() as message:
- config = message.chat.config
-
- buttons_texts = [f"{'✔' if v else '❌'} {k}" for k, v in config.items()]
- # noinspection PyTypeChecker
- return flanautils.chunks(buttons_texts, 3)
-
@return_if_first_empty(exclude_self_types='FlanaBot', globals_=globals())
async def _manage_exceptions(self, exceptions: BaseException | Iterable[BaseException], context: Chat | Message):
if not isinstance(exceptions, Iterable):
@@ -296,20 +294,33 @@ class FlanaBot(MultiBot, ABC):
if not message.chat.is_group or self.is_bot_mentioned(message):
await self.send_bye(message)
+ @bot_mentioned
+ async def _on_choose(self, message: Message):
+ discarded_words = {*constants.KEYWORDS['choose'], *constants.KEYWORDS['random'], self.name, f'<@{self.id}>'}
+ if final_words := [word for word in message.text.split() if word.lower() not in discarded_words]:
+ await self.send(random.choice(final_words), message)
+ else:
+ await self.send(random.choice(('¿Que elija el qué?', '¿Y las opciones?', '?', '🤔')), message)
+
async def _on_config_button_press(self, message: Message):
await self._accept_button_event(message)
- if not message.button_pressed_user.is_admin or 'auto_' not in (config := message.button_pressed_text.split()[1]):
+ if not message.buttons_info.presser_user.is_admin:
return
+ config = message.buttons_info.pressed_text.split()[1]
message.chat.config[config] = not message.chat.config[config]
+ pressed_button = message.buttons_info[message.buttons_info.pressed_text]
+ pressed_button.is_checked = not pressed_button.is_checked
+ pressed_button.text = f"{'✔' if pressed_button.is_checked else '❌'} {config}"
- await self.edit('Estos son los ajustes del grupo:\n\n', self._get_config_buttons(message), message)
+ await self.edit('Estos son los ajustes del grupo:\n\n', message.buttons_info.buttons, message)
@group
@bot_mentioned
async def _on_config_list_show(self, message: Message):
- await self.send('Estos son los ajustes del grupo:\n\n', self._get_config_buttons(message), message)
+ buttons_texts = [(f"{'✔' if v else '❌'} {k}", v) for k, v in message.chat.config.items()]
+ await self.send('Estos son los ajustes del grupo:\n\n', flanautils.chunks(buttons_texts, 3), message, buttons_key=ButtonsGroup.CONFIG)
async def _on_covid_chart(self, message: Message): # todo2
pass
@@ -365,6 +376,13 @@ class FlanaBot(MultiBot, ABC):
async def _on_delete_original_config_show(self, message: Message):
await self._show_config('auto_delete_original', message)
+ @bot_mentioned
+ async def _on_dice(self, message: Message):
+ if top_number := flanautils.sum_numbers_in_text(message.text):
+ await self.send(random.randint(1, top_number), message)
+ else:
+ await self.send(random.choice(('¿De cuántas caras?', '¿Y el número?', '?', '🤔')), message)
+
async def _on_hello(self, message: Message):
if not message.chat.is_group or self.is_bot_mentioned(message):
await self.send_hello(message)
@@ -410,6 +428,18 @@ class FlanaBot(MultiBot, ABC):
if not await self._on_scraping(message, delete_original=False):
await self._on_recover_message(message)
+ @bot_mentioned
+ async def _on_poll(self, message: Message):
+ discarded_words = {*constants.KEYWORDS['poll'], self.name, f'<@{self.id}>'}
+ if final_words := [word for word in message.text.split() if word.lower() not in discarded_words]:
+ await self.send(flanautils.chunks(final_words, 1), message, buttons_key=ButtonsGroup.POLL)
+ else:
+ await self.send(random.choice(('¿Y las opciones?', '?', '🤔')), message)
+
+ async def _on_poll_button_press(self, message: Message):
+ await self._accept_button_event(message)
+ ...
+
@bot_mentioned
@group
@admin(send_negative=True)
@@ -523,7 +553,7 @@ class FlanaBot(MultiBot, ABC):
async def _on_weather_button_press(self, message: Message):
await self._accept_button_event(message)
- match message.button_pressed_text:
+ match message.buttons_info.pressed_text:
case WeatherEmoji.ZOOM_IN.value:
message.weather_chart.zoom_in()
case WeatherEmoji.ZOOM_OUT.value:
@@ -676,6 +706,7 @@ class FlanaBot(MultiBot, ABC):
[WeatherEmoji.HUMIDITY.value, WeatherEmoji.PRECIPITATION_PROBABILITY.value, WeatherEmoji.PRECIPITATION_VOLUME.value, WeatherEmoji.PRESSURE.value, WeatherEmoji.WIND_SPEED.value]
],
message,
+ buttons_key=ButtonsGroup.WEATHER,
send_as_file=False
)
await self.send_inline_results(message)
diff --git a/flanabot/constants.py b/flanabot/constants.py
index 59f5b41..5519474 100644
--- a/flanabot/constants.py
+++ b/flanabot/constants.py
@@ -85,16 +85,20 @@ INSULTS = (
)
KEYWORDS = {
+ 'choose': ('choose', 'elige'),
'covid_chart': ('case', 'caso', 'contagiado', 'contagio', 'corona', 'coronavirus', 'covid', 'covid19', 'death',
'disease', 'enfermedad', 'enfermos', 'fallecido', 'incidencia', 'jacovid', 'mascarilla', 'muerte',
'muerto', 'pandemia', 'sick', 'virus'),
'currency_chart': ('argentina', 'bitcoin', 'cardano', 'cripto', 'crypto', 'criptodivisa', 'cryptodivisa',
'cryptomoneda', 'cryptocurrency', 'currency', 'dinero', 'divisa', 'ethereum', 'inversion',
'moneda', 'pasta'),
+ 'dice': ('dado', 'dice'),
+ 'poll': ('encuesta', 'poll', 'quiz'),
'punish': ('acaba', 'aprende', 'ataca', 'atalo', 'azota', 'boss', 'castiga', 'castigo', 'condena', 'controla',
'destroy', 'destroza', 'duro', 'ejecuta', 'enseña', 'escarmiento', 'execute', 'finish', 'fuck', 'fusila',
'hell', 'humos', 'infierno', 'jefe', 'jode', 'learn', 'leccion', 'lesson', 'manda', 'purgatorio',
'sancion', 'shoot', 'teach', 'termina', 'whip'),
+ 'random': ('aleatorio', 'azar', 'random'),
'scraping': ('api', 'aqui', 'busca', 'contenido', 'content', 'descarga', 'descargar', 'download', 'envia', 'habia',
'media', 'redes', 'scrap', 'scraping', 'search', 'send', 'social', 'sociales', 'tenia', 'video',
'videos'),
diff --git a/flanabot/models/message.py b/flanabot/models/message.py
index b737761..2bbb10e 100644
--- a/flanabot/models/message.py
+++ b/flanabot/models/message.py
@@ -15,7 +15,6 @@ from flanabot.models.weather_chart import WeatherChart
@dataclass(eq=False)
class Message(MultiBotMessage):
author: User = None
- button_pressed_user: User = None
mentions: Iterable[User] = field(default_factory=list)
chat: Chat = None
replied_message: Message = None