Files
caliverse_server/ServerBase/Manager/DailyTimeEventManager.cs
2025-05-01 07:20:41 +09:00

71 lines
2.1 KiB
C#

using ServerCore; using ServerBase;
namespace ServerBase;
public class DailyTimeTask
{
public Func<Task> m_task { get; init; } = null!;
public DateTime m_time { get; init; } = DateTimeHelper.MinTime;
public bool m_is_first_run { get; set; } = false;
}
public class DailyTimeEventManager
{
private static readonly Lazy<DailyTimeEventManager> m_instance = new(() => new DailyTimeEventManager());
public static DailyTimeEventManager Instance => m_instance.Value;
private Dictionary<string, DailyTimeTask> m_tasks { get; set; } = new();
public Result tryAddTask(string taskName, DateTime time, Func<Task> task, bool isFirstRun = false)
{
var result = new Result();
var is_add = m_tasks.TryAdd(taskName, new DailyTimeTask { m_task = task, m_time = time, m_is_first_run = isFirstRun});
if (! is_add)
{
var err_msg = $"fail to add daily time event !! already added - taskName: {taskName} / time: {time}";
result.setFail(ServerErrorCode.DailyTimeEventAdditionFailed, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
public async Task runTimeEvents()
{
try
{
foreach (var task in m_tasks)
{
if (!checkEventTime(task.Value.m_time) && task.Value.m_is_first_run) continue;
m_tasks[task.Key].m_is_first_run = true;
// fire and forget
_ = Task.Run(task.Value.m_task);
}
}
catch (Exception e)
{
var err_msg = $"fail to run daily time event !! - {e}";
Log.getLogger().error(err_msg);
}
await Task.CompletedTask;
}
private bool checkEventTime(DateTime time)
{
var current = DateTimeHelper.Current;
// Hour check
if (current.Hour != time.Hour) return false;
// Minute check
if (current.Minute != time.Minute) return false;
// seconds check
if (current.Second != time.Second) return false;
return true;
}
}