using System; using System.Linq; using System.Numerics; using System.Threading.Tasks; using System.Collections.Generic; using Console = HyperCube.Utils.AdvConsole; using Microsoft.AspNetCore.Components; namespace HyperCube.Models { public enum Role { Admin = 1, Verifier, Initiator, Requester } public class AccountModel { [Inject] AppData AppData { get; set; } //public event EventHandler RolesChanged; public Action RolesChanged; public byte bsel; public byte blockchain_selected { get { return bsel; } set { bsel = value; bcselupdate(); } } public List Roles = new(); public void AddRole(Role role) { Roles.Add(role); RolesChanged?.Invoke(Roles.Count); Console.WriteLine($"role added, count: {Roles.Count}"); } async Task bcselupdate() { await MySQLConnector.Instance().SQLInsert($"update aspnetusers set blockchain_selected = {blockchain_selected} where Id='{UUID}'"); } public void RemoveRole(Role role) { Roles.Remove(role); RolesChanged?.Invoke(Roles.Count); Console.WriteLine($"role removed, сount: {Roles.Count}"); } //public Dictionary Loaded = new(); //public AccountModel Current; public string ETH_Address { get; set; } public string ETH_Address1 { get; set; } public string UUID { get; set; } public string Name { get; set; } public string Email { get; set; } public string PWDHash { get; set; } public Role AccRole { get; set; } public string GetActualAddress(Blockchain bc) { string addr; if (bc.port == 8666) addr = ETH_Address1; else addr = ETH_Address; return addr; } public async Task GetOrCreateActualAddress(Blockchain bc) { string addr; if (bc.port == 8666) addr = ETH_Address1; else addr = ETH_Address; if (addr == null || addr == "") addr = await bc.CreateBlockchainAccount(this, PWDHash); return addr; } public void SetActualAddress(string value, Blockchain bc) { if (bc.port == 8666) ETH_Address1 = value; else ETH_Address = value; } public AccountModel() { } public AccountModel GetCurrent() { return AppData.CurrentAccount; } public async Task FindByMail(string mail) { var loaded = await AppData.LoadAccounts(); var selectedUsers = from user in loaded.Values where user.Email == mail select user; return selectedUsers.First(); } public async Task Find(string uuid) { var loaded = await AppData.LoadAccounts(); if (uuid == null) return null; if (loaded.ContainsKey(uuid)) return loaded[uuid]; else return null; } public static BigInteger ConvertBalance(string hex) { if (hex != null && hex.Length > 0) { Console.WriteLine($"ConvertBalance {hex}"); string newHex = hex.Remove(0, 2); var balance = System.Numerics.BigInteger.Parse("0" + newHex, System.Globalization.NumberStyles.HexNumber); Console.WriteLine($"ConvertBalance {hex} {balance}"); return balance; } return 0; } //public static async void InitializeAccounts() //{ // Loaded = await MySQLConnector.Instance().SQLSelectASPUsers(); // Console.WriteLine("InitializeAccounts"); // foreach (var acc in Loaded) // { // acc.Value.LoadRoles(); // var wallets = await MySQLConnector.Instance().SQLSelectComplex($"select * from account_wallets where account_uuid='{acc.Value.UUID}'"); // if (wallets.Count > 0) // { // foreach (var wallet in wallets) // { // var bc_id = Convert.ToInt32(wallet["blockchain_id"]); // var wallet_id = Convert.ToString(wallet["uuid"]); // if (bc_id == 0) // acc.Value.eth_address = wallet_id; // else // acc.Value.eth_address1 = wallet_id; // Console.WriteLine($"acc {acc.Value.Name} wallet0 {acc.Value.eth_address} wallet1 {acc.Value.eth_address1}"); // } // } // } //} public async void LoadRoles() { var rolesSQL = await MySQLConnector.Instance().SQLSelectComplex($"select * from account_roles where account_uuid ='{this.UUID}'"); if (rolesSQL.Count > 0) { foreach (var role in rolesSQL) { var role_id = Convert.ToUInt32(role["role_id"]); AccRole = (Role) role_id; if (!Roles.Contains(AccRole)) { Console.WriteLine($"LoadRoles uuid {UUID} roleid {role_id} AccRole {AccRole}"); AddRole(AccRole); } //functionId = Convert.ToInt32(role["id"]); //functionName = role["name_with_args"].ToString(); //functionCompiledHeader = role["compiled_header"].ToString(); //Console.WriteLine($"{ID} LoadFunction {functionId} name {functionName} header {functionCompiledHeader}"); } } } //public async Task CreateEthAddress(string pass) //{ // var addr = await Blockchain.GetMain().CreateBlockchainAccount(this, pass); //} public async Task GetBalance() { var res = await Blockchain.GetMain().GetBalance(this); var balanceInt = ConvertBalance(res); string balance = balanceInt.ToString(); //Console.WriteLine($"GetBalance {balance}"); return balance; } } }