Ejemplo n.º 1
0
        /// <summary>
        /// Addedのログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreAddedLog(
            LogLineEventArgs logInfo)
        {
            var match = ConstantKeywords.AddedRegex.Match(logInfo.logLine);

            if (!match.Success)
            {
                return;
            }

            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine,
                Actor     = match.Groups["actor"].ToString(),
                Activity  = $"Added",
                LogType   = LogTypes.Added,
            };

            log.Text        = $"Add {log.Actor}";
            log.SyncKeyword = log.RawWithoutTimestamp.Substring(0, log.RawWithoutTimestamp.IndexOf('.'));

            if (this.ToStoreActor(log.Actor))
            {
                this.StoreLog(log);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// キャストログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreCastStartsUsingLog(
            LogLineEventArgs logInfo)
        {
            var match = ConstantKeywords.StartsUsingRegex.Match(logInfo.logLine);

            if (!match.Success)
            {
                return;
            }

            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine,
                Actor     = match.Groups["actor"].ToString(),
                Activity  = $"starts using {match.Groups["skill"].ToString()}",
                Skill     = match.Groups["skill"].ToString(),
                LogType   = LogTypes.CastStart
            };

            log.Text        = log.Skill;
            log.SyncKeyword = log.RawWithoutTimestamp.Substring(6);

            if (this.ToStoreActor(log.Actor))
            {
                this.StoreLog(log);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// セリフを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreDialog(
            LogLineEventArgs logInfo)
        {
            var match = ConstantKeywords.DialogRegex.Match(logInfo.logLine);

            if (!match.Success)
            {
                return;
            }

            var dialog = match.Groups["dialog"].ToString();

            var isSystem = logInfo.logLine.Contains(":0839");

            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine,
                Actor     = string.Empty,
                Activity  = isSystem ? "System" : "Dialog",
                LogType   = LogTypes.Dialog
            };

            log.Text        = null;
            log.SyncKeyword = log.RawWithoutTimestamp.Substring(8);

            this.StoreLog(log);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// キャストログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreCastLog(
            XIVLog xivLog)
        {
            var match = ConstantKeywords.CastRegex.Match(xivLog.LogLine);

            if (!match.Success)
            {
                match = ConstantKeywords.StartsUsingRegex.Match(xivLog.LogLine);
                if (!match.Success)
                {
                    return;
                }
            }

            var log = new CombatLog()
            {
                TimeStamp = xivLog.DetectTime,
                Raw       = xivLog.LogLine,
                Actor     = match.Groups["actor"].ToString(),
                Activity  = $"{match.Groups["skill"].ToString()} Start",
                Skill     = match.Groups["skill"].ToString(),
                LogType   = LogTypes.CastStart
            };

            log.Text        = log.Skill;
            log.SyncKeyword = log.RawWithoutTimestamp.Substring(8);

            if (this.ToStoreActor(log.Actor))
            {
                this.StoreLog(log, xivLog);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// マーカーログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreMarkerLog(
            LogLineEventArgs logInfo)
        {
            const string PCIDPlaceholder = "(?<pcid>.{8})";

            var log = default(CombatLog);

            var match = ConstantKeywords.MarkerRegex.Match(logInfo.logLine);

            if (match.Success)
            {
                // ログなしマーカ
                var id            = match.Groups["id"].ToString();
                var target        = match.Groups["target"].ToString();
                var targetJobName = this.ToNameToJob(target);

                log = new CombatLog()
                {
                    TimeStamp = logInfo.detectedTime,
                    Raw       = logInfo.logLine
                                .Replace(id, PCIDPlaceholder)
                                .Replace(target, targetJobName),
                    Activity = $"Marker:{match.Groups["type"].ToString()}",
                    LogType  = LogTypes.Marker
                };
            }
            else
            {
                // マーキング
                match = ConstantKeywords.MarkingRegex.Match(logInfo.logLine);
                if (!match.Success)
                {
                    return;
                }

                var target        = match.Groups["target"].ToString();
                var targetJobName = this.ToNameToJob(target);

                log = new CombatLog()
                {
                    TimeStamp = logInfo.detectedTime,
                    Raw       = logInfo.logLine
                                .Replace(target, targetJobName),
                    Activity = $"Marking",
                    LogType  = LogTypes.Marker
                };
            }

            if (log != null)
            {
                log.Text        = log.Activity;
                log.SyncKeyword = log.RawWithoutTimestamp;

                if (this.ToStoreActor(log.Actor))
                {
                    this.StoreLog(log);
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 記録用ログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreRecordLog(
            LogLineEventArgs logInfo)
        {
            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine,
                LogType   = LogTypes.Unknown
            };

            this.StoreLog(log);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 記録用ログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreRecordLog(
            XIVLog xivLog)
        {
            var log = new CombatLog()
            {
                TimeStamp = xivLog.DetectTime,
                Raw       = xivLog.LogLine,
                LogType   = LogTypes.Unknown
            };

            this.StoreLog(log, xivLog);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// ログを格納する
        /// </summary>
        /// <param name="log">ログ</param>
        /// <param name="logLine">ログイベント引数</param>
        private void StoreLog(
            CombatLog log,
            XIVLog xivLog)
        {
            var zone = xivLog.ZoneName;

            zone = string.IsNullOrEmpty(zone) ?
                   "UNKNOWN" :
                   zone;

            lock (this.CurrentCombatLogList)
            {
                // IDを発番する
                log.ID = this.id;
                this.id++;

                // 今回の分析の連番を付与する
                log.No = this.no;
                this.no++;

                // 経過秒を求める
                var origin = this.CurrentCombatLogList.FirstOrDefault(x => x.IsOrigin);
                if (origin != null)
                {
                    var ts = log.TimeStamp - origin.TimeStamp;
                    if (ts.TotalMinutes <= 60 &&
                        ts.TotalMinutes >= -60)
                    {
                        log.TimeStampElapted = ts;
                    }
                }

                // アクター別の残HP率をセットする
                if (this.ActorHPRate.ContainsKey(log.Actor))
                {
                    log.HPRate = this.ActorHPRate[log.Actor];
                }

                if (!this.CurrentCombatLogList.Any() &&
                    log.RawWithoutTimestamp != ConstantKeywords.ImportLog)
                {
                    log.IsOrigin = true;
                }

                // ゾーンを保存する
                log.Zone = zone;

                this.CurrentCombatLogList.Add(log);
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// ログに基点をセットする
        /// </summary>
        /// <param name="logs">logs</param>
        /// <param name="origin">origin log</param>
        public void SetOrigin(
            IEnumerable <CombatLog> logs,
            CombatLog origin)
        {
            foreach (var log in logs)
            {
                log.IsOrigin = false;

                var ts = log.TimeStamp - origin.TimeStamp;
                if (ts.TotalMinutes <= 60 &&
                    ts.TotalMinutes >= -60)
                {
                    log.TimeStampElapted = ts;
                }
                else
                {
                    log.TimeStampElapted = TimeSpan.Zero;
                }
            }

            origin.IsOrigin = true;
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Effectログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreEffectLog(
            LogLineEventArgs logInfo)
        {
            var match = ConstantKeywords.EffectRegex.Match(logInfo.logLine);

            if (!match.Success)
            {
                return;
            }

            var victim        = match.Groups["victim"].ToString();
            var victimJobName = this.ToNameToJob(victim);

            var effect   = match.Groups["effect"].ToString();
            var actor    = match.Groups["actor"].ToString();
            var duration = match.Groups["duration"].ToString();

            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine
                            .Replace(victim, victimJobName),
                Actor    = actor,
                Activity = $"effect {effect}",
                LogType  = LogTypes.Effect
            };

            log.Text        = log.Activity;
            log.SyncKeyword = log.RawWithoutTimestamp;

            if (victim != actor)
            {
                if (this.ToStoreActor(log.Actor))
                {
                    this.StoreLog(log);
                }
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 戦闘終了を格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreEndCombat(
            LogLineEventArgs logInfo)
        {
            var match = ConstantKeywords.CombatEndRegex.Match(logInfo.logLine);

            if (!match.Success)
            {
                return;
            }

            var discription = match.Groups["discription"].ToString();

            var log = new CombatLog()
            {
                TimeStamp = logInfo.detectedTime,
                Raw       = logInfo.logLine,
                Actor     = string.Empty,
                Activity  = LogTypes.CombatEnd.ToString(),
                LogType   = LogTypes.CombatEnd
            };

            this.StoreLog(log);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 戦闘開始を格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        private void StoreStartCombat(
            XIVLog xivLog)
        {
            var match = ConstantKeywords.CombatStartRegex.Match(xivLog.LogLine);

            if (!match.Success)
            {
                return;
            }

            var discription = match.Groups["discription"].ToString();

            var log = new CombatLog()
            {
                TimeStamp = xivLog.DetectTime,
                Raw       = xivLog.LogLine,
                Actor     = string.Empty,
                Activity  = LogTypes.CombatStart.ToString(),
                LogType   = LogTypes.CombatStart
            };

            this.StoreLog(log, xivLog);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// ネットワークログを格納する
        /// </summary>
        /// <param name="logInfo">ログ情報</param>
        /// <param name="keywordType">キーワードのタイプ</param>
        private void StoreNewwork(
            LogLineEventArgs logInfo,
            KewordTypes keywordType)
        {
            var log = default(CombatLog);

            var targetLogLine = logInfo.logLine.Substring(15);
            var match         = keywordType == KewordTypes.NetworkAbility ?
                                ConstantKeywords.NetworkAbility.Match(targetLogLine) :
                                ConstantKeywords.NetworkAOEAbility.Match(targetLogLine);

            if (match.Success)
            {
                var actorID       = match.Groups["id"].ToString();
                var victimID      = match.Groups["victim_id"].ToString();
                var actor         = match.Groups["actor"].ToString();
                var action        = match.Groups["skill"].ToString();
                var victim        = match.Groups["victim"].ToString();
                var victimJobName = this.ToNameToJob(victim);

                if (IgnoreNewworkActions.Any(x =>
                                             string.Equals(x, action, StringComparison.OrdinalIgnoreCase)))
                {
                    return;
                }

                var raw = logInfo.logLine.Substring(0, 15) + match.Value;
                raw = raw
                      .Replace(actorID, ActorIDPlaceholder)
                      .Replace(victimID, PCIDPlaceholder);

                if (!string.IsNullOrEmpty(victim))
                {
                    raw = raw.Replace(victim, victimJobName);
                }

                log = new CombatLog()
                {
                    TimeStamp = logInfo.detectedTime,
                    Raw       = raw,
                    Actor     = actor,
                    Skill     = action,
                    Activity  = keywordType == KewordTypes.NetworkAbility ?
                                $"{action} Sign" :
                                $"{action} Sign-AOE",
                    LogType = keywordType == KewordTypes.NetworkAbility ?
                              LogTypes.NetworkAbility :
                              LogTypes.NetworkAOEAbility,
                };

                if (!this.ToStoreActor(log.Actor))
                {
                    return;
                }
            }

            if (log != null)
            {
                if (this.CurrentCombatLogList.Any(x =>
                                                  Math.Abs((x.TimeStamp - log.TimeStamp).TotalSeconds) <= 1.0 &&
                                                  x.RawWithoutTimestamp == log.RawWithoutTimestamp))
                {
                    return;
                }

                log.Text        = log.Activity;
                log.SyncKeyword = log.RawWithoutTimestamp;

                this.StoreLog(log);
            }
        }