using Discord.Commands; using Newtonsoft.Json.Linq; namespace Discord_Bot { public class ReminderModule : ModuleBase { private const long DAY_PERIOD = 24 * 60 * 60 * 1000; // 10 * 1000; // private Timer reminderTimer; [Command("reloadTimer")] private async Task SetReloadTimer() { ReloadTimers(); await ReplyAsync($"Заебись"); } [Command("remindertime")] private async Task SetReminderTime([Remainder]string message = "") { SaveToConfig("reminderTime", Utility.ParseMessage(message)); ReloadTimers(); await ReplyAsync($"Заебись"); } [Command("sequence")] private async Task SetSequence([Remainder]string message = "") { SaveToConfig("sequence", message); SaveToConfig("sequenceIndex", "0"); await ReplyAsync($"Заебись"); } [Command("users")] private async Task Users([Remainder]string message = "") { SaveToConfig("users", message); await ReplyAsync($"Заебись"); } private void ReloadTimers() { var reminder = GetReminderTime(); var now = DateTime.Now; var span = (reminder - now).TotalMilliseconds; if (span < 0) { // skip to next period var d = (now - reminder).TotalMilliseconds + DAY_PERIOD; reminder = reminder.AddMilliseconds(d); span = (reminder - now).TotalMilliseconds; } reminderTimer = new Timer(SendReminder, "sd", (long)span, DAY_PERIOD); RecalcSequenceIndex(); } private DateTime GetReminderTime() { var time = Functions.GetConfigItem("reminderTime"); if (time.Type == JTokenType.Boolean) return DateTime.Now; return Utility.ParseTime(time.ToString()); } private async void SendReminder(object? state) { if (!CheckSequenceAndIncrementIndex()) return; var users = Functions.GetConfigItem("users").ToString(); var message = $"{users}\nБудет чо? {DateTime.Now}"; await ReplyAsync(message); } private void RecalcSequenceIndex() { var reminder = GetReminderTime(); var now = DateTime.Now; var sequence = GetSequence(); var span = (now - reminder).TotalMilliseconds; var spanMinusFullSequences = (int)MathF.Floor((float)span % (DAY_PERIOD * sequence.Length)); var index = spanMinusFullSequences / DAY_PERIOD; SaveToConfig("sequenceIndex", index.ToString()); } private bool CheckSequenceAndIncrementIndex() { var sequenceIndex = GetSequenceIndex(); var sequence = GetSequence(); if (string.IsNullOrEmpty(sequence)) return true; var result = sequence[sequenceIndex] == '!'; sequenceIndex = (sequenceIndex + 1) % sequence.Length; SaveToConfig("sequenceIndex", sequenceIndex.ToString()); return result; } private int GetSequenceIndex() { var sequenceIndexToken = Functions.GetConfigItem("sequenceIndex"); if (sequenceIndexToken.Type == JTokenType.Boolean) { SaveToConfig("sequenceIndex", "0"); return 0; } return (int)sequenceIndexToken; } private string GetSequence() { var sequenceIndexToken = Functions.GetConfigItem("sequence"); if (sequenceIndexToken.Type == JTokenType.Boolean) { SaveToConfig("sequence", ""); return ""; } return sequenceIndexToken.ToString(); } private void SaveToConfig(string key, string data) { var config = Functions.GetConfig(); config[key] = data; Functions.SaveConfig(config); } } }