82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
# plugins/cron.py
|
||
|
||
import sqlite3
|
||
from crontab import CronTab
|
||
import simplematrixbotlib as botlib
|
||
|
||
# Database connection and cursor
|
||
conn = sqlite3.connect('cron.db')
|
||
cursor = conn.cursor()
|
||
|
||
# Create table if not exists
|
||
cursor.execute('''CREATE TABLE IF NOT EXISTS cron (
|
||
room_id TEXT,
|
||
cron_entry TEXT,
|
||
command TEXT
|
||
)''')
|
||
conn.commit()
|
||
|
||
async def handle_command(room, message, bot, prefix, config):
|
||
match = botlib.MessageMatch(room, message, bot, prefix)
|
||
if match.is_not_from_this_bot() and match.prefix() and match.command("cron"):
|
||
args = match.args()
|
||
if len(args) >= 4:
|
||
action = args[0]
|
||
room_id = args[1]
|
||
cron_entry = ' '.join(args[2:-1])
|
||
command = args[-1]
|
||
if action == "add":
|
||
add_cron(room_id, cron_entry, command)
|
||
await bot.api.send_text_message(room.room_id, f"Cron added successfully")
|
||
elif action == "remove":
|
||
remove_cron(room_id, command)
|
||
await bot.api.send_text_message(room.room_id, f"Cron removed successfully")
|
||
else:
|
||
await bot.api.send_text_message(room.room_id, "Usage: !cron add|remove room_id cron_entry command")
|
||
|
||
def add_cron(room_id, cron_entry, command):
|
||
# Check if the cron entry already exists in the database for the given room_id and command
|
||
cursor.execute('SELECT * FROM cron WHERE room_id=? AND command=? AND cron_entry=?', (room_id, command, cron_entry))
|
||
existing_entry = cursor.fetchone()
|
||
if existing_entry:
|
||
return # Cron entry already exists, do not add duplicate
|
||
|
||
# Insert the cron entry into the database
|
||
cursor.execute('INSERT INTO cron (room_id, cron_entry, command) VALUES (?, ?, ?)', (room_id, cron_entry, command))
|
||
conn.commit()
|
||
|
||
def remove_cron(room_id, command):
|
||
cursor.execute('DELETE FROM cron WHERE room_id=? AND command=?', (room_id, command))
|
||
conn.commit()
|
||
|
||
async def run_cron_jobs(bot):
|
||
cron = CronTab()
|
||
for job in cron:
|
||
cron_entry = str(job)
|
||
for row in cursor.execute('SELECT * FROM cron WHERE cron_entry=?', (cron_entry,)):
|
||
room_id, _, command = row
|
||
room = await bot.api.get_room_by_id(room_id)
|
||
if room:
|
||
plugin_name = command.split()[0].replace(prefix, '') # Extract plugin name
|
||
plugin_module = bot.plugins.get(plugin_name)
|
||
if plugin_module:
|
||
await plugin_module.handle_command(room, None, bot, prefix, config)
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Plugin Metadata
|
||
# ---------------------------------------------------------------------------
|
||
|
||
__version__ = "1.0.0"
|
||
__author__ = "Funguy Bot"
|
||
__description__ = "Cron job scheduler"
|
||
__help__ = """
|
||
<details>
|
||
<summary><strong>!cron</strong> – Schedule commands via cron syntax</summary>
|
||
<ul>
|
||
<li><code>!cron add <room_id> <cron_entry> <command></code> – Add job</li>
|
||
<li><code>!cron remove <room_id> <command></code> – Remove job</li>
|
||
</ul>
|
||
<p>Admin only.</p>
|
||
</details>
|
||
"""
|