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

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

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

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

            var list = new List <string>(logInfoQueue.Count);
            var partyChangedAtDQX = false;
            var summoned          = false;

            while (logInfoQueue.TryDequeue(
                       out LogLineEventArgs logInfo))
            {
                var logLine = logInfo.logLine.Trim();

                // エフェクトに付与されるツールチップ文字を除去する
                if (Settings.Default.RemoveTooltipSymbols)
                {
                    logLine = TooltipCharsRegex.Replace(logLine, string.Empty);
                }

                // FFXIVでの使用?
                if (!Settings.Default.UseOtherThanFFXIV)
                {
                    if (!summoned)
                    {
                        // ペットIDのCacheを更新する
                        if (palyerIsSummoner)
                        {
                            if (logLine.Contains(player.Name + "の「サモン") ||
                                logLine.Contains("You cast Summon"))
                            {
                                summoned = true;
                            }
                        }
                    }
                }

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

                list.Add(logLine);

                // ログファイルに出力する
                this.AppendLogFile(logLine);
            }

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

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

            // ログのタイムスタンプを記録する
            this.lastLogineTimestamp = DateTime.Now;

            return(list);
        }
Exemple #2
0
        /// <summary>
        /// ログ行を返す
        /// </summary>
        /// <returns>
        /// ログ行の配列</returns>
        public IReadOnlyList <string> GetLogLines()
        {
            var playerRefreshed = false;
            var partyRefreshed  = false;

            // 最後のログから1min間が空いた?
            if ((DateTime.Now - this.lastLogineTimestamp).TotalMinutes >= 1.0d)
            {
                FF14PluginHelper.RefreshPlayer();
                playerRefreshed = true;

                RefreshPartyList();
                partyRefreshed = true;
            }

            if (logInfoQueue.IsEmpty)
            {
                return(EMPTY_STRING_LIST);
            }

            var list              = new List <string>(logInfoQueue.Count);
            var partyChanged      = false;
            var jobChanged        = false;
            var summoned          = false;
            var zoneChanged       = false;
            var partyChangedAtDQX = false;

            LogLineEventArgs logInfo;

            while (logInfoQueue.TryDequeue(out logInfo))
            {
                var logLine = logInfo.logLine.Trim();

                // エフェクトに付与されるツールチップ文字を除去する
                if (Settings.Default.RemoveTooltipSymbols)
                {
                    logLine = TooltipCharsRegex.Replace(logLine, string.Empty);
                }

                // FFXIVでの使用?
                if (!Settings.Default.UseOtherThanFFXIV)
                {
                    // ジョブに変化あり?
                    if (!jobChanged)
                    {
                        if (IsJobChanged(logLine))
                        {
                            jobChanged = true;
                            if (!playerRefreshed)
                            {
                                FF14PluginHelper.RefreshPlayer();
                                playerRefreshed = true;
                            }

                            if (!partyRefreshed)
                            {
                                RefreshPartyList();
                                partyRefreshed = true;
                            }
                        }
                    }

                    // パーティに変化あり
                    if (!partyChanged)
                    {
                        if (IsPartyChanged(logLine))
                        {
                            partyChanged = true;
                        }
                    }

                    if (!(summoned && zoneChanged))
                    {
                        // ペットIDのCacheを更新する
                        var player = FF14PluginHelper.GetPlayer();
                        if (player != null)
                        {
                            var job = player.AsJob();
                            if (job != null)
                            {
                                if (player.AsJob().IsSummoner())
                                {
                                    if (logLine.Contains(player.Name + "の「サモン") ||
                                        logLine.Contains("You cast Summon"))
                                    {
                                        summoned = true;
                                    }

                                    if (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone)
                                    {
                                        zoneChanged = true;
                                    }
                                }
                            }
                        }
                    }
                }

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

                list.Add(logLine);

                // ログファイルに出力する
                this.AppendLogFile(logLine);
            }

            if (partyChanged)
            {
                Task.Run(async() =>
                {
                    await Task.Delay(TimeSpan.FromSeconds(5));
                    RefreshPartyList();
                });
            }

            if (partyChangedAtDQX)
            {
                Task.Run(async() =>
                {
                    await Task.Delay(TimeSpan.FromSeconds(1));
                    DQXUtility.RefeshKeywords();
                });
            }

            if (summoned)
            {
                Task.Run(async() =>
                {
                    await Task.Delay(TimeSpan.FromSeconds(5));
                    RefreshPetID();
                });
            }

            if (zoneChanged)
            {
                var oldSource = petIdRefreshTaskCancelTokenSource;
                if (oldSource != null)
                {
                    lock (oldSource)
                    {
                        if (!oldSource.IsCancellationRequested)
                        {
                            try
                            {
                                oldSource.Cancel();
                            }
                            catch { }
                        }
                    }
                }

                var newSource = petIdRefreshTaskCancelTokenSource = new CancellationTokenSource();
                var token     = newSource.Token;
                var count     = 0;

                Task.Run(async() =>
                {
                    while (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone)
                    {
                        await Task.Delay(TimeSpan.FromSeconds(15));

                        RefreshPetID();
                        count++;

                        if (count >= 6)
                        {
                            return;
                        }
                    }
                }, token);
            }

            // ログのタイムスタンプを記録する
            this.lastLogineTimestamp = DateTime.Now;

            return(list);
        }
Exemple #3
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);
            }
        }