CREATE DATABASE IF NOT EXISTS reminders; SET SQL_MODE='ALLOW_INVALID_DATES'; SET FOREIGN_KEY_CHECKS=0; USE reminders; CREATE TABLE reminders.guilds ( id INT UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT, guild BIGINT UNSIGNED UNIQUE NOT NULL, name VARCHAR(100), prefix VARCHAR(5) DEFAULT '$' NOT NULL, timezone VARCHAR(32) DEFAULT 'UTC' NOT NULL, default_channel_id INT UNSIGNED, default_username VARCHAR(32) DEFAULT 'Reminder' NOT NULL, default_avatar VARCHAR(512) DEFAULT 'https://raw.githubusercontent.com/reminder-bot/logos/master/Remind_Me_Bot_Logo_PPic.jpg' NOT NULL, PRIMARY KEY (id), FOREIGN KEY (default_channel_id) REFERENCES reminders.channels(id) ON DELETE SET NULL ); CREATE TABLE reminders.channels ( id INT UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT, channel BIGINT UNSIGNED UNIQUE NOT NULL, name VARCHAR(100), nudge SMALLINT NOT NULL DEFAULT 0, blacklisted BOOL NOT NULL DEFAULT FALSE, webhook_id BIGINT UNSIGNED UNIQUE, webhook_token TEXT, paused BOOL NOT NULL DEFAULT 0, paused_until TIMESTAMP, guild_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (guild_id) REFERENCES reminders.guilds(id) ON DELETE CASCADE ); CREATE TABLE reminders.users ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, user BIGINT UNSIGNED UNIQUE NOT NULL, name VARCHAR(37) NOT NULL, dm_channel INT UNSIGNED UNIQUE NOT NULL, language VARCHAR(2) DEFAULT 'EN' NOT NULL, timezone VARCHAR(32) DEFAULT 'UTC' NOT NULL, meridian_time BOOLEAN DEFAULT 0 NOT NULL, allowed_dm BOOLEAN DEFAULT 1 NOT NULL, patreon BOOLEAN NOT NULL DEFAULT 0, PRIMARY KEY (id), FOREIGN KEY (dm_channel) REFERENCES reminders.channels(id) ON DELETE RESTRICT ); CREATE TABLE reminders.roles ( id INT UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT, role BIGINT UNSIGNED UNIQUE NOT NULL, name VARCHAR(100), guild_id INT UNSIGNED NOT NULL, PRIMARY KEY (id), FOREIGN KEY (guild_id) REFERENCES reminders.guilds(id) ON DELETE CASCADE ); CREATE TABLE reminders.embeds ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, title VARCHAR(256) NOT NULL DEFAULT '', description VARCHAR(2048) NOT NULL DEFAULT '', image_url VARCHAR(512), thumbnail_url VARCHAR(512), footer VARCHAR(2048) NOT NULL DEFAULT '', footer_icon VARCHAR(512), color MEDIUMINT UNSIGNED NOT NULL DEFAULT 0x0, PRIMARY KEY (id) ); CREATE TABLE reminders.embed_fields ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, title VARCHAR(256) NOT NULL DEFAULT '', value VARCHAR(1024) NOT NULL DEFAULT '', inline BOOL NOT NULL DEFAULT 0, embed_id INT UNSIGNED NOT NULL, PRIMARY KEY (id), FOREIGN KEY (embed_id) REFERENCES reminders.embeds(id) ON DELETE CASCADE ); CREATE TABLE reminders.messages ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, content VARCHAR(2048) NOT NULL DEFAULT '', tts BOOL NOT NULL DEFAULT 0, embed_id INT UNSIGNED, attachment MEDIUMBLOB, attachment_name VARCHAR(260), PRIMARY KEY (id), FOREIGN KEY (embed_id) REFERENCES reminders.embeds(id) ON DELETE SET NULL ); CREATE TABLE reminders.reminders ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, uid VARCHAR(64) UNIQUE NOT NULL, name VARCHAR(24) NOT NULL DEFAULT 'Reminder', message_id INT UNSIGNED NOT NULL, channel_id INT UNSIGNED NOT NULL, `time` INT UNSIGNED DEFAULT 0 NOT NULL, `interval` INT UNSIGNED DEFAULT NULL, expires TIMESTAMP NULL DEFAULT NULL, enabled BOOLEAN DEFAULT 1 NOT NULL, avatar VARCHAR(512), username VARCHAR(32), method ENUM('remind', 'natural', 'dashboard', 'todo', 'countdown'), set_at TIMESTAMP DEFAULT NOW(), set_by INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (message_id) REFERENCES reminders.messages(id) ON DELETE RESTRICT, FOREIGN KEY (channel_id) REFERENCES reminders.channels(id) ON DELETE CASCADE, FOREIGN KEY (set_by) REFERENCES reminders.users(id) ON DELETE SET NULL ); CREATE TRIGGER message_cleanup AFTER DELETE ON reminders.reminders FOR EACH ROW DELETE FROM reminders.messages WHERE id = OLD.message_id; CREATE TRIGGER embed_cleanup AFTER DELETE ON reminders.messages FOR EACH ROW DELETE FROM reminders.embeds WHERE id = OLD.embed_id; CREATE TABLE reminders.todos ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, user_id INT UNSIGNED, guild_id INT UNSIGNED, channel_id INT UNSIGNED, value VARCHAR(2000) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES reminders.users(id) ON DELETE SET NULL, FOREIGN KEY (guild_id) REFERENCES reminders.guilds(id) ON DELETE CASCADE, FOREIGN KEY (channel_id) REFERENCES reminders.channels(id) ON DELETE SET NULL ); CREATE TABLE reminders.command_restrictions ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, role_id INT UNSIGNED NOT NULL, command ENUM('todos', 'natural', 'remind', 'interval', 'timer', 'del', 'look', 'alias', 'countdown') NOT NULL, PRIMARY KEY (id), FOREIGN KEY (role_id) REFERENCES reminders.roles(id) ON DELETE CASCADE, UNIQUE KEY (`role_id`, `command`) ); CREATE TABLE reminders.timers ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, start_time TIMESTAMP NOT NULL DEFAULT NOW(), name VARCHAR(32) NOT NULL, owner BIGINT UNSIGNED NOT NULL, PRIMARY KEY (id) ); CREATE TABLE reminders.events ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, `time` TIMESTAMP NOT NULL DEFAULT NOW(), event_name ENUM('edit', 'enable', 'disable', 'delete') NOT NULL, bulk_count INT UNSIGNED, guild_id INT UNSIGNED NOT NULL, user_id INT UNSIGNED, reminder_id INT UNSIGNED, PRIMARY KEY (id), FOREIGN KEY (guild_id) REFERENCES reminders.guilds(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES reminders.users(id) ON DELETE SET NULL, FOREIGN KEY (reminder_id) REFERENCES reminders.reminders(id) ON DELETE SET NULL ); CREATE TABLE reminders.command_aliases ( id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, guild_id INT UNSIGNED NOT NULL, name VARCHAR(12) NOT NULL, command VARCHAR(2048) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (guild_id) REFERENCES reminders.guilds(id) ON DELETE CASCADE, UNIQUE KEY (`guild_id`, `name`) ); CREATE TABLE reminders.guild_users ( guild INT UNSIGNED NOT NULL, user INT UNSIGNED NOT NULL, can_access BOOL NOT NULL DEFAULT 0, FOREIGN KEY (guild) REFERENCES reminders.guilds(id) ON DELETE CASCADE, FOREIGN KEY (user) REFERENCES reminders.users(id) ON DELETE CASCADE, UNIQUE KEY (guild, user) ); CREATE EVENT reminders.event_cleanup ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY ON COMPLETION PRESERVE DO DELETE FROM reminders.events WHERE `time` < DATE_SUB(NOW(), INTERVAL 5 DAY);