diff options
| author | Fuwn <[email protected]> | 2020-11-01 00:24:43 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2020-11-01 00:24:43 -0700 |
| commit | 85e486db6237870b585f07cfd4ea26af4a65bf85 (patch) | |
| tree | e09d4ba0a498cdca612cc5e7ccf7fd2379fefb53 /src/modules/commands | |
| parent | feat (desc) (diff) | |
| download | dep-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/commands')
| -rw-r--r-- | src/modules/commands/general/voice.rs | 76 |
1 files changed, 47 insertions, 29 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(()) |