import re import discord from discord.ext import commands import requests import json import logging import shutil from dotenv import load_dotenv import os from cogs.downloader import Downloader logger = logging.getLogger(__name__) load_dotenv() 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 {os.getenv("OPENROUTER_API_KEY")}", "Content-Type": "application/json" } payload = { "model": "mistralai/devstral-2512:free", "messages": [ { "role": "system", "content": "your task is to tell the program what to do and how to respond after receiving a message.\n" "message field has to be filled out in polish.\n" "act like jarvis, be a personal assistant to user, do not use emojis\n" "do not ask the user if they want to do an action. the user will tell you that" }, { "role": "user", "content": f"{message.content}" } ], "response_format": { "type": "json_schema", "json_schema": { "name": "response", "strict": True, "schema": { "type": "object", "properties": { "message": { "type": "string", "description": "the message that user will receive", }, "action": { "type": "string", "description": "the action to do, either download, compress or none" } }, "required": ["message", "action"], "additionalProperties": False, } } }, "plugins": [ {"id": "response-healing"} ] } response = requests.post(url=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://(?:[A-Za-z0-9-]+\.)*[A-Za-z0-9-]{1,63}\.[A-Za-z]{2,63}/\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)) shutil.rmtree(response["temp_dir"]) else: logger.error(f"Error: {response['content']}") if 'details' in response: logger.error(f"Details: {response['details']}") shutil.rmtree(response["temp_dir"]) elif action == "compress": pass def setup(bot): bot.add_cog(Jarvis(bot))