use std::error::Error;
use twilight_gateway::Event;
use twilight_model::gateway::presence::UserOrId;
use crate::utils::DynFuture;
use crate::wrappers::types::users::User;
pub type CacheError = Box<dyn Error + Send + Sync>;
pub trait Cache: Send + Sync {
fn set_user(&self, user: User) -> DynFuture<'_, Result<(), CacheError>>;
fn get_user_by_id(&self, user_id: u64) -> DynFuture<'_, Result<Option<User>, CacheError>>;
fn get_user_by_name(
&self,
user_name: String,
) -> DynFuture<'_, Result<Option<User>, CacheError>>;
}
pub(crate) async fn process_event(event: Event, cache: &dyn Cache) -> Result<(), CacheError> {
match event {
Event::AutoModerationActionExecution(_) => {}
Event::AutoModerationRuleCreate(_) => {}
Event::AutoModerationRuleDelete(_) => {}
Event::AutoModerationRuleUpdate(_) => {}
Event::BanAdd(event) => {
cache.set_user(event.user.into()).await?;
}
Event::BanRemove(event) => {
cache.set_user(event.user.into()).await?;
}
Event::ChannelCreate(_) => {}
Event::ChannelDelete(_) => {}
Event::ChannelPinsUpdate(_) => {}
Event::ChannelUpdate(_) => {}
Event::CommandPermissionsUpdate(_) => {}
Event::EntitlementCreate(_) => {}
Event::EntitlementDelete(_) => {}
Event::EntitlementUpdate(_) => {}
Event::GatewayClose(_) => {}
Event::GatewayHeartbeat => {}
Event::GatewayHeartbeatAck => {}
Event::GatewayHello(_) => {}
Event::GatewayInvalidateSession(_) => {}
Event::GatewayReconnect => {}
Event::GuildAuditLogEntryCreate(_) => {}
Event::GuildCreate(_) => {}
Event::GuildDelete(_) => {}
Event::GuildEmojisUpdate(_) => {}
Event::GuildIntegrationsUpdate(_) => {}
Event::GuildScheduledEventCreate(event) => {
if let Some(user) = event.creator.clone() {
cache.set_user(user.into()).await?;
}
}
Event::GuildScheduledEventDelete(event) => {
if let Some(user) = event.creator.clone() {
cache.set_user(user.into()).await?;
}
}
Event::GuildScheduledEventUpdate(event) => {
if let Some(user) = event.creator.clone() {
cache.set_user(user.into()).await?;
}
}
Event::GuildScheduledEventUserAdd(_) => {}
Event::GuildScheduledEventUserRemove(_) => {}
Event::GuildStickersUpdate(_) => {}
Event::GuildUpdate(_) => {}
Event::IntegrationCreate(_) => {}
Event::IntegrationDelete(_) => {}
Event::IntegrationUpdate(_) => {}
Event::InteractionCreate(event) => {
if let Some(user) = event.author().cloned() {
cache.set_user(user.into()).await?;
}
}
Event::InviteCreate(event) => {
if let Some(user) = event.inviter {
cache.set_user(user.into()).await?;
}
}
Event::InviteDelete(_) => {}
Event::MemberAdd(event) => {
cache.set_user(event.user.clone().into()).await?;
}
Event::MemberChunk(event) => {
for member in event.members {
cache.set_user(member.user.clone().into()).await?;
}
}
Event::MemberRemove(event) => {
cache.set_user(event.user.clone().into()).await?;
}
Event::MemberUpdate(event) => {
cache.set_user(event.user.clone().into()).await?;
}
Event::MessageCreate(event) => {
cache.set_user(event.author.clone().into()).await?;
}
Event::MessageDelete(_) => {}
Event::MessageDeleteBulk(_) => {}
Event::MessagePollVoteAdd(_) => {}
Event::MessagePollVoteRemove(_) => {}
Event::MessageUpdate(event) => {
cache.set_user(event.author.clone().into()).await?;
}
Event::PresenceUpdate(event) => {
if let UserOrId::User(user) = &event.user {
cache.set_user(user.clone().into()).await?;
}
}
Event::RateLimited(_) => {}
Event::ReactionAdd(_) => {}
Event::ReactionRemove(_) => {}
Event::ReactionRemoveAll(_) => {}
Event::ReactionRemoveEmoji(_) => {}
Event::Ready(event) => {
cache.set_user(event.user.into()).await?;
}
Event::Resumed => {}
Event::RoleCreate(_) => {}
Event::RoleDelete(_) => {}
Event::RoleUpdate(_) => {}
Event::StageInstanceCreate(_) => {}
Event::StageInstanceDelete(_) => {}
Event::StageInstanceUpdate(_) => {}
Event::ThreadCreate(_) => {}
Event::ThreadDelete(_) => {}
Event::ThreadListSync(_) => {}
Event::ThreadMemberUpdate(_) => {}
Event::ThreadMembersUpdate(_) => {}
Event::ThreadUpdate(_) => {}
Event::TypingStart(_) => {}
Event::UnavailableGuild(_) => {}
Event::UserUpdate(event) => {
cache.set_user(event.0.into()).await?;
}
Event::VoiceServerUpdate(_) => {}
Event::VoiceStateUpdate(_) => {}
Event::WebhooksUpdate(_) => {}
}
Ok(())
}