diff --git a/bukkit/loader/src/main/resources/commands.yml b/bukkit/loader/src/main/resources/commands.yml index 72705d3b8..be61cd3c6 100644 --- a/bukkit/loader/src/main/resources/commands.yml +++ b/bukkit/loader/src/main/resources/commands.yml @@ -23,6 +23,13 @@ upload: - /craftengine upload - /ce upload +send_resource_pack: + enable: true + permission: ce.command.admin.send_resource_pack + usage: + - /craftengine feature send-pack + - /ce feature send-pack + get_item: enable: true permission: ce.command.admin.get_item diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index e0f2a5355..ddef3454c 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -61,6 +61,8 @@ command.resource.disable.failure.unknown: "Unknown resource " command.resource.list: "Enabled resources(): Disabled resources(): " command.upload.failure.not_supported: "Current hosting method '' doesn't support uploading resource packs." command.upload.on_progress: "Started uploading progress. Check the console for more information." +command.send_resource_pack.success.single: "Sent resource pack to ." +command.send_resource_pack.success.multiple: "Send resource packs to players." warning.config.image.duplicated: "Issue found in file - Duplicated image ''." warning.config.image.lack_height: "Issue found in file - The image '' is missing the required 'height' argument." warning.config.image.height_smaller_than_ascent: "Issue found in file - The image '' violates the bitmap image rule: 'height' should be no lower than 'ascent'." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index b6db4cf15..21921cb41 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -61,6 +61,8 @@ command.resource.disable.failure.unknown: "未知资源 " command.resource.list: "启用的资源(): 禁用的资源(): " command.upload.failure.not_supported: "当前托管模式 '' 不支持上传资源包." command.upload.on_progress: "已开始上传进程. 检查控制台以获取详细信息." +command.send_resource_pack.success.single: "发送资源包给 " +command.send_resource_pack.success.multiple: "发送资源包给 个玩家" warning.config.image.duplicated: "在文件 中发现问题 - 图片 '' 重复定义" warning.config.image.lack_height: "在文件 中发现问题 - 图片 '' 缺少必要的 'height' 高度参数" warning.config.image.height_smaller_than_ascent: "在文件 中发现问题 - 图片 '' 违反位图规则:'height' 高度值不应小于 'ascent' 基准线高度" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index ecab33493..1f93103ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -138,7 +138,8 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { }); } - private void sendResourcePack(Player player) { + @Override + public void sendResourcePack(Player player) { CompletableFuture> future = resourcePackHost().requestResourcePackDownloadLink(player.uuid()); future.thenAccept(dataList -> { if (player.isOnline()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 322d0985a..0b5d4030e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -50,7 +50,8 @@ public class BukkitCommandManager extends AbstractCommandManager new EnableResourceCommand(this, plugin), new DisableResourceCommand(this, plugin), new ListResourceCommand(this, plugin), - new UploadPackCommand(this, plugin) + new UploadPackCommand(this, plugin), + new SendResourcePackCommand(this, plugin) )); final LegacyPaperCommandManager manager = (LegacyPaperCommandManager) getCommandManager(); manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SendResourcePackCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SendResourcePackCommand.java new file mode 100644 index 000000000..1a8fe844b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SendResourcePackCommand.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; +import org.incendo.cloud.bukkit.data.MultiplePlayerSelector; +import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser; + +import java.util.Collection; + +public class SendResourcePackCommand extends BukkitCommandFeature { + + public SendResourcePackCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(CommandManager manager, Command.Builder builder) { + return builder + .flag(FlagKeys.SILENT_FLAG) + .required("player", MultiplePlayerSelectorParser.multiplePlayerSelectorParser(true)) + .handler(context -> { + MultiplePlayerSelector selector = context.get("player"); + Collection players = selector.values(); + for (Player player : players) { + BukkitServerPlayer bukkitServerPlayer = plugin().adapt(player); + if (bukkitServerPlayer == null) continue; + BukkitCraftEngine.instance().packManager().sendResourcePack(bukkitServerPlayer); + } + int size = players.size(); + if (size == 1) { + String name = players.iterator().next().getName(); + handleFeedback(context, MessageConstants.COMMAND_SEND_RESOURCE_PACK_SUCCESS_SINGLE, Component.text(name)); + } else { + handleFeedback(context, MessageConstants.COMMAND_SEND_RESOURCE_PACK_SUCCESS_MULTIPLE, Component.text(size)); + } + }); + } + + @Override + public String getFeatureID() { + return "send_resource_pack"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java index 54f85bd89..0734ded69 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.pack; +import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; @@ -38,4 +39,6 @@ public interface PackManager extends Manageable { ResourcePackHost resourcePackHost(); void uploadResourcePack(); + + void sendResourcePack(Player player); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java index cbbc41327..615cd4f05 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/AlistHost.java @@ -290,19 +290,20 @@ public class AlistHost implements ResourcePackHost { @Override public ResourcePackHost create(Map arguments) { + boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); String apiUrl = (String) arguments.get("api-url"); if (apiUrl == null || apiUrl.isEmpty()) { throw new IllegalArgumentException("'api-url' cannot be empty for Alist host"); } - String userName = (String) arguments.get("username"); + String userName = useEnv ? System.getenv("CE_ALIST_USERNAME") : (String) arguments.get("username"); if (userName == null || userName.isEmpty()) { throw new IllegalArgumentException("'username' cannot be empty for Alist host"); } - String password = (String) arguments.get("password"); + String password = useEnv ? System.getenv("CE_ALIST_PASSWORD") : (String) arguments.get("password"); if (password == null || password.isEmpty()) { throw new IllegalArgumentException("'password' cannot be empty for Alist host"); } - String filePassword = (String) arguments.getOrDefault("file-password", ""); + String filePassword = useEnv ? System.getenv("CE_ALIST_FILE_PASSWORD") : (String) arguments.getOrDefault("file-password", ""); String otpCode = (String) arguments.get("otp-code"); Duration jwtTokenExpiration = Duration.ofHours((int) arguments.getOrDefault("jwt-token-expiration", 48)); String uploadPath = (String) arguments.get("upload-path"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java index dc13db502..814244b9b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/DropboxHost.java @@ -250,15 +250,16 @@ public class DropboxHost implements ResourcePackHost { public static class Factory implements ResourcePackHostFactory { @Override public ResourcePackHost create(Map arguments) { - String appKey = (String) arguments.get("app-key"); + boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); + String appKey = useEnv ? System.getenv("CE_DROPBOX_APP_KEY") : (String) arguments.get("app-key"); if (appKey == null || appKey.isEmpty()) { throw new IllegalArgumentException("Missing required 'app-key' configuration"); } - String appSecret = (String) arguments.get("app-secret"); + String appSecret = useEnv ? System.getenv("CE_DROPBOX_APP_SECRET") : (String) arguments.get("app-secret"); if (appSecret == null || appSecret.isEmpty()) { throw new IllegalArgumentException("Missing required 'app-secret' configuration"); } - String refreshToken = (String) arguments.get("refresh-token"); + String refreshToken = useEnv ? System.getenv("CE_DROPBOX_REFRESH_TOKEN") : (String) arguments.get("refresh-token"); if (refreshToken == null || refreshToken.isEmpty()) { throw new IllegalArgumentException("Missing required 'refresh-token' configuration"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java index b13e82bb2..116eac469 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/LobFileHost.java @@ -270,7 +270,8 @@ public class LobFileHost implements ResourcePackHost { @Override public ResourcePackHost create(Map arguments) { - String apiKey = (String) arguments.get("api-key"); + boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); + String apiKey = useEnv ? System.getenv("CE_LOBFILE_API_KEY") : (String) arguments.get("api-key"); if (apiKey == null || apiKey.isEmpty()) { throw new RuntimeException("Missing 'api-key' for LobFileHost"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java index 9943c3df6..3ef7e3002 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/OneDriveHost.java @@ -230,15 +230,16 @@ public class OneDriveHost implements ResourcePackHost { @Override public ResourcePackHost create(Map arguments) { - String clientId = (String) arguments.get("client-id"); + boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); + String clientId = useEnv ? System.getenv("CE_ONEDRIVE_CLIENT_ID") : (String) arguments.get("client-id"); if (clientId == null || clientId.isEmpty()) { throw new IllegalArgumentException("Missing required 'client-id' configuration"); } - String clientSecret = (String) arguments.get("client-secret"); + String clientSecret = useEnv ? System.getenv("CE_ONEDRIVE_CLIENT_SECRET") : (String) arguments.get("client-secret"); if (clientSecret == null || clientSecret.isEmpty()) { throw new IllegalArgumentException("Missing required 'client-secret' configuration"); } - String refreshToken = (String) arguments.get("refresh-token"); + String refreshToken = useEnv ? System.getenv("CE_ONEDRIVE_REFRESH_TOKEN") : (String) arguments.get("refresh-token"); if (refreshToken == null || refreshToken.isEmpty()) { throw new IllegalArgumentException("Missing required 'refresh-token' configuration"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java index c5f586fe4..8c2137e2a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/S3Host.java @@ -156,6 +156,7 @@ public class S3Host implements ResourcePackHost { @Override @SuppressWarnings("deprecation") public ResourcePackHost create(Map arguments) { + boolean useEnv = (boolean) arguments.getOrDefault("use-environment-variables", false); String endpoint = (String) arguments.get("endpoint"); if (endpoint == null || endpoint.isEmpty()) { throw new IllegalArgumentException("'endpoint' cannot be empty for S3 host"); @@ -167,11 +168,11 @@ public class S3Host implements ResourcePackHost { throw new IllegalArgumentException("'bucket' cannot be empty for S3 host"); } String region = (String) arguments.getOrDefault("region", "auto"); - String accessKeyId = (String) arguments.get("access-key-id"); + String accessKeyId = useEnv ? System.getenv("CE_S3_ACCESS_KEY_ID") : (String) arguments.get("access-key-id"); if (accessKeyId == null || accessKeyId.isEmpty()) { throw new IllegalArgumentException("'access-key-id' cannot be empty for S3 host"); } - String accessKeySecret = (String) arguments.get("access-key-secret"); + String accessKeySecret = useEnv ? System.getenv("CE_S3_ACCESS_KEY_SECRET") : (String) arguments.get("access-key-secret"); if (accessKeySecret == null || accessKeySecret.isEmpty()) { throw new IllegalArgumentException("'access-key-secret' cannot be empty for S3 host"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java index 29d202578..274e7cf0c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java @@ -28,4 +28,6 @@ public interface MessageConstants { TranslatableComponent.Builder COMMAND_RESOURCE_LIST = Component.translatable().key("command.resource.list"); TranslatableComponent.Builder COMMAND_UPLOAD_FAILURE_NOT_SUPPORTED = Component.translatable().key("command.upload.failure.not_supported"); TranslatableComponent.Builder COMMAND_UPLOAD_ON_PROGRESS = Component.translatable().key("command.upload.on_progress"); + TranslatableComponent.Builder COMMAND_SEND_RESOURCE_PACK_SUCCESS_SINGLE = Component.translatable().key("command.send_resource_pack.success.single"); + TranslatableComponent.Builder COMMAND_SEND_RESOURCE_PACK_SUCCESS_MULTIPLE = Component.translatable().key("command.send_resource_pack.success.multiple"); } diff --git a/gradle.properties b/gradle.properties index 0336139b6..f23dccdb3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] project_version=0.0.49-beta.3 -config_version=28 -lang_version=5 +config_version=29 +lang_version=6 project_group=net.momirealms latest_supported_version=1.21.5 latest_minecraft_version=1.21.5