1
0
This repository has been archived on 2023-08-03. You can view files and clone it, but cannot push or open issues or pull requests.
budet-cho-bot/Budet-cho-bot/Modules/ReminderModule.cs
2023-07-28 13:14:50 +08:00

133 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Discord.Commands;
using Newtonsoft.Json.Linq;
namespace Discord_Bot
{
public class ReminderModule : ModuleBase<SocketCommandContext>
{
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);
}
}
}