mirror of
https://gitlab.com/Deukhoofd/DeukBot4.git
synced 2026-04-03 11:10:05 +00:00
Added reminders
This commit is contained in:
93
DeukBot4/Database/ReminderHandler.cs
Normal file
93
DeukBot4/Database/ReminderHandler.cs
Normal file
@@ -0,0 +1,93 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Discord;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace DeukBot4.Database
|
||||
{
|
||||
public class ReminderHandler
|
||||
{
|
||||
public static ReminderHandler Main = new ReminderHandler();
|
||||
public static ConnectionMultiplexer Redis = ConnectionMultiplexer.Connect("127.0.0.1");
|
||||
|
||||
|
||||
public void AddReminder(TimeSpan time, string message, ulong channel, ulong author, ulong recipient)
|
||||
{
|
||||
try
|
||||
{
|
||||
var db = Redis.GetDatabase();
|
||||
var id = Guid.NewGuid().ToString();
|
||||
var expectedTime = DateTime.UtcNow.Add(time);
|
||||
db.SortedSetAdd("deukbot_reminders", (RedisValue)id, expectedTime.ToBinary());
|
||||
db.HashSet((RedisKey) id, new[]
|
||||
{
|
||||
new HashEntry("channel", channel),
|
||||
new HashEntry("message", message),
|
||||
new HashEntry("author", author),
|
||||
new HashEntry("recipient", recipient),
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Main.LogError(e);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CheckReminders()
|
||||
{
|
||||
var checkTime = TimeSpan.FromSeconds(70);
|
||||
var startTime = DateTime.UtcNow;
|
||||
var desiredTopScore = (startTime + checkTime).ToBinary();
|
||||
var db = Redis.GetDatabase();
|
||||
var reminders = db.SortedSetRangeByScoreWithScores("deukbot_reminders", stop: desiredTopScore);
|
||||
foreach (var sortedSetEntry in reminders)
|
||||
{
|
||||
var val = sortedSetEntry.Element.ToString();
|
||||
var timeLong = sortedSetEntry.Score;
|
||||
var time = DateTime.FromBinary((long) timeLong);
|
||||
var data = db.HashGetAll(val);
|
||||
ulong channel = 0;
|
||||
ulong author = 0;
|
||||
ulong recipient = 0;
|
||||
string message = null;
|
||||
foreach (var hashEntry in data)
|
||||
{
|
||||
if (hashEntry.Name == "channel") channel = (ulong) hashEntry.Value;
|
||||
else if (hashEntry.Name == "message") message = hashEntry.Value;
|
||||
else if (hashEntry.Name == "author") author = (ulong) hashEntry.Value;
|
||||
else if (hashEntry.Name == "recipient") recipient = (ulong) hashEntry.Value;
|
||||
}
|
||||
var diff = time - DateTime.UtcNow;
|
||||
FireReminderAtTime((int) diff.TotalSeconds, channel, message, author, recipient);
|
||||
db.KeyDelete(val);
|
||||
}
|
||||
|
||||
db.SortedSetRemoveRangeByScore("deukbot_reminders", Double.MinValue, desiredTopScore);
|
||||
|
||||
await Task.Delay(checkTime);
|
||||
await CheckReminders();
|
||||
}
|
||||
|
||||
private async Task FireReminderAtTime(int seconds, ulong channelId, string message, ulong author, ulong recipient)
|
||||
{
|
||||
if (seconds > 0)
|
||||
await Task.Delay(TimeSpan.FromSeconds(seconds));
|
||||
await FireReminder(channelId, message, author, recipient);
|
||||
}
|
||||
|
||||
private async Task FireReminder(ulong channelId, string message, ulong author, ulong recipient)
|
||||
{
|
||||
if (Program.Client.GetChannel(channelId) is ITextChannel channel)
|
||||
{
|
||||
if (author == recipient)
|
||||
{
|
||||
channel.SendMessageAsync($"Hey <@{recipient}>, don't forget to {message}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
channel.SendMessageAsync($"Hey <@{recipient}>, <@{author}> asked me to remind you to {message}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user