Exemplo n.º 1
0
        /// <summary>
        /// マッチングキーワードを生成する
        /// </summary>
        /// <param name="keyword">元のキーワード</param>
        /// <returns>生成したキーワード</returns>
        public static string MakeKeyword(
            string keyword)
        {
            if (string.IsNullOrWhiteSpace(keyword))
            {
                return(keyword.Trim());
            }

            if (!keyword.Contains("<") ||
                !keyword.Contains(">"))
            {
                return(keyword.Trim());
            }

            keyword = keyword.Trim();

            var player = FF14PluginHelper.GetPlayer();

            if (player != null)
            {
                keyword = keyword.Replace("<me>", player.Name.Trim());
            }

            if (enabledPartyMemberPlaceHolder)
            {
                if (ptmember != null)
                {
                    for (int i = 0; i < ptmember.Count; i++)
                    {
                        keyword = keyword.Replace(
                            "<" + (i + 2).ToString() + ">",
                            ptmember[i].Trim());
                    }
                }
            }

            if (!string.IsNullOrWhiteSpace(petid))
            {
                keyword = keyword.Replace("<petid>", petid);
            }

            // ジョブ名プレースホルダを置換する
            // ex. <PLD>, <PLD1> ...
            if (replacementsByJobs != null)
            {
                foreach (var replacement in replacementsByJobs)
                {
                    keyword = keyword.Replace(replacement.Key, replacement.Value);
                }
            }

            // カスタムプレースホルダを置換する
            // ex. <C1>, <C2> <focus> <ターゲット>...
            foreach (var p in customPlaceholders)
            {
                keyword = keyword.Replace("<" + p.Key + ">", p.Value);
            }

            return(keyword);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 分析用のキーワードを取得する
        /// </summary>
        /// <returns>
        /// キーワードコレクション</returns>
        private IReadOnlyCollection <AnalyzeKeyword> GetKeywords()
        {
            var list = Keywords.ToList();

            // プレイヤ情報とパーティリストを取得する
            var player = FF14PluginHelper.GetPlayer();
            var ptlist = LogBuffer.PartyList;

            if (player != null)
            {
                list.Insert(0, new AnalyzeKeyword()
                {
                    Keyword  = player.Name,
                    Category = AnalyzeKeywordCategory.Me,
                });
            }

            if (ptlist != null)
            {
                foreach (var name in ptlist)
                {
                    list.Insert(0, new AnalyzeKeyword()
                    {
                        Keyword  = name,
                        Category = AnalyzeKeywordCategory.PartyMember,
                    });
                }
            }

            return(list);
        }
Exemplo n.º 3
0
        /// <summary>
        /// マッチングキーワードを生成する
        /// </summary>
        /// <param name="keyword">元のキーワード</param>
        /// <returns>生成したキーワード</returns>
        public static string MakeKeyword(string keyword)
        {
            if (string.IsNullOrEmpty(keyword))
            {
                return(string.Empty);
            }

            keyword = keyword.Trim();

            if (keyword.Length == 0 ||
                !keyword.Contains("<") ||
                !keyword.Contains(">"))
            {
                return(keyword);
            }

            // カスタムプレスホルダを置換する
            keyword = ReplaceCustomPlaceholders(keyword);

            // 対DQX用のキーワードを置換する
            keyword = DQXUtility.MakeKeyword(keyword);

            // FFXIV以外での使用?
            if (Settings.Default.UseOtherThanFFXIV)
            {
                return(keyword);
            }

            var player = FF14PluginHelper.GetPlayer();

            if (player != null)
            {
                keyword = keyword.Replace("<me>", player.Name.Trim());
            }

            if (enabledPartyMemberPlaceHolder && PartyList.Any())
            {
                foreach (var t in PartyList.Zip(PARTY_PLACEHOLDERS,
                                                (name, placeholder) => Tuple.Create(placeholder, name)))
                {
                    keyword = keyword.Replace(t.Item1, t.Item2);
                }
            }

            if (!string.IsNullOrWhiteSpace(currentPetId))
            {
                keyword = keyword.Replace("<petid>", currentPetId);
            }

            // ジョブ名プレースホルダを置換する
            // ex. <PLD>, <PLD1> ...
            foreach (var replacement in PlaceholderToJobNameDictionaly)
            {
                keyword = keyword.Replace(replacement.Key, replacement.Value);
            }

            return(keyword);
        }
Exemplo n.º 4
0
        /// <summary>
        /// パーティリストを更新する
        /// </summary>
        public static void RefreshPTList()
        {
            if (ptmember == null)
            {
                ptmember = new List <string>();
            }
            else
            {
                ptmember.Clear();
            }

            if (Settings.Default.EnabledPartyMemberPlaceholder)
            {
                Debug.WriteLine("PT: Refresh");

                // プレイヤー情報を取得する
                var player = FF14PluginHelper.GetPlayer();
                if (player == null)
                {
                    return;
                }

                // PTメンバの名前を記録しておく
                if (Settings.Default.EnabledPartyMemberPlaceholder)
                {
                    var partyList = FF14PluginHelper.GetCombatantListParty();

                    // FF14内部のPTメンバ自動ソート順で並び替える
                    var sorted =
                        from x in partyList
                        join y in Job.GetJobList() on
                        x.Job equals y.JobId
                        where
                        x.ID != player.ID
                        orderby
                        y.Role,
                        x.Job,
                        x.ID
                    select
                    x.Name.Trim();

                    foreach (var name in sorted)
                    {
                        ptmember.Add(name);
                        Debug.WriteLine("<-  " + name);
                    }
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 分析用のキーワードを取得する
        /// </summary>
        /// <returns>キーワードコレクション</returns>
        private IReadOnlyCollection <string> GetPartyMemberNames()
        {
            var names = new List <string>();

            // プレイヤ情報とパーティリストを取得する
            var player = FF14PluginHelper.GetPlayer();
            var ptlist = LogBuffer.PartyList;

            if (player != null)
            {
                names.Add(player.Name);
            }

            if (ptlist != null)
            {
                names.AddRange(ptlist);
            }

            return(names);
        }
        public void UpdateMonitor()
        {
            if (!MonitorTabSelected)
            {
                InvalidatePlaceholders();
                return;
            }

            if (Interlocked.CompareExchange(ref placeholderIsValid, VALID, INVALID) != INVALID)
            {
                return;
            }

            var player = FF14PluginHelper.GetPlayer();

            RefreshPlaceholders(
                player != null ? player.Name : "",
                LogBuffer.PartyList,
                LogBuffer.PlaceholderToJobNameDictionaly);
        }
Exemplo n.º 7
0
        /// <summary>
        /// マッチングキーワードを生成する
        /// </summary>
        /// <param name="keyword">元のキーワード</param>
        /// <returns>生成したキーワード</returns>
        public static string MakeKeyword(
            string keyword)
        {
            if (string.IsNullOrWhiteSpace(keyword))
            {
                return(keyword.Trim());
            }

            keyword = keyword.Trim();

            var player = FF14PluginHelper.GetPlayer();

            if (player != null)
            {
                keyword = keyword.Replace("<me>", player.Name.Trim());
            }

            if (Settings.Default.EnabledPartyMemberPlaceholder)
            {
                if (ptmember != null)
                {
                    for (int i = 0; i < ptmember.Count; i++)
                    {
                        keyword = keyword.Replace(
                            "<" + (i + 2).ToString() + ">",
                            ptmember[i].Trim());
                    }
                }
            }

            if (!string.IsNullOrWhiteSpace(petid))
            {
                keyword = keyword.Replace("<petid>", petid);
            }

            return(keyword);
        }
Exemplo n.º 8
0
        /// <summary>
        /// パーティリストを更新する
        /// </summary>
        public static void RefreshPartyList()
        {
            // プレイヤー情報を取得する
            var player = FF14PluginHelper.GetPlayer();

            if (player == null)
            {
                return;
            }

            if (enabledPartyMemberPlaceHolder)
            {
#if DEBUG
                Debug.WriteLine("PT: Refresh");
#endif
                // PTメンバの名前を記録しておく
                var combatants = FF14PluginHelper.GetCombatantListParty();

                // FF14内部のPTメンバ自動ソート順で並び替える
                var sorted =
                    from x in combatants
                    join y in Job.JobList on
                    x.Job equals y.JobId
                    where
                    x.ID != player.ID
                    orderby
                    y.Role,
                    x.Job,
                    x.ID descending
                select
                x.Name.Trim();

                partyList = new List <string>(sorted);

                // パーティメンバが空だったら自分を補完しておく
                if (!combatants.Any())
                {
                    combatants.Add(player);
                }

                var newList = new Dictionary <string, string>();

                // ジョブ名によるプレースホルダを登録する
                foreach (var job in Job.JobList)
                {
                    // このジョブに該当するパーティメンバを抽出する
                    var combatantsByJob = (
                        from x in combatants
                        where
                        x.Job == job.JobId
                        orderby
                        x.ID == player.ID ? 0 : 1,
                        x.ID descending
                        select
                        x).ToArray();

                    if (!combatantsByJob.Any())
                    {
                        continue;
                    }

                    // <JOBn>形式を置換する
                    // ex. <PLD1> → Taro Paladin
                    // ex. <PLD2> → Jiro Paladin
                    for (int i = 0; i < combatantsByJob.Length; i++)
                    {
                        var placeholder = string.Format(
                            "<{0}{1}>",
                            job.JobName,
                            i + 1);

                        newList.Add(placeholder.ToUpper(), combatantsByJob[i].Name);
                    }

                    // <JOB>形式を置換する
                    // ただし、この場合は正規表現のグループ形式とする
                    // また、グループ名にはジョブの略称を設定する
                    // ex. <PLD> → (?<PLDs>Taro Paladin|Jiro Paladin)
                    var names    = string.Join("|", combatantsByJob.Select(x => x.Name).ToArray());
                    var oldValue = string.Format("<{0}>", job.JobName);
                    var newValue = string.Format(
                        "(?<{0}s>{1})",
                        job.JobName.ToUpper(),
                        names);

                    newList.Add(oldValue.ToUpper(), newValue);
                }

                placeholderToJobNameDictionaly = newList;
            }
            else
            {
                partyList = EMPTY_STRING_LIST;
                placeholderToJobNameDictionaly = EMPTY_STRING_PAIR_MAP;
            }

            // 置換後のマッチングキーワードを消去する
            SpellTimerTable.ClearReplacedKeywords();
            OnePointTelopTable.Default.ClearReplacedKeywords();

            // スペルタイマーの再描画を行う
            SpellTimerTable.ClearUpdateFlags();

            // モニタタブの情報を無効にする
            SpecialSpellTimerPlugin.ConfigPanel.InvalidatePlaceholders();
        }
Exemplo n.º 9
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;

            LogLineEventArgs logInfo;

            while (logInfoQueue.TryDequeue(out logInfo))
            {
                string logLine = logInfo.logLine.Trim();
                // ジョブに変化あり?
                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 jobName = Job.GetJobName(player.Job);
                        if (player.AsJob().IsSummoner())
                        {
                            if (logLine.Contains(player.Name + "の「サモン") ||
                                logLine.Contains("You cast Summon"))
                            {
                                summoned = true;
                            }

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

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

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

            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);
        }
Exemplo n.º 10
0
        /// <summary>
        /// ログを一行読取った
        /// </summary>
        /// <param name="isImport">Importか?</param>
        /// <param name="logInfo">ログ情報</param>
        private void oFormActMain_OnLogLineRead(bool isImport, LogLineEventArgs logInfo)
        {
            if (isImport)
            {
                return;
            }

#if false
            Debug.WriteLine(logInfo.logLine);
#endif

            var logLine = logInfo.logLine.Trim();

            // ジョブに変化あり?
            if (logLine.Contains("にチェンジした。") || logLine.Contains("You change to "))
            {
                FF14PluginHelper.RefreshPlayer();
            }

            // パーティに変化あり?
            if (ptmember == null ||
                logLine.Contains("パーティを解散しました。") ||
                logLine.Contains("がパーティに参加しました。") ||
                logLine.Contains("がパーティから離脱しました。") ||
                logLine.Contains("をパーティから離脱させました。") ||
                logLine.Contains("の攻略を開始した。") ||
                logLine.Contains("の攻略を終了した。") ||
                (logLine.Contains("You join ") && logLine.Contains("'s party.")) ||
                logLine.Contains("You left the party.") ||
                logLine.Contains("You dissolve the party.") ||
                logLine.Contains("The party has been disbanded.") ||
                logLine.Contains("joins the party.") ||
                logLine.Contains("has left the party.") ||
                logLine.Contains("was removed from the party."))
            {
                Task.Run(() =>
                {
                    Thread.Sleep(5 * 1000);
                    RefreshPTList();
                }).ContinueWith((t) =>
                {
                    t.Dispose();
                });
            }

            // ペットIDのCacheを更新する
            var player = FF14PluginHelper.GetPlayer();
            if (player != null)
            {
                var jobName = Job.GetJobName(player.Job);
                Debug.WriteLine("JOB NAME!! " + jobName);
                if (jobName == "巴術士" || jobName == "ARC" ||
                    jobName == "学者" || jobName == "SCH" ||
                    jobName == "召喚士" || jobName == "SMN")
                {
                    if (logLine.Contains(player.Name + "の「サモン") || logLine.Contains("You cast Summon"))
                    {
                        Task.Run(() =>
                        {
                            Thread.Sleep(5 * 1000);
                            RefreshPetID();
                        }).ContinueWith((t) =>
                        {
                            t.Dispose();
                        });
                    }

                    if (petidZone != ActGlobals.oFormActMain.CurrentZone)
                    {
                        Task.Run(() =>
                        {
                            lock (lockPetidObject)
                            {
                                var count = 0;
                                while (petidZone != ActGlobals.oFormActMain.CurrentZone)
                                {
                                    Thread.Sleep(15 * 1000);
                                    RefreshPetID();
                                    count++;

                                    if (count >= 6)
                                    {
                                        petidZone = ActGlobals.oFormActMain.CurrentZone;
                                        break;
                                    }
                                }
                            }
                        }).ContinueWith((t) =>
                        {
                            t.Dispose();
                        });
                    }
                }
            }

            lock (this.buffer)
            {
                this.buffer.Add(logLine);
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// ログを1行読取った
        /// </summary>
        /// <param name="isImport">Importか?</param>
        /// <param name="logInfo">ログ情報</param>
        private void oFormActMain_OnLogLineRead(
            bool isImport,
            LogLineEventArgs logInfo)
        {
            if (!Settings.Default.CombatLogEnabled)
            {
                return;
            }

            if (this.CurrentCombatLogList == null)
            {
                return;
            }

            // ログにペットが含まれている?
            if (logInfo.logLine.Contains("・エギ") ||
                logInfo.logLine.Contains("フェアリー・") ||
                logInfo.logLine.Contains("カーバンクル・"))
            {
                return;
            }

            // インポートログではない?
            if (!isImport)
            {
                // プレイヤ情報とパーティリストを取得する
                var player = FF14PluginHelper.GetPlayer();
                var ptlist = LogBuffer.PartyList;

                if (player == null ||
                    ptlist == null)
                {
                    return;
                }

                // ログにプレイヤ名が含まれている?
                if (logInfo.logLine.Contains(player.Name))
                {
                    return;
                }

                // ログにパーティメンバ名が含まれている?
                foreach (var name in ptlist)
                {
                    if (logInfo.logLine.Contains(name))
                    {
                        return;
                    }
                }
            }

            // キャストのキーワードが含まれている?
            foreach (var keyword in CastKeywords)
            {
                if (logInfo.logLine.Contains(keyword))
                {
                    this.StoreCastLog(logInfo);
                    return;
                }
            }

            // アクションのキーワードが含まれている?
            foreach (var keyword in ActionKeywords)
            {
                if (logInfo.logLine.Contains(keyword))
                {
                    this.StoreActionLog(logInfo);
                    return;
                }
            }

            // 残HP率のキーワードが含まれている?
            foreach (var keyword in HPRateKeywords)
            {
                if (logInfo.logLine.Contains(keyword))
                {
                    this.StoreHPRateLog(logInfo);
                    return;
                }
            }

            // Addedのキーワードが含まれている?
            foreach (var keyword in AddedKeywords)
            {
                if (logInfo.logLine.Contains(keyword))
                {
                    this.StoreAddedLog(logInfo);
                    return;
                }
            }
        }
Exemplo n.º 12
0
        /// <summary>
        /// ログを一行読取った
        /// </summary>
        /// <param name="isImport">Importか?</param>
        /// <param name="logInfo">ログ情報</param>
        private void oFormActMain_OnLogLineRead(bool isImport, LogLineEventArgs logInfo)
        {
            if (isImport)
            {
                return;
            }

#if false
            Debug.WriteLine(logInfo.logLine);
#endif

            var logLine = logInfo.logLine.Trim();

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

            // ジョブに変化あり?
            if (logLine.Contains("にチェンジした。") ||
                logLine.Contains("You change to "))
            {
                FF14PluginHelper.RefreshPlayer();
                RefreshPTList();
            }

            // パーティに変化あり?
            if (enabledPartyMemberPlaceHolder)
            {
                if (ptmember == null ||
                    replacementsByJobs == null ||
                    logLine.Contains("パーティを解散しました。") ||
                    logLine.Contains("がパーティに参加しました。") ||
                    logLine.Contains("がパーティから離脱しました。") ||
                    logLine.Contains("をパーティから離脱させました。") ||
                    logLine.Contains("の攻略を開始した。") ||
                    logLine.Contains("の攻略を終了した。") ||
                    (logLine.Contains("You join ") && logLine.Contains("'s party.")) ||
                    logLine.Contains("You left the party.") ||
                    logLine.Contains("You dissolve the party.") ||
                    logLine.Contains("The party has been disbanded.") ||
                    logLine.Contains("joins the party.") ||
                    logLine.Contains("has left the party.") ||
                    logLine.Contains("was removed from the party."))
                {
                    Task.Run(() =>
                    {
                        Thread.Sleep(5 * 1000);
                        RefreshPTList();
                    });
                }
            }

            // ペットIDのCacheを更新する
            var player = FF14PluginHelper.GetPlayer();
            if (player != null)
            {
                var jobName = Job.GetJobName(player.Job);
#if DEBUG
                Debug.WriteLine("JOB NAME!! " + jobName);
#endif
                if (jobName == "巴術士" || jobName == "ARC" ||
                    jobName == "学者" || jobName == "SCH" ||
                    jobName == "召喚士" || jobName == "SMN")
                {
                    if (logLine.Contains(player.Name + "の「サモン") ||
                        logLine.Contains("You cast Summon"))
                    {
                        Task.Run(() =>
                        {
                            Thread.Sleep(5 * 1000);
                            RefreshPetID();
                        });
                    }

                    if (petidZone != ActGlobals.oFormActMain.CurrentZone)
                    {
                        Task.Run(() =>
                        {
                            lock (lockPetidObject)
                            {
                                var count = 0;
                                while (petidZone != ActGlobals.oFormActMain.CurrentZone)
                                {
                                    Thread.Sleep(15 * 1000);
                                    RefreshPetID();
                                    count++;

                                    if (count >= 6)
                                    {
                                        petidZone = ActGlobals.oFormActMain.CurrentZone;
                                        break;
                                    }
                                }
                            }
                        });
                    }
                }
            }

            lock (this.buffer)
            {
                this.buffer.Add(logLine);

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

            // ログファイルに出力する
            this.AppendLogFile(logLine);
        }
Exemplo n.º 13
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 playerChanged     = false;
            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 (!playerChanged)
                    {
                        if (IsPlayerChanged(logInfo.logLine))
                        {
                            if (!playerRefreshed)
                            {
                                FF14PluginHelper.RefreshPlayer();
                                playerRefreshed = true;
                            }

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

                            Logger.Write("primary player changed.");

                            playerChanged = true;
                        }
                    }

                    // ジョブに変化あり?
                    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);
        }