aboutsummaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorFuwn <[email protected]>2020-11-01 00:24:43 -0700
committerFuwn <[email protected]>2020-11-01 00:24:43 -0700
commit85e486db6237870b585f07cfd4ea26af4a65bf85 (patch)
treee09d4ba0a498cdca612cc5e7ccf7fd2379fefb53 /src/modules
parentfeat (desc) (diff)
downloaddep-core-next-85e486db6237870b585f07cfd4ea26af4a65bf85.tar.xz
dep-core-next-85e486db6237870b585f07cfd4ea26af4a65bf85.zip
feat (desc)
feat: - implement somewhat ok but not done version of lavalink - new macros - plugin system - random hi plugin
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/commands/general/voice.rs76
-rw-r--r--src/modules/plugins/macros.rs104
-rw-r--r--src/modules/plugins/mod.rs3
-rw-r--r--src/modules/plugins/set_bot_game.rs10
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
+ };
+}