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 | |
| 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
| -rw-r--r-- | Cargo.toml | 9 | ||||
| -rw-r--r-- | src/core/handler.rs | 11 | ||||
| -rw-r--r-- | src/core/lavalink_handler.rs | 14 | ||||
| -rw-r--r-- | src/core/mod.rs | 1 | ||||
| -rw-r--r-- | src/core/model.rs | 11 | ||||
| -rw-r--r-- | src/lib.rs | 9 | ||||
| -rw-r--r-- | src/macros.rs | 76 | ||||
| -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 |
11 files changed, 279 insertions, 45 deletions
@@ -38,6 +38,7 @@ urbandictionary = "0.3" # rocket = "0.4.5" # rocket_contrib = "0.4.5" # tokio = { version = "0.2.22", features = ["full"] } +# lavalink-rs = { git = "https://gitlab.com/nitsuga5124/lavalink-rs", branch = "songbird" } [dependencies.parking_lot] version = "0.6" @@ -53,9 +54,15 @@ features = ["colored"] [dependencies.serenity] git = "https://github.com/Mishio595/serenity.git" -# path = "/home/adelyn/dev/serenity" +# path = "/home/fuwn/dev/serenity" default-features = false features = ["builder", "client", "cache", "framework", "standard_framework", "gateway", "http", "model", "utils"] # voice +# [dependencies.songbird] +# git = "https://github.com/serenity-rs/serenity" +# rev = "29d639b6288c83df7aeb0a2ced9d2b77ec6c6241" +# default-features = false +# features = ["serenity-native", "gateway"] + [patch.crates-io] openssl = { git = "https://github.com/ishitatsuyuki/rust-openssl", branch = "0.9.x" } diff --git a/src/core/handler.rs b/src/core/handler.rs index e1d1a12..7d5bbfa 100644 --- a/src/core/handler.rs +++ b/src/core/handler.rs @@ -11,6 +11,7 @@ use rand::prelude::*; use serenity::CACHE; use serenity::model::gateway::{Game, GameType, Ready}; use serenity::model::channel::Message; +// use serenity::model::event::{PresenceUpdateEvent, VoiceServerUpdateEvent}; use serenity::model::event::PresenceUpdateEvent; use serenity::model::guild::{Guild, Member, PartialGuild}; use serenity::model::id::{ @@ -24,6 +25,7 @@ use serenity::prelude::*; use std::sync::{Arc, Once}; use std::thread; use std::time::Duration; +use crate::exec_on_message; static LOAD_TIMERS: Once = Once::new(); @@ -584,4 +586,13 @@ impl EventHandler for Handler { } } } + + // fn voice_server_update(&self, ctx: Context, voice: VoiceServerUpdateEvent) { + // if let Some(guild_id) = voice.guild_id { + // let data = ctx.data.lock(); + // let voice_server_lock = data.get::<VoiceGuildUpdate>().unwrap(); + // let mut voice_server = voice_server_lock.write(); + // voice_server.insert(guild_id); + // } + // } } diff --git a/src/core/lavalink_handler.rs b/src/core/lavalink_handler.rs new file mode 100644 index 0000000..bfd5fd6 --- /dev/null +++ b/src/core/lavalink_handler.rs @@ -0,0 +1,14 @@ +use serenity::prelude::Mutex; +use std::sync::Arc; +use lavalink_rs::{ + LavalinkClient, + model::*, + gateway::* +}; + +pub struct LavalinkHandler; +impl LavalinkEventHandler for LavalinkHandler { + fn track_start(&self, _client: Arc<Mutex<LavalinkClient>>, event: TrackStart) { + println!("Track started! Guild: {}", event.guild_id); + } +} diff --git a/src/core/mod.rs b/src/core/mod.rs index 2ddcba0..709a71f 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -3,6 +3,7 @@ pub mod colours; pub mod consts; pub mod framework; pub mod handler; +// pub mod lavalink_handler; pub mod model; pub mod timers; pub mod utils; diff --git a/src/core/model.rs b/src/core/model.rs index e90f5e1..b2cefac 100644 --- a/src/core/model.rs +++ b/src/core/model.rs @@ -1,17 +1,20 @@ use crate::core::api; use crate::core::timers::TimerClient; use crate::db::Database; -use serenity::client::bridge::{ - gateway::ShardManager, - // voice::ClientVoiceManager -}; +use serenity::client::bridge::gateway::ShardManager; +// use serenity::client::bridge::{ +// gateway::ShardManager, +// voice::ClientVoiceManager +// }; // use serenity::model::id::{UserId, GuildId}; +// use serenity::prelude::{Mutex, RwLock}; use serenity::model::id::UserId; use serenity::prelude::Mutex; // use serenity::voice; use std::sync::Arc; // use std::collections::HashSet; use typemap::Key; +// use lavalink_rs::LavalinkClient; pub struct Owner; impl Key for Owner { @@ -1,4 +1,4 @@ -#![recursion_limit = "128"] +#![recursion_limit = "128"] // 256 #![allow(proc_macro_derive_resolution_fallback)] #![feature(decl_macro, async_closure)] @@ -6,6 +6,7 @@ #[macro_use] extern crate lazy_static; #[macro_use] extern crate log; #[macro_use] extern crate serde_derive; + extern crate serenity; extern crate chrono; extern crate forecast; @@ -25,12 +26,14 @@ extern crate typemap; extern crate urbandictionary; // extern crate rocket_contrib; // extern crate tokio; +// extern crate lavalink_rs; pub mod macros; +pub mod modules; + pub mod core; pub mod db; -pub mod modules; // pub mod webserver; -pub mod wisp; // Client +pub mod wisp; // The Client pub use crate::wisp::WispClient; diff --git a/src/macros.rs b/src/macros.rs index 05ce731..9e050a7 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,4 +1,5 @@ #![macro_use] +#![allow(unused_macros)] #[macro_export] macro_rules! check_error { @@ -18,11 +19,74 @@ macro_rules! now { () => { Utc::now().format("%FT%T").to_string() }; } -macro_rules! exec_on_message { - ([$ctx:expr, $message:expr], $($plugin:ident), *) => {{ - // use utils::config::get_pool; - // let pool = get_pool(&$ctx); +macro_rules! check_opt { + ($expr:expr) => { + match $expr { + Some(v) => v, + None => return + } + } +} + +macro_rules! check_res { + ($expr:expr) => { + match $expr { + Ok(v) => v, + Err(e) => { + warn_discord!("Error: {}", e); + return + } + }; + } +} - $($plugin::on_message($ctx, /* &pool, */ $message);)* - }} +macro_rules! check_res_msg { + ($expr:expr) => { + match $expr { + Ok(v) => v, + Err(e) => { + warn_discord!("Error: {}", e); + return Err(CommandError::from(get_msg!("error/unknown_error"))) + } + }; + } } + +// macro_rules! warn_discord { +// ($expr:expr $(, $replace:expr)*) => { +// { +// use utils::info::bot_update_info; +// use utils::time::now_utc; + +// let now = now_utc().format("%Y-%m-%d %H:%M:%S UTC"); + +// #[allow(unused_mut)] +// let mut s = $expr.to_owned(); + +// $(s = s.replacen("{}", &format!("{}", &$replace), 1);)* + +// warn!("[{}] {}", &now, &s); +// bot_update_info(&format!("`[{}] WARN: {}`", &now, &s)); +// } +// } +// } + +// #[macro_export] +// macro_rules! info_discord { +// ($expr:expr $(, $replace:expr)*) => { +// { +// use utils::info::bot_update_info; +// use utils::time::now_utc; + +// let now = now_utc().format("%Y-%m-%d %H:%M:%S UTC"); + +// #[allow(unused_mut)] +// let mut s = $expr.to_owned(); + +// $(s = s.replacen("{}", &format!("{}", &$replace), 1);)* + +// info!("[{}] {}", &now, &s); +// bot_update_info(&format!("`[{}] INFO: {}`", &now, &s)); +// } +// } +// } 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 + }; +} |