botact header passes to child fn

This commit is contained in:
ModulatingForce 2024-03-26 19:08:33 -04:00
parent 34c3c8af7a
commit 35efdd0f7b
4 changed files with 147 additions and 33 deletions

View file

@ -16,6 +16,7 @@ pub struct ExecBodyParams {
pub bot : BotAR, pub bot : BotAR,
pub msg : PrivmsgMessage, pub msg : PrivmsgMessage,
pub parent_act : ActAR , pub parent_act : ActAR ,
pub current_act : ActAR ,
} }
@ -28,11 +29,11 @@ impl ExecBodyParams {
let act = &(*parent_act_lock); let act = &(*parent_act_lock);
match act { match act {
BotAction::C(c) => { BotAction::C(c) => {
let temp = c.module.clone(); let temp = c.read().await.module.clone();
Some(temp) Some(temp)
}, },
BotAction::L(l) => { BotAction::L(l) => {
let temp = l.module.clone(); let temp = l.read().await.module.clone();
Some(temp) Some(temp)
}, },
_ => None _ => None

View file

@ -335,12 +335,12 @@ impl BotInstance {
let mut confirmed_bot_command = false; let mut confirmed_bot_command = false;
let instr = bot.read().await.get_prefix(); let instr = bot.read().await.get_prefix();
if inpt == String::from(instr) + c.command.as_str() { if inpt == String::from(instr) + c.read().await.command.as_str() {
confirmed_bot_command = true; confirmed_bot_command = true;
} }
// [x] prefix + alias // [x] prefix + alias
for alias in &c.alias { for alias in &c.read().await.alias {
let instr = bot.read().await.get_prefix(); let instr = bot.read().await.get_prefix();
if inpt == String::from(instr) + alias.as_str() { if inpt == String::from(instr) + alias.as_str() {
confirmed_bot_command = true; confirmed_bot_command = true;
@ -362,7 +362,7 @@ impl BotInstance {
// [x] Check first if the Module for that Given Command is Enabled or Disabled on the given Channel // [x] Check first if the Module for that Given Command is Enabled or Disabled on the given Channel
let modmgr = Arc::clone(&botlock.botmodules); let modmgr = Arc::clone(&botlock.botmodules);
let modstatus = modmgr.modstatus( let modstatus = modmgr.modstatus(
c.module.clone(), c.read().await.module.clone(),
Channel(msg.channel_login.to_string())).await; Channel(msg.channel_login.to_string())).await;
@ -405,6 +405,7 @@ impl BotInstance {
bot : Arc::clone(&bot), bot : Arc::clone(&bot),
msg : (*msg).clone(), msg : (*msg).clone(),
parent_act : Arc::clone(&act_clone), parent_act : Arc::clone(&act_clone),
current_act : Arc::clone(&act_clone) ,
}; };
// When sending a BotMsgTypeNotif, send_botmsg does Roles related validation as required // When sending a BotMsgTypeNotif, send_botmsg does Roles related validation as required
@ -428,7 +429,7 @@ impl BotInstance {
let eval = { let eval = {
let mut idlock = id.write().await; let mut idlock = id.write().await;
let (permissability, chngrslt) = idlock let (permissability, chngrslt) = idlock
.can_user_run_prvmsg(msg, c.required_roles.clone()) .can_user_run_prvmsg(msg, c.read().await.required_roles.clone())
.await; .await;
(permissability, chngrslt) (permissability, chngrslt)
@ -462,7 +463,7 @@ impl BotInstance {
bot : Arc::clone(&bot), bot : Arc::clone(&bot),
msg : (*msg).clone(), msg : (*msg).clone(),
parent_act : Arc::clone(&act_clone), parent_act : Arc::clone(&act_clone),
current_act : Arc::clone(&act_clone) ,
}; };
botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif( botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif(
@ -492,7 +493,7 @@ impl BotInstance {
bot : Arc::clone(&bot), bot : Arc::clone(&bot),
msg : (*msg).clone(), msg : (*msg).clone(),
parent_act : Arc::clone(&act_clone), parent_act : Arc::clone(&act_clone),
current_act : Arc::clone(&act_clone) ,
}; };
botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif( botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif(
@ -513,10 +514,11 @@ impl BotInstance {
); );
let a = Arc::clone(&bot); let a = Arc::clone(&bot);
c.execute(ExecBodyParams { c.read().await.execute(ExecBodyParams {
bot : a, bot : a,
msg : msg.clone() , msg : msg.clone() ,
parent_act : Arc::clone(&act_clone), parent_act : Arc::clone(&act_clone),
current_act : Arc::clone(&act_clone) ,
}).await; }).await;
botlog::trace( botlog::trace(
@ -544,7 +546,7 @@ impl BotInstance {
// [x] Check first if the Module for that Given Command is Enabled or Disabled on the given Channel // [x] Check first if the Module for that Given Command is Enabled or Disabled on the given Channel
let modmgr = Arc::clone(&botlock.botmodules); let modmgr = Arc::clone(&botlock.botmodules);
let modstatus = modmgr.modstatus( let modstatus = modmgr.modstatus(
l.module.clone(), l.read().await.module.clone(),
Channel(msg.channel_login.to_string())).await; Channel(msg.channel_login.to_string())).await;
@ -561,10 +563,11 @@ impl BotInstance {
} else { } else {
let a = Arc::clone(&bot); let a = Arc::clone(&bot);
l.execute(ExecBodyParams { l.read().await.execute(ExecBodyParams {
bot : a, bot : a,
msg : msg.clone() , msg : msg.clone() ,
parent_act : Arc::clone(&act_clone), parent_act : Arc::clone(&act_clone),
current_act : Arc::clone(&act_clone) ,
} ).await; } ).await;
} }

View file

@ -25,6 +25,7 @@ const OF_CMD_CHANNEL:Channel = Channel(String::new());
use core::panic; use core::panic;
use std::borrow::Borrow;
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::Arc; use std::sync::Arc;
@ -459,19 +460,64 @@ pub enum StatusType {
Disabled(StatusLvl), Disabled(StatusLvl),
} }
#[derive(Clone)]
pub enum BotAction { pub enum BotAction {
C(BotCommand), // C(BotCommand),
L(Listener), C(Arc<RwLock<BotCommand>>),
R(Routine), L(Arc<RwLock<Listener>>),
R(Arc<RwLock<Routine>>),
} }
impl BotAction { impl BotAction {
pub async fn execute(&self, params : ExecBodyParams) { // pub async fn execute(&self, params : ExecBodyParams) {
match self { pub async fn execute(self, params : ExecBodyParams) {
BotAction::L(a) => a.execute(params).await,
BotAction::C(a) => a.execute(params).await, let act_ar = Arc::new(RwLock::new(self));
_ => (), // let act_lock = act_ar.read().await;
let mut params_adjusted = params.clone();
params_adjusted.current_act = Arc::clone(&act_ar);
if let BotAction::L(a) = &*Arc::clone(&act_ar).read().await {
a.read().await.execute(params_adjusted.clone()).await;
} }
if let BotAction::C(a) = &*Arc::clone(&act_ar).read().await {
let cmd_ar = Arc::clone(a);
cmd_ar.read().await.execute(params_adjusted).await;
// cmd_ar.read().await.execute(params.clone()).await;
// (&*Arc::clone(&cmd_ar).blocking_read()).execute(params.clone()).await;
}
if let BotAction::R(_a) = &*Arc::clone(&act_ar).read().await {
//a.read().await.execute(params.clone()).await;
}
// match &*act_lock {
// BotAction::L(a) => {
// // let inner = Arc::clone(a);
// // inner.read().await.execute(params).await
// },
// BotAction::C(b) => {
// // a.read().await.execute(params).await
// // a.read().await.command.clone();
// b.read().await.execute(params).await;
// },
// _ => (),
// }
// match self {
// BotAction::L(a) => a.execute(params).await,
// BotAction::C(a) => {
// a.read().await.execute(params).await
// },
// _ => (),
// }
} }
} }
@ -493,8 +539,71 @@ pub struct BotCommand {
} }
impl BotCommand { impl BotCommand {
// pub async fn execute(&self, params : ExecBodyParams) {
// pub async fn execute(self, mut params : ExecBodyParams) {
// let self_ar = Arc::new(RwLock::new(self));
// let self_ar1 = Arc::clone(&self_ar);
// let self_lock = self_ar1.read().await;
// let current_act = BotAction::C(self_lock);
// params.current_act = Arc::new(RwLock::new(current_act));
// // (*self.exec_body)(params).await;
// // (*self.exec_body)(params).await;
// (*self_lock.exec_body)(params).await;
// }
// async fn botaction(self) -> BotAction {
// let a =
// BotAction::C(self)
// }
// pub async fn execute(self, params : ExecBodyParams) {
// let a = Arc::new(RwLock::new(self));
// let current_act = BotAction::C(Arc::clone(&a));
// let mut params_clone = params.clone();
// params_clone.current_act = Arc::new(RwLock::new(current_act));
// let alock = a.read().await;
// (*alock.exec_body)(params).await;
// }
// pub async fn execute(&self, params : ExecBodyParams) {
// let a = Arc::new(RwLock::new(*self));
// let current_act = BotAction::C(Arc::clone(&a));
// let mut params_clone = params.clone();
// params_clone.current_act = Arc::new(RwLock::new(current_act));
// let alock = a.read().await;
// (*alock.exec_body)(params).await;
// }
pub async fn execute(&self, params : ExecBodyParams) { pub async fn execute(&self, params : ExecBodyParams) {
(*self.exec_body)(params).await;
// let current_act = BotAction::C(Arc::new(RwLock::new(self)));
// let mut params_clone = params.clone();
// params_clone.current_act = Arc::new(RwLock::new(current_act));
(self.exec_body)(params).await
// let a = Arc::new(RwLock::new(*self));
// let current_act = BotAction::C(Arc::clone(&a));
// let mut params_clone = params.clone();
// params_clone.current_act = Arc::new(RwLock::new(current_act));
// let alock = a.read().await;
// (*alock.exec_body)(params).await;
} }
} }
@ -506,7 +615,7 @@ impl BotActionTrait for BotCommand {
async fn add_to_modmgr(self, modmgr: Arc<ModulesManager>) { async fn add_to_modmgr(self, modmgr: Arc<ModulesManager>) {
modmgr modmgr
.add_botaction(self.module.clone(), BotAction::C(self)) .add_botaction(self.module.clone(), BotAction::C(Arc::new(RwLock::new(self))))
.await .await
} }
@ -516,7 +625,7 @@ impl BotActionTrait for BotCommand {
async fn add_core_to_modmgr(self, modmgr: Arc<ModulesManager>) { async fn add_core_to_modmgr(self, modmgr: Arc<ModulesManager>) {
modmgr modmgr
.add_core_act(self.module.clone(), BotAction::C(self)) .add_core_act(self.module.clone(), BotAction::C(Arc::new(RwLock::new(self))))
.await .await
} }
} }
@ -553,7 +662,7 @@ impl BotActionTrait for Listener {
); );
modmgr modmgr
.add_botaction(self.module.clone(), BotAction::L(self)) .add_botaction(self.module.clone(), BotAction::L(Arc::new(RwLock::new(self))))
.await; .await;
} }
@ -563,7 +672,7 @@ impl BotActionTrait for Listener {
async fn add_core_to_modmgr(self, modmgr: Arc<ModulesManager>) { async fn add_core_to_modmgr(self, modmgr: Arc<ModulesManager>) {
modmgr modmgr
.add_core_act(self.module.clone(), BotAction::L(self)) .add_core_act(self.module.clone(), BotAction::L(Arc::new(RwLock::new(self))))
.await .await
} }
} }
@ -1354,13 +1463,14 @@ impl ModulesManager {
// [x] check if given botcommand c.command:String conflicts with any in botactions // [x] check if given botcommand c.command:String conflicts with any in botactions
if incmd.command.to_lowercase() == dbcmd.command.to_lowercase() { // if incmd.command.to_lowercase() == dbcmd.command.to_lowercase() {
if incmd.read().await.command.to_lowercase() == dbcmd.read().await.command.to_lowercase() {
// Returning State - with the identified module // Returning State - with the identified module
return Some(module.clone()); // works return Some(module.clone()); // works
} }
for a in &dbcmd.alias { for a in &dbcmd.read().await.alias {
if incmd.command.to_lowercase() == a.to_lowercase() { if incmd.read().await.command.to_lowercase() == a.to_lowercase() {
// Returning State - with the identified module // Returning State - with the identified module
return Some(module.clone()); // works return Some(module.clone()); // works
@ -1369,14 +1479,14 @@ impl ModulesManager {
// [x] Then do the same check except for each c.alias // [x] Then do the same check except for each c.alias
for inalias in &incmd.alias { for inalias in &incmd.read().await.alias {
if inalias.to_lowercase() == dbcmd.command.to_lowercase() { if inalias.to_lowercase() == dbcmd.read().await.command.to_lowercase() {
// Returning State - with the identified module // Returning State - with the identified module
return Some(module.clone()); // works return Some(module.clone()); // works
} }
for a in &dbcmd.alias { for a in &dbcmd.read().await.alias {
if inalias.to_lowercase() == a.to_lowercase() { if inalias.to_lowercase() == a.to_lowercase() {
// Returning State - with the identified module // Returning State - with the identified module

View file

@ -39,10 +39,10 @@ pub async fn main() {
let outstr = match &(*act) { let outstr = match &(*act) {
botmodules::BotAction::C(b) => { botmodules::BotAction::C(b) => {
format!("bot actions > Command : {}", b.command) format!("bot actions > Command : {}", b.read().await.command)
} }
botmodules::BotAction::L(l) => { botmodules::BotAction::L(l) => {
format!("bot actions > Listener : {}", l.name) format!("bot actions > Listener : {}", l.read().await.name)
} }
_ => "Not a valid match??".to_string(), _ => "Not a valid match??".to_string(),
}; };