demote/promote vip
This commit is contained in:
parent
38e7060d86
commit
a6628a62a4
1 changed files with 183 additions and 29 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue