import re import discord from discord.ext import commands import requests import json import logging from cogs.compression import Compression from cogs.downloader import Downloader logger = logging.getLogger(__name__) class Jarvis(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_message(self, message): print(message.content) if message.author == self.bot.user: return if message.mentions: if message.mentions[0].id == self.bot.user.id: await self.jarvis(message) if "jarvis" in message.content.lower(): await self.jarvis(message) @staticmethod async def jarvis(message): url = "https://openrouter.ai/api/v1/chat/completions" headers = { "Authorization": f"Bearer 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", "Content-Type": "application/json" } payload = { "model": "mistralai/devstral-2512:free", "messages": [ { "role": "system", "content": "respond in JSON format ONLY.\n" "your task is to tell the program what to do and how to respond after receiving a message.\n" "in the json, only fields need to be filled out, message and action\n" "message is the response that the program will send the user, " "and action is the action the program will do\n" "action can either be: compress or download.\n" "message field has to be filled out in polish.\n" "act like jarvis, be a personal assistant to user, do not use emojis" }, { "role": "user", "content": f"{message.content}" } ] } response = requests.post(url, headers=headers, json=payload) # Parse the JSON response response_data = response.json() logger.info(response_data) # Extract the content string content = response_data['choices'][0]['message']['content'] # Remove the code block markers and parse the inner JSON inner_json_str = content.strip('```json\n').strip('```').strip() inner_data = json.loads(inner_json_str) # Now you can access the message and action response_message = inner_data['message'] # "Proszę podać plik do kompresji lub link do pobrania." action = inner_data['action'] # "none OR download OR compress" channel = message.channel logger.info(response_message) logger.debug(action) await channel.send(response_message) if action == "download": # Extract the URL from the message using regex url_match = re.search(r'(https?://\S+)', message.content).group(0) if not url_match: await channel.send("Nie znaleziono poprawnego linku w odpowiedzi.") return response = await Downloader.download_standalone(url=url_match) if isinstance(response, dict): if response["status"] == "success": if response["type"] == "url": await channel.send(f"pobioron i wysyłon: {response['content']}") elif response["type"] == "file": file_data = response["content"] await channel.send("wysyłon:", file=discord.File(file_data)) else: logger.error(f"Error: {response['content']}") if 'details' in response: logger.error(f"Details: {response['details']}") elif action == "compress": pass def setup(bot): bot.add_cog(Jarvis(bot))