Add consent check on accessing private property.

This commit is contained in:
Condorra 2023-04-23 00:28:15 +10:00
parent ed3d77dcbe
commit 10351fdf18

View File

@ -17,24 +17,29 @@ use crate::{
room::{self, Direction, ExitType},
dynzone::{dynzone_by_type, ExitTarget as DynExitTarget, DynzoneType},
},
models::item::{
Item,
ItemSpecialData,
SkillType,
LocationActionType,
DoorState,
models::{
item::{
Item,
ItemSpecialData,
SkillType,
LocationActionType,
DoorState,
},
consent::ConsentType,
},
services::{
comms::broadcast_to_room,
skills::skill_check_and_grind,
combat::stop_attacking_mut,
combat::handle_resurrect,
check_consent,
}
};
use std::sync::Arc;
use mockall_double::double;
#[double] use crate::db::DBTrans;
use std::time;
use ansi::ansi;
pub async fn announce_move(trans: &DBTrans, character: &Item, leaving: &Item, arriving: &Item) -> DResult<()> {
let msg_leaving_exp = format!("{} departs towards {}\n",
@ -137,6 +142,37 @@ async fn move_to_where(
Ok((format!("room/{}", new_room.code), None))
}
pub async fn check_room_access(trans: &DBTrans, player: &Item, room: &Item) -> UResult<()> {
let (owner_t, owner_c) = match room.owner.as_ref().and_then(|o| o.split_once("/")) {
None => return Ok(()),
Some(v) => v
};
if owner_t == &player.item_type && owner_c == &player.item_code {
return Ok(());
}
let owner = match trans.find_item_by_type_code(owner_t, owner_c).await? {
None => return Ok(()),
Some(v) => v
};
if check_consent(trans, "enter", &ConsentType::Visit, player, &owner).await? {
return Ok(());
}
let mut player_hypothet = (*player).clone();
// We are asking hypothetically if they entered the room, could they fight
// the owner? We won't save this yet.
player_hypothet.location = room.refstr();
if check_consent(trans, "enter", &ConsentType::Fight, &player_hypothet, &owner).await? {
return Ok(());
}
user_error(ansi!("<yellow>Your wristpad buzzes and your muscles lock up, stopping you entering.<reset> \
It seems this is private property and you haven't been invited here with \
<bold>allow visit<reset>, nor do you have a <bold>allow fight<reset> in force with \
the owner here.").to_owned())?
}
pub async fn attempt_move_immediate(
trans: &DBTrans,
orig_mover: &Item,
@ -156,8 +192,10 @@ pub async fn attempt_move_immediate(
match is_door_in_direction(trans, direction, orig_mover).await? {
DoorSituation::NoDoor |
DoorSituation::DoorIntoRoom { state: DoorState { open: true, .. }, .. } |
DoorSituation::DoorOutOfRoom { state: DoorState { open: true, .. }, .. } => {},
DoorSituation::DoorIntoRoom { state: DoorState { open: true, .. }, room_with_door, .. } => {
check_room_access(trans, orig_mover, &room_with_door).await?;
}
_ => {
attempt_open_immediate(trans, player_ctx, orig_mover, direction).await?;
match player_ctx.as_mut() {