Skip to content

Commit 1230214

Browse files
committed
add gkick command
1 parent 50b0eb8 commit 1230214

File tree

14 files changed

+105
-26
lines changed

14 files changed

+105
-26
lines changed

api/src/main/java/net/outfluencer/convey/api/Convey.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ public static void setInstance(Convey instance) {
2323
*
2424
* @return the list
2525
*/
26-
protected abstract List<LocalConveyPlayer> getLocalPlayers();
26+
public abstract List<LocalConveyPlayer> getLocalPlayers();
2727

2828
/**
2929
* Gets the List of all convey players on the network
3030
*
31+
* @apiNote The returned list can contain LocalConveyPlayers
3132
* @return the list
3233
*/
33-
protected abstract List<ConveyPlayer> getGlobalPlayers();
34+
public abstract List<ConveyPlayer> getGlobalPlayers();
3435
}

bukkit/src/main/java/net/outfluencer/convey/bukkit/ConveyBukkit.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.outfluencer.convey.api.player.ConveyPlayer;
1818
import net.outfluencer.convey.api.player.LocalConveyPlayer;
1919
import net.outfluencer.convey.bukkit.commands.ConveyCommand;
20+
import net.outfluencer.convey.bukkit.commands.GKickCommand;
2021
import net.outfluencer.convey.bukkit.commands.GListCommand;
2122
import net.outfluencer.convey.bukkit.commands.ServerCommand;
2223
import net.outfluencer.convey.bukkit.handler.ClientPacketHandler;
@@ -141,6 +142,7 @@ public void onEnable() {
141142
this.plugin.getCommand("convey").setExecutor(new ConveyCommand());
142143
this.plugin.getCommand("server").setExecutor(new ServerCommand());
143144
this.plugin.getCommand("glist").setExecutor(new GListCommand());
145+
this.plugin.getCommand("gkick").setExecutor(new GKickCommand());
144146

145147
Bukkit.getOnlinePlayers().forEach(player -> this.playerMap.put(player, new ConveyPlayerImplBukkit(player)));
146148
}
@@ -210,9 +212,9 @@ public String getTranslation(String name, Object... args) {
210212
return (format != null) ? format.format(args) : "<translation '" + name + "' missing>";
211213
}
212214

213-
public boolean fallback(Player player, String reason) {
215+
public boolean fallback(ConveyPlayerImplBukkit player, String reason) {
214216
for (Server server : servers.values()) {
215-
if (server.isFallbackServer() && transferUtils.transferPlayer(this.getPlayerMap().get(player), server, false, reason)) {
217+
if (server.isFallbackServer() && transferUtils.transferPlayer(player, server, false, reason)) {
216218
return true;
217219
}
218220
}

bukkit/src/main/java/net/outfluencer/convey/bukkit/commands/ConveyCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
1515
ConveyBukkit convey = ConveyBukkit.getInstance();
1616
if (convey.getConveyServer() == null) {
1717
sender.sendMessage(ChatColor.RED + "Convey is loading...");
18-
return false;
18+
return true;
1919
}
2020
sender.sendMessage(ChatColor.BLUE + "Convey by Outfluencer, current server name " + convey.getConveyServer().getName());
2121
for (Server server : convey.getServers().values()) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package net.outfluencer.convey.bukkit.commands;
2+
3+
import com.google.common.collect.Iterables;
4+
import net.outfluencer.convey.api.Convey;
5+
import net.outfluencer.convey.bukkit.ConveyBukkit;
6+
import org.bukkit.ChatColor;
7+
import org.bukkit.command.Command;
8+
import org.bukkit.command.CommandSender;
9+
import org.bukkit.command.TabExecutor;
10+
import org.bukkit.plugin.java.annotation.command.Commands;
11+
12+
import java.util.ArrayList;
13+
import java.util.Collections;
14+
import java.util.List;
15+
import java.util.Locale;
16+
17+
@Commands(@org.bukkit.plugin.java.annotation.command.Command(name = "gkick", desc = "Kicks a player from the network", permission = "convey.command.gkick", usage = "/gkick <player>"))
18+
public class GKickCommand implements TabExecutor {
19+
@Override
20+
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
21+
if (args.length == 0) {
22+
return false;
23+
}
24+
25+
ConveyBukkit convey = ConveyBukkit.getInstance();
26+
if (convey.getConveyServer() == null) {
27+
sender.sendMessage(ChatColor.RED + "Convey is loading...");
28+
return true;
29+
}
30+
31+
String playerName = args[0];
32+
String message = args.length > 1 ? String.join(" ", args).substring(playerName.length() + 1) : convey.getTranslation("kick");
33+
34+
ConveyBukkit.getInstance().getGlobalPlayers().forEach(player -> {
35+
if (player.getName().equalsIgnoreCase(playerName)) {
36+
player.kick(message);
37+
}
38+
});
39+
40+
41+
return true;
42+
}
43+
44+
@Override
45+
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
46+
if (args.length > 1) return Collections.emptyList();
47+
ArrayList<String> list = new ArrayList();
48+
Iterables.transform(Iterables.filter(Convey.getInstance().getGlobalPlayers(), input ->
49+
input.getName().toLowerCase(Locale.ROOT).startsWith(args[0].toLowerCase(Locale.ROOT))),
50+
input -> input.getName()).forEach(list::add);
51+
return list;
52+
}
53+
}

bukkit/src/main/java/net/outfluencer/convey/bukkit/commands/GListCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
1919
ConveyBukkit convey = ConveyBukkit.getInstance();
2020
if (convey.getConveyServer() == null) {
2121
sender.sendMessage(ChatColor.RED + "Convey is loading...");
22-
return false;
22+
return true;
2323
}
2424
ComponentBuilder builder = new ComponentBuilder("List of all servers: ");
2525
ConveyBukkit.getInstance().getServers().values().forEach(server -> {

bukkit/src/main/java/net/outfluencer/convey/bukkit/commands/ServerCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
2525
ConveyBukkit convey = ConveyBukkit.getInstance();
2626
if (convey.getConveyServer() == null) {
2727
sender.sendMessage(ChatColor.RED + "Convey is loading...");
28-
return false;
28+
return true;
2929
}
3030
if (args.length == 0) {
3131
ComponentBuilder builder = new ComponentBuilder("Servers you may connect to: ");

bukkit/src/main/java/net/outfluencer/convey/bukkit/handler/ClientPacketHandler.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import lombok.RequiredArgsConstructor;
77
import net.outfluencer.convey.api.Server;
88
import net.outfluencer.convey.api.player.ConveyPlayer;
9+
import net.outfluencer.convey.api.player.LocalConveyPlayer;
910
import net.outfluencer.convey.bukkit.ConveyBukkit;
1011
import net.outfluencer.convey.bukkit.impl.RemoteConveyPlayer;
1112
import net.outfluencer.convey.bukkit.impl.ServerImplBukkit;
@@ -89,9 +90,15 @@ public void handle(PlayerServerPacket playerServerPacket) {
8990
Server server = convey.getServers().get(playerServerPacket.getServerName());
9091
if(server == convey.getConveyServer()) return;
9192
if(playerServerPacket.isJoin()) {
92-
server.getConnectedUsers().add(new RemoteConveyPlayer( playerServerPacket.getUserData().getName(), playerServerPacket.getUserData().getUniqueId()));
93+
// add local player to this list if possible
94+
ConveyPlayer conveyPlayer = new RemoteConveyPlayer( playerServerPacket.getUserData().getName(), playerServerPacket.getUserData().getUniqueId());
95+
LocalConveyPlayer localPlayer = conveyPlayer.getLocalPlayer();
96+
if(localPlayer != null) {
97+
conveyPlayer = localPlayer;
98+
}
99+
server.getConnectedUsers().add(conveyPlayer);
93100
} else {
94-
server.getConnectedUsers().removeIf(user -> user.getUniqueId().equals(playerServerPacket.getUserData().getUniqueId()));
101+
server.getConnectedUsers().removeIf(user -> !(user instanceof LocalConveyPlayer) && user.getUniqueId().equals(playerServerPacket.getUserData().getUniqueId()));
95102
}
96103
}
97104

bukkit/src/main/java/net/outfluencer/convey/bukkit/impl/ConveyPlayerImplBukkit.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ConveyPlayerImplBukkit implements LocalConveyPlayer {
2828

2929
private final Player player;
3030

31-
private boolean catchKicks = true;
31+
private volatile boolean catchKicks = true;
3232

3333
@Override
3434
public String getName() {

bukkit/src/main/java/net/outfluencer/convey/bukkit/listeners/PlayerKickListener.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.outfluencer.convey.bukkit.listeners;
22

33
import net.outfluencer.convey.bukkit.ConveyBukkit;
4+
import net.outfluencer.convey.bukkit.impl.ConveyPlayerImplBukkit;
45
import org.bukkit.event.EventHandler;
56
import org.bukkit.event.Listener;
67
import org.bukkit.event.player.PlayerKickEvent;
@@ -9,7 +10,11 @@ public class PlayerKickListener implements Listener {
910

1011
@EventHandler
1112
public void onPlayerKick(PlayerKickEvent event) {
12-
if (ConveyBukkit.getInstance().fallback(event.getPlayer(), event.getReason())) {
13+
ConveyPlayerImplBukkit player = ConveyBukkit.getInstance().getPlayerMap().get(event.getPlayer());
14+
if(!player.isCatchKicks()) {
15+
return;
16+
}
17+
if (ConveyBukkit.getInstance().fallback(player, event.getReason())) {
1318
event.setCancelled(true);
1419
}
1520
}

bukkit/src/main/java/net/outfluencer/convey/bukkit/utils/KickCatcher.java

-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ protected void encode(ChannelHandlerContext channelHandlerContext, Object o, Lis
131131
// sorry thats hacky, we bassicly schedule the close on the pipeline to ensure the transfer will apply
132132
@Override
133133
public void close(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception {
134-
135134
if(!player.isCatchKicks()) {
136135
super.close(ctx, promise);
137136
return;

bukkit/src/main/resources/messages.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ already-connected=\u00a7c[Convey] You are already connected to this server.
55
already-connected-network=\u00a7c[Convey] You are already connected to this server network.
66
fallback=\u00a7c[Convey] You have been kicked off {0}: {1}
77
not-loaded=\u00a7c[Convey] Convey is not loaded yet.
8-
currently-offline=\u00a7c[Convey] The server you try to connect to is currently offline.
8+
currently-offline=\u00a7c[Convey] The server you try to connect to is currently offline.
9+
kick=\u00a7c[Convey] You have been kicked off the network.

common/src/main/java/net/outfluencer/convey/common/protocol/PacketRegistry.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ public static int getPacketId(AbstractPacket packet, boolean toServer) {
3939
PACKET_IDS_TO_CLIENT = new HashMap<>();
4040

4141
TO_SERVER = new Supplier[]{
42-
HelloPacket::new, PingPacket::new, PlayerServerPacket::new, ServerSyncPacket::new
42+
HelloPacket::new, PingPacket::new, PlayerServerPacket::new, ServerSyncPacket::new, PlayerKickPacket::new
4343
};
4444
TO_CLIENT = new Supplier[]{
45-
ServerInfoPacket::new, PingPacket::new, PlayerServerPacket::new, AdminUsersPacket::new, SendMessageToPlayerPacket::new, ServerSyncPacket::new
45+
ServerInfoPacket::new, PingPacket::new, PlayerServerPacket::new, AdminUsersPacket::new, SendMessageToPlayerPacket::new, ServerSyncPacket::new, PlayerKickPacket::new
4646
};
4747

4848
for (int i = 0; i < TO_SERVER.length; i++) {

server/src/main/java/net/outfluencer/convey/server/config/JsonServerConfig.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import com.google.gson.annotations.SerializedName;
66
import lombok.*;
77
import net.outfluencer.convey.common.api.UserData;
8-
import net.outfluencer.convey.server.handler.ServerPacketHandler;
8+
import net.outfluencer.convey.common.protocol.packets.AbstractPacket;
99
import net.outfluencer.convey.common.utils.AESUtils;
10+
import net.outfluencer.convey.server.handler.ServerPacketHandler;
1011

11-
import java.util.*;
12+
import java.util.ArrayList;
13+
import java.util.Base64;
14+
import java.util.List;
1215

1316
@Data
1417
@AllArgsConstructor
@@ -64,6 +67,12 @@ public boolean isActive() {
6467
return packetHandler != null && packetHandler.isConnected();
6568
}
6669

70+
public void trySendPacket(AbstractPacket packet) {
71+
if (isActive()) {
72+
packetHandler.getChannel().eventLoop().execute(() -> packetHandler.getChannel().writeAndFlush(packet));
73+
}
74+
}
75+
6776
}
6877

6978
public String toString() {

server/src/main/java/net/outfluencer/convey/server/handler/ServerPacketHandler.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ServerPacketHandler extends AbstractPacketHandler {
2222
private final Convey convey;
2323

2424
private boolean auth = false;
25+
@Getter
2526
private Channel channel;
2627
@Getter
2728
private JsonServerConfig.Host currentHost;
@@ -108,19 +109,15 @@ public void disconnected(Channel channel) {
108109
}
109110
ServerSyncPacket serverSyncPacket = new ServerSyncPacket(currentHost.getName(), true, false, List.of());
110111
Convey.getConvey().getServerInfos().values().forEach(host -> {
111-
if (host.getPacketHandler() != null && host.getPacketHandler().isConnected()) {
112-
host.getPacketHandler().channel.writeAndFlush(serverSyncPacket);
113-
}
112+
host.trySendPacket(serverSyncPacket);
114113
});
115114
}
116115

117116
@Override
118117
public void handle(ServerSyncPacket serverDisconnectedPacket) {
119118
serverDisconnectedPacket.setServer(currentHost.getName());
120119
Convey.getConvey().getServerInfos().values().forEach(host -> {
121-
if (host.isActive()) {
122-
host.getPacketHandler().channel.writeAndFlush(serverDisconnectedPacket);
123-
}
120+
host.trySendPacket(serverDisconnectedPacket);
124121
});
125122
}
126123

@@ -139,9 +136,7 @@ public void handle(PlayerServerPacket playerServerPacket) {
139136
}
140137

141138
this.convey.getServerInfos().values().forEach(info -> {
142-
if (info.isActive()) {
143-
info.getPacketHandler().channel.writeAndFlush(playerServerPacket);
144-
}
139+
info.trySendPacket(playerServerPacket);
145140
});
146141
}
147142

@@ -154,4 +149,11 @@ public String toString() {
154149
sb.append(this.channel.remoteAddress()).append("]");
155150
return sb.toString();
156151
}
152+
153+
@Override
154+
public void handle(PlayerKickPacket playerKickPacket) {
155+
this.convey.getServerInfos().values().forEach(info -> {
156+
info.trySendPacket(playerKickPacket);
157+
});
158+
}
157159
}

0 commit comments

Comments
 (0)