1
0
mirror of https://github.com/GeyserMC/Floodgate.git synced 2025-12-19 14:59:20 +00:00

No longer use Adventure internally. Started working on adding Checkstyle

This commit is contained in:
Tim203
2022-03-05 20:02:06 +01:00
parent 0e055d106d
commit 0e1e1b823c
27 changed files with 711 additions and 921 deletions

View File

@@ -7,10 +7,7 @@ dependencies {
// hack to make pre 1.12 work
implementation("com.google.guava", "guava", guavaVersion)
implementation("cloud.commandframework", "cloud-bukkit", Versions.cloudVersion)
implementation("net.kyori", "adventure-text-serializer-legacy", Versions.adventureApiVersion)
implementation("net.kyori", "adventure-text-serializer-gson", Versions.adventureApiVersion)
}
relocate("com.google.inject")

View File

@@ -35,9 +35,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.geysermc.floodgate.api.SimpleFloodgateApi;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.player.FloodgatePlayerImpl;
import org.geysermc.floodgate.util.LanguageManager;
import org.geysermc.floodgate.util.SpigotCommandUtil;
public final class SpigotListener implements Listener {
@Inject private SimpleFloodgateApi api;
@@ -68,7 +66,5 @@ public final class SpigotListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
api.playerRemoved(event.getPlayer().getUniqueId());
SpigotCommandUtil.AUDIENCE_CACHE.remove(event.getPlayer().getUniqueId()); //todo
}
}

View File

@@ -59,7 +59,7 @@ public final class SpigotCommandModule extends CommandModule {
CommandManager<UserAudience> commandManager = new BukkitCommandManager<>(
plugin,
CommandExecutionCoordinator.simpleCoordinator(),
commandUtil::getAudience,
commandUtil::getUserAudience,
audience -> (CommandSender) audience.source()
);
commandManager.registerCommandPreProcessor(new FloodgateCommandPreprocessor<>(commandUtil));

View File

@@ -76,10 +76,9 @@ public final class SpigotPlatformModule extends AbstractModule {
public CommandUtil commandUtil(
FloodgateApi api,
SpigotVersionSpecificMethods versionSpecificMethods,
FloodgateLogger logger,
LanguageManager languageManager) {
return new SpigotCommandUtil(plugin.getServer(), api, versionSpecificMethods, plugin,
logger, languageManager);
return new SpigotCommandUtil(
languageManager, plugin.getServer(), api, versionSpecificMethods, plugin);
}
@Provides

View File

@@ -25,44 +25,40 @@
package org.geysermc.floodgate.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.floodgate.api.FloodgateApi;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
import org.geysermc.floodgate.platform.command.CommandUtil;
import org.geysermc.floodgate.platform.command.TranslatableMessage;
import org.geysermc.floodgate.player.UserAudience;
import org.geysermc.floodgate.player.UserAudienceArgument.PlayerType;
import org.geysermc.floodgate.util.SpigotUserAudience.SpigotConsoleAudience;
import org.geysermc.floodgate.util.SpigotUserAudience.SpigotPlayerAudience;
@RequiredArgsConstructor
public final class SpigotCommandUtil implements CommandUtil {
public static final @NonNull Map<UUID, UserAudience> AUDIENCE_CACHE = new HashMap<>();
private static UserAudience console;
import org.geysermc.floodgate.player.UserAudience.ConsoleAudience;
import org.geysermc.floodgate.player.UserAudience.PlayerAudience;
public final class SpigotCommandUtil extends CommandUtil {
private final Server server;
private final FloodgateApi api;
private final SpigotVersionSpecificMethods versionSpecificMethods;
private final JavaPlugin plugin;
private final FloodgateLogger logger;
private final LanguageManager manager;
private UserAudience console;
public SpigotCommandUtil(
LanguageManager manager,
Server server,
FloodgateApi api,
SpigotVersionSpecificMethods versionSpecificMethods,
JavaPlugin plugin) {
super(manager, api);
this.server = server;
this.versionSpecificMethods = versionSpecificMethods;
this.plugin = plugin;
}
@Override
public @NonNull UserAudience getAudience(final @NonNull Object sourceObj) {
public @NonNull UserAudience getUserAudience(final @NonNull Object sourceObj) {
if (!(sourceObj instanceof CommandSender)) {
throw new IllegalArgumentException("Source has to be a CommandSender!");
}
@@ -72,89 +68,47 @@ public final class SpigotCommandUtil implements CommandUtil {
if (console != null) {
return console;
}
return console = new SpigotConsoleAudience(source, this);
return console = new ConsoleAudience(source, this);
}
Player player = (Player) source;
UUID uuid = player.getUniqueId();
String username = player.getName();
String locale = versionSpecificMethods.getLocale(player);
return AUDIENCE_CACHE.computeIfAbsent(uuid,
$ -> new SpigotPlayerAudience(uuid, locale, source, true, this));
return new PlayerAudience(uuid, username, locale, source,this, true);
}
@Override
public @Nullable UserAudience getAudienceByUsername(@NonNull String username) {
Player player = server.getPlayer(username);
return player != null ? getAudience(player) : null;
protected String getUsernameFromSource(@NonNull Object source) {
return ((Player) source).getName();
}
@Override
public @NonNull UserAudience getOfflineAudienceByUsername(@NonNull String username) {
return new SpigotPlayerAudience(null, username, null, null, false, this);
protected UUID getUuidFromSource(@NonNull Object source) {
return ((Player) source).getUniqueId();
}
@Override
public @Nullable UserAudience getAudienceByUuid(@NonNull UUID uuid) {
protected Collection<?> getOnlinePlayers() {
return server.getOnlinePlayers();
}
@Override
public Object getPlayerByUuid(@NonNull UUID uuid) {
Player player = server.getPlayer(uuid);
return player != null ? getAudience(player) : null;
return player != null ? player : uuid;
}
@Override
public @NonNull UserAudience getOfflineAudienceByUuid(@NonNull UUID uuid) {
return new SpigotPlayerAudience(uuid, null, null, null, false, this);
}
@Override
public @NonNull Collection<String> getOnlineUsernames(@NonNull PlayerType limitTo) {
Collection<? extends Player> players = server.getOnlinePlayers();
Collection<String> usernames = new ArrayList<>();
switch (limitTo) {
case ALL_PLAYERS:
for (Player player : players) {
usernames.add(player.getName());
}
break;
case ONLY_JAVA:
for (Player player : players) {
if (!api.isFloodgatePlayer(player.getUniqueId())) {
usernames.add(player.getName());
}
}
break;
case ONLY_BEDROCK:
for (Player player : players) {
if (api.isFloodgatePlayer(player.getUniqueId())) {
usernames.add(player.getName());
}
}
break;
default:
throw new IllegalStateException("Unknown PlayerType");
}
return usernames;
public Object getPlayerByUsername(@NonNull String username) {
Player player = server.getPlayer(username);
return player != null ? player : username;
}
@Override
public boolean hasPermission(Object player, String permission) {
return cast(player).hasPermission(permission);
}
@Override
public Collection<Object> getOnlinePlayersWithPermission(String permission) {
List<Object> players = new ArrayList<>();
for (Player player : Bukkit.getOnlinePlayers()) {
if (hasPermission(player, permission)) {
players.add(player);
}
}
return players;
}
@Override
public void sendMessage(Object target, String locale, TranslatableMessage message, Object... args) {
sendMessage(target, translateAndTransform(locale, message, args));
return ((CommandSender) player).hasPermission(permission);
}
@Override
@@ -163,10 +117,11 @@ public final class SpigotCommandUtil implements CommandUtil {
}
@Override
public void kickPlayer(Object player, String locale, TranslatableMessage message, Object... args) {
// Have to run this in the main thread so we don't get a `Asynchronous player kick!` error
Bukkit.getScheduler().runTask(plugin,
() -> cast(player).kickPlayer(translateAndTransform(locale, message, args)));
public void kickPlayer(Object player, String message) {
// can also be console
if (player instanceof Player) {
Bukkit.getScheduler().runTask(plugin, () -> ((Player) player).kickPlayer(message));
}
}
@Override
@@ -178,18 +133,4 @@ public final class SpigotCommandUtil implements CommandUtil {
public boolean removePlayerFromWhitelist(UUID uuid, String username) {
return WhitelistUtils.removePlayer(uuid, username);
}
public String translateAndTransform(String locale, TranslatableMessage message, Object... args) {
// unlike others, Bukkit doesn't have to transform a message into another class.
return message.translateMessage(manager, locale, args);
}
private Player cast(Object instance) {
try {
return (Player) instance;
} catch (ClassCastException exception) {
logger.error("Failed to cast {} to Player", instance.getClass().getName());
throw exception;
}
}
}

View File

@@ -1,158 +0,0 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Floodgate
*/
package org.geysermc.floodgate.util;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.audience.ForwardingAudience;
import net.kyori.adventure.audience.MessageType;
import net.kyori.adventure.identity.Identity;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.floodgate.platform.command.CommandUtil;
import org.geysermc.floodgate.platform.command.TranslatableMessage;
import org.geysermc.floodgate.player.UserAudience;
@RequiredArgsConstructor
public class SpigotUserAudience implements UserAudience, ForwardingAudience.Single {
private final UUID uuid;
private final String locale;
private final CommandSender source;
private final CommandUtil commandUtil;
@Override
public @NonNull UUID uuid() {
return uuid;
}
@Override
public @NonNull String username() {
return source.getName();
}
@Override
public @NonNull String locale() {
return locale;
}
@Override
public @NonNull CommandSender source() {
return source;
}
@Override
public boolean hasPermission(@NonNull String permission) {
return source.hasPermission(permission);
}
@Override
public void sendMessage(
@NonNull Identity source,
@NonNull Component message,
@NonNull MessageType type) {
this.source.sendMessage(GsonComponentSerializer.gson().serialize(message));
}
@Override
public void sendMessage(TranslatableMessage message, Object... args) {
commandUtil.sendMessage(source(), locale(), message, args);
}
@Override
public void disconnect(@NonNull Component reason) {
if (source instanceof Player) {
((Player) source).kickPlayer(GsonComponentSerializer.gson().serialize(reason));
}
}
@Override
public void disconnect(TranslatableMessage message, Object... args) {
commandUtil.kickPlayer(source(), locale(), message, args);
}
@Override
public @NonNull Audience audience() {
return this;
}
public static final class SpigotConsoleAudience extends SpigotUserAudience
implements ConsoleAudience {
public SpigotConsoleAudience(CommandSender source, CommandUtil commandUtil) {
super(new UUID(0, 0), "en_us", source, commandUtil);
}
@Override
public void sendMessage(
@NonNull Identity source,
@NonNull Component message,
@NonNull MessageType type) {
source().sendMessage(LegacyComponentSerializer.legacySection().serialize(message));
}
}
public static final class SpigotPlayerAudience extends SpigotUserAudience
implements PlayerAudience {
private final String username;
private final boolean online;
public SpigotPlayerAudience(
UUID uuid,
String username,
String locale,
CommandSender source,
boolean online,
CommandUtil commandUtil) {
super(uuid, locale, source, commandUtil);
this.username = username;
this.online = online;
}
public SpigotPlayerAudience(
UUID uuid,
String locale,
CommandSender source,
boolean online,
CommandUtil commandUtil) {
this(uuid, source.getName(), locale, source, online, commandUtil);
}
@Override
public @NonNull String username() {
return username;
}
@Override
public boolean online() {
return online;
}
}
}