129 lines
5.0 KiB
Python
129 lines
5.0 KiB
Python
"""
|
||
Plugin for providing a command for the admin to load a plugin.
|
||
"""
|
||
|
||
import os
|
||
import logging
|
||
import importlib
|
||
import simplematrixbotlib as botlib
|
||
import sys # Import sys module for unloading plugins
|
||
|
||
# Dictionary to store loaded plugins
|
||
PLUGINS = {}
|
||
|
||
async def load_plugin(plugin_name):
|
||
"""
|
||
Asynchronously loads a plugin.
|
||
|
||
Args:
|
||
plugin_name (str): The name of the plugin to load.
|
||
|
||
Returns:
|
||
bool: True if the plugin is loaded successfully, False otherwise.
|
||
"""
|
||
try:
|
||
# Import the plugin module
|
||
module = importlib.import_module(f"plugins.{plugin_name}")
|
||
# Add the plugin module to the PLUGINS dictionary
|
||
PLUGINS[plugin_name] = module
|
||
logging.info(f"Loaded plugin: {plugin_name}")
|
||
return True
|
||
except Exception as e:
|
||
# Log an error if the plugin fails to load
|
||
logging.error(f"Error loading plugin {plugin_name}: {e}")
|
||
return False
|
||
|
||
async def unload_plugin(plugin_name):
|
||
"""
|
||
Asynchronously unloads a plugin.
|
||
|
||
Args:
|
||
plugin_name (str): The name of the plugin to unload.
|
||
|
||
Returns:
|
||
bool: True if the plugin is unloaded successfully, False otherwise.
|
||
"""
|
||
try:
|
||
if plugin_name in PLUGINS:
|
||
del PLUGINS[plugin_name] # Remove the plugin from the PLUGINS dictionary
|
||
del sys.modules[f"plugins.{plugin_name}"] # Unload the plugin module from sys.modules
|
||
logging.info(f"Unloaded plugin: {plugin_name}")
|
||
return True
|
||
else:
|
||
logging.warning(f"Plugin '{plugin_name}' is not loaded")
|
||
return False
|
||
except Exception as e:
|
||
# Log an error if the plugin fails to unload
|
||
logging.error(f"Error unloading plugin {plugin_name}: {e}")
|
||
return False
|
||
|
||
async def handle_command(room, message, bot, prefix, config):
|
||
"""
|
||
Asynchronously handles the command to load or unload a plugin.
|
||
|
||
Args:
|
||
room (Room): The Matrix room where the command was invoked.
|
||
message (RoomMessage): The message object containing the command.
|
||
bot (MatrixBot): The Matrix bot instance.
|
||
prefix (str): The command prefix.
|
||
config (dict): The bot's configuration.
|
||
|
||
Returns:
|
||
None
|
||
"""
|
||
match = botlib.MessageMatch(room, message, bot, prefix)
|
||
if match.is_not_from_this_bot() and match.prefix():
|
||
command = match.command()
|
||
if command == "load":
|
||
if str(message.sender) == config.admin_user:
|
||
args = match.args()
|
||
if len(args) != 1:
|
||
# Send usage message if the command format is incorrect
|
||
await bot.api.send_text_message(room.room_id, "Usage: !load <plugin>")
|
||
else:
|
||
plugin_name = args[0]
|
||
# Check if the plugin is not already loaded
|
||
if plugin_name not in PLUGINS:
|
||
# Load the plugin
|
||
success = await load_plugin(plugin_name)
|
||
if success:
|
||
await bot.api.send_text_message(room.room_id, f"Plugin '{plugin_name}' loaded successfully")
|
||
else:
|
||
await bot.api.send_text_message(room.room_id, f"Error loading plugin '{plugin_name}'")
|
||
else:
|
||
await bot.api.send_text_message(room.room_id, f"Plugin '{plugin_name}' is already loaded")
|
||
else:
|
||
# Send unauthorized message if the sender is not the admin
|
||
await bot.api.send_text_message(room.room_id, "You are not authorized to load plugins.")
|
||
elif command == "unload":
|
||
if str(message.sender) == config.admin_user:
|
||
args = match.args()
|
||
if len(args) != 1:
|
||
# Send usage message if the command format is incorrect
|
||
await bot.api.send_text_message(room.room_id, "Usage: !unload <plugin>")
|
||
else:
|
||
plugin_name = args[0]
|
||
# Unload the plugin
|
||
success = await unload_plugin(plugin_name)
|
||
if success:
|
||
await bot.api.send_text_message(room.room_id, f"Plugin '{plugin_name}' unloaded successfully")
|
||
else:
|
||
await bot.api.send_text_message(room.room_id, f"Error unloading plugin '{plugin_name}'")
|
||
else:
|
||
# Send unauthorized message if the sender is not the admin
|
||
await bot.api.send_text_message(room.room_id, "You are not authorized to unload plugins.")
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Plugin Metadata
|
||
# ---------------------------------------------------------------------------
|
||
|
||
__version__ = "1.0.0"
|
||
__author__ = "Funguy Bot"
|
||
__description__ = "Load/unload plugins at runtime"
|
||
__help__ = """
|
||
<details>
|
||
<summary><strong>Admin: !load / !unload</strong></summary>
|
||
<p><code>!load <plugin></code> / <code>!unload <plugin></code> – Dynamically load or unload a plugin module. Admin only.</p>
|
||
</details>
|
||
"""
|