1use std::sync::Arc;
2
3use tokio::sync::Semaphore;
4
5use crate::events::common::Message;
6#[cfg(feature = "openapi")]
7use crate::openapi;
8
9pub fn is_mentioned_message(message: &Message, target_user_id: &str) -> bool {
11 message
12 .embedded
13 .iter()
14 .any(|emb| emb.id.as_str() == target_user_id)
15}
16
17pub fn create_client(bot_access_token: impl Into<String>) -> reqwest::Client {
19 let mut headers = reqwest::header::HeaderMap::new();
20 let authorization_token = format!("Bearer {}", bot_access_token.into());
21 headers.insert(
22 reqwest::header::AUTHORIZATION,
23 reqwest::header::HeaderValue::from_str(&authorization_token).unwrap(),
24 );
25 reqwest::Client::builder()
26 .default_headers(headers)
27 .build()
28 .unwrap()
29}
30
31#[cfg(feature = "openapi")]
33pub fn create_configuration(bot_access_token: impl Into<String>) -> openapi::apis::configuration::Configuration {
34 openapi::apis::configuration::Configuration {
35 bearer_access_token: Some(bot_access_token.into()),
36 ..Default::default()
37 }
38}
39
40pub struct RateLimiter {
58 interval: std::time::Duration,
59 semaphore: Arc<Semaphore>,
60}
61impl RateLimiter {
62 pub fn new(max_count: usize, interval: std::time::Duration) -> Self {
64 Self {
65 interval,
66 semaphore: Arc::new(Semaphore::new(max_count)),
67 }
68 }
69
70 pub async fn acquire(&self) {
84 let semaphore = self.semaphore.clone();
85 let permit = semaphore.acquire_owned().await.unwrap();
86 let interval = self.interval;
87
88 tokio::spawn( async move {
89 tokio::time::sleep(interval).await;
90 drop(permit);
91 });
92 }
93
94 pub fn try_acquire(&self) -> bool {
109 let semaphore = self.semaphore.clone();
110 match semaphore.try_acquire_owned() {
111 Ok(permit) => {
112 let interval = self.interval;
113 tokio::spawn( async move {
114 tokio::time::sleep(interval).await;
115 drop(permit);
116 });
117 true
118 }
119 Err(_) => false,
120 }
121 }
122}
123impl Default for RateLimiter {
124 fn default() -> Self {
125 Self::new(5, std::time::Duration::from_secs(5))
126 }
127}