Skip to content

Commit

Permalink
fix tag edit self conflicts, organize tag local names
Browse files Browse the repository at this point in the history
  • Loading branch information
drklee3 committed Feb 4, 2018
1 parent 0074879 commit 0313c10
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 37 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rust-sbot2"
version = "0.1.6"
version = "0.1.7"
authors = ["drklee3 <drklee3@users.noreply.github.com>"]

[dependencies]
Expand Down
19 changes: 12 additions & 7 deletions assets/locale.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@

"tag_added": "Added a tag named `{}` with response `{}`.",
"tag_edited": "Edited `{}` with new name `{}` and response `{}`.",
"tag_deleted": "Deleted the tag `{}`."
"tag_edited_content": "Edited `{}` with new response `{}`.",
"tag_deleted": "Deleted the tag `{}`.",
"tag_list": ":mailbox_with_mail: Sent you a DM with the tag list."
},
"error": {
"unknown_error": "Something has gone wrong :( Try this again maybe?",
Expand All @@ -49,9 +51,6 @@
"no_mute_role": "There isn't a mute role set.",
"no_user_given": "Please give a user id or mention.",
"no_webhook_given": "Please give a webhook url.",
"no_tag_name_given": "Please give a tag name.",
"no_tag_content_given": "Please give tag content.",
"no_tag_search_given": "Please give a tag search.",

"invalid_channel": "Invalid channel.",
"invalid_role": "Invalid role id, mention, or name.",
Expand Down Expand Up @@ -103,9 +102,15 @@
"fm_no_username_mentioned": "No Last.fm username found for this user.",
"fm_fetch_error": "Something went wrong fetching last.fm data.",


"tag_no_name_given": "Please give a tag name.",
"tag_no_content_given": "Please give tag content.",
"tag_no_search_given": "Please give a tag search.",
"tag_already_exists": "This tag already exists. Try another name.",
"no_tag_found": "There doesn't seem to be a tag named `{}`.",
"no_tags_found": "Couldn't find any tags.",
"tag_failed_delete": "This tag doesn't belong to you or it doesn't exist."
"tag_not_found": "There doesn't seem to be a tag named `{}`.",
"tags_not_found": "Couldn't find any tags.",
"tag_not_owner": "This tag doesn't belong to you.",
"tag_not_found_or_not_owner": "This tag doesn't belong to you or it doesn't exist.",
"tag_content_unchanged": "New tag response is unchanged. You can either edit the name or content of the tag."
}
}
106 changes: 83 additions & 23 deletions src/commands/tags.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use serenity::framework::standard::CommandError;
use serenity::model::id::UserId;
use serenity::model::channel::Message;
use serenity::CACHE;

use std::fmt::Write;
Expand All @@ -8,15 +9,15 @@ use utils::config::get_pool;
command!(tag(ctx, msg, args) {
let tag_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

if let Some(guild_id) = msg.guild_id() {
let pool = get_pool(&ctx);

let found_tag = match pool.get_tag(guild_id.0, &tag_name) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/no_tag_found", tag_name))),
None => return Err(CommandError::from(get_msg!("error/tag_not_found", tag_name))),
};

let _ = msg.channel_id.say(&found_tag.content);
Expand All @@ -28,15 +29,15 @@ command!(tag(ctx, msg, args) {
command!(tag_info(ctx, msg, args) {
let tag_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

if let Some(guild_id) = msg.guild_id() {
let pool = get_pool(&ctx);

let found_tag = match pool.get_tag(guild_id.0, &tag_name) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/no_tag_found", tag_name))),
None => return Err(CommandError::from(get_msg!("error/tag_not_found", tag_name))),
};

let (user_tag, user_face) = match UserId(found_tag.owner_id as u64).get() {
Expand Down Expand Up @@ -75,14 +76,14 @@ command!(tag_add(ctx, msg, args) {

let tag_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

let tag_content = args.full();

// check if tag content is given or no
if tag_content.is_empty() {
return Err(CommandError::from(get_msg!("error/no_tag_content_given")));
return Err(CommandError::from(get_msg!("error/tag_no_content_given")));
}

// if in guild
Expand All @@ -106,7 +107,7 @@ command!(tag_list(ctx, msg, _args) {
let pool = get_pool(&ctx);
let tags = match pool.get_tags(guild_id.0) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/no_tags_found"))),
None => return Err(CommandError::from(get_msg!("error/tags_not_found"))),
};

let mut contents = String::new();
Expand All @@ -129,7 +130,7 @@ command!(tag_list(ctx, msg, _args) {
}

if !msg.is_private() {
let _ = msg.channel_id.say(":mailbox_with_mail: Sent you a DM with the commands list.");
let _ = msg.channel_id.say(get_msg!("info/tag_list"));
}
} else {
return Err(CommandError::from(get_msg!("error/no_guild")));
Expand All @@ -143,7 +144,7 @@ command!(tag_top(ctx, msg, _args) {

let top_tags = match pool.get_tags_top(guild_id.0) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/no_tags_found"))),
None => return Err(CommandError::from(get_msg!("error/tags_not_found"))),
};

let _ = msg.channel_id.send_message(|m| m
Expand Down Expand Up @@ -171,7 +172,7 @@ command!(tag_search(ctx, msg, args) {
if let Some(guild_id) = msg.guild_id() {
let search = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_search_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_search_given"))),
};

let pool = get_pool(&ctx);
Expand All @@ -193,7 +194,7 @@ command!(tag_search(ctx, msg, args) {
})
);
} else {
return Err(CommandError::from(get_msg!("error/no_tags_found")));
return Err(CommandError::from(get_msg!("error/tags_not_found")));
}


Expand All @@ -206,15 +207,26 @@ command!(tag_delete(ctx, msg, args) {
if let Some(guild_id) = msg.guild_id() {
let tag_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

let pool = get_pool(&ctx);

if pool.delete_tag(msg.author.id.0, guild_id.0, &tag_name) {
// get the current tag to check owner
let current = match pool.get_tag(guild_id.0, &tag_name) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/tag_not_found"))),
};

// check if user owns the tag or has mod perms
if !current.is_owner(msg.author.id.0) && !has_permission(&msg) {
return Err(CommandError::from(get_msg!("error/tag_no_permission")))
}

if pool.delete_tag(guild_id.0, &tag_name) {
let _ = msg.channel_id.say(get_msg!("info/tag_deleted", tag_name));
} else {
return Err(CommandError::from(get_msg!("error/tag_failed_delete")));
return Err(CommandError::from(get_msg!("error/tag_not_found_or_not_owner")));
}

} else {
Expand All @@ -228,30 +240,54 @@ command!(tag_edit(ctx, msg, args) {

let tag_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

let tag_new_name = match args.single::<String>() {
Ok(val) => val,
Err(_) => return Err(CommandError::from(get_msg!("error/no_tag_name_given"))),
Err(_) => return Err(CommandError::from(get_msg!("error/tag_no_name_given"))),
};

let tag_content = args.full();

// check if tag content is given or no
if tag_content.is_empty() {
return Err(CommandError::from(get_msg!("error/no_tag_content_given")));
return Err(CommandError::from(get_msg!("error/tag_no_content_given")));
}

// check if new tag name already exists
if let Some(_) = pool.get_tag(guild_id.0, &tag_new_name) {
return Err(CommandError::from(get_msg!("error/tag_already_exists")));
// get the current tag to check owner
let current = match pool.get_tag(guild_id.0, &tag_name) {
Some(val) => val,
None => return Err(CommandError::from(get_msg!("error/tag_not_found"))),
};

// check if changing the tag name
if tag_name != tag_new_name {
// check if new tag name already exists
if let Some(_) = pool.get_tag(guild_id.0, &tag_new_name) {
return Err(CommandError::from(get_msg!("error/tag_already_exists")));
}
} else if current.content == tag_content {
// if tag is the same, check if content changed
// check if content changed
return Err(CommandError::from(get_msg!("error/tag_content_unchanged")));
}

if pool.edit_tag(msg.author.id.0, guild_id.0, &tag_name, &tag_new_name, &tag_content) {
let _ = msg.channel_id.say(get_msg!("info/tag_added", &tag_name, &tag_new_name, &tag_content));

// check if user owns the tag or has mod perms
if !current.is_owner(msg.author.id.0) && !has_permission(&msg) {
return Err(CommandError::from(get_msg!("error/tag_no_permission")))
}

if pool.edit_tag(guild_id.0, &tag_name, &tag_new_name, &tag_content) {
if tag_name == tag_new_name {
// if only content was modified
let _ = msg.channel_id.say(get_msg!("info/tag_edited_content", &tag_name, &tag_content));
} else {
let _ = msg.channel_id.say(get_msg!("info/tag_edited", &tag_name, &tag_new_name, &tag_content));
}
} else {
return Err(CommandError::from(get_msg!("error/tag_failed_delete")));
return Err(CommandError::from(get_msg!("error/tag_not_found_or_not_owner")));
}
} else {
return Err(CommandError::from(get_msg!("error/no_guild")));
Expand Down Expand Up @@ -310,4 +346,28 @@ fn split_message(msg: &str, prepend: Option<&str>, with_code_block: bool) -> Vec
}

vec
}

fn has_permission(msg: &Message) -> bool {
let guild = match msg.guild() {
Some(guild) => guild,
None => {
warn!("Couldn't get message guild!");

return false;
}
};
let guild = guild.read();

// fetch member
let member = match guild.members.get(&msg.author.id) {
Some(member) => member,
None => return false
};
// check if has perm
if let Ok(permissions) = member.permissions() {
return permissions.manage_guild();
} else {
return false;
}
}
9 changes: 4 additions & 5 deletions src/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1062,13 +1062,13 @@ impl ConnectionPool {
.ok()
}

pub fn delete_tag(&self, user_id: u64, guild: u64, name: &str) -> bool {
pub fn delete_tag(&self, guild: u64, name: &str) -> bool {
use schema::tags::dsl::*;

let conn = self.connection();

match diesel::delete(tags
.filter(owner_id.eq(user_id as i64))
match diesel::delete(
tags
.filter(guild_id.eq(guild as i64))
.filter(tag_name.eq(name))
)
Expand All @@ -1091,14 +1091,13 @@ impl ConnectionPool {
}
}

pub fn edit_tag(&self, user_id: u64, guild: u64, name: &str, new_name: &str, new_content: &str) -> bool {
pub fn edit_tag(&self, guild: u64, name: &str, new_name: &str, new_content: &str) -> bool {
use schema::tags;
use schema::tags::dsl::*;

let conn = self.connection();

if let Err(e) = diesel::update(tags::table)
.filter(owner_id.eq(user_id as i64))
.filter(guild_id.eq(guild as i64))
.filter(tag_name.eq(name))
.set((
Expand Down
6 changes: 6 additions & 0 deletions src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,12 @@ pub struct Tag {
pub created: NaiveDateTime,
}

impl Tag {
pub fn is_owner(&self, id: u64) -> bool {
id == self.owner_id as u64
}
}

#[derive(Insertable)]
#[table_name = "tags"]
pub struct NewTag<'a> {
Expand Down

0 comments on commit 0313c10

Please sign in to comment.