quiet module
This commit is contained in:
parent
1e522940c9
commit
5faf982485
9 changed files with 183 additions and 40 deletions
|
@ -1,9 +1,10 @@
|
||||||
//! WIP Fun forcebot with catered customizations #todo
|
//! WIP Fun forcebot with catered customizations #todo
|
||||||
//!
|
//!
|
||||||
//! Custom modules that can be managed in chat through `disable` and `enable` commands
|
//! Custom modules that can be managed in chat through `disable` and `enable` commands
|
||||||
//! - `besty`
|
//! - `besty` - uses a custom prefix tp trigger
|
||||||
//! - `guests`
|
//! - `guests`
|
||||||
//! - `pyramid`
|
//! - `pyramid`
|
||||||
|
//! - `quiet`
|
||||||
//!
|
//!
|
||||||
//!
|
//!
|
||||||
//! Be sure the followig is defined in `.env`
|
//! Be sure the followig is defined in `.env`
|
||||||
|
@ -18,7 +19,7 @@
|
||||||
//! - More Info - <https://dev.twitch.tv/docs/authentication>
|
//! - More Info - <https://dev.twitch.tv/docs/authentication>
|
||||||
|
|
||||||
// use forcebot_rs_v2::{custom_mods::{guest_badge, pyramid}, Bot};
|
// use forcebot_rs_v2::{custom_mods::{guest_badge, pyramid}, Bot};
|
||||||
use forcebot_core::{custom_mods::{debug, guest_badge, pyramid}, Bot};
|
use forcebot_core::{custom_mods::{debug, guest_badge, pyramid, quiet}, Bot};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@ pub async fn main() {
|
||||||
bot.load_module(guest_badge::create_module()).await;
|
bot.load_module(guest_badge::create_module()).await;
|
||||||
bot.load_module(pyramid::create_module()).await;
|
bot.load_module(pyramid::create_module()).await;
|
||||||
bot.load_module(debug::create_module()).await;
|
bot.load_module(debug::create_module()).await;
|
||||||
|
bot.load_module(quiet::create_module()).await;
|
||||||
|
|
||||||
/* 3. Run the bot */
|
/* 3. Run the bot */
|
||||||
bot.run().await;
|
bot.run().await;
|
||||||
|
@ -45,7 +47,7 @@ pub async fn main() {
|
||||||
pub mod funbot_objs {
|
pub mod funbot_objs {
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use forcebot_core::{execution_async, modules::Status, Badge, Bot, Command, Module};
|
use forcebot_core::{execution_async, Badge, Bot, Command, Module};
|
||||||
use twitch_irc::message::ServerMessage;
|
use twitch_irc::message::ServerMessage;
|
||||||
|
|
||||||
/// Create a Module with a loaded Command object
|
/// Create a Module with a loaded Command object
|
||||||
|
@ -55,7 +57,7 @@ pub mod funbot_objs {
|
||||||
"Now Aware of besty xdd666 ".to_string());
|
"Now Aware of besty xdd666 ".to_string());
|
||||||
|
|
||||||
custom_mod.load_command(create_cmd_test());
|
custom_mod.load_command(create_cmd_test());
|
||||||
custom_mod.set_status_by_default(Status::Disabled);
|
// custom_mod.set_status_by_default(Status::Disabled);
|
||||||
|
|
||||||
custom_mod
|
custom_mod
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,9 @@ pub struct Bot
|
||||||
chatter_guest_badges: Mutex<Vec<(String,String,Badge,Instant,Duration)>>,
|
chatter_guest_badges: Mutex<Vec<(String,String,Badge,Instant,Duration)>>,
|
||||||
/// Message cache
|
/// Message cache
|
||||||
message_cache: Mutex<Vec<PrivmsgMessage>>,
|
message_cache: Mutex<Vec<PrivmsgMessage>>,
|
||||||
// message_cache: Vec<PrivmsgMessage>
|
/// channel_quiet
|
||||||
|
channel_quiet_yn: RwLock<Vec<(String,RwLock<bool>)>>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,6 +120,7 @@ impl Bot
|
||||||
channel_module_status: RwLock::new(vec![]),
|
channel_module_status: RwLock::new(vec![]),
|
||||||
chatter_guest_badges: Mutex::new(vec![]),
|
chatter_guest_badges: Mutex::new(vec![]),
|
||||||
message_cache : Mutex::new(vec![]),
|
message_cache : Mutex::new(vec![]),
|
||||||
|
channel_quiet_yn : RwLock::new(vec![]),
|
||||||
};
|
};
|
||||||
|
|
||||||
for cmd in built_in_objects::create_commands() {
|
for cmd in built_in_objects::create_commands() {
|
||||||
|
@ -183,14 +186,13 @@ impl Bot
|
||||||
|
|
||||||
// dbg!("try cms read");
|
// dbg!("try cms read");
|
||||||
let cms_lock = bot.channel_module_status.read().unwrap();
|
let cms_lock = bot.channel_module_status.read().unwrap();
|
||||||
// dbg!("cms read lock");
|
|
||||||
// dbg!(module.get_names());
|
|
||||||
for channel_flags in cms_lock.iter() {
|
for channel_flags in cms_lock.iter() {
|
||||||
if channel_flags.0 == channel {
|
if channel_flags.0 == channel {
|
||||||
|
|
||||||
if module.get_names().contains(&channel_flags.1) && channel_flags.2 == Status::Disabled {
|
if module.get_names().contains(&channel_flags.1) && channel_flags.2 == Status::Disabled {
|
||||||
continue 'module_loop;
|
continue 'module_loop;
|
||||||
// disabled_mods.push(module);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,7 +204,6 @@ impl Bot
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for module in get_enabled_channel_modules(bot.clone(), msg.clone().channel_login) {
|
for module in get_enabled_channel_modules(bot.clone(), msg.clone().channel_login) {
|
||||||
|
|
||||||
|
@ -224,12 +225,8 @@ impl Bot
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else {} ;
|
} else {} ;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
drop(in_msgs_lock);
|
drop(in_msgs_lock);
|
||||||
});
|
});
|
||||||
|
@ -360,13 +357,11 @@ impl Bot
|
||||||
|
|
||||||
if !found_disabled {
|
if !found_disabled {
|
||||||
|
|
||||||
// self.channel_module_status.
|
|
||||||
// dbg!("try cms write"); /*,self.channel_module_status */
|
|
||||||
let mut cms_lock = self.channel_module_status.write().unwrap();
|
let mut cms_lock = self.channel_module_status.write().unwrap();
|
||||||
// cms_lock.
|
|
||||||
// dbg!("cms write lock");
|
|
||||||
cms_lock.push((channel,module.clone(),Status::Disabled));
|
cms_lock.push((channel,module.clone(),Status::Disabled));
|
||||||
// dbg!(module.clone());
|
|
||||||
drop(cms_lock);
|
drop(cms_lock);
|
||||||
|
|
||||||
|
|
||||||
|
@ -434,6 +429,39 @@ impl Bot
|
||||||
rslt
|
rslt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the quiet status of a channel
|
||||||
|
pub fn get_channel_quiet(&self,channel:String) -> bool {
|
||||||
|
for a in self.channel_quiet_yn.read().unwrap().iter() {
|
||||||
|
if a.0 == channel {
|
||||||
|
return a.1.read().unwrap().clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the quiet status of a channel
|
||||||
|
pub fn set_channel_quiet(&self,channel:String,quiet_on:bool) {
|
||||||
|
let mut found = false;
|
||||||
|
|
||||||
|
let chnlquiet = self.channel_quiet_yn.read().unwrap();
|
||||||
|
for rec in chnlquiet.iter() {
|
||||||
|
if rec.0 == channel {
|
||||||
|
found = true;
|
||||||
|
let mut status = rec.1.write().unwrap();
|
||||||
|
*status = quiet_on;
|
||||||
|
drop(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drop(chnlquiet);
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
// dbg!("set chn quiet > !found channel quiet status");
|
||||||
|
let mut chnlquiet = self.channel_quiet_yn.write().unwrap();
|
||||||
|
chnlquiet.push((channel,RwLock::new(quiet_on)));
|
||||||
|
drop(chnlquiet);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -188,18 +188,17 @@ impl Command
|
||||||
(cmd.custom_cond_fn)(bot.clone(),message.clone()) && (cmd.custom_cond_async)(bot,message).await
|
(cmd.custom_cond_fn)(bot.clone(),message.clone()) && (cmd.custom_cond_async)(bot,message).await
|
||||||
}
|
}
|
||||||
|
|
||||||
// dbg!(msg.clone());
|
fn quiet_off_ok(cmd:&Command,bot:Arc<Bot>,message:PrivmsgMessage) -> bool {
|
||||||
|
!bot.get_channel_quiet(message.channel_login.clone())
|
||||||
|
|| bot.get_channel_quiet(message.channel_login.clone()) && cmd.commands.contains(&("quiet off".to_string()))
|
||||||
|
}
|
||||||
|
|
||||||
// dbg!(caller_badge_ok(self, bot.clone(), msg.clone()));
|
|
||||||
// dbg!(cmd_called(self, bot.clone(), msg.clone()) &&
|
|
||||||
// caller_badge_ok(self, bot.clone(), msg.clone()) &&
|
|
||||||
// admin_only_ok(self, bot.clone(), msg.clone()) &&
|
|
||||||
// custom_cond_ok(self, bot.clone(), msg.clone()));
|
|
||||||
|
|
||||||
cmd_called(self, bot.clone(), msg.clone()) &&
|
cmd_called(self, bot.clone(), msg.clone()) &&
|
||||||
caller_badge_ok(self, bot.clone(), msg.clone()).await &&
|
caller_badge_ok(self, bot.clone(), msg.clone()).await &&
|
||||||
admin_only_ok(self, bot.clone(), msg.clone()) &&
|
admin_only_ok(self, bot.clone(), msg.clone()) &&
|
||||||
custom_cond_ok(self, bot, msg).await
|
custom_cond_ok(self, bot.clone(), msg.clone()).await &&
|
||||||
|
quiet_off_ok(self, bot, msg)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
// use tokio::sync::Mutex;
|
||||||
use twitch_irc::message::ServerMessage;
|
use twitch_irc::message::ServerMessage;
|
||||||
|
|
||||||
|
use crate::Module;
|
||||||
|
|
||||||
use super::{execution_async,Bot,listener_condition_async};
|
use super::{execution_async,Bot,listener_condition_async};
|
||||||
|
|
||||||
use super::{ExecBody, ListenerTrigger};
|
use super::{ExecBody, ListenerTrigger};
|
||||||
|
@ -27,6 +30,7 @@ pub struct Listener
|
||||||
trigger_cond_async : Arc<ListenerTrigger> ,
|
trigger_cond_async : Arc<ListenerTrigger> ,
|
||||||
/// execution body
|
/// execution body
|
||||||
exec_fn : Arc<ExecBody>,
|
exec_fn : Arc<ExecBody>,
|
||||||
|
parent_module : Arc<Option<Module>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Listener
|
impl Listener
|
||||||
|
@ -50,6 +54,7 @@ impl Listener
|
||||||
trigger_cond_fn : |_:Arc<Bot>,_:ServerMessage| true,
|
trigger_cond_fn : |_:Arc<Bot>,_:ServerMessage| true,
|
||||||
trigger_cond_async : Arc::new(listener_condition_async(condition01)),
|
trigger_cond_async : Arc::new(listener_condition_async(condition01)),
|
||||||
exec_fn : Arc::new(execution_async(execbody)),
|
exec_fn : Arc::new(execution_async(execbody)),
|
||||||
|
parent_module : Arc::new(None),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,14 +108,41 @@ impl Listener
|
||||||
|
|
||||||
/// checks if the trigger condition is met
|
/// checks if the trigger condition is met
|
||||||
pub async fn cond_triggered(&self,bot:Arc<Bot>,msg:ServerMessage) -> bool {
|
pub async fn cond_triggered(&self,bot:Arc<Bot>,msg:ServerMessage) -> bool {
|
||||||
let list = Arc::new(self);
|
|
||||||
(list.trigger_cond_fn)(bot.clone(),msg.clone()) && (list.trigger_cond_async)(bot,msg).await
|
let list = Arc::new(self.clone());
|
||||||
|
|
||||||
|
async fn defined_conditions_ok(list:Arc<Listener>,bot:Arc<Bot>,msg:ServerMessage) -> bool {
|
||||||
|
// let list = Arc::new(self);
|
||||||
|
(list.trigger_cond_fn)(bot.clone(),msg.clone()) && (list.trigger_cond_async)(bot,msg).await
|
||||||
|
}
|
||||||
|
|
||||||
|
fn quiet_off_ok(list:Arc<Listener>,bot:Arc<Bot>,message:ServerMessage) -> bool {
|
||||||
|
if let ServerMessage::Privmsg(msg) = message {
|
||||||
|
|
||||||
|
if let Some(parent_mod) = &*list.parent_module {
|
||||||
|
return !bot.get_channel_quiet(msg.channel_login) || parent_mod.get_names().contains(&"debug".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
return !bot.get_channel_quiet(msg.channel_login) ;
|
||||||
|
}
|
||||||
|
return true; /* quiet is off for non chat msgs */
|
||||||
|
}
|
||||||
|
|
||||||
|
defined_conditions_ok(list.clone(), bot.clone(), msg.clone()).await &&
|
||||||
|
quiet_off_ok(list, bot, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// executes the listeners executon body
|
/// executes the listeners executon body
|
||||||
pub async fn execute_fn(&self,bot:Arc<Bot>,msg:ServerMessage) -> Result<String, String> {
|
pub async fn execute_fn(&self,bot:Arc<Bot>,msg:ServerMessage) -> Result<String, String> {
|
||||||
// (self.exec_fn)(bot,msg)
|
|
||||||
(self.exec_fn)(bot,msg).await
|
(self.exec_fn)(bot,msg).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// sets parent module
|
||||||
|
pub fn set_parent_module(&mut self,module:Module) {
|
||||||
|
self.parent_module = Arc::new(Some(module));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
|
||||||
|
// use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use super::bot_objects::command::Command;
|
use super::bot_objects::command::Command;
|
||||||
use super::bot_objects::listener::Listener;
|
use super::bot_objects::listener::Listener;
|
||||||
|
|
||||||
|
@ -40,13 +42,14 @@ impl Module
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a `Listener` into the module
|
/// Loads a `Listener` into the module
|
||||||
pub fn load_listener(&mut self,l : Listener) {
|
pub fn load_listener(&mut self,mut l : Listener) {
|
||||||
|
l.set_parent_module(self.clone());
|
||||||
self.listeners.push(l);
|
self.listeners.push(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Loads a `Command` into the module
|
/// Loads a `Command` into the module
|
||||||
pub fn load_command(&mut self,c : Command) {
|
pub fn load_command(&mut self,c : Command) {
|
||||||
self.commands.push(c);
|
self.commands.push(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_listeners(&self) -> Vec<Listener> {
|
pub fn get_listeners(&self) -> Vec<Listener> {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
pub mod guest_badge;
|
pub mod guest_badge;
|
||||||
pub mod pyramid;
|
pub mod pyramid;
|
||||||
pub mod debug;
|
pub mod debug;
|
||||||
|
pub mod quiet;
|
|
@ -1,15 +1,9 @@
|
||||||
|
|
||||||
|
|
||||||
use std::sync::{Arc};
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::{execution_async, modules::Status, Bot, Command, Listener, Module};
|
use crate::{execution_async, modules::Status, Bot, Command, Listener, Module};
|
||||||
use twitch_irc::message::ServerMessage;
|
use twitch_irc::message::ServerMessage;
|
||||||
// use lazy_static::lazy_static;
|
|
||||||
|
|
||||||
// lazy_static!{
|
|
||||||
// /// Listener per channel (channel:String,Listener)
|
|
||||||
// pub static ref LISTENER_PER_CHNL: Mutex<Vec<(String,Mutex<Listener>)>> = Mutex::new(vec![]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// debug module
|
/// debug module
|
||||||
///
|
///
|
||||||
|
|
84
forcebot_core/src/custom_mods/quiet.rs
Normal file
84
forcebot_core/src/custom_mods/quiet.rs
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use twitch_irc::message::ServerMessage;
|
||||||
|
|
||||||
|
use crate::{execution_async, Badge, Bot, Command, Module};
|
||||||
|
|
||||||
|
|
||||||
|
/// quiet the bot in a channel
|
||||||
|
///
|
||||||
|
/// use
|
||||||
|
/// `quiet on`
|
||||||
|
/// `quiet off`
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
|
||||||
|
/// Use this function when loading modules into the bot
|
||||||
|
///
|
||||||
|
/// For example
|
||||||
|
/// ```rust
|
||||||
|
/// bot.load_module(quiet::create_module());
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
pub fn create_module() -> Module {
|
||||||
|
/* 1. Create a new module */
|
||||||
|
let mut custom_mod = Module::new(
|
||||||
|
vec!["quiet".to_string()],
|
||||||
|
"".to_string());
|
||||||
|
|
||||||
|
/* 2. Load the cmd into a new module */
|
||||||
|
custom_mod.load_command(cmd_quiet_on());
|
||||||
|
custom_mod.load_command(cmd_quiet_off());
|
||||||
|
custom_mod
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Command definition for quiet command
|
||||||
|
fn cmd_quiet_on() -> Command {
|
||||||
|
/* 1. Create a new cmd */
|
||||||
|
let mut cmd = Command::new(vec!["quiet on".to_string()],"".to_string());
|
||||||
|
|
||||||
|
/* 2. Define exec callback */
|
||||||
|
async fn execbody(bot:Arc<Bot>,message:ServerMessage) -> Result<String,String> {
|
||||||
|
if let ServerMessage::Privmsg(msg) = message {
|
||||||
|
|
||||||
|
// dbg!("quiet on called");
|
||||||
|
bot.set_channel_quiet(msg.channel_login.clone(), true);
|
||||||
|
println!("channel {} set quiet true",msg.channel_login);
|
||||||
|
}
|
||||||
|
Result::Err("Not Valid message type".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3. Set Command flags */
|
||||||
|
cmd.set_exec_fn(execution_async(execbody));
|
||||||
|
cmd.set_admin_only(false);
|
||||||
|
cmd.set_min_badge(Badge::Moderator);
|
||||||
|
cmd.set_admin_override(true);
|
||||||
|
|
||||||
|
cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Command definition for quiet command
|
||||||
|
fn cmd_quiet_off() -> Command {
|
||||||
|
/* 1. Create a new cmd */
|
||||||
|
let mut cmd = Command::new(vec!["quiet off".to_string()],"".to_string());
|
||||||
|
|
||||||
|
/* 2. Define exec callback */
|
||||||
|
async fn execbody(bot:Arc<Bot>,message:ServerMessage) -> Result<String,String> {
|
||||||
|
if let ServerMessage::Privmsg(msg) = message {
|
||||||
|
|
||||||
|
bot.set_channel_quiet(msg.channel_login.clone(), false);
|
||||||
|
println!("channel {} set quiet false",msg.channel_login);
|
||||||
|
}
|
||||||
|
Result::Err("Not Valid message type".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3. Set Command flags */
|
||||||
|
cmd.set_exec_fn(execution_async(execbody));
|
||||||
|
cmd.set_admin_only(false);
|
||||||
|
cmd.set_min_badge(Badge::Moderator);
|
||||||
|
cmd.set_admin_override(true);
|
||||||
|
|
||||||
|
cmd
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ use twitch_irc::message::ServerMessage;
|
||||||
pub async fn main() {
|
pub async fn main() {
|
||||||
|
|
||||||
/* Create the bot using env */
|
/* Create the bot using env */
|
||||||
let mut bot = Bot::new().await;
|
let bot = Bot::new().await;
|
||||||
|
|
||||||
/* 1. Create a new blank cmd */
|
/* 1. Create a new blank cmd */
|
||||||
let mut cmd = Command::new(vec!["test".to_string()],"".to_string());
|
let mut cmd = Command::new(vec!["test".to_string()],"".to_string());
|
||||||
|
@ -50,7 +50,7 @@ pub async fn main() {
|
||||||
cmd.set_min_badge(Badge::Moderator);
|
cmd.set_min_badge(Badge::Moderator);
|
||||||
|
|
||||||
/* 6. Load the cmd into the bot */
|
/* 6. Load the cmd into the bot */
|
||||||
bot.load_command(cmd);
|
bot.load_command(cmd).await;
|
||||||
|
|
||||||
/* Run the bot */
|
/* Run the bot */
|
||||||
bot.run().await;
|
bot.run().await;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue