Update to the Settings interface.

- Methods are now suffixed async
- Extension methods moved to the actual class and class renamed from SettingValue to Setting
- "Helpers" renamed to "SettingsProvider"
- Removed the ghetto CSV list method. Only setting using it was Pusher Channels which was orphaned by the new Kick channel feature. The call to ToList in the Chips.gg integration was incorrect and just proves lists should be consistently based around JSON objects instead of randomly string splitting
This commit is contained in:
barelyprofessional
2025-05-06 14:07:52 -05:00
parent 4fecdbce06
commit e2c70cc5c5
17 changed files with 167 additions and 229 deletions

View File

@@ -86,7 +86,7 @@ public class NewKickChannelCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var channels = (await Helpers.GetValue(BuiltIn.Keys.KickChannels)).JsonDeserialize<List<KickChannelModel>>();
var channels = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KickChannels)).JsonDeserialize<List<KickChannelModel>>();
var channelId = Convert.ToInt32(arguments["channel_id"].Value);
if (channels.Any(channel => channel.ChannelId == channelId))
{
@@ -102,7 +102,7 @@ public class NewKickChannelCommand : ICommand
ChannelSlug = arguments["slug"].Value
});
await Helpers.SetValueAsJsonObject(BuiltIn.Keys.KickChannels, channels);
await SettingsProvider.SetValueAsJsonObjectAsync(BuiltIn.Keys.KickChannels, channels);
await botInstance.SendChatMessageAsync("Updated list of channels", true);
}
}
@@ -118,7 +118,7 @@ public class RemoveKickChannelCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var channels = (await Helpers.GetValue(BuiltIn.Keys.KickChannels)).JsonDeserialize<List<KickChannelModel>>();
var channels = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.KickChannels)).JsonDeserialize<List<KickChannelModel>>();
var channelId = Convert.ToInt32(arguments["channel_id"].Value);
var channel = channels.FirstOrDefault(ch => ch.ChannelId == channelId);
if (channel == null)
@@ -128,7 +128,7 @@ public class RemoveKickChannelCommand : ICommand
}
channels.Remove(channel);
await Helpers.SetValueAsJsonObject(BuiltIn.Keys.KickChannels, channels);
await SettingsProvider.SetValueAsJsonObjectAsync(BuiltIn.Keys.KickChannels, channels);
await botInstance.SendChatMessageAsync("Updated list of channels", true);
}
}
@@ -160,7 +160,7 @@ public class AddCourtHearingCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var hearings = (await Helpers.GetValue(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
var hearings = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
if (hearings == null)
{
await botInstance.SendChatMessageAsync("Hearings list was null", true);
@@ -174,7 +174,7 @@ public class AddCourtHearingCommand : ICommand
}
hearings.Add(new CourtHearingModel {CaseNumber = caseNumber, Description = arguments["description"].Value, Time = date});
await Helpers.SetValueAsJsonObject(BuiltIn.Keys.BotCourtCalendar, hearings);
await SettingsProvider.SetValueAsJsonObjectAsync(BuiltIn.Keys.BotCourtCalendar, hearings);
await botInstance.SendChatMessageAsync("Updated list of hearings", true);
}
}
@@ -190,7 +190,7 @@ public class RemoveCourtHearingCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var hearings = (await Helpers.GetValue(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
var hearings = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
if (hearings == null)
{
await botInstance.SendChatMessageAsync("Hearings list was null", true);
@@ -205,7 +205,7 @@ public class RemoveCourtHearingCommand : ICommand
}
hearings.RemoveAt(hearingIndex - 1);
await Helpers.SetValueAsJsonObject(BuiltIn.Keys.BotCourtCalendar, hearings);
await SettingsProvider.SetValueAsJsonObjectAsync(BuiltIn.Keys.BotCourtCalendar, hearings);
await botInstance.SendChatMessageAsync("Updated list of hearings", true);
}
}
@@ -340,7 +340,7 @@ public class SetAlmanacTextCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
await Helpers.SetValue(BuiltIn.Keys.BotAlmanacText, arguments["text"].Value);
await SettingsProvider.SetValueAsync(BuiltIn.Keys.BotAlmanacText, arguments["text"].Value);
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, updated text for the almanac shill", true);
}
}
@@ -364,7 +364,7 @@ public class SetAlmanacIntervalCommand : ICommand
await botInstance.SendChatMessageAsync("Not going to let you use an interval below 300 seconds", true);
return;
}
await Helpers.SetValue(BuiltIn.Keys.BotAlmanacInterval, arguments["interval"].Value);
await SettingsProvider.SetValueAsync(BuiltIn.Keys.BotAlmanacInterval, arguments["interval"].Value);
await botInstance.BotServices.AlmanacShill.StopShillTaskAsync();
botInstance.BotServices.AlmanacShill.StartShillTask();
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, updated interval and restarted the shill task", true);

View File

@@ -19,7 +19,7 @@ public class HowlggStatsCommand : ICommand
{
var window = Convert.ToInt32(arguments["window"].Value);
var start = DateTimeOffset.UtcNow.AddHours(-window);
var division = (await Helpers.GetValue(BuiltIn.Keys.HowlggDivisionAmount)).ToType<float>();
var division = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.HowlggDivisionAmount)).ToType<float>();
await using var db = new ApplicationDbContext();
// EF SQLite doesn't support filtering on dates :(
var bets = (await db.HowlggBets.ToListAsync(ctx)).Where(b => b.Date.UtcDateTime > start).ToList();
@@ -44,7 +44,7 @@ public class HowlggRecentBetCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var settings = await Helpers.GetMultipleValues([
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor, BuiltIn.Keys.HowlggDivisionAmount
]);
var division = settings[BuiltIn.Keys.HowlggDivisionAmount].ToType<float>();

View File

@@ -25,7 +25,7 @@ public class AddImageCommand : ICommand
CancellationToken ctx)
{
await using var db = new ApplicationDbContext();
var imageKeys = (await Helpers.GetValue(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
var imageKeys = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
if (imageKeys == null) throw new InvalidOperationException($"{BuiltIn.Keys.BotImageAcceptableKeys} was null");
var key = arguments["key"].Value;
var url = arguments["url"].Value;
@@ -65,7 +65,7 @@ public class RemoveImageCommand : ICommand
CancellationToken ctx)
{
await using var db = new ApplicationDbContext();
var imageKeys = (await Helpers.GetValue(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
var imageKeys = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
if (imageKeys == null) throw new InvalidOperationException($"{BuiltIn.Keys.BotImageAcceptableKeys} was null");
var key = arguments["key"].Value;
var url = arguments["url"].Value;
@@ -103,7 +103,7 @@ public class ListImageCommand : ICommand
CancellationToken ctx)
{
await using var db = new ApplicationDbContext();
var imageKeys = (await Helpers.GetValue(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
var imageKeys = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotImageAcceptableKeys)).JsonDeserialize<List<string>>();
if (imageKeys == null) throw new InvalidOperationException($"{BuiltIn.Keys.BotImageAcceptableKeys} was null");
var key = arguments["key"].Value;
if (!imageKeys.Contains(key))
@@ -146,7 +146,7 @@ public class GetRandomImage : ICommand
var key = arguments["key"].Value.ToLower();
var images = db.Images.Where(i => i.Key == key);
if (!await images.AnyAsync(ctx)) return;
var settings = await Helpers.GetMultipleValues([
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.BotImageRandomSliceDivideBy, BuiltIn.Keys.BotImagePigCubeSelfDestruct,
BuiltIn.Keys.BotImageInvertedCubeUrl, BuiltIn.Keys.BotImagePigCubeSelfDestructMin,
BuiltIn.Keys.BotImagePigCubeSelfDestructMax, BuiltIn.Keys.BotImageInvertedPigCubeSelfDestructDelay

View File

@@ -22,7 +22,7 @@ public class JuiceCommand : ICommand
// Have to attach the entity because it is coming from another DB context
// https://stackoverflow.com/questions/52718652/ef-core-sqlite-sqlite-error-19-unique-constraint-failed
db.Users.Attach(user);
var juicerSettings = await Helpers.GetMultipleValues([
var juicerSettings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.JuiceAmount, BuiltIn.Keys.JuiceCooldown, BuiltIn.Keys.JuiceLoserDivision,
BuiltIn.Keys.GambaSeshDetectEnabled, BuiltIn.Keys.JuiceAllowedWhileStreaming,
BuiltIn.Keys.TwitchBossmanJackUsername, BuiltIn.Keys.JuiceAutoDeleteMsgDelay

View File

@@ -49,7 +49,7 @@ public class CrackedCommand : ICommand
{
var logger = LogManager.GetCurrentClassLogger();
var msg = arguments["msg"].Value.TrimStart('/');
var settings = await Helpers.GetMultipleValues([
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.CrackedZalgoFuckUpMode, BuiltIn.Keys.CrackedZalgoFuckUpPosition
]);
var zalgo = new ZalgoString(msg, (FuckUpMode)settings[BuiltIn.Keys.CrackedZalgoFuckUpMode].ToType<int>(),
@@ -70,7 +70,7 @@ public class CleanCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var settings =
await Helpers.GetMultipleValues([BuiltIn.Keys.BotCleanStartTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
await SettingsProvider.GetMultipleValuesAsync([BuiltIn.Keys.BotCleanStartTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
var start = settings[BuiltIn.Keys.BotCleanStartTime];
if (start.Value == null)
{
@@ -93,7 +93,7 @@ public class RehabCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var settings =
await Helpers.GetMultipleValues([BuiltIn.Keys.BotRehabEndTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
await SettingsProvider.GetMultipleValuesAsync([BuiltIn.Keys.BotRehabEndTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
var end = settings[BuiltIn.Keys.BotRehabEndTime];
if (end.Value == null)
{
@@ -123,7 +123,7 @@ public class NextPoVisitCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(120);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var time = await Helpers.GetValue(BuiltIn.Keys.BotPoNextVisit);
var time = await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotPoNextVisit);
if (time.Value == null)
{
await botInstance.SendChatMessageAsync("There is no next PO visit :(", true);
@@ -162,7 +162,7 @@ public class NextCourtHearingCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(120);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var hearings = (await Helpers.GetValue(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
var hearings = (await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotCourtCalendar)).JsonDeserialize<List<CourtHearingModel>>();
if (hearings == null)
{
await botInstance.SendChatMessageAsync("Caught a null when grabbing hearings", true);
@@ -217,7 +217,7 @@ public class JailCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var settings = await Helpers.GetMultipleValues([BuiltIn.Keys.BotJailStartTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
var settings = await SettingsProvider.GetMultipleValuesAsync([BuiltIn.Keys.BotJailStartTime, BuiltIn.Keys.TwitchBossmanJackUsername]);
var start = settings[BuiltIn.Keys.BotJailStartTime];
if (start.Value == null)
{
@@ -248,7 +248,7 @@ public class LastStreamCommand : ICommand
var timespan = DateTimeOffset.UtcNow - latest.Time;
var agt = TimeZoneInfo.ConvertTime(latest.Time, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
// The table doesn't contain the name of the person so we'll just have to assume it's his Twitch username
var username = await Helpers.GetValue(BuiltIn.Keys.TwitchBossmanJackUsername);
var username = await SettingsProvider.GetValueAsync(BuiltIn.Keys.TwitchBossmanJackUsername);
await botInstance.SendChatMessageAsync($"{username.Value} last streamed on Twitch approximately {timespan.Humanize(precision: 2, minUnit: TimeUnit.Minute, maxUnit: TimeUnit.Hour)} ago at {agt:dddd h:mm tt} AGT", true);
}
}
@@ -263,7 +263,7 @@ public class AlmanacCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var text = await Helpers.GetValue(BuiltIn.Keys.BotAlmanacText);
var text = await SettingsProvider.GetValueAsync(BuiltIn.Keys.BotAlmanacText);
if (message.MessageRaw.Contains("almanac plain"))
{
await botInstance.SendChatMessageAsync($"@{user.KfUsername}, [plain]{text.Value}", true);

View File

@@ -43,7 +43,7 @@ public class RainbetRecentBetCommand : ICommand
public TimeSpan Timeout => TimeSpan.FromSeconds(10);
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments, CancellationToken ctx)
{
var settings = await Helpers.GetMultipleValues([
var settings = await SettingsProvider.GetMultipleValuesAsync([
BuiltIn.Keys.KiwiFarmsGreenColor, BuiltIn.Keys.KiwiFarmsRedColor, BuiltIn.Keys.HowlggDivisionAmount
]);
await using var db = new ApplicationDbContext();

View File

@@ -19,7 +19,7 @@ public class GetRestreamCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var url = await Helpers.GetValue(BuiltIn.Keys.RestreamUrl);
var url = await SettingsProvider.GetValueAsync(BuiltIn.Keys.RestreamUrl);
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, restream URL: {url.Value}", true);
}
}
@@ -37,7 +37,7 @@ public class SetRestreamCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
await Helpers.SetValue(BuiltIn.Keys.RestreamUrl, arguments["url"].Value);
await SettingsProvider.SetValueAsync(BuiltIn.Keys.RestreamUrl, arguments["url"].Value);
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, updated URL", true);
}
}
@@ -55,7 +55,7 @@ public class SetShillRestreamCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
await Helpers.SetValue(BuiltIn.Keys.TwitchCommercialRestreamShillMessage, arguments["url"].Value);
await SettingsProvider.SetValueAsync(BuiltIn.Keys.TwitchCommercialRestreamShillMessage, arguments["url"].Value);
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, updated URL for the commercial break restream shill", true);
}
}
@@ -73,7 +73,7 @@ public class SelfPromoCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var channels = Helpers.GetValue(BuiltIn.Keys.KickChannels).Result.JsonDeserialize<List<KickChannelModel>>();
var channels = SettingsProvider.GetValueAsync(BuiltIn.Keys.KickChannels).Result.JsonDeserialize<List<KickChannelModel>>();
var channel = channels.FirstOrDefault(ch => ch.ForumId == user.KfId);
if (channel == null)
{
@@ -98,7 +98,7 @@ public class GetRestreamPlainCommand : ICommand
public async Task RunCommand(ChatBot botInstance, MessageModel message, UserDbModel user, GroupCollection arguments,
CancellationToken ctx)
{
var url = await Helpers.GetValue(BuiltIn.Keys.RestreamUrl);
var url = await SettingsProvider.GetValueAsync(BuiltIn.Keys.RestreamUrl);
await botInstance.SendChatMessageAsync($"@{message.Author.Username}, restream URL: [plain]{url.Value}", true);
}
}