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);
        }
Example #8
0
        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);
        }