using DSACore.DSA_Game.Characters; using DSACore.Models.Database; using Firebase.Database; using Firebase.Database.Query; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using DSACore.Models.Database.DSA; using DSACore.Models.Database.Groups; namespace DSACore.FireBase { public static class Database { public static FirebaseClient firebase; static Database() { var auth = File.ReadAllText(DSACore.DSA_Game.Dsa.rootPath + "Token"); ; // your app secret firebase = new FirebaseClient( "https://heldenonline-4d828.firebaseio.com/", new FirebaseOptions { AuthTokenAsyncFactory = () => Task.FromResult(auth) }); Initialize(); } private static async Task Initialize() { IntializeCollection("Chars", Chars); IntializeCollection("MeleeWeapons", MeleeList); IntializeCollection("RangedWeapons", RangedWeapons); IntializeCollection("Talents", Talents); IntializeCollection("Spells", Spells); } private static async Task IntializeCollection(string path, Dictionary list) { var temp = await firebase .Child(path) .OrderByKey() .OnceAsync(); foreach (var firebaseObject in temp) { list.Add(firebaseObject.Key, firebaseObject.Object); } } public static Dictionary Chars = new Dictionary(); public static Dictionary MeleeList = new Dictionary(); public static Dictionary RangedWeapons = new Dictionary(); public static Dictionary Talents = new Dictionary(); public static Dictionary Spells = new Dictionary(); public static async Task AddChar(Character file, Models.Network.Group group) { DatabaseChar.LoadChar(file, out GroupChar groupChar, out DatabaseChar data); var lastChar = await firebase .Child("Chars") .OrderByKey() .LimitToLast(1) .OnceAsync(); int id = groupChar.Id = data.Id = lastChar.First().Object.Id + 1; await firebase //TODO Reomve await Operators .Child("Groups") .Child("Char" + id) .PutAsync(groupChar); await firebase .Child("Chars") .Child("Char" + id) .PutAsync(data); Chars["Char" + id] = data; await firebase .Child("Inventories") .Child("Inventory" + id) .PutAsync(new Inventory()); return id + 1; } public static async Task RemoveChar(int id) { await firebase .Child("Groups") .Child("Char" + id) .DeleteAsync(); await firebase .Child("Chars") .Child("Char" + id) .DeleteAsync(); Chars.Remove("Char" + id); await firebase .Child("Inventories") .Child("Inventory" + id) .DeleteAsync(); } public static async Task GetChar(int id) { /*var chr = await firebase .Child("Chars") .Child("Char" + id) .OnceSingleAsync(); return chr;*/ return Chars["Char" + id]; } public static async Task GetInventory(int id) { var inv = await firebase .Child("Inventories") .Child("Inventory" + id) .OnceSingleAsync(); return inv; } public static async Task SetInventory(int id, Inventory inv) { await firebase .Child("Inventories") .Child("Inventory" + id) .PutAsync(inv); } public static async Task AddTalent(Talent tal) { await firebase .Child("Talents") .Child(tal.Name) .PutAsync(tal); } public static async Task RemoveTalent(string talent) { await firebase .Child("Talents") .Child(talent) .DeleteAsync(); } public static async Task GetTalent(string talent) {/* return await firebase .Child("Talents") .Child(talent) .OnceSingleAsync();*/ return Talents[talent]; } public static async Task AddSpell(GeneralSpell tal) { await firebase .Child("Spells") .Child(tal.Name) .PutAsync(tal); } public static async Task RemoveSpell(string spell) { await firebase .Child("Spells") .Child(spell) .DeleteAsync(); } public static async Task GetSpell(string spell) { /*return await firebase .Child("Spells") .Child(spell) .OnceSingleAsync();*/ return Spells[spell]; } public static async Task AddWeapon(Weapon wep) { string collection = wep.GetType() == typeof(MeleeWeapon) ? "MeleeWeapons" : "RangedWeapons"; await firebase .Child(collection) .Child(wep.Name) .PutAsync(wep); } public static async Task RemoveWeapon(string weapon, bool ranged = false) { string collection = ranged ? "RangedWeapons" : "MeleeWeapons"; await firebase .Child(collection) .Child(weapon) .DeleteAsync(); } public static async Task GetWeapon(string weapon, bool ranged = false) { string collection = ranged ? "RangedWeapons" : "MeleeWeapons"; return await firebase .Child(collection) .Child(weapon) .OnceSingleAsync(); } public static async Task> GetGroups() { var groups = await firebase .Child("Groups") .OrderByKey() .OnceAsync(); var ret = new List(); foreach (var firebaseObject in groups) { ret.Add(new Models.Network.Group(firebaseObject.Object.Name, firebaseObject.Object.Password)); } return ret; } public static async Task GetGroup(int id) { var group = await firebase .Child("Groups") .Child("Group" + id) .OnceSingleAsync(); return group; } public static async Task AddGroup(Group group) { var lastChar = await firebase .Child("Groups") .OrderByKey() .LimitToLast(1) .OnceAsync(); int id = group.Id = lastChar.First().Object.Id + 1; await firebase .Child("Groups") .Child("Group" + id) .PutAsync(group); } public static async void SetGroup(Group group) { await firebase .Child("Groups") .Child("Group" + group.Id) .PutAsync(group); } public static async void DeleteGroup(int id) { await firebase .Child("Groups") .Child("Group" + id) .DeleteAsync(); } } }