using System.Diagnostics.CodeAnalysis; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reactive.Threading.Tasks; using InnovEnergy.App.RemoteSupportConsole; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VictronVRM; using SQLite; using static System.Text.Json.JsonSerializer; using Installation = InnovEnergy.App.VrmGrabber.DataTypes.Installation; namespace InnovEnergy.App.VrmGrabber.Database; public class InstallationDetails { public InstallationDetails(String ip, IReadOnlyList details) { Details = details; Ip = ip; } public IReadOnlyList? Details { get; set; } public String Ip { get; set; } } public static partial class Db { internal const String DbPath = "./db.sqlite"; public static Dictionary InstallationsAndDetails; 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(); });// on startup create/migrate tables 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 fileContent = await File.ReadAllTextAsync("./token.json"); var acc = Deserialize(fileContent); var user = VrmAccount.Token(acc.idUser, acc.token); var installations = await user.GetInstallations(); return installations .Do(i=>i.Name.WriteLine()) .ToDictionary(i => i, i => new InstallationDetails(VpnInfo.LookUpIp(i.Identifier, i.GetDetails().Result.MachineSerial()).Result ?? "Unknown",i.GetDetails().Result)); } } public class AccToken { public UInt64 idUser { get; init;} public String token { get; init;} }