diff --git a/src/core/botinstance.rs b/src/core/botinstance.rs index 03b68a4..bb1ec78 100644 --- a/src/core/botinstance.rs +++ b/src/core/botinstance.rs @@ -776,7 +776,7 @@ impl BotInstance } if confirmed_bot_command { - + println!("Confirmed bot command"); // self.identity.clone().can_user_run_PRVMSG(&msg, c.required_roles.clone()); // [ ] Around here, validate if permissable before executing @@ -819,7 +819,7 @@ impl BotInstance // match a.lock().await.can_user_run_PRVMSG(&msg, c.required_roles.clone()).await { - { + // let le = boxed_bot.lock().await; // // let le = le.lock().await; // let le = le.get_identity().await; @@ -836,10 +836,19 @@ impl BotInstance // let id = Arc::clone(&self.botmgrs.identity); // let id = id.write().await; // let id = &(*self.get_identity()); + println!("Going for botlock"); let botlock = bot.read().await; + println!("Going for identity"); let id = botlock.get_identity(); - let id = id.read().await; - let eval= id.can_user_run_PRVMSG(&msg, c.required_roles.clone()).await; + // let mut id = id.write().await; + // println!("Unlocking identity"); + // let eval= id.can_user_run_PRVMSG(&msg, c.required_roles.clone()).await; + let eval = { + let mut id = id.write().await; + println!("Unlocking identity"); + id.can_user_run_PRVMSG(&msg, c.required_roles.clone()).await + }; + println!("Checking if permissible"); match eval { // Ok(Permissible::Allow) => (), Permissible::Allow => { @@ -857,7 +866,8 @@ impl BotInstance // let a = Arc::clone(&self); let a = Arc::clone(&bot); // let a = Arc::clone(&bot); - c.execute(a, msg.clone()); + c.execute(a, msg.clone()).await; + println!("exit out of execution"); } Permissible::Block => { @@ -867,7 +877,7 @@ impl BotInstance }; // c.execute(self.chat.clone(), msg.clone()).await; - } + } }, @@ -881,7 +891,7 @@ impl BotInstance // l.execute(boxed_bot.clone(), msg.clone()).await; // let a = Arc::clone(&self); let a = Arc::clone(&bot); - l.execute(a, msg.clone()); + l.execute(a, msg.clone()).await; }, _ => (), diff --git a/src/core/botmodules.rs b/src/core/botmodules.rs index 3d55f3c..a46b479 100644 --- a/src/core/botmodules.rs +++ b/src/core/botmodules.rs @@ -89,12 +89,12 @@ pub enum BotAction impl BotAction { // pub async fn execute(&self,m:botinstance::BotManagers,n:PrivmsgMessage){ - pub fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () + pub async fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () { match self { - BotAction::L(a) => a.execute(m,n), - BotAction::C(a) => a.execute(m,n), + BotAction::L(a) => a.execute(m,n).await, + BotAction::C(a) => a.execute(m,n).await, _ => (), } @@ -129,12 +129,12 @@ impl BotCommand // } // pub fn execute(&self,m:&mut BotInstance,n:PrivmsgMessage) -> () { // pub fn execute(&self,m:actions_util::BotAR,n:PrivmsgMessage) -> () { - pub fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () { + pub async fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () { // ((*self).exec_body)(m,n); // ((*self).exec_body)(*m,n); // m // ((*self).exec_body)( - ((*self).exec_body)(m,n); + ((*self).exec_body)(m,n).await; // m } } @@ -147,7 +147,7 @@ impl BotActionTrait for BotCommand // let mut mgr = *mgr.lock().await; // let mut mgr = &mut mgr; // (*self).add_to_modmgr(bot.botmodules); - self.add_to_modmgr(bot.botmodules); + self.add_to_modmgr(bot.botmodules).await; } // async fn add_to_modmgr(self, modmgr:Arc>) { @@ -261,9 +261,9 @@ impl Listener // } // pub fn execute(&self,m:&BotInstance,n:PrivmsgMessage) -> &BotInstance { // pub fn execute(&self,m:actions_util::BotAR,n:PrivmsgMessage) -> () { - pub fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () { + pub async fn execute(&self,m:BotAR,n:PrivmsgMessage) -> () { // let mut m = Arc::*m; - ((*self).exec_body)(m,n); + ((*self).exec_body)(m,n).await; // *self // &m } diff --git a/src/core/identity.rs b/src/core/identity.rs index 70d9508..8bc3ce6 100644 --- a/src/core/identity.rs +++ b/src/core/identity.rs @@ -18,7 +18,9 @@ use crate::core::botinstance::ArcBox; use std::rc::Rc; use std::cell::RefCell; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc}; +use tokio::sync::RwLock; + use super::botmodules::bot_actions::actions_util::BotAR; @@ -50,7 +52,7 @@ pub async fn init(mgr:Arc) ], }; - tempb.add_to_modmgr(Arc::clone(&mgr)); + tempb.add_to_modmgr(Arc::clone(&mgr)).await; // async fn cmd_promote(mut bot:Arc>,msg:PrivmsgMessage) // async fn cmd_promote(mut bot:&BotInstance,msg:PrivmsgMessage) -> &BotInstance @@ -148,9 +150,14 @@ pub async fn init(mgr:Arc) // let mut p = p.lock().await; // let ta = p.getspecialuserroles(String::from("Hello"), Some(ChType::Channel(msg.channel_login.to_lowercase()))).await; let botlock = bot.read().await; - let ta = botlock.get_identity().read().await.getspecialuserroles(String::from("Hello"), Some(ChType::Channel(msg.channel_login.to_lowercase()))).await; - - if let Some(a) = ta { + let ta = botlock.get_identity(); + let ta = ta.read().await; + let ta = ta.getspecialuserroles(String::from("Hello"), Some(ChType::Channel(msg.channel_login.to_lowercase()))).await; + let ta = ta.unwrap(); + let a = ta.read().await; + // let ta = *ta; + // let ta = *ta; + // if let Some(a) = *ta { if a.contains(&UserRole::BotAdmin) { println!("BotAdmin allowed to promote admin"); @@ -217,12 +224,12 @@ pub async fn init(mgr:Arc) } } - }, - Some(_) => { - // - + // }, + // Some(_) => { + // // - - }, - _ => (), + // }, + _ => (), } @@ -318,6 +325,7 @@ pub async fn init(mgr:Arc) tempcomm.add_to_modmgr(Arc::clone(&mgr)).await; + // async fn getroles(bot:Arc>,msg:PrivmsgMessage) { async fn getroles(bot:BotAR,msg:PrivmsgMessage) { println!("Called cmd getroles"); @@ -393,8 +401,11 @@ pub async fn init(mgr:Arc) // let a = a.lock().await; // let a = bot.get_identity(); let botlock = bot.read().await; + println!("botlock read"); let idlock = botlock.get_identity(); - let idlock = idlock.read().await; + println!("got identity"); + let idlock = idlock.read().await; // <-- 02.12 - Latest where it gest stuck - before or at this point + println!("id lock"); let sproles = match targetchnl { None => { // let bot = Rc::clone(&bot); @@ -465,7 +476,9 @@ pub enum Permissible { #[derive(Clone)] pub struct IdentityManager { // special_roles_users : HashMap>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel - special_roles_users : Arc>>>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel + // special_roles_users : Arc>>>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel + // special_roles_users : Arc>>>, + special_roles_users : Arc>>>>>, // parent_mgr : Box, //parent_mgr : Option>, } @@ -488,11 +501,11 @@ impl IdentityManager { pub fn init() -> IdentityManager { let mut a = HashMap::new(); for admn in adminvector() { - a.insert(admn.to_lowercase(),vec![UserRole::BotAdmin]); + a.insert(admn.to_lowercase(),Arc::new(RwLock::new(vec![UserRole::BotAdmin]))); }; IdentityManager { - special_roles_users : Arc::new(Mutex::new(a)), + special_roles_users : Arc::new(RwLock::new(a)), //parent_mgr : None, } } @@ -502,11 +515,12 @@ impl IdentityManager { // pub fn can_user_run_PRVMSG(self,msg:&PrivmsgMessage,cmdreqroles:Vec) -> Result> // pub fn can_user_run_PRVMSG(&self,msg:&PrivmsgMessage,cmdreqroles:Vec) -> Permissible // pub async fn can_user_run_PRVMSG(self,msg:&PrivmsgMessage,cmdreqroles:Vec) -> Permissible - pub async fn can_user_run_PRVMSG(&self,msg:&PrivmsgMessage,cmdreqroles:Vec) -> Permissible + pub async fn can_user_run_PRVMSG(&mut self,msg:&PrivmsgMessage,cmdreqroles:Vec) -> Permissible { // println!("(#{}) {}: {}", msg.channel_login, msg.sender.name, msg.message_text); // [ ] Check what Badges in PrivmsgMessage + println!{"Checking within PRVMSG"}; let mut sender_badge:Option = None; @@ -544,11 +558,11 @@ impl IdentityManager { // cmdreqroles // ) ; // return a; - self.can_user_run(msg.sender.name.to_owned(), + return self.can_user_run(msg.sender.name.to_owned(), ChType::Channel(msg.channel_login.to_owned()), sender_badge, cmdreqroles - ).await ; + ).await } @@ -559,13 +573,14 @@ impl IdentityManager { } - pub async fn can_user_run(&self, + pub async fn can_user_run(&mut self, usr:String, channelname:ChType, chat_badge:ChatBadge, cmdreqroles:Vec // ) -> Result> { ) -> Permissible { + println!{"Checking within can_user_run()"}; /* canUserRun - @@ -604,6 +619,8 @@ impl IdentityManager { // [x] If cmdreqroles is empty vector , automatically assume Ok(Permissible::Allow) + // let idar = Arc::new(RwLock::new(self)); + if cmdreqroles.len() == 0 { // return Ok(Permissible::Allow) return Permissible::Allow @@ -632,7 +649,7 @@ impl IdentityManager { ChatBadge::Mod => { - // println!("Mod Chatbadge detected"); + println!("Mod Chatbadge detected"); // println!("debug special roles : {:?}",self.special_roles_users); // println!("debug usr : {}",&usr.to_lowercase()); @@ -640,27 +657,39 @@ impl IdentityManager { // let Some((k,v)) = self.special_roles_users.get_key_value(usr); // match self.special_roles_users.get_mut(&usr.to_lowercase()) { // match self.special_roles_users.get(&usr.to_lowercase()) { - match self.special_roles_users.lock().await.get(&usr.to_lowercase()) { - Some(usrroles) => { - // println!("contains mod : {}", usrroles.contains(&UserRole::Mod(channelname.clone()))); - // println!("contains supmod : {}", usrroles.contains(&UserRole::SupMod(channelname.clone()))); - if usrroles.contains(&UserRole::Mod(channelname.clone())) || - usrroles.contains(&UserRole::SupMod(channelname.clone())) { + println!("Creating clone"); + let roleslock = Arc::clone(&(*self).special_roles_users); + println!("Read lock on : Special_Roles_User"); // <-- after this is slightly different between working and problem + let mut roleslock = roleslock.write().await; + match (*roleslock).get(&usr.to_lowercase()) { + Some(usrroles) => { // <-- working got to this point + println!("contains mod : {}", usrroles.read().await.contains(&UserRole::Mod(channelname.clone()))); + println!("contains supmod : {}", usrroles.read().await.contains(&UserRole::SupMod(channelname.clone()))); + if usrroles.read().await.contains(&UserRole::Mod(channelname.clone())) || + usrroles.read().await.contains(&UserRole::SupMod(channelname.clone())) { // Do nothing - this is expected + println!("Already a mod in roles"); } else { // in this case, they have a ChatBadge::Mod but should have this for the channel // let mut a = usrroles; // usrroles.push(UserRole::Mod(channelname.clone())); // a.push(UserRole::Mod(channelname.clone())); - self.special_roles_users - .lock().await - .get_mut(&usr.to_lowercase()) - .expect("ERROR") - .push(UserRole::Mod(channelname.clone())); + println!("Was in the else loop"); + + // let a = &*self; + // let mut lock = a.special_roles_users.write().await; + println!("lock created > adding with a mod role o7"); + roleslock.get_mut(&usr.to_lowercase()) + // .expect("ERROR") + .unwrap() + .write().await + // .get_mut() + .push(UserRole::Mod(channelname.clone())); // println!("debug special roles : {:?}",self.special_roles_users); + } }, - _ => () + _ => ( ) // <-- I'm assuming problem got to here } }, @@ -680,9 +709,11 @@ impl IdentityManager { println!("Mod Role required"); - if let Some(a) = self.special_roles_users.lock().await.get(&usr.to_lowercase()) { - if a.contains(&UserRole::Mod(channelname.clone())) || a.contains(&UserRole::SupMod(channelname.clone())){ + if let Some(a) = (&*self).special_roles_users.read().await.get(&usr.to_lowercase()) { + println!("Special roles found for user"); + if a.read().await.contains(&UserRole::Mod(channelname.clone())) || a.read().await.contains(&UserRole::SupMod(channelname.clone())){ // return Ok(Permissible::Allow); + println!("Special roles found for user : A mod idenfified "); return Permissible::Allow } } @@ -693,8 +724,8 @@ impl IdentityManager { if cmdreqroles.contains(&UserRole::SupMod(ChType::Channel(String::new()))) { - if let Some(a) = self.special_roles_users.lock().await.get(&usr.to_lowercase()) { - if a.contains(&UserRole::SupMod(channelname.clone())) { + if let Some(a) = (&*self).special_roles_users.read().await.get(&usr.to_lowercase()) { + if a.read().await.contains(&UserRole::SupMod(channelname.clone())) { // return Ok(Permissible::Allow); return Permissible::Allow } @@ -707,10 +738,10 @@ impl IdentityManager { println!("Eval cmdreqroles with botadmin : {}",cmdreqroles.contains(&UserRole::BotAdmin)); if cmdreqroles.contains(&UserRole::BotAdmin) { - println!("special roles get : {:?}",self.special_roles_users.lock().await.get(&usr.to_lowercase())); - if let Some(a) = self.special_roles_users.lock().await.get(&usr.to_lowercase()) { - println!("special roles contains BotAdmin: {}",a.contains(&UserRole::BotAdmin)); - if a.contains(&UserRole::BotAdmin) { + println!("special roles get : {:?}",(&*self).special_roles_users.read().await.get(&usr.to_lowercase())); + if let Some(a) = (&*self).special_roles_users.read().await.get(&usr.to_lowercase()) { + println!("special roles contains BotAdmin: {}",a.read().await.contains(&UserRole::BotAdmin)); + if a.read().await.contains(&UserRole::BotAdmin) { // return Ok(Permissible::Allow); return Permissible::Allow } @@ -737,7 +768,7 @@ impl IdentityManager { let chatterroles = self.getspecialuserroles(trgchatter.clone(), channel.clone()).await; // let chatterroles = chatterroles.lock().await; // let chatterroles = *chatterroles; - let chatterroles = chatterroles.unwrap(); + // let chatterroles = chatterroles.unwrap(); // let emptyvec = vec![]; @@ -747,19 +778,26 @@ impl IdentityManager { // _ => &(emptyvec), // }; + let chatterroles = chatterroles.unwrap(); + let chatterroles = chatterroles.read().await; + let rolemap = &(*chatterroles); + + match trg_role { Some(UserRole::Mod(a)) => { if let Some(trg_chnl) = channel { - if chatterroles.contains(&UserRole::Mod(trg_chnl.clone())) { + // let rolemap = rolemap.unwrap(); + if rolemap.contains(&UserRole::Mod(trg_chnl.clone())) { return ChangeResult::NoChange(String::from("Target User already has Target Role")); } // # otherwise, trg_role for the given chnl is not assigned to the trgchatter // chatterroles.push(UserRole::Mod(trg_chnl.clone())); self.special_roles_users - .lock().await + .write().await .get_mut(&trgchatter) .expect("Error getting roles") + .write().await .push(UserRole::Mod(trg_chnl)); return ChangeResult::Success(String::from("Promotion Successful")); @@ -845,7 +883,10 @@ impl IdentityManager { ChangeResult::Success(String::from("TEST > Promotion Successful")) } - pub async fn getspecialuserroles(&self,chattername:String,channel:Option) -> Option> { + pub async fn getspecialuserroles(&self,chattername:String,channel:Option) -> Option>>> { + /* + Note : Ideally this be called for a given chatter name ? + */ // let a = chattername.to_lowercase(); @@ -863,7 +904,7 @@ impl IdentityManager { // println!("> Roles : {:?}",v); // } - let a = chattername.to_lowercase(); + let chattername = chattername.to_lowercase(); // println!("{a}"); @@ -873,12 +914,26 @@ impl IdentityManager { // Some(b) => Some(*b), // None => None, // } + // println!("Write Lock on Special Roles @ Getspecialuserroles()"); + // let b = self.special_roles_users.write().await.remove(&a); + // let outp = b; + // // let b = Arc::new(Mutex::new(outp)); + // outp - let b = self.special_roles_users.lock().await.remove(&a); - let outp = b; - // let b = Arc::new(Mutex::new(outp)); - outp + let rolesa = Arc::clone(&self.special_roles_users); + let a = rolesa.read().await; + // let a = Arc::clone(a) + let a = a; + let outr = &(*a); + let outr = outr.get(&chattername); + match outr { + Some(a) => Some(Arc::clone(a)), + None => None, + + } + + // Arc::new(RwLock::new(outr)) // let b = Arc::new(Mutex::new(b)); // b