2024.02.12 - Working getuserroles
This commit is contained in:
parent
cc11479bf2
commit
372893af15
3 changed files with 128 additions and 63 deletions
|
@ -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;
|
||||
},
|
||||
|
||||
_ => (),
|
||||
|
|
|
@ -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<Mutex<ModulesManager>>) {
|
||||
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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<ModulesManager>)
|
|||
],
|
||||
};
|
||||
|
||||
tempb.add_to_modmgr(Arc::clone(&mgr));
|
||||
tempb.add_to_modmgr(Arc::clone(&mgr)).await;
|
||||
|
||||
// async fn cmd_promote(mut bot:Arc<Mutex<BotInstance>>,msg:PrivmsgMessage)
|
||||
// async fn cmd_promote(mut bot:&BotInstance,msg:PrivmsgMessage) -> &BotInstance
|
||||
|
@ -148,9 +150,14 @@ pub async fn init(mgr:Arc<ModulesManager>)
|
|||
// 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,11 +224,11 @@ pub async fn init(mgr:Arc<ModulesManager>)
|
|||
}
|
||||
}
|
||||
|
||||
},
|
||||
Some(_) => {
|
||||
// -
|
||||
// },
|
||||
// Some(_) => {
|
||||
// // -
|
||||
|
||||
},
|
||||
// },
|
||||
_ => (),
|
||||
}
|
||||
|
||||
|
@ -318,6 +325,7 @@ pub async fn init(mgr:Arc<ModulesManager>)
|
|||
tempcomm.add_to_modmgr(Arc::clone(&mgr)).await;
|
||||
|
||||
|
||||
|
||||
// async fn getroles(bot:Arc<Mutex<BotInstance>>,msg:PrivmsgMessage) {
|
||||
async fn getroles(bot:BotAR,msg:PrivmsgMessage) {
|
||||
println!("Called cmd getroles");
|
||||
|
@ -393,8 +401,11 @@ pub async fn init(mgr:Arc<ModulesManager>)
|
|||
// 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<String,Vec<UserRole>>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel
|
||||
special_roles_users : Arc<Mutex<HashMap<String,Vec<UserRole>>>>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel
|
||||
// special_roles_users : Arc<Mutex<HashMap<String,Vec<UserRole>>>>, // # <-- (!) This must be String instead of ChType because we're checking a User not a Channel
|
||||
// special_roles_users : Arc<RwLock<HashMap<String,Vec<UserRole>>>>,
|
||||
special_roles_users : Arc<RwLock<HashMap<String,Arc<RwLock<Vec<UserRole>>>>>>,
|
||||
// parent_mgr : Box<crate::core::botinstance::BotManagers>,
|
||||
//parent_mgr : Option<Box<crate::core::botinstance::BotManagers>>,
|
||||
}
|
||||
|
@ -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<UserRole>) -> Result<Permissible,Box<dyn Error>>
|
||||
// pub fn can_user_run_PRVMSG(&self,msg:&PrivmsgMessage,cmdreqroles:Vec<UserRole>) -> Permissible
|
||||
// pub async fn can_user_run_PRVMSG(self,msg:&PrivmsgMessage,cmdreqroles:Vec<UserRole>) -> Permissible
|
||||
pub async fn can_user_run_PRVMSG(&self,msg:&PrivmsgMessage,cmdreqroles:Vec<UserRole>) -> Permissible
|
||||
pub async fn can_user_run_PRVMSG(&mut self,msg:&PrivmsgMessage,cmdreqroles:Vec<UserRole>) -> 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<ChatBadge> = 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<UserRole>
|
||||
// ) -> Result<Permissible,Box<dyn Error>> {
|
||||
) -> 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")
|
||||
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<ChType>) -> Option<Vec<UserRole>> {
|
||||
pub async fn getspecialuserroles(&self,chattername:String,channel:Option<ChType>) -> Option<Arc<RwLock<Vec<UserRole>>>> {
|
||||
/*
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue