Compare commits

..

41 Commits

Author SHA1 Message Date
kozabrada123 5154d04d4a
Invites (#502)
- Modify Invite entity to work with symfonia
- Adds custom deserialization to InviteFlags
2024-06-05 19:57:26 +02:00
Quat3rnion dfd6b371f3 Merge branch 'dev' into backend 2024-06-05 13:25:44 -04:00
Quat3rnion 0d01536f59 Remove double bound for E 2024-06-05 00:46:29 -04:00
Quat3rnion c34b1da8d0 Add InviteFlags::VIEWED 2024-06-04 23:53:21 -04:00
Quat3rnion 0f1e693d60 Clear warnings 2024-06-04 23:45:22 -04:00
Quat3rnion cab4cb1ce6 Write custom serialize/deserialize impl's for InviteFlags 2024-06-04 23:43:12 -04:00
Quat3rnion 9f281879a9 Update derive for backend/sqlx compatibility. 2024-06-04 22:24:28 -04:00
Quat3rnion 450aa9f440 Update fields for backend/sqlx compatibility. 2024-06-04 22:24:03 -04:00
Quat3rnion 133b03f1c8 Use distinct type `DefaultReaction` 2024-06-04 22:22:39 -04:00
Quat3rnion 6c1493f362 Add sqlx Type, Encode, Decode impl for InviteFlags bitflag object. 2024-06-04 22:21:48 -04:00
Quat3rnion c96dcd5c33 Distinguish InviteType and InviteTargetType 2024-06-04 22:19:48 -04:00
Quat3rnion 0bf5091f3c Fix oversight for premium_since 2024-06-04 13:35:28 -04:00
Quat3rnion cb905d0a83 Expand documentation to explain facade type 2024-06-04 13:34:58 -04:00
Quat3rnion 82c8f570f2 Update Cargo.lock 2024-06-04 13:33:40 -04:00
Quat3rnion 0c9e9cf367 clear warnings 2024-06-04 13:01:51 -04:00
Quat3rnion 32677b8cd9 actually fix linux tests 2024-06-04 13:01:51 -04:00
Quat3rnion 50c5c29cae update dev-dependencies 2024-06-04 13:01:51 -04:00
Quat3rnion 2db91e8538 Fix errors in documentation tests 2024-06-04 13:01:51 -04:00
Quat3rnion fcda4cc2ca Remove final usages of erroneous serde impl 2024-06-04 13:01:51 -04:00
Quat3rnion 119a09ae88 Revert c4452132 2024-06-04 00:38:59 -04:00
Quat3rnion 2b4e9fa149 Remove unused imports 2024-06-04 00:38:49 -04:00
Quat3rnion f178e517d3 Use distinct type for explicit_content_filter 2024-06-04 00:22:52 -04:00
Quat3rnion 2b06742a62 Add feature sqlx locks for user, roles on GuildMember 2024-06-04 00:22:12 -04:00
Quat3rnion 97f10aaa61 Add From<Vec<GuildFeatures>> impl for GuildFeaturesList 2024-06-04 00:21:38 -04:00
Quat3rnion 4d75aa89c9 Remove erroneous serde with attributes 2024-06-03 23:59:21 -04:00
Quat3rnion 40bdafd1a3 Feature lock Shared, so backend feature gets a facade type 2024-06-03 23:56:17 -04:00
Quat3rnion 179b8d228a Use ChannelType enum on ChannelModifySchema 2024-06-03 23:54:17 -04:00
Quat3rnion 7d55bbea4b Use Snowflake in Claims 2024-06-03 23:53:15 -04:00
Quat3rnion 85aa854953 Implement sqlx Encode, Decode, Type for Rights bitflag object. 2024-06-03 22:58:05 -04:00
Quat3rnion 7548f0e592 merge latest dev 2024-06-03 01:55:12 -04:00
Quat3rnion d6ad68c044 remove dep: prefix in backend feature list 2024-06-03 01:42:31 -04:00
Quat3rnion 0bc54ce46f Add sqlx::FromRow derive to GuildMember 2024-06-03 01:41:52 -04:00
Quat3rnion eefdd4aebf Remove serde(with) for message timestamps 2024-06-02 20:17:48 -04:00
Quat3rnion a75701d9c6 Allow last_pin_timestamp to default if field is not in responses. 2024-06-02 20:06:01 -04:00
Quat3rnion 8c5d80d3f1 Allow joined_at to default if field is not in responses. 2024-06-02 19:18:43 -04:00
Quat3rnion 08952db014 Fix tests 2024-06-02 19:02:36 -04:00
Quat3rnion ab4435a79f Update tests to use DateTime's for timestamps 2024-06-02 18:12:52 -04:00
Quat3rnion 7b7294433b Make config register_configuration use Rights bitflag object 2024-06-02 18:11:39 -04:00
Quat3rnion c44521320d Feature lock different types for UserSettings::status 2024-06-02 18:11:07 -04:00
Quat3rnion d1b3a9ad9e Convert timestamp fields to DateTime's 2024-06-02 18:10:09 -04:00
Quat3rnion f876f25a2c Update poem dependency 2024-06-02 18:00:07 -04:00
4 changed files with 90 additions and 13 deletions

View File

@ -177,7 +177,7 @@ pub struct ThreadMember {
pub member: Option<Shared<GuildMember>>, pub member: Option<Shared<GuildMember>>,
} }
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd)]
/// Specifies the emoji to use as the default way to react to a [ChannelType::GuildForum] or [ChannelType::GuildMedia] channel post. /// Specifies the emoji to use as the default way to react to a [ChannelType::GuildForum] or [ChannelType::GuildMedia] channel post.
/// ///
/// # Reference /// # Reference

View File

@ -5,7 +5,7 @@
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::types::{Snowflake, WelcomeScreenObject, Shared}; use crate::types::{Snowflake, WelcomeScreenObject, Shared, InviteFlags, InviteType, InviteTargetType};
use super::guild::GuildScheduledEvent; use super::guild::GuildScheduledEvent;
use super::{Application, Channel, GuildMember, NSFWLevel, User}; use super::{Application, Channel, GuildMember, NSFWLevel, User};
@ -13,25 +13,35 @@ use super::{Application, Channel, GuildMember, NSFWLevel, User};
/// Represents a code that when used, adds a user to a guild or group DM channel, or creates a relationship between two users. /// Represents a code that when used, adds a user to a guild or group DM channel, or creates a relationship between two users.
/// See <https://discord-userdoccers.vercel.app/resources/invite#invite-object> /// See <https://discord-userdoccers.vercel.app/resources/invite#invite-object>
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
pub struct Invite { pub struct Invite {
pub approximate_member_count: Option<i32>, pub approximate_member_count: Option<i32>,
pub approximate_presence_count: Option<i32>, pub approximate_presence_count: Option<i32>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub channel: Option<Channel>, pub channel: Option<Channel>,
pub code: String, pub code: String,
pub created_at: Option<DateTime<Utc>>, pub created_at: Option<DateTime<Utc>>,
pub expires_at: Option<DateTime<Utc>>, pub expires_at: Option<DateTime<Utc>>,
pub flags: Option<i32>, pub flags: Option<InviteFlags>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub guild: Option<InviteGuild>, pub guild: Option<InviteGuild>,
pub guild_id: Option<Snowflake>, pub guild_id: Option<Snowflake>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub guild_scheduled_event: Option<Shared<GuildScheduledEvent>>, pub guild_scheduled_event: Option<Shared<GuildScheduledEvent>>,
#[serde(rename = "type")] #[serde(rename = "type")]
pub invite_type: Option<i32>, #[cfg_attr(feature = "sqlx", sqlx(rename = "type"))]
pub invite_type: Option<InviteType>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub inviter: Option<User>, pub inviter: Option<User>,
pub max_age: Option<i32>, pub max_age: Option<u32>,
pub max_uses: Option<i32>, pub max_uses: Option<u8>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub stage_instance: Option<InviteStageInstance>, pub stage_instance: Option<InviteStageInstance>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub target_application: Option<Application>, pub target_application: Option<Application>,
pub target_type: Option<i32>, #[cfg_attr(feature = "sqlx", sqlx(rename = "target_user_type"))]
pub target_type: Option<InviteTargetType>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub target_user: Option<User>, pub target_user: Option<User>,
pub temporary: Option<bool>, pub temporary: Option<bool>,
pub uses: Option<i32>, pub uses: Option<i32>,

View File

@ -21,6 +21,9 @@ pub enum Error {
#[error(transparent)] #[error(transparent)]
Guild(#[from] GuildError), Guild(#[from] GuildError),
#[error("Invalid flags value: {0}")]
InvalidFlags(u64)
} }
#[derive(Debug, PartialEq, Eq, thiserror::Error)] #[derive(Debug, PartialEq, Eq, thiserror::Error)]

View File

@ -3,10 +3,10 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
use bitflags::bitflags; use bitflags::bitflags;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde::de::Visitor;
use crate::types::ChannelType; use crate::types::{ChannelType, DefaultReaction, Error, entities::PermissionOverwrite, Snowflake};
use crate::types::{entities::PermissionOverwrite, Snowflake};
#[derive(Debug, Deserialize, Serialize, Default, PartialEq, PartialOrd)] #[derive(Debug, Deserialize, Serialize, Default, PartialEq, PartialOrd)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
@ -48,7 +48,7 @@ pub struct ChannelModifySchema {
pub nsfw: Option<bool>, pub nsfw: Option<bool>,
pub rtc_region: Option<String>, pub rtc_region: Option<String>,
pub default_auto_archive_duration: Option<i32>, pub default_auto_archive_duration: Option<i32>,
pub default_reaction_emoji: Option<String>, pub default_reaction_emoji: Option<DefaultReaction>,
pub flags: Option<i32>, pub flags: Option<i32>,
pub default_thread_rate_limit_per_user: Option<i32>, pub default_thread_rate_limit_per_user: Option<i32>,
pub video_quality_mode: Option<i32>, pub video_quality_mode: Option<i32>,
@ -109,7 +109,7 @@ pub struct CreateChannelInviteSchema {
pub temporary: Option<bool>, pub temporary: Option<bool>,
pub unique: Option<bool>, pub unique: Option<bool>,
pub validate: Option<String>, pub validate: Option<String>,
pub target_type: Option<InviteType>, pub target_type: Option<InviteTargetType>,
pub target_user_id: Option<Snowflake>, pub target_user_id: Option<Snowflake>,
pub target_application_id: Option<Snowflake>, pub target_application_id: Option<Snowflake>,
} }
@ -131,15 +131,79 @@ impl Default for CreateChannelInviteSchema {
} }
bitflags! { bitflags! {
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct InviteFlags: u64 { pub struct InviteFlags: u64 {
const GUEST = 1 << 0; const GUEST = 1 << 0;
const VIEWED = 1 << 1;
}
}
impl Serialize for InviteFlags {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.bits().to_string().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for InviteFlags {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
struct FlagsVisitor;
impl<'de> Visitor<'de> for FlagsVisitor
{
type Value = InviteFlags;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a raw u64 value of flags")
}
fn visit_u64<E: serde::de::Error>(self, v: u64) -> Result<Self::Value, E> {
InviteFlags::from_bits(v).ok_or(serde::de::Error::custom(Error::InvalidFlags(v)))
}
}
deserializer.deserialize_u64(FlagsVisitor)
}
}
#[cfg(feature = "sqlx")]
impl sqlx::Type<sqlx::MySql> for InviteFlags {
fn type_info() -> sqlx::mysql::MySqlTypeInfo {
u64::type_info()
}
}
#[cfg(feature = "sqlx")]
impl<'q> sqlx::Encode<'q, sqlx::MySql> for InviteFlags {
fn encode_by_ref(&self, buf: &mut <sqlx::MySql as sqlx::database::HasArguments<'q>>::ArgumentBuffer) -> sqlx::encode::IsNull {
u64::encode_by_ref(&self.0.0, buf)
}
}
#[cfg(feature = "sqlx")]
impl<'r> sqlx::Decode<'r, sqlx::MySql> for InviteFlags {
fn decode(value: <sqlx::MySql as sqlx::database::HasValueRef<'r>>::ValueRef) -> Result<Self, sqlx::error::BoxDynError> {
let raw = u64::decode(value)?;
Ok(Self::from_bits(raw).unwrap())
} }
} }
#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialOrd, Ord, PartialEq, Eq)] #[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialOrd, Ord, PartialEq, Eq)]
#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[repr(u8)]
pub enum InviteType { pub enum InviteType {
#[default]
Guild = 0,
GroupDm = 1,
Friend = 2,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialOrd, Ord, PartialEq, Eq)]
#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[repr(u8)]
pub enum InviteTargetType {
#[default] #[default]
Stream = 1, Stream = 1,
EmbeddedApplication = 2, EmbeddedApplication = 2,