Ejemplo n.º 1
0
 private static void SetGeneralInformation(this RaidModel raidModel, dynamic logData)
 {
     raidModel.EncounterTime = logData.encounterDuration.Value;
     raidModel.EncounterIcon = logData.fightIcon.Value;
     raidModel.EncounterName = logData.fightName.Value;
     raidModel.EncounterId   = int.Parse(logData.fightID.Value.ToString());
     raidModel.Killed        = logData.success.Value;
 }
Ejemplo n.º 2
0
 private static void SetRemainingHealth(this RaidModel raidModel, dynamic logData)
 {
     for (var i = 0; i < logData.phases[0].targets.Count; i++)
     {
         var targetData = logData.targets[(int)logData.phases[0].targets[i]];
         raidModel.HpLeft.Add(targetData.hpLeft.Value);
     }
 }
Ejemplo n.º 3
0
 private void AssertExpectations(RaidModel log)
 {
     log.EncounterName.Should().Be(ExpectedEncounterName);
     log.EncounterTime.Should().Be(ExpectedEncounterTime);
     log.EncounterIcon.Should().Be(ExpectedEncounterIcon);
     log.Killed.Should().Be(ExpectedKilled);
     log.HpLeft.Count().Should().Be(ExpectedNumberOfHpLeft);
     log.HpLeft[0].Should().Be(ExpectedHpLeft);
     log.Players.Count().Should().Be(ExpectedPlayers);
     log.OccurenceStart.Should().Be(ExpectedOccurenceStart);
     log.OccurenceEnd.Should().Be(ExpectedOccurenceEnd);
 }
Ejemplo n.º 4
0
        private static void ParseMechanics(this PlayerModel playerModel, RaidModel raidModel, dynamic logData,
                                           ILogger logger = null)
        {
            var strategy = MechanicsFactory.FindStrategy(raidModel.EncounterIcon);

            try
            {
                strategy?.Parse(logData, playerModel);
            }
            catch (Exception)
            {
                logger?.LogDebug(">>> Mechanics not parsable: " + raidModel.LogUrl);
            }
        }
Ejemplo n.º 5
0
 public SoftResRaidBuilder()
 {
     _raidModel = new RaidModel
     {
         Amount          = 2,
         Faction         = "Horde",
         Discord         = false,
         Instance        = "naxxramas",
         ItemLimit       = 0,
         HideReserves    = false,
         CharacterNotes  = true,
         PlusModifier    = 1,
         RestrictByClass = true
     };
 }
    internal static Encounter Convert(RaidModel raidModel)
    {
        var encounter = new Encounter
        {
            Killed             = raidModel.Killed,
            EncounterTime      = raidModel.EncounterTime,
            OccurenceStart     = raidModel.OccurenceStart,
            OccurenceEnd       = raidModel.OccurenceEnd,
            HitPointsRemaining = raidModel.HpLeft.Average(),
            Boss    = ConvertBossData(raidModel),
            Players = raidModel.Players
                      .Select(PlayerModelToPlayerConverter.Convert).ToList()
        };

        return(encounter);
    }
Ejemplo n.º 7
0
        internal static RaidModel ParseLog(string filePath, ILogger logger = null)
        {
            var model = new RaidModel(filePath);

            try
            {
                var logData = GetLogData(File.ReadAllText(model.LogPath));

                SetRemainingHealth(model, logData);
                SetGeneralInformation(model, logData);
                if (logData.eiVersion != null || logData.parser != null)
                {
                    model.OccurenceStart = DateTime.ParseExact(
                        logData.encounterStart.Value, "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture);
                    model.OccurenceEnd = DateTime.ParseExact(
                        logData.encounterEnd.Value, "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture);
                }

                var fightDuration = (long)logData.phases[0].duration.Value;

                for (var j = 0; j < logData.players.Count; j++)
                {
                    var playerModel = new PlayerModel
                    {
                        Index       = j,
                        AccountName = logData.players[j].acc
                    };

                    ParseSupportStats(playerModel, logData);
                    ParseDamageStats(playerModel, fightDuration, logData);
                    ParseMechanics(playerModel, model, logData, logger);
                    ParseBoons(playerModel, logData);

                    model.Players.Add(playerModel);
                }
            }
            catch (Exception e)
            {
                logger?.LogError($">>> {filePath} cannot be parsed.");
                logger?.LogDebug(e.Message);
                return(null);
            }

            return(model);
        }
Ejemplo n.º 8
0
        void Start()
        {
            _audioSource = GetComponent <AudioSource>();
            _raid        = World.ChosenRaid;
            Viking.Reset();
            Village.Reset();

            if (_raid == null && DebugRaidModel)
            {
                _raid = DebugRaidModel;
            }

            _actionDialogModels.Add(_raid.RaidActionDialogModel);
            _actionDialogModels.Add(_raid.MeadActionDialogModel);
            _actionDialogModels.Add(_raid.OdinActionDialogModel);
            _actionDialogModels.Add(_raid.EnglandActionDialogModel);
            NextPhase();
        }
Ejemplo n.º 9
0
        public async Task <Embed> CreateRaidMonitorEmbed(RaidModel raidModel)
        {
            var embedBuilder = new EmbedBuilder()
                               .WithTitle($"Soft Res Raid Event - {raidModel.RaidId}")
                               .AddField("Soft Res Sheet", $"[SoftRes.It](https://softres.it/raid/{raidModel.RaidId})", true)
                               .AddField("Filler", "Filler", true)
                               .AddField("Total Reserves", raidModel.Reserved.Count, true);
            var reservedCount = raidModel.Reserved.Count;

            if (reservedCount == 0)
            {
                return(embedBuilder.Build());
            }
            var emptySpacesOnFinalRow = (3 - reservedCount % 3);
            var reservedGroups        = raidModel.Reserved.SplitList(3).ToList();

            for (var i = 0; i < reservedGroups.Count; i++)
            {
                foreach (var softResUserModel in reservedGroups[i])
                {
                    var itemSb = new StringBuilder();
                    foreach (var item in softResUserModel.Items)
                    {
                        var itemData = await _itemRepository.FindAsync(item);

                        var itemString = itemData?.Name ?? $"Item#{item}";
                        itemSb.AppendLine(itemString);
                    }

                    embedBuilder.AddField($"{softResUserModel.Name}", itemSb.ToString(), true);
                }

                if (i != reservedGroups.Count)
                {
                    continue;
                }
                for (var j = 0; j < emptySpacesOnFinalRow; j++)
                {
                    embedBuilder.AddField(EmbedConstants.EmptySpace, EmbedConstants.EmptySpace);
                }
            }

            return(embedBuilder.Build());
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Gets all of a characters raids using a lookback period specified as an integer representing days
        /// </summary>
        /// <param name="pCharacterName">The character name, case-insensitive</param>
        /// <param name="pLookback">The lookback period specified in days</param>
        /// <returns></returns>
        public static IEnumerable GetCharacterRaids(string pClientId, string pCharacterName, int pLookback = 0)
        {
            Dictionary <int, RaidModel> vRaids = new Dictionary <int, RaidModel>();

            using (opendkpContext vDatabase = new opendkpContext())
            {
                var vCharacter = vDatabase.Characters.First(x => x.ClientId.Equals(pClientId) && x.Name.Equals(pCharacterName, StringComparison.InvariantCultureIgnoreCase));
                List <TicksXCharacters> vResult = null;
                if (pLookback > 0)
                {
                    vResult = vDatabase.TicksXCharacters
                              .Include("IdTickNavigation.Raid.IdPoolNavigation")
                              .Where(x => x.ClientId.Equals(pClientId) && x.IdCharacter == vCharacter.IdCharacter &&
                                     DateTime.Compare(x.IdTickNavigation.Raid.Timestamp.Date,
                                                      DateTime.Now.AddDays(pLookback * -1).Date) >= 0)
                              .ToList();
                }
                else
                {
                    vResult = vDatabase.TicksXCharacters
                              .Where(x => x.ClientId.Equals(pClientId) && x.IdCharacter == vCharacter.IdCharacter)
                              .Include("IdTickNavigation.Raid.IdPoolNavigation")
                              .ToList();
                }

                foreach (var vModel in vResult)
                {
                    TickModel vTick = new TickModel(vModel.IdTickNavigation);
                    if (!vRaids.ContainsKey(vModel.IdTickNavigation.RaidId))
                    {
                        RaidModel vRaid = new RaidModel(vModel.IdTickNavigation.Raid);
                        vRaid.TotalTicks = vDatabase.Ticks.Include("Raid").Count(x => x.ClientId.Equals(pClientId) && x.RaidId == vRaid.IdRaid);
                        vRaids.Add(vModel.IdTickNavigation.RaidId, vRaid);
                    }
                    vRaids[vModel.IdTickNavigation.RaidId].Ticks.Add(vTick);
                }
            }
            return(vRaids.Values.ToList());
        }
        internal static StringBuilder BuildEncounterHeader(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            var encounterTime = raidModel.OccurenceEnd - raidModel.OccurenceStart;

            stringBuilder.Append($@"
				<div class=""content"">
					<a href=""{raidModel.LogUrl}"" target=""_blank"" style=""color: #aaa; text-decoration: none;"">
						<img src=""{raidModel.EncounterIcon}"" alt=""{HttpUtility.HtmlEncode(raidModel.EncounterName)}"" width=""64"" height=""64"" style=""float: right;"">
						<h2>{HttpUtility.HtmlEncode(raidModel.EncounterName)}</h2>
						<p>{raidModel.OccurenceStart.ToLongTimeString()} &rArr; {raidModel.OccurenceEnd.ToLongTimeString()} ({encounterTime.Minutes}m {encounterTime.Seconds}s)
					</a>
					"                    );

            foreach (var value in raidModel.HpLeft)
            {
                stringBuilder.Append($@"
					<div title=""{RaidModel.DoubleAsHtml(value)}% left"" style=""background: rgba(0, 0, 0, 0)
						linear-gradient(to right, red {RaidModel.DoubleAsHtml(value)}%, {RaidModel.DoubleAsHtml(value)}%, green {RaidModel.DoubleAsHtml(100 - value)}%)
						repeat scroll 0% 0%; height: 10px; width: 100%; border-radius: 5px; margin-top: 3px;"">
					</div>"                    );
            }

            return(stringBuilder);
        }
Ejemplo n.º 12
0
        public override string CreateHtml(RaidModel model)
        {
            var top = "";

            top += @"<table class=""mechanicsTable"" style=""display: none;"">";
            top += @"<tr>
						<th>Player</th>
						<th title=""Hit by Shockwave"">Shockwave</th>
					</tr>"                    ;

            foreach (var player in model.Players.OrderByDescending(i => i.CombinedMechanics.Sum(j => j.Value)).Take(3))
            {
                var mid = $@"
					<tr>
						<td>{HttpUtility.HtmlEncode(player.AccountName)}</td>
						<td>{player.CombinedMechanics["sabir_shockwave"]}</td>
					</tr>"                    ;
                top += mid;
            }

            top += "</table>";

            return(top);
        }
Ejemplo n.º 13
0
        internal static StringBuilder BuildResurrectionTable(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            stringBuilder.Append(@"<table class=""resTable"" style=""display: none;"">");

            foreach (var player in raidModel.Players.OrderByDescending(i => i.ResAmount).Take(3))
            {
                stringBuilder.Append($@"
					<tr>
						<td>{HttpUtility.HtmlEncode(player.AccountName)}</td> 
						<td title=""Total res: {player.ResTime}"">{player.ResTime}s - {player.ResAmount}x</td>
					</tr>"                    );
            }

            stringBuilder.Append("</table>");
            return(stringBuilder);
        }
Ejemplo n.º 14
0
        internal static StringBuilder BuildBoonTable(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            var boonList  = CombineBoons(raidModel.Players);
            var counter   = 0;
            var increment = boonList.Count / 2;

            while (boonList.Skip(counter).Take(increment).Any())
            {
                stringBuilder.Append(@"<table class=""boonTable"" style=""display: none;"">");

                var boonHeader = @"<tr>";
                var boonBody   = @"<tr>";

                foreach (var boon in boonList.Skip(counter).Take(6))
                {
                    boonHeader += $@"
					<th class=""boonColumn"">
						<img src=""{boon.Icon}"" class=""boonIcon"" title=""{boon.Name}"">
					</th>"                    ;

                    if (boon.Stacking && boon.Stacks != null)
                    {
                        boonBody += $@"
						<td class=""boonColumn"" title=""{Math.Round((double)boon.Stacks, 0)}%"">
							{Math.Round(boon.Value, 0)}
						</td>"                        ;
                    }
                    else
                    {
                        boonBody += $@"
						<td class=""boonColumn"">
							{Math.Round(boon.Value, 0)}%
						</td>"                        ;
                    }
                }

                boonHeader += @"</tr>";
                boonBody   += @"</tr>";

                stringBuilder.Append(boonHeader);
                stringBuilder.Append(boonBody);

                stringBuilder.Append("</table>");
                counter += increment;
            }
            return(stringBuilder);
        }
Ejemplo n.º 15
0
 private void SelectRaid(RaidModel raidModel)
 {
     World.ChosenRaid = raidModel;
     SceneManager.LoadScene("Raid");
 }
Ejemplo n.º 16
0
 private static StringBuilder BuildCommonHtml(this StringBuilder stringBuilder, RaidModel model)
 {
     return(stringBuilder.BuildEncounterHeader(model)
            .BuildDamagePerSecondTable(model)
            .BuildCrowdControlTable(model)
            .BuildResurrectionTable(model)
            .BuildBoonTable(model)
            .BuildMechanicsTable(model)
            .BuildEncounterFooter());
 }
Ejemplo n.º 17
0
        internal static StringBuilder BuildMechanicsTable(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            var strategy = MechanicsFactory
                           .GetMechanicsFactory()
                           .FindStrategy(raidModel.EncounterIcon);

            if (strategy != null)
            {
                stringBuilder.Append(strategy.CreateHtml(raidModel));
            }

            return(stringBuilder);
        }
Ejemplo n.º 18
0
        internal static StringBuilder BuildCrowdControlTable(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            stringBuilder.Append(@"<table class=""ccTable"" style=""display: none;"">");

            var allCc = raidModel.Players.Sum(i => i.Cc) != 0 ? raidModel.Players.Sum(i => i.Cc) : 1;

            foreach (var player in raidModel.Players.OrderByDescending(i => i.Cc).Take(3))
            {
                stringBuilder.Append($@"
					<tr>
						<td>{HttpUtility.HtmlEncode(player.AccountName)}</td> 
						<td title=""Total CC: {player.Cc}"">{player.Cc} cc</td>
						<td>{Math.Round((double)player.Cc / allCc * 100, 2):F}%</td>
					</tr>"                    );
            }

            stringBuilder.Append("</table>");
            return(stringBuilder);
        }
Ejemplo n.º 19
0
        internal static StringBuilder BuildDamagePerSecondTable(this StringBuilder stringBuilder, RaidModel raidModel)
        {
            stringBuilder.Append(@"<table class=""dpsTable"">");

            var allDamage = raidModel.Players.Sum(i => i.Damage) != 0 ? raidModel.Players.Sum(i => i.Damage) : 1;

            foreach (var player in raidModel.Players.OrderByDescending(i => i.Dps).Take(3))
            {
                stringBuilder.Append($@"
					<tr>
						<td>{HttpUtility.HtmlEncode(player.AccountName)}</td> 
						<td title=""Total Damage: {player.Damage}"">{player.Dps} dps</td>
						<td>{Math.Round((double)player.Damage / allDamage * 100, 2):F}%</td>
					</tr>"                    );
            }

            stringBuilder.Append("</table>");
            return(stringBuilder);
        }
Ejemplo n.º 20
0
 public abstract string CreateHtml(RaidModel model);