ModulesManager #37
1 changed files with 301 additions and 7 deletions
|
@ -77,7 +77,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
|
|||
/*
|
||||
There should be additional validation checks
|
||||
- BotAdmins can only run instance level (-i) enables
|
||||
- If BotAdmins need to enable/disable at instance level, they must Promote themselves to be a Mod at least
|
||||
- If BotAdmins need to enable/disable at Channel level, they must Promote themselves to be a Mod at least
|
||||
- Other Special Roles (Mod,SupMod,Broadcaster) can run without issues to enable the module at Channel Level
|
||||
*/
|
||||
|
||||
|
@ -107,11 +107,102 @@ pub async fn init(mgr: Arc<ModulesManager>) {
|
|||
*/
|
||||
|
||||
|
||||
/*
|
||||
exec_enable(Self,requestor,requestor_badge,trg_module,Channel) -> ChangeResult
|
||||
|
||||
// [ ] Unwraps arguments from message
|
||||
|
||||
let (arg1, arg2) = {
|
||||
|
||||
let mut argv = msg.message_text.split(' ');
|
||||
|
||||
argv.next(); // Skip the command name
|
||||
|
||||
let arg1 = argv.next();
|
||||
|
||||
let arg2 = argv.next();
|
||||
|
||||
(arg1, arg2)
|
||||
};
|
||||
|
||||
|
||||
/* -- Related function to call later
|
||||
exec_enable(
|
||||
&self,
|
||||
requestor: String,
|
||||
requestor_badge: Option<ChatBadge>,
|
||||
trg_module: ModType,
|
||||
// channel: Option<ChType>,
|
||||
trg_level: StatusLvl,
|
||||
bot: BotAR,
|
||||
) -> ChangeResult
|
||||
*/
|
||||
|
||||
|
||||
// [ ] requestor: String,
|
||||
let requester = msg.clone().sender.name;
|
||||
|
||||
|
||||
// [ ] requestor_badge: Option<ChatBadge>,
|
||||
|
||||
let mut requestor_badge_mut: Option<ChatBadge> = None;
|
||||
|
||||
for b in &msg.badges {
|
||||
if b.name == "moderator" {
|
||||
requestor_badge_mut = Some(ChatBadge::Mod);
|
||||
} else if b.name == "broadcaster" {
|
||||
requestor_badge_mut = Some(ChatBadge::Broadcaster);
|
||||
}
|
||||
}
|
||||
|
||||
let requestor_badge = requestor_badge_mut;
|
||||
|
||||
|
||||
// [ ] trg_module: ModType,
|
||||
// - [ ] Need to validate an actual ModType - otherwise, fail or exit the cmd
|
||||
|
||||
let trg_module = if (arg1 == Some("-i")) || (arg1 == Some("-f")) { arg2 } else { arg1 };
|
||||
|
||||
if let Some(trg_module_str) = trg_module {
|
||||
|
||||
let botlock = bot.read().await;
|
||||
let modmgr = Arc::clone(&botlock.botmodules);
|
||||
let modlist = modmgr.moduleslist().await;
|
||||
let rslt = modlist.get(&ModType::BotModule(trg_module_str.to_string()));
|
||||
|
||||
if let None = rslt {
|
||||
|
||||
let outmsg = "uuh module doesn't exist";
|
||||
|
||||
botlog::debug(
|
||||
outmsg,
|
||||
Some("botmodules.rs > cmd_enable()".to_string()),
|
||||
Some(&msg),
|
||||
);
|
||||
|
||||
botlock
|
||||
.botmgrs
|
||||
.chat
|
||||
.say_in_reply_to(&msg, outmsg.to_string())
|
||||
.await;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// [ ] trg_level: StatusLvl,
|
||||
|
||||
let currchnl = msg.channel_login.to_lowercase();
|
||||
|
||||
let trg_level =
|
||||
if arg1 == Some("-i") { StatusLvl::Instance }
|
||||
else if arg1 == Some("-f") { StatusLvl::Instance }
|
||||
else { StatusLvl::Ch(ChType::Channel(currchnl)) }
|
||||
;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -138,10 +229,10 @@ pub async fn init(mgr: Arc<ModulesManager>) {
|
|||
async fn cmd_disable(bot: BotAR, msg: PrivmsgMessage) {
|
||||
/*
|
||||
There should be additional validation checks
|
||||
- BotAdmins can only run instance level (-i) disables
|
||||
- If BotAdmins need to enable/disable at instance level, they must Promote themselves to be a Mod at least
|
||||
- BotAdmins can only run instance level (-i) disables and (-f) force disable
|
||||
- If BotAdmins need to enable/disable at Channel level, they must Promote themselves to be a Mod at least
|
||||
- Other Special Roles (Mod,SupMod,Broadcaster) can run without issues to disable the module at Channel Level
|
||||
*/
|
||||
*/
|
||||
|
||||
/*
|
||||
disable -i <module> // disables at Instance
|
||||
|
@ -149,6 +240,26 @@ pub async fn init(mgr: Arc<ModulesManager>) {
|
|||
disable -f <module> // force disables (instance and enabled are removed)
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
1. If CmdSender is BotAdmin but not (Mod,SupMod,Broadcaster)
|
||||
1. can_user_run for cmdreqRoles including BotAdmin & not can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
1a. , and has no special flags (-i / -f) , return a Failure recommending BotAdmin promote themselves first
|
||||
1b. , and is -i (to instance) , return a Success
|
||||
1c. , and is -f (forced) , return a Success
|
||||
|
||||
2. If CmdSender not a BotAdmin but is (Mod,SupMod,Broadcaster)
|
||||
2. not can_user_run for cmdreqRoles including BotAdmin & can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
2a. , and has no special flags (-i / -f) , return a Success
|
||||
2b. , and is -i (to instance) , return a Failure they are not allowed
|
||||
2c. , and is -f (forced) , return a Failure they are not allowed
|
||||
|
||||
3. If CmdSender is (Mod,SupMod,Broadcaster) and a BotAdmin
|
||||
3. can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster) & can_user_run for cmdreqRoles including BotAdmin
|
||||
3a. , and has no special flags (-i / -f) , return a Success
|
||||
3b. , and is -i (to instance) , return a Success
|
||||
3c. , and is -f (forced) , return a Success
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
@ -348,6 +459,24 @@ impl ModulesManager {
|
|||
mgrarc
|
||||
}
|
||||
|
||||
|
||||
pub async fn moduleslist(&self) -> HashMap<ModType,ModGroup>
|
||||
{
|
||||
|
||||
// let db = Arc::clone(&self.statusdb);
|
||||
let db = self.statusdb.clone();
|
||||
let dblock = db.read().await;
|
||||
|
||||
let mut outmap = HashMap::new();
|
||||
|
||||
for (k,v) in &(*dblock) {
|
||||
let (mgrp,_) = v;
|
||||
let mtype = k;
|
||||
outmap.insert((*mtype).clone(), (*mgrp).clone());
|
||||
}
|
||||
outmap
|
||||
}
|
||||
|
||||
pub async fn modstatus(&self, in_module: ModType, in_chnl: ChType) -> StatusType {
|
||||
// Example usage : botmanager.modstatus(
|
||||
// BotModule("GambaCore"),
|
||||
|
@ -641,7 +770,161 @@ impl ModulesManager {
|
|||
|
||||
|
||||
|
||||
ChangeResult::NoChange("ERROR : Not implemented yet".to_string())
|
||||
ChangeResult::Failed("ERROR : Not implemented yet".to_string())
|
||||
}
|
||||
|
||||
|
||||
pub async fn exec_disable(
|
||||
&self,
|
||||
requestor: String,
|
||||
requestor_badge: Option<ChatBadge>,
|
||||
trg_module: ModType,
|
||||
// channel: Option<ChType>,
|
||||
trg_level: StatusLvl,
|
||||
force: bool,
|
||||
bot: BotAR,
|
||||
) -> ChangeResult
|
||||
{
|
||||
|
||||
/*
|
||||
|
||||
1. If CmdSender is BotAdmin but not (Mod,SupMod,Broadcaster)
|
||||
1. can_user_run for cmdreqRoles including BotAdmin & not can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
1a. , and has no special flags (-i / -f) , return a Failure recommending BotAdmin promote themselves first
|
||||
1b. , and is -i (to instance) , return a Success
|
||||
1c. , and is -f (forced) , return a Success
|
||||
|
||||
2. If CmdSender not a BotAdmin but is (Mod,SupMod,Broadcaster)
|
||||
2. not can_user_run for cmdreqRoles including BotAdmin & can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
2a. , and has no special flags (-i / -f) , return a Success
|
||||
2b. , and is -i (to instance) , return a Failure they are not allowed
|
||||
2c. , and is -f (forced) , return a Failure they are not allowed
|
||||
|
||||
3. If CmdSender is (Mod,SupMod,Broadcaster) and a BotAdmin
|
||||
3. can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster) & can_user_run for cmdreqRoles including BotAdmin
|
||||
3a. , and has no special flags (-i / -f) , return a Success
|
||||
3b. , and is -i (to instance) , return a Success
|
||||
3c. , and is -f (forced) , return a Success
|
||||
*/
|
||||
|
||||
|
||||
|
||||
let botlock = bot.read().await;
|
||||
let id = botlock.get_identity();
|
||||
let mut idlock = id.write().await;
|
||||
|
||||
// if trg_level = StatusLvl::Instance , the temp_chnl = the broadcaster's or the chatter's
|
||||
|
||||
let arb_chnl = match trg_level.clone() {
|
||||
StatusLvl::Instance => ChType::Channel(requestor.to_lowercase()),
|
||||
StatusLvl::Ch(a) => a,
|
||||
};
|
||||
|
||||
const OF_CMD_CHANNEL:ChType = Channel(String::new());
|
||||
|
||||
let (admin_level_access,_) = idlock.can_user_run(requestor.clone(), arb_chnl.clone(), requestor_badge.clone(),
|
||||
vec![
|
||||
identity::UserRole::BotAdmin,
|
||||
]).await;
|
||||
|
||||
|
||||
let (chnl_elevated_access,_) = idlock.can_user_run(requestor, arb_chnl, requestor_badge.clone(),
|
||||
vec![
|
||||
identity::UserRole::Mod(OF_CMD_CHANNEL),
|
||||
identity::UserRole::SupMod(OF_CMD_CHANNEL),
|
||||
identity::UserRole::Broadcaster,
|
||||
]).await;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
[ ] 1. If CmdSender is BotAdmin but not (Mod,SupMod,Broadcaster)
|
||||
1. can_user_run for cmdreqRoles including BotAdmin & not can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
1a. , and is -f (forced) , return a Success
|
||||
1b. , and is -i (to instance) , return a Success
|
||||
1c. , and has no special flags (-i / -f) , return a Failure recommending BotAdmin promote themselves first
|
||||
|
||||
*/
|
||||
|
||||
if let Permissible::Allow = admin_level_access {
|
||||
if let Permissible::Block = chnl_elevated_access {
|
||||
if force {
|
||||
self.force_disable(trg_module.clone()).await;
|
||||
return ChangeResult::Success("Forced Disable".to_string());
|
||||
} else {
|
||||
match trg_level {
|
||||
StatusLvl::Instance => {
|
||||
self.set_instance_disabled(trg_module.clone()).await;
|
||||
ChangeResult::Success("Disabled at Instance Level".to_string())
|
||||
},
|
||||
StatusLvl::Ch(_) => {
|
||||
ChangeResult::Failed("Promote yourself Temporarily First".to_string())
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
[ ] 2. If CmdSender not a BotAdmin but is (Mod,SupMod,Broadcaster)
|
||||
2. not can_user_run for cmdreqRoles including BotAdmin & can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster)
|
||||
2a. , and is -f (forced) , return a Failure they are not allowed
|
||||
2b. , and is -i (to instance) , return a Failure they are not allowed
|
||||
2c. , and has no special flags (-i / -f) , return a Success
|
||||
|
||||
*/
|
||||
|
||||
if let Permissible::Block = admin_level_access {
|
||||
if let Permissible::Allow = chnl_elevated_access {
|
||||
if force {
|
||||
return ChangeResult::Failed("You're not allowed".to_string());
|
||||
} else {
|
||||
match trg_level.clone() {
|
||||
StatusLvl::Instance => {
|
||||
ChangeResult::Failed("You're not allowed".to_string())
|
||||
},
|
||||
StatusLvl::Ch(in_chnl) => {
|
||||
self.set_ch_disabled(trg_module.clone(), in_chnl).await;
|
||||
ChangeResult::Success("Disabled at Channel Level".to_string())
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
[ ] 3. If CmdSender is (Mod,SupMod,Broadcaster) and a BotAdmin
|
||||
3. can_user_run for cmdreqRoles (Mod,SupMod,Broadcaster) & can_user_run for cmdreqRoles including BotAdmin
|
||||
3a. , and is -f (forced) , return a Success
|
||||
3b. , and is -i (to instance) , return a Success
|
||||
3c. , and has no special flags (-i / -f) , return a Success
|
||||
|
||||
*/
|
||||
|
||||
if let Permissible::Allow = admin_level_access {
|
||||
if let Permissible::Allow = chnl_elevated_access {
|
||||
if force {
|
||||
self.force_disable(trg_module.clone()).await;
|
||||
return ChangeResult::Success("Forced Disable".to_string());
|
||||
} else {
|
||||
match trg_level {
|
||||
StatusLvl::Instance => {
|
||||
self.set_instance_disabled(trg_module.clone()).await;
|
||||
ChangeResult::Success("Disabled at Instance Level".to_string())
|
||||
},
|
||||
StatusLvl::Ch(in_chnl) => {
|
||||
self.set_ch_disabled(trg_module.clone(), in_chnl).await;
|
||||
ChangeResult::Success("Disabled at Channel Level".to_string())
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ChangeResult::Failed("ERROR : Not implemented yet".to_string())
|
||||
}
|
||||
|
||||
pub async fn set_instance_disabled(&self, in_module: ModType) -> (StatusType,ChangeResult) {
|
||||
|
@ -1003,6 +1286,17 @@ mod core_modulesmanager {
|
|||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn WIP_case_insensitive_test() {
|
||||
Log::set_file_ext(Extension::Log);
|
||||
assert_eq!(
|
||||
BotModule("test".to_string()),
|
||||
BotModule("Test".to_lowercase())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Possible Tests
|
||||
|
|
Loading…
Reference in a new issue