NadekoBot/src/NadekoBot/Services/Administration/GuildTimezoneService.cs

75 lines
2.3 KiB
C#
Raw Normal View History

2017-06-12 23:40:39 +00:00
using NadekoBot.Extensions;
using NadekoBot.Services.Database.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Concurrent;
using NadekoBot.Services;
using Discord.WebSocket;
2017-06-12 23:40:39 +00:00
namespace NadekoBot.Services.Administration
{
public class GuildTimezoneService
{
//hack >.>
public static ConcurrentDictionary<ulong, GuildTimezoneService> AllServices { get; } = new ConcurrentDictionary<ulong, GuildTimezoneService>();
2017-06-12 23:40:39 +00:00
private ConcurrentDictionary<ulong, TimeZoneInfo> _timezones;
private readonly DbService _db;
public GuildTimezoneService(DiscordSocketClient client, IEnumerable<GuildConfig> gcs, DbService db)
2017-06-12 23:40:39 +00:00
{
_timezones = gcs
.Select(x =>
{
TimeZoneInfo tz;
try
{
2017-07-03 21:27:17 +00:00
if (x.TimeZoneId == null)
tz = null;
else
tz = TimeZoneInfo.FindSystemTimeZoneById(x.TimeZoneId);
2017-06-12 23:40:39 +00:00
}
catch
{
tz = null;
}
return (x.GuildId, tz);
})
.Where(x => x.Item2 != null)
.ToDictionary(x => x.Item1, x => x.Item2)
.ToConcurrent();
var curUser = client.CurrentUser;
if (curUser != null)
AllServices.TryAdd(curUser.Id, this);
2017-06-12 23:40:39 +00:00
_db = db;
}
public TimeZoneInfo GetTimeZoneOrDefault(ulong guildId)
{
if (_timezones.TryGetValue(guildId, out var tz))
return tz;
return null;
}
public void SetTimeZone(ulong guildId, TimeZoneInfo tz)
{
using (var uow = _db.UnitOfWork)
{
var gc = uow.GuildConfigs.For(guildId, set => set);
gc.TimeZoneId = tz?.Id;
uow.Complete();
if (tz == null)
_timezones.TryRemove(guildId, out tz);
else
_timezones.AddOrUpdate(guildId, tz, (key, old) => tz);
}
}
public TimeZoneInfo GetTimeZoneOrUtc(ulong guildId)
=> GetTimeZoneOrDefault(guildId) ?? TimeZoneInfo.Utc;
}
}