1+ use crate :: cooldown_service:: CooldownService ;
12use crate :: AppState ;
23use regex:: Regex ;
34use std:: ops:: Deref ;
45use std:: sync:: Arc ;
56use std:: time:: Instant ;
67use tokio:: sync:: broadcast:: error:: RecvError ;
78use tokio:: sync:: broadcast:: Receiver ;
8-
99// ChatMessage
1010
1111#[ derive( Clone , Ord , PartialOrd , PartialEq , Eq ) ]
@@ -23,20 +23,23 @@ pub enum TwitchUserPermission {
2323 System ,
2424}
2525
26+ pub type TwitchUserId = str ;
27+
2628#[ derive( Clone ) ]
2729pub struct TwitchUser {
28- pub id : String ,
30+ pub id : Box < TwitchUserId > ,
2931 pub name : String ,
3032 pub permission : TwitchUserPermission ,
3133 pub subscriber_months : u16 ,
3234 pub subscription_tier : u16 ,
3335}
3436
37+ // official id, uuid
38+ pub type TwitchMessageId = String ;
39+
3540#[ derive( Clone ) ]
3641pub struct ChatMessage {
37- pub message_id : String ,
38- pub user_message_index : u32 ,
39- pub global_message_index : u32 ,
42+ pub message_id : TwitchMessageId ,
4043 pub message : String ,
4144 pub user : TwitchUser ,
4245 pub is_highlighted_message : bool ,
@@ -51,26 +54,21 @@ pub struct ChatMessage {
5154
5255// Triggers
5356
54- type TriggerId < ' a > = & ' a str ;
55- type TriggerCallback = fn ( & AppState , TriggerId , & ChatMessage ) -> ( ) ;
56-
57- pub enum CooldownType {
58- SECONDS ,
59- MESSAGES
60- }
57+ pub type TriggerId = str ;
58+ pub type TriggerCallback = fn ( & AppState , & TriggerId , & ChatMessage ) -> ( ) ;
6159
62- pub struct ChatCooldown {
63- cooldown_type : CooldownType ,
64- amount : u16 ,
60+ pub enum ChatCooldown {
61+ SECONDS ( u32 ) ,
62+ MESSAGES ( u16 )
6563}
6664
6765pub struct CommandTrigger {
68- id : String ,
69- patterns : Vec < Regex > ,
70- permission : TwitchUserPermission ,
71- user_cooldown : ChatCooldown ,
72- global_cooldown : ChatCooldown ,
73- callback : Box < TriggerCallback > ,
66+ pub id : Box < TriggerId > ,
67+ pub patterns : Vec < Regex > ,
68+ pub permission : TwitchUserPermission ,
69+ pub user_cooldown : ChatCooldown ,
70+ pub global_cooldown : ChatCooldown ,
71+ pub callback : Box < TriggerCallback > ,
7472}
7573
7674static TEXT_COMMAND_CALLBACK : TriggerCallback = |_app_state , _trigger_id, _chat_message| {
@@ -88,6 +86,7 @@ static TEXT_COMMAND_CALLBACK: TriggerCallback = |_app_state , _trigger_id, _chat
8886
8987pub struct CommandService {
9088 triggers : Vec < CommandTrigger > ,
89+ cooldown_service : CooldownService ,
9190}
9291
9392struct ReceiverClosed ;
@@ -104,13 +103,13 @@ impl CommandService {
104103 }
105104 } ;
106105 for trigger in self . triggers . iter ( ) {
107- CommandService :: execute_trigger_if_matching ( app_state. deref ( ) , trigger, & message)
106+ self . execute_trigger_if_matching ( app_state. deref ( ) , trigger, & message)
108107 }
109108 }
110109 Ok ( ( ) )
111110 }
112111
113- fn execute_trigger_if_matching ( app_state : & AppState , trigger : & CommandTrigger , chat_message : & ChatMessage ) {
112+ fn execute_trigger_if_matching ( & self , app_state : & AppState , trigger : & CommandTrigger , chat_message : & ChatMessage ) {
114113 if chat_message. user . permission < trigger. permission {
115114 // logger.debug("User {} with {}, missing {} permission for command {}", message.user().name(), message.user().permission(), trigger.permission(), trigger.id());
116115 return ;
@@ -120,17 +119,14 @@ impl CommandService {
120119 return ;
121120 }
122121
123- // if (inGlobalCooldown(message, trigger.id(), trigger.globalCooldown())) {
124- // logger.debug("Call to command {} from {} rejected because of global cooldowns", trigger.id(), message.user().name());
125- // return;
126- // }
127- // if (inUserCooldown(message, trigger.id(), trigger.userCooldown())) {
128- // logger.debug("Call to command {} from {} rejected because of user cooldowns", trigger.id(), message.user().name());
129- // return;
130- // }
131- // updateCooldownState(message, trigger.id(), trigger.globalCooldown(), trigger.userCooldown());
132-
133- ( trigger. callback ) ( app_state, trigger. id . as_str ( ) , chat_message) ;
122+ let cooldown_res = self . cooldown_service . check_update_cooldown ( chat_message, trigger. id . as_ref ( ) , & trigger. user_cooldown , & trigger. global_cooldown ) ;
123+ if cooldown_res. is_some ( ) {
124+ // logger.debug("Call to command {} from {} rejected because of global cooldowns", trigger.id(), message.user().name());
125+ // logger.debug("Call to command {} from {} rejected because of user cooldowns", trigger.id(), message.user().name());
126+ return ;
127+ }
128+
129+ ( trigger. callback ) ( app_state, trigger. id . as_ref ( ) , chat_message) ;
134130 }
135131}
136132
0 commit comments