#!/usr/bin/env python # funguy.py import os import logging import importlib import simplematrixbotlib as botlib from dotenv import load_dotenv import time import sys from plugins.config import FunguyConfig class FunguyBot: bot = None config = None def __init__(self): self.PLUGINS_DIR = "plugins" self.PLUGINS = {} self.config = None self.bot = None self.load_dotenv() self.setup_logging() self.load_plugins() self.load_config() def load_dotenv(self): load_dotenv() def setup_logging(self): logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO) logging.getLogger().setLevel(logging.INFO) def load_plugins(self): for plugin_file in os.listdir(self.PLUGINS_DIR): if plugin_file.endswith(".py"): plugin_name = os.path.splitext(plugin_file)[0] try: module = importlib.import_module(f"{self.PLUGINS_DIR}.{plugin_name}") self.PLUGINS[plugin_name] = module logging.info(f"Loaded plugin: {plugin_name}") except Exception as e: logging.error(f"Error loading plugin {plugin_name}: {e}") def reload_plugins(self): self.PLUGINS = {} # Unload modules from sys.modules for plugin_name in list(sys.modules.keys()): if plugin_name.startswith(self.PLUGINS_DIR + "."): del sys.modules[plugin_name] self.load_plugins() def load_config(self): self.config = FunguyConfig() async def handle_commands(self, room, message): match = botlib.MessageMatch(room, message, self.bot, self.config.prefix) if match.is_not_from_this_bot() and match.prefix() and match.command("reload"): if str(message.sender) == self.config.admin_user: self.reload_plugins() await self.bot.api.send_text_message(room.room_id, "Plugins reloaded successfully") else: await self.bot.api.send_text_message(room.room_id, "You are not authorized to reload plugins.") for plugin_name, plugin_module in self.PLUGINS.items(): await plugin_module.handle_command(room, message, self.bot, self.config.prefix, self.config) if match.is_not_from_this_bot() and match.prefix() and match.command("rehash"): if str(message.sender) == self.config.admin_user: self.rehash_config() await self.bot.api.send_text_message(room.room_id, "Config rehashed") else: await self.bot.api.send_text_message(room.room_id, "You are not authorized to reload plugins.") def rehash_config(self): del self.config self.config = FunguyConfig() def run(self): MATRIX_URL = os.getenv("MATRIX_URL") MATRIX_USER = os.getenv("MATRIX_USER") MATRIX_PASS = os.getenv("MATRIX_PASS") creds = botlib.Creds(MATRIX_URL, MATRIX_USER, MATRIX_PASS) self.bot = botlib.Bot(creds, self.config) @self.bot.listener.on_message_event async def wrapper_handle_commands(room, message): await self.handle_commands(room, message) self.bot.run() if __name__ == "__main__": bot = FunguyBot() bot.run()