add: anonymous questions
This commit is contained in:
parent
2266afde01
commit
3db7f2699c
34 changed files with 473 additions and 98 deletions
|
@ -136,6 +136,9 @@ pub struct UserSettings {
|
|||
/// A header shown in the place of "Ask question" if `enable_questions` is true.
|
||||
#[serde(default)]
|
||||
pub motivational_header: String,
|
||||
/// If questions from anonymous users are allowed. Requires `enable_questions`.
|
||||
#[serde(default)]
|
||||
pub allow_anonymous_questions: bool,
|
||||
}
|
||||
|
||||
impl Default for User {
|
||||
|
@ -192,6 +195,15 @@ impl User {
|
|||
}
|
||||
}
|
||||
|
||||
/// Anonymous user profile.
|
||||
pub fn anonymous() -> Self {
|
||||
Self {
|
||||
username: "anonymous".to_string(),
|
||||
id: 0,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new token
|
||||
///
|
||||
/// # Returns
|
||||
|
@ -356,6 +368,29 @@ impl UserBlock {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct IpBlock {
|
||||
pub id: usize,
|
||||
pub created: usize,
|
||||
pub initiator: usize,
|
||||
pub receiver: String,
|
||||
}
|
||||
|
||||
impl IpBlock {
|
||||
/// Create a new [`IpBlock`].
|
||||
pub fn new(initiator: usize, receiver: String) -> Self {
|
||||
Self {
|
||||
id: AlmostSnowflake::new(1234567890)
|
||||
.to_string()
|
||||
.parse::<usize>()
|
||||
.unwrap(),
|
||||
created: unix_epoch_timestamp() as usize,
|
||||
initiator,
|
||||
receiver,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct IpBan {
|
||||
pub ip: String,
|
||||
|
|
|
@ -307,13 +307,23 @@ pub struct Question {
|
|||
pub likes: isize,
|
||||
#[serde(default)]
|
||||
pub dislikes: isize,
|
||||
// ...
|
||||
#[serde(default)]
|
||||
pub context: QuestionContext,
|
||||
/// The IP of the question creator for IP blocking and identifying anonymous users.
|
||||
#[serde(default)]
|
||||
pub ip: String,
|
||||
}
|
||||
|
||||
impl Question {
|
||||
/// Create a new [`Question`].
|
||||
pub fn new(owner: usize, receiver: usize, content: String, is_global: bool) -> Self {
|
||||
pub fn new(
|
||||
owner: usize,
|
||||
receiver: usize,
|
||||
content: String,
|
||||
is_global: bool,
|
||||
ip: String,
|
||||
) -> Self {
|
||||
Self {
|
||||
id: AlmostSnowflake::new(1234567890)
|
||||
.to_string()
|
||||
|
@ -329,18 +339,15 @@ impl Question {
|
|||
likes: 0,
|
||||
dislikes: 0,
|
||||
context: QuestionContext::default(),
|
||||
ip,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[derive(Default)]
|
||||
pub struct QuestionContext {
|
||||
#[serde(default)]
|
||||
pub is_nsfw: bool,
|
||||
}
|
||||
|
||||
impl Default for QuestionContext {
|
||||
fn default() -> Self {
|
||||
Self { is_nsfw: false }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,8 @@ pub mod permissions;
|
|||
pub mod reactions;
|
||||
pub mod requests;
|
||||
|
||||
use std::fmt::Display;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
|
@ -37,9 +39,9 @@ pub enum Error {
|
|||
Unknown,
|
||||
}
|
||||
|
||||
impl ToString for Error {
|
||||
fn to_string(&self) -> String {
|
||||
match self {
|
||||
impl Display for Error {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.write_str(&match self {
|
||||
Self::MiscError(msg) => msg.to_owned(),
|
||||
Self::DatabaseConnection(msg) => msg.to_owned(),
|
||||
Self::DatabaseError(msg) => format!("Database error: {msg}"),
|
||||
|
@ -55,7 +57,7 @@ impl ToString for Error {
|
|||
Self::TitleInUse => "Title in use".to_string(),
|
||||
Self::QuestionsDisabled => "You are not allowed to ask questions there".to_string(),
|
||||
_ => format!("An unknown error as occurred: ({:?})", self),
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue