Example Remove the ability to upload logs to the server.

移除向服务器上传日志的功能。
This commit is contained in:
Cold-Mint 2024-10-11 17:59:47 +08:00
parent 94e620befd
commit e0e4c80e94
Signed by: Cold-Mint
GPG Key ID: C5A9BF8A98E0CE99
24 changed files with 62 additions and 438 deletions

View File

@ -75,34 +75,6 @@ Enter the following command in the directory where the game is located:
./Traveler.sh ./Traveler.sh
``` ```
## Configuring Openobserve
> This is optional, and the game will work even if you do not configure Openobserve.
openobserve is used to continuously collect logs and alarm information after a game has been released.
#### Set up the openobserve server
see[openobserve](https://github.com/openobserve/openobserve)
#### Write configuration
After you have set up an openobserve server, follow the following steps to configure the file:
1. Create a configuration file named **AppConfig.yaml** in the root directory of your project.
2. Fill in the information for the remote server.
```yaml
open_observe:
address: [address]
access_token: [token]
org_id: [org_id]
stream_name: [stream_name]
```
address Indicates the address of the server in the format of http(s)://www.example.com. (Support http and https)
## Participate in translation ## Participate in translation
The project is prepared for localization at the beginning of writing. You can edit the csv file in the locals directory. The project is prepared for localization at the beginning of writing. You can edit the csv file in the locals directory.

View File

@ -69,35 +69,6 @@ data/*
``` ```
./Traveler.sh ./Traveler.sh
``` ```
## はいちOpenobserve
> これはオプションなので、Openobserveを設定しなくてもゲームは正常に動作します。
openobserveは、リリース後にログやアラームを継続的に収集するために使用されます。
#### 搭建openobserve衣服务器
読み過ごす:[openobserve](https://github.com/openobserve/openobserve)
#### 構成を書きます
openobserveのサーバーを構築したら、次のようにファイルを設定します。
1. プロジェクトのルートディレクトリに**AppConfig.yaml **というプロファイルを作成します。
2. リモートサーバーの情報を入力します。
```yaml
open_observe:
address: [address]
access_token: [token]
org_id: [org_id]
stream_name: [stream_name]
```
address サーバーのアドレス、フォーマットはこうなります http(s)://www.example.com。支持http和https
## 翻訳に携わります ## 翻訳に携わります
このプロジェクトは、当初からローカライズの準備ができていました。localsディレクトリのcsvファイルを編集することができます。新しい翻訳を加えたり修正したりしています このプロジェクトは、当初からローカライズの準備ができていました。localsディレクトリのcsvファイルを編集することができます。新しい翻訳を加えたり修正したりしています

View File

@ -72,34 +72,6 @@ data/*
./Traveler.sh ./Traveler.sh
``` ```
## 配置Openobserve
> 这是可选的操作即使您不配置Openobserve游戏也能正常运行。
openobserve用于在游戏发布后持续收集日志和报警信息。
#### 搭建openobserve服务器
请见:[openobserve](https://github.com/openobserve/openobserve)
#### 编写配置
在您搭建完毕openobserve的服务器后按如下步骤配置文件
1. 在项目的根目录创建名为**AppConfig.yaml**的配置文件。
2. 填入远程服务器的信息。
```yaml
open_observe:
address: [address]
access_token: [token]
org_id: [org_id]
stream_name: [stream_name]
```
address 服务器的地址,格式为 http(s)://www.example.com。支持http和https
## 参与翻译 ## 参与翻译
此项目在编写之初就为本地化做好了准备。您可以编辑locals目录下的csv文件。来修改和添加新的翻译。 此项目在编写之初就为本地化做好了准备。您可以编辑locals目录下的csv文件。来修改和添加新的翻译。

View File

@ -62,10 +62,6 @@ log_owner_is_not_AiCharacter,所有者不是AiCharacter。,Owner is not AiCharac
log_find_nearest_item,查找最近的物品。,Find the nearest item.,最も近いアイテムを見つけます。 log_find_nearest_item,查找最近的物品。,Find the nearest item.,最も近いアイテムを見つけます。
log_float_label_instantiate_failed,浮动标签实例化失败。,Float label instantiation failed.,フロートラベルのインスタンス化に失敗しました。 log_float_label_instantiate_failed,浮动标签实例化失败。,Float label instantiation failed.,フロートラベルのインスタンス化に失敗しました。
log_pickable_picked_up,可拾捡物被捡起了,那么不显示标签。,"If the pickable item is picked up, the label is not displayed.",でも、拾得物が拾い上げられたら、ラベルは表示されません。 log_pickable_picked_up,可拾捡物被捡起了,那么不显示标签。,"If the pickable item is picked up, the label is not displayed.",でも、拾得物が拾い上げられたら、ラベルは表示されません。
log_start_uploading,开始上传{0}条日志。,Start uploading {0} logs.,{0}個のログをアップロードを開始します。
log_upload_successful,上传成功,已上传{0}条日志,剩余{1}条日志待上传。,"Upload successful, {0} logs uploaded, {1} logs remaining.",アップロードが成功しました、{0}個のログがアップロードされ、{1}個のログが残っています。
log_upload_failed,上传失败,错误代码:{0},剩余{1}条日志待上传。,"Upload failed, error code: {0}, {1} logs remaining.",アップロードに失敗しました、エラーコード:{0}、{1}個のログが残っています。
log_upload_status,已记录{0}条日志,上传阈值为{1}。,"{0} logs recorded, upload threshold is {1}.",{0}個のログが記録され、アップロード閾値は{1}です。
log_weapon_detected,检测到武器。,Weapon detected.,武器が検出されました。 log_weapon_detected,检测到武器。,Weapon detected.,武器が検出されました。
log_no_weapon_detected,没有检测到武器。,No weapon detected.,武器が検出されません。 log_no_weapon_detected,没有检测到武器。,No weapon detected.,武器が検出されません。
log_weapon_lost,武器丢失。,Weapon lost.,武器が失われました。 log_weapon_lost,武器丢失。,Weapon lost.,武器が失われました。

1 id zh en ja
62 log_find_nearest_item 查找最近的物品。 Find the nearest item. 最も近いアイテムを見つけます。
63 log_float_label_instantiate_failed 浮动标签实例化失败。 Float label instantiation failed. フロートラベルのインスタンス化に失敗しました。
64 log_pickable_picked_up 可拾捡物被捡起了,那么不显示标签。 If the pickable item is picked up, the label is not displayed. でも、拾得物が拾い上げられたら、ラベルは表示されません。
log_start_uploading 开始上传{0}条日志。 Start uploading {0} logs. {0}個のログをアップロードを開始します。
log_upload_successful 上传成功,已上传{0}条日志,剩余{1}条日志待上传。 Upload successful, {0} logs uploaded, {1} logs remaining. アップロードが成功しました、{0}個のログがアップロードされ、{1}個のログが残っています。
log_upload_failed 上传失败,错误代码:{0},剩余{1}条日志待上传。 Upload failed, error code: {0}, {1} logs remaining. アップロードに失敗しました、エラーコード:{0}、{1}個のログが残っています。
log_upload_status 已记录{0}条日志,上传阈值为{1}。 {0} logs recorded, upload threshold is {1}. {0}個のログが記録され、アップロード閾値は{1}です。
65 log_weapon_detected 检测到武器。 Weapon detected. 武器が検出されました。
66 log_no_weapon_detected 没有检测到武器。 No weapon detected. 武器が検出されません。
67 log_weapon_lost 武器丢失。 Weapon lost. 武器が失われました。

View File

@ -1,92 +0,0 @@
using ColdMint.scripts.debug;
using ColdMint.scripts.openObserve;
using ColdMint.scripts.serialization;
using Godot;
namespace ColdMint.scripts;
public class AppConfig
{
/// <summary>
/// <para>Load configuration from file</para>
/// <para>从文件加载配置</para>
/// </summary>
public static AppConfigData? LoadFromFile()
{
var appConfigExists = FileAccess.FileExists(Config.AppConfigPath);
if (!appConfigExists)
{
LogCat.LogWarning("appConfig_not_exist");
return null;
}
var appConfigFileAccess = FileAccess.Open(Config.AppConfigPath, FileAccess.ModeFlags.Read);
var yamlData = appConfigFileAccess.GetAsText();
appConfigFileAccess.Close();
return YamlSerialization.Deserialize<AppConfigData>(yamlData);
}
/// <summary>
/// <para>ApplyAppConfig</para>
/// <para>应用配置</para>
/// </summary>
/// <param name="appConfigData"></param>
public static void ApplyAppConfig(AppConfigData appConfigData)
{
if (appConfigData.OpenObserve != null)
{
LogCollector.UpdateHttpClient(appConfigData.OpenObserve);
}
}
}
public class AppConfigData
{
/// <summary>
/// <para>OpenObserve configuration information</para>
/// <para>OpenObserve的配置信息</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public OpenObserve? OpenObserve { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
}
/// <summary>
/// <para>OpenObserve Configuration information</para>
/// <para>OpenObserve配置信息</para>
/// </summary>
public class OpenObserve
{
/// <summary>
/// <para>server address</para>
/// <para>服务器地址</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public string? Address { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
/// <summary>
/// <para>Access Token</para>
/// <para>访问密匙</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public string? AccessToken { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
/// <summary>
/// <para>Organization ID</para>
/// <para>组织ID</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public string? OrgId { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
/// <summary>
/// <para>Stream Name</para>
/// <para>流名称</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public string? StreamName { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
}

View File

@ -45,7 +45,7 @@ public partial class BubbleMarker : Marker2D
{ {
if (!_bubbleDictionary.TryGetValue(id, out var value)) if (!_bubbleDictionary.TryGetValue(id, out var value))
{ {
LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker, LogCat.UploadFormat,id); LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker,id);
return; return;
} }
@ -60,7 +60,7 @@ public partial class BubbleMarker : Marker2D
{ {
if (!_bubbleDictionary.TryGetValue(id, out var value)) if (!_bubbleDictionary.TryGetValue(id, out var value))
{ {
LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker, LogCat.UploadFormat,id); LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker,id);
return; return;
} }

View File

@ -40,7 +40,7 @@ public static class CampManager
if (camp.Id != Config.CampId.Default) return false; if (camp.Id != Config.CampId.Default) return false;
_defaultCamp = camp; _defaultCamp = camp;
AddCamp(camp); AddCamp(camp);
LogCat.LogWithFormat("set_default_camp", label: LogCat.LogLabel.CampManager, LogCat.UploadFormat, camp.Id); LogCat.LogWithFormat("set_default_camp", label: LogCat.LogLabel.CampManager, camp.Id);
return true; return true;
} }

View File

@ -640,12 +640,12 @@ public partial class CharacterTemplate : CharacterBody2D
if (damageTemplate.Attacker is CharacterTemplate characterTemplate && if (damageTemplate.Attacker is CharacterTemplate characterTemplate &&
!string.IsNullOrEmpty(characterTemplate.CharacterName)) !string.IsNullOrEmpty(characterTemplate.CharacterName))
{ {
LogCat.LogWithFormat("death_info", LogCat.LogLabel.Default, LogCat.UploadFormat, CharacterName, LogCat.LogWithFormat("death_info", LogCat.LogLabel.Default, CharacterName,
characterTemplate.CharacterName); characterTemplate.CharacterName);
} }
else else
{ {
LogCat.LogWithFormat("death_info", LogCat.LogLabel.Default, LogCat.UploadFormat, CharacterName, LogCat.LogWithFormat("death_info", LogCat.LogLabel.Default, CharacterName,
damageTemplate.Attacker.Name); damageTemplate.Attacker.Name);
} }
} }

View File

@ -47,7 +47,7 @@ public partial class Player : CharacterTemplate
return; return;
} }
CharacterName = TranslationServerUtils.Translate("default_player_name"); CharacterName = TranslationServerUtils.Translate("default_player_name");
LogCat.LogWithFormat("player_spawn_debug", LogCat.LogLabel.Default, LogCat.UploadFormat, ReadOnlyCharacterName, LogCat.LogWithFormat("player_spawn_debug", LogCat.LogLabel.Default, ReadOnlyCharacterName,
GlobalPosition); GlobalPosition);
_parabola = GetNode<Line2D>("Parabola"); _parabola = GetNode<Line2D>("Parabola");
var healthBarUi = GameSceneDepend.HealthBarUi; var healthBarUi = GameSceneDepend.HealthBarUi;

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using ColdMint.scripts.openObserve;
using ColdMint.scripts.utils; using ColdMint.scripts.utils;
using Godot; using Godot;
@ -143,11 +142,6 @@ public static class LogCat
set => _minLogLevel = value; set => _minLogLevel = value;
} }
/// <summary>
/// <para>Whether to upload logs that need to be formatted by default</para>
/// <para>是否默认上传需要格式化的日志</para>
/// </summary>
public static bool UploadFormat { get; set; } = true;
private static readonly StringBuilder StringBuilder = new StringBuilder(); private static readonly StringBuilder StringBuilder = new StringBuilder();
@ -249,14 +243,12 @@ public static class LogCat
/// </param> /// </param>
/// <param name="label"> /// <param name="label">
/// </param> /// </param>
/// <param name="upload"> public static void Log(string message, string label = LogLabel.Default)
/// </param>
public static void Log(string message, string label = LogLabel.Default, bool upload = true)
{ {
PrintLog(InfoLogLevel, HandleMessage(InfoLogLevel, message, label).ToString(), label, upload); PrintLog(InfoLogLevel, HandleMessage(InfoLogLevel, message, label).ToString(), label);
} }
private static void PrintLog(int level, string concreteLog, string label, bool upload) private static void PrintLog(int level, string concreteLog, string label)
{ {
if (!IsEnabledLogLabel(label)) if (!IsEnabledLogLabel(label))
{ {
@ -268,20 +260,6 @@ public static class LogCat
return; return;
} }
//If you need to upload logs, you can upload logs.
//如果需要上传日志,并且能够上传日志。
if (LogCollector.CanUploadLog && upload)
{
var logData = new LogData
{
Level = level,
Message = concreteLog
};
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
LogCollector.Push(logData);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
}
switch (level) switch (level)
{ {
case WarningLogLevel: case WarningLogLevel:
@ -307,34 +285,30 @@ public static class LogCat
/// <para>这个消息支持本地化输出假设已存在翻译keyHello = 你好传入Hello则会输出你好。</para> /// <para>这个消息支持本地化输出假设已存在翻译keyHello = 你好传入Hello则会输出你好。</para>
/// </param> /// </param>
/// <param name="label"></param> /// <param name="label"></param>
/// <param name="upload"></param> public static void LogError(string message, string label = LogLabel.Default)
public static void LogError(string message, string label = LogLabel.Default, bool upload = true)
{ {
PrintLog(ErrorLogLevel, HandleMessage(ErrorLogLevel, message, label).ToString(), label, upload); PrintLog(ErrorLogLevel, HandleMessage(ErrorLogLevel, message, label).ToString(), label);
} }
public static void LogWarning(string message, string label = LogLabel.Default, bool upload = true) public static void LogWarning(string message, string label = LogLabel.Default)
{ {
PrintLog(WarningLogLevel, HandleMessage(WarningLogLevel, message, label).ToString(), label, upload); PrintLog(WarningLogLevel, HandleMessage(WarningLogLevel, message, label).ToString(), label);
} }
public static void LogErrorWithFormat(string message, string label, bool upload, params object?[] args) public static void LogErrorWithFormat(string message, string label, params object?[] args)
{ {
PrintLog(ErrorLogLevel, string.Format(HandleMessage(ErrorLogLevel, message, label).ToString(), args), label, PrintLog(ErrorLogLevel, string.Format(HandleMessage(ErrorLogLevel, message, label).ToString(), args), label);
upload);
} }
public static void LogWithFormat(string message, string label, bool upload, params object?[] args) public static void LogWithFormat(string message, string label, params object?[] args)
{ {
PrintLog(InfoLogLevel, string.Format(HandleMessage(InfoLogLevel, message, label).ToString(), args), label, PrintLog(InfoLogLevel, string.Format(HandleMessage(InfoLogLevel, message, label).ToString(), args), label);
upload);
} }
public static void LogWarningWithFormat(string message, string label, bool upload, params object?[] args) public static void LogWarningWithFormat(string message, string label, params object?[] args)
{ {
PrintLog(WarningLogLevel, string.Format(HandleMessage(WarningLogLevel, message, label).ToString(), args), label, PrintLog(WarningLogLevel, string.Format(HandleMessage(WarningLogLevel, message, label).ToString(), args), label);
upload);
} }
/// <summary> /// <summary>
@ -353,6 +327,6 @@ public static class LogCat
//Log an exception here or send it to the server. //Log an exception here or send it to the server.
//请在这里记录异常或将异常发送至服务器。 //请在这里记录异常或将异常发送至服务器。
PrintLog(ErrorLogLevel, PrintLog(ErrorLogLevel,
HandleMessage(ErrorLogLevel, e.Message, label).Append('\n').Append(e.StackTrace).ToString(), label, true); HandleMessage(ErrorLogLevel, e.Message, label).Append('\n').Append(e.StackTrace).ToString(), label);
} }
} }

View File

@ -34,7 +34,7 @@ public static class ItemTypeRegister
var error = DirAccess.GetOpenError(); var error = DirAccess.GetOpenError();
if (error is not Error.Ok) if (error is not Error.Ok)
{ {
LogCat.LogErrorWithFormat("error_when_open_item_regs_dir", LogCat.LogLabel.Default, true, itemRegsDirPath, LogCat.LogErrorWithFormat("error_when_open_item_regs_dir", LogCat.LogLabel.Default, itemRegsDirPath,
error.ToString()); error.ToString());
return; return;
} }
@ -44,11 +44,11 @@ public static class ItemTypeRegister
var files = itemRegsDir.GetFiles(); var files = itemRegsDir.GetFiles();
if (files == null) if (files == null)
{ {
LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, LogCat.UploadFormat, 0); LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, 0);
return; return;
} }
LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, LogCat.UploadFormat, files.Length); LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, files.Length);
//将文件解析为项目类型信息 //将文件解析为项目类型信息
//parse files to item type infos //parse files to item type infos
var count = 0; var count = 0;
@ -68,7 +68,7 @@ public static class ItemTypeRegister
count++; count++;
} }
LogCat.LogWithFormat("found_item_types", LogCat.LogLabel.Default, LogCat.UploadFormat, count); LogCat.LogWithFormat("found_item_types", LogCat.LogLabel.Default, count);
} }
/// <summary> /// <summary>
@ -120,7 +120,7 @@ public static class ItemTypeRegister
return newItem; return newItem;
}); });
var succeed = ItemTypeManager.Register(itemType); var succeed = ItemTypeManager.Register(itemType);
LogCat.LogWithFormat("register_item", label: LogCat.LogLabel.Default, LogCat.UploadFormat, itemType.Id, LogCat.LogWithFormat("register_item", label: LogCat.LogLabel.Default, itemType.Id,
succeed); succeed);
} }

View File

@ -69,14 +69,6 @@ public partial class SplashScreenLoader : UiLoaderTemplate
/// </summary> /// </summary>
private async Task LoadingGlobalData() private async Task LoadingGlobalData()
{ {
//Loading App configuration
//加载App配置
var appConfigData = AppConfig.LoadFromFile();
if (appConfigData != null)
{
AppConfig.ApplyAppConfig(appConfigData);
}
//Set the minimum log level to Info in debug mode.(Print all logs) //Set the minimum log level to Info in debug mode.(Print all logs)
//在调试模式下将最小日志等级设置为Info。打印全部日志 //在调试模式下将最小日志等级设置为Info。打印全部日志
//Disable all logs in the release version. //Disable all logs in the release version.

View File

@ -25,7 +25,7 @@ public readonly struct LootList(string id, IList<LootGroup> groups)
{ {
if (Groups is []) if (Groups is [])
{ {
LogCat.LogWithFormat("loot_list_has_no_entries", LogCat.LogLabel.Default, LogCat.UploadFormat, Id); LogCat.LogWithFormat("loot_list_has_no_entries", LogCat.LogLabel.Default, Id);
return []; return [];
} }
@ -41,10 +41,10 @@ public readonly struct LootList(string id, IList<LootGroup> groups)
//我们为每个战利品条目生成一个战利品数据。 //我们为每个战利品条目生成一个战利品数据。
var datum = group.GenerateLootData(); var datum = group.GenerateLootData();
lootDataList.Add(datum); lootDataList.Add(datum);
LogCat.LogWithFormat("loot_data_add", LogCat.LogLabel.Default, LogCat.UploadFormat,datum); LogCat.LogWithFormat("loot_data_add", LogCat.LogLabel.Default, datum);
} }
LogCat.LogWithFormat("loot_data_quantity", LogCat.LogLabel.Default, LogCat.UploadFormat,lootDataList.Count); LogCat.LogWithFormat("loot_data_quantity", LogCat.LogLabel.Default, lootDataList.Count);
return lootDataList.ToArray(); return lootDataList.ToArray();
} }
} }

View File

@ -30,7 +30,7 @@ public partial class ItemSpawn : Marker2D, ISpawnMarker
return null; return null;
} }
var item = ItemTypeManager.CreateItem(itemId, this); var item = ItemTypeManager.CreateItem(itemId, this);
LogCat.LogWithFormat("generated_item_is_empty", LogCat.LogLabel.ItemSpawn, true, itemId, item == null); LogCat.LogWithFormat("generated_item_is_empty", LogCat.LogLabel.ItemSpawn, itemId, item == null);
if (item is not Node2D node2D) if (item is not Node2D node2D)
{ {
return null; return null;

View File

@ -245,7 +245,7 @@ public static class MapGenerator
//If the room injection processor cannot be found, a print error occurs. //If the room injection processor cannot be found, a print error occurs.
//如果找不到房间注入处理器,那么打印错误。 //如果找不到房间注入处理器,那么打印错误。
LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist", LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist",
LogCat.LogLabel.Default, LogCat.UploadFormat, injectionProcessorData.Id); LogCat.LogLabel.Default, injectionProcessorData.Id);
continue; continue;
} }
@ -282,7 +282,7 @@ public static class MapGenerator
if (roomPlacementData == null) if (roomPlacementData == null)
{ {
LogCat.LogWithFormat("failed_to_calculate_the_room_location", LogCat.LogLabel.Default, LogCat.LogWithFormat("failed_to_calculate_the_room_location", LogCat.LogLabel.Default,
LogCat.UploadFormat, roomNodeData.Id); roomNodeData.Id);
continue; continue;
} }
@ -368,19 +368,19 @@ public static class MapGenerator
if (dictionary.ContainsKey(roomNodeDataId)) if (dictionary.ContainsKey(roomNodeDataId))
{ {
LogCat.LogWithFormat("place_existing_rooms", LogCat.LogLabel.Default, LogCat.UploadFormat, roomNodeDataId); LogCat.LogWithFormat("place_existing_rooms", LogCat.LogLabel.Default, roomNodeDataId);
return false; return false;
} }
if (!await _roomPlacementStrategy.PlaceRoom(_mapRoot, roomPlacementData)) if (!await _roomPlacementStrategy.PlaceRoom(_mapRoot, roomPlacementData))
{ {
LogCat.LogWarningWithFormat("room_placement_failed", LogCat.LogLabel.Default, LogCat.UploadFormat, LogCat.LogWarningWithFormat("room_placement_failed", LogCat.LogLabel.Default,
roomNodeDataId); roomNodeDataId);
return false; return false;
} }
dictionary.Add(roomNodeDataId, roomPlacementData.NewRoom); dictionary.Add(roomNodeDataId, roomPlacementData.NewRoom);
LogCat.LogWithFormat("room_placement_information", LogCat.LogLabel.Default, LogCat.UploadFormat, roomNodeDataId, LogCat.LogWithFormat("room_placement_information", LogCat.LogLabel.Default, roomNodeDataId,
roomPlacementData.Position.ToString()); roomPlacementData.Position.ToString());
return true; return true;
} }

View File

@ -93,7 +93,7 @@ public partial class MiniMap : NinePatchRect
CalculateRelativePositionOnTheMinimap(roomDictionaryValue)); CalculateRelativePositionOnTheMinimap(roomDictionaryValue));
if (textureRect == null) if (textureRect == null)
{ {
LogCat.LogErrorWithFormat("failed_to_create_room_preview", LogCat.LogLabel.Default, LogCat.UploadFormat, LogCat.LogErrorWithFormat("failed_to_create_room_preview", LogCat.LogLabel.Default,
dictionaryKey); dictionaryKey);
} }
else else

View File

@ -170,8 +170,7 @@ public class Room
/// </summary> /// </summary>
private void ShowAllCharacterTemplate() private void ShowAllCharacterTemplate()
{ {
LogCat.LogWithFormat("show_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat, LogCat.LogWithFormat("show_all_node", LogCat.LogLabel.Room, _allCharacter.Count);
_allCharacter.Count);
foreach (var characterTemplate in _allCharacter) foreach (var characterTemplate in _allCharacter)
{ {
characterTemplate.Show(); characterTemplate.Show();
@ -184,8 +183,7 @@ public class Room
/// </summary> /// </summary>
private void HideAllCharacterTemplate() private void HideAllCharacterTemplate()
{ {
LogCat.LogWithFormat("hide_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat, LogCat.LogWithFormat("hide_all_node", LogCat.LogLabel.Room, _allCharacter.Count);
_allCharacter.Count);
foreach (var characterTemplate in _allCharacter) foreach (var characterTemplate in _allCharacter)
{ {
characterTemplate.Hide(); characterTemplate.Hide();
@ -272,7 +270,7 @@ public class Room
{ {
if (_rootNode != null) if (_rootNode != null)
{ {
LogCat.LogWithFormat("enter_the_room_debug", LogCat.LogLabel.Default, LogCat.UploadFormat, node.Name, LogCat.LogWithFormat("enter_the_room_debug", LogCat.LogLabel.Default, node.Name,
_rootNode.Name); _rootNode.Name);
} }
@ -325,7 +323,7 @@ public class Room
{ {
if (_rootNode != null) if (_rootNode != null)
{ {
LogCat.LogWithFormat("exit_the_room_debug", LogCat.LogLabel.Default, LogCat.UploadFormat, node.Name, LogCat.LogWithFormat("exit_the_room_debug", LogCat.LogLabel.Default, node.Name,
_rootNode.Name); _rootNode.Name);
} }

View File

@ -59,7 +59,7 @@ public class ModLoader
{ {
//When the dll that must be loaded does not exist, an error is reported immediately. //When the dll that must be loaded does not exist, an error is reported immediately.
//当必须加载的dll不存在时立即报错。 //当必须加载的dll不存在时立即报错。
LogCat.LogErrorWithFormat("dll_not_exist", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogErrorWithFormat("dll_not_exist", LogCat.LogLabel.ModLoader, dllPath);
throw new FileNotFoundException("dll not exist:" + dllPath); throw new FileNotFoundException("dll not exist:" + dllPath);
} }
@ -88,7 +88,7 @@ public class ModLoader
//Load the dll. //Load the dll.
//加载dll。 //加载dll。
LogCat.LogWithFormat("load_dll", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogWithFormat("load_dll", LogCat.LogLabel.ModLoader, dllPath);
try try
{ {
var assembly = _assemblyLoadContext.LoadFromAssemblyPath(dllPath); var assembly = _assemblyLoadContext.LoadFromAssemblyPath(dllPath);
@ -98,7 +98,7 @@ public class ModLoader
return; return;
} }
LogCat.LogWithFormat("dll_name", LogCat.LogLabel.ModLoader, true, assemblyName); LogCat.LogWithFormat("dll_name", LogCat.LogLabel.ModLoader, assemblyName);
//If the load is not its own Dll file. //If the load is not its own Dll file.
//如果加载的不是自身的Dll文件. //如果加载的不是自身的Dll文件.
if (assemblyName == Config.SolutionName) if (assemblyName == Config.SolutionName)
@ -109,7 +109,7 @@ public class ModLoader
//Call the method of the entry class. //Call the method of the entry class.
//调用入口类的方法 //调用入口类的方法
var exportedTypes = assembly.GetExportedTypes(); var exportedTypes = assembly.GetExportedTypes();
LogCat.LogWarningWithFormat("dll_type_length", LogCat.LogLabel.ModLoader, LogCat.UploadFormat, dllPath, LogCat.LogWarningWithFormat("dll_type_length", LogCat.LogLabel.ModLoader, dllPath,
exportedTypes.Length); exportedTypes.Length);
var modLifecycleHandlerType = var modLifecycleHandlerType =
FindTypeInTypeArray(exportedTypes, Config.ModLifecycleHandlerName); FindTypeInTypeArray(exportedTypes, Config.ModLifecycleHandlerName);
@ -118,7 +118,6 @@ public class ModLoader
//The module does not register a lifecycle processor. //The module does not register a lifecycle processor.
//模组没有注册生命周期处理器。 //模组没有注册生命周期处理器。
LogCat.LogWarningWithFormat("dll_does_not_register_lifecycle_processor", LogCat.LogLabel.ModLoader, LogCat.LogWarningWithFormat("dll_does_not_register_lifecycle_processor", LogCat.LogLabel.ModLoader,
LogCat.UploadFormat,
dllPath, Config.ModLifecycleHandlerName); dllPath, Config.ModLifecycleHandlerName);
return; return;
} }
@ -129,7 +128,6 @@ public class ModLoader
//No parameterless constructor found. //No parameterless constructor found.
//未找到无参构造方法。 //未找到无参构造方法。
LogCat.LogWarningWithFormat("dll_no_parameterless_constructor", LogCat.LogLabel.ModLoader, LogCat.LogWarningWithFormat("dll_no_parameterless_constructor", LogCat.LogLabel.ModLoader,
LogCat.UploadFormat,
dllPath); dllPath);
return; return;
} }
@ -141,7 +139,7 @@ public class ModLoader
{ {
LogCat.LogWarningWithFormat("mod_lifecycle_handler_not_implement_interface", LogCat.LogWarningWithFormat("mod_lifecycle_handler_not_implement_interface",
LogCat.LogLabel.ModLoader, LogCat.LogLabel.ModLoader,
LogCat.UploadFormat, dllPath); dllPath);
return; return;
} }
@ -151,7 +149,7 @@ public class ModLoader
{ {
//The assemblyPath parameter is null. //The assemblyPath parameter is null.
//assemblyPath参数为空。 //assemblyPath参数为空。
LogCat.LogErrorWithFormat("load_dll_argument_null_exception", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogErrorWithFormat("load_dll_argument_null_exception", LogCat.LogLabel.ModLoader, dllPath);
LogCat.WhenCaughtException(argumentNullException, LogCat.LogLabel.ModLoader); LogCat.WhenCaughtException(argumentNullException, LogCat.LogLabel.ModLoader);
return; return;
} }
@ -159,7 +157,7 @@ public class ModLoader
{ {
//Not an absolute path. //Not an absolute path.
//不是绝对路径 //不是绝对路径
LogCat.LogErrorWithFormat("load_dll_argument_exception", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogErrorWithFormat("load_dll_argument_exception", LogCat.LogLabel.ModLoader, dllPath);
LogCat.WhenCaughtException(argumentException, LogCat.LogLabel.ModLoader); LogCat.WhenCaughtException(argumentException, LogCat.LogLabel.ModLoader);
return; return;
} }
@ -167,7 +165,7 @@ public class ModLoader
{ {
//A file that was found could not be loaded. //A file that was found could not be loaded.
//无法加载找到的文件。 //无法加载找到的文件。
LogCat.LogErrorWithFormat("load_dll_file_load_exception", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogErrorWithFormat("load_dll_file_load_exception", LogCat.LogLabel.ModLoader, dllPath);
LogCat.WhenCaughtException(fileLoadException, LogCat.LogLabel.ModLoader); LogCat.WhenCaughtException(fileLoadException, LogCat.LogLabel.ModLoader);
return; return;
} }
@ -175,7 +173,7 @@ public class ModLoader
{ {
//assemblyPath is not a valid assembly. //assemblyPath is not a valid assembly.
//assemblyPath不是有效的程序集。 //assemblyPath不是有效的程序集。
LogCat.LogErrorWithFormat("load_dll_bad_image_format_exception", LogCat.LogLabel.ModLoader, true, LogCat.LogErrorWithFormat("load_dll_bad_image_format_exception", LogCat.LogLabel.ModLoader,
dllPath); dllPath);
LogCat.WhenCaughtException(badImageFormatException, LogCat.LogLabel.ModLoader); LogCat.WhenCaughtException(badImageFormatException, LogCat.LogLabel.ModLoader);
return; return;
@ -183,7 +181,7 @@ public class ModLoader
//Loading the dll succeeded. //Loading the dll succeeded.
//加载dll成功。 //加载dll成功。
LogCat.LogWithFormat("load_dll_success", LogCat.LogLabel.ModLoader, true, dllPath); LogCat.LogWithFormat("load_dll_success", LogCat.LogLabel.ModLoader, dllPath);
} }
@ -275,7 +273,7 @@ public class ModLoader
{ {
//The module does not contain a pck file. //The module does not contain a pck file.
//模组不包含pck文件。 //模组不包含pck文件。
LogCat.LogWarningWithFormat("mod_not_contain_pck", LogCat.LogLabel.ModLoader, LogCat.UploadFormat, LogCat.LogWarningWithFormat("mod_not_contain_pck", LogCat.LogLabel.ModLoader,
modFolderPath); modFolderPath);
} }
else else
@ -294,7 +292,7 @@ public class ModLoader
{ {
//The module does not contain a dll file. //The module does not contain a dll file.
//模组不包含dll文件。 //模组不包含dll文件。
LogCat.LogWarningWithFormat("mod_not_contain_dll", LogCat.LogLabel.ModLoader, LogCat.UploadFormat, LogCat.LogWarningWithFormat("mod_not_contain_dll", LogCat.LogLabel.ModLoader,
modFolderPath); modFolderPath);
} }
else else
@ -335,11 +333,11 @@ public class ModLoader
var success = ProjectSettings.LoadResourcePack(pckPath); var success = ProjectSettings.LoadResourcePack(pckPath);
if (success) if (success)
{ {
LogCat.LogWithFormat("load_pck_success", LogCat.LogLabel.ModLoader, true, pckPath); LogCat.LogWithFormat("load_pck_success", LogCat.LogLabel.ModLoader, pckPath);
} }
else else
{ {
LogCat.LogErrorWithFormat("load_pck_failed", LogCat.LogLabel.ModLoader, true, pckPath); LogCat.LogErrorWithFormat("load_pck_failed", LogCat.LogLabel.ModLoader, pckPath);
//Throw a suitable exception here for handling at the caller. //Throw a suitable exception here for handling at the caller.
//为这里抛出合适的异常,以便在调用方处理。 //为这里抛出合适的异常,以便在调用方处理。
throw new DataException("load pck failed:" + pckPath); throw new DataException("load pck failed:" + pckPath);

View File

@ -1,155 +0,0 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http.Json;
using System.Threading.Tasks;
using ColdMint.scripts.debug;
using HttpClient = System.Net.Http.HttpClient;
namespace ColdMint.scripts.openObserve;
/// <summary>
/// <para>LogCollector</para>
/// <para>日志收集器</para>
/// </summary>
public static class LogCollector
{
private static readonly List<LogData> LogDataList = [];
/// <summary>
/// <para>Automatic upload threshold</para>
/// <para>自动上传的阈值</para>
/// </summary>
/// <remarks>
///<para>An attempt is made to upload logs when messages reach this number.</para>
///<para>当消息到达此数量后将尝试上传日志。</para>
/// </remarks>
public static int UploadThreshold { get; set; } = 300;
private static bool _lockList;
/// <summary>
/// <para>httpClient</para>
/// <para>Http客户</para>
/// </summary>
private static HttpClient? _httpClient;
private static string? _orgId;
private static string? _streamName;
/// <summary>
/// <para>CanUploadLog</para>
/// <para>是否能上传日志</para>
/// </summary>
public static bool CanUploadLog => _httpClient != null;
/// <summary>
/// <para>UpdateHttpClient</para>
/// <para>更新Http客户端</para>
/// </summary>
/// <param name="openObserve"></param>
public static void UpdateHttpClient(OpenObserve openObserve)
{
if (openObserve.Address == null || openObserve.AccessToken == null || openObserve.OrgId == null ||
openObserve.StreamName == null)
{
return;
}
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(openObserve.Address);
//Add a Cookie to the request header
//添加Cookie到请求头
var cookie = new Cookie("auth_tokens",
"{\"access_token\":\"Basic " + openObserve.AccessToken + "\",\"refresh_token\":\"\"}");
httpClient.DefaultRequestHeaders.Add("Cookie", cookie.ToString());
_httpClient = httpClient;
_orgId = openObserve.OrgId;
_streamName = openObserve.StreamName;
}
/// <summary>
/// <para>Push log</para>
/// <para>推送日志</para>
/// </summary>
/// <param name="logRequestBean"></param>
private static async Task PostLog(List<LogData> logRequestBean)
{
if (_httpClient == null)
{
return;
}
_lockList = true;
LogCat.LogWithFormat("start_uploading", label: LogCat.LogLabel.LogCollector, false, logRequestBean.Count);
var httpResponseMessage =
await _httpClient.PostAsJsonAsync("/api/" + _orgId + "/" + _streamName + "/_json", logRequestBean);
_lockList = false;
if (httpResponseMessage.IsSuccessStatusCode)
{
LogDataList.RemoveRange(0, logRequestBean.Count);
LogCat.LogWithFormat("upload_successful", label: LogCat.LogLabel.LogCollector, false,
logRequestBean.Count, LogDataList.Count);
if (LogDataList.Count > UploadThreshold)
{
//After the upload succeeds, if the threshold is still met, continue uploading.
//上传成功后,如果依然满足阈值,那么继续上传。
await PostLog(LogDataList.GetRange(0, UploadThreshold));
}
}
else
{
LogCat.LogWithFormat("upload_failed", label: LogCat.LogLabel.LogCollector, false,
httpResponseMessage.StatusCode.ToString(), LogDataList.Count);
}
}
/// <summary>
/// <para>Push log information to the cache</para>
/// <para>推送日志信息到缓存</para>
/// </summary>
/// <param name="logData">
///<para>Log data</para>
///<para>日志信息</para>
/// </param>
/// <remarks>
///<para>When logs reach the upload threshold, logs are automatically uploaded.</para>
///<para>当日志信息到达上传阈值后会自动上传。</para>
/// </remarks>
public static async Task Push(LogData logData)
{
LogDataList.Add(logData);
LogCat.LogWithFormat("upload_status", LogCat.LogLabel.LogCollector, false, LogDataList.Count, UploadThreshold);
if (!_lockList && LogDataList.Count > UploadThreshold)
{
//执行上传
await PostLog(LogDataList.GetRange(0, UploadThreshold));
}
}
}
public class LogData
{
/// <summary>
/// <para>The AppId of this application</para>
/// <para>此应用的AppId</para>
/// </summary>
public string? AppId { get; set; }
/// <summary>
/// <para>message</para>
/// <para>消息</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public string? Message { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
/// <summary>
/// <para>level</para>
/// <para>错误等级</para>
/// </summary>
// ReSharper disable UnusedAutoPropertyAccessor.Global
public int Level { get; set; }
// ReSharper restore UnusedAutoPropertyAccessor.Global
}

View File

@ -33,7 +33,7 @@ public class StateContext
return; return;
} }
LogCat.LogWithFormat("state_change", label: LogCat.LogLabel.StateContext, LogCat.UploadFormat,_currentState, value); LogCat.LogWithFormat("state_change", label: LogCat.LogLabel.StateContext, _currentState, value);
OnStateChange?.Invoke(_currentState, value); OnStateChange?.Invoke(_currentState, value);
_previousState = _currentState; _previousState = _currentState;
_currentState = value; _currentState = value;

View File

@ -68,8 +68,7 @@ public abstract class StateMachineTemplate : IStateMachine
} }
else else
{ {
LogCat.LogErrorWithFormat("state_processor_not_found", label: LogCat.LogLabel.StateMachineTemplate, LogCat.LogErrorWithFormat("state_processor_not_found", label: LogCat.LogLabel.StateMachineTemplate, newState);
LogCat.UploadFormat,newState);
} }
} }

View File

@ -74,7 +74,7 @@ public class PatrolStateProcessor : StateProcessorTemplate
_originPosition = aiCharacter.GlobalPosition; _originPosition = aiCharacter.GlobalPosition;
LogCat.LogWithFormat("patrol_origin_position", LogCat.LogLabel.PatrolStateProcessor, LogCat.LogWithFormat("patrol_origin_position", LogCat.LogLabel.PatrolStateProcessor,
LogCat.UploadFormat, _originPosition); _originPosition);
} }
var point = _originPosition + Points[_index]; var point = _originPosition + Points[_index];
@ -83,7 +83,7 @@ public class PatrolStateProcessor : StateProcessorTemplate
{ {
//No need to actually come to the patrol point, we just need a distance to get close. //No need to actually come to the patrol point, we just need a distance to get close.
//无需真正的来到巡逻点,我们只需要一个距离接近了就可以了。 //无需真正的来到巡逻点,我们只需要一个距离接近了就可以了。
LogCat.LogWithFormat("patrol_arrival_point", LogCat.LogLabel.PatrolStateProcessor, LogCat.UploadFormat, LogCat.LogWithFormat("patrol_arrival_point", LogCat.LogLabel.PatrolStateProcessor,
point); point);
_index++; _index++;
if (_index >= Points.Length) if (_index >= Points.Length)
@ -94,7 +94,7 @@ public class PatrolStateProcessor : StateProcessorTemplate
else else
{ {
LogCat.LogWithFormat("patrol_to_next_point", label: LogCat.LogLabel.PatrolStateProcessor, LogCat.LogWithFormat("patrol_to_next_point", label: LogCat.LogLabel.PatrolStateProcessor,
LogCat.UploadFormat, point, point,
aiCharacter.GlobalPosition, Points[_index], aiCharacter.GlobalPosition, Points[_index],
distance); distance);
aiCharacter.SetTargetPosition(point.Value); aiCharacter.SetTargetPosition(point.Value);

View File

@ -289,8 +289,7 @@ public static class NodeUtils
if (node is T result) return result; if (node is T result) return result;
// If the transformation fails, release the created node // If the transformation fails, release the created node
//如果转型失败,释放所创建的节点 //如果转型失败,释放所创建的节点
LogCat.LogWarningWithFormat("warning_node_cannot_cast_to", LogCat.LogLabel.Default, LogCat.UploadFormat, node, LogCat.LogWarningWithFormat("warning_node_cannot_cast_to", LogCat.LogLabel.Default, node, nameof(T));
nameof(T));
node.QueueFree(); node.QueueFree();
return null; return null;
} }

View File

@ -33,7 +33,7 @@ public static class TimeUtils
var compNum1 = DateTime.Compare(dateTime, dtStartTime); var compNum1 = DateTime.Compare(dateTime, dtStartTime);
var compNum2 = DateTime.Compare(dateTime, dtEndTime); var compNum2 = DateTime.Compare(dateTime, dtEndTime);
var result = compNum1 >= 0 && compNum2 <= 0; var result = compNum1 >= 0 && compNum2 <= 0;
LogCat.LogWithFormat("time_range_debug", LogCat.LogLabel.Default, LogCat.UploadFormat,dateTime, dtStartTime, dtEndTime, LogCat.LogWithFormat("time_range_debug", LogCat.LogLabel.Default, dateTime, dtStartTime, dtEndTime,
result); result);
return result; return result;
} }