aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--Cargo.toml9
-rw-r--r--src/core/handler.rs11
-rw-r--r--src/core/lavalink_handler.rs14
-rw-r--r--src/core/mod.rs1
-rw-r--r--src/core/model.rs11
-rw-r--r--src/lib.rs9
-rw-r--r--src/macros.rs76
-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
11 files changed, 279 insertions, 45 deletions
diff --git a/Cargo.toml b/Cargo.toml
index debf534..1591fa9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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 {
diff --git a/src/lib.rs b/src/lib.rs
index 3ec9c47..4684d25 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
+ };
+}