mirror of
https://git.ngram.ca/OpenJam/rc-servers
synced 2026-08-23 23:08:52 +00:00
Add support for leaving a clan if you're the leader; fix #108
This commit is contained in:
@@ -542,11 +542,49 @@ impl super::SocialUser for UserData {
|
|||||||
if let Some((joined_clan, member)) = joined_clan_opt {
|
if let Some((joined_clan, member)) = joined_clan_opt {
|
||||||
let is_leader = matches!(member.rank, oj_rc_database::schema::clan_member::ClanMemberRank::Leader);
|
let is_leader = matches!(member.rank, oj_rc_database::schema::clan_member::ClanMemberRank::Leader);
|
||||||
if is_leader {
|
if is_leader {
|
||||||
log::warn!("User {} tried to leave clan {} that they lead", self.account.id, joined_clan.id);
|
let clan_members = self.db.clan_members_by_clan_id(joined_clan.id).await
|
||||||
return Err(polariton_server::operations::SimpleOpError::with_message(
|
.map_err(|e| {
|
||||||
crate::data::error_codes::SocialErrorCode::NotClanLeader as i16,
|
log::error!("Failed to retrieve clan {} members for {}: {}", joined_clan.id, self.account.id, e);
|
||||||
"Failed to leave clan: you are the leader".to_string(),
|
polariton_server::operations::SimpleOpError::with_message(
|
||||||
));
|
crate::data::error_codes::SocialErrorCode::DatabaseError as i16,
|
||||||
|
format!("Failed to retrieve clan members: {}", e),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let other_member_opt = clan_members.iter()
|
||||||
|
.find(|mem| mem.0.rank == oj_rc_database::schema::clan_member::ClanMemberRank::Officer)
|
||||||
|
.or_else(|| clan_members.iter().find(|mem| mem.1.id != self.account.id));
|
||||||
|
if let Some(other_member) = other_member_opt {
|
||||||
|
log::info!("User {} trying to leave clan {} that they lead, promoting user {} to leader", self.account.id, joined_clan.id, other_member.1.id);
|
||||||
|
let new_other_member = oj_rc_database::schema::clan_member::ActiveModel {
|
||||||
|
id: oj_rc_database::sea_orm::ActiveValue::Set(other_member.0.id),
|
||||||
|
rank: oj_rc_database::sea_orm::ActiveValue::Set(oj_rc_database::schema::clan_member::ClanMemberRank::Leader),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
self.db.update_clan_member(new_other_member).await
|
||||||
|
.map_err(|e| {
|
||||||
|
log::error!("Failed to promote clan {} member {} to leader for user {}: {}", joined_clan.id, other_member.1.id, self.account.id, e);
|
||||||
|
polariton_server::operations::SimpleOpError::with_message(
|
||||||
|
crate::data::error_codes::SocialErrorCode::DatabaseError as i16,
|
||||||
|
format!("Failed to retrieve update clan member for user: {}", e),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
} else {
|
||||||
|
log::info!("User {} trying to leave clan {} that they lead, abandoning clan", self.account.id, joined_clan.id);
|
||||||
|
self.db.update_clan(oj_rc_database::schema::clan::ActiveModel {
|
||||||
|
id: oj_rc_database::sea_orm::ActiveValue::Set(joined_clan.id),
|
||||||
|
creation_time: oj_rc_database::sea_orm::ActiveValue::NotSet,
|
||||||
|
name: oj_rc_database::sea_orm::ActiveValue::NotSet,
|
||||||
|
description: oj_rc_database::sea_orm::ActiveValue::NotSet,
|
||||||
|
variant: oj_rc_database::sea_orm::ActiveValue::Set(oj_rc_database::schema::clan::ClanType::Abandoned),
|
||||||
|
}).await
|
||||||
|
.map_err(|e| {
|
||||||
|
log::error!("Failed to abandon clan {} for user {}: {}", joined_clan.id, self.account.id, e);
|
||||||
|
polariton_server::operations::SimpleOpError::with_message(
|
||||||
|
crate::data::error_codes::SocialErrorCode::DatabaseError as i16,
|
||||||
|
format!("Failed to retrieve abandon clan for user: {}", e),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let new_model = oj_rc_database::schema::clan_member::ActiveModel {
|
let new_model = oj_rc_database::schema::clan_member::ActiveModel {
|
||||||
id: oj_rc_database::sea_orm::ActiveValue::Set(member.id),
|
id: oj_rc_database::sea_orm::ActiveValue::Set(member.id),
|
||||||
|
|||||||
Reference in New Issue
Block a user