Let people list their current consents.
This commit is contained in:
parent
a9693803ef
commit
ff5e80398a
@ -744,6 +744,24 @@ impl DBTrans {
|
|||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn list_consents(&self, consenting: &str) -> DResult<Vec<(String, ConsentType, Consent)>> {
|
||||||
|
Ok(self.pg_trans()?
|
||||||
|
.query("SELECT consented_user, consent_type, details \
|
||||||
|
FROM user_consent \
|
||||||
|
WHERE consenting_user = $1",
|
||||||
|
&[&consenting.to_lowercase()])
|
||||||
|
.await?
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|row|
|
||||||
|
match serde_json::from_value(row.get(2)) {
|
||||||
|
Err(_) => None,
|
||||||
|
Ok(consent) =>
|
||||||
|
ConsentType::from_str(row.get(1)).map(
|
||||||
|
|consent_type| (row.get(0), consent_type, consent))
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn find_user_consent_by_parties_type(&self, consenting: &str, consented: &str,
|
pub async fn find_user_consent_by_parties_type(&self, consenting: &str, consented: &str,
|
||||||
consent_type: &ConsentType) -> DResult<Option<Consent>> {
|
consent_type: &ConsentType) -> DResult<Option<Consent>> {
|
||||||
match self.pg_trans()?.query_opt(
|
match self.pg_trans()?.query_opt(
|
||||||
|
@ -811,6 +811,24 @@ async fn handle_corp_consent(ctx: &mut VerbContext<'_>, source_player: &Item,
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn handle_list_allows(ctx: &mut VerbContext<'_>, item: &Item) -> UResult<()> {
|
||||||
|
let consents = ctx.trans.list_consents(&item.item_code).await?;
|
||||||
|
let mut msg = String::new();
|
||||||
|
if consents.is_empty() {
|
||||||
|
msg.push_str(ansi!("You have no consents. Type <bold>help allow<reset> to learn how to consent."));
|
||||||
|
} else {
|
||||||
|
msg.push_str(ansi!("You are consenting to the following actions (type <bold>help allow<reset> to learn how to change):\n"));
|
||||||
|
msg.push_str(&format!(ansi!("<bgblue><white><bold>| {:20} | {:12} | {:40} |<reset>\n"),
|
||||||
|
"User", "Consent type", "Details"));
|
||||||
|
for (user, consent_type, details) in consents {
|
||||||
|
msg.push_str(&format!("| {:20} | {:12} | {:40} |\n",
|
||||||
|
user, consent_type.to_str(), details.to_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.trans.queue_for_session(&ctx.session, Some(&(msg + "\n"))).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Verb;
|
pub struct Verb;
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl UserVerb for Verb {
|
impl UserVerb for Verb {
|
||||||
@ -820,7 +838,7 @@ impl UserVerb for Verb {
|
|||||||
|
|
||||||
let remaining_trim = remaining.trim();
|
let remaining_trim = remaining.trim();
|
||||||
if remaining_trim == "" {
|
if remaining_trim == "" {
|
||||||
// TODO: List all allows
|
handle_list_allows(ctx, &player_item).await?;
|
||||||
} else {
|
} else {
|
||||||
let mut cmd = match parsing::parse_allow(remaining, !ctx.session_dat.less_explicit_mode) {
|
let mut cmd = match parsing::parse_allow(remaining, !ctx.session_dat.less_explicit_mode) {
|
||||||
Err(msg) => user_error(msg)?,
|
Err(msg) => user_error(msg)?,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||||
pub enum ConsentType {
|
pub enum ConsentType {
|
||||||
@ -81,3 +82,51 @@ impl Default for Consent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Consent {
|
||||||
|
pub fn to_str(&self) -> String {
|
||||||
|
let mut details = vec!();
|
||||||
|
if let Some(ref fc) = self.fight_consent {
|
||||||
|
match fc.status {
|
||||||
|
ConsentStatus::PendingAdd => {
|
||||||
|
details.push("pending acceptance".to_owned());
|
||||||
|
},
|
||||||
|
ConsentStatus::PendingDelete => {
|
||||||
|
details.push("pending agreement to delete".to_owned());
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
match fc.pending_change.as_ref() {
|
||||||
|
None => {},
|
||||||
|
Some(new_self) => {
|
||||||
|
details.push(format!("pending amendment to [{}]",
|
||||||
|
&new_self.to_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fc.allow_pick {
|
||||||
|
details.push("allow pick".to_owned());
|
||||||
|
}
|
||||||
|
if fc.freely_revoke {
|
||||||
|
details.push("allow revoke".to_owned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if self.allow_private {
|
||||||
|
details.push("allow private".to_owned());
|
||||||
|
} else {
|
||||||
|
details.push("disallow private".to_owned());
|
||||||
|
}
|
||||||
|
if self.until_death {
|
||||||
|
details.push("until death".to_owned());
|
||||||
|
}
|
||||||
|
for in_place in self.only_in.iter() {
|
||||||
|
details.push(format!("in {}", in_place))
|
||||||
|
}
|
||||||
|
if let Some(exp) = self.expires {
|
||||||
|
details.push(format!("valid for {}",
|
||||||
|
humantime::format_duration(std::time::Duration::from_secs(
|
||||||
|
(exp - Utc::now()).num_seconds() as u64
|
||||||
|
))));
|
||||||
|
}
|
||||||
|
return details.into_iter().join(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user