From 86cd00f20d6f218e524deed040d3c209f0361a86 Mon Sep 17 00:00:00 2001 From: Austin Hellyer Date: Fri, 16 Dec 2016 21:40:45 -0800 Subject: [PATCH] Remove cache feature dependency for framework --- Cargo.toml | 2 +- src/client/mod.rs | 12 ++++ src/ext/framework/mod.rs | 120 +++++++++++++++++++++------------------ 3 files changed, 78 insertions(+), 56 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4d429a7a992..9480917a0bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,6 @@ yaml-rust = "0.3" default = ["cache", "framework", "methods"] cache = [] debug = [] -framework = ["cache"] +framework = [] methods = [] voice = ["opus", "sodiumoxide"] diff --git a/src/client/mod.rs b/src/client/mod.rs index c9a9c6592e6..b0193b3b106 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -768,6 +768,18 @@ impl Client { // // Not all shards need to be initialized in this process. fn start_connection(&mut self, shard_data: Option<[u8; 3]>) -> Result<()> { + // Update the framework's current user if the feature is enabled. + // + // This also acts as a form of check to ensure the token is correct. + #[cfg(feature="framework")] + { + let user = rest::get_current_user()?; + + self.framework.lock() + .unwrap() + .update_current_user(user.id, user.bot); + } + let gateway_url = rest::get_gateway()?.url; for i in 0..shard_data.map_or(1, |x| x[1] + 1) { diff --git a/src/ext/framework/mod.rs b/src/ext/framework/mod.rs index c580d76a130..a96189790ac 100644 --- a/src/ext/framework/mod.rs +++ b/src/ext/framework/mod.rs @@ -72,10 +72,13 @@ use std::collections::HashMap; use std::default::Default; use std::sync::Arc; use std::thread; -use ::client::{CACHE, Context}; -use ::model::Message; +use ::client::Context; +use ::model::{Message, UserId}; use ::utils; +#[cfg(feature="cache")] +use ::client::CACHE; + /// A macro to generate "named parameters". This is useful to avoid manually /// using the "arguments" parameter and manually parsing types. /// @@ -189,6 +192,7 @@ pub struct Framework { /// [`Client::on_message`]: ../../client/struct.Client.html#method.on_message /// [`Event::MessageCreate`]: ../../model/event/enum.Event.html#variant.MessageCreate pub initialized: bool, + user_info: (u64, bool), } impl Framework { @@ -259,7 +263,7 @@ impl Framework { pub fn dispatch(&mut self, context: Context, message: Message) { match self.configuration.account_type { AccountType::Selfbot => { - if message.author.id != CACHE.read().unwrap().user.id { + if message.author.id != self.user_info.0 { return; } }, @@ -267,13 +271,11 @@ impl Framework { return; }, AccountType::Automatic => { - let cache = CACHE.read().unwrap(); - - if cache.user.bot { + if self.user_info.1 { if message.author.bot { return; } - } else if message.author.id != cache.user.id { + } else if message.author.id != self.user_info.0 { return; } }, @@ -347,31 +349,6 @@ impl Framework { return; } - if let Some(guild_id) = message.guild_id() { - if self.configuration.blocked_guilds.contains(&guild_id) { - if let Some(ref message) = self.configuration.blocked_guild_message { - let _ = context.say(message); - } - - return; - } - } - - #[cfg(feature="cache")] - { - if let Some(guild_id) = message.guild_id() { - if let Some(guild) = guild_id.find() { - if self.configuration.blocked_users.contains(&guild.owner_id) { - if let Some(ref message) = self.configuration.blocked_guild_message { - let _ = context.say(message); - } - - return; - } - } - } - } - if self.configuration.blocked_users.contains(&message.author.id) { if let Some(ref message) = self.configuration.blocked_user_message { let _ = context.say(message); @@ -405,20 +382,45 @@ impl Framework { } } - if message.is_private() { - if command.guild_only { - if let Some(ref message) = self.configuration.no_guild_message { + #[cfg(feature="cache")] + { + if let Some(guild_id) = message.guild_id() { + if self.configuration.blocked_guilds.contains(&guild_id) { + if let Some(ref message) = self.configuration.blocked_guild_message { + let _ = context.say(message); + } + + return; + } + } + + if let Some(guild_id) = message.guild_id() { + if let Some(guild) = guild_id.find() { + if self.configuration.blocked_users.contains(&guild.owner_id) { + if let Some(ref message) = self.configuration.blocked_guild_message { + let _ = context.say(message); + } + + return; + } + } + } + + if message.is_private() { + if command.guild_only { + if let Some(ref message) = self.configuration.no_guild_message { + let _ = context.say(message); + } + + return; + } + } else if command.dm_only { + if let Some(ref message) = self.configuration.no_dm_message { let _ = context.say(message); } return; } - } else if command.dm_only { - if let Some(ref message) = self.configuration.no_dm_message { - let _ = context.say(message); - } - - return; } for check in &command.checks { @@ -472,27 +474,30 @@ impl Framework { } } - if !is_owner && !command.required_permissions.is_empty() { - let mut permissions_fulfilled = false; + #[cfg(feature="cache")] + { + if !is_owner && !command.required_permissions.is_empty() { + let mut permissions_fulfilled = false; - if let Some(member) = message.get_member() { - let cache = CACHE.read().unwrap(); + if let Some(member) = message.get_member() { + let cache = CACHE.read().unwrap(); - if let Ok(guild_id) = member.find_guild() { - if let Some(guild) = cache.get_guild(guild_id) { - let perms = guild.permissions_for(message.channel_id, message.author.id); + if let Ok(guild_id) = member.find_guild() { + if let Some(guild) = cache.get_guild(guild_id) { + let perms = guild.permissions_for(message.channel_id, message.author.id); - permissions_fulfilled = perms.contains(command.required_permissions); + permissions_fulfilled = perms.contains(command.required_permissions); + } } } - } - if !permissions_fulfilled { - if let Some(ref message) = self.configuration.invalid_permission_message { - let _ = context.say(message); - } + if !permissions_fulfilled { + if let Some(ref message) = self.configuration.invalid_permission_message { + let _ = context.say(message); + } - return; + return; + } } } @@ -674,6 +679,11 @@ impl Framework { self } + #[doc(hidden)] + pub fn update_current_user(&mut self, user_id: UserId, is_bot: bool) { + self.user_info = (user_id.0, is_bot); + } + fn ratelimit_time(&mut self, bucket_name: &str, user_id: u64) -> i64 { self.buckets .get_mut(bucket_name)