using System.Diagnostics.CodeAnalysis; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reactive.Threading.Tasks; using System.Text.Json; using Flurl.Util; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VictronVRM; using SQLite; using Installation = InnovEnergy.App.Backend.DataTypes.Installation; namespace InnovEnergy.App.Backend.Database; public static partial class Db { public static Dictionary> InstallationsAndDetails; internal const String DbPath = "./db.sqlite"; private static SQLiteConnection Connection { get; } = new SQLiteConnection(DbPath); public static TableQuery Installations => Connection.Table(); public static void Init() { // used to force static constructor } static Db() { // on startup create/migrate tables Connection.RunInTransaction(() => { // Connection.CreateTable(); }); InstallationsAndDetails = new Dictionary>(); Observable.Interval(TimeSpan.FromMinutes(5)) .ObserveOn(TaskPoolScheduler.Default) .SubscribeOn(TaskPoolScheduler.Default) .StartWith(0) // Do it right away (on startup) .Select(UpdateInstallationsAndDetailsFromVrm) .Select(t => t.ToObservable()) .Concat() .Subscribe(d => InstallationsAndDetails = d, exception => exception.WriteLine()); } [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] private static async Task>> UpdateInstallationsAndDetailsFromVrm(Int64 _) { var content = await File.ReadAllTextAsync("./token.json"); var acc = JsonSerializer.Deserialize(content)!; using var user = VrmAccount.Token(acc.idUser, acc.token); var installations = await user.GetInstallations(); return installations .Do(i=>i.Name.WriteLine()) .ToDictionary(i => i, i => i.GetDetails().Result); } } public class AccToken { public UInt64 idUser; public String token; }