From 3efdd7beb3026ea22c5951005d553fc1cccc2a48 Mon Sep 17 00:00:00 2001 From: Citrinate Date: Sun, 3 Mar 2024 10:52:12 -0500 Subject: [PATCH] Added support for ASFEnhance features --- BoosterManager/AdapterBridge.cs | 57 ++++++++++++++++++++++++++++++++ BoosterManager/BoosterManager.cs | 20 ++++++++++- BoosterManager/Commands.cs | 4 ++- 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 BoosterManager/AdapterBridge.cs diff --git a/BoosterManager/AdapterBridge.cs b/BoosterManager/AdapterBridge.cs new file mode 100644 index 0000000..49702cb --- /dev/null +++ b/BoosterManager/AdapterBridge.cs @@ -0,0 +1,57 @@ +using System; +using System.Reflection; +using ArchiSteamFarm.Core; + +// ASFEnhanced Adapter https://github.com/chr233/ASFEnhanceAdapterDemoPlugin + +namespace BoosterManager; +internal static class AdapterBridge +{ + /// + /// 注册子模块 + /// + /// 插件名称 + /// 插件唯一标识符 + /// 命令前缀 + /// 自动更新仓库 + /// 命令处理函数 + /// + public static bool InitAdapter(string pluginName, string pluginId, string? cmdPrefix, string? repoName, MethodInfo? cmdHandler) + { + try + { + var adapterEndpoint = Assembly.Load("ASFEnhance").GetType("ASFEnhance._Adapter_.Endpoint"); + var registerModule = adapterEndpoint?.GetMethod("RegisterModule", BindingFlags.Static | BindingFlags.Public); + var pluinVersion = Assembly.GetExecutingAssembly().GetName().Version; + + if (registerModule != null && adapterEndpoint != null) + { + var result = registerModule?.Invoke(null, new object?[] { pluginName, pluginId, cmdPrefix, repoName, pluinVersion, cmdHandler }); + + if (result is string str) + { + if (str == pluginName) + { + return true; + } + else + { + ASF.ArchiLogger.LogGenericWarning(str); + } + } + } + } +#if DEBUG + catch (Exception ex) + { + ASF.ArchiLogger.LogGenericException(ex, "Community with ASFEnhance failed"); + } +#else + catch (Exception) + { + ASF.ArchiLogger.LogGenericDebug("Community with ASFEnhance failed"); + } +#endif + return false; + } +} diff --git a/BoosterManager/BoosterManager.cs b/BoosterManager/BoosterManager.cs index 4eb51e6..be42569 100644 --- a/BoosterManager/BoosterManager.cs +++ b/BoosterManager/BoosterManager.cs @@ -9,19 +9,37 @@ using ArchiSteamFarm.Steam.Exchange; using System.Text.Json; using ArchiSteamFarm.Helpers.Json; +using System.Reflection; namespace BoosterManager { [Export(typeof(IPlugin))] public sealed class BoosterManager : IASF, IBotModules, IBotCommand2, IBotTradeOfferResults { public string Name => nameof(BoosterManager); public Version Version => typeof(BoosterManager).Assembly.GetName().Version ?? new Version("0"); + private bool ASFEnhanceEnabled = false; public Task OnLoaded() { ASF.ArchiLogger.LogGenericInfo("BoosterManager ASF Plugin by Citrinate"); + + // ASFEnhanced Adapter https://github.com/chr233/ASFEnhanceAdapterDemoPlugin + var flag = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + var handler = typeof(Commands).GetMethod(nameof(Commands.Response), flag); + const string pluginId = nameof(BoosterManager); + const string cmdPrefix = "BOOSTERMANAGER"; + const string repoName = "Citrinate/BoosterManager"; + var registered = AdapterBridge.InitAdapter(Name, pluginId, cmdPrefix, repoName, handler); + ASFEnhanceEnabled = registered; + return Task.CompletedTask; } - public async Task OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) => await Commands.Response(bot, access, steamID, message, args).ConfigureAwait(false); + public async Task OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) { + if (ASFEnhanceEnabled) { + return null; + } + + return await Commands.Response(bot, access, steamID, message, args).ConfigureAwait(false); + } public Task OnASFInit(IReadOnlyDictionary? additionalConfigProperties = null) { if (additionalConfigProperties == null) { diff --git a/BoosterManager/Commands.cs b/BoosterManager/Commands.cs index edefb57..b419f7b 100644 --- a/BoosterManager/Commands.cs +++ b/BoosterManager/Commands.cs @@ -7,7 +7,6 @@ using ArchiSteamFarm.Localization; using ArchiSteamFarm.Steam.Data; using System.ComponentModel; -using System.Collections.Immutable; using System.Reflection; namespace BoosterManager { @@ -24,6 +23,9 @@ internal static class Commands { switch (args.Length) { case 1: switch (args[0].ToUpperInvariant()) { + case "BOOSTERMANAGER" when access >= EAccess.FamilySharing: + return String.Format("{0} {1}", nameof(BoosterManager), (typeof(BoosterManager).Assembly.GetName().Version ?? new Version("0")).ToString()); + case "BDROP" or "BDROPS": return await ResponseBoosterDrops(bot, access).ConfigureAwait(false);