Esempio n. 1
0
        /// <summary>
        /// ログ行を返す
        /// </summary>
        /// <returns>ログ行の配列</returns>
        public IReadOnlyList <XIVLog> GetLogLines()
        {
            if (this.logInfoQueue.IsEmpty)
            {
                return(EmptyLogLineList);
            }

            // プレイヤー情報を取得する
            var player = FFXIVPlugin.Instance.GetPlayer();

            // プレイヤーが召喚士か?
            var palyerIsSummoner = false;

            if (player != null)
            {
                var job = player.AsJob();
                if (job != null)
                {
                    palyerIsSummoner = job.IsSummoner();
                }
            }

            // マッチング用のログリスト
            var list = new List <XIVLog>(logInfoQueue.Count);

            var summoned    = false;
            var doneCommand = false;

            var preLog      = new string[3];
            var preLogIndex = 0;

#if DEBUG
            var sw = System.Diagnostics.Stopwatch.StartNew();
#endif
            while (logInfoQueue.TryDequeue(
                       out LogLineEventArgs logInfo))
            {
                var logLine = logInfo.logLine;

                // 直前とまったく同じ行はカットする
                if (preLog[0] == logLine ||
                    preLog[1] == logLine ||
                    preLog[2] == logLine)
                {
                    continue;
                }

                preLog[preLogIndex++] = logLine;
                if (preLogIndex >= 3)
                {
                    preLogIndex = 0;
                }

                // 無効なログ行をカットする
                if (IgnoreLogKeywords.Any(x => logLine.Contains(x)))
                {
                    continue;
                }

                // ダメージ系ログをカットする
                if (Settings.Default.IgnoreDamageLogs &&
                    DamageLogPattern.IsMatch(logLine))
                {
                    continue;
                }

                // 詳細なログをカット
                if (Settings.Default.IgnoreDetailLogs &&
                    IgnoreDetailLogKeywords.Any(x => logLine.Contains(x)))
                {
                    continue;
                }

                // エフェクトに付与されるツールチップ文字を除去する
                if (Settings.Default.RemoveTooltipSymbols)
                {
                    // 4文字分のツールチップ文字を除去する
                    int index;
                    if ((index = logLine.IndexOf(
                             TooltipSuffix,
                             0,
                             StringComparison.Ordinal)) > -1)
                    {
                        logLine = logLine.Remove(index - 1, 4);
                    }

                    // 残ったReplacementCharを除去する
                    logLine = logLine.Replace(TooltipReplacementChar, string.Empty);
                }

                // ペットジョブで召喚をしたか?
                if (!summoned &&
                    palyerIsSummoner)
                {
                    summoned = isSummoned(logLine);
                }

                // コマンドとマッチングする
                doneCommand |= TextCommandController.MatchCommandCore(logLine);

                list.Add(new XIVLog(logLine));
            }

            if (summoned)
            {
                TableCompiler.Instance.RefreshPetPlaceholder();
            }

            if (doneCommand)
            {
                SystemSounds.Asterisk.Play();
            }

            // ログファイルに出力する
            if (Settings.Default.SaveLogEnabled)
            {
                ChatLogWorker.Instance.AppendLinesAsync(list);
            }

#if DEBUG
            sw.Stop();
            System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms");
#endif
            // 冒頭のタイムスタンプを除去して返す
            return(list);

            // 召喚したか?
            bool isSummoned(string logLine)
            {
                var r = false;

                if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase))
                {
                    r = true;
                }
                else
                {
                    if (!string.IsNullOrEmpty(player.Name))
                    {
                        r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameFI))
                    {
                        r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameIF))
                    {
                        r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameII))
                    {
                        r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }
                }

                return(r);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// ログ行を返す
        /// </summary>
        /// <returns>ログ行の配列</returns>
        public IReadOnlyList <XIVLog> GetLogLines()
        {
            if (this.logInfoQueue.IsEmpty)
            {
                return(EmptyLogLineList);
            }

            // プレイヤー情報を取得する
            var player = FFXIVPlugin.Instance.GetPlayer();

            // プレイヤーが召喚士か?
            var palyerIsSummoner = false;

            if (player != null)
            {
                var job = player.AsJob();
                if (job != null)
                {
                    palyerIsSummoner = job.IsSummoner();
                }
            }

            // マッチング用のログリスト
            var list = new List <XIVLog>(logInfoQueue.Count);

            var partyChangedAtDQX = false;
            var summoned          = false;
            var doneCommand       = false;

#if DEBUG
            var sw = System.Diagnostics.Stopwatch.StartNew();
#endif
            while (logInfoQueue.TryDequeue(
                       out LogLineEventArgs logInfo))
            {
                var logLine = logInfo.logLine;

                // エフェクトに付与されるツールチップ文字を除去する
                if (Settings.Default.RemoveTooltipSymbols)
                {
                    // 4文字分のツールチップ文字を除去する
                    int index;
                    if ((index = logLine.IndexOf(
                             TooltipSuffix,
                             0,
                             StringComparison.Ordinal)) > -1)
                    {
                        logLine = logLine.Remove(index - 1, 4);
                    }

                    // 残ったReplacementCharを除去する
                    logLine = logLine.Replace(TooltipReplacementChar, string.Empty);
                }

                // FFXIVでの使用?
                if (!Settings.Default.UseOtherThanFFXIV &&
                    !summoned &&
                    palyerIsSummoner)
                {
                    summoned = isSummoned(logLine);
                }

                // パーティに変化があるか?(対DQX)
                if (!partyChangedAtDQX)
                {
                    partyChangedAtDQX = DQXUtility.IsPartyChanged(logLine);
                }

                // コマンドとマッチングする
                doneCommand |= TextCommandController.MatchCommandCore(logLine);

                list.Add(new XIVLog(logLine));
            }

            if (summoned)
            {
                TableCompiler.Instance.RefreshPetPlaceholder();
            }

            if (partyChangedAtDQX)
            {
                Task.Run(() =>
                {
                    Thread.Sleep(TimeSpan.FromSeconds(1));
                    DQXUtility.RefeshKeywords();
                });
            }

            if (doneCommand)
            {
                SystemSounds.Asterisk.Play();
            }

            // ログファイルに出力する
            if (Settings.Default.SaveLogEnabled)
            {
                Task.Run(() => ChatLogWorker.Instance.AppendLines(list));
            }

#if DEBUG
            sw.Stop();
            System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms");
#endif
            // 冒頭のタイムスタンプを除去して返す
            return(list);

            // 召喚したか?
            bool isSummoned(string logLine)
            {
                var r = false;

                if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase))
                {
                    r = true;
                }
                else
                {
                    if (!string.IsNullOrEmpty(player.Name))
                    {
                        r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameFI))
                    {
                        r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameIF))
                    {
                        r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameII))
                    {
                        r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }
                }

                return(r);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// ログ行を返す
        /// </summary>
        /// <returns>ログ行の配列</returns>
        public IReadOnlyList <XIVLog> GetLogLines()
        {
            if (this.XIVLogQueue.IsEmpty)
            {
                return(EmptyLogLineList);
            }

            // プレイヤー情報を取得する
            var player = CombatantsManager.Instance.Player;

            // プレイヤーが召喚士か?
            var palyerIsSummoner = false;

            if (player != null)
            {
                var job = player.JobInfo;
                if (job != null)
                {
                    palyerIsSummoner = job.IsSummoner();
                }
            }

            // マッチング用のログリスト
            var list = new List <XIVLog>(this.XIVLogQueue.Count);

            var summoned    = false;
            var doneCommand = false;
            var isDefeated  = false;
            var isCombatEnd = false;

            var preLog      = new string[3];
            var preLogIndex = 0;

#if DEBUG
            var sw = System.Diagnostics.Stopwatch.StartNew();
#endif
            while (this.XIVLogQueue.TryDequeue(
                       out XIVLog xivlog))
            {
                var logLine = xivlog.LogLine;

                // 直前とまったく同じ行はカットする
                if (preLog[0] == logLine ||
                    preLog[1] == logLine ||
                    preLog[2] == logLine)
                {
                    continue;
                }

                preLog[preLogIndex++] = logLine;
                if (preLogIndex >= 3)
                {
                    preLogIndex = 0;
                }

                if (IsAutoIgnoreLog(logLine))
                {
                    continue;
                }

                // ツールチップシンボル, ワールド名を除去する
                logLine        = RemoveTooltipSynbols(logLine);
                logLine        = RemoveWorldName(logLine);
                xivlog.LogLine = logLine;

                // ペットジョブで召喚をしたか?
                if (!summoned &&
                    palyerIsSummoner)
                {
                    summoned = isSummoned(logLine);
                }

                // 誰かが倒された?
                if (!isDefeated)
                {
                    isDefeated = this.IsDefeated(logLine);
                }

                // 戦闘終了?
                if (!isCombatEnd)
                {
                    isCombatEnd = this.IsCombatEnd(logLine);
                }

                // コマンドとマッチングする
                doneCommand |= TextCommandController.MatchCommandCore(logLine);
                doneCommand |= TextCommandBridge.Instance.TryExecute(logLine);

                list.Add(xivlog);
            }

            if (summoned)
            {
                TableCompiler.Instance.RefreshPetPlaceholder();
            }

            if (isDefeated)
            {
                PluginMainWorker.Instance.ResetCountAtRestart();
            }

            if (isCombatEnd)
            {
                PluginMainWorker.Instance.Wipeout();
            }

            if (doneCommand)
            {
                CommonSounds.Instance.PlayAsterisk();
            }

            // ログファイルに出力する
            if (Settings.Default.SaveLogEnabled)
            {
                ChatLogWorker.Instance.AppendLinesAsync(list);
            }

#if DEBUG
            sw.Stop();
            System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms");
#endif
            // 冒頭のタイムスタンプを除去して返す
            return(list);

            // 召喚したか?
            bool isSummoned(string logLine)
            {
                var r = false;

                if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase))
                {
                    r = true;
                }
                else
                {
                    if (!string.IsNullOrEmpty(player.Name))
                    {
                        r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameFI))
                    {
                        r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameIF))
                    {
                        r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameII))
                    {
                        r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }
                }

                return(r);
            }
        }
Esempio n. 4
0
        public IEnumerable <XIVLog> GetLogLines()
        {
            var player           = FFXIVPlugin.Instance.GetPlayer();
            var palyerIsSummoner = player?
                                   .AsJob()?
                                   .IsSummoner() ?? false;

            var summoned    = false;
            var doneCommand = false;

            var logs = this.GetLogs();

            foreach (var xlvLog in logs)
            {
                // ペットジョブで召喚をしたか?
                if (!summoned &&
                    palyerIsSummoner)
                {
                    summoned = isSummoned(xlvLog.LogLine);
                }

                // コマンドとマッチングする
                doneCommand |= TextCommandController.MatchCommandCore(xlvLog.LogLine);

                yield return(xlvLog);
            }

            if (summoned)
            {
                TableCompiler.Instance.RefreshPetPlaceholder();
            }

            if (doneCommand)
            {
                SystemSounds.Asterisk.Play();
            }

            // ログファイルに出力する
            if (Settings.Default.SaveLogEnabled)
            {
                ChatLogWorker.Instance.AppendLinesAsync(logs);
            }

            // 召喚したか?
            bool isSummoned(string logLine)
            {
                var r = false;

                if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase))
                {
                    r = true;
                }
                else
                {
                    if (!string.IsNullOrEmpty(player.Name))
                    {
                        r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameFI))
                    {
                        r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameIF))
                    {
                        r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }

                    if (!string.IsNullOrEmpty(player.NameII))
                    {
                        r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase);
                    }
                }

                return(r);
            }
        }