blastmud/blastmud_game/src/services.rs

73 lines
2.1 KiB
Rust
Raw Normal View History

use crate::{
2023-01-20 23:08:40 +11:00
DResult,
2023-01-22 22:43:44 +11:00
models::item::Item,
2023-03-13 15:23:07 +11:00
models::consent::{Consent, ConsentType, ConsentStatus},
static_content::npc::npc_by_code,
};
use mockall_double::double;
#[double] use crate::db::DBTrans;
2023-01-20 23:08:40 +11:00
pub mod comms;
2023-01-22 22:43:44 +11:00
pub mod combat;
pub mod skills;
2023-02-03 23:26:24 +11:00
pub mod capacity;
2023-02-25 23:49:46 +11:00
pub mod effect;
2023-03-13 15:23:07 +11:00
fn check_one_consent(consent: &Consent, action: &str, target: &Item) -> bool {
if let Some((loctype, loccode)) = target.location.split_once("/") {
if !consent.only_in.is_empty() {
if loctype != "room" || !consent.only_in.iter().any(|v| v == loccode) {
return false;
}
}
if !consent.allow_private && loctype != "room" {
return false;
}
} else {
if !consent.only_in.is_empty() || !consent.allow_private {
return false;
}
}
if let Some(fight_consent) = consent.fight_consent.as_ref() {
if fight_consent.status == ConsentStatus::PendingAdd {
return false;
}
if !fight_consent.allow_pick && action == "pick" {
return false;
}
}
true
}
pub async fn check_consent(trans: &DBTrans, action: &str,
consent_type: &ConsentType,
by: &Item,
target: &Item) -> DResult<bool> {
// Consent is only a factor on actions by players towards other players or npcs.
if by.item_type != "player" || (target.item_type != "player" && target.item_type != "npc") {
return Ok(true);
}
if target.item_type == "npc" {
return Ok(match npc_by_code().get(target.item_code.as_str()) {
None => false,
Some(npc) => npc.player_consents.contains(consent_type)
});
}
2023-03-13 18:28:03 +11:00
if target.item_code == by.item_code {
return Ok(true)
}
2023-03-13 15:23:07 +11:00
trans.delete_expired_user_consent().await?;
if let Some(consent) = trans.find_user_consent_by_parties_type(
&target.item_code, &by.item_code, consent_type).await? {
if check_one_consent(&consent, action, &target) {
return Ok(true);
}
}
Ok(false)
}