From 1bff1c971905522ef2aa0abb9500ee06b6900b70 Mon Sep 17 00:00:00 2001 From: Oleksandr Kozachuk Date: Sun, 17 Mar 2024 13:25:02 +0100 Subject: [PATCH] Fix reaction handling. --- fjerkroa_bot/ai_responder.py | 11 ++++++----- fjerkroa_bot/discord_bot.py | 21 +++++++++++---------- fjerkroa_bot/openai_responder.py | 5 +++-- openai_chat.dat | Bin 30440207 -> 30634819 bytes 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/fjerkroa_bot/ai_responder.py b/fjerkroa_bot/ai_responder.py index cd3743b..84815ca 100644 --- a/fjerkroa_bot/ai_responder.py +++ b/fjerkroa_bot/ai_responder.py @@ -248,7 +248,7 @@ class AIResponder(AIResponderBase): async def fix(self, answer: str) -> str: raise NotImplementedError() - async def memory_rewrite(self, memory: str, user: str, question: str, answer: str) -> str: + async def memory_rewrite(self, memory: str, message_user: str, answer_user: str, question: str, answer: str) -> str: raise NotImplementedError() async def translate(self, text: str, language: str = "english") -> str: @@ -292,13 +292,14 @@ class AIResponder(AIResponderBase): response["picture"] = await self.translate(response["picture"]) return True - async def memoize(self, user: str, message: str, answer: str) -> None: - self.memory = await self.memory_rewrite(self.memory, user, message, answer) + async def memoize(self, message_user: str, answer_user: str, message: str, answer: str) -> None: + self.memory = await self.memory_rewrite(self.memory, message_user, answer_user, message, answer) self.update_memory(self.memory) async def memoize_reaction(self, message_user: str, reaction_user: str, operation: str, reaction: str, message: str) -> None: quoted_message = message.replace('\n', '\n> ') - await self.memoize(reaction_user, f'{message_user}:\n> {quoted_message}', + await self.memoize(message_user, reaction_user, + f'> {quoted_message}', f'User {reaction_user} has {operation} this raction: {reaction}') async def send(self, message: AIMessage) -> AIResponse: @@ -352,7 +353,7 @@ class AIResponder(AIResponderBase): # Update memory if answer_message.answer is not None: - await self.memoize(message.user, message.message, answer_message.answer) + await self.memoize(message.user, 'assistant', message.message, answer_message.answer) # Return the updated answer message return answer_message diff --git a/fjerkroa_bot/discord_bot.py b/fjerkroa_bot/discord_bot.py index c0a88dd..98a19cd 100644 --- a/fjerkroa_bot/discord_bot.py +++ b/fjerkroa_bot/discord_bot.py @@ -32,6 +32,7 @@ class FjerkroaBot(commands.Bot): intents = discord.Intents.default() intents.message_content = True intents.members = True + intents.reactions = True self._re_user = re.compile(r"[<][@][!]?\s*([0-9]+)[>]") self.init_observer() @@ -108,21 +109,21 @@ class FjerkroaBot(commands.Bot): return await self.handle_message_through_responder(message) - async def on_reaction_add(self, reaction, user): - if user.bot: - return + async def on_reaction_operation(self, reaction, user, operation): + logging.info(f'{operation} reaction {reaction} by {user}.') airesponder = self.get_ai_responder(self.get_channel_name(reaction.message.channel)) message = str(reaction.message.content) if reaction.message.content else '' if len(message) > 1: - await airesponder.memoize_reaction(reaction.message.user.name, user.name, 'adding', str(reaction.emoji), message) + await airesponder.memoize_reaction(reaction.message.author.name, user.name, operation, str(reaction.emoji), message) + + async def on_reaction_add(self, reaction, user): + await self.on_reaction_operation(reaction, user, 'adding') async def on_reaction_remove(self, reaction, user): - if user.bot: - return - airesponder = self.get_ai_responder(self.get_channel_name(reaction.message.channel)) - message = str(reaction.message.content) if reaction.message.content else '' - if len(message) > 1: - await airesponder.memoize_reaction(reaction.message.user.name, user.name, 'removing', str(reaction.emoji), message) + await self.on_reaction_operation(reaction, user, 'removing') + + async def on_reaction_clear(self, reaction, user): + await self.on_reaction_operation(reaction, user, 'clearing') def on_config_file_modified(self, event): if event.src_path == self.config_file: diff --git a/fjerkroa_bot/openai_responder.py b/fjerkroa_bot/openai_responder.py index e048e5e..4496ad9 100644 --- a/fjerkroa_bot/openai_responder.py +++ b/fjerkroa_bot/openai_responder.py @@ -111,15 +111,16 @@ class OpenAIResponder(AIResponder, LeonardoAIDrawMixIn): logging.warning(f"failed to translate the text: {repr(err)}") return text - async def memory_rewrite(self, memory: str, user: str, question: str, answer: str) -> str: + async def memory_rewrite(self, memory: str, message_user: str, answer_user: str, question: str, answer: str) -> str: if 'memory-model' not in self.config: return memory messages = [{'role': 'system', 'content': self.config.get('memory-system', 'You are an memory assistant.')}, {'role': 'user', 'content': f'Here is my previous memory:\n```\n{memory}\n```\n\n' - f'Here is my conversanion:\n```\n{user}: {question}\n\nassistant: {answer}\n```\n\n' + f'Here is my conversanion:\n```\n{message_user}: {question}\n\n{answer_user}: {answer}\n```\n\n' f'Please rewrite the memory in a way, that it contain the content mentioned in conversation. ' f'The whole memory should not be too long, summarize if required. ' f'Write just new memory data without any comments.'}] + logging.info(f'Rewrite memory:\n{pp(messages)}') try: # logging.info(f'send this memory request:\n{pp(messages)}') result = await openai_chat(self.client, diff --git a/openai_chat.dat b/openai_chat.dat index 9c0b6f9c5e47c8acf6139effd26c0e49b66b1203..3a0f5f417081eba98d9d5b5fa0f42e691758b2c2 100644 GIT binary patch delta 108316 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 tB&Wz1