@@ -3,7 +3,7 @@ use crate::{handler, ChatServerHandle};
3
3
use actix_web:: web:: Data ;
4
4
use actix_web:: { error, post, web, Error , HttpRequest , HttpResponse , Scope } ;
5
5
use celery:: Celery ;
6
- use log :: error ;
6
+ use redis :: Commands ;
7
7
use serenity:: all:: { ChannelId , CreateEmbed , CreateEmbedAuthor } ;
8
8
use serenity:: builder:: CreateMessage ;
9
9
use serenity:: http:: Http ;
@@ -115,6 +115,14 @@ async fn new_clan_chats(
115
115
return result. map_err ( |err| error:: ErrorBadRequest ( err. message ) ) ;
116
116
} ;
117
117
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
+
118
126
for mut chat in new_chat. clone ( ) {
119
127
if chat. sender . clone ( ) == "" && chat. clan_name . clone ( ) == "" {
120
128
continue ;
@@ -129,10 +137,6 @@ async fn new_clan_chats(
129
137
let message_content_hash =
130
138
hash_string ( format ! ( "{}{}" , chat. message. clone( ) , chat. sender. clone( ) ) ) ;
131
139
132
- let mut redis_connection = redis_client
133
- . get_connection ( )
134
- . expect ( "Could not connect to redis" ) ;
135
-
136
140
let redis_key = format ! ( "MessageHashes:{}" , message_content_hash) ;
137
141
match fetch_redis :: < String > ( & mut redis_connection, & redis_key) . await {
138
142
Ok ( _) => {
@@ -164,15 +168,15 @@ async fn new_clan_chats(
164
168
let right_now = serenity:: model:: timestamp:: Timestamp :: now ( ) ;
165
169
166
170
match registered_guild. clan_chat_channel {
167
- Some ( channel_id ) => {
171
+ Some ( _channel_id ) => {
168
172
let author_image = match chat. clan_name . clone ( ) == chat. sender . clone ( ) {
169
173
true => {
170
174
"https://oldschool.runescape.wiki/images/Your_Clan_icon.png" . to_string ( )
171
175
}
172
176
false => get_wiki_clan_rank_image_url ( chat. rank . clone ( ) ) ,
173
177
} ;
174
178
175
- let clan_chat_to_discord = CreateMessage :: new ( ) . embed (
179
+ clan_chat_queue . push (
176
180
CreateEmbed :: new ( )
177
181
. title ( "" )
178
182
. author ( CreateEmbedAuthor :: new ( chat. sender . clone ( ) ) . icon_url ( author_image) )
@@ -181,13 +185,6 @@ async fn new_clan_chats(
181
185
. color ( 0x0000FF )
182
186
. timestamp ( right_now) ,
183
187
) ;
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
- }
191
188
}
192
189
_ => { }
193
190
}
@@ -260,6 +257,7 @@ async fn new_clan_chats(
260
257
match possible_broadcast {
261
258
None => {
262
259
if league_world {
260
+ //This checks for leagues only broadcasts. Like new area, etc
263
261
let possible_leagues_message = handler. extract_leagues_message ( ) . await ;
264
262
if let Some ( leagues_message) = possible_leagues_message {
265
263
let mut broadcast_embed = CreateEmbed :: new ( )
@@ -273,17 +271,12 @@ async fn new_clan_chats(
273
271
broadcast_embed = broadcast_embed. image ( icon_url) ;
274
272
}
275
273
}
276
- let broadcast_message = CreateMessage :: new ( ) . embed ( broadcast_embed ) ;
274
+
277
275
//Only send if theres a leagues channel
278
- if let Some ( channel_to_send_broadcast ) =
276
+ if let Some ( _channel_to_send_broadcast ) =
279
277
registered_guild. leagues_broadcast_channel
280
278
{
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) ;
287
280
}
288
281
}
289
282
}
@@ -304,23 +297,88 @@ async fn new_clan_chats(
304
297
broadcast_embed = broadcast_embed. image ( icon_url) ;
305
298
}
306
299
}
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
+ }
318
306
}
319
- }
307
+ false => {
308
+ if registered_guild. broadcast_channel . is_some ( ) {
309
+ broadcast_queue. push ( broadcast_embed) ;
310
+ }
311
+ }
312
+ } ;
320
313
}
321
314
} ;
322
315
}
323
316
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
+
324
382
return Ok ( "Message processed" . to_string ( ) ) ;
325
383
}
326
384
0 commit comments