public static async Task Add <T>(this IGameDatabase db, params string [] databaseIndexes) where T : IDatabaseEntry { var entryListData = await db.GetData <EntryListData>(typeof(T).Name); bool doAdd = false; if (entryListData == null) { entryListData = new EntryListData() { Type = typeof(T).Name }; //signal that we need to add this to the EntryListData itself doAdd = entryListData.Type != entryListData.GetType().Name; } foreach (var dbEntry in databaseIndexes) { if (!entryListData.Entries.Contains(dbEntry)) { entryListData.Entries.Add(dbEntry); } } if (doAdd) { await db.Add(entryListData); } await db.SaveData(entryListData); }
public static async Task AddTag(this IGameDatabase db, string unicode, string fancyName, ITagsList tagsList = null) { string emojiDatabaseIndex = string.Join(" ", Encoding.UTF8.GetBytes(unicode)); //now check if we exist TagData tagData = await db.GetData <TagData>(emojiDatabaseIndex); if (tagData == null) { tagData = new TagData() { Name = emojiDatabaseIndex, Emoji = unicode, FancyName = fancyName, }; await db.SaveData(tagData); } await db.Add(tagData); if (tagsList != null && !tagsList.Tags.Contains(emojiDatabaseIndex)) { tagsList.Tags.Add(emojiDatabaseIndex); } }
/// <summary> /// Ideally these two should not be used whatsoever, please deprecate after moving the code over /// </summary> /// <typeparam name="T"></typeparam> /// <param name="db"></param> /// <param name="databaseIndexes"></param> public static async Task <List <T> > GetAllData <T>(this IGameDatabase db, List <string> databaseIndexes) where T : IDatabaseEntry { List <T> dataList = new List <T>(); foreach (var entryIndex in databaseIndexes) { dataList.Add(await db.GetData <T>(entryIndex)); } return(dataList); }
public static async Task <List <string> > GetAll <T>(this IGameDatabase db) where T : IDatabaseEntry { List <string> databaseIndexes = new List <string>(); var entryListData = await db.GetData <EntryListData>(typeof(T).Name); if (entryListData != null) { databaseIndexes.AddRange(entryListData.Entries); } return(databaseIndexes); }
private static async Task IteratorTask <T>(IGameDatabase db, string dataName, Func <T, Task <bool> > callback, List <Task> tasks, CancellationTokenSource tokenSource) where T : IDatabaseEntry { if (tokenSource.IsCancellationRequested) { return; } T iterateItem = await db.GetData <T>(dataName); if (!await callback(iterateItem)) { tokenSource.Cancel(); //immediately clear the tasks list so we don't await anything for no reason anymore //the tasks may still run but they won't get any further than the cancellation request check tasks.Clear(); } }
public static async Task <Dictionary <string, IDatabaseEntry> > GetBackup <T>(this IGameDatabase db) where T : IDatabaseEntry { var entryNames = await db.GetAll <T>(); var dataTasks = new List <Task <T> >(); foreach (var entryName in entryNames) { dataTasks.Add(db.GetData <T>(entryName)); } await Task.WhenAll(dataTasks); var allData = dataTasks.Select(x => { var value = x.Result; return(new KeyValuePair <string, IDatabaseEntry>(value.DatabaseIndex, value)); }).ToDictionary(x => x.Key, x => x.Value); return(allData); }
public static async Task <Dictionary <string, Dictionary <string, IDatabaseEntry> > > GetBackup(this IGameDatabase db) { var mainCollection = new Dictionary <string, Dictionary <string, IDatabaseEntry> > { [nameof(EntryListData)] = new Dictionary <string, IDatabaseEntry>(), [nameof(RoundData)] = new Dictionary <string, IDatabaseEntry>(), [nameof(MatchData)] = new Dictionary <string, IDatabaseEntry>(), [nameof(LevelData)] = new Dictionary <string, IDatabaseEntry>(), [nameof(TagData)] = new Dictionary <string, IDatabaseEntry>(), [nameof(PlayerData)] = new Dictionary <string, IDatabaseEntry>(), }; foreach (var entryName in await db.GetAll <EntryListData>()) { mainCollection [nameof(EntryListData)] [entryName] = await db.GetData <EntryListData>(entryName); } foreach (var entryName in await db.GetAll <RoundData>()) { mainCollection [nameof(RoundData)] [entryName] = await db.GetData <RoundData>(entryName); } foreach (var entryName in await db.GetAll <MatchData>()) { mainCollection [nameof(MatchData)] [entryName] = await db.GetData <MatchData>(entryName); } foreach (var entryName in await db.GetAll <LevelData>()) { mainCollection [nameof(LevelData)] [entryName] = await db.GetData <LevelData>(entryName); } foreach (var entryName in await db.GetAll <TagData>()) { mainCollection [nameof(TagData)] [entryName] = await db.GetData <TagData>(entryName); } foreach (var entryName in await db.GetAll <PlayerData>()) { mainCollection [nameof(PlayerData)] [entryName] = await db.GetData <PlayerData>(entryName); } return(mainCollection); }
internal static async Task <Video> GetVideoDataForDatabaseItem <T>(IGameDatabase DB, T data) where T : IPlayersList, IStartEnd, IWinner, IDatabaseEntry, IVideoUpload { string mainWinners = await GetAllWinners(DB, data); string description = string.Empty; string privacystatus = "unlisted"; if (data.VideoType == VideoType.VideoLink) { description = $"Recorded on {DB.SharedSettings.DateTimeToString( data.TimeStarted )}\nThe winner is {mainWinners}"; } //only update the description for the main video if (data.VideoType == VideoType.MergedVideoLink && data is MatchData matchData) { privacystatus = "public"; var builder = new StringBuilder(); builder .Append($"Recorded on {DB.SharedSettings.DateTimeToString( data.TimeStarted )}") .AppendLine() .Append($"The winner is {mainWinners}") .AppendLine() .AppendLine() .Append($"Rounds: {matchData.Rounds.Count}") .AppendLine(); //now add the rounds down here so that the whole youtube chaptering thing works foreach (var roundName in matchData.Rounds) { var roundData = await DB.GetData <RoundData>(roundName); builder .Append($"{roundData.VideoStartTime:mm\\:ss} - {data.DatabaseIndex} {await GetAllWinners( DB , roundData ) }") .AppendLine(); } description = builder.ToString(); } Video videoData = new Video() { Snippet = new VideoSnippet() { Title = $"{data.DatabaseIndex} {mainWinners}", Tags = new List <string>() { "duckgame", "peniscorp" }, CategoryId = "20", Description = description, }, Status = new VideoStatus() { PrivacyStatus = privacystatus, MadeForKids = false, }, RecordingDetails = new VideoRecordingDetails() { RecordingDate = data.TimeStarted.ToString("s", CultureInfo.InvariantCulture), } }; return(videoData); }