diff options
| author | Fuwn <[email protected]> | 2020-10-30 12:58:50 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2020-10-30 12:58:50 -0700 |
| commit | 3ca642734629b108ece241ea9644f5ed1ee339cb (patch) | |
| tree | 515fc5c33c62eb4ab970f3d3e5bb7f40ff417df1 /src | |
| parent | chore: change cc env vars file type, (md -> txt) (diff) | |
| download | dep-core-next-3ca642734629b108ece241ea9644f5ed1ee339cb.tar.xz dep-core-next-3ca642734629b108ece241ea9644f5ed1ee339cb.zip | |
feat (desc)
feat:
- add `Procfile` and `app.json` to "prep" for heroku (probably not going to go to heroku though).
- implement a plugin system and enable `random_hi` plugin.
- move webserver to seperate location
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/handler.rs | 6 | ||||
| -rw-r--r-- | src/core/mod.rs | 1 | ||||
| -rw-r--r-- | src/core/model.rs | 12 | ||||
| -rw-r--r-- | src/lib.rs | 5 | ||||
| -rw-r--r-- | src/macros.rs | 9 | ||||
| -rw-r--r-- | src/modules/mod.rs | 1 | ||||
| -rw-r--r-- | src/modules/plugins/macros.rs | 11 | ||||
| -rw-r--r-- | src/modules/plugins/mod.rs | 3 | ||||
| -rw-r--r-- | src/modules/plugins/random_hi.rs | 18 | ||||
| -rw-r--r-- | src/webserver/mod.rs | 2 | ||||
| -rw-r--r-- | src/webserver/model.rs | 15 | ||||
| -rw-r--r-- | src/webserver/rocket.rs (renamed from src/core/webserver.rs) | 20 | ||||
| -rw-r--r-- | src/wisp.rs | 16 |
13 files changed, 106 insertions, 13 deletions
diff --git a/src/core/handler.rs b/src/core/handler.rs index 7fbb005..e1d1a12 100644 --- a/src/core/handler.rs +++ b/src/core/handler.rs @@ -5,6 +5,7 @@ use crate::core::consts::DB as db; use crate::core::model::*; use crate::core::utils::*; use crate::db::models::UserUpdate; +use crate::modules::plugins::*; use levenshtein::levenshtein; use rand::prelude::*; use serenity::CACHE; @@ -107,7 +108,7 @@ impl EventHandler for Handler { info!("Caching complete."); } - fn message(&self, _ctx: Context, message: Message) { + fn message(&self, ctx: Context, message: Message) { // check_error!(message.guild().unwrap().read() // .edit_member(712088369206919269, |member| member.nickname("Wisp"))); @@ -118,6 +119,9 @@ impl EventHandler for Handler { if message.mention_everyone { check_error!(message.react("👀")) } + + exec_on_message!([&ctx, &message], + random_hi); } fn message_delete(&self, _: Context, channel_id: ChannelId, message_id: MessageId) { diff --git a/src/core/mod.rs b/src/core/mod.rs index 3abe541..2ddcba0 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -6,4 +6,3 @@ pub mod handler; pub mod model; pub mod timers; pub mod utils; -// pub mod webserver; diff --git a/src/core/model.rs b/src/core/model.rs index 1b19f13..e90f5e1 100644 --- a/src/core/model.rs +++ b/src/core/model.rs @@ -5,10 +5,12 @@ use serenity::client::bridge::{ gateway::ShardManager, // voice::ClientVoiceManager }; +// use serenity::model::id::{UserId, GuildId}; use serenity::model::id::UserId; use serenity::prelude::Mutex; // use serenity::voice; use std::sync::Arc; +// use std::collections::HashSet; use typemap::Key; pub struct Owner; @@ -40,3 +42,13 @@ impl Key for TC { // impl Key for VoiceManager { // type Value = Arc<Mutex<ClientVoiceManager>>; // } + +// pub struct Lavalink; +// impl Key for Lavalink { +// type Value = Arc<Mutex<LavalinkClient>>; +// } + +// pub struct VoiceGuildUpdate; +// impl Key for VoiceGuildUpdate { +// type Value = Arc<RwLock<HashSet<GuildId>>>; +// } @@ -1,12 +1,11 @@ #![recursion_limit = "128"] #![allow(proc_macro_derive_resolution_fallback)] -// #![feature(decl_macro)] +#![feature(decl_macro, async_closure)] #[macro_use] extern crate diesel; #[macro_use] extern crate lazy_static; #[macro_use] extern crate log; #[macro_use] extern crate serde_derive; -// #[macro_use] extern crate rocket; extern crate serenity; extern crate chrono; extern crate forecast; @@ -25,11 +24,13 @@ extern crate threadpool; extern crate typemap; extern crate urbandictionary; // extern crate rocket_contrib; +// extern crate tokio; pub mod macros; pub mod core; pub mod db; pub mod modules; +// pub mod webserver; pub mod wisp; // Client pub use crate::wisp::WispClient; diff --git a/src/macros.rs b/src/macros.rs index 8b4d3af..05ce731 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -17,3 +17,12 @@ macro_rules! failed { 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); + + $($plugin::on_message($ctx, /* &pool, */ $message);)* + }} +} diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 82b6da3..af500d5 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -1 +1,2 @@ pub mod commands; +pub mod plugins; diff --git a/src/modules/plugins/macros.rs b/src/modules/plugins/macros.rs new file mode 100644 index 0000000..f28cf7c --- /dev/null +++ b/src/modules/plugins/macros.rs @@ -0,0 +1,11 @@ +#![macro_use] + +#[macro_export] +macro_rules! exec_on_message { + ([$ctx:expr, $message:expr], $($plugin:ident), *) => {{ + // use utils::config::get_pool; + // let pool = get_pool(&$ctx); + + $($plugin::on_message($ctx, /* &pool, */ $message);)* + }} +} diff --git a/src/modules/plugins/mod.rs b/src/modules/plugins/mod.rs new file mode 100644 index 0000000..10e3e24 --- /dev/null +++ b/src/modules/plugins/mod.rs @@ -0,0 +1,3 @@ +// #[macro_use] pub mod macros; + +pub mod random_hi; diff --git a/src/modules/plugins/random_hi.rs b/src/modules/plugins/random_hi.rs new file mode 100644 index 0000000..ff2b7e5 --- /dev/null +++ b/src/modules/plugins/random_hi.rs @@ -0,0 +1,18 @@ +use serenity::model::channel::Message; +use serenity::prelude::Context; +use rand::{thread_rng, Rng}; + +pub fn on_message(_ctx: &Context, message: &Message) { + let greatings = vec!["hi", "hey", "hello", "hei", "yo"]; + let message_content: &str = &message.content.to_lowercase(); + if !greatings.contains(&message_content) || message.author.bot { + return (); + } + + let mut rng = thread_rng(); + let n: u32 = rng.gen_range(0, 16); + + if n == 1 { + let _ = message.channel_id.say("Hi!"); + } +} diff --git a/src/webserver/mod.rs b/src/webserver/mod.rs new file mode 100644 index 0000000..526a59d --- /dev/null +++ b/src/webserver/mod.rs @@ -0,0 +1,2 @@ +pub mod model; +pub mod rocket; diff --git a/src/webserver/model.rs b/src/webserver/model.rs new file mode 100644 index 0000000..260f1f5 --- /dev/null +++ b/src/webserver/model.rs @@ -0,0 +1,15 @@ +use serenity::framework::standard::Command; +use serenity::prelude::Mutex; +use std::collections::HashMap; +use std::sync::Arc; +use typemap::TypeMap; + +pub type WispResult<T = ()> = Result<T, Box<dyn std::error::Error + Send + Sync>>; +pub type CommandMap = HashMap<String, dyn Command>; + +#[derive(Clone)] +pub struct WispData { + // pub writer: Arc<Mutex<Writer>>, + // pub commands: CommandMap, + pub data: Arc<Mutex<TypeMap>> +} diff --git a/src/core/webserver.rs b/src/webserver/rocket.rs index 0234fda..ac7401b 100644 --- a/src/core/webserver.rs +++ b/src/webserver/rocket.rs @@ -1,7 +1,17 @@ use rocket::response::content; +use rocket::{State, get, post, request::Form, routes}; use rocket::response::NamedFile; -// use serenity::prelude::*; // use std::sync::Arc; +use crate::webserver::model::*; + +pub async fn start_rocket() -> WispResult { // ctx: WispData + rocket::ignite() + .mount("/", routes![ + icon, index + ]).launch(); + + Ok(()) +} #[get("/favicon.ico")] pub fn icon() -> Option<NamedFile> { @@ -12,11 +22,3 @@ pub fn icon() -> Option<NamedFile> { pub fn index() -> content::Json<&'static str> { content::Json("{\"message\": \"online\"}") } - -// #[get("/")] -// pub fn get_context() -> content::Json<&'static str> { -// let ctx = Arc::new(Context); -// let ctx_clone = Arc::clone(&ctx); - -// content::Json(format!("{\"message\": \"{}\"}", data)) -// } diff --git a/src/wisp.rs b/src/wisp.rs index e1f2310..f870bda 100644 --- a/src/wisp.rs +++ b/src/wisp.rs @@ -5,6 +5,10 @@ use crate::core::{ framework::WispFramework, timers }; +// use crate::webserver::{ +// model::*, +// rocket::* +// }; use serenity::Error as SerenityError; use serenity::http; use serenity::model::id::UserId; @@ -16,6 +20,7 @@ use std::sync::Arc; pub struct WispClient(Client); impl WispClient { + // #[tokio::main] pub fn new() -> Self { let token = env::var("DISCORD_TOKEN").expect("Expected Discord bot token in environment."); let mut client = Client::new(&token, Handler).expect("Unable to initialize Wisp client."); @@ -38,6 +43,17 @@ impl WispClient { }, Err(why) => panic!("Couldn't get the application info: {:?}", why), }; + + // let bot = WispData { + // data: Arc::new(Mutex::new(TypeMap::new())) + // }; + // let bot_clone = bot.clone(); + // unsafe { + // tokio::spawn(async move { + // let _ = start_rocket(bot_clone); + // }); + // } + client.with_framework(WispFramework::new(owners)); WispClient(client) } |