private void ParseEvent()
        {
            //Never re-parse a valid object
            if (IsValid)
            {
                return;
            }

            if (_dataService.RSettings.ProgramSettings.Debug)
            {
                _ = _log.LogMessage($"Event description BEFORE stripping:\n{Description}\n", false,
                                    color: LOG_COLOR);
            }

            //Replace <br>s with \n for new line, replace &nbsp as well
            var strippedHtml = Description.Replace("<br>", "\n").Replace("&nbsp;", "");

            //Strip out HTML tags
            strippedHtml = Regex.Replace(strippedHtml, "<.*?>", string.Empty);

            if (_dataService.RSettings.ProgramSettings.Debug)
            {
                _ = _log.LogMessage($"Event description AFTER stripping:\n{strippedHtml}\n", false, color: LOG_COLOR);
            }

            // Splits description into lines and keeps only the part after the colon, if one exists.
            var description = strippedHtml.Trim().Split('\n')
                              .Select(line => line.Substring(line.IndexOf(':') + 1).Trim())
                              .ToImmutableArray();

            //Creators
            Creators = _dataService.GetSocketUsers(description.ElementAtOrDefault(0), ',');

            //Imgur Album
            ImageGallery = GeneralUtil.ValidateUri(description.ElementAtOrDefault(1));

            //Workshop URL
            WorkshopLink = GeneralUtil.ValidateUri(description.ElementAtOrDefault(2));

            if (ImageGallery == null || WorkshopLink == null)
            {
                _ = _log.LogMessage("Issue with Imgur Album or Workshop link when parsing test event.", alert: true);
                return;
            }

            //Game mode
            SetGameMode(description.ElementAtOrDefault(3));

            //Moderator
            Moderator = _dataService.GetSocketUser(description.ElementAtOrDefault(4));

            //Description
            Description = description.ElementAtOrDefault(5);

            //Gallery strings
            GalleryImages = GeneralUtil.GetImgurAlbum(ImageGallery.ToString());
        }
        public virtual async Task PlaytestCommandPre(bool replyInContext,
                                                     SrcdsLogService srcdsLogService, RconService rconService)
        {
            if (_dataService.RSettings.ProgramSettings.Debug)
            {
                _ = _log.LogMessage("Base class PlaytestCommandPre", false, color: LOG_COLOR);
            }

            PlaytestCommandRunning = true;

            _dataService.SetStartAlert(false);

            await _log.LogMessage("Running Playtest Pre Tasks!", color : LOG_COLOR);

            //Store test information for later use. Will be written to the DB.
            var    gameMode = IsCasual ? "casual" : "comp";
            string mentions = null;

            Creators.ForEach(x => mentions += $"{x.Mention} ");
            PlaytestCommandInfo             = new PlaytestCommandInfo
            {
                Id       = 1, //Only storing 1 of these in the DB at a time, so hard code to 1.
                Mode     = gameMode,
                DemoName = $"{StartDateTime:MM_dd_yyyy}" +
                           $"_{CleanedTitle.Substring(0, CleanedTitle.IndexOf(' ')).Trim()}" +
                           $"_{gameMode}",
                WorkshopId      = GeneralUtil.GetWorkshopIdFromFqdn(WorkshopLink.ToString()),
                ServerAddress   = ServerLocation,
                Title           = CleanedTitle,
                ThumbNailImage  = CanUseGallery ? GalleryImages[0] : _dataService.RSettings.General.FallbackTestImageUrl,
                ImageAlbum      = ImageGallery.ToString(),
                CreatorMentions = mentions,
                StartDateTime   = StartDateTime.GetValueOrDefault(),
                Game            = Game.ToString()
            };


            var fbf = srcdsLogService.GetFeedbackFile(server);

            //If somehow the session does not exist...
            if (fbf == null)
            {
                srcdsLogService.CreateFeedbackFile(server, GetFeedbackFileName());
                fbf = srcdsLogService.GetFeedbackFile(server);
            }

            await fbf.LogFeedback($"Playtest starting feedback started at: {DateTime.Now} CT");

            //Write to the DB so we can restore this info next boot
            DatabaseUtil.StorePlaytestCommandInfo(PlaytestCommandInfo);

            //Figure out where to send the no context message

            //No context to send these messages to - default them
            if (!replyInContext)
            {
                await TestingChannel.SendMessageAsync(embed : new EmbedBuilder()
                                                      .WithAuthor($"Pre-start playtest of {CleanedTitle}")
                                                      .WithColor(new Color(55, 55, 165))
                                                      .WithDescription($"\nOn **{PlaytestCommandInfo.ServerAddress}**" +
                                                                       $"\nWith config of **{PlaytestCommandInfo.Mode}**" +
                                                                       $"\nWorkshop ID **{PlaytestCommandInfo.WorkshopId}**").Build());
            }
        }