mirror of
https://github.com/DiscordSRV/Ascension.git
synced 2024-10-31 08:32:18 +01:00
Give CommandSenders full support for Audience, add connected/disconnected events
This commit is contained in:
parent
d1d05e7081
commit
61ac1ec1ec
@ -24,8 +24,7 @@ import com.discordsrv.common.logging.NamedLogger;
|
|||||||
import com.discordsrv.common.logging.backend.LoggingBackend;
|
import com.discordsrv.common.logging.backend.LoggingBackend;
|
||||||
import com.discordsrv.common.logging.backend.impl.JavaLoggerImpl;
|
import com.discordsrv.common.logging.backend.impl.JavaLoggerImpl;
|
||||||
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class BukkitConsole implements Console {
|
public class BukkitConsole implements Console {
|
||||||
@ -51,8 +50,8 @@ public class BukkitConsole implements Console {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
public boolean hasPermission(String permission) {
|
||||||
discordSRV.audiences().console().sendMessage(identity, message);
|
return discordSRV.server().getConsoleSender().hasPermission(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -66,4 +65,9 @@ public class BukkitConsole implements Console {
|
|||||||
public LoggingBackend loggingBackend() {
|
public LoggingBackend loggingBackend() {
|
||||||
return loggingBackend;
|
return loggingBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return discordSRV.audiences().console();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,6 @@ import com.discordsrv.common.DiscordSRV;
|
|||||||
import com.discordsrv.common.component.util.ComponentUtil;
|
import com.discordsrv.common.component.util.ComponentUtil;
|
||||||
import com.discordsrv.common.player.IPlayer;
|
import com.discordsrv.common.player.IPlayer;
|
||||||
import net.kyori.adventure.audience.Audience;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.identity.Identity;
|
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitComponentSerializer;
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@ -42,17 +40,6 @@ public class BukkitPlayer extends BukkitOfflinePlayer implements IPlayer {
|
|||||||
this.audience = discordSRV.audiences().player(player);
|
this.audience = discordSRV.audiences().player(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
|
||||||
if (audience != null) {
|
|
||||||
audience.sendMessage(
|
|
||||||
identity != null ? identity : Identity.nil(),
|
|
||||||
message);
|
|
||||||
} else {
|
|
||||||
player.sendMessage(BukkitComponentSerializer.legacy().serialize(message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(String permission) {
|
public boolean hasPermission(String permission) {
|
||||||
return player.hasPermission(permission);
|
return player.hasPermission(permission);
|
||||||
@ -76,4 +63,9 @@ public class BukkitPlayer extends BukkitOfflinePlayer implements IPlayer {
|
|||||||
PaperComponentUtil.getComponent(discordSRV, player, "displayName", Player::getDisplayName)
|
PaperComponentUtil.getComponent(discordSRV, player, "displayName", Player::getDisplayName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return audience;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,12 +34,10 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class BukkitPlayerProvider extends ServerPlayerProvider<BukkitPlayer> implements Listener {
|
public class BukkitPlayerProvider extends ServerPlayerProvider<BukkitPlayer, BukkitDiscordSRV> implements Listener {
|
||||||
|
|
||||||
private final BukkitDiscordSRV discordSRV;
|
|
||||||
|
|
||||||
public BukkitPlayerProvider(BukkitDiscordSRV discordSRV) {
|
public BukkitPlayerProvider(BukkitDiscordSRV discordSRV) {
|
||||||
this.discordSRV = discordSRV;
|
super(discordSRV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// IPlayer
|
// IPlayer
|
||||||
@ -50,17 +48,17 @@ public class BukkitPlayerProvider extends ServerPlayerProvider<BukkitPlayer> imp
|
|||||||
|
|
||||||
// Add players that are already connected
|
// Add players that are already connected
|
||||||
for (Player player : discordSRV.server().getOnlinePlayers()) {
|
for (Player player : discordSRV.server().getOnlinePlayers()) {
|
||||||
addPlayer(player);
|
addPlayer(player, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onPlayerLogin(PlayerJoinEvent event) {
|
public void onPlayerLogin(PlayerJoinEvent event) {
|
||||||
addPlayer(event.getPlayer());
|
addPlayer(event.getPlayer(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPlayer(Player player) {
|
private void addPlayer(Player player, boolean initial) {
|
||||||
addPlayer(player.getUniqueId(), new BukkitPlayer(discordSRV, player));
|
addPlayer(player.getUniqueId(), new BukkitPlayer(discordSRV, player), initial);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
@ -75,19 +73,14 @@ public class BukkitPlayerProvider extends ServerPlayerProvider<BukkitPlayer> imp
|
|||||||
// IOfflinePlayer
|
// IOfflinePlayer
|
||||||
|
|
||||||
private CompletableFuture<Optional<IOfflinePlayer>> getFuture(Supplier<OfflinePlayer> provider) {
|
private CompletableFuture<Optional<IOfflinePlayer>> getFuture(Supplier<OfflinePlayer> provider) {
|
||||||
CompletableFuture<Optional<IOfflinePlayer>> future = new CompletableFuture<>();
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
try {
|
|
||||||
OfflinePlayer offlinePlayer = provider.get();
|
OfflinePlayer offlinePlayer = provider.get();
|
||||||
if (offlinePlayer == null) {
|
if (offlinePlayer == null) {
|
||||||
future.complete(Optional.empty());
|
return Optional.empty();
|
||||||
return future;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
future.complete(Optional.of(new BukkitOfflinePlayer(discordSRV, offlinePlayer)));
|
return Optional.of(new BukkitOfflinePlayer(discordSRV, offlinePlayer));
|
||||||
} catch (Throwable t) {
|
}, discordSRV.scheduler().executor());
|
||||||
future.completeExceptionally(t);
|
|
||||||
}
|
|
||||||
return future;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -22,8 +22,7 @@ import com.discordsrv.bungee.BungeeDiscordSRV;
|
|||||||
import com.discordsrv.common.console.Console;
|
import com.discordsrv.common.console.Console;
|
||||||
import com.discordsrv.common.logging.backend.LoggingBackend;
|
import com.discordsrv.common.logging.backend.LoggingBackend;
|
||||||
import com.discordsrv.common.logging.backend.impl.JavaLoggerImpl;
|
import com.discordsrv.common.logging.backend.impl.JavaLoggerImpl;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class BungeeConsole implements Console {
|
public class BungeeConsole implements Console {
|
||||||
@ -37,8 +36,8 @@ public class BungeeConsole implements Console {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
public boolean hasPermission(String permission) {
|
||||||
discordSRV.audiences().console().sendMessage(identity, message);
|
return discordSRV.proxy().getConsole().hasPermission(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -51,4 +50,9 @@ public class BungeeConsole implements Console {
|
|||||||
public LoggingBackend loggingBackend() {
|
public LoggingBackend loggingBackend() {
|
||||||
return loggingBackend;
|
return loggingBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return discordSRV.audiences().console();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,13 +42,6 @@ public class BungeePlayer implements IPlayer {
|
|||||||
this.audience = discordSRV.audiences().player(player);
|
this.audience = discordSRV.audiences().player(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
|
||||||
audience.sendMessage(
|
|
||||||
identity != null ? identity : Identity.nil(),
|
|
||||||
message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(String permission) {
|
public boolean hasPermission(String permission) {
|
||||||
return player.hasPermission(permission);
|
return player.hasPermission(permission);
|
||||||
@ -78,4 +71,9 @@ public class BungeePlayer implements IPlayer {
|
|||||||
public @NotNull Component displayName() {
|
public @NotNull Component displayName() {
|
||||||
return BungeeComponentUtil.fromLegacy(player.getDisplayName());
|
return BungeeComponentUtil.fromLegacy(player.getDisplayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return audience;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,19 +20,16 @@ package com.discordsrv.bungee.player;
|
|||||||
|
|
||||||
import com.discordsrv.bungee.BungeeDiscordSRV;
|
import com.discordsrv.bungee.BungeeDiscordSRV;
|
||||||
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
||||||
import com.discordsrv.common.player.provider.PlayerProvider;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
|
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
|
||||||
import net.md_5.bungee.api.event.PostLoginEvent;
|
import net.md_5.bungee.api.event.PostLoginEvent;
|
||||||
import net.md_5.bungee.api.plugin.Listener;
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
import net.md_5.bungee.event.EventHandler;
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
public class BungeePlayerProvider extends AbstractPlayerProvider<BungeePlayer> implements PlayerProvider<BungeePlayer>, Listener {
|
public class BungeePlayerProvider extends AbstractPlayerProvider<BungeePlayer, BungeeDiscordSRV> implements Listener {
|
||||||
|
|
||||||
private final BungeeDiscordSRV discordSRV;
|
|
||||||
|
|
||||||
public BungeePlayerProvider(BungeeDiscordSRV discordSRV) {
|
public BungeePlayerProvider(BungeeDiscordSRV discordSRV) {
|
||||||
this.discordSRV = discordSRV;
|
super(discordSRV);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,17 +38,17 @@ public class BungeePlayerProvider extends AbstractPlayerProvider<BungeePlayer> i
|
|||||||
|
|
||||||
// Add players that are already connected
|
// Add players that are already connected
|
||||||
for (ProxiedPlayer player : discordSRV.proxy().getPlayers()) {
|
for (ProxiedPlayer player : discordSRV.proxy().getPlayers()) {
|
||||||
addPlayer(player);
|
addPlayer(player, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = Byte.MIN_VALUE) // Runs first
|
@EventHandler(priority = Byte.MIN_VALUE) // Runs first
|
||||||
public void onPostLogin(PostLoginEvent event) {
|
public void onPostLogin(PostLoginEvent event) {
|
||||||
addPlayer(event.getPlayer());
|
addPlayer(event.getPlayer(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPlayer(ProxiedPlayer player) {
|
private void addPlayer(ProxiedPlayer player, boolean initial) {
|
||||||
addPlayer(player.getUniqueId(), new BungeePlayer(discordSRV, player));
|
addPlayer(player.getUniqueId(), new BungeePlayer(discordSRV, player), initial);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = Byte.MAX_VALUE) // Runs last
|
@EventHandler(priority = Byte.MAX_VALUE) // Runs last
|
||||||
|
@ -35,7 +35,7 @@ public abstract class ServerDiscordSRV<C extends MainConfig, CC extends Connecti
|
|||||||
public abstract ServerScheduler scheduler();
|
public abstract ServerScheduler scheduler();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract @NotNull ServerPlayerProvider<?> playerProvider();
|
public abstract @NotNull ServerPlayerProvider<?, ?> playerProvider();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void enable() throws Throwable {
|
protected void enable() throws Throwable {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package com.discordsrv.common.server.player;
|
package com.discordsrv.common.server.player;
|
||||||
|
|
||||||
|
import com.discordsrv.common.DiscordSRV;
|
||||||
import com.discordsrv.common.player.IOfflinePlayer;
|
import com.discordsrv.common.player.IOfflinePlayer;
|
||||||
import com.discordsrv.common.player.IPlayer;
|
import com.discordsrv.common.player.IPlayer;
|
||||||
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
||||||
@ -26,7 +27,11 @@ import java.util.Optional;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public abstract class ServerPlayerProvider<T extends IPlayer> extends AbstractPlayerProvider<T> {
|
public abstract class ServerPlayerProvider<T extends IPlayer, DT extends DiscordSRV> extends AbstractPlayerProvider<T, DT> {
|
||||||
|
|
||||||
|
public ServerPlayerProvider(DT discordSRV) {
|
||||||
|
super(discordSRV);
|
||||||
|
}
|
||||||
|
|
||||||
public abstract CompletableFuture<Optional<IOfflinePlayer>> offlinePlayer(UUID uuid);
|
public abstract CompletableFuture<Optional<IOfflinePlayer>> offlinePlayer(UUID uuid);
|
||||||
public abstract CompletableFuture<Optional<IOfflinePlayer>> offlinePlayer(String username);
|
public abstract CompletableFuture<Optional<IOfflinePlayer>> offlinePlayer(String username);
|
||||||
|
@ -69,7 +69,7 @@ public interface DiscordSRV extends DiscordSRVApi {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
AbstractPlayerProvider<?> playerProvider();
|
AbstractPlayerProvider<?, ?> playerProvider();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@ -18,19 +18,30 @@
|
|||||||
|
|
||||||
package com.discordsrv.common.command.game.sender;
|
package com.discordsrv.common.command.game.sender;
|
||||||
|
|
||||||
|
import net.kyori.adventure.audience.ForwardingAudience;
|
||||||
|
import net.kyori.adventure.audience.MessageType;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.identity.Identity;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public interface ICommandSender {
|
public interface ICommandSender extends ForwardingAudience.Single {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to this {@link ICommandSender} with {@link Identity#nil()}.
|
||||||
|
* @param message the message to send
|
||||||
|
*/
|
||||||
default void sendMessage(@NotNull Component message) {
|
default void sendMessage(@NotNull Component message) {
|
||||||
// Identity is converted to Identity.nil() later
|
sendMessage(Identity.nil(), message, MessageType.CHAT);
|
||||||
sendMessage(null, message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendMessage(@Nullable Identity identity, @NotNull Component message);
|
/**
|
||||||
|
* Sends a message to this {@link ICommandSender} with {@link Identity#nil()}.
|
||||||
|
* @param message the message to send
|
||||||
|
* @param messageType the {@link MessageType}
|
||||||
|
*/
|
||||||
|
default void sendMessage(@NotNull Component message, @NotNull MessageType messageType) {
|
||||||
|
sendMessage(Identity.nil(), message, messageType);
|
||||||
|
}
|
||||||
|
|
||||||
boolean hasPermission(String permission);
|
boolean hasPermission(String permission);
|
||||||
void runCommand(String command);
|
void runCommand(String command);
|
||||||
|
@ -23,11 +23,6 @@ import com.discordsrv.common.logging.backend.LoggingBackend;
|
|||||||
|
|
||||||
public interface Console extends ICommandSender {
|
public interface Console extends ICommandSender {
|
||||||
|
|
||||||
@Override
|
|
||||||
default boolean hasPermission(String permission) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the logging backend for the server/proxy.
|
* Gets the logging backend for the server/proxy.
|
||||||
* @return the {@link LoggingBackend}
|
* @return the {@link LoggingBackend}
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of DiscordSRV, licensed under the GPLv3 License
|
||||||
|
* Copyright (c) 2016-2022 Austin "Scarsz" Shapiro, Henri "Vankka" Schubin and DiscordSRV contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.discordsrv.common.player.event;
|
||||||
|
|
||||||
|
import com.discordsrv.api.event.events.Event;
|
||||||
|
import com.discordsrv.common.player.IPlayer;
|
||||||
|
|
||||||
|
public class PlayerConnectedEvent implements Event {
|
||||||
|
|
||||||
|
private final IPlayer player;
|
||||||
|
private final boolean joinedBeforeInitialization;
|
||||||
|
|
||||||
|
public PlayerConnectedEvent(IPlayer player, boolean joinedBeforeInitialization) {
|
||||||
|
this.player = player;
|
||||||
|
this.joinedBeforeInitialization = joinedBeforeInitialization;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPlayer player() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this player joined before DiscordSRV initialized.
|
||||||
|
* @return {@code true} if the player joined before DiscordSRV enabled
|
||||||
|
*/
|
||||||
|
public boolean joinedBeforeInitialization() {
|
||||||
|
return joinedBeforeInitialization;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of DiscordSRV, licensed under the GPLv3 License
|
||||||
|
* Copyright (c) 2016-2022 Austin "Scarsz" Shapiro, Henri "Vankka" Schubin and DiscordSRV contributors
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.discordsrv.common.player.event;
|
||||||
|
|
||||||
|
import com.discordsrv.api.event.events.Event;
|
||||||
|
import com.discordsrv.common.player.IPlayer;
|
||||||
|
|
||||||
|
public class PlayerDisconnectedEvent implements Event {
|
||||||
|
|
||||||
|
private final IPlayer player;
|
||||||
|
|
||||||
|
public PlayerDisconnectedEvent(IPlayer player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPlayer player() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
}
|
@ -18,29 +18,39 @@
|
|||||||
|
|
||||||
package com.discordsrv.common.player.provider;
|
package com.discordsrv.common.player.provider;
|
||||||
|
|
||||||
|
import com.discordsrv.common.DiscordSRV;
|
||||||
import com.discordsrv.common.player.IPlayer;
|
import com.discordsrv.common.player.IPlayer;
|
||||||
|
import com.discordsrv.common.player.event.PlayerConnectedEvent;
|
||||||
|
import com.discordsrv.common.player.event.PlayerDisconnectedEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
public abstract class AbstractPlayerProvider<T extends IPlayer> implements PlayerProvider<T> {
|
public abstract class AbstractPlayerProvider<T extends IPlayer, DT extends DiscordSRV> implements PlayerProvider<T> {
|
||||||
|
|
||||||
private final Map<UUID, T> players = new ConcurrentHashMap<>();
|
private final Map<UUID, T> players = new ConcurrentHashMap<>();
|
||||||
private final Set<T> allPlayers = new CopyOnWriteArraySet<>();
|
private final List<T> allPlayers = new CopyOnWriteArrayList<>();
|
||||||
|
protected final DT discordSRV;
|
||||||
|
|
||||||
|
public AbstractPlayerProvider(DT discordSRV) {
|
||||||
|
this.discordSRV = discordSRV;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void subscribe();
|
public abstract void subscribe();
|
||||||
|
|
||||||
protected void addPlayer(UUID uuid, T player) {
|
protected void addPlayer(UUID uuid, T player, boolean initial) {
|
||||||
this.players.put(uuid, player);
|
this.players.put(uuid, player);
|
||||||
this.allPlayers.add(player);
|
this.allPlayers.add(player);
|
||||||
|
discordSRV.scheduler().runFork(() -> discordSRV.eventBus().publish(new PlayerConnectedEvent(player, initial)));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void removePlayer(UUID uuid) {
|
protected void removePlayer(UUID uuid) {
|
||||||
T player = this.players.remove(uuid);
|
T player = this.players.remove(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
allPlayers.remove(player);
|
allPlayers.remove(player);
|
||||||
|
discordSRV.scheduler().runFork(() -> discordSRV.eventBus().publish(new PlayerDisconnectedEvent(player)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +70,7 @@ public abstract class AbstractPlayerProvider<T extends IPlayer> implements Playe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<T> allPlayers() {
|
public @NotNull Collection<T> allPlayers() {
|
||||||
return allPlayers;
|
return allPlayers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,17 +32,20 @@ public interface PlayerProvider<T extends IPlayer> extends IPlayerProvider {
|
|||||||
* Gets an online player by {@link UUID}.
|
* Gets an online player by {@link UUID}.
|
||||||
* @param uuid the uuid of the Player
|
* @param uuid the uuid of the Player
|
||||||
*/
|
*/
|
||||||
@NotNull Optional<T> player(@NotNull UUID uuid);
|
@NotNull
|
||||||
|
Optional<T> player(@NotNull UUID uuid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets an online player by username.
|
* Gets an online player by username.
|
||||||
* @param username case-insensitive username for the player
|
* @param username case-insensitive username for the player
|
||||||
*/
|
*/
|
||||||
@NotNull Optional<T> player(@NotNull String username);
|
@NotNull
|
||||||
|
Optional<T> player(@NotNull String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets all online players.
|
* Gets all online players.
|
||||||
* @return all players that are currently online
|
* @return all players that are currently online
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
Collection<T> allPlayers();
|
Collection<T> allPlayers();
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ public class MockDiscordSRV extends AbstractDiscordSRV<MainConfig, ConnectionCon
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull AbstractPlayerProvider<?> playerProvider() {
|
public @NotNull AbstractPlayerProvider<?, ?> playerProvider() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ public class MockDiscordSRV extends AbstractDiscordSRV<MainConfig, ConnectionCon
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull AbstractPlayerProvider<?> playerProvider() {
|
public @NotNull AbstractPlayerProvider<?, ?> playerProvider() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,8 +22,7 @@ import com.discordsrv.common.console.Console;
|
|||||||
import com.discordsrv.common.logging.backend.LoggingBackend;
|
import com.discordsrv.common.logging.backend.LoggingBackend;
|
||||||
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
||||||
import com.discordsrv.sponge.SpongeDiscordSRV;
|
import com.discordsrv.sponge.SpongeDiscordSRV;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.spongepowered.api.command.exception.CommandException;
|
import org.spongepowered.api.command.exception.CommandException;
|
||||||
|
|
||||||
@ -38,8 +37,8 @@ public class SpongeConsole implements Console {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
public boolean hasPermission(String permission) {
|
||||||
discordSRV.game().systemSubject().sendMessage(identity, message);
|
return discordSRV.game().systemSubject().hasPermission(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,4 +53,9 @@ public class SpongeConsole implements Console {
|
|||||||
public LoggingBackend loggingBackend() {
|
public LoggingBackend loggingBackend() {
|
||||||
return loggingBackend;
|
return loggingBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return discordSRV.game().systemSubject();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ package com.discordsrv.sponge.player;
|
|||||||
import com.discordsrv.common.DiscordSRV;
|
import com.discordsrv.common.DiscordSRV;
|
||||||
import com.discordsrv.common.player.IPlayer;
|
import com.discordsrv.common.player.IPlayer;
|
||||||
import com.discordsrv.sponge.SpongeDiscordSRV;
|
import com.discordsrv.sponge.SpongeDiscordSRV;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.spongepowered.api.command.exception.CommandException;
|
import org.spongepowered.api.command.exception.CommandException;
|
||||||
@ -38,13 +38,6 @@ public class SpongePlayer extends SpongeOfflinePlayer implements IPlayer {
|
|||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
|
||||||
player.sendMessage(
|
|
||||||
identity != null ? identity : Identity.nil(),
|
|
||||||
message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(String permission) {
|
public boolean hasPermission(String permission) {
|
||||||
return player.hasPermission(permission);
|
return player.hasPermission(permission);
|
||||||
@ -66,4 +59,9 @@ public class SpongePlayer extends SpongeOfflinePlayer implements IPlayer {
|
|||||||
public @NotNull Component displayName() {
|
public @NotNull Component displayName() {
|
||||||
return player.displayName().get();
|
return player.displayName().get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,33 +32,31 @@ import java.util.Optional;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public class SpongePlayerProvider extends ServerPlayerProvider<SpongePlayer> {
|
public class SpongePlayerProvider extends ServerPlayerProvider<SpongePlayer, SpongeDiscordSRV> {
|
||||||
|
|
||||||
private final SpongeDiscordSRV discordSRV;
|
|
||||||
|
|
||||||
public SpongePlayerProvider(SpongeDiscordSRV discordSRV) {
|
public SpongePlayerProvider(SpongeDiscordSRV discordSRV) {
|
||||||
this.discordSRV = discordSRV;
|
super(discordSRV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IPlayer
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void subscribe() {
|
public void subscribe() {
|
||||||
discordSRV.game().eventManager().registerListeners(discordSRV.container(), this);
|
discordSRV.game().eventManager().registerListeners(discordSRV.container(), this);
|
||||||
|
|
||||||
// Add players that are already connected
|
// Add players that are already connected
|
||||||
for (ServerPlayer player : discordSRV.game().server().onlinePlayers()) {
|
for (ServerPlayer player : discordSRV.game().server().onlinePlayers()) {
|
||||||
addPlayer(player);
|
addPlayer(player, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IPlayer
|
|
||||||
|
|
||||||
@Listener(order = Order.PRE)
|
@Listener(order = Order.PRE)
|
||||||
public void onPlayerJoin(ServerSideConnectionEvent.Join event) {
|
public void onPlayerJoin(ServerSideConnectionEvent.Join event) {
|
||||||
addPlayer(event.player());
|
addPlayer(event.player(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPlayer(ServerPlayer player) {
|
private void addPlayer(ServerPlayer player, boolean initial) {
|
||||||
addPlayer(player.uniqueId(), new SpongePlayer(discordSRV, player));
|
addPlayer(player.uniqueId(), new SpongePlayer(discordSRV, player), initial);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Listener(order = Order.POST)
|
@Listener(order = Order.POST)
|
||||||
|
@ -22,8 +22,7 @@ import com.discordsrv.common.console.Console;
|
|||||||
import com.discordsrv.common.logging.backend.LoggingBackend;
|
import com.discordsrv.common.logging.backend.LoggingBackend;
|
||||||
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
import com.discordsrv.common.logging.backend.impl.Log4JLoggerImpl;
|
||||||
import com.discordsrv.velocity.VelocityDiscordSRV;
|
import com.discordsrv.velocity.VelocityDiscordSRV;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class VelocityConsole implements Console {
|
public class VelocityConsole implements Console {
|
||||||
@ -37,8 +36,8 @@ public class VelocityConsole implements Console {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
public boolean hasPermission(String permission) {
|
||||||
discordSRV.proxy().getConsoleCommandSource().sendMessage(identity, message);
|
return discordSRV.proxy().getConsoleCommandSource().hasPermission(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -51,4 +50,9 @@ public class VelocityConsole implements Console {
|
|||||||
public LoggingBackend loggingBackend() {
|
public LoggingBackend loggingBackend() {
|
||||||
return loggingBackend;
|
return loggingBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return discordSRV.proxy().getConsoleCommandSource();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import com.discordsrv.common.DiscordSRV;
|
|||||||
import com.discordsrv.common.player.IPlayer;
|
import com.discordsrv.common.player.IPlayer;
|
||||||
import com.discordsrv.velocity.VelocityDiscordSRV;
|
import com.discordsrv.velocity.VelocityDiscordSRV;
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
import net.kyori.adventure.audience.Audience;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.kyori.adventure.identity.Identity;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@ -36,13 +37,6 @@ public class VelocityPlayer implements IPlayer {
|
|||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendMessage(Identity identity, @NotNull Component message) {
|
|
||||||
player.sendMessage(
|
|
||||||
identity != null ? identity : Identity.nil(),
|
|
||||||
message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(String permission) {
|
public boolean hasPermission(String permission) {
|
||||||
return player.hasPermission(permission);
|
return player.hasPermission(permission);
|
||||||
@ -76,4 +70,9 @@ public class VelocityPlayer implements IPlayer {
|
|||||||
() -> Component.text(player.getUsername())
|
() -> Component.text(player.getUsername())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Audience audience() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package com.discordsrv.velocity.player;
|
package com.discordsrv.velocity.player;
|
||||||
|
|
||||||
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
import com.discordsrv.common.player.provider.AbstractPlayerProvider;
|
||||||
import com.discordsrv.common.player.provider.PlayerProvider;
|
|
||||||
import com.discordsrv.velocity.VelocityDiscordSRV;
|
import com.discordsrv.velocity.VelocityDiscordSRV;
|
||||||
import com.velocitypowered.api.event.PostOrder;
|
import com.velocitypowered.api.event.PostOrder;
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
@ -27,12 +26,10 @@ import com.velocitypowered.api.event.connection.DisconnectEvent;
|
|||||||
import com.velocitypowered.api.event.connection.PostLoginEvent;
|
import com.velocitypowered.api.event.connection.PostLoginEvent;
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
|
||||||
public class VelocityPlayerProvider extends AbstractPlayerProvider<VelocityPlayer> implements PlayerProvider<VelocityPlayer> {
|
public class VelocityPlayerProvider extends AbstractPlayerProvider<VelocityPlayer, VelocityDiscordSRV> {
|
||||||
|
|
||||||
private final VelocityDiscordSRV discordSRV;
|
|
||||||
|
|
||||||
public VelocityPlayerProvider(VelocityDiscordSRV discordSRV) {
|
public VelocityPlayerProvider(VelocityDiscordSRV discordSRV) {
|
||||||
this.discordSRV = discordSRV;
|
super(discordSRV);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,17 +38,17 @@ public class VelocityPlayerProvider extends AbstractPlayerProvider<VelocityPlaye
|
|||||||
|
|
||||||
// Add players that are already connected
|
// Add players that are already connected
|
||||||
for (Player player : discordSRV.proxy().getAllPlayers()) {
|
for (Player player : discordSRV.proxy().getAllPlayers()) {
|
||||||
addPlayer(player);
|
addPlayer(player, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe(order = PostOrder.FIRST)
|
@Subscribe(order = PostOrder.FIRST)
|
||||||
public void onPostLogin(PostLoginEvent event) {
|
public void onPostLogin(PostLoginEvent event) {
|
||||||
addPlayer(event.getPlayer());
|
addPlayer(event.getPlayer(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPlayer(Player player) {
|
private void addPlayer(Player player, boolean initial) {
|
||||||
addPlayer(player.getUniqueId(), new VelocityPlayer(discordSRV, player));
|
addPlayer(player.getUniqueId(), new VelocityPlayer(discordSRV, player), initial);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe(order = PostOrder.LAST)
|
@Subscribe(order = PostOrder.LAST)
|
||||||
|
Loading…
Reference in New Issue
Block a user