/// <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); }
/// <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); }
/// <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); } }