From 5e4669dbe871aa80219e1032f065dee214f71375 Mon Sep 17 00:00:00 2001 From: LamGC Date: Wed, 10 Jan 2024 00:40:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=20BotExtensionFactory=20?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E4=B8=80=E4=BA=9B=E5=8F=AF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E6=81=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 BotExtensionFactory 的 createExtensionInstance 方法添加 BotExtensionCreateOptions 参数, 通过 BotExtensionCreateOptions 为扩展包 Factory 提供更多信息, 以避免扩展重复声明配置文件. Issue #4 --- .../src/main/kotlin/ExtensionComponents.kt | 8 ++++- scalabot-app/src/main/kotlin/ScalaBot.kt | 2 +- .../simple/SimpleExtensionFactory.java | 3 +- scalabot-extension/build.gradle.kts | 1 + .../extension/BotExtensionCreateOptions.java | 22 ++++++++++++++ .../extension/BotExtensionFactory.java | 29 ++++++++++++++++++- 6 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionCreateOptions.java diff --git a/scalabot-app/src/main/kotlin/ExtensionComponents.kt b/scalabot-app/src/main/kotlin/ExtensionComponents.kt index fc40e66..55f1f6c 100644 --- a/scalabot-app/src/main/kotlin/ExtensionComponents.kt +++ b/scalabot-app/src/main/kotlin/ExtensionComponents.kt @@ -1,6 +1,7 @@ package net.lamgc.scalabot import mu.KotlinLogging +import net.lamgc.scalabot.extension.BotExtensionCreateOptions import net.lamgc.scalabot.extension.BotExtensionFactory import net.lamgc.scalabot.util.getPriority import org.eclipse.aether.artifact.Artifact @@ -122,7 +123,12 @@ internal class ExtensionLoader( for (factory in extClassLoader.serviceLoader) { try { val extension = - factory.createExtensionInstance(bot, getExtensionDataFolder(extensionArtifact)) + factory.createExtensionInstance( + bot, getExtensionDataFolder(extensionArtifact), + BotExtensionCreateOptions( + bot.botConfig.proxy.copy() + ) + ) if (extension == null) { log.debug { "Factory ${factory::class.java} 创建插件时返回了 null, 已跳过. (BotName: ${bot.botUsername})" } continue diff --git a/scalabot-app/src/main/kotlin/ScalaBot.kt b/scalabot-app/src/main/kotlin/ScalaBot.kt index dc72e17..e283f14 100644 --- a/scalabot-app/src/main/kotlin/ScalaBot.kt +++ b/scalabot-app/src/main/kotlin/ScalaBot.kt @@ -29,7 +29,7 @@ internal class ScalaBot( db: DBContext, options: DefaultBotOptions, extensionFinders: Set, - botConfig: BotConfig, + val botConfig: BotConfig, private val creatorId: Long = botConfig.account.creatorId, val accountId: Long = botConfig.account.id, val extensions: Set = botConfig.extensions diff --git a/scalabot-ext-example/src/main/java/net/lamgc/scalabot/simple/SimpleExtensionFactory.java b/scalabot-ext-example/src/main/java/net/lamgc/scalabot/simple/SimpleExtensionFactory.java index 6ba663c..5558843 100644 --- a/scalabot-ext-example/src/main/java/net/lamgc/scalabot/simple/SimpleExtensionFactory.java +++ b/scalabot-ext-example/src/main/java/net/lamgc/scalabot/simple/SimpleExtensionFactory.java @@ -1,5 +1,6 @@ package net.lamgc.scalabot.simple; +import net.lamgc.scalabot.extension.BotExtensionCreateOptions; import net.lamgc.scalabot.extension.BotExtensionFactory; import org.telegram.abilitybots.api.bot.BaseAbilityBot; import org.telegram.abilitybots.api.util.AbilityExtension; @@ -9,7 +10,7 @@ import java.io.File; public class SimpleExtensionFactory implements BotExtensionFactory { @Override - public AbilityExtension createExtensionInstance(BaseAbilityBot bot, File shareDataFolder) { + public AbilityExtension createExtensionInstance(BaseAbilityBot bot, File shareDataFolder, BotExtensionCreateOptions options) { return new SayHelloExtension(bot); } diff --git a/scalabot-extension/build.gradle.kts b/scalabot-extension/build.gradle.kts index 8273b24..2bef3d9 100644 --- a/scalabot-extension/build.gradle.kts +++ b/scalabot-extension/build.gradle.kts @@ -9,6 +9,7 @@ plugins { dependencies { implementation("commons-codec:commons-codec:1.16.1") api("org.telegram:telegrambots-abilities:6.9.7.1") + api(project(":scalabot-meta")) testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1") testImplementation("org.mockito:mockito-core:5.11.0") diff --git a/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionCreateOptions.java b/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionCreateOptions.java new file mode 100644 index 0000000..46ac359 --- /dev/null +++ b/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionCreateOptions.java @@ -0,0 +1,22 @@ +package net.lamgc.scalabot.extension; + +import net.lamgc.scalabot.config.ProxyConfig; + +/** + * BotExtension 创建参数. + *

+ * 通过该类可向 {@link BotExtensionFactory} 提供更多创建 BotExtension 时可用的参数. + */ +@SuppressWarnings("unused") +public class BotExtensionCreateOptions { + + private final ProxyConfig proxy; + + public BotExtensionCreateOptions(ProxyConfig proxy) { + this.proxy = proxy; + } + + public ProxyConfig getProxy() { + return proxy; + } +} diff --git a/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionFactory.java b/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionFactory.java index f1d80fc..a374d09 100644 --- a/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionFactory.java +++ b/scalabot-extension/src/main/java/net/lamgc/scalabot/extension/BotExtensionFactory.java @@ -31,7 +31,34 @@ public interface BotExtensionFactory { * 同一个扩展包的 Factory 接收到的共享数据目录都是一样的, * 建议将数据存储在数据目录中, 便于数据的存储管理. * @return 返回为该 Bot 对象创建的扩展对象, 如果不希望为该机器人提供扩展, 可返回 {@code null}. + * @deprecated 请使用 {@link #createExtensionInstance(BaseAbilityBot, File, BotExtensionCreateOptions)}, + * 该方法最迟在 1.0.0 正式版中移除. + * @since 0.0.1 */ - AbilityExtension createExtensionInstance(BaseAbilityBot bot, File shareDataFolder); + @Deprecated(since = "0.7.0", forRemoval = true) + default AbilityExtension createExtensionInstance(BaseAbilityBot bot, File shareDataFolder) { + throw new UnsupportedOperationException(); + } + + /** + * 为给定的 {@link BaseAbilityBot} 对象创建扩展. + * + *

如扩展无使用 {@link org.telegram.abilitybots.api.db.DBContext} 的话, + * 也可以返回扩展单例, 因为 AbilityBot 本身并不禁止多个机器人共用一个扩展对象 + * (AbilityBot 只是调用了扩展中的方法来创建 Ability 对象). + * + * @param bot 机器人对象. + * @param shareDataFolder ScalaBot App 为扩展提供的共享数据目录. + *

路径格式为: + *

 $DATA_ROOT/data/extensions/{GroupId}/{ArtifactId}
+ * 同一个扩展包的 Factory 接收到的共享数据目录都是一样的, + * 建议将数据存储在数据目录中, 便于数据的存储管理. + * @param options 创建扩展时可用的参数. + * @return 返回为该 Bot 对象创建的扩展对象, 如果不希望为该机器人提供扩展, 可返回 {@code null}. + * @since 0.7.0 + */ + default AbilityExtension createExtensionInstance(BaseAbilityBot bot, File shareDataFolder, BotExtensionCreateOptions options) { + return createExtensionInstance(bot, shareDataFolder); + } }