demote/promote vip

This commit is contained in:
ModulatingForce 2024-03-25 19:33:24 -04:00
parent 38e7060d86
commit a6628a62a4

View file

@ -101,9 +101,14 @@ pub async fn init(mgr: Arc<ModulesManager>) {
Usage :
promote <user>
promote -m <user>
promote -mod <user>
demote <user>
promote -v <user>
promote -vip <user>
promote -admin <user>
*/
@ -149,7 +154,15 @@ pub async fn init(mgr: Arc<ModulesManager>) {
// [x] 1. Get trgusr (regardless of -admin flag)
let targetusr = if arg1 == Some("-admin") { arg2 } else { arg1 };
// let targetusr = if arg1 == Some("-admin") { arg2 } else { arg1 };
let targetusr = if
arg1 == Some("-admin")
|| arg1 == Some("-v")
|| arg1 == Some("-vip")
|| arg1 == Some("-m")
|| arg1 == Some("-mod")
{ arg2 }
else { arg1 };
// [x] 2. promote trguser
@ -166,13 +179,35 @@ pub async fn init(mgr: Arc<ModulesManager>) {
Some("identity.rs > cmd_promote()".to_string()),
None,
);
Log::flush();
let target_bot_admin_role = if arg1 == Some("-admin") {
Some(UserRole::BotAdmin)
} else {
None
};
// // Believe this is just using this as a Constaint depending on input
// let target_bot_admin_role =
// if arg1 == Some("-admin") {
// Some(UserRole::BotAdmin)
// } else {
// None
// };
let target_role =
if arg1 == Some("-admin") {
Some(UserRole::BotAdmin)
} else if arg1 == Some("-vip") || arg1 == Some("-v") {
Some(UserRole::VIP(Channel(targetchnl.clone())))
} else {
None // [x] Internal promote() logic automatically considers trg_role targetting -mod or -m
};
// let target_bot_admin_role =
// if arg1 == Some("-admin") {
// Some(UserRole::BotAdmin)
// } else if arg1 == Some("-v") {
// Some(UserRole::VIP)
// } else {
// None
// };
idlock
.promote(
@ -180,7 +215,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
&sender_badge,
targetusr.to_string(),
Some(Channel(targetchnl.clone())),
target_bot_admin_role,
target_role,
)
.await
}
@ -279,13 +314,21 @@ pub async fn init(mgr: Arc<ModulesManager>) {
demote <user>
promote -admin <user>
demote -m <user>
demote -mod <user>
demote -v <user>
demote -vip <user>
// promote -admin <user>
*/
// [x] Unwraps arguments from message
let (arg1, _arg2) = {
let (arg1, arg2) = {
let mut argv = params.msg.message_text.split(' ');
argv.next(); // Skip the command name
@ -341,10 +384,29 @@ pub async fn init(mgr: Arc<ModulesManager>) {
let sender_badge = sender_badge_mut;
let targetusr = arg1;
let targetchnl = params.msg.channel_login.to_lowercase();
// let targetusr = arg1;
let targetusr = if
arg1 == Some("-v")
|| arg1 == Some("-vip")
|| arg1 == Some("-m")
|| arg1 == Some("-mod")
{ arg2 }
else { arg1 };
// Note : At the moment, no handling of -admin
let target_role =
if arg1 == Some("-vip") || arg1 == Some("-v") {
Some(UserRole::VIP(Channel(targetchnl.clone())))
} else {
None // [x] Internal promote() logic automatically considers trg_role targetting -mod or -m
};
/*
- [x] 2. Run Demote()
@ -376,6 +438,7 @@ pub async fn init(mgr: Arc<ModulesManager>) {
&sender_badge,
targetusr.to_string(),
Some(Channel(targetchnl.clone())),
target_role,
)
.await
}
@ -800,13 +863,15 @@ impl IdentityManager {
let mut rolechange = ChangeResult::NoChange("".to_string());
match chat_badge {
// [x] If chatBadge::Broadcaster ...
// [x] and cmdreqroles includes UserRole::Broadcaster , Ok(Permissible::Allow)
// [x] and cmdreqroles includes UserRole::Mod("") OR UserRole::SupMod("") , Ok(Permissible::Allow)
// If ChatBadge::Broadcaster is observed,
// Check if cmdreqroles contains Channel Level Roles . Broadcaster should have Permissible::Allow for any of these
Some(ChatBadge::Broadcaster) => {
if cmdreqroles.contains(&UserRole::Broadcaster)
|| cmdreqroles.contains(&UserRole::Mod(OF_CMD_CHANNEL))
|| cmdreqroles.contains(&UserRole::SupMod(OF_CMD_CHANNEL))
|| cmdreqroles.contains(&UserRole::Mod(OF_CMD_CHANNEL))
|| cmdreqroles.contains(&UserRole::SupMod(OF_CMD_CHANNEL))
|| cmdreqroles.contains(&UserRole::VIP(OF_CMD_CHANNEL))
{
// return Ok(Permissible::Allow)
return (
@ -1075,20 +1140,27 @@ impl IdentityManager {
Log::flush();
/*
// [x] => 03.25 - Q. Would there need to be extra handling here for VIP?
[x] 1. Check if Authorizer Mod Badge then Auto Promote to Mod if not Mod
[x] 2. Get Authorizer & Target Chatter Roles with a Given Channel
[x] 3. If the authorizer & Target Chatters are the same, and the Authorizer is not a Admin, return no change
[x] 4a. If Authorizer is BotAdmin & trg_role is Some(BotAdmin) , set Target as BotAdmin and return
[x] 4b. If target is Broadcaster, return NoChange
[ ] 4c. If Authorizer is a SupMod,Broadcaster,BotAdmin , can Promote Target Chatter > Mod
[x] 4b. If Authorizer is a Mod,SupMod,Broadcaster & trg_role is Some(VIP(channel)), can Promote a Target Chatter > VIP
[x] 4c. If target is Broadcaster, return NoChange
[x] 4d. If Authorizer is a SupMod,Broadcaster,BotAdmin , can Promote Target Chatter > Mod
- NOTE : We do not validate trg_role here - app logic requires you to promote 1 to Mod and 1 more to SupMod
[ ] 4d. If Authorizer is a Broadcaster,BotAdmin , can Promote a Target Mod > SupMod
[x] 4e. If Authorizer is a Broadcaster,BotAdmin , can Promote a Target Mod > SupMod
- NOTE : We do not validate trg_role here - app logic requires you to promote 1 to Mod and 1 more to SupMod
*/
// [x] 1. Check if Authorizer Mod Badge then Auto Promote to Mod if not Mod
// [x] 1. Check if Authorizer Mod or VIP Badge then Auto Promote to matching UserRole if not already assigned
let trgchatter = trgchatter.to_lowercase();
@ -1110,10 +1182,23 @@ impl IdentityManager {
.await;
}
// [x] - May want to Auto VIP Authorizer here
Some(ChatBadge::VIP)
if (!authusrroles.contains(&UserRole::VIP(channel.clone()))) =>
{
authusrroles.push(UserRole::VIP(channel.clone()));
self.affirm_chatter_in_db(authorizer.clone()).await;
self.add_role(authorizer.clone(), UserRole::VIP(channel.clone()))
.await;
}
_ => (),
}
}
// [x] 2. Get Authorizer & Target Chatter Roles
let trgusrroles = self
@ -1131,7 +1216,6 @@ impl IdentityManager {
(authusrroles, trgusrroles)
};
// [x] 3. If the authorizer & Target Chatters are the same, and the Authorizer is not a Admin, return no change
if trgchatter == authorizer && !authusrroles.contains(&UserRole::BotAdmin) {
return ChangeResult::NoChange("Can't target yourself".to_string());
@ -1150,20 +1234,47 @@ impl IdentityManager {
}
}
// [x] 4b. If target is Broadcaster, return NoChange
// [x] 4b. If Authorizer is a Mod,SupMod,Broadcaster & trg_role is Some(VIP(channel)), can Promote a Target Chatter > VIP
if let Some(trg_chnl) = channel.clone() {
if ( authusrroles.contains(&UserRole::Mod(trg_chnl.clone()))
|| authusrroles.contains(&UserRole::SupMod(trg_chnl.clone()))
|| authusrroles.contains(&UserRole::Broadcaster)
)
&& trg_role == Some(UserRole::VIP(trg_chnl.clone())) {
if trgusrroles.contains(&UserRole::VIP(trg_chnl.clone())) {
return ChangeResult::NoChange("Already has the role".to_string());
}
else {
self.affirm_chatter_in_db(trgchatter.clone()).await;
self.add_role(trgchatter.clone(), UserRole::VIP(trg_chnl.clone())).await;
return ChangeResult::Success("Promotion Successful".to_string());
}
}
}
// [x] 4c. If target is Broadcaster, return NoChange
if trgusrroles.contains(&UserRole::Broadcaster) {
return ChangeResult::NoChange("Can't target broadcaster".to_string());
}
/*
[ ] 4c. If Authorizer is a SupMod,Broadcaster,BotAdmin , can Promote Target Chatter > Mod
[x] 4d. If Authorizer is a SupMod,Broadcaster,BotAdmin , can Promote Target Chatter > Mod
- NOTE : We do not validate trg_role here - app logic requires you to promote 1 to Mod and 1 more to SupMod
[ ] 4d. If Authorizer is a Broadcaster,BotAdmin , can Promote a Target Mod > SupMod
[x] 4e. If Authorizer is a Broadcaster,BotAdmin , can Promote a Target Mod > SupMod
- NOTE : We do not validate trg_role here - app logic requires you to promote 1 to Mod and 1 more to SupMod
*/
if let Some(trg_chnl) = channel.clone() {
// 1. Checks first if Target User's Roles do not Include Broadcaster,Mod,SupMod for the Channel
if !trgusrroles.contains(&UserRole::Broadcaster)
&& !trgusrroles.contains(&UserRole::Mod(trg_chnl.clone()))
&& !trgusrroles.contains(&UserRole::SupMod(trg_chnl.clone()))
@ -1172,6 +1283,8 @@ impl IdentityManager {
// target's Next Role would be Mod
// Authorizer must be SupMod,Broadcaster,BotAdmin
// > Promote target to Mod
// 2. If Authorizer has Elevated Admin Roles for the Channel (SupMod,Broadcaster,BotAdmin) > set target to MOD
if authusrroles.contains(&UserRole::SupMod(trg_chnl.clone()))
|| authusrroles.contains(&UserRole::Broadcaster)
|| authusrroles.contains(&UserRole::BotAdmin)
@ -1233,6 +1346,8 @@ impl IdentityManager {
}
};
botlog::warn(
"Runtime reached undeveloped code",
Some("identity.rs > promote()".to_string()),
@ -1247,6 +1362,7 @@ impl IdentityManager {
authorizer_badge: &Option<ChatBadge>,
trgchatter: String,
channel: Option<Channel>,
trg_role: Option<UserRole>,
) -> ChangeResult {
botlog::trace(&format!("IN VARS for demote() : Authorizer : {:?} ; Target Chatter : {} ; Target Channel : {:?}",
authorizer,trgchatter,channel), Some("identity.rs > demote()".to_string()), None);
@ -1260,7 +1376,7 @@ impl IdentityManager {
Use the roles of the above to determine whether the authorizer can demote the target user or not
*/
// [x] 1. If Authorizer's Badge is Mod, ensuring Sender is in DB as Mod(Channel)
// [x] 1. If Authorizer's Badge is Mod/VIP, ensuring Sender is in DB as Mod(Channel)
let trgchatter = trgchatter.to_lowercase();
@ -1283,6 +1399,17 @@ impl IdentityManager {
self.add_role(authorizer.clone(), UserRole::Mod(channel.clone()))
.await;
}
// [x] - May want to Auto VIP Authorizer here
Some(ChatBadge::VIP)
if (!authusrroles.contains(&UserRole::VIP(channel.clone()))) =>
{
authusrroles.push(UserRole::VIP(channel.clone()));
self.affirm_chatter_in_db(authorizer.clone()).await;
self.add_role(authorizer.clone(), UserRole::VIP(channel.clone()))
.await;
}
_ => (),
}
}
@ -1298,7 +1425,30 @@ impl IdentityManager {
return ChangeResult::NoChange("Can't target yourself".to_string());
}
// [x] 4a. Authorizers who are BotAdmin, Broadcaster or Supermod can demote a Mod
// [x] 4. If Authorizer is a Mod,SupMod,Broadcaster & trg_role is Some(VIP(channel)), can Promote a Target Chatter > VIP
if ( authusrroles.contains(&UserRole::Mod(channel.clone()))
|| authusrroles.contains(&UserRole::SupMod(channel.clone()))
|| authusrroles.contains(&UserRole::Broadcaster)
)
&& trg_role == Some(UserRole::VIP(channel.clone())) {
if trgusrroles.contains(&UserRole::VIP(channel.clone())) {
return ChangeResult::NoChange("Already has the role".to_string());
}
else {
self.affirm_chatter_in_db(trgchatter.clone()).await;
self.add_role(trgchatter.clone(), UserRole::VIP(channel.clone())).await;
return ChangeResult::Success("Promotion Successful".to_string());
}
}
// [x] 5. - Mod/SupMod Logic
// [x] 5a. Authorizers who are BotAdmin, Broadcaster or Supermod can demote a Mod
if (authusrroles.contains(&UserRole::BotAdmin)
|| authusrroles.contains(&UserRole::Broadcaster)
@ -1309,7 +1459,7 @@ impl IdentityManager {
.await;
return ChangeResult::Success("Demoted successfully".to_string());
}
// [x] 4b. Authorizers who are BotAdmin, Broadcaster can demote a SupMod
// [x] 5b. Authorizers who are BotAdmin, Broadcaster can demote a SupMod
else if (authusrroles.contains(&UserRole::BotAdmin)
|| authusrroles.contains(&UserRole::Broadcaster))
&& trgusrroles.contains(&UserRole::SupMod(channel.clone()))
@ -1320,7 +1470,7 @@ impl IdentityManager {
.await;
return ChangeResult::Success("Demoted successfully".to_string());
}
// [x] 4c. When Target chatter isnt a Mod or SupMod to demote
// [x] 5c. When Target chatter isnt a Mod or SupMod to demote
else if !trgusrroles.contains(&UserRole::Mod(channel.clone()))
&& !trgusrroles.contains(&UserRole::SupMod(channel.clone()))
{
@ -1328,7 +1478,7 @@ impl IdentityManager {
"Target chatter does not have a role that can be demoted".to_string(),
);
}
// [x] 4d. When they're only a Mod
// [x] 5d. When they're only a Mod
else if authusrroles.contains(&UserRole::Mod(channel.clone())) {
return ChangeResult::Failed("You're not permitted to do that".to_string());
}
@ -1833,6 +1983,7 @@ mod core_identity {
let authorizer = regmod.clone();
let authorizer_badge = &None;
let trgchatter = supmod.clone();
let trg_role = None;
let rslt = test_id_mgr
.demote(
@ -1840,6 +1991,7 @@ mod core_identity {
authorizer_badge,
trgchatter.clone(),
channel.clone(),
trg_role.clone(),
)
.await;
@ -1860,6 +2012,7 @@ mod core_identity {
authorizer_badge,
trgchatter.clone(),
channel.clone(),
trg_role.clone(),
)
.await;
@ -1874,6 +2027,7 @@ mod core_identity {
authorizer_badge,
trgchatter.clone(),
channel.clone(),
trg_role.clone(),
)
.await;