refactor(bonfire): remove quark dependency

This commit is contained in:
Paul Makles
2024-04-08 21:49:19 +01:00
parent 0fc59b8e2a
commit a1eeedabb9
15 changed files with 1105 additions and 28 deletions

View File

@@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};
use revolt_models::v0::{
AppendMessage, Channel, Emoji, FieldsChannel, FieldsMember, FieldsRole, FieldsServer,
FieldsUser, FieldsWebhook, MemberCompositeKey, Message, PartialChannel, PartialMember,
FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message, PartialChannel, PartialMember,
PartialMessage, PartialRole, PartialServer, PartialUser, PartialWebhook, Report, Server, User,
UserSettings, Webhook,
};
@@ -48,17 +48,17 @@ pub enum EventV1 {
/// Successfully authenticated
Authenticated,
/* /// Basic data to cache
/// Basic data to cache
Ready {
users: Vec<User>,
servers: Vec<Server>,
channels: Vec<Channel>,
members: Vec<Member>,
emojis: Option<Vec<Emoji>>,
emojis: Vec<Emoji>,
},
/// Ping response
Pong { data: Ping }, */
Pong { data: Ping },
/// New message
Message(Message),

View File

@@ -1 +1,2 @@
pub mod client;
pub mod server;

View File

@@ -0,0 +1,12 @@
use serde::Deserialize;
use super::client::Ping;
#[derive(Deserialize, Debug)]
#[serde(tag = "type")]
pub enum ClientMessage {
Authenticate { token: String },
BeginTyping { channel: String },
EndTyping { channel: String },
Ping { data: Ping, responded: Option<()> },
}

View File

@@ -122,6 +122,16 @@ auto_derived!(
/// Id of the owner of this bot
pub owner: String,
}
/// Enumeration providing a hint to the type of user we are handling
pub enum UserHint {
/// Could be either a user or a bot
Any,
/// Only match bots
Bot,
/// Only match users
User,
}
);
pub static DISCRIMINATOR_SEARCH_SPACE: Lazy<HashSet<String>> = Lazy::new(|| {
@@ -266,6 +276,30 @@ impl User {
Ok(username)
}
/// Find a user from a given token and hint
#[async_recursion]
pub async fn from_token(db: &Database, token: &str, hint: UserHint) -> Result<User> {
match hint {
UserHint::Bot => {
db.fetch_user(
&db.fetch_bot_by_token(token)
.await
.map_err(|_| create_error!(InternalError))?
.id,
)
.await
}
UserHint::User => db.fetch_user_by_token(token).await,
UserHint::Any => {
if let Ok(user) = User::from_token(db, token, UserHint::User).await {
Ok(user)
} else {
User::from_token(db, token, UserHint::Bot).await
}
}
}
}
/// Helper function to fetch many users as a mutually connected user
/// (while optimising the online ID query)
pub async fn fetch_many_ids_as_mutuals(

View File

@@ -220,6 +220,86 @@ impl From<crate::Channel> for Channel {
}
}
impl From<Channel> for crate::Channel {
fn from(value: Channel) -> crate::Channel {
match value {
Channel::SavedMessages { id, user } => crate::Channel::SavedMessages { id, user },
Channel::DirectMessage {
id,
active,
recipients,
last_message_id,
} => crate::Channel::DirectMessage {
id,
active,
recipients,
last_message_id,
},
Channel::Group {
id,
name,
owner,
description,
recipients,
icon,
last_message_id,
permissions,
nsfw,
} => crate::Channel::Group {
id,
name,
owner,
description,
recipients,
icon: icon.map(|file| file.into()),
last_message_id,
permissions,
nsfw,
},
Channel::TextChannel {
id,
server,
name,
description,
icon,
last_message_id,
default_permissions,
role_permissions,
nsfw,
} => crate::Channel::TextChannel {
id,
server,
name,
description,
icon: icon.map(|file| file.into()),
last_message_id,
default_permissions,
role_permissions,
nsfw,
},
Channel::VoiceChannel {
id,
server,
name,
description,
icon,
default_permissions,
role_permissions,
nsfw,
} => crate::Channel::VoiceChannel {
id,
server,
name,
description,
icon: icon.map(|file| file.into()),
default_permissions,
role_permissions,
nsfw,
},
}
}
}
impl From<crate::PartialChannel> for PartialChannel {
fn from(value: crate::PartialChannel) -> Self {
PartialChannel {
@@ -237,6 +317,23 @@ impl From<crate::PartialChannel> for PartialChannel {
}
}
impl From<PartialChannel> for crate::PartialChannel {
fn from(value: PartialChannel) -> crate::PartialChannel {
crate::PartialChannel {
name: value.name,
owner: value.owner,
description: value.description,
icon: value.icon.map(|file| file.into()),
nsfw: value.nsfw,
active: value.active,
permissions: value.permissions,
role_permissions: value.role_permissions,
default_permissions: value.default_permissions,
last_message_id: value.last_message_id,
}
}
}
impl From<FieldsChannel> for crate::FieldsChannel {
fn from(value: FieldsChannel) -> Self {
match value {
@@ -307,6 +404,25 @@ impl From<crate::File> for File {
}
}
impl From<File> for crate::File {
fn from(value: File) -> crate::File {
crate::File {
id: value.id,
tag: value.tag,
filename: value.filename,
metadata: value.metadata.into(),
content_type: value.content_type,
size: value.size,
deleted: value.deleted,
reported: value.reported,
message_id: value.message_id,
user_id: value.user_id,
server_id: value.server_id,
object_id: value.object_id,
}
}
}
impl From<crate::Metadata> for Metadata {
fn from(value: crate::Metadata) -> Self {
match value {
@@ -325,6 +441,24 @@ impl From<crate::Metadata> for Metadata {
}
}
impl From<Metadata> for crate::Metadata {
fn from(value: Metadata) -> crate::Metadata {
match value {
Metadata::File => crate::Metadata::File,
Metadata::Text => crate::Metadata::Text,
Metadata::Image { width, height } => crate::Metadata::Image {
width: width as isize,
height: height as isize,
},
Metadata::Video { width, height } => crate::Metadata::Video {
width: width as isize,
height: height as isize,
},
Metadata::Audio => crate::Metadata::Audio,
}
}
}
impl From<crate::Message> for Message {
fn from(value: crate::Message) -> Self {
Message {
@@ -480,6 +614,19 @@ impl From<crate::Member> for Member {
}
}
impl From<Member> for crate::Member {
fn from(value: Member) -> crate::Member {
crate::Member {
id: value.id.into(),
joined_at: value.joined_at,
nickname: value.nickname,
avatar: value.avatar.map(|f| f.into()),
roles: value.roles,
timeout: value.timeout,
}
}
}
impl From<crate::PartialMember> for PartialMember {
fn from(value: crate::PartialMember) -> Self {
PartialMember {
@@ -493,6 +640,19 @@ impl From<crate::PartialMember> for PartialMember {
}
}
impl From<PartialMember> for crate::PartialMember {
fn from(value: PartialMember) -> crate::PartialMember {
crate::PartialMember {
id: value.id.map(|id| id.into()),
joined_at: value.joined_at,
nickname: value.nickname,
avatar: value.avatar.map(|f| f.into()),
roles: value.roles,
timeout: value.timeout,
}
}
}
impl From<crate::MemberCompositeKey> for MemberCompositeKey {
fn from(value: crate::MemberCompositeKey) -> Self {
MemberCompositeKey {
@@ -502,6 +662,15 @@ impl From<crate::MemberCompositeKey> for MemberCompositeKey {
}
}
impl From<MemberCompositeKey> for crate::MemberCompositeKey {
fn from(value: MemberCompositeKey) -> crate::MemberCompositeKey {
crate::MemberCompositeKey {
server: value.server,
user: value.user,
}
}
}
impl From<crate::FieldsMember> for FieldsMember {
fn from(value: crate::FieldsMember) -> Self {
match value {
@@ -562,6 +731,34 @@ impl From<crate::Server> for Server {
}
}
impl From<Server> for crate::Server {
fn from(value: Server) -> crate::Server {
crate::Server {
id: value.id,
owner: value.owner,
name: value.name,
description: value.description,
channels: value.channels,
categories: value
.categories
.map(|categories| categories.into_iter().map(|v| v.into()).collect()),
system_messages: value.system_messages.map(|v| v.into()),
roles: value
.roles
.into_iter()
.map(|(k, v)| (k, v.into()))
.collect(),
default_permissions: value.default_permissions,
icon: value.icon.map(|f| f.into()),
banner: value.banner.map(|f| f.into()),
flags: Some(value.flags as i32),
nsfw: value.nsfw,
analytics: value.analytics,
discoverable: value.discoverable,
}
}
}
impl From<crate::PartialServer> for PartialServer {
fn from(value: crate::PartialServer) -> Self {
PartialServer {
@@ -588,6 +785,32 @@ impl From<crate::PartialServer> for PartialServer {
}
}
impl From<PartialServer> for crate::PartialServer {
fn from(value: PartialServer) -> crate::PartialServer {
crate::PartialServer {
id: value.id,
owner: value.owner,
name: value.name,
description: value.description,
channels: value.channels,
categories: value
.categories
.map(|categories| categories.into_iter().map(|v| v.into()).collect()),
system_messages: value.system_messages.map(|v| v.into()),
roles: value
.roles
.map(|roles| roles.into_iter().map(|(k, v)| (k, v.into())).collect()),
default_permissions: value.default_permissions,
icon: value.icon.map(|f| f.into()),
banner: value.banner.map(|f| f.into()),
flags: value.flags.map(|v| v as i32),
nsfw: value.nsfw,
analytics: value.analytics,
discoverable: value.discoverable,
}
}
}
impl From<crate::FieldsServer> for FieldsServer {
fn from(value: crate::FieldsServer) -> Self {
match value {
@@ -666,6 +889,18 @@ impl From<crate::Role> for Role {
}
}
impl From<Role> for crate::Role {
fn from(value: Role) -> crate::Role {
crate::Role {
name: value.name,
permissions: value.permissions,
colour: value.colour,
hoist: value.hoist,
rank: value.rank,
}
}
}
impl From<crate::PartialRole> for PartialRole {
fn from(value: crate::PartialRole) -> Self {
PartialRole {
@@ -678,6 +913,18 @@ impl From<crate::PartialRole> for PartialRole {
}
}
impl From<PartialRole> for crate::PartialRole {
fn from(value: PartialRole) -> crate::PartialRole {
crate::PartialRole {
name: value.name,
permissions: value.permissions,
colour: value.colour,
hoist: value.hoist,
rank: value.rank,
}
}
}
impl From<crate::FieldsRole> for FieldsRole {
fn from(value: crate::FieldsRole) -> Self {
match value {
@@ -871,6 +1118,25 @@ impl crate::User {
}
}
impl From<User> for crate::User {
fn from(value: User) -> crate::User {
crate::User {
id: value.id,
username: value.username,
discriminator: value.discriminator,
display_name: value.display_name,
avatar: value.avatar.map(Into::into),
relations: None,
badges: Some(value.badges as i32),
status: value.status.map(Into::into),
profile: value.profile.map(Into::into),
flags: Some(value.flags as i32),
privileged: value.privileged,
bot: value.bot.map(Into::into),
}
}
}
impl From<crate::PartialUser> for PartialUser {
fn from(value: crate::PartialUser) -> Self {
PartialUser {
@@ -977,6 +1243,15 @@ impl From<crate::UserStatus> for UserStatus {
}
}
impl From<UserStatus> for crate::UserStatus {
fn from(value: UserStatus) -> crate::UserStatus {
crate::UserStatus {
text: value.text,
presence: value.presence.map(|presence| presence.into()),
}
}
}
impl From<crate::UserProfile> for UserProfile {
fn from(value: crate::UserProfile) -> Self {
UserProfile {
@@ -986,6 +1261,15 @@ impl From<crate::UserProfile> for UserProfile {
}
}
impl From<UserProfile> for crate::UserProfile {
fn from(value: UserProfile) -> crate::UserProfile {
crate::UserProfile {
content: value.content,
background: value.background.map(|file| file.into()),
}
}
}
impl From<crate::BotInformation> for BotInformation {
fn from(value: crate::BotInformation) -> Self {
BotInformation {
@@ -993,3 +1277,11 @@ impl From<crate::BotInformation> for BotInformation {
}
}
}
impl From<BotInformation> for crate::BotInformation {
fn from(value: BotInformation) -> crate::BotInformation {
crate::BotInformation {
owner: value.owner_id,
}
}
}