Initialize Twilight project, set up basic framework, initialize DB module

This commit is contained in:
2025-08-07 04:32:34 -03:00
parent 00d61545eb
commit 24d2344f37
29 changed files with 4095 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
use std::sync::Arc;
use scc::HashMap;
use twilight_http::Client;
use twilight_model::{
application::interaction::InteractionData, gateway::payload::incoming::InteractionCreate,
oauth::Application,
};
use crate::framework::{handlers::Handlers, interactions::{context::InteractionContext, InteractionError}};
use super::components::Component;
pub struct Registry {
inner: HashMap<String, Arc<dyn Component>>,
}
impl Registry {
pub fn new() -> Self {
Self {
inner: Default::default(),
}
}
pub fn register(&self, id: impl ToString, component: Arc<dyn Component>) {
self.inner.upsert(id.to_string(), component);
}
pub fn unregister(&self, id: impl ToString) {
self.inner.remove(&id.to_string());
}
pub async fn execute(
&self,
event: InteractionCreate,
handlers: Arc<Handlers>,
) -> Result<(), InteractionError> {
if let Some(data) = &event.data {
match data {
InteractionData::MessageComponent(data) => {
if let Some(component) = self.inner.get_async(&data.custom_id).await {
component
.execute(InteractionContext::new(event, handlers))
.await
} else {
Err(InteractionError::InteractionNotFound)
}
}
_ => Err(InteractionError::InteractionTypeUnsent),
}
} else {
Err(InteractionError::InteractionTypeUnsent)
}
}
}