refactor(quark): port ban_create, ban_list, ban_remove, emoji_list, invites_fetch

#283
This commit is contained in:
Paul Makles
2024-04-07 20:48:36 +01:00
parent b2d3344ddd
commit 03340a2b5a
11 changed files with 250 additions and 189 deletions

View File

@@ -1,4 +1,6 @@
use crate::MemberCompositeKey;
use revolt_result::Result;
use crate::{Database, MemberCompositeKey, Server};
auto_derived!(
/// Server Ban
@@ -10,3 +12,24 @@ auto_derived!(
pub reason: Option<String>,
}
);
impl ServerBan {
/// Create ban
pub async fn create(
db: &Database,
server: &Server,
user_id: &str,
reason: Option<String>,
) -> Result<ServerBan> {
let ban = ServerBan {
id: MemberCompositeKey {
server: server.id.to_string(),
user: user_id.to_string(),
},
reason,
};
db.insert_ban(&ban).await?;
Ok(ban)
}
}

View File

@@ -215,4 +215,47 @@ impl Member {
false
}
}
/// Remove member from server
pub async fn remove(
self,
db: &Database,
server: &Server,
intention: RemovalIntention,
silent: bool,
) -> Result<()> {
db.delete_member(&self.id).await?;
EventV1::ServerMemberLeave {
id: self.id.server.to_string(),
user: self.id.user.to_string(),
}
.p(self.id.server.to_string())
.await;
if !silent {
if let Some(id) = server
.system_messages
.as_ref()
.and_then(|x| match intention {
RemovalIntention::Leave => x.user_left.as_ref(),
RemovalIntention::Kick => x.user_kicked.as_ref(),
RemovalIntention::Ban => x.user_banned.as_ref(),
})
{
match intention {
RemovalIntention::Leave => SystemMessage::UserLeft { id: self.id.user },
RemovalIntention::Kick => SystemMessage::UserKicked { id: self.id.user },
RemovalIntention::Ban => SystemMessage::UserBanned { id: self.id.user },
}
.into_message(id.to_string())
// TODO: support notifications here in the future?
.send_without_notifications(db, false, false)
.await
.ok();
}
}
Ok(())
}
}

View File

@@ -255,71 +255,6 @@ impl Server {
Err(create_error!(NotFound))
}
}
/*
/// Remove a member from a server
pub async fn remove_member(
&self,
db: &Database,
member: Member,
intention: RemovalIntention,
silent: bool,
) -> Result<()> {
db.delete_member(&member.id).await?;
/* // TODO: EventV1::ServerMemberLeave {
id: self.id.to_string(),
user: member.id.user.clone(),
}
.p(member.id.server)
.await; */
if !silent {
if let Some(id) = self.system_messages.as_ref().and_then(|x| match intention {
RemovalIntention::Leave => x.user_left.as_ref(),
RemovalIntention::Kick => x.user_kicked.as_ref(),
RemovalIntention::Ban => x.user_banned.as_ref(),
}) {
match intention {
RemovalIntention::Leave => SystemMessage::UserLeft { id: member.id.user },
RemovalIntention::Kick => SystemMessage::UserKicked { id: member.id.user },
RemovalIntention::Ban => SystemMessage::UserBanned { id: member.id.user },
}
.into_message(id.to_string())
.create_no_web_push(db, id, false)
.await
.ok();
}
}
Ok(())
}
/// Create ban
pub async fn ban_user(
self,
db: &Database,
id: MemberCompositeKey,
reason: Option<String>,
) -> Result<ServerBan> {
let ban = ServerBan { id, reason };
db.insert_ban(&ban).await?;
Ok(ban)
}
/// Ban a member from a server
pub async fn ban_member(
self,
db: &Database,
member: Member,
reason: Option<String>,
) -> Result<ServerBan> {
self.remove_member(db, member.clone(), RemovalIntention::Ban, false)
.await?;
self.ban_user(db, member.id, reason).await
} */
}
impl Role {

View File

@@ -7,7 +7,9 @@ use schemars::{
JsonSchema,
};
use crate::{Bot, Channel, Database, Emoji, Invite, Message, Server, User, Webhook};
use crate::{
Bot, Channel, Database, Emoji, Invite, Member, Message, Server, ServerBan, User, Webhook,
};
/// Reference to some object in the database
#[derive(Serialize, Deserialize)]
@@ -22,6 +24,11 @@ impl Reference {
Reference { id }
}
/// Fetch ban from Ref
pub async fn as_ban(&self, db: &Database, server: &str) -> Result<ServerBan> {
db.fetch_ban(server, &self.id).await
}
/// Fetch bot from Ref
pub async fn as_bot(&self, db: &Database) -> Result<Bot> {
db.fetch_bot(&self.id).await
@@ -57,6 +64,11 @@ impl Reference {
Ok(msg)
}
/// Fetch member from Ref
pub async fn as_member(&self, db: &Database, server: &str) -> Result<Member> {
db.fetch_member(server, &self.id).await
}
/// Fetch server from Ref
pub async fn as_server(&self, db: &Database) -> Result<Server> {
db.fetch_server(&self.id).await