diff --git a/api/src/main/java/com/alttd/boosterapi/config/Config.java b/api/src/main/java/com/alttd/boosterapi/config/Config.java
index 9b9f630..d70e064 100755
--- a/api/src/main/java/com/alttd/boosterapi/config/Config.java
+++ b/api/src/main/java/com/alttd/boosterapi/config/Config.java
@@ -2,6 +2,7 @@ package com.alttd.boosterapi.config;
import com.alttd.boosterapi.util.ALogger;
import io.leangen.geantyref.TypeToken;
+import net.kyori.adventure.text.Component;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.ConfigurationOptions;
import org.spongepowered.configurate.serialize.SerializationException;
@@ -181,4 +182,17 @@ public final class Config {
private static void loadDonorStuff() {
donorRanks = getList("donor.ranks", donorRanks);
}
+
+ public static String INVALID_USER = " does not exist.";
+ public static String INVALID_ACTION = " is not a valid action user promote or demote.";
+ public static String INVALID_DONOR_RANK = " is not a valid donor rank.";
+ public static String DEMOTE_MESSAGE = "Your rank was refunded and removed. Contact staff if you're unsure what caused this.";
+ public static String PROMOTE_MESSAGE = "Thank you for your support! We applied the rank to your account.";
+ private static void loadMessages() {
+ INVALID_USER = getString("messages.invalid-user", INVALID_USER);
+ INVALID_ACTION = getString("messages.invalid-action", INVALID_ACTION);
+ INVALID_DONOR_RANK = getString("messages.invalid-donor-rank", INVALID_DONOR_RANK);
+ DEMOTE_MESSAGE = getString("messages.demote", DEMOTE_MESSAGE);
+ PROMOTE_MESSAGE = getString("messages.promote", PROMOTE_MESSAGE);
+ }
}
diff --git a/api/src/main/java/com/alttd/boosterapi/util/Utils.java b/api/src/main/java/com/alttd/boosterapi/util/Utils.java
index 9033de3..36c8491 100644
--- a/api/src/main/java/com/alttd/boosterapi/util/Utils.java
+++ b/api/src/main/java/com/alttd/boosterapi/util/Utils.java
@@ -6,6 +6,7 @@ import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.text.minimessage.template.TemplateResolver;
import java.util.List;
+import java.util.Locale;
public class Utils {
@@ -18,4 +19,10 @@ public class Utils {
}
}
+ public static String capitalize(String string) {
+ if (string.length() <= 1)
+ return string.toUpperCase();
+ string = string.toLowerCase();
+ return string.substring(0, 1).toUpperCase() + string.toLowerCase().substring(1);
+ }
}
diff --git a/build.gradle.kts b/build.gradle.kts
index 43e1e1f..128da89 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -2,7 +2,6 @@ plugins {
`java-library`
`maven-publish`
id("com.github.johnrengelman.shadow") version "7.1.0"
- id("net.minecrell.plugin-yml.bukkit") version "0.5.1"
}
allprojects {
@@ -45,6 +44,7 @@ subprojects {
url = uri("https://repo.destro.xyz/snapshots/")
credentials(PasswordCredentials::class)
}
+ mavenCentral()
}
}
}
diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts
index 90579ec..a06bd0e 100644
--- a/plugin/build.gradle.kts
+++ b/plugin/build.gradle.kts
@@ -1,7 +1,7 @@
plugins {
`maven-publish`
id("com.github.johnrengelman.shadow")
- id("net.minecrell.plugin-yml.bukkit")
+ id("net.minecrell.plugin-yml.bukkit") version "0.5.1"
}
dependencies {
diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts
index 3f60707..042ed81 100644
--- a/velocity/build.gradle.kts
+++ b/velocity/build.gradle.kts
@@ -18,6 +18,8 @@ dependencies {
exclude("net.kyori")
exclude("net.kyori.examination")
}
+ //Luckperms
+ compileOnly("net.luckperms:api:5.3")
}
tasks {
diff --git a/velocity/src/main/java/com/alttd/vboosters/VelocityBoosters.java b/velocity/src/main/java/com/alttd/vboosters/VelocityBoosters.java
index 6b78cf0..4d0ab46 100644
--- a/velocity/src/main/java/com/alttd/vboosters/VelocityBoosters.java
+++ b/velocity/src/main/java/com/alttd/vboosters/VelocityBoosters.java
@@ -6,6 +6,7 @@ import com.alttd.boosterapi.util.ALogger;
import com.alttd.proxydiscordlink.DiscordLink;
import com.alttd.proxydiscordlink.bot.api.DiscordSendMessage;
import com.alttd.vboosters.commands.BoosterCommand;
+import com.alttd.vboosters.commands.DonorRankCommand;
import com.alttd.vboosters.listeners.PluginMessageListener;
import com.alttd.vboosters.managers.BoosterManager;
import com.google.inject.Inject;
@@ -79,6 +80,7 @@ public class VelocityBoosters {
public void loadCommands() {
// all (proxy)commands go here
new BoosterCommand(server);
+ new DonorRankCommand(server);
}
public ChannelIdentifier getChannelIdentifier() {
diff --git a/velocity/src/main/java/com/alttd/vboosters/commands/DonorRankCommand.java b/velocity/src/main/java/com/alttd/vboosters/commands/DonorRankCommand.java
index 451e486..aaab486 100644
--- a/velocity/src/main/java/com/alttd/vboosters/commands/DonorRankCommand.java
+++ b/velocity/src/main/java/com/alttd/vboosters/commands/DonorRankCommand.java
@@ -2,6 +2,8 @@ package com.alttd.vboosters.commands;
import com.alttd.boosterapi.BoosterAPI;
import com.alttd.boosterapi.config.Config;
+import com.alttd.boosterapi.util.Utils;
+import com.alttd.vboosters.VelocityBoosters;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
@@ -11,52 +13,53 @@ import com.velocitypowered.api.command.CommandMeta;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.proxy.ProxyServer;
import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.minimessage.Template;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.model.user.User;
import net.luckperms.api.node.Node;
import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.InheritanceNode;
-import java.util.UUID;
-
public class DonorRankCommand {
+ private final MiniMessage miniMessage;
+
public DonorRankCommand(ProxyServer proxyServer) {
+ miniMessage = MiniMessage.get();
LiteralCommandNode command = LiteralArgumentBuilder
.literal("donorrank")
.requires(ctx -> ctx.hasPermission("command.proxy.donorrank"))
.then(RequiredArgumentBuilder.argument("username", StringArgumentType.word()))
.then(RequiredArgumentBuilder.argument("action", StringArgumentType.word()))
.then(RequiredArgumentBuilder.argument("rank", StringArgumentType.word()))
- .then(RequiredArgumentBuilder.argument("transaction-id", StringArgumentType.word()))
.executes(context -> {
- //EX: donorrank {username} promote archduke {transaction}
- //File: {transaction}, cbccaa76-906d-458e-a24e-4b74322f2bb7, none -> archduke
- //EX: donorrank {username} demote archduke {transaction}
- //TODO command format: /donorrank user promote rank donate_id
- //TODO store the command and before and after rank in a file
- //TODO remove old donor ranks and add the new one
- if (!Config.donorRanks.contains(context.getInput())) //TODO validate group from command is donor
- return 0;
+ String username = context.getArgument("username", String.class);
+ String action = context.getArgument("context", String.class);
+ String rank = context.getArgument("rank", String.class);
+
LuckPerms luckPerms = BoosterAPI.get().getLuckPerms();
- User user = luckPerms.getUserManager().getUser(UUID.fromString(context.getInput())); //TODO context.getInput needs to get uuid
+ User user = luckPerms.getUserManager().getUser(username); //TODO test if this works with username
+
if (user == null) {
- context.getSource().sendMessage(MiniMessage.get().parse("string")); //TODO configurable message
- return 0;
+ context.getSource().sendMessage(miniMessage.parse(
+ Config.INVALID_USER,
+ Template.of("player", username)));
+ return 1;
+ }
+
+ if (!Config.donorRanks.contains(context.getInput())) {
+ context.getSource().sendMessage(miniMessage.parse(
+ Config.INVALID_DONOR_RANK,
+ Template.of("rank", rank)));
+ return 1;
+ }
+
+ switch (action) {
+ case "promote" -> promote(user, rank);
+ case "demote" -> demote(user, rank);
+ default -> context.getSource().sendMessage(miniMessage.parse(Config.INVALID_ACTION));
}
- user.getNodes(NodeType.INHERITANCE).stream()
- .filter(Node::getValue)
- .forEach(node -> {
- if (Config.donorRanks.contains(node.getKey()))
- user.data().remove(node);
- });
- user.data().add(InheritanceNode.builder(context.getInput()).build()); //TODO this needs to add the group from the command
- //TODO command format: /donorrank user promote rank donate_id
- //TODO get command and before and after rank from a file
- //TODO remove the command and before and after rank from a file
- //TODO remove current donor ranks and add the old one back (or remove them all if there was no old one)
-// VelocityBoosters.getPlugin().getLogger().info(stuff);
return 1;
})
.build();
@@ -69,4 +72,37 @@ public class DonorRankCommand {
proxyServer.getCommandManager().register(meta, brigadierCommand);
}
+
+ private void promote(User user, String rank) {
+ user.getNodes(NodeType.INHERITANCE).stream()
+ .filter(Node::getValue)
+ .forEach(node -> {
+ if (Config.donorRanks.contains(node.getKey()))
+ user.data().remove(node);
+ });
+ user.data().add(InheritanceNode.builder(rank).build());
+ VelocityBoosters.getPlugin().getProxy().getPlayer(user.getUniqueId()).ifPresent(player -> {
+ if (player.isActive()) {
+ player.sendMessage(miniMessage.parse(Config.PROMOTE_MESSAGE,
+ Template.of("rank", Utils.capitalize(rank)),
+ Template.of("player", player.getUsername())));
+ }
+ });
+ }
+
+ private void demote(User user, String rank) {
+ user.getNodes(NodeType.INHERITANCE).stream()
+ .filter(Node::getValue)
+ .forEach(node -> {
+ if (Config.donorRanks.contains(node.getKey()))
+ user.data().remove(node);
+ });
+ VelocityBoosters.getPlugin().getProxy().getPlayer(user.getUniqueId()).ifPresent(player -> {
+ if (player.isActive()) {
+ player.sendMessage(miniMessage.parse(Config.DEMOTE_MESSAGE,
+ Template.of("rank", Utils.capitalize(rank)),
+ Template.of("player", player.getUsername())));
+ }
+ });
+ }
}