Skip to content

Commit 99f8cf7

Browse files
authored
Now sends messages in batches (#52)
* Added simple message batching * new counter feature
1 parent 9f58eae commit 99f8cf7

File tree

4 files changed

+122
-36
lines changed

4 files changed

+122
-36
lines changed

trackscape-discord-api/src/controllers/bot_info_controller.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use actix_web::web::Data;
33
use actix_web::{get, post, web, Error, HttpRequest, HttpResponse, Scope};
44
use bot_info_dto::DiscordServerCount;
55
use dto::bot_info_dto;
6-
6+
use redis::{Commands, RedisResult};
77
use serde::{Deserialize, Serialize};
88

99
use std::sync::atomic::AtomicI64;
@@ -15,18 +15,37 @@ use web::Json;
1515
struct BotInfo {
1616
server_count: i64,
1717
connected_users: i64,
18+
total_chat_messages_for_today: Option<i64>,
1819
}
1920

2021
#[get("/landing-page-info")]
2122
async fn get_landing_page_info(
2223
connected_websockets: Data<Mutex<usize>>,
2324
connected_discord_servers: Data<AtomicI64>,
25+
redis_client: Data<redis::Client>,
2426
) -> Result<HttpResponse, Error> {
2527
let discord_server_count = connected_discord_servers.load(std::sync::atomic::Ordering::SeqCst);
2628

29+
let mut redis_connection = redis_client
30+
.get_connection()
31+
.expect("Failed to get redis connection");
32+
33+
let today = chrono::Utc::now().date_naive().format("%Y-%m-%d");
34+
let clan_chat_stats_key = format!("chat_stats:{}:clan_chat", today);
35+
36+
let total_chat_messages_for_today: RedisResult<i64> = redis_connection.get(clan_chat_stats_key);
37+
if let Ok(total_chat_messages_for_today) = total_chat_messages_for_today {
38+
return Ok(HttpResponse::Ok().json(BotInfo {
39+
server_count: discord_server_count as i64,
40+
connected_users: connected_websockets.lock().unwrap().clone() as i64,
41+
total_chat_messages_for_today: Some(total_chat_messages_for_today),
42+
}));
43+
}
44+
2745
Ok(HttpResponse::Ok().json(BotInfo {
2846
server_count: discord_server_count as i64,
2947
connected_users: connected_websockets.lock().unwrap().clone() as i64,
48+
total_chat_messages_for_today: None,
3049
}))
3150
}
3251

trackscape-discord-api/src/controllers/chat_controller.rs

+92-34
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{handler, ChatServerHandle};
33
use actix_web::web::Data;
44
use actix_web::{error, post, web, Error, HttpRequest, HttpResponse, Scope};
55
use celery::Celery;
6-
use log::error;
6+
use redis::Commands;
77
use serenity::all::{ChannelId, CreateEmbed, CreateEmbedAuthor};
88
use serenity::builder::CreateMessage;
99
use serenity::http::Http;
@@ -115,6 +115,14 @@ async fn new_clan_chats(
115115
return result.map_err(|err| error::ErrorBadRequest(err.message));
116116
};
117117

118+
let mut redis_connection = redis_client
119+
.get_connection()
120+
.expect("Could not connect to redis");
121+
122+
let mut clan_chat_queue: Vec<CreateEmbed> = vec![];
123+
let mut broadcast_queue: Vec<CreateEmbed> = vec![];
124+
let mut leagues_broadcast_queue: Vec<CreateEmbed> = vec![];
125+
118126
for mut chat in new_chat.clone() {
119127
if chat.sender.clone() == "" && chat.clan_name.clone() == "" {
120128
continue;
@@ -129,10 +137,6 @@ async fn new_clan_chats(
129137
let message_content_hash =
130138
hash_string(format!("{}{}", chat.message.clone(), chat.sender.clone()));
131139

132-
let mut redis_connection = redis_client
133-
.get_connection()
134-
.expect("Could not connect to redis");
135-
136140
let redis_key = format!("MessageHashes:{}", message_content_hash);
137141
match fetch_redis::<String>(&mut redis_connection, &redis_key).await {
138142
Ok(_) => {
@@ -164,15 +168,15 @@ async fn new_clan_chats(
164168
let right_now = serenity::model::timestamp::Timestamp::now();
165169

166170
match registered_guild.clan_chat_channel {
167-
Some(channel_id) => {
171+
Some(_channel_id) => {
168172
let author_image = match chat.clan_name.clone() == chat.sender.clone() {
169173
true => {
170174
"https://oldschool.runescape.wiki/images/Your_Clan_icon.png".to_string()
171175
}
172176
false => get_wiki_clan_rank_image_url(chat.rank.clone()),
173177
};
174178

175-
let clan_chat_to_discord = CreateMessage::new().embed(
179+
clan_chat_queue.push(
176180
CreateEmbed::new()
177181
.title("")
178182
.author(CreateEmbedAuthor::new(chat.sender.clone()).icon_url(author_image))
@@ -181,13 +185,6 @@ async fn new_clan_chats(
181185
.color(0x0000FF)
182186
.timestamp(right_now),
183187
);
184-
185-
let new_chat_result = ChannelId::new(channel_id)
186-
.send_message(&*discord_http_client, clan_chat_to_discord)
187-
.await;
188-
if let Err(e) = new_chat_result {
189-
error!("Error sending normal cc: {:?}", e);
190-
}
191188
}
192189
_ => {}
193190
}
@@ -260,6 +257,7 @@ async fn new_clan_chats(
260257
match possible_broadcast {
261258
None => {
262259
if league_world {
260+
//This checks for leagues only broadcasts. Like new area, etc
263261
let possible_leagues_message = handler.extract_leagues_message().await;
264262
if let Some(leagues_message) = possible_leagues_message {
265263
let mut broadcast_embed = CreateEmbed::new()
@@ -273,17 +271,12 @@ async fn new_clan_chats(
273271
broadcast_embed = broadcast_embed.image(icon_url);
274272
}
275273
}
276-
let broadcast_message = CreateMessage::new().embed(broadcast_embed);
274+
277275
//Only send if theres a leagues channel
278-
if let Some(channel_to_send_broadcast) =
276+
if let Some(_channel_to_send_broadcast) =
279277
registered_guild.leagues_broadcast_channel
280278
{
281-
let new_broad_cast = ChannelId::new(channel_to_send_broadcast)
282-
.send_message(&*discord_http_client, broadcast_message)
283-
.await;
284-
if let Err(e) = new_broad_cast {
285-
error!("Error sending broadcast: {:?}", e);
286-
}
279+
leagues_broadcast_queue.push(broadcast_embed);
287280
}
288281
}
289282
}
@@ -304,23 +297,88 @@ async fn new_clan_chats(
304297
broadcast_embed = broadcast_embed.image(icon_url);
305298
}
306299
}
307-
let broadcast_message = CreateMessage::new().embed(broadcast_embed);
308-
let possible_channel_to_send_broadcast = match league_world {
309-
true => registered_guild.leagues_broadcast_channel,
310-
false => registered_guild.broadcast_channel,
311-
};
312-
if let Some(channel_to_send_broadcast) = possible_channel_to_send_broadcast {
313-
let new_broad_cast = ChannelId::new(channel_to_send_broadcast)
314-
.send_message(&*discord_http_client, broadcast_message)
315-
.await;
316-
if let Err(e) = new_broad_cast {
317-
error!("Error sending broadcast: {:?}", e);
300+
301+
match league_world {
302+
true => {
303+
if registered_guild.leagues_broadcast_channel.is_some() {
304+
leagues_broadcast_queue.push(broadcast_embed);
305+
}
318306
}
319-
}
307+
false => {
308+
if registered_guild.broadcast_channel.is_some() {
309+
broadcast_queue.push(broadcast_embed);
310+
}
311+
}
312+
};
320313
}
321314
};
322315
}
323316

317+
let today = chrono::Utc::now().date_naive().format("%Y-%m-%d");
318+
let redis_broadcast_stats_prefix = format!("chat_stats:{}", today);
319+
320+
//Send all the messages
321+
if clan_chat_queue.len() > 0 {
322+
let clan_chat_queue_length = clan_chat_queue.len();
323+
if let Some(channel_id) = registered_guild.clan_chat_channel {
324+
let result = ChannelId::new(channel_id)
325+
.send_message(
326+
&*discord_http_client,
327+
CreateMessage::new().embeds(clan_chat_queue),
328+
)
329+
.await;
330+
if let Err(_e) = result {
331+
// error!("Error sending clan chat: {:?}", e);
332+
}
333+
}
334+
let clan_chat_key = format!("{}:{}", redis_broadcast_stats_prefix, "clan_chat");
335+
let _: () = redis_connection
336+
.incr(clan_chat_key.as_str(), clan_chat_queue_length)
337+
.expect("failed to execute INCR for 'Clan Chat'");
338+
}
339+
340+
if broadcast_queue.len() > 0 {
341+
let broadcast_key = format!("{}:{}", redis_broadcast_stats_prefix, "broadcast");
342+
let broadcast_queue_length = broadcast_queue.len();
343+
if let Some(channel_id) = registered_guild.broadcast_channel {
344+
let result = ChannelId::new(channel_id)
345+
.send_message(
346+
&*discord_http_client,
347+
CreateMessage::new().embeds(broadcast_queue),
348+
)
349+
.await;
350+
if let Err(_e) = result {
351+
// error!("Error sending broadcast: {:?}", e);
352+
}
353+
}
354+
let _: () = redis_connection
355+
.incr(broadcast_key.as_str(), broadcast_queue_length)
356+
.expect("failed to execute INCR for 'Broadcast'");
357+
}
358+
359+
if leagues_broadcast_queue.len() > 0 {
360+
let leagues_broadcast_queue_length = leagues_broadcast_queue.len();
361+
if let Some(channel_id) = registered_guild.leagues_broadcast_channel {
362+
let result = ChannelId::new(channel_id)
363+
.send_message(
364+
&*discord_http_client,
365+
CreateMessage::new().embeds(leagues_broadcast_queue),
366+
)
367+
.await;
368+
if let Err(_e) = result {
369+
// error!("Error sending leagues broadcast: {:?}", e);
370+
}
371+
}
372+
let leagues_broadcast_key =
373+
format!("{}:{}", redis_broadcast_stats_prefix, "leagues_broadcast");
374+
let _: () = redis_connection
375+
.incr(
376+
leagues_broadcast_key.as_str(),
377+
leagues_broadcast_queue_length,
378+
)
379+
.expect("failed to execute INCR for 'Broadcast'");
380+
}
381+
324382
return Ok("Message processed".to_string());
325383
}
326384

trackscape-discord-ui/src/services/TrackscapeApiTypes.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
type BotInfo = {
22
server_count: number;
33
connected_users: number;
4+
total_chat_messages_for_today: number | null
45
}
56

67
type Clan = {

trackscape-discord-ui/src/views/BotLandingPage.vue

+9-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ client.getBotInfo().then((info) => {
7979

8080

8181
<div class="mt-4 ">
82-
<div class="stats">
82+
<div class="stats stats-vertical md:stats-horizontal">
8383
<div class="stat">
8484
<div class="stat-title">
8585
Servers Joined
@@ -97,6 +97,14 @@ client.getBotInfo().then((info) => {
9797
{{ botInfo?.connected_users.toLocaleString()}}
9898
</div>
9999
</div>
100+
<div class="stat">
101+
<div class="stat-title">
102+
Messages sent today
103+
</div>
104+
<div class="stat-value text-accent">
105+
{{ botInfo?.total_chat_messages_for_today?.toLocaleString()}}
106+
</div>
107+
</div>
100108
</div>
101109
</div>
102110
</div>

0 commit comments

Comments
 (0)