forked from jmug/stoatchat
feat(core): implement ratelimit events for reference db
This commit is contained in:
@@ -4,7 +4,7 @@ use futures::lock::Mutex;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Bot, Channel, ChannelCompositeKey, ChannelUnread, Emoji, File, Invite, Member,
|
Bot, Channel, ChannelCompositeKey, ChannelUnread, Emoji, File, Invite, Member,
|
||||||
MemberCompositeKey, Message, Server, ServerBan, User, UserSettings, Webhook,
|
MemberCompositeKey, Message, RatelimitEvent, Server, ServerBan, User, UserSettings, Webhook,
|
||||||
};
|
};
|
||||||
|
|
||||||
database_derived!(
|
database_derived!(
|
||||||
@@ -19,6 +19,7 @@ database_derived!(
|
|||||||
pub emojis: Arc<Mutex<HashMap<String, Emoji>>>,
|
pub emojis: Arc<Mutex<HashMap<String, Emoji>>>,
|
||||||
pub files: Arc<Mutex<HashMap<String, File>>>,
|
pub files: Arc<Mutex<HashMap<String, File>>>,
|
||||||
pub messages: Arc<Mutex<HashMap<String, Message>>>,
|
pub messages: Arc<Mutex<HashMap<String, Message>>>,
|
||||||
|
pub ratelimit_events: Arc<Mutex<HashMap<String, RatelimitEvent>>>,
|
||||||
pub user_settings: Arc<Mutex<HashMap<String, UserSettings>>>,
|
pub user_settings: Arc<Mutex<HashMap<String, UserSettings>>>,
|
||||||
pub users: Arc<Mutex<HashMap<String, User>>>,
|
pub users: Arc<Mutex<HashMap<String, User>>>,
|
||||||
pub server_bans: Arc<Mutex<HashMap<MemberCompositeKey, ServerBan>>>,
|
pub server_bans: Arc<Mutex<HashMap<MemberCompositeKey, ServerBan>>>,
|
||||||
|
|||||||
@@ -1,28 +1,46 @@
|
|||||||
|
use std::cmp::Ordering;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use super::AbstractRatelimitEvents;
|
use super::AbstractRatelimitEvents;
|
||||||
use crate::RatelimitEvent;
|
use crate::RatelimitEvent;
|
||||||
use crate::RatelimitEventType;
|
use crate::RatelimitEventType;
|
||||||
use crate::ReferenceDb;
|
use crate::ReferenceDb;
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
|
use ulid::Ulid;
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl AbstractRatelimitEvents for ReferenceDb {
|
impl AbstractRatelimitEvents for ReferenceDb {
|
||||||
/// Insert a new ratelimit event
|
/// Insert a new ratelimit event
|
||||||
async fn insert_ratelimit_event(&self, _event: &RatelimitEvent) -> Result<()> {
|
async fn insert_ratelimit_event(&self, event: &RatelimitEvent) -> Result<()> {
|
||||||
// TODO: implement
|
let mut ratelimit_events = self.ratelimit_events.lock().await;
|
||||||
unimplemented!()
|
if ratelimit_events.contains_key(&event.id) {
|
||||||
|
Err(create_database_error!("insert", "message"))
|
||||||
|
} else {
|
||||||
|
ratelimit_events.insert(event.id.to_string(), event.clone());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Count number of events in given duration and check if we've hit the limit
|
/// Count number of events in given duration and check if we've hit the limit
|
||||||
async fn has_ratelimited(
|
async fn has_ratelimited(
|
||||||
&self,
|
&self,
|
||||||
_target_id: &str,
|
target_id: &str,
|
||||||
_event_type: RatelimitEventType,
|
event_type: RatelimitEventType,
|
||||||
_period: Duration,
|
period: Duration,
|
||||||
_count: usize,
|
count: usize,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
// TODO: implement
|
let ratelimit_events = self.ratelimit_events.lock().await;
|
||||||
unimplemented!()
|
let gte_cmp_id = Ulid::from_datetime(SystemTime::now() - period).to_string();
|
||||||
|
|
||||||
|
Ok(ratelimit_events
|
||||||
|
.iter()
|
||||||
|
.filter(|(id, event)| {
|
||||||
|
id.cmp(&>e_cmp_id) == Ordering::Greater
|
||||||
|
&& event.target_id == target_id
|
||||||
|
&& event.event_type == event_type
|
||||||
|
})
|
||||||
|
.count()
|
||||||
|
>= count)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user