Better Plugin

This commit is contained in:
Somebody
2024-08-28 13:58:12 +08:00
parent 21c2bc8f17
commit f7a8564237
6 changed files with 83 additions and 10 deletions

View File

@@ -1,4 +1,7 @@
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.Enums.Item;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace EggLink.DanhengServer.Data.Excel;
@@ -8,6 +11,7 @@ public class RelicConfigExcel : ExcelResource
public int ID { get; set; }
public int SetID { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public RelicTypeEnum Type { get; set; }
public int MainAffixGroup { get; set; }
public int SubAffixGroup { get; set; }
@@ -17,6 +21,9 @@ public class RelicConfigExcel : ExcelResource
public int ExpProvide { get; set; }
public int CoinCost { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public RarityEnum Rarity { get; set; }
public override int GetId()
{
return ID;

View File

@@ -6,5 +6,9 @@ public enum RarityEnum
CombatPowerAvatarRarityType5 = 2,
CombatPowerLightconeRarity3 = 3,
CombatPowerLightconeRarity4 = 4,
CombatPowerLightconeRarity5 = 5
CombatPowerLightconeRarity5 = 5,
CombatPowerRelicRarity2 = 6,
CombatPowerRelicRarity3 = 7,
CombatPowerRelicRarity4 = 8,
CombatPowerRelicRarity5 = 9
}

View File

@@ -0,0 +1,9 @@
namespace EggLink.DanhengServer.Enums.Language;
public enum ProgramLanguageTypeEnum
{
EN = 0,
CHS = 1,
CHT = 2,
JP = 3
}

View File

@@ -1,4 +1,6 @@
using EggLink.DanhengServer.Internationalization.Message;
using System.Reflection;
using EggLink.DanhengServer.Enums.Language;
using EggLink.DanhengServer.Internationalization.Message;
using EggLink.DanhengServer.Util;
namespace EggLink.DanhengServer.Internationalization;
@@ -8,6 +10,7 @@ public static class I18NManager
public static Logger Logger = new("I18nManager");
public static object Language { get; set; } = new LanguageEN();
public static Dictionary<string, Dictionary<ProgramLanguageTypeEnum, object>> PluginLanguages { get; } = [];
public static void LoadLanguage()
{
@@ -16,7 +19,7 @@ public static class I18NManager
var languageType = Type.GetType(languageStr);
if (languageType == null)
{
Logger.Error("Language not found, fallback to EN");
Logger.Warn("Language not found, fallback to EN");
// fallback to English
languageType = Type.GetType("EggLink.DanhengServer.Internationalization.Message.LanguageEN")!;
}
@@ -27,29 +30,54 @@ public static class I18NManager
Logger.Info(Translate("Server.ServerInfo.LoadedItem", Translate("Word.Language")));
}
public static void LoadPluginLanguage(Dictionary<string, List<Type>> pluginAssemblies)
{
foreach (var (pluginName, types) in pluginAssemblies)
{
var languageType = types.FindAll(x => x.GetCustomAttribute<PluginLanguageAttribute>() != null);
if (languageType.Count == 0) // no language to use
continue;
PluginLanguages.Add(pluginName, []);
foreach (var type in languageType)
{
var attr = type.GetCustomAttribute<PluginLanguageAttribute>();
if (attr == null) continue;
var language = Activator.CreateInstance(type);
if (language == null) continue;
PluginLanguages[pluginName].Add(attr.LanguageType, language);
}
}
}
public static string Translate(string key, params string[] args)
{
var value = GetNestedPropertyValue(Language, key);
var pluginLangs = PluginLanguages.Values;
var langs = (from pluginLang in pluginLangs from o in pluginLang where o.Key == Enum.Parse<ProgramLanguageTypeEnum>(ConfigManager.Config.ServerOption.Language) select o.Value).ToList(); // get all plugin languages
langs.Add(Language); // add server language
var result = langs.Select(lang => GetNestedPropertyValue(lang, key)).OfType<string>().FirstOrDefault() ?? key;
var index = 0;
return args.Aggregate(value, (current, arg) => current.Replace("{" + index++ + "}", arg));
return args.Aggregate(result, (current, arg) => current.Replace("{" + index++ + "}", arg));
}
public static string GetNestedPropertyValue(object? obj, string propertyName)
public static string? GetNestedPropertyValue(object? obj, string propertyName)
{
foreach (var part in propertyName.Split('.'))
{
if (obj == null) return propertyName;
if (obj == null) return null;
var type = obj.GetType();
var property = type.GetProperty(part);
if (property == null) return propertyName;
if (property == null) return null;
obj = property.GetValue(obj, null);
}
return (string)(obj ?? propertyName);
return (string?)obj;
}
}

View File

@@ -0,0 +1,9 @@
using EggLink.DanhengServer.Enums.Language;
namespace EggLink.DanhengServer.Internationalization;
[AttributeUsage(AttributeTargets.Class)]
public class PluginLanguageAttribute(ProgramLanguageTypeEnum languageType) : Attribute
{
public ProgramLanguageTypeEnum LanguageType { get; } = languageType;
}

View File

@@ -44,6 +44,10 @@ public class PluginManager
var fileInfo = new FileInfo(plugin);
LoadPlugin(fileInfo.FullName);
}
//var dict = PluginAssemblies.ToDictionary(pluginAssembly => Plugins[pluginAssembly.Key].Name, pluginAssembly => pluginAssembly.Value);
//I18NManager.LoadPluginLanguage(dict);
}
public static void LoadPlugin(string plugin)
@@ -94,7 +98,19 @@ public class PluginManager
pluginTypes.AddRange(types);
pluginInstance.OnLoad();
try
{
var dict = new Dictionary<string, List<Type>> { { pluginInfo.Name, pluginTypes } };
I18NManager.LoadPluginLanguage(dict);
pluginInstance.OnLoad();
}
catch (Exception e)
{
Logger.Error($"Failed to load plugin {plugin}: {e.Message}");
// unload the plugin
UnloadPlugin(pluginInstance);
}
}
else
{