From a52eae2964e8e86bf3e587f17d607025f07efdbb Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Thu, 3 May 2018 22:08:54 -0400 Subject: support message deletion --- Cargo.lock | 2 +- Cargo.toml | 2 +- .../2018-05-04-010249_deletion_record/down.sql | 1 + .../2018-05-04-010249_deletion_record/up.sql | 7 +++ src/commands/meme.rs | 11 +++-- src/db/mod.rs | 50 ++++++++++++++++++++++ src/db/models.rs | 19 ++++++++ src/db/schema.rs | 12 ++++++ src/main.rs | 8 ++++ 9 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 migrations/2018-05-04-010249_deletion_record/down.sql create mode 100644 migrations/2018-05-04-010249_deletion_record/up.sql diff --git a/Cargo.lock b/Cargo.lock index 6d30170..1f13930 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1409,7 +1409,7 @@ dependencies = [ [[package]] name = "thulani" -version = "0.1.2" +version = "0.1.4" dependencies = [ "chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index ef970e5..707f015 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "thulani" -version = "0.1.3" +version = "0.1.4" authors = ["Nathan Perry "] [features] diff --git a/migrations/2018-05-04-010249_deletion_record/down.sql b/migrations/2018-05-04-010249_deletion_record/down.sql new file mode 100644 index 0000000..2a393f0 --- /dev/null +++ b/migrations/2018-05-04-010249_deletion_record/down.sql @@ -0,0 +1 @@ +DROP TABLE tombstones; diff --git a/migrations/2018-05-04-010249_deletion_record/up.sql b/migrations/2018-05-04-010249_deletion_record/up.sql new file mode 100644 index 0000000..64f6220 --- /dev/null +++ b/migrations/2018-05-04-010249_deletion_record/up.sql @@ -0,0 +1,7 @@ +CREATE TABLE tombstones ( + id SERIAL PRIMARY KEY, + meme_id INTEGER NOT NULL, + deleted_by BIGINT NOT NULL, + deleted_at TIMESTAMP NOT NULL DEFAULT current_timestamp, + metadata_id INTEGER REFERENCES metadata +); diff --git a/src/commands/meme.rs b/src/commands/meme.rs index 6c78fc5..d1c90d1 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -61,11 +61,16 @@ pub fn addmeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<()> { metadata_id: 0, }.save(&conn, msg.author.id.0).map(|_| {})?; - return msg.react("👌"); + msg.react("👌") } -pub fn delmeme(_: &mut Context, msg: &Message, _: Args) -> Result<()> { - send(msg.channel_id, "hwaet", msg.tts) +pub fn delmeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<()> { + let title = args.single_quoted::()?; + + let conn = connection()?; + delete_meme(&conn, &title, msg.author.id.0)?; + + msg.react("💀") } pub fn renamememe(_: &mut Context, msg: &Message, _: Args) -> Result<()> { diff --git a/src/db/mod.rs b/src/db/mod.rs index 8657a4f..0bf2f1d 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -35,6 +35,56 @@ pub fn find_meme>(conn: &PgConnection, search: T) -> Result .map_err(Error::from) } +pub fn delete_meme>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> { + conn.transaction::<(), Error, _>(|| { + let deleted = memes::table + .filter(memes::title.eq(search.as_ref())) + .first::(conn)?; + + ::diesel::delete(memes::table) + .filter(memes::id.eq(deleted.id)) + .execute(conn)?; + + if let Some(image_id) = deleted.image_id { + let count = memes::table + .filter(memes::image_id.eq(image_id)) + .count() + .execute(conn)?; + + if count == 0 { + ::diesel::delete(images::table) + .filter(images::id.eq(image_id)) + .execute(conn)?; + } + } + + if let Some(audio_id) = deleted.audio_id { + let count = memes::table + .select(::diesel::dsl::count_star()) + .filter(memes::audio_id.eq(audio_id)) + .execute(conn)?; + + if count == 0 { + ::diesel::delete(audio::table) + .filter(audio::id.eq(audio_id)) + .execute(conn)?; + } + } + + let tombstone = NewTombstone { + deleted_by: deleted_by as i64, + metadata_id: deleted.metadata_id, + meme_id: deleted.id, + }; + + let _ = ::diesel::insert_into(tombstones::table) + .values(&tombstone) + .execute(conn)?; + + Ok(()) + }) +} + pub fn rand_text(conn: &PgConnection) -> Result { memes::table .filter(memes::content.is_not_null()) diff --git a/src/db/models.rs b/src/db/models.rs index 6ac8b18..d25b593 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -203,3 +203,22 @@ pub struct NewAuditRecord { pub updated_by: i64, pub metadata_id: i32, } + +#[derive(Queryable, Identifiable, PartialEq, Debug)] +#[table_name="tombstones"] +pub struct Tombstone { + pub id: i32, + pub deleted: NaiveDateTime, + pub deleted_by: i64, + pub metadata_id: i32, + pub meme_id: i32, +} + + +#[derive(Insertable, PartialEq, Debug)] +#[table_name="tombstones"] +pub struct NewTombstone { + pub deleted_by: i64, + pub metadata_id: i32, + pub meme_id: i32, +} diff --git a/src/db/schema.rs b/src/db/schema.rs index 1822204..8749731 100644 --- a/src/db/schema.rs +++ b/src/db/schema.rs @@ -45,12 +45,23 @@ table! { } } +table! { + tombstones (id) { + id -> Int4, + meme_id -> Int4, + deleted_by -> Int8, + deleted_at -> Timestamp, + metadata_id -> Nullable, + } +} + joinable!(audio -> metadata (metadata_id)); joinable!(audit_records -> metadata (metadata_id)); joinable!(images -> metadata (metadata_id)); joinable!(memes -> audio (audio_id)); joinable!(memes -> images (image_id)); joinable!(memes -> metadata (metadata_id)); +joinable!(tombstones -> metadata (metadata_id)); allow_tables_to_appear_in_same_query!( audio, @@ -58,4 +69,5 @@ allow_tables_to_appear_in_same_query!( images, memes, metadata, + tombstones, ); diff --git a/src/main.rs b/src/main.rs index a2a4e6d..ff5ca24 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,6 +59,14 @@ impl EventHandler for Handler { if guild.is_none() { info!("bot isn't in configured guild. join here: {:?}", OAUTH_URL.as_str()); } + + #[cfg(debug_assertions)] { + let _ = guild.map(|g| g.id().edit_nickname(Some("thulani (dev)"))); + } + + #[cfg(not(debug_assertions))] { + let _ = guild.map(|g| g.id().edit_nickname(Some("thulani"))); + } } } -- cgit v1.3.1