11use crate :: config:: Config ;
2+ use crate :: db:: reminders:: { update_reminder_status, Reminder } ;
23use crate :: utils:: conversion:: hex_string_to_int:: hex_string_to_int;
34use crate :: utils:: message:: message_builder:: MessageBuilder ;
4- use serenity:: all:: { Context , Message } ;
5+ use chrono:: Local ;
6+ use serenity:: all:: { ChannelId , Context , Message , UserId } ;
7+ use sqlx:: SqlitePool ;
58use std:: collections:: HashMap ;
9+ use std:: time:: Duration ;
10+ use tokio:: time:: sleep;
611
712pub async fn send_register_confirmation (
13+ reminder_id : i64 ,
814 reminder_content : & str ,
915 ctx : & Context ,
1016 msg : & Message ,
@@ -32,6 +38,7 @@ pub async fn send_register_confirmation(
3238 )
3339 . await
3440 . to_channel ( msg. channel_id )
41+ . footer ( format ! ( "{}: {}" , "ID" , reminder_id) )
3542 . send ( )
3643 . await ;
3744 } else {
@@ -44,44 +51,65 @@ pub async fn send_register_confirmation(
4451 )
4552 . await
4653 . to_channel ( msg. channel_id )
54+ . footer ( format ! ( "{}: {}" , "ID" , reminder_id) )
4755 . send ( )
4856 . await ;
4957 }
5058}
5159
52- pub async fn send_reminder_content (
53- reminder_content : & str ,
54- ctx : & Context ,
55- msg : & Message ,
56- config : & Config ,
57- trigger_timestamp : i64 ,
58- ) {
59- let mut params = HashMap :: new ( ) ;
60- params. insert ( "time" . to_string ( ) , format ! ( "<t:{}:F>" , trigger_timestamp) ) ;
61- params. insert (
62- "remaining_time" . to_string ( ) ,
63- format ! ( "<t:{}:R>" , trigger_timestamp) ,
64- ) ;
60+ pub fn spawn_reminder ( reminder : & Reminder , ctx : & Context , config : & Config , pool : & SqlitePool ) {
61+ let pool = pool. clone ( ) ;
62+ let config = config. clone ( ) ;
63+ let ctx = ctx. clone ( ) ;
64+ let reminder = reminder. clone ( ) ;
6565
66- if !reminder_content. is_empty ( ) {
67- params. insert ( "content" . to_string ( ) , reminder_content. to_string ( ) ) ;
68- }
66+ tokio:: spawn ( async move {
67+ let now = Local :: now ( ) . timestamp ( ) ;
68+ let delay_duration = if reminder. trigger_time > now {
69+ reminder. trigger_time - now
70+ } else {
71+ 0
72+ } ;
73+ sleep ( Duration :: from_secs ( delay_duration as u64 ) ) . await ;
6974
70- if !reminder_content. is_empty ( ) {
71- let _ = MessageBuilder :: system_message ( & ctx, & config)
72- . translated_content ( "reminder.show_with_content" , Some ( & params) , None , None )
73- . await
74- . to_channel ( msg. channel_id )
75- . color ( hex_string_to_int ( & config. reminders . embed_color ) as u32 )
76- . send ( )
77- . await ;
78- } else {
79- let _ = MessageBuilder :: system_message ( & ctx, & config)
80- . translated_content ( "reminder.show_without_content" , None , None , None )
81- . await
82- . to_channel ( msg. channel_id )
83- . color ( hex_string_to_int ( & config. reminders . embed_color ) as u32 )
84- . send ( )
85- . await ;
86- }
75+ let mut params = HashMap :: new ( ) ;
76+ params. insert (
77+ "time" . to_string ( ) ,
78+ format ! ( "<t:{}:F>" , reminder. trigger_time) ,
79+ ) ;
80+ params. insert (
81+ "remaining_time" . to_string ( ) ,
82+ format ! ( "<t:{}:R>" , reminder. trigger_time) ,
83+ ) ;
84+
85+ params. insert ( "user" . to_string ( ) , reminder. user_id . to_string ( ) ) ;
86+ params. insert ( "content" . to_string ( ) , reminder. reminder_content . to_string ( ) ) ;
87+
88+ let mut mentions = Vec :: < UserId > :: new ( ) ;
89+ mentions. push ( UserId :: new ( reminder. user_id as u64 ) ) ;
90+
91+ if !reminder. reminder_content . is_empty ( ) {
92+ let _ = MessageBuilder :: system_message ( & ctx, & config)
93+ . translated_content ( "reminder.show_with_content" , Some ( & params) , None , None )
94+ . await
95+ . to_channel ( ChannelId :: new ( reminder. channel_id as u64 ) )
96+ . color ( hex_string_to_int ( & config. reminders . embed_color ) as u32 )
97+ . mention ( mentions)
98+ . send ( )
99+ . await ;
100+ } else {
101+ let _ = MessageBuilder :: system_message ( & ctx, & config)
102+ . translated_content ( "reminder.show_without_content" , Some ( & params) , None , None )
103+ . await
104+ . to_channel ( ChannelId :: new ( reminder. channel_id as u64 ) )
105+ . color ( hex_string_to_int ( & config. reminders . embed_color ) as u32 )
106+ . mention ( mentions)
107+ . send ( )
108+ . await ;
109+ }
110+
111+ if let Err ( e) = update_reminder_status ( & reminder, true , & pool) . await {
112+ eprintln ! ( "Failed to update reminder status: {}" , e) ;
113+ }
114+ } ) ;
87115}
0 commit comments