就如何为 discord 机器人创建日常任务系统提供建议
Give advice on how to create a system of daily tasks for the discord bot
提前致歉,问题不在主题范围内,但我需要帮助。我正在学习编写自己的代码,我有一个任务是制作一个每日奖励系统,每个用户都有一个量化余额。我需要制定一个行动计划才能成功执行此命令,关于此命令我唯一知道的就是使用数据库。你可以为我制定一个行动计划,这样我就可以成功地创建这个团队并且它有效。
您需要的第一个部分是某种调度程序。这将需要在线程中 运行,因为 Discord.Net 希望您在辅助线程中进行所有端处理。这还需要跟踪最后一次是 运行 的时间,以防你的机器人碰巧没有在 7:00:00.0000 启动(或者当你将日常任务安排到 运行) 以确保他们 运行 无论如何。
这将涵盖第一部分:
How to use the .NET Timer class to trigger an event at a specific time?
第二部分涉及编写一些 "did I run yet?" 类型的标志,可能会检查您的数据库或一些小的状态文件。
下一篇是 运行 的任务列表。这是一个非常开放的部分,可能就像为每天需要完成的每件事编写一个方法一样简单。
将每个任务保存在单独的方法中以便于代码维护是一个很好的原则。然后,您可以将所有任务附加到多播委托,并将其 运行 全部作为一个批处理。
实际上,这部分相当简单。一个普通的事件处理程序包装器...
...事件参数容器:
public class RepeatedTaskEventArgs : EventArgs
{
//Any event arguments you need to pass in here.
}
...一个事件
public EventHandler<RepeatedTaskEventArgs> RunDailies;
...触发事件的调用。
public static void PerformDailyEvents()
{
RepeatedTaskEventArgs dailyTaskArgs = new RepeatedTaskEventArgs();
RunDailies?.Invoke(DateTime.Now, dailyTaskArgs);
}
...实际上 运行.
private void SomeDailyAction(object sender, RepeatedTaskEventArgs e)
{
//Your daily code goes here.
}
然后,在你的程序启动时:
private Program()
{
//Just some example lines from my bot. Yours will be different:
Client = new DiscordSocketClient(new DiscordSocketConfig() { LogLevel = LogSeverity.Info });
Client.Connected += Connected;
Client.MessageRecieved += Client_MessageReceived;
//Then do your daily event setup:
Execute(() => RunDailyEvents(), new DateTime(2020, 5, 8, 7, 0, 0));
//Register an action.
RunDailies += SomeDailyAction;
//You can do multiple actions, since delegates are fine with that.
RunDailies += SomeOtherDailyAction;
}
//This is one of the answers from the other Stack Overflow article. Use whichever approach works best for you. I chose this one because it's short and this is an example.
public void Execute(Action action, DateTime ExecutionTime)
{
Task WaitTask = Task.Delay((int)ExecutionTime.Subtract(DateTime.Now).TotalMilliseconds);
WaitTask.ContinueWith(_ => action);
WaitTask.Start();
}
我的代码并未 100% 提供您需要的功能,但希望它能让您大致了解它应该是什么样子。
提前致歉,问题不在主题范围内,但我需要帮助。我正在学习编写自己的代码,我有一个任务是制作一个每日奖励系统,每个用户都有一个量化余额。我需要制定一个行动计划才能成功执行此命令,关于此命令我唯一知道的就是使用数据库。你可以为我制定一个行动计划,这样我就可以成功地创建这个团队并且它有效。
您需要的第一个部分是某种调度程序。这将需要在线程中 运行,因为 Discord.Net 希望您在辅助线程中进行所有端处理。这还需要跟踪最后一次是 运行 的时间,以防你的机器人碰巧没有在 7:00:00.0000 启动(或者当你将日常任务安排到 运行) 以确保他们 运行 无论如何。
这将涵盖第一部分: How to use the .NET Timer class to trigger an event at a specific time?
第二部分涉及编写一些 "did I run yet?" 类型的标志,可能会检查您的数据库或一些小的状态文件。
下一篇是 运行 的任务列表。这是一个非常开放的部分,可能就像为每天需要完成的每件事编写一个方法一样简单。 将每个任务保存在单独的方法中以便于代码维护是一个很好的原则。然后,您可以将所有任务附加到多播委托,并将其 运行 全部作为一个批处理。
实际上,这部分相当简单。一个普通的事件处理程序包装器...
...事件参数容器:
public class RepeatedTaskEventArgs : EventArgs
{
//Any event arguments you need to pass in here.
}
...一个事件
public EventHandler<RepeatedTaskEventArgs> RunDailies;
...触发事件的调用。
public static void PerformDailyEvents()
{
RepeatedTaskEventArgs dailyTaskArgs = new RepeatedTaskEventArgs();
RunDailies?.Invoke(DateTime.Now, dailyTaskArgs);
}
...实际上 运行.
private void SomeDailyAction(object sender, RepeatedTaskEventArgs e)
{
//Your daily code goes here.
}
然后,在你的程序启动时:
private Program()
{
//Just some example lines from my bot. Yours will be different:
Client = new DiscordSocketClient(new DiscordSocketConfig() { LogLevel = LogSeverity.Info });
Client.Connected += Connected;
Client.MessageRecieved += Client_MessageReceived;
//Then do your daily event setup:
Execute(() => RunDailyEvents(), new DateTime(2020, 5, 8, 7, 0, 0));
//Register an action.
RunDailies += SomeDailyAction;
//You can do multiple actions, since delegates are fine with that.
RunDailies += SomeOtherDailyAction;
}
//This is one of the answers from the other Stack Overflow article. Use whichever approach works best for you. I chose this one because it's short and this is an example.
public void Execute(Action action, DateTime ExecutionTime)
{
Task WaitTask = Task.Delay((int)ExecutionTime.Subtract(DateTime.Now).TotalMilliseconds);
WaitTask.ContinueWith(_ => action);
WaitTask.Start();
}
我的代码并未 100% 提供您需要的功能,但希望它能让您大致了解它应该是什么样子。