Compare commits
	
		
			2 Commits
		
	
	
		
			current
			...
			jude/restr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					192e316926 | ||
| 
						 | 
					19cfacffe5 | 
							
								
								
									
										12676
									
								
								gb-ipv4.csv
									
									
									
									
									
								
							
							
						
						
									
										12676
									
								
								gb-ipv4.csv
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										84
									
								
								migrations/20250506184716_remove_unused_columns.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								migrations/20250506184716_remove_unused_columns.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					-- Drop all old tables
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS users_old;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS messages;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS embeds;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS embed_fields;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS command_aliases;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS macro;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS command_restrictions;
 | 
				
			||||||
 | 
					DROP TABLE IF EXISTS roles;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET FOREIGN_KEY_CHECKS = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Drop columns from channels that are no longer used
 | 
				
			||||||
 | 
					ALTER TABLE channels DROP COLUMN `name`;
 | 
				
			||||||
 | 
					ALTER TABLE channels DROP COLUMN `blacklisted`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Drop columns from guilds table that are no longer used and rebuild table
 | 
				
			||||||
 | 
					CREATE TABLE guilds_new (
 | 
				
			||||||
 | 
					    id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
 | 
				
			||||||
 | 
					    ephemeral_confirmations BOOLEAN NOT NULL DEFAULT 0
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					INSERT INTO guilds_new (id, ephemeral_confirmations) SELECT guild, ephemeral_confirmations FROM guilds;
 | 
				
			||||||
 | 
					RENAME TABLE guilds TO guilds_old;
 | 
				
			||||||
 | 
					RENAME TABLE guilds_new TO guilds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Update fk on channels to point at new guild table
 | 
				
			||||||
 | 
					ALTER TABLE channels
 | 
				
			||||||
 | 
					    DROP FOREIGN KEY `channels_ibfk_1`,
 | 
				
			||||||
 | 
					    MODIFY COLUMN guild_id BIGINT UNSIGNED,
 | 
				
			||||||
 | 
					    ADD FOREIGN KEY `fk_guild_id` (`guild_id`)
 | 
				
			||||||
 | 
					        REFERENCES `guilds` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE CASCADE
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE;
 | 
				
			||||||
 | 
					UPDATE channels SET guild_id = (SELECT guild FROM guilds_old WHERE id = guild_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Rebuild todos table
 | 
				
			||||||
 | 
					CREATE TABLE `todos_new` (
 | 
				
			||||||
 | 
					    `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					    `guild_id`   BIGINT UNSIGNED DEFAULT NULL,
 | 
				
			||||||
 | 
					    `channel_id` INT UNSIGNED DEFAULT NULL,
 | 
				
			||||||
 | 
					    `user_id`    BIGINT UNSIGNED DEFAULT NULL,
 | 
				
			||||||
 | 
					    `value`      VARCHAR(2000) NOT NULL,
 | 
				
			||||||
 | 
					    PRIMARY KEY (`id`),
 | 
				
			||||||
 | 
					    FOREIGN KEY `fk_channel_id` (`channel_id`)
 | 
				
			||||||
 | 
					        REFERENCES `channels` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE SET NULL
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE,
 | 
				
			||||||
 | 
					    FOREIGN KEY `fk_guild_id` (`guild_id`)
 | 
				
			||||||
 | 
					        REFERENCES `guilds` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE CASCADE
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE,
 | 
				
			||||||
 | 
					    FOREIGN KEY `fk_user_id` (`user_id`)
 | 
				
			||||||
 | 
					        REFERENCES `users` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE SET NULL
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					INSERT INTO todos_new (id, guild_id, channel_id, user_id, value) SELECT id, (SELECT guild FROM guilds_old WHERE id = guild_id), channel_id, user_id, value FROM todos;
 | 
				
			||||||
 | 
					RENAME TABLE todos TO todos_old;
 | 
				
			||||||
 | 
					RENAME TABLE todos_new TO todos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Update fk on reminder_template to point at new guild table
 | 
				
			||||||
 | 
					ALTER TABLE reminder_template
 | 
				
			||||||
 | 
					    DROP FOREIGN KEY `reminder_template_ibfk_1`,
 | 
				
			||||||
 | 
					    MODIFY COLUMN guild_id BIGINT UNSIGNED NOT NULL,
 | 
				
			||||||
 | 
					    ADD FOREIGN KEY `fk_guild_id` (`guild_id`)
 | 
				
			||||||
 | 
					        REFERENCES `guilds` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE CASCADE
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE;
 | 
				
			||||||
 | 
					UPDATE reminder_template SET guild_id = (SELECT guild FROM guilds_old WHERE id = guild_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- Update fk on command_macro to point at new guild table
 | 
				
			||||||
 | 
					ALTER TABLE command_macro
 | 
				
			||||||
 | 
					    DROP FOREIGN KEY `command_macro_ibfk_1`,
 | 
				
			||||||
 | 
					    MODIFY COLUMN guild_id BIGINT UNSIGNED NOT NULL,
 | 
				
			||||||
 | 
					    ADD FOREIGN KEY `fk_guild_id` (`guild_id`)
 | 
				
			||||||
 | 
					        REFERENCES `guilds` (`id`)
 | 
				
			||||||
 | 
					        ON DELETE CASCADE
 | 
				
			||||||
 | 
					        ON UPDATE CASCADE;
 | 
				
			||||||
 | 
					UPDATE command_macro SET guild_id = (SELECT guild FROM guilds_old WHERE id = guild_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE todos_old;
 | 
				
			||||||
 | 
					DROP TABLE guilds_old;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET FOREIGN_KEY_CHECKS = 1;
 | 
				
			||||||
@@ -24,7 +24,7 @@ pub async fn macro_name_autocomplete(ctx: Context<'_>, partial: &str) -> Vec<Str
 | 
				
			|||||||
        SELECT name
 | 
					        SELECT name
 | 
				
			||||||
        FROM command_macro
 | 
					        FROM command_macro
 | 
				
			||||||
        WHERE
 | 
					        WHERE
 | 
				
			||||||
            guild_id = (SELECT id FROM guilds WHERE guild = ?)
 | 
					            guild_id = ?
 | 
				
			||||||
            AND name LIKE CONCAT(?, '%')
 | 
					            AND name LIKE CONCAT(?, '%')
 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        ctx.guild_id().unwrap().get(),
 | 
					        ctx.guild_id().unwrap().get(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,12 +17,10 @@ pub async fn delete_macro(
 | 
				
			|||||||
) -> Result<(), Error> {
 | 
					) -> Result<(), Error> {
 | 
				
			||||||
    match sqlx::query!(
 | 
					    match sqlx::query!(
 | 
				
			||||||
        "
 | 
					        "
 | 
				
			||||||
        SELECT m.id
 | 
					        SELECT id
 | 
				
			||||||
        FROM command_macro m
 | 
					        FROM command_macro
 | 
				
			||||||
        INNER JOIN guilds
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
            ON guilds.id = m.guild_id
 | 
					            AND name = ?
 | 
				
			||||||
        WHERE guild = ?
 | 
					 | 
				
			||||||
            AND m.name = ?
 | 
					 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        ctx.guild_id().unwrap().get(),
 | 
					        ctx.guild_id().unwrap().get(),
 | 
				
			||||||
        name
 | 
					        name
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ pub async fn finish_macro(ctx: Context<'_>) -> Result<(), Error> {
 | 
				
			|||||||
            let json = serde_json::to_string(&command_macro.commands).unwrap();
 | 
					            let json = serde_json::to_string(&command_macro.commands).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sqlx::query!(
 | 
					            sqlx::query!(
 | 
				
			||||||
                "INSERT INTO command_macro (guild_id, name, description, commands) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?)",
 | 
					                "INSERT INTO command_macro (guild_id, name, description, commands) VALUES (?, ?, ?, ?)",
 | 
				
			||||||
                command_macro.guild_id.get(),
 | 
					                command_macro.guild_id.get(),
 | 
				
			||||||
                command_macro.name,
 | 
					                command_macro.name,
 | 
				
			||||||
                command_macro.description,
 | 
					                command_macro.description,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ pub async fn record_macro(
 | 
				
			|||||||
        "
 | 
					        "
 | 
				
			||||||
        SELECT 1 as _e
 | 
					        SELECT 1 as _e
 | 
				
			||||||
        FROM command_macro
 | 
					        FROM command_macro
 | 
				
			||||||
        WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
            AND name = ?
 | 
					            AND name = ?
 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        guild_id.get(),
 | 
					        guild_id.get(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ impl Recordable for Options {
 | 
				
			|||||||
            "
 | 
					            "
 | 
				
			||||||
            INSERT INTO todos (guild_id, channel_id, value)
 | 
					            INSERT INTO todos (guild_id, channel_id, value)
 | 
				
			||||||
            VALUES (
 | 
					            VALUES (
 | 
				
			||||||
                (SELECT id FROM guilds WHERE guild = ?),
 | 
					                ?,
 | 
				
			||||||
                (SELECT id FROM channels WHERE channel = ?),
 | 
					                (SELECT id FROM channels WHERE channel = ?),
 | 
				
			||||||
                ?
 | 
					                ?
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ impl Recordable for Options {
 | 
				
			|||||||
            "
 | 
					            "
 | 
				
			||||||
            INSERT INTO todos (guild_id, value)
 | 
					            INSERT INTO todos (guild_id, value)
 | 
				
			||||||
            VALUES (
 | 
					            VALUES (
 | 
				
			||||||
                (SELECT id FROM guilds WHERE guild = ?), ?
 | 
					                ?, ?
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            ",
 | 
					            ",
 | 
				
			||||||
            ctx.guild_id().unwrap().get(),
 | 
					            ctx.guild_id().unwrap().get(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,9 +13,8 @@ impl Recordable for Options {
 | 
				
			|||||||
    async fn run(self, ctx: Context<'_>) -> Result<(), Error> {
 | 
					    async fn run(self, ctx: Context<'_>) -> Result<(), Error> {
 | 
				
			||||||
        let values = sqlx::query!(
 | 
					        let values = sqlx::query!(
 | 
				
			||||||
            "
 | 
					            "
 | 
				
			||||||
            SELECT todos.id, value FROM todos
 | 
					            SELECT id, value FROM todos
 | 
				
			||||||
            INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
					            WHERE guild_id = ?
 | 
				
			||||||
            WHERE guilds.guild = ?
 | 
					 | 
				
			||||||
            ",
 | 
					            ",
 | 
				
			||||||
            ctx.guild_id().unwrap().get(),
 | 
					            ctx.guild_id().unwrap().get(),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -219,9 +219,8 @@ impl ComponentDataModel {
 | 
				
			|||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        sqlx::query!(
 | 
					                        sqlx::query!(
 | 
				
			||||||
                            "
 | 
					                            "
 | 
				
			||||||
                            SELECT todos.id, value FROM todos
 | 
					                            SELECT id, value FROM todos
 | 
				
			||||||
                            INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
					                            WHERE guild_id = ?
 | 
				
			||||||
                            WHERE guilds.guild = ?
 | 
					 | 
				
			||||||
                            ",
 | 
					                            ",
 | 
				
			||||||
                            pager.guild_id,
 | 
					                            pager.guild_id,
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
@@ -311,9 +310,8 @@ impl ComponentDataModel {
 | 
				
			|||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            sqlx::query!(
 | 
					                            sqlx::query!(
 | 
				
			||||||
                                "
 | 
					                                "
 | 
				
			||||||
                            SELECT todos.id, value FROM todos
 | 
					                                SELECT id, value FROM todos
 | 
				
			||||||
                            INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
					                                WHERE guild_id = ?
 | 
				
			||||||
                            WHERE guilds.guild = ?
 | 
					 | 
				
			||||||
                                ",
 | 
					                                ",
 | 
				
			||||||
                                selector.guild_id,
 | 
					                                selector.guild_id,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@ pub async fn listener(
 | 
				
			|||||||
            if is_new.unwrap_or(false) {
 | 
					            if is_new.unwrap_or(false) {
 | 
				
			||||||
                let guild_id = guild.id.get().to_owned();
 | 
					                let guild_id = guild.id.get().to_owned();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                sqlx::query!("INSERT IGNORE INTO guilds (guild) VALUES (?)", guild_id)
 | 
					                sqlx::query!("INSERT IGNORE INTO guilds (id) VALUES (?)", guild_id)
 | 
				
			||||||
                    .execute(&data.database)
 | 
					                    .execute(&data.database)
 | 
				
			||||||
                    .await?;
 | 
					                    .await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,7 +56,7 @@ To stay up to date on the latest features and fixes, join our [Discord](https://
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        FullEvent::GuildDelete { incomplete, .. } => {
 | 
					        FullEvent::GuildDelete { incomplete, .. } => {
 | 
				
			||||||
            if !incomplete.unavailable {
 | 
					            if !incomplete.unavailable {
 | 
				
			||||||
                let _ = sqlx::query!("DELETE FROM guilds WHERE guild = ?", incomplete.id.get())
 | 
					                let _ = sqlx::query!("DELETE FROM guilds WHERE id = ?", incomplete.id.get())
 | 
				
			||||||
                    .execute(&data.database)
 | 
					                    .execute(&data.database)
 | 
				
			||||||
                    .await;
 | 
					                    .await;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,9 +8,7 @@ use crate::{consts::DEFAULT_AVATAR, Error};
 | 
				
			|||||||
pub struct ChannelData {
 | 
					pub struct ChannelData {
 | 
				
			||||||
    pub id: u32,
 | 
					    pub id: u32,
 | 
				
			||||||
    pub channel: u64,
 | 
					    pub channel: u64,
 | 
				
			||||||
    pub name: Option<String>,
 | 
					 | 
				
			||||||
    pub nudge: i16,
 | 
					    pub nudge: i16,
 | 
				
			||||||
    pub blacklisted: bool,
 | 
					 | 
				
			||||||
    pub webhook_id: Option<u64>,
 | 
					    pub webhook_id: Option<u64>,
 | 
				
			||||||
    pub webhook_token: Option<String>,
 | 
					    pub webhook_token: Option<String>,
 | 
				
			||||||
    pub paused: bool,
 | 
					    pub paused: bool,
 | 
				
			||||||
@@ -27,7 +25,7 @@ impl ChannelData {
 | 
				
			|||||||
        if let Ok(c) = sqlx::query_as_unchecked!(
 | 
					        if let Ok(c) = sqlx::query_as_unchecked!(
 | 
				
			||||||
            Self,
 | 
					            Self,
 | 
				
			||||||
            "
 | 
					            "
 | 
				
			||||||
            SELECT id, channel, name, nudge, blacklisted, webhook_id, webhook_token, paused,
 | 
					            SELECT id, channel, nudge, webhook_id, webhook_token, paused,
 | 
				
			||||||
                paused_until
 | 
					                paused_until
 | 
				
			||||||
            FROM channels
 | 
					            FROM channels
 | 
				
			||||||
            WHERE channel = ?
 | 
					            WHERE channel = ?
 | 
				
			||||||
@@ -39,15 +37,11 @@ impl ChannelData {
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            Ok(c)
 | 
					            Ok(c)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            let props = channel.to_owned().guild().map(|g| (g.guild_id.get().to_owned(), g.name));
 | 
					            let guild_id = channel.to_owned().guild().map(|g| g.guild_id.get().to_owned());
 | 
				
			||||||
 | 
					 | 
				
			||||||
            let (guild_id, channel_name) =
 | 
					 | 
				
			||||||
                if let Some((a, b)) = props { (Some(a), Some(b)) } else { (None, None) };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sqlx::query!(
 | 
					            sqlx::query!(
 | 
				
			||||||
                "INSERT IGNORE INTO channels (channel, name, guild_id) VALUES (?, ?, (SELECT id FROM guilds WHERE guild = ?))",
 | 
					                "INSERT IGNORE INTO channels (channel, guild_id) VALUES (?, ?)",
 | 
				
			||||||
                channel_id,
 | 
					                channel_id,
 | 
				
			||||||
                channel_name,
 | 
					 | 
				
			||||||
                guild_id
 | 
					                guild_id
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .execute(&pool.clone())
 | 
					            .execute(&pool.clone())
 | 
				
			||||||
@@ -56,7 +50,7 @@ impl ChannelData {
 | 
				
			|||||||
            Ok(sqlx::query_as_unchecked!(
 | 
					            Ok(sqlx::query_as_unchecked!(
 | 
				
			||||||
                Self,
 | 
					                Self,
 | 
				
			||||||
                "
 | 
					                "
 | 
				
			||||||
                SELECT id, channel, name, nudge, blacklisted, webhook_id, webhook_token, paused, paused_until
 | 
					                SELECT id, channel, nudge, webhook_id, webhook_token, paused, paused_until
 | 
				
			||||||
                FROM channels
 | 
					                FROM channels
 | 
				
			||||||
                WHERE channel = ?
 | 
					                WHERE channel = ?
 | 
				
			||||||
                ",
 | 
					                ",
 | 
				
			||||||
@@ -72,18 +66,14 @@ impl ChannelData {
 | 
				
			|||||||
            "
 | 
					            "
 | 
				
			||||||
            UPDATE channels
 | 
					            UPDATE channels
 | 
				
			||||||
            SET
 | 
					            SET
 | 
				
			||||||
                name = ?,
 | 
					 | 
				
			||||||
                nudge = ?,
 | 
					                nudge = ?,
 | 
				
			||||||
                blacklisted = ?,
 | 
					 | 
				
			||||||
                webhook_id = ?,
 | 
					                webhook_id = ?,
 | 
				
			||||||
                webhook_token = ?,
 | 
					                webhook_token = ?,
 | 
				
			||||||
                paused = ?,
 | 
					                paused = ?,
 | 
				
			||||||
                paused_until = ?
 | 
					                paused_until = ?
 | 
				
			||||||
            WHERE id = ?
 | 
					            WHERE id = ?
 | 
				
			||||||
            ",
 | 
					            ",
 | 
				
			||||||
            self.name,
 | 
					 | 
				
			||||||
            self.nudge,
 | 
					            self.nudge,
 | 
				
			||||||
            self.blacklisted,
 | 
					 | 
				
			||||||
            self.webhook_id,
 | 
					            self.webhook_id,
 | 
				
			||||||
            self.webhook_token,
 | 
					            self.webhook_token,
 | 
				
			||||||
            self.paused,
 | 
					            self.paused,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -144,12 +144,10 @@ pub async fn guild_command_macro(ctx: &Context<'_>, name: &str) -> Option<Comman
 | 
				
			|||||||
    let row = sqlx::query_as!(
 | 
					    let row = sqlx::query_as!(
 | 
				
			||||||
        Row,
 | 
					        Row,
 | 
				
			||||||
        "
 | 
					        "
 | 
				
			||||||
        SELECT m.name, m.description, m.commands
 | 
					        SELECT name, description, commands
 | 
				
			||||||
        FROM command_macro m
 | 
					        FROM command_macro m
 | 
				
			||||||
        INNER JOIN guilds g
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
            ON g.id = m.guild_id
 | 
					            AND name = ?
 | 
				
			||||||
        WHERE guild = ?
 | 
					 | 
				
			||||||
            AND m.name = ?
 | 
					 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        ctx.guild_id().unwrap().get(),
 | 
					        ctx.guild_id().unwrap().get(),
 | 
				
			||||||
        name
 | 
					        name
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ use sqlx::MySqlPool;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pub struct GuildData {
 | 
					pub struct GuildData {
 | 
				
			||||||
    pub ephemeral_confirmations: bool,
 | 
					    pub ephemeral_confirmations: bool,
 | 
				
			||||||
    pub id: u32,
 | 
					    pub guild_id: u64,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl GuildData {
 | 
					impl GuildData {
 | 
				
			||||||
@@ -13,7 +13,7 @@ impl GuildData {
 | 
				
			|||||||
    ) -> Result<Self, Box<dyn std::error::Error + Sync + Send>> {
 | 
					    ) -> Result<Self, Box<dyn std::error::Error + Sync + Send>> {
 | 
				
			||||||
        if let Ok(c) = sqlx::query_as_unchecked!(
 | 
					        if let Ok(c) = sqlx::query_as_unchecked!(
 | 
				
			||||||
            Self,
 | 
					            Self,
 | 
				
			||||||
            "SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?",
 | 
					            "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?",
 | 
				
			||||||
            guild_id.get()
 | 
					            guild_id.get()
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        .fetch_one(pool)
 | 
					        .fetch_one(pool)
 | 
				
			||||||
@@ -21,13 +21,13 @@ impl GuildData {
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            Ok(c)
 | 
					            Ok(c)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            sqlx::query!("INSERT IGNORE INTO guilds (guild) VALUES (?)", guild_id.get())
 | 
					            sqlx::query!("INSERT IGNORE INTO guilds (id) VALUES (?)", guild_id.get())
 | 
				
			||||||
                .execute(&pool.clone())
 | 
					                .execute(&pool.clone())
 | 
				
			||||||
                .await?;
 | 
					                .await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Ok(sqlx::query_as_unchecked!(
 | 
					            Ok(sqlx::query_as_unchecked!(
 | 
				
			||||||
                Self,
 | 
					                Self,
 | 
				
			||||||
                "SELECT id, ephemeral_confirmations FROM guilds WHERE guild = ?",
 | 
					                "SELECT ephemeral_confirmations, id as guild_id FROM guilds WHERE id = ?",
 | 
				
			||||||
                guild_id.get()
 | 
					                guild_id.get()
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .fetch_one(pool)
 | 
					            .fetch_one(pool)
 | 
				
			||||||
@@ -39,7 +39,7 @@ impl GuildData {
 | 
				
			|||||||
        sqlx::query!(
 | 
					        sqlx::query!(
 | 
				
			||||||
            "UPDATE guilds SET ephemeral_confirmations = ? WHERE id = ?",
 | 
					            "UPDATE guilds SET ephemeral_confirmations = ? WHERE id = ?",
 | 
				
			||||||
            self.ephemeral_confirmations,
 | 
					            self.ephemeral_confirmations,
 | 
				
			||||||
            self.id
 | 
					            self.guild_id
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        .execute(pool)
 | 
					        .execute(pool)
 | 
				
			||||||
        .await
 | 
					        .await
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,16 +68,19 @@ impl Data {
 | 
				
			|||||||
        guild_id: GuildId,
 | 
					        guild_id: GuildId,
 | 
				
			||||||
    ) -> Result<Vec<CommandMacro>, Error> {
 | 
					    ) -> Result<Vec<CommandMacro>, Error> {
 | 
				
			||||||
        let rows = sqlx::query!(
 | 
					        let rows = sqlx::query!(
 | 
				
			||||||
            "SELECT name, description, commands FROM command_macro WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)",
 | 
					            "SELECT name, description, commands FROM command_macro WHERE guild_id = ?",
 | 
				
			||||||
            guild_id.get()
 | 
					            guild_id.get()
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        .fetch_all(&self.database)
 | 
					        .fetch_all(&self.database)
 | 
				
			||||||
        .await?.iter().map(|row| CommandMacro {
 | 
					        .await?
 | 
				
			||||||
 | 
					        .iter()
 | 
				
			||||||
 | 
					        .map(|row| CommandMacro {
 | 
				
			||||||
            guild_id,
 | 
					            guild_id,
 | 
				
			||||||
            name: row.name.clone(),
 | 
					            name: row.name.clone(),
 | 
				
			||||||
            description: row.description.clone(),
 | 
					            description: row.description.clone(),
 | 
				
			||||||
            commands: serde_json::from_str(&row.commands.to_string()).unwrap(),
 | 
					            commands: serde_json::from_str(&row.commands.to_string()).unwrap(),
 | 
				
			||||||
        }).collect();
 | 
					        })
 | 
				
			||||||
 | 
					        .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Ok(rows)
 | 
					        Ok(rows)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -262,7 +262,7 @@ impl Reminder {
 | 
				
			|||||||
                            channels.id = reminders.channel_id
 | 
					                            channels.id = reminders.channel_id
 | 
				
			||||||
                        WHERE
 | 
					                        WHERE
 | 
				
			||||||
                            `status` = 'pending' AND
 | 
					                            `status` = 'pending' AND
 | 
				
			||||||
                            channels.guild_id = (SELECT id FROM guilds WHERE guild = ?)
 | 
					                            channels.guild_id = ?
 | 
				
			||||||
                        ",
 | 
					                        ",
 | 
				
			||||||
                        guild_id.get()
 | 
					                        guild_id.get()
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@ pub async fn get_reminder_templates(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    match sqlx::query_as_unchecked!(
 | 
					    match sqlx::query_as_unchecked!(
 | 
				
			||||||
        ReminderTemplate,
 | 
					        ReminderTemplate,
 | 
				
			||||||
        "SELECT * FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)",
 | 
					        "SELECT * FROM reminder_template WHERE guild_id = ?",
 | 
				
			||||||
        id
 | 
					        id
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    .fetch_all(pool.inner())
 | 
					    .fetch_all(pool.inner())
 | 
				
			||||||
@@ -57,7 +57,6 @@ pub async fn create_guild_reminder_template(
 | 
				
			|||||||
    check_authorization(cookies, ctx.inner(), id).await?;
 | 
					    check_authorization(cookies, ctx.inner(), id).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match create_reminder_template(
 | 
					    match create_reminder_template(
 | 
				
			||||||
        ctx.inner(),
 | 
					 | 
				
			||||||
        &mut transaction,
 | 
					        &mut transaction,
 | 
				
			||||||
        GuildId::new(id),
 | 
					        GuildId::new(id),
 | 
				
			||||||
        reminder_template.into_inner(),
 | 
					        reminder_template.into_inner(),
 | 
				
			||||||
@@ -87,15 +86,14 @@ pub async fn delete_reminder_template(
 | 
				
			|||||||
    check_authorization(cookies, ctx.inner(), id).await?;
 | 
					    check_authorization(cookies, ctx.inner(), id).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match sqlx::query!(
 | 
					    match sqlx::query!(
 | 
				
			||||||
        "DELETE FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?) AND id = ?",
 | 
					        "DELETE FROM reminder_template WHERE guild_id = ? AND id = ?",
 | 
				
			||||||
        id, delete_reminder_template.id
 | 
					        id,
 | 
				
			||||||
 | 
					        delete_reminder_template.id
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    .fetch_all(pool.inner())
 | 
					    .fetch_all(pool.inner())
 | 
				
			||||||
    .await
 | 
					    .await
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Ok(_) => {
 | 
					        Ok(_) => Ok(json!({})),
 | 
				
			||||||
            Ok(json!({}))
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Err(e) => {
 | 
					        Err(e) => {
 | 
				
			||||||
            warn!("Could not delete template from {}: {:?}", id, e);
 | 
					            warn!("Could not delete template from {}: {:?}", id, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@ pub async fn create_todo(
 | 
				
			|||||||
                "
 | 
					                "
 | 
				
			||||||
                INSERT INTO todos (guild_id, channel_id, value)
 | 
					                INSERT INTO todos (guild_id, channel_id, value)
 | 
				
			||||||
                VALUES (
 | 
					                VALUES (
 | 
				
			||||||
                    (SELECT id FROM guilds WHERE guild = ?),
 | 
					                    ?,
 | 
				
			||||||
                    (SELECT id FROM channels WHERE channel = ?),
 | 
					                    (SELECT id FROM channels WHERE channel = ?),
 | 
				
			||||||
                    ?
 | 
					                    ?
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
@@ -88,7 +88,7 @@ pub async fn create_todo(
 | 
				
			|||||||
                "
 | 
					                "
 | 
				
			||||||
                INSERT INTO todos (guild_id, channel_id, value)
 | 
					                INSERT INTO todos (guild_id, channel_id, value)
 | 
				
			||||||
                VALUES (
 | 
					                VALUES (
 | 
				
			||||||
                    (SELECT id FROM guilds WHERE guild = ?),
 | 
					                    ?,
 | 
				
			||||||
                    NULL,
 | 
					                    NULL,
 | 
				
			||||||
                    ?
 | 
					                    ?
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
@@ -130,11 +130,9 @@ pub async fn get_todo(
 | 
				
			|||||||
            channels.channel AS channel_id,
 | 
					            channels.channel AS channel_id,
 | 
				
			||||||
            value
 | 
					            value
 | 
				
			||||||
        FROM todos
 | 
					        FROM todos
 | 
				
			||||||
        INNER JOIN guilds
 | 
					 | 
				
			||||||
        ON guilds.id = todos.guild_id
 | 
					 | 
				
			||||||
        LEFT JOIN channels
 | 
					        LEFT JOIN channels
 | 
				
			||||||
        ON channels.id = todos.channel_id
 | 
					        ON channels.id = todos.channel_id
 | 
				
			||||||
        WHERE guilds.guild = ?
 | 
					        WHERE todos.guild_id = ?
 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        id
 | 
					        id
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
@@ -167,7 +165,7 @@ pub async fn update_todo(
 | 
				
			|||||||
        "
 | 
					        "
 | 
				
			||||||
        UPDATE todos
 | 
					        UPDATE todos
 | 
				
			||||||
        SET value = ?
 | 
					        SET value = ?
 | 
				
			||||||
        WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
            AND id = ?
 | 
					            AND id = ?
 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        todo.value,
 | 
					        todo.value,
 | 
				
			||||||
@@ -202,7 +200,7 @@ pub async fn delete_todo(
 | 
				
			|||||||
    sqlx::query!(
 | 
					    sqlx::query!(
 | 
				
			||||||
        "
 | 
					        "
 | 
				
			||||||
        DELETE FROM todos
 | 
					        DELETE FROM todos
 | 
				
			||||||
        WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
            AND id = ?
 | 
					            AND id = ?
 | 
				
			||||||
        ",
 | 
					        ",
 | 
				
			||||||
        guild_id,
 | 
					        guild_id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,8 @@ pub async fn export(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    match sqlx::query_as_unchecked!(
 | 
					    match sqlx::query_as_unchecked!(
 | 
				
			||||||
        ReminderTemplateCsv,
 | 
					        ReminderTemplateCsv,
 | 
				
			||||||
        "SELECT
 | 
					        "
 | 
				
			||||||
 | 
					        SELECT
 | 
				
			||||||
            name,
 | 
					            name,
 | 
				
			||||||
            attachment,
 | 
					            attachment,
 | 
				
			||||||
            attachment_name,
 | 
					            attachment_name,
 | 
				
			||||||
@@ -60,7 +61,9 @@ pub async fn export(
 | 
				
			|||||||
            interval_months,
 | 
					            interval_months,
 | 
				
			||||||
            tts,
 | 
					            tts,
 | 
				
			||||||
            username
 | 
					            username
 | 
				
			||||||
        FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)",
 | 
					        FROM reminder_template
 | 
				
			||||||
 | 
					        WHERE guild_id = ?
 | 
				
			||||||
 | 
					        ",
 | 
				
			||||||
        id
 | 
					        id
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    .fetch_all(pool.inner())
 | 
					    .fetch_all(pool.inner())
 | 
				
			||||||
@@ -144,7 +147,6 @@ pub async fn import(
 | 
				
			|||||||
                        };
 | 
					                        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        create_reminder_template(
 | 
					                        create_reminder_template(
 | 
				
			||||||
                            ctx.inner(),
 | 
					 | 
				
			||||||
                            &mut transaction,
 | 
					                            &mut transaction,
 | 
				
			||||||
                            GuildId::new(id),
 | 
					                            GuildId::new(id),
 | 
				
			||||||
                            reminder_template,
 | 
					                            reminder_template,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,10 +38,11 @@ pub async fn export(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    match sqlx::query_as_unchecked!(
 | 
					    match sqlx::query_as_unchecked!(
 | 
				
			||||||
        TodoCsv,
 | 
					        TodoCsv,
 | 
				
			||||||
        "SELECT value, CONCAT('#', channels.channel) AS channel_id FROM todos
 | 
					        "
 | 
				
			||||||
 | 
					        SELECT value, CONCAT('#', channels.channel) AS channel_id FROM todos
 | 
				
			||||||
        LEFT JOIN channels ON todos.channel_id = channels.id
 | 
					        LEFT JOIN channels ON todos.channel_id = channels.id
 | 
				
			||||||
        INNER JOIN guilds ON todos.guild_id = guilds.id
 | 
					        INNER JOIN guilds ON todos.guild_id = ?
 | 
				
			||||||
        WHERE guilds.guild = ?",
 | 
					        ",
 | 
				
			||||||
        id
 | 
					        id
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    .fetch_all(pool.inner())
 | 
					    .fetch_all(pool.inner())
 | 
				
			||||||
@@ -96,7 +97,7 @@ pub async fn import(
 | 
				
			|||||||
            Ok(body) => {
 | 
					            Ok(body) => {
 | 
				
			||||||
                let mut reader = csv::Reader::from_reader(body.as_slice());
 | 
					                let mut reader = csv::Reader::from_reader(body.as_slice());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                let query_placeholder = "(?, (SELECT id FROM channels WHERE channel = ?), (SELECT id FROM guilds WHERE guild = ?))";
 | 
					                let query_placeholder = "(?, (SELECT id FROM channels WHERE channel = ?), ?)";
 | 
				
			||||||
                let mut query_params = vec![];
 | 
					                let mut query_params = vec![];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for result in reader.deserialize::<TodoCsv>() {
 | 
					                for result in reader.deserialize::<TodoCsv>() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -373,12 +373,12 @@ pub(crate) async fn create_reminder(
 | 
				
			|||||||
    reminder: CreateReminder,
 | 
					    reminder: CreateReminder,
 | 
				
			||||||
) -> JsonResult {
 | 
					) -> JsonResult {
 | 
				
			||||||
    // check guild in db
 | 
					    // check guild in db
 | 
				
			||||||
    match sqlx::query!("SELECT 1 as A FROM guilds WHERE guild = ?", guild_id.get())
 | 
					    match sqlx::query!("SELECT 1 as A FROM guilds WHERE id = ?", guild_id.get())
 | 
				
			||||||
        .fetch_one(transaction.executor())
 | 
					        .fetch_one(transaction.executor())
 | 
				
			||||||
        .await
 | 
					        .await
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Err(sqlx::Error::RowNotFound) => {
 | 
					        Err(sqlx::Error::RowNotFound) => {
 | 
				
			||||||
            if sqlx::query!("INSERT INTO guilds (guild) VALUES (?)", guild_id.get())
 | 
					            if sqlx::query!("INSERT INTO guilds (id) VALUES (?)", guild_id.get())
 | 
				
			||||||
                .execute(transaction.executor())
 | 
					                .execute(transaction.executor())
 | 
				
			||||||
                .await
 | 
					                .await
 | 
				
			||||||
                .is_err()
 | 
					                .is_err()
 | 
				
			||||||
@@ -594,7 +594,6 @@ pub(crate) async fn create_reminder(
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) async fn create_reminder_template(
 | 
					pub(crate) async fn create_reminder_template(
 | 
				
			||||||
    ctx: &Context,
 | 
					 | 
				
			||||||
    transaction: &mut Transaction<'_>,
 | 
					    transaction: &mut Transaction<'_>,
 | 
				
			||||||
    guild_id: GuildId,
 | 
					    guild_id: GuildId,
 | 
				
			||||||
    reminder_template: ReminderTemplate,
 | 
					    reminder_template: ReminderTemplate,
 | 
				
			||||||
@@ -659,7 +658,7 @@ pub(crate) async fn create_reminder_template(
 | 
				
			|||||||
         interval_months,
 | 
					         interval_months,
 | 
				
			||||||
         tts,
 | 
					         tts,
 | 
				
			||||||
         username
 | 
					         username
 | 
				
			||||||
        ) VALUES ((SELECT id FROM guilds WHERE guild = ?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
 | 
					        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
 | 
				
			||||||
         ?, ?, ?, ?, ?, ?, ?)",
 | 
					         ?, ?, ?, ?, ?, ?, ?)",
 | 
				
			||||||
        guild_id.get(),
 | 
					        guild_id.get(),
 | 
				
			||||||
        name,
 | 
					        name,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user