Simplifying enums

I hope this doesn't explode everything Prayge
This commit is contained in:
haruyuumei 2024-03-22 16:55:56 -03:00 committed by ModulatingForce
parent 45e3f02297
commit 960cd5724c
5 changed files with 132 additions and 126 deletions

View file

@ -35,11 +35,15 @@ pub enum ChangeResult {
#[derive(Debug, PartialEq, Eq, Hash, Clone)] #[derive(Debug, PartialEq, Eq, Hash, Clone)]
pub enum ChType {
Channel(String),
}
pub use ChType::Channel; // pub enum ChType {
// Channel(String),
// }
//
// pub use ChType::Channel;
//
//simplifying from enum to struct
pub struct Channel(pub String);
use super::botmodules::StatusType; use super::botmodules::StatusType;
@ -51,7 +55,7 @@ pub struct BotManagers {
impl BotManagers { impl BotManagers {
pub fn init( pub fn init(
ratelimiters: HashMap<ChType, RateLimiter>, ratelimiters: HashMap<Channel, RateLimiter>,
client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>, client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>,
) -> BotManagers { ) -> BotManagers {
BotManagers { BotManagers {
@ -75,11 +79,11 @@ impl<T: Clone> ArcBox<T> {
pub struct BotInstance { pub struct BotInstance {
pub prefix: char, pub prefix: char,
pub bot_channel: ChType, pub bot_channel: Channel,
pub incoming_messages: Arc<RwLock<UnboundedReceiver<ServerMessage>>>, pub incoming_messages: Arc<RwLock<UnboundedReceiver<ServerMessage>>>,
pub botmodules: Arc<ModulesManager>, pub botmodules: Arc<ModulesManager>,
pub twitch_oauth: String, pub twitch_oauth: String,
pub bot_channels: Vec<ChType>, pub bot_channels: Vec<Channel>,
pub botmgrs: BotManagers, pub botmgrs: BotManagers,
//modesmgr : ModesManager, // [FUTURE] Silent/Quiet , uwu , frisky/horny //modesmgr : ModesManager, // [FUTURE] Silent/Quiet , uwu , frisky/horny
} }
@ -299,7 +303,7 @@ impl BotInstance {
let modmgr = Arc::clone(&botlock.botmodules); let modmgr = Arc::clone(&botlock.botmodules);
let modstatus = modmgr.modstatus( let modstatus = modmgr.modstatus(
c.module.clone(), c.module.clone(),
ChType::Channel(msg.channel_login.to_string())).await; Channel(msg.channel_login.to_string())).await;
if let StatusType::Disabled(a) = modstatus { if let StatusType::Disabled(a) = modstatus {
@ -314,7 +318,7 @@ impl BotInstance {
); );
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
let elevated_access = { let elevated_access = {
let mut idlock = id.write().await; let mut idlock = id.write().await;
@ -417,7 +421,7 @@ impl BotInstance {
let modmgr = Arc::clone(&botlock.botmodules); let modmgr = Arc::clone(&botlock.botmodules);
let modstatus = modmgr.modstatus( let modstatus = modmgr.modstatus(
l.module.clone(), l.module.clone(),
ChType::Channel(msg.channel_login.to_string())).await; Channel(msg.channel_login.to_string())).await;
if let StatusType::Disabled(a) = modstatus { if let StatusType::Disabled(a) = modstatus {

View file

@ -3,12 +3,12 @@
ModulesManager is used to manage Modules and BotActions associated with those modules ModulesManager is used to manage Modules and BotActions associated with those modules
pub struct ModulesManager { pub struct ModulesManager {
statusdb: HashMap<ModType,Vec<ModStatusType>>, statusdb: HashMap<BotModule,Vec<ModStatusType>>,
botactions: HashMap<ModType,Vec<BotAction>>, botactions: HashMap<BotModule,Vec<BotAction>>,
} }
- statusdb: HashMap<ModType,Vec<ModStatusType>> - Defines Modules and their ModStatusType (e.g., Enabled at an Instance level, Disabled at a Channel Level) - statusdb: HashMap<BotModule,Vec<ModStatusType>> - Defines Modules and their ModStatusType (e.g., Enabled at an Instance level, Disabled at a Channel Level)
- botactions: HashMap<ModType,Vec<BotAction>> - Defines Modules and their BotActions (e.g., BotCommand , Listener, Routine) - botactions: HashMap<BotModule,Vec<BotAction>> - Defines Modules and their BotActions (e.g., BotCommand , Listener, Routine)
Example Example
{ {
@ -34,13 +34,13 @@ use async_trait::async_trait;
use self::bot_actions::actions_util::BotAR; use self::bot_actions::actions_util::BotAR;
use crate::core::bot_actions::actions_util; use crate::core::bot_actions::actions_util;
use crate::core::botinstance::{BotInstance, ChType,ChangeResult}; use crate::core::botinstance::{BotInstance, Channel,ChangeResult};
use crate::core::botlog; use crate::core::botlog;
use crate::core::identity::{self, Permissible,IdentityManager}; use crate::core::identity::{self, Permissible,IdentityManager};
use crate::core::bot_actions; use crate::core::bot_actions;
pub use ChType::Channel;
pub use ModType::BotModule; //pub use BotModule;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
@ -49,7 +49,7 @@ use super::identity::ChatBadge;
pub async fn init(mgr: Arc<ModulesManager>) { pub async fn init(mgr: Arc<ModulesManager>) {
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
// 1. Define the BotAction // 1. Define the BotAction
let botc1 = BotCommand { let botc1 = BotCommand {
@ -126,8 +126,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
&self, &self,
requestor: String, requestor: String,
requestor_badge: Option<ChatBadge>, requestor_badge: Option<ChatBadge>,
trg_module: ModType, trg_module: BotModule,
// channel: Option<ChType>, // channel: Option<Channel>,
trg_level: StatusLvl, trg_level: StatusLvl,
bot: BotAR, bot: BotAR,
) -> ChangeResult ) -> ChangeResult
@ -153,8 +153,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let requestor_badge = requestor_badge_mut; let requestor_badge = requestor_badge_mut;
// [x] trg_module: ModType, // [x] trg_module: BotModule,
// - [x] Need to validate an actual ModType - otherwise, fail or exit the cmd // - [x] Need to validate an actual BotModule - otherwise, fail or exit the cmd
let trg_module = if (arg1 == Some("-i")) || (arg1 == Some("-f")) { arg2 } else { arg1 }; let trg_module = if (arg1 == Some("-i")) || (arg1 == Some("-f")) { arg2 } else { arg1 };
@ -190,7 +190,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let trg_level = let trg_level =
if arg1 == Some("-i") || arg1 == Some("-f") { StatusLvl::Instance } if arg1 == Some("-i") || arg1 == Some("-f") { StatusLvl::Instance }
// else if arg1 == Some("-f") { StatusLvl::Instance } // else if arg1 == Some("-f") { StatusLvl::Instance }
else { StatusLvl::Ch(ChType::Channel(currchnl)) } else { StatusLvl::Ch(Channel(currchnl)) }
; ;
@ -204,7 +204,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let rslt = modmgr.exec_enable( let rslt = modmgr.exec_enable(
requestor, requestor,
requestor_badge, requestor_badge,
ModType::BotModule(trg_module.unwrap().to_string()), BotModule(trg_module.unwrap().to_string()),
trg_level, trg_level,
id).await; id).await;
@ -302,8 +302,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
&self, &self,
requestor: String, requestor: String,
requestor_badge: Option<ChatBadge>, requestor_badge: Option<ChatBadge>,
trg_module: ModType, trg_module: BotModule,
// channel: Option<ChType>, // channel: Option<Channel>,
trg_level: StatusLvl, trg_level: StatusLvl,
force: bool, force: bool,
// bot: BotAR, // bot: BotAR,
@ -330,8 +330,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let requestor_badge = requestor_badge_mut; let requestor_badge = requestor_badge_mut;
// [x] trg_module: ModType, // [x] trg_module: BotModule,
// - [x] Need to validate an actual ModType - otherwise, fail or exit the cmd // - [x] Need to validate an actual BotModule - otherwise, fail or exit the cmd
let trg_module = if (arg1 == Some("-i")) || (arg1 == Some("-f")) { arg2 } else { arg1 }; let trg_module = if (arg1 == Some("-i")) || (arg1 == Some("-f")) { arg2 } else { arg1 };
@ -368,7 +368,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let trg_level = let trg_level =
if arg1 == Some("-i") || arg1 == Some("-f") { StatusLvl::Instance } if arg1 == Some("-i") || arg1 == Some("-f") { StatusLvl::Instance }
// else if arg1 == Some("-f") { StatusLvl::Instance } // else if arg1 == Some("-f") { StatusLvl::Instance }
else { StatusLvl::Ch(ChType::Channel(currchnl)) } else { StatusLvl::Ch(Channel(currchnl)) }
; ;
@ -383,7 +383,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let rslt = modmgr.exec_disable( let rslt = modmgr.exec_disable(
requestor, requestor,
requestor_badge, requestor_badge,
ModType::BotModule(trg_module.unwrap().to_string()), BotModule(trg_module.unwrap().to_string()),
trg_level, trg_level,
force, force,
id).await; id).await;
@ -411,20 +411,23 @@ pub async fn init(mgr: Arc<ModulesManager>) {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ModType { // pub enum BotModule {
BotModule(String), // BotModule(String),
} // }
impl PartialEq for ModType { pub struct BotModule(pub String);
//botmodule simplified from enum to tuple struct
impl PartialEq for BotModule {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
let BotModule(name1) = self.clone(); let BotModule(name1) = self.clone();
let BotModule(name2) = other.clone(); let BotModule(name2) = other.clone();
name1.to_lowercase() == name2.to_lowercase() name1.to_lowercase() == name2.to_lowercase()
} }
} }
impl Eq for ModType {} impl Eq for BotModule {}
impl Hash for ModType{ impl Hash for BotModule{
fn hash<H: Hasher>(&self, state: &mut H) { fn hash<H: Hasher>(&self, state: &mut H) {
// self.id.hash(state); // self.id.hash(state);
// self.phone.hash(state); // self.phone.hash(state);
@ -443,7 +446,7 @@ pub enum ModGroup {
#[derive(Debug, PartialEq, Eq, Hash, Clone)] #[derive(Debug, PartialEq, Eq, Hash, Clone)]
pub enum StatusLvl { pub enum StatusLvl {
Instance, Instance,
Ch(ChType), Ch(Channel),
} }
#[derive(Debug, PartialEq, Eq, Hash, Clone)] #[derive(Debug, PartialEq, Eq, Hash, Clone)]
@ -477,7 +480,7 @@ pub trait BotActionTrait {
} }
pub struct BotCommand { pub struct BotCommand {
pub module: ModType, pub module: BotModule,
pub command: String, // command call name pub command: String, // command call name
pub alias: Vec<String>, // String of alternative names pub alias: Vec<String>, // String of alternative names
pub exec_body: bot_actions::actions_util::ExecBody, pub exec_body: bot_actions::actions_util::ExecBody,
@ -515,7 +518,7 @@ impl BotActionTrait for BotCommand {
} }
pub struct Listener { pub struct Listener {
pub module: ModType, pub module: BotModule,
pub name: String, pub name: String,
pub exec_body: bot_actions::actions_util::ExecBody, pub exec_body: bot_actions::actions_util::ExecBody,
pub help: String, pub help: String,
@ -567,20 +570,20 @@ pub struct Routine {}
type StatusdbEntry = (ModGroup, Vec<StatusType>); type StatusdbEntry = (ModGroup, Vec<StatusType>);
pub struct ModulesManager { pub struct ModulesManager {
statusdb: Arc<RwLock<HashMap<ModType, StatusdbEntry>>>, statusdb: Arc<RwLock<HashMap<BotModule, StatusdbEntry>>>,
pub botactions: Arc<RwLock<HashMap<ModType, Vec<BotAction>>>>, pub botactions: Arc<RwLock<HashMap<BotModule, Vec<BotAction>>>>,
} }
/* /*
statusdb statusdb
<HashMap <HashMap
<ModType, <-- e.g., BotModule(String::from("experiments001")) <BotModule, <-- e.g., BotModule(String::from("experiments001"))
Vec<ModStatusType> <-- shows Enabled/Disabled per Status level Vec<ModStatusType> <-- shows Enabled/Disabled per Status level
botactions botactions
HashMap< HashMap<
ModType, <-- e.g., BotModule(String::from("experiments001")) BotModule, <-- e.g., BotModule(String::from("experiments001"))
Vec<BotAction>> BotCommand, Listener Vec<BotAction>> BotCommand, Listener
*/ */
@ -618,7 +621,7 @@ impl ModulesManager {
} }
pub async fn moduleslist(&self) -> HashMap<ModType,ModGroup> pub async fn moduleslist(&self) -> HashMap<BotModule,ModGroup>
{ {
// let db = Arc::clone(&self.statusdb); // let db = Arc::clone(&self.statusdb);
@ -635,7 +638,7 @@ impl ModulesManager {
outmap outmap
} }
pub async fn modstatus(&self, in_module: ModType, in_chnl: ChType) -> StatusType { pub async fn modstatus(&self, in_module: BotModule, in_chnl: Channel) -> StatusType {
// Example usage : botmanager.modstatus( // Example usage : botmanager.modstatus(
// BotModule("GambaCore"), // BotModule("GambaCore"),
// Channel("modulatingforce") // Channel("modulatingforce")
@ -714,7 +717,7 @@ impl ModulesManager {
&self, &self,
requestor: String, requestor: String,
requestor_badge: Option<ChatBadge>, requestor_badge: Option<ChatBadge>,
trg_module: ModType, trg_module: BotModule,
trg_level: StatusLvl, trg_level: StatusLvl,
id: Arc<RwLock<IdentityManager>>, id: Arc<RwLock<IdentityManager>>,
) -> ChangeResult ) -> ChangeResult
@ -764,11 +767,11 @@ impl ModulesManager {
// if trg_level = StatusLvl::Instance , the temp_chnl = the broadcaster's or the chatter's // if trg_level = StatusLvl::Instance , the temp_chnl = the broadcaster's or the chatter's
let arb_chnl = match trg_level.clone() { let arb_chnl = match trg_level.clone() {
StatusLvl::Instance => ChType::Channel(requestor.to_lowercase()), StatusLvl::Instance => Channel(requestor.to_lowercase()),
StatusLvl::Ch(a) => a, StatusLvl::Ch(a) => a,
}; };
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), arb_chnl.clone(), requestor_badge.clone(), let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), arb_chnl.clone(), requestor_badge.clone(),
vec![ vec![
@ -903,7 +906,7 @@ impl ModulesManager {
&self, &self,
requestor: String, requestor: String,
requestor_badge: Option<ChatBadge>, requestor_badge: Option<ChatBadge>,
trg_module: ModType, trg_module: BotModule,
trg_level: StatusLvl, trg_level: StatusLvl,
force: bool, force: bool,
id: Arc<RwLock<IdentityManager>>, id: Arc<RwLock<IdentityManager>>,
@ -946,11 +949,11 @@ impl ModulesManager {
// if trg_level = StatusLvl::Instance , the temp_chnl = the broadcaster's or the chatter's // if trg_level = StatusLvl::Instance , the temp_chnl = the broadcaster's or the chatter's
let arb_chnl = match trg_level.clone() { let arb_chnl = match trg_level.clone() {
StatusLvl::Instance => ChType::Channel(requestor.to_lowercase()), StatusLvl::Instance => Channel(requestor.to_lowercase()),
StatusLvl::Ch(a) => a, StatusLvl::Ch(a) => a,
}; };
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), arb_chnl.clone(), requestor_badge.clone(), let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), arb_chnl.clone(), requestor_badge.clone(),
vec![ vec![
@ -1080,7 +1083,7 @@ impl ModulesManager {
ChangeResult::Failed("ERROR : Not implemented yet".to_string()) ChangeResult::Failed("ERROR : Not implemented yet".to_string())
} }
pub async fn set_instance_disabled(&self, in_module: ModType) -> (StatusType,ChangeResult) { pub async fn set_instance_disabled(&self, in_module: BotModule) -> (StatusType,ChangeResult) {
// at Instance level // at Instance level
// - If core module, do nothing // - If core module, do nothing
@ -1115,7 +1118,7 @@ impl ModulesManager {
// (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string())) // (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string()))
} }
pub async fn force_disable(&self, in_module: ModType) -> (StatusType,ChangeResult) { pub async fn force_disable(&self, in_module: BotModule) -> (StatusType,ChangeResult) {
// Disables the module at Instance level, and removes all Enabled at Channel level // Disables the module at Instance level, and removes all Enabled at Channel level
// - Bot Moderators MUST Re-enable if they were enabled before // - Bot Moderators MUST Re-enable if they were enabled before
// - If core module, do nothing // - If core module, do nothing
@ -1159,7 +1162,7 @@ impl ModulesManager {
// (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string())) // (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string()))
} }
pub async fn set_instance_enabled(&self, in_module: ModType) -> (StatusType,ChangeResult) { pub async fn set_instance_enabled(&self, in_module: BotModule) -> (StatusType,ChangeResult) {
// at Instance level // at Instance level
// - If core module, do nothing // - If core module, do nothing
@ -1194,7 +1197,7 @@ impl ModulesManager {
// (StatusType::Enabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string())) // (StatusType::Enabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string()))
} }
pub async fn set_ch_disabled(&self, in_module: ModType , in_chnl: ChType) -> (StatusType,ChangeResult) { pub async fn set_ch_disabled(&self, in_module: BotModule , in_chnl: Channel) -> (StatusType,ChangeResult) {
// at Instance level // at Instance level
// - If core module, do nothing // - If core module, do nothing
@ -1232,7 +1235,7 @@ impl ModulesManager {
// (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string())) // (StatusType::Disabled(StatusLvl::Instance),ChangeResult::NoChange("Nothing needed".to_string()))
} }
pub async fn set_ch_enabled(&self, in_module: ModType , in_chnl: ChType) -> (StatusType,ChangeResult) { pub async fn set_ch_enabled(&self, in_module: BotModule , in_chnl: Channel) -> (StatusType,ChangeResult) {
// at Instance level // at Instance level
// - If core module, do nothing // - If core module, do nothing
@ -1272,16 +1275,16 @@ impl ModulesManager {
pub async fn add_botaction(&self, in_module: ModType, in_action: BotAction) { pub async fn add_botaction(&self, in_module: BotModule, in_action: BotAction) {
self.int_add_botaction(in_module,ModGroup::Custom,in_action).await; self.int_add_botaction(in_module,ModGroup::Custom,in_action).await;
} }
pub async fn add_core_act(&self, in_module: ModType, in_action: BotAction) { pub async fn add_core_act(&self, in_module: BotModule, in_action: BotAction) {
self.int_add_botaction(in_module,ModGroup::Core,in_action).await; self.int_add_botaction(in_module,ModGroup::Core,in_action).await;
} }
pub async fn affirm_in_statusdb(&self,in_module:ModType,in_modgroup: ModGroup) { pub async fn affirm_in_statusdb(&self,in_module:BotModule,in_modgroup: ModGroup) {
let mut dbt = self.statusdb.write().await; let mut dbt = self.statusdb.write().await;
@ -1297,7 +1300,7 @@ impl ModulesManager {
} }
async fn int_add_botaction(&self, in_module: ModType, in_modgroup: ModGroup, in_action: BotAction) { async fn int_add_botaction(&self, in_module: BotModule, in_modgroup: ModGroup, in_action: BotAction) {
botlog::trace( botlog::trace(
"Add botaction called", "Add botaction called",
Some("ModulesManager > init()".to_string()), Some("ModulesManager > init()".to_string()),
@ -1320,7 +1323,7 @@ impl ModulesManager {
// - If BotAction to Add is a BotCommand , In Module Manager DB (botactions), // - If BotAction to Add is a BotCommand , In Module Manager DB (botactions),
// Check All Other BotAction Command Names & Aliases to ensure they don't conflict // Check All Other BotAction Command Names & Aliases to ensure they don't conflict
async fn find_conflict_module(mgr: &ModulesManager, act: &BotAction) -> Option<ModType> { async fn find_conflict_module(mgr: &ModulesManager, act: &BotAction) -> Option<BotModule> {
if let BotAction::C(incmd) = act { if let BotAction::C(incmd) = act {
let actdb = mgr.botactions.read().await; let actdb = mgr.botactions.read().await;
@ -1395,12 +1398,12 @@ impl ModulesManager {
); );
} }
fn _statuscleanup(&self, _: Option<ChType>) { fn _statuscleanup(&self, _: Option<Channel>) {
// internal cleans up statusdb . For example : // internal cleans up statusdb . For example :
// - remove redudancies . If we see several Enabled("m"), only keep 1x // - remove redudancies . If we see several Enabled("m"), only keep 1x
// - Clarify Conflict. If we see Enabled("m") and Disabled("m") , we remove Enabled("m") and keep Disabled("m") // - Clarify Conflict. If we see Enabled("m") and Disabled("m") , we remove Enabled("m") and keep Disabled("m")
// the IDEAL is that this is ran before every read/update operation to ensure quality // the IDEAL is that this is ran before every read/update operation to ensure quality
// Option<ChType> can pass Some(Channel("m")) (as an example) so statuscleanup only works on the given channel // Option<Channel> can pass Some(Channel("m")) (as an example) so statuscleanup only works on the given channel
// Passing None to chnl may be a heavy operation, as this will review and look at the whole table // Passing None to chnl may be a heavy operation, as this will review and look at the whole table
} }
} }
@ -1467,10 +1470,10 @@ mod core_modulesmanager {
*/ */
async fn complex_workflow( async fn complex_workflow(
in_module: ModType , in_module: BotModule ,
in_modgroup : ModGroup , in_modgroup : ModGroup ,
in_chnl1 : ChType, in_chnl1 : Channel,
in_chnl2 : ChType) in_chnl2 : Channel)
{ {
@ -1643,7 +1646,7 @@ mod core_modulesmanager {
let in_module = BotModule("Experiments01".to_string()); let in_module = BotModule("Experiments01".to_string());
let in_modgroup = ModGroup::Custom; let in_modgroup = ModGroup::Custom;
let (in_chnl1,in_chnl2) = let (in_chnl1,in_chnl2) =
(ChType::Channel("TestChannel01".to_string()),ChType::Channel("TestChannel02".to_string())); (Channel("TestChannel01".to_string()),Channel("TestChannel02".to_string()));
complex_workflow(in_module, in_modgroup, in_chnl1, in_chnl2).await; complex_workflow(in_module, in_modgroup, in_chnl1, in_chnl2).await;
@ -1659,7 +1662,7 @@ mod core_modulesmanager {
let in_module = BotModule("CoreModule01".to_string()); let in_module = BotModule("CoreModule01".to_string());
let in_modgroup = ModGroup::Core; let in_modgroup = ModGroup::Core;
let (in_chnl1,in_chnl2) = let (in_chnl1,in_chnl2) =
(ChType::Channel("TestChannel01".to_string()),ChType::Channel("TestChannel02".to_string())); (Channel("TestChannel01".to_string()),Channel("TestChannel02".to_string()));
complex_workflow(in_module, in_modgroup, in_chnl1, in_chnl2).await; complex_workflow(in_module, in_modgroup, in_chnl1, in_chnl2).await;
@ -1701,7 +1704,7 @@ mod core_modulesmanager {
async fn inner_enable_disable_complex( async fn inner_enable_disable_complex(
requestor:String, requestor:String,
channel:ChType, channel:Channel,
idmgr:IdentityManager, idmgr:IdentityManager,
modsmgr:Arc<ModulesManager>) modsmgr:Arc<ModulesManager>)
{ {
@ -1724,7 +1727,7 @@ mod core_modulesmanager {
let requestor_badge = None; // If they are a Mod on the Given Channel already, that can be evaluated without the current badge let requestor_badge = None; // If they are a Mod on the Given Channel already, that can be evaluated without the current badge
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), channel.clone(), requestor_badge.clone(), let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), channel.clone(), requestor_badge.clone(),
vec![ vec![
@ -1773,7 +1776,7 @@ mod core_modulesmanager {
// [-] requestor_badge: Option<ChatBadge>, // [-] requestor_badge: Option<ChatBadge>,
// [x] trg_module: ModType, // [x] trg_module: BotModule,
let trg_module = in_module; let trg_module = in_module;
// [x] trg_level: StatusLvl, // [x] trg_level: StatusLvl,
@ -2020,7 +2023,7 @@ mod core_modulesmanager {
assert!(rslt.contains(&identity::UserRole::BotAdmin)); assert!(rslt.contains(&identity::UserRole::BotAdmin));
let channel = ChType::Channel("somechannel".to_string()); let channel = Channel("somechannel".to_string());
inner_enable_disable_complex(requestor, channel, idmgr, modsmgr).await; inner_enable_disable_complex(requestor, channel, idmgr, modsmgr).await;
@ -2058,7 +2061,7 @@ mod core_modulesmanager {
let requestor = "mod_user".to_string(); let requestor = "mod_user".to_string();
// let botadmin_badge = &None; // let botadmin_badge = &None;
let channel = ChType::Channel("somechannel".to_string()); let channel = Channel("somechannel".to_string());
idmgr.affirm_chatter_in_db(requestor.clone()).await; idmgr.affirm_chatter_in_db(requestor.clone()).await;
@ -2109,7 +2112,7 @@ mod core_modulesmanager {
let requestor = "regular_user".to_string(); let requestor = "regular_user".to_string();
let channel = ChType::Channel("somechannel".to_string()); let channel = Channel("somechannel".to_string());
idmgr.affirm_chatter_in_db(requestor.clone()).await; idmgr.affirm_chatter_in_db(requestor.clone()).await;
@ -2142,7 +2145,7 @@ mod core_modulesmanager {
let requestor = "regular_user".to_string(); let requestor = "regular_user".to_string();
let channel = ChType::Channel("somechannel".to_string()); let channel = Channel("somechannel".to_string());
idmgr.affirm_chatter_in_db(requestor.clone()).await; idmgr.affirm_chatter_in_db(requestor.clone()).await;

View file

@ -15,21 +15,21 @@ use rand::Rng;
use crate::core::ratelimiter; use crate::core::ratelimiter;
use crate::core::ratelimiter::RateLimiter; use crate::core::ratelimiter::RateLimiter;
use crate::core::botinstance::ChType; use crate::core::botinstance::Channel;
use crate::core::botlog; use crate::core::botlog;
pub use ChType::Channel;
use tokio::time::{sleep, Duration}; use tokio::time::{sleep, Duration};
#[derive(Clone)] #[derive(Clone)]
pub struct Chat { pub struct Chat {
pub ratelimiters: Arc<Mutex<HashMap<ChType, RateLimiter>>>, // used to limit messages sent per channel pub ratelimiters: Arc<Mutex<HashMap<Channel, RateLimiter>>>, // used to limit messages sent per channel
pub client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>, pub client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>,
} }
impl Chat { impl Chat {
pub fn init( pub fn init(
ratelimiters: HashMap<ChType, RateLimiter>, ratelimiters: HashMap<Channel, RateLimiter>,
client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>, client: TwitchIRCClient<TCPTransport<TLS>, StaticLoginCredentials>,
) -> Chat { ) -> Chat {
Chat { Chat {
@ -38,7 +38,7 @@ impl Chat {
} }
} }
pub async fn init_channel(&mut self, chnl: ChType) { pub async fn init_channel(&mut self, chnl: Channel) {
let n = RateLimiter::new(); let n = RateLimiter::new();
self.ratelimiters.lock().await.insert(chnl, n); self.ratelimiters.lock().await.insert(chnl, n);
} }

View file

@ -8,7 +8,7 @@ use twitch_irc::message::PrivmsgMessage;
use casual_logger::Log; use casual_logger::Log;
use crate::core::bot_actions::actions_util::{self, BotAR}; use crate::core::bot_actions::actions_util::{self, BotAR};
use crate::core::botinstance::{ChType,ChangeResult}; use crate::core::botinstance::{Channel,ChangeResult};
use crate::core::botlog; use crate::core::botlog;
use crate::core::botmodules::{BotActionTrait, BotCommand, BotModule, ModulesManager}; use crate::core::botmodules::{BotActionTrait, BotCommand, BotModule, ModulesManager};
@ -60,8 +60,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
exec_body: actions_util::asyncbox(cmd_promote), exec_body: actions_util::asyncbox(cmd_promote),
help: String::from("promote"), help: String::from("promote"),
required_roles: vec![ required_roles: vec![
UserRole::Mod(ChType::Channel(String::new())), UserRole::Mod(Channel(String::new())),
UserRole::SupMod(ChType::Channel(String::new())), UserRole::SupMod(Channel(String::new())),
UserRole::Broadcaster, UserRole::Broadcaster,
UserRole::BotAdmin, UserRole::BotAdmin,
], ],
@ -172,7 +172,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
sendername.clone(), sendername.clone(),
&sender_badge, &sender_badge,
targetusr.to_string(), targetusr.to_string(),
Some(ChType::Channel(targetchnl.clone())), Some(Channel(targetchnl.clone())),
target_bot_admin_role, target_bot_admin_role,
) )
.await .await
@ -232,8 +232,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
exec_body: actions_util::asyncbox(cmd_demote), exec_body: actions_util::asyncbox(cmd_demote),
help: String::from("demote"), help: String::from("demote"),
required_roles: vec![ required_roles: vec![
UserRole::Mod(ChType::Channel(String::new())), UserRole::Mod(Channel(String::new())),
UserRole::SupMod(ChType::Channel(String::new())), UserRole::SupMod(Channel(String::new())),
UserRole::Broadcaster, UserRole::Broadcaster,
UserRole::BotAdmin, UserRole::BotAdmin,
], ],
@ -368,7 +368,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
sendername.clone(), sendername.clone(),
&sender_badge, &sender_badge,
targetusr.to_string(), targetusr.to_string(),
Some(ChType::Channel(targetchnl.clone())), Some(Channel(targetchnl.clone())),
) )
.await .await
} }
@ -424,8 +424,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
exec_body: actions_util::asyncbox(getroles), exec_body: actions_util::asyncbox(getroles),
help: String::from("getroles"), help: String::from("getroles"),
required_roles: vec![ required_roles: vec![
UserRole::Mod(ChType::Channel(String::new())), UserRole::Mod(Channel(String::new())),
UserRole::SupMod(ChType::Channel(String::new())), UserRole::SupMod(Channel(String::new())),
UserRole::Broadcaster, UserRole::Broadcaster,
UserRole::BotAdmin, UserRole::BotAdmin,
], ],
@ -477,7 +477,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
idlock idlock
.getspecialuserroles( .getspecialuserroles(
String::from(targetuser), String::from(targetuser),
Some(ChType::Channel(msg.channel_login.to_lowercase())), Some(Channel(msg.channel_login.to_lowercase())),
) )
.await .await
} }
@ -486,20 +486,20 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let callersproles = idlock let callersproles = idlock
.getspecialuserroles( .getspecialuserroles(
msg.sender.name.to_lowercase(), msg.sender.name.to_lowercase(),
Some(ChType::Channel(targetchnl.to_lowercase().to_string())), Some(Channel(targetchnl.to_lowercase().to_string())),
) )
.await; .await;
if callersproles.contains(&UserRole::Mod(ChType::Channel( if callersproles.contains(&UserRole::Mod(Channel(
targetchnl.to_lowercase().to_string(), targetchnl.to_lowercase().to_string(),
))) || callersproles.contains(&UserRole::SupMod(ChType::Channel( ))) || callersproles.contains(&UserRole::SupMod(Channel(
targetchnl.to_lowercase().to_string(), targetchnl.to_lowercase().to_string(),
))) || callersproles.contains(&UserRole::Broadcaster) ))) || callersproles.contains(&UserRole::Broadcaster)
{ {
idlock idlock
.getspecialuserroles( .getspecialuserroles(
String::from(targetuser), String::from(targetuser),
Some(ChType::Channel(targetchnl.to_lowercase())), Some(Channel(targetchnl.to_lowercase())),
) )
.await .await
} else { } else {
@ -507,7 +507,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
idlock idlock
.getspecialuserroles( .getspecialuserroles(
String::from(targetuser), String::from(targetuser),
Some(ChType::Channel(msg.channel_login.to_lowercase())), Some(Channel(msg.channel_login.to_lowercase())),
) )
.await .await
} }
@ -535,18 +535,18 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let mut outmsg = "FeelsWowMan they're the broadcaster. ".to_string(); let mut outmsg = "FeelsWowMan they're the broadcaster. ".to_string();
if sproles.contains(&UserRole::Mod(ChType::Channel( if sproles.contains(&UserRole::Mod(Channel(
msg.channel_login.to_lowercase(), msg.channel_login.to_lowercase(),
))) || sproles.contains(&UserRole::SupMod(ChType::Channel( ))) || sproles.contains(&UserRole::SupMod(Channel(
msg.channel_login.to_lowercase(), msg.channel_login.to_lowercase(),
))) || sproles.contains(&UserRole::BotAdmin) ))) || sproles.contains(&UserRole::BotAdmin)
{ {
outmsg += format!("Target chatter's user roles are : {:?}", sproles).as_str(); outmsg += format!("Target chatter's user roles are : {:?}", sproles).as_str();
} }
outmsg outmsg
} else if sproles.contains(&UserRole::Mod(ChType::Channel( } else if sproles.contains(&UserRole::Mod(Channel(
msg.channel_login.to_lowercase(), msg.channel_login.to_lowercase(),
))) || sproles.contains(&UserRole::SupMod(ChType::Channel( ))) || sproles.contains(&UserRole::SupMod(Channel(
msg.channel_login.to_lowercase(), msg.channel_login.to_lowercase(),
))) || sproles.contains(&UserRole::BotAdmin) ))) || sproles.contains(&UserRole::BotAdmin)
{ {
@ -578,8 +578,8 @@ pub async fn init(mgr: Arc<ModulesManager>) {
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]
pub enum UserRole { pub enum UserRole {
Chatter, Chatter,
Mod(ChType), // String specifies Channel Mod(Channel), // String specifies Channel
SupMod(ChType), // String specifies Channel SupMod(Channel), // String specifies Channel
Broadcaster, Broadcaster,
BotAdmin, BotAdmin,
} }
@ -698,7 +698,7 @@ impl IdentityManager {
self.can_user_run( self.can_user_run(
msg.sender.name.to_owned(), msg.sender.name.to_owned(),
ChType::Channel(msg.channel_login.to_owned()), Channel(msg.channel_login.to_owned()),
sender_badge, sender_badge,
cmdreqroles, cmdreqroles,
) )
@ -709,7 +709,7 @@ impl IdentityManager {
pub async fn can_user_run( pub async fn can_user_run(
&mut self, &mut self,
usr: String, usr: String,
channelname: ChType, channelname: Channel,
chat_badge: Option<ChatBadge>, chat_badge: Option<ChatBadge>,
cmdreqroles: Vec<UserRole>, // ) -> Result<Permissible,Box<dyn Error>> { cmdreqroles: Vec<UserRole>, // ) -> Result<Permissible,Box<dyn Error>> {
) -> (Permissible, ChangeResult) { ) -> (Permissible, ChangeResult) {
@ -799,8 +799,8 @@ impl IdentityManager {
// [x] and cmdreqroles includes UserRole::Mod("") OR UserRole::SupMod("") , Ok(Permissible::Allow) // [x] and cmdreqroles includes UserRole::Mod("") OR UserRole::SupMod("") , Ok(Permissible::Allow)
Some(ChatBadge::Broadcaster) => { Some(ChatBadge::Broadcaster) => {
if cmdreqroles.contains(&UserRole::Broadcaster) if cmdreqroles.contains(&UserRole::Broadcaster)
|| cmdreqroles.contains(&UserRole::Mod(ChType::Channel(String::new()))) || cmdreqroles.contains(&UserRole::Mod(Channel(String::new())))
|| cmdreqroles.contains(&UserRole::SupMod(ChType::Channel(String::new()))) || cmdreqroles.contains(&UserRole::SupMod(Channel(String::new())))
{ {
// return Ok(Permissible::Allow) // return Ok(Permissible::Allow)
return ( return (
@ -869,7 +869,7 @@ impl IdentityManager {
None, None,
); );
if cmdreqroles.contains(&UserRole::Mod(ChType::Channel(String::new()))) { if cmdreqroles.contains(&UserRole::Mod(Channel(String::new()))) {
botlog::trace( botlog::trace(
"Command requires Mod Role", "Command requires Mod Role",
Some("identity.rs > can_user_run()".to_string()), Some("identity.rs > can_user_run()".to_string()),
@ -905,7 +905,7 @@ impl IdentityManager {
// [x] If cmdreqroles includes UserRole::SupMod("") , checks if chatter has UserRole::SupMod(channelname::ChType) to determine if Ok(Permissible::Allow) // [x] If cmdreqroles includes UserRole::SupMod("") , checks if chatter has UserRole::SupMod(channelname::ChType) to determine if Ok(Permissible::Allow)
if cmdreqroles.contains(&UserRole::SupMod(ChType::Channel(String::new()))) { if cmdreqroles.contains(&UserRole::SupMod(Channel(String::new()))) {
if let Some(a) = self if let Some(a) = self
.special_roles_users .special_roles_users
.read() .read()
@ -979,7 +979,7 @@ impl IdentityManager {
authorizer: String, authorizer: String,
authorizer_badge: &Option<ChatBadge>, authorizer_badge: &Option<ChatBadge>,
trgchatter: String, trgchatter: String,
channel: Option<ChType>, channel: Option<Channel>,
trg_role: Option<UserRole>, trg_role: Option<UserRole>,
) -> ChangeResult { ) -> ChangeResult {
botlog::trace( botlog::trace(
@ -1163,7 +1163,7 @@ impl IdentityManager {
authorizer: String, authorizer: String,
authorizer_badge: &Option<ChatBadge>, authorizer_badge: &Option<ChatBadge>,
trgchatter: String, trgchatter: String,
channel: Option<ChType>, channel: Option<Channel>,
) -> ChangeResult { ) -> ChangeResult {
botlog::trace(&format!("IN VARS for demote() : Authorizer : {:?} ; Target Chatter : {} ; Target Channel : {:?}", botlog::trace(&format!("IN VARS for demote() : Authorizer : {:?} ; Target Chatter : {} ; Target Channel : {:?}",
authorizer,trgchatter,channel), Some("identity.rs > demote()".to_string()), None); authorizer,trgchatter,channel), Some("identity.rs > demote()".to_string()), None);
@ -1260,7 +1260,7 @@ impl IdentityManager {
pub async fn getspecialuserroles( pub async fn getspecialuserroles(
&self, &self,
chattername: String, chattername: String,
channel: Option<ChType>, channel: Option<Channel>,
) -> Vec<UserRole> { ) -> Vec<UserRole> {
/* /*
Note : Ideally this be called for a given chatter name ? Note : Ideally this be called for a given chatter name ?
@ -1285,14 +1285,14 @@ impl IdentityManager {
let channel_out = match channel { let channel_out = match channel {
Some(channel_tmp) => { Some(channel_tmp) => {
match channel_tmp { match channel_tmp {
ChType::Channel(channel_tmp) => { Channel(channel_tmp) => {
// In this block, Some input channel is given // In this block, Some input channel is given
// We're comparing the channel name with chattername to determine if they're a broadcaster // We're comparing the channel name with chattername to determine if they're a broadcaster
if chattername == channel_tmp.to_lowercase() { if chattername == channel_tmp.to_lowercase() {
evalsproles.push(UserRole::Broadcaster); evalsproles.push(UserRole::Broadcaster);
} }
Some(ChType::Channel(channel_tmp)) Some(Channel(channel_tmp))
} // _ => () } // _ => ()
} }
} }
@ -1379,8 +1379,8 @@ mod core_identity {
fn user_role_identity() { fn user_role_identity() {
Log::set_file_ext(Extension::Log); Log::set_file_ext(Extension::Log);
assert_eq!( assert_eq!(
UserRole::SupMod(ChType::Channel("strong".to_string())), UserRole::SupMod(Channel("strong".to_string())),
UserRole::SupMod(ChType::Channel("Strong".to_lowercase())) UserRole::SupMod(Channel("Strong".to_lowercase()))
); );
} }
@ -1395,7 +1395,7 @@ mod core_identity {
let (usr, channelname, chat_badge, cmdreqroles) = ( let (usr, channelname, chat_badge, cmdreqroles) = (
bot, bot,
ChType::Channel("twitchchanneltest".to_string()), Channel("twitchchanneltest".to_string()),
None, None,
vec![] vec![]
); );
@ -1420,7 +1420,7 @@ mod core_identity {
let test_id_mgr = IdentityManager::init(); let test_id_mgr = IdentityManager::init();
// [x] Mod Attempts to Promote User // [x] Mod Attempts to Promote User
let channel = Some(ChType::Channel("twitchchanneltest".to_string())); let channel = Some(Channel("twitchchanneltest".to_string()));
let trgchatter = "regularChatter".to_string(); let trgchatter = "regularChatter".to_string();
let authorizer_badge = &Some(ChatBadge::Mod); let authorizer_badge = &Some(ChatBadge::Mod);
let authorizer = "chatMod".to_string(); let authorizer = "chatMod".to_string();
@ -1450,7 +1450,7 @@ mod core_identity {
let test_id_mgr = IdentityManager::init(); let test_id_mgr = IdentityManager::init();
// [x] Broadcaster Promotes Chatter to SupMod // [x] Broadcaster Promotes Chatter to SupMod
let channel = Some(ChType::Channel("broadcasterer".to_string())); let channel = Some(Channel("broadcasterer".to_string()));
let trgchatter = "regularChatter".to_string(); let trgchatter = "regularChatter".to_string();
let authorizer_badge = &Some(ChatBadge::Broadcaster); let authorizer_badge = &Some(ChatBadge::Broadcaster);
let authorizer = "broadcasterer".to_string(); let authorizer = "broadcasterer".to_string();
@ -1475,7 +1475,7 @@ mod core_identity {
.getspecialuserroles(trgchatter.clone(), channel.clone()) .getspecialuserroles(trgchatter.clone(), channel.clone())
.await; .await;
assert!(rslt.contains(&UserRole::Mod(ChType::Channel("broadcasterer".to_string())))); assert!(rslt.contains(&UserRole::Mod(Channel("broadcasterer".to_string()))));
let rslt = test_id_mgr let rslt = test_id_mgr
.promote( .promote(
@ -1496,7 +1496,7 @@ mod core_identity {
.getspecialuserroles(trgchatter.clone(), channel.clone()) .getspecialuserroles(trgchatter.clone(), channel.clone())
.await; .await;
assert!(rslt.contains(&UserRole::SupMod(ChType::Channel( assert!(rslt.contains(&UserRole::SupMod(Channel(
"broadcasterer".to_string() "broadcasterer".to_string()
)))); ))));
@ -1530,7 +1530,7 @@ mod core_identity {
let broadcaster = "broadcasterer".to_string(); let broadcaster = "broadcasterer".to_string();
let broadcaster_badge = &Some(ChatBadge::Broadcaster); let broadcaster_badge = &Some(ChatBadge::Broadcaster);
// let channel = Some(ChType::Channel(broadcaster.clone())); // let channel = Some(ChType::Channel(broadcaster.clone()));
let channel = ChType::Channel(broadcaster.clone()); let channel = Channel(broadcaster.clone());
let supchatter = "superModerator".to_string(); let supchatter = "superModerator".to_string();
let trg_role = None; let trg_role = None;
@ -1575,7 +1575,7 @@ mod core_identity {
// let broadcaster = "broadcasterer".to_string(); // let broadcaster = "broadcasterer".to_string();
let authorizer = supchatter; let authorizer = supchatter;
let authorizer_badge = &Some(ChatBadge::Broadcaster); let authorizer_badge = &Some(ChatBadge::Broadcaster);
let channel = Some(ChType::Channel(broadcaster.clone())); let channel = Some(Channel(broadcaster.clone()));
let trgchatter = "regularChatter".to_string(); let trgchatter = "regularChatter".to_string();
let trg_role = None; let trg_role = None;
@ -1646,7 +1646,7 @@ mod core_identity {
// let broadcaster = "broadcasterer".to_string(); // let broadcaster = "broadcasterer".to_string();
let authorizer = botadmin; let authorizer = botadmin;
let authorizer_badge = botadmin_badge; let authorizer_badge = botadmin_badge;
let channel = Some(ChType::Channel("somechannel".to_string())); let channel = Some(Channel("somechannel".to_string()));
let trgchatter = "regularChatter".to_string(); let trgchatter = "regularChatter".to_string();
let trg_role = None; let trg_role = None;
@ -1721,7 +1721,7 @@ mod core_identity {
let supmod = "supmoder".to_string(); let supmod = "supmoder".to_string();
let channel = Some(ChType::Channel("somechannel".to_string())); let channel = Some(Channel("somechannel".to_string()));
test_id_mgr.affirm_chatter_in_db(supmod.clone()).await; test_id_mgr.affirm_chatter_in_db(supmod.clone()).await;
test_id_mgr test_id_mgr

View file

@ -16,8 +16,7 @@ use std::sync::Arc;
use twitch_irc::message::PrivmsgMessage; use twitch_irc::message::PrivmsgMessage;
// use crate::core::botinstance::ChType::Channel; // use crate::core::botinstance::ChType::Channel;
use crate::core::botinstance::ChType; use crate::core::botinstance::Channel;
use ChType::Channel;
use crate::core::botlog; use crate::core::botlog;
use crate::core::bot_actions::actions_util::{self, BotAR}; use crate::core::bot_actions::actions_util::{self, BotAR};
@ -29,7 +28,7 @@ use tokio::time::{sleep, Duration};
pub async fn init(mgr: Arc<ModulesManager>) { pub async fn init(mgr: Arc<ModulesManager>) {
const OF_CMD_CHANNEL:ChType = Channel(String::new()); const OF_CMD_CHANNEL:Channel = Channel(String::new());
// 1. Define the BotAction // 1. Define the BotAction
let botc1 = BotCommand { let botc1 = BotCommand {