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
```
## 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
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
```
## はいち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ファイルを編集することができます。新しい翻訳を加えたり修正したりしています

View File

@ -72,34 +72,6 @@ data/*
./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文件。来修改和添加新的翻译。

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_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_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_no_weapon_detected,没有检测到武器。,No weapon detected.,武器が検出されません。
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))
{
LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker, LogCat.UploadFormat,id);
LogCat.LogErrorWithFormat("bubble_not_found", LogCat.LogLabel.BubbleMarker,id);
return;
}
@ -60,7 +60,7 @@ public partial class BubbleMarker : Marker2D
{
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;
}

View File

@ -40,7 +40,7 @@ public static class CampManager
if (camp.Id != Config.CampId.Default) return false;
_defaultCamp = 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;
}

View File

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

View File

@ -47,7 +47,7 @@ public partial class Player : CharacterTemplate
return;
}
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);
_parabola = GetNode<Line2D>("Parabola");
var healthBarUi = GameSceneDepend.HealthBarUi;

View File

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using ColdMint.scripts.openObserve;
using ColdMint.scripts.utils;
using Godot;
@ -143,11 +142,6 @@ public static class LogCat
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();
@ -249,14 +243,12 @@ public static class LogCat
/// </param>
/// <param name="label">
/// </param>
/// <param name="upload">
/// </param>
public static void Log(string message, string label = LogLabel.Default, bool upload = true)
public static void Log(string message, string label = LogLabel.Default)
{
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))
{
@ -268,20 +260,6 @@ public static class LogCat
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)
{
case WarningLogLevel:
@ -307,34 +285,30 @@ public static class LogCat
/// <para>这个消息支持本地化输出假设已存在翻译keyHello = 你好传入Hello则会输出你好。</para>
/// </param>
/// <param name="label"></param>
/// <param name="upload"></param>
public static void LogError(string message, string label = LogLabel.Default, bool upload = true)
public static void LogError(string message, string label = LogLabel.Default)
{
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,
upload);
PrintLog(ErrorLogLevel, string.Format(HandleMessage(ErrorLogLevel, message, label).ToString(), args), label);
}
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,
upload);
PrintLog(InfoLogLevel, string.Format(HandleMessage(InfoLogLevel, message, label).ToString(), args), label);
}
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,
upload);
PrintLog(WarningLogLevel, string.Format(HandleMessage(WarningLogLevel, message, label).ToString(), args), label);
}
/// <summary>
@ -353,6 +327,6 @@ public static class LogCat
//Log an exception here or send it to the server.
//请在这里记录异常或将异常发送至服务器。
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();
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());
return;
}
@ -44,11 +44,11 @@ public static class ItemTypeRegister
var files = itemRegsDir.GetFiles();
if (files == null)
{
LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, LogCat.UploadFormat, 0);
LogCat.LogWithFormat("found_files", LogCat.LogLabel.Default, 0);
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
var count = 0;
@ -68,7 +68,7 @@ public static class ItemTypeRegister
count++;
}
LogCat.LogWithFormat("found_item_types", LogCat.LogLabel.Default, LogCat.UploadFormat, count);
LogCat.LogWithFormat("found_item_types", LogCat.LogLabel.Default, count);
}
/// <summary>
@ -120,7 +120,7 @@ public static class ItemTypeRegister
return newItem;
});
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);
}

View File

@ -69,14 +69,6 @@ public partial class SplashScreenLoader : UiLoaderTemplate
/// </summary>
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)
//在调试模式下将最小日志等级设置为Info。打印全部日志
//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 [])
{
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 [];
}
@ -41,10 +41,10 @@ public readonly struct LootList(string id, IList<LootGroup> groups)
//我们为每个战利品条目生成一个战利品数据。
var datum = group.GenerateLootData();
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();
}
}

View File

@ -30,7 +30,7 @@ public partial class ItemSpawn : Marker2D, ISpawnMarker
return null;
}
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)
{
return null;

View File

@ -245,7 +245,7 @@ public static class MapGenerator
//If the room injection processor cannot be found, a print error occurs.
//如果找不到房间注入处理器,那么打印错误。
LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist",
LogCat.LogLabel.Default, LogCat.UploadFormat, injectionProcessorData.Id);
LogCat.LogLabel.Default, injectionProcessorData.Id);
continue;
}
@ -282,7 +282,7 @@ public static class MapGenerator
if (roomPlacementData == null)
{
LogCat.LogWithFormat("failed_to_calculate_the_room_location", LogCat.LogLabel.Default,
LogCat.UploadFormat, roomNodeData.Id);
roomNodeData.Id);
continue;
}
@ -368,19 +368,19 @@ public static class MapGenerator
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;
}
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);
return false;
}
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());
return true;
}

View File

@ -93,7 +93,7 @@ public partial class MiniMap : NinePatchRect
CalculateRelativePositionOnTheMinimap(roomDictionaryValue));
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);
}
else

View File

@ -170,8 +170,7 @@ public class Room
/// </summary>
private void ShowAllCharacterTemplate()
{
LogCat.LogWithFormat("show_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat,
_allCharacter.Count);
LogCat.LogWithFormat("show_all_node", LogCat.LogLabel.Room, _allCharacter.Count);
foreach (var characterTemplate in _allCharacter)
{
characterTemplate.Show();
@ -184,8 +183,7 @@ public class Room
/// </summary>
private void HideAllCharacterTemplate()
{
LogCat.LogWithFormat("hide_all_node", LogCat.LogLabel.Room, LogCat.UploadFormat,
_allCharacter.Count);
LogCat.LogWithFormat("hide_all_node", LogCat.LogLabel.Room, _allCharacter.Count);
foreach (var characterTemplate in _allCharacter)
{
characterTemplate.Hide();
@ -272,7 +270,7 @@ public class Room
{
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);
}
@ -325,7 +323,7 @@ public class Room
{
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);
}

View File

@ -59,7 +59,7 @@ public class ModLoader
{
//When the dll that must be loaded does not exist, an error is reported immediately.
//当必须加载的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);
}
@ -88,7 +88,7 @@ public class ModLoader
//Load the dll.
//加载dll。
LogCat.LogWithFormat("load_dll", LogCat.LogLabel.ModLoader, true, dllPath);
LogCat.LogWithFormat("load_dll", LogCat.LogLabel.ModLoader, dllPath);
try
{
var assembly = _assemblyLoadContext.LoadFromAssemblyPath(dllPath);
@ -98,7 +98,7 @@ public class ModLoader
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.
//如果加载的不是自身的Dll文件.
if (assemblyName == Config.SolutionName)
@ -109,7 +109,7 @@ public class ModLoader
//Call the method of the entry class.
//调用入口类的方法
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);
var modLifecycleHandlerType =
FindTypeInTypeArray(exportedTypes, Config.ModLifecycleHandlerName);
@ -118,7 +118,6 @@ public class ModLoader
//The module does not register a lifecycle processor.
//模组没有注册生命周期处理器。
LogCat.LogWarningWithFormat("dll_does_not_register_lifecycle_processor", LogCat.LogLabel.ModLoader,
LogCat.UploadFormat,
dllPath, Config.ModLifecycleHandlerName);
return;
}
@ -129,7 +128,6 @@ public class ModLoader
//No parameterless constructor found.
//未找到无参构造方法。
LogCat.LogWarningWithFormat("dll_no_parameterless_constructor", LogCat.LogLabel.ModLoader,
LogCat.UploadFormat,
dllPath);
return;
}
@ -141,7 +139,7 @@ public class ModLoader
{
LogCat.LogWarningWithFormat("mod_lifecycle_handler_not_implement_interface",
LogCat.LogLabel.ModLoader,
LogCat.UploadFormat, dllPath);
dllPath);
return;
}
@ -151,7 +149,7 @@ public class ModLoader
{
//The assemblyPath parameter is null.
//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);
return;
}
@ -159,7 +157,7 @@ public class ModLoader
{
//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);
return;
}
@ -167,7 +165,7 @@ public class ModLoader
{
//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);
return;
}
@ -175,7 +173,7 @@ public class ModLoader
{
//assemblyPath is not a valid assembly.
//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);
LogCat.WhenCaughtException(badImageFormatException, LogCat.LogLabel.ModLoader);
return;
@ -183,7 +181,7 @@ public class ModLoader
//Loading the dll succeeded.
//加载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.
//模组不包含pck文件。
LogCat.LogWarningWithFormat("mod_not_contain_pck", LogCat.LogLabel.ModLoader, LogCat.UploadFormat,
LogCat.LogWarningWithFormat("mod_not_contain_pck", LogCat.LogLabel.ModLoader,
modFolderPath);
}
else
@ -294,7 +292,7 @@ public class ModLoader
{
//The module does not contain a dll file.
//模组不包含dll文件。
LogCat.LogWarningWithFormat("mod_not_contain_dll", LogCat.LogLabel.ModLoader, LogCat.UploadFormat,
LogCat.LogWarningWithFormat("mod_not_contain_dll", LogCat.LogLabel.ModLoader,
modFolderPath);
}
else
@ -335,11 +333,11 @@ public class ModLoader
var success = ProjectSettings.LoadResourcePack(pckPath);
if (success)
{
LogCat.LogWithFormat("load_pck_success", LogCat.LogLabel.ModLoader, true, pckPath);
LogCat.LogWithFormat("load_pck_success", LogCat.LogLabel.ModLoader, pckPath);
}
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 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;
}
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);
_previousState = _currentState;
_currentState = value;

View File

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

View File

@ -74,7 +74,7 @@ public class PatrolStateProcessor : StateProcessorTemplate
_originPosition = aiCharacter.GlobalPosition;
LogCat.LogWithFormat("patrol_origin_position", LogCat.LogLabel.PatrolStateProcessor,
LogCat.UploadFormat, _originPosition);
_originPosition);
}
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.
//无需真正的来到巡逻点,我们只需要一个距离接近了就可以了。
LogCat.LogWithFormat("patrol_arrival_point", LogCat.LogLabel.PatrolStateProcessor, LogCat.UploadFormat,
LogCat.LogWithFormat("patrol_arrival_point", LogCat.LogLabel.PatrolStateProcessor,
point);
_index++;
if (_index >= Points.Length)
@ -94,7 +94,7 @@ public class PatrolStateProcessor : StateProcessorTemplate
else
{
LogCat.LogWithFormat("patrol_to_next_point", label: LogCat.LogLabel.PatrolStateProcessor,
LogCat.UploadFormat, point,
point,
aiCharacter.GlobalPosition, Points[_index],
distance);
aiCharacter.SetTargetPosition(point.Value);

View File

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

View File

@ -33,7 +33,7 @@ public static class TimeUtils
var compNum1 = DateTime.Compare(dateTime, dtStartTime);
var compNum2 = DateTime.Compare(dateTime, dtEndTime);
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);
return result;
}