aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2018-05-03 22:08:54 -0400
committerNathan Perry <avaglir@gmail.com>2018-05-03 22:11:02 -0400
commita52eae2964e8e86bf3e587f17d607025f07efdbb (patch)
tree4d73278ab811280d57fde01d7635e4b3898b09f2
parent652a36f172df43c080d6dc1d3680166ee3045f82 (diff)
support message deletion0.1.4
-rw-r--r--Cargo.lock2
-rw-r--r--Cargo.toml2
-rw-r--r--migrations/2018-05-04-010249_deletion_record/down.sql1
-rw-r--r--migrations/2018-05-04-010249_deletion_record/up.sql7
-rw-r--r--src/commands/meme.rs11
-rw-r--r--src/db/mod.rs50
-rw-r--r--src/db/models.rs19
-rw-r--r--src/db/schema.rs12
-rw-r--r--src/main.rs8
9 files changed, 107 insertions, 5 deletions
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 <avaglir@gmail.com>"]
[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::<String>()?;
+
+ 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<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme>
.map_err(Error::from)
}
+pub fn delete_meme<T: AsRef<str>>(conn: &PgConnection, search: T, deleted_by: u64) -> Result<()> {
+ conn.transaction::<(), Error, _>(|| {
+ let deleted = memes::table
+ .filter(memes::title.eq(search.as_ref()))
+ .first::<Meme>(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<Meme> {
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<Int4>,
+ }
+}
+
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")));
+ }
}
}