133 lines
4.2 KiB
C#
133 lines
4.2 KiB
C#
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);
|
||
}
|
||
}
|
||
} |