diff options
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/commands/general/voice.rs | 76 | ||||
| -rw-r--r-- | src/modules/plugins/macros.rs | 104 | ||||
| -rw-r--r-- | src/modules/plugins/mod.rs | 3 | ||||
| -rw-r--r-- | src/modules/plugins/set_bot_game.rs | 10 |
4 files changed, 162 insertions, 31 deletions
diff --git a/src/modules/commands/general/voice.rs b/src/modules/commands/general/voice.rs index 1849f78..48f4df2 100644 --- a/src/modules/commands/general/voice.rs +++ b/src/modules/commands/general/voice.rs @@ -10,6 +10,7 @@ use serenity::framework::standard::{ use serenity::model::channel::Message; use serenity::prelude::Context; use std::sync::Arc; +use songbird::SerenityInit; pub struct Join; impl Command for Join { @@ -27,7 +28,10 @@ impl Command for Join { } fn execute(&self, ctx: &mut Context, message: &Message, _args: Args) -> Result<(), CommandError> { - // if not deafened, ask to please deeafen + // let guild_id = message.guild().unwrap().read().id; + let guild = message.guild().unwrap(); + let guild_id = guild.read().id; + let channel_id = message.guild().unwrap().read() .voice_states.get(&message.author.id) .and_then(|voice_state| voice_state.channel_id); @@ -35,25 +39,45 @@ impl Command for Join { let connect_to = match channel_id { Some(channel) => channel, None => { - message.channel_id.say("You aren't in a voice channel...")?; + message.channel_id.say("You aren't in a voice channel... Only the people within a given voice channel can make me join.")?; return Ok(()) } }; + let manager = songbird::get(ctx).unwrap().clone(); + // let (_, handler) = manager.join_gateway(guild_id, connect_to); + let manager_lock = ctx.data.lock().get::<VoiceManager>().cloned() - .expect("Expected VoiceManager in ShareMap."); // mut + .expect("Expected VoiceManager in TypeMap."); let mut manager = manager_lock.lock(); - let has_handler = manager.get(message.guild().unwrap().read().id).is_some(); + let has_joined = manager.join(guild_id, connect_to).is_some(); - if has_handler { - message.channel_id.say(format!("Sorry, but I'm already in <#{}>.", connect_to))?; - } else { - if manager.join(message.guild().unwrap().read().id, connect_to).is_some() { - message.channel_id.say(format!("I'm now in <#{}>.", connect_to))?; - } else { - message.channel_id.say("I've encountered an error while trying to join your voice channel.")?; + if has_joined { + drop(manager); + + loop { + let vgu_lock = ctx.data.lock().get::<VoiceGuildUpdate>().unwrap(); + let mut vgu = vgu_lock.write(); + if vgu.contains(&guild_id) { + vgu.remove(&guild_id); + break; + } } + + let manager_lock = ctx.data.lock().get::<VoiceManager>().cloned() + .expect("Expected VoiceManager in TypeMap."); + let manager = manager_lock.lock(); + + let mut data = ctx.data.lock(); + let lava_client_lock = data.get_mut::<Lavalink>() + .expect("Expected LavalinkClient in TypeMap."); + let handler = manager.get(guild_id).unwrap(); + lava_client_lock.lock().create_session(guild_id, &handler); + + message.channel_id.say(format!("Joined {:?}", connect_to.name()))?; + } else { + message.channel_id.say("Error joining channel...")?; } Ok(()) @@ -76,31 +100,25 @@ impl Command for Leave { } fn execute(&self, ctx: &mut Context, message: &Message, _args: Args) -> Result<(), CommandError> { - let channel_id = message.guild().unwrap().read() - .voice_states.get(&message.author.id) - .and_then(|voice_state| voice_state.channel_id); - - let connect_to = match channel_id { - Some(channel) => channel, - None => { - message.channel_id.say("You aren't in a voice channel... Only the people within a given voice channel can make me leave.")?; - - return Ok(()) - } - }; + let guild = message.guild().unwrap(); + let guild_id = guild.read().id; let manager_lock = ctx.data.lock().get::<VoiceManager>().cloned() - .expect("Expected VoiceManager in ShareMap."); // mut + .expect("Expected VoiceManager in TypeMap."); let mut manager = manager_lock.lock(); - let has_handler = manager.get(message.guild().unwrap().read().id).is_some(); + let has_handler = manager.get(guild_id).is_some(); if has_handler { - manager.remove(message.guild().unwrap().read().id); + manager.remove(guild_id); + + let mut data = ctx.data.lock(); + let lava_client_lock = data.get_mut::<Lavalink>() + .expect("Expected LavalinkClient in TypeMap."); + lava_client_lock.lock().destroy(guild_id); - message.channel_id.say(format!("I've left <#{:?}>.", - manager.get(message.guild().unwrap().read().id)))?; + message.channel_id.say(format!("Left voice channel"))?; } else { - message.channel_id.say("Sorry, but I'm not in a voice channel right now.")?; + message.channel_id.say("Error joining channel...")?; } Ok(()) diff --git a/src/modules/plugins/macros.rs b/src/modules/plugins/macros.rs index f28cf7c..84c6226 100644 --- a/src/modules/plugins/macros.rs +++ b/src/modules/plugins/macros.rs @@ -1,4 +1,5 @@ #![macro_use] +#![allow(unused_macros)] #[macro_export] macro_rules! exec_on_message { @@ -9,3 +10,106 @@ macro_rules! exec_on_message { $($plugin::on_message($ctx, /* &pool, */ $message);)* }} } + +macro_rules! exec_on_message_update { + ([$ctx:expr, $event:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_message_update($ctx, /* &pool, */ $event);)* + }} +} + +macro_rules! exec_on_message_delete { + ([$ctx:expr, $channel_id:expr, $msg_id:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_message_delete($ctx, /* &pool, */ $channel_id, $msg_id);)* + }} +} + +macro_rules! exec_on_reaction_add { + ([$ctx:expr, $reaction:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_reaction_add($ctx, /* &pool, */ $reaction);)* + }} +} + +// macro_rules! exec_on_reaction_remove { +// ([$ctx:expr, $reaction:expr], $($plugin:ident), *) => {{ +// use utils::config::get_pool; +// let pool = get_pool(&$ctx); + +// $($plugin::on_reaction_remove($ctx, &pool, $reaction);)* +// }} +// } + +macro_rules! exec_on_ready { + ([$ctx:expr, $ready:expr], $($plugin:ident), *) => { + $($plugin::on_ready($ctx, $ready);)* + } +} + +macro_rules! exec_on_presence_update { + ([$ctx:expr, $presenceupdateevent:expr], $($plugin:ident), *) => { + $($plugin::on_presence_update($ctx, $presenceupdateevent);)* + } +} + +macro_rules! exec_on_guild_member_addition { + ([$ctx:expr, $GuildId:expr, $member:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_guild_member_addition($ctx, /* &pool, */ $GuildId, $member);)* + }} +} + + +macro_rules! exec_on_guild_member_removal { + ([$ctx:expr, $GuildId:expr, $user:expr, $member:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_guild_member_removal($ctx, /* &pool, */ $GuildId, $user, $member);)* + }} +} + +macro_rules! exec_on_guild_ban_addition { + ([$ctx:expr, $GuildId:expr, $user:expr], $($plugin:ident), *) => { + $($plugin::on_guild_ban_addition($ctx, $GuildId, $user);)* + } +} + +macro_rules! exec_on_guild_ban_removal { + ([$ctx:expr, $GuildId:expr, $user:expr], $($plugin:ident), *) => { + $($plugin::on_guild_ban_removal($ctx, $GuildId, $user);)* + } +} + +macro_rules! exec_on_guild_member_update { + ([$ctx:expr, $prev_member:expr, $curr_member:expr], $($plugin:ident), *) => { + $($plugin::on_guild_member_update($ctx, $prev_member, $curr_member);)* + } +} + +macro_rules! exec_on_guild_create { + ([$ctx:expr, $guild:expr, $if_joined:expr], $($plugin:ident), *) => { + $($plugin::on_guild_create($ctx, $guild, $if_joined);)* + } +} + +macro_rules! exec_on_guild_members_chunk { + ([$ctx:expr, $guild_id:expr, $members:expr], $($plugin:ident), *) => { + $($plugin::on_guild_members_chunk($ctx, $guild_id, $members);)* + } +} + +macro_rules! exec_on_guild_update { + ([$ctx:expr, $guild:expr, $partial_guild:expr], $($plugin:ident), *) => { + $($plugin::on_guild_update($ctx, $guild, $partial_guild);)* + } +} diff --git a/src/modules/plugins/mod.rs b/src/modules/plugins/mod.rs index 10e3e24..2d01861 100644 --- a/src/modules/plugins/mod.rs +++ b/src/modules/plugins/mod.rs @@ -1,3 +1,2 @@ -// #[macro_use] pub mod macros; - +pub mod macros; pub mod random_hi; diff --git a/src/modules/plugins/set_bot_game.rs b/src/modules/plugins/set_bot_game.rs new file mode 100644 index 0000000..44ab51a --- /dev/null +++ b/src/modules/plugins/set_bot_game.rs @@ -0,0 +1,10 @@ +use serenity::prelude::Context; +use serenity::model::gateway::{Ready, Game}; +use std::env; + +pub fn on_message(ctx: &Context, _: &Ready) { + match env::var("BOT_GAME") { + Ok(val) => ctx.set_game(Game::playing(&val)), + Err(_) => return + }; +} |