Skip to content

Commit

Permalink
[Bot] Completed db pattern redesign
Browse files Browse the repository at this point in the history
  • Loading branch information
Pythonic-Rainbow committed Sep 19, 2024
1 parent 4ba24d3 commit 2e4c7c1
Show file tree
Hide file tree
Showing 13 changed files with 72 additions and 88 deletions.
2 changes: 1 addition & 1 deletion Bot/Clash/Coc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private static void CheckMembersJoined(ClanUtil clan)

string[] members = [.. clan._joiningMembers.Keys];
Member[] memberObjects = [.. members.Select(memberId => new Member(memberId))];

Check warning on line 43 in Bot/Clash/Coc.cs

View workflow job for this annotation

GitHub Actions / inspect

"[IDE0320] Anonymous function can be made static" on /home/runner/work/Hyperstellar/Hyperstellar/Bot/Clash/Coc.cs(43,53)
DbObj.InsertAll(memberObjects);
Db.InsertAll(memberObjects);
string membersMsg = string.Join(", ", members);
Console.WriteLine($"{membersMsg} joined");

Expand Down
4 changes: 2 additions & 2 deletions Bot/Clash/Phaser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ private static void ProcessRaid(ClanCapitalRaidSeason season)

private static void Init()
{
IEnumerable<IGrouping<long, Main>> donationGroups = Db.GetDonations()
IEnumerable<IGrouping<long, Main>> donationGroups = Main.FetchAll()
.GroupBy(d => d.Checked)

Check warning on line 61 in Bot/Clash/Phaser.cs

View workflow job for this annotation

GitHub Actions / inspect

"[IDE0320] Anonymous function can be made static" on /home/runner/work/Hyperstellar/Hyperstellar/Bot/Clash/Phaser.cs(61,22)
.OrderBy(g => g.Key);

Check warning on line 62 in Bot/Clash/Phaser.cs

View workflow job for this annotation

GitHub Actions / inspect

"[IDE0320] Anonymous function can be made static" on /home/runner/work/Hyperstellar/Hyperstellar/Bot/Clash/Phaser.cs(62,22)
DateTimeOffset now = DateTimeOffset.UtcNow;
Expand Down Expand Up @@ -103,7 +103,7 @@ private static void DonationChanged(IEnumerable<Tuple<string, int>> donations)
Main main = new Member(tag).GetEffectiveMain();
main.Donated += (uint)donated;
Console.WriteLine($"[Donate25] {tag} {donated}");
Db.UpdateMain(main);
main.Update();
}
}

Expand Down
8 changes: 4 additions & 4 deletions Bot/Discord/Cmds.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public async Task ShutdownAsync(bool commit = true)
{
if (commit)
{
DbObj.Commit();
Db.Commit();
}
await RespondAsync("Ok", ephemeral: true);
Environment.Exit(0);
Expand All @@ -26,7 +26,7 @@ public async Task ShutdownAsync(bool commit = true)
[SlashCommand("commit", "[Owner] Commits db")]
public async Task CommitAsync()
{
DbObj.Commit();
Db.Commit();
await RespondAsync("Committed", ephemeral: true);
}

Expand Down Expand Up @@ -134,7 +134,7 @@ public async Task InfoAsync(Member clanMember)
[SlashCommand("alias", "[Admin] Sets an alias for a Coc member")]
public async Task AliasAsync(string alias, Member member)
{
bool success = Db.AddAlias(alias, member);
bool success = new CocAlias(alias, member.CocId).Insert() == 1;
if (success)
{
await RespondAsync($"`{alias}` is now an alias of `{member.GetName()}`");
Expand All @@ -149,7 +149,7 @@ public async Task AliasAsync(string alias, Member member)
public async Task AliasesAsync()
{
string msg = "";
foreach (CocMemberAlias alias in Db.GetAliases())
foreach (CocAlias alias in CocAlias.FetchAll())
{
ClanMember? clanMember = Coc.TryGetMember(alias.CocId);
string name = clanMember == null ? "" : clanMember.Name;
Expand Down
4 changes: 2 additions & 2 deletions Bot/Discord/MemberConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public override Task<TypeConverterResult> ReadAsync(IInteractionContext context,
ulong uid = Convert.ToUInt64(captured[2..^1].ToString()); // 123

// Checks whether this Discord user is linked to a main
Main? main = Db.GetMainByDiscord(uid);
Main? main = Main.TryFetchByDiscord(uid);
if (main == null)
{
return TypeConverters.Error("This Discord user isn't linked to any CoC account.");
Expand All @@ -47,7 +47,7 @@ public override Task<TypeConverterResult> ReadAsync(IInteractionContext context,
}

// Check whether input matches an alias
CocMemberAlias? dbAlias = Db.TryGetAlias(input);
CocAlias? dbAlias = CocAlias.TryFetch(input);
if (dbAlias != null)
{
// Check whether the coc account of the alias is still in the clan
Expand Down
2 changes: 1 addition & 1 deletion Bot/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,5 +98,5 @@ internal static async Task TryUntilAsync(Func<Task> tryFunc, Func<Exception, Tas
}

public static async Task Main() =>
await Task.WhenAll(Discord.Dc.InitAsync(), Clash.Coc.InitAsync(), Sql.DbObj.InitAsync());
await Task.WhenAll(Discord.Dc.InitAsync(), Clash.Coc.InitAsync(), Sql.Db.InitAsync());
}
15 changes: 0 additions & 15 deletions Bot/Sql/Alias.cs

This file was deleted.

10 changes: 4 additions & 6 deletions Bot/Sql/Alt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Hyperstellar.Sql;

public sealed class Alt(string altId, string mainId)
public sealed class Alt(string altId, string mainId) : DbObj<Alt>
{
[PrimaryKey, NotNull]
public string AltId { get; set; } = altId;
Expand All @@ -12,15 +12,13 @@ public sealed class Alt(string altId, string mainId)

public Alt() : this("", "") { }

public TableQuery<Alt> GetOtherAlts() => Db.s_db.Table<Alt>().Where(a => a.MainId == MainId && a.AltId != AltId);
public TableQuery<Alt> GetOtherAlts() => FetchAll().Where(a => a.MainId == MainId && a.AltId != AltId);

public Main GetMain() => Db.s_db.Table<Main>().Where(m => m.MainId == MainId).First();
public Main GetMain() => Main.FetchAll().First(m => m.MainId == MainId);

public bool UpdateMain(string id)
{
MainId = id;
return Db.s_db.Update(this) == 1;
return s_db.Update(this) == 1;
}

public bool Delete() => Db.s_db.Delete(this) == 1;
}
2 changes: 1 addition & 1 deletion Bot/Sql/BotAdmin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Hyperstellar.Sql;

internal sealed class BotAdmin(ulong id) : DbObj
internal sealed class BotAdmin(ulong id) : DbObj<BotAdmin>
{
internal static readonly HashSet<ulong> s_admins = s_db.Table<BotAdmin>().Select(a => a.Id).ToHashSet();

Check warning on line 7 in Bot/Sql/BotAdmin.cs

View workflow job for this annotation

GitHub Actions / inspect

"[IDE0320] Anonymous function can be made static" on /home/runner/work/Hyperstellar/Hyperstellar/Bot/Sql/BotAdmin.cs(7,86)

Expand Down
27 changes: 27 additions & 0 deletions Bot/Sql/CocAlias.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using SQLite;

namespace Hyperstellar.Sql;

[Table("Alias")]
public sealed class CocAlias(string alias, string cocId) : DbObj<CocAlias>
{
private string _alias = alias.ToLower();

[PrimaryKey, NotNull]
public string Alias
{
get => _alias;
set => _alias = value.ToLower();
}

[NotNull]
public string CocId { get; set; } = cocId;

public CocAlias() : this("", "") { }

internal static CocAlias? TryFetch(string alias)
{
alias = alias.ToLower();
return FetchAll().FirstOrDefault(a => a.Alias == alias);
}
}
41 changes: 25 additions & 16 deletions Bot/Sql/Db.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,38 @@
using System.Collections;
using SQLite;

namespace Hyperstellar.Sql;

internal static class Db
public abstract class Db
{
internal static readonly SQLiteConnection s_db = DbObj.s_db;
private protected static readonly SQLiteConnection s_db = new("Hyperstellar.db");

internal static Main? GetMainByDiscord(ulong uid) => s_db.Table<Main>().FirstOrDefault(m => m.Discord == uid);

internal static IEnumerable<Main> GetDonations() => s_db.Table<Main>();

internal static bool UpdateMain(Main main) => s_db.Update(main) == 1;

internal static CocMemberAlias? TryGetAlias(string alias)
internal static void Commit()
{
alias = alias.ToLower();
return s_db.Table<CocMemberAlias>().FirstOrDefault(a => a.Alias == alias);
s_db.Commit();
s_db.BeginTransaction();
}

internal static IEnumerable<CocMemberAlias> GetAliases() => s_db.Table<CocMemberAlias>();
internal static int InsertAll(IEnumerable objects) => s_db.InsertAll(objects);

internal static bool AddAlias(string alias, Member member)
internal static async Task InitAsync()
{
CocMemberAlias cocMemberAlias = new(alias.ToLower(), member.CocId);
int count = s_db.Insert(cocMemberAlias);
return count == 1;
s_db.BeginTransaction();
await Program.TryUntilAsync(async () =>

Check warning on line 21 in Bot/Sql/Db.cs

View workflow job for this annotation

GitHub Actions / inspect

"[IDE0320] Anonymous function can be made static" on /home/runner/work/Hyperstellar/Hyperstellar/Bot/Sql/Db.cs(21,37)
{
await Task.Delay(5 * 60 * 1000);
Commit();
}, runForever: true);
}

internal virtual int Insert() => s_db.Insert(this);

internal int Delete() => s_db.Delete(this);

internal int Update() => s_db.Update(this);
}

public abstract class DbObj<T> : Db where T : DbObj<T>, new()
{
internal static TableQuery<T> FetchAll() => s_db.Table<T>();
}
32 changes: 0 additions & 32 deletions Bot/Sql/DbObj.cs

This file was deleted.

7 changes: 3 additions & 4 deletions Bot/Sql/Main.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using SQLite;

namespace Hyperstellar.Sql;

public sealed class Main(string id) : DbObj
public sealed class Main(string id) : DbObj<Main>
{
[PrimaryKey, NotNull]
public string MainId { get; set; } = id;
Expand All @@ -21,7 +20,7 @@ public sealed class Main(string id) : DbObj

public Main() : this("") { }

internal static Main? TryFetch(string id) => s_db.Table<Main>().FirstOrDefault(d => d.MainId == id);
internal static Main? TryFetch(string id) => FetchAll().FirstOrDefault(d => d.MainId == id);

public bool Update() => Db.s_db.Update(this) == 1;
internal static Main? TryFetchByDiscord(ulong uid) => FetchAll().FirstOrDefault(m => m.Discord == uid);
}
6 changes: 2 additions & 4 deletions Bot/Sql/Member.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using SQLite;

namespace Hyperstellar.Sql;
public class Member(string cocId) : DbObj
public class Member(string cocId) : DbObj<Member>
{
internal static event Action<Main, Main>? EventAltAdded;

Expand All @@ -11,14 +11,12 @@ public class Member(string cocId) : DbObj

public Member() : this("") { }

internal static IEnumerable<Member> FetchAll() => s_db.Table<Member>();

internal static Member? TryFetch(string cocId) => s_db.Table<Member>().FirstOrDefault(m => m.CocId == cocId);

public void AddAlt(Member altMember)
{
Alt alt = new(altMember.CocId, CocId);
s_db.Insert(alt);
alt.Insert();
Main altMain = Main.TryFetch(altMember.CocId)!;
Main mainMain = Main.TryFetch(CocId)!;
EventAltAdded!(altMain, mainMain);
Expand Down

0 comments on commit 2e4c7c1

Please sign in to comment.