Files
openclaw-workspace/tools/reminder-bot.py
2026-04-11 09:45:12 -05:00

82 lines
2.5 KiB
Python

#!/usr/bin/env python3
"""
Discord Reminder Bot - Called by OpenClaw cron to deliver reminders
Uses the message tool to actually post to Discord
"""
import sqlite3
import os
import sys
import json
from datetime import datetime
DB_PATH = os.path.expanduser("~/.openclaw/workspace/data/reminders.db")
def get_due_reminders():
"""Get reminders that are due now."""
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('''SELECT id, user_id, channel_id, message, remind_at
FROM reminders
WHERE active = 1 AND remind_at <= datetime('now')''')
results = c.fetchall()
conn.close()
return results
def mark_reminder_sent(reminder_id):
"""Mark reminder as inactive after sending."""
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('UPDATE reminders SET active = 0 WHERE id = ?', (reminder_id,))
conn.commit()
conn.close()
def format_reminder_message(message, user_id):
"""Format the reminder with mention."""
return f"🔔 **Reminder for <@{user_id}>:** {message}"
if __name__ == "__main__":
# Check for specific reminder ID (from cron)
if len(sys.argv) > 1:
reminder_id = int(sys.argv[1])
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()
c.execute('''SELECT id, user_id, channel_id, message, remind_at
FROM reminders WHERE id = ? AND active = 1''', (reminder_id,))
result = c.fetchone()
conn.close()
if result:
# Output JSON for the agent to use with message tool
output = {
"action": "send_reminder",
"reminder_id": result[0],
"user_id": result[1],
"channel_id": result[2],
"message": result[3],
"formatted": format_reminder_message(result[3], result[1])
}
print(json.dumps(output))
else:
print(json.dumps({"error": "Reminder not found or already sent"}))
else:
# Check for any due reminders
due = get_due_reminders()
if due:
for r in due:
output = {
"action": "send_reminder",
"reminder_id": r[0],
"user_id": r[1],
"channel_id": r[2],
"message": r[3],
"formatted": format_reminder_message(r[3], r[1])
}
print(json.dumps(output))
else:
print(json.dumps({"status": "no_due_reminders"}))