Skip to content

Commit

Permalink
bungeetag command
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jun 24, 2019
1 parent b5d260f commit 7f67f2a
Show file tree
Hide file tree
Showing 16 changed files with 330 additions and 32 deletions.
Expand Up @@ -7,6 +7,7 @@
import com.denizenscript.depenizen.bukkit.commands.bungee.BungeeCommand;
import com.denizenscript.depenizen.bukkit.commands.bungee.BungeeExecuteCommand;
import com.denizenscript.depenizen.bukkit.commands.bungee.BungeeRunCommand;
import com.denizenscript.depenizen.bukkit.commands.bungee.BungeeTagCommand;
import com.denizenscript.depenizen.bukkit.events.bungee.*;
import com.denizenscript.depenizen.bukkit.properties.bungee.BungeePlayerProperties;
import io.netty.bootstrap.Bootstrap;
Expand Down Expand Up @@ -81,9 +82,15 @@ public void registerPackets() {
packets.put(56, new ProxyPingPacketIn());
packets.put(57, new RunScriptPacketIn());
packets.put(58, new RunCommandsPacketIn());
packets.put(59, new ReadTagPacketIn());
packets.put(60, new TagResponsePacketIn());
}

public void sendPacket(PacketOut packet) {
if (!connected) {
dB.echoError("BungeeBridge tried to send packet while not connected.");
return;
}
ByteBuf buf = channel.alloc().buffer();
packet.writeTo(buf);
ByteBuf header = channel.alloc().buffer();
Expand Down Expand Up @@ -179,6 +186,8 @@ public void successInit() {
"bungeeexecute [<command>]", 1);
DenizenAPI.getCurrentInstance().getCommandRegistry().registerCoreMember(BungeeCommand.class, "BUNGEE",
"bungee [<server>|...] [<commands>]", 1);
DenizenAPI.getCurrentInstance().getCommandRegistry().registerCoreMember(BungeeTagCommand.class, "BUNGEETAG",
"bungeetag [server:<server>] [<tag>]", 2);
TagManager.registerTagHandler(new TagRunnable.RootForm() {
@Override
public void run(ReplaceableTagEvent event) {
Expand Down
Expand Up @@ -70,9 +70,9 @@ public void channelActive(ChannelHandlerContext ctx) {
public void run() {
dB.log("Depenizen now connected to Bungee server.");
BungeeBridge.instance.lastPacketReceived = System.currentTimeMillis();
BungeeBridge.instance.connected = true;
BungeeBridge.instance.sendPacket(new MyInfoPacketOut(Bukkit.getPort()));
BungeeBridge.instance.sendPacket(new ControlsProxyPingPacketOut(BungeeBridge.instance.controlsProxyPing));
BungeeBridge.instance.connected = true;
}
}, 30);
}
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.events.bungee.BungeeServerConnectScriptEvent;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;

Expand All @@ -26,9 +25,7 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid AddServerPacket (name bytes requested: " + yourNameLength + ")");
return;
}
byte[] serverNameBytes = new byte[yourNameLength];
data.readBytes(serverNameBytes, 0, yourNameLength);
String serverName = new String(serverNameBytes, Charsets.UTF_8);
String serverName = readString(data, yourNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.events.bungee.BungeePlayerJoinsScriptEvent;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;

Expand All @@ -31,9 +30,7 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid PlayerJoinPacket (name bytes requested: " + nameLength + ")");
return;
}
byte[] nameBytes = new byte[nameLength];
data.readBytes(nameBytes, 0, nameLength);
String name = new String(nameBytes, Charsets.UTF_8);
String name = readString(data, nameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.events.bungee.BungeePlayerQuitsScriptEvent;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;

Expand All @@ -31,9 +30,7 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid PlayerQuitPacket (name bytes requested: " + nameLength + ")");
return;
}
byte[] nameBytes = new byte[nameLength];
data.readBytes(nameBytes, 0, nameLength);
String name = new String(nameBytes, Charsets.UTF_8);
String name = readString(data, nameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
Expand Down
Expand Up @@ -4,7 +4,6 @@
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.events.bungee.BungeePlayerServerSwitchScriptEvent;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;

Expand All @@ -31,17 +30,13 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + nameLength + ")");
return;
}
byte[] nameBytes = new byte[nameLength];
data.readBytes(nameBytes, 0, nameLength);
String name = new String(nameBytes, Charsets.UTF_8);
String name = readString(data, nameLength);
int serverNameLength = data.readInt();
if (data.readableBytes() < serverNameLength || serverNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + serverNameLength + ")");
return;
}
byte[] serverNameBytes = new byte[serverNameLength];
data.readBytes(serverNameBytes, 0, serverNameLength);
String serverName = new String(serverNameBytes, Charsets.UTF_8);
String serverName = readString(data, serverNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
Expand Down
Expand Up @@ -39,7 +39,7 @@ public void process(ByteBuf data) {
int protocol = data.readInt();
int versionLength = data.readInt();
if (data.readableBytes() < versionLength || versionLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (motd bytes requested: " + versionLength + ")");
BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (version bytes requested: " + versionLength + ")");
return;
}
String version = readString(data, versionLength);
Expand Down
@@ -0,0 +1,90 @@
package com.denizenscript.depenizen.bukkit.bungee.packets.in;

import com.denizenscript.depenizen.bukkit.Depenizen;
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.bungee.packets.out.RedirectPacketOut;
import com.denizenscript.depenizen.bukkit.bungee.packets.out.redirectable.TagResponsePacketOut;
import io.netty.buffer.ByteBuf;
import net.aufdemrand.denizen.BukkitScriptEntryData;
import net.aufdemrand.denizen.objects.dPlayer;
import net.aufdemrand.denizencore.tags.TagContext;
import net.aufdemrand.denizencore.tags.TagManager;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;

import java.util.List;
import java.util.UUID;

public class ReadTagPacketIn extends PacketIn {

@Override
public String getName() {
return "ReadTag";
}

@Override
public void process(ByteBuf data) {
if (data.readableBytes() < 12 + 16 + 4) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (name bytes requested: " + nameLength + ")");
return;
}
String responseServer = readString(data, nameLength);
int tagLength = data.readInt();
if (data.readableBytes() < tagLength || tagLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (tag bytes requested: " + tagLength + ")");
return;
}
String tag = readString(data, tagLength);
int defLength = data.readInt();
if (data.readableBytes() < defLength || defLength < 0) {
BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (def bytes requested: " + defLength + ")");
return;
}
String defs = readString(data, defLength);
long uuidMost = data.readLong();
long uuidLeast = data.readLong();
int responseId = data.readInt();
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
dPlayer linkedPlayer = null;
if (uuidMost != 0 || uuidLeast != 0) {
UUID uuid = new UUID(uuidMost, uuidLeast);
try {
OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
if (player != null) {
linkedPlayer = new dPlayer(player);
}
}
catch (Exception ex) {
// Ignore
}
}
TagContext context = new BukkitScriptEntryData(linkedPlayer, null).getTagContext();
List<String> defSets = CoreUtilities.split(defs, '\r');
List<String> defNames = CoreUtilities.split(defSets.get(0), '\n');
List<String> defValues = CoreUtilities.split(defSets.get(1), '\n');
for (int i = 0; i < defNames.size(); i++) {
String name = RunCommandsPacketIn.unescape(defNames.get(i));
if (name.length() > 0) {
String value = RunCommandsPacketIn.unescape(defValues.get(i));
context.definitionProvider.addDefinition(name, value);
}
}
String result = TagManager.tag(tag, context);
TagResponsePacketOut packet = new TagResponsePacketOut();
packet.id = responseId;
packet.result = result;
RedirectPacketOut redirectPacket = new RedirectPacketOut(responseServer, packet);
BungeeBridge.instance.sendPacket(redirectPacket);
}
});
}
}
Expand Up @@ -4,7 +4,6 @@
import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.events.bungee.BungeeServerDisconnectScriptEvent;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
import org.bukkit.Bukkit;

Expand All @@ -21,14 +20,14 @@ public void process(ByteBuf data) {
BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (bytes available: " + data.readableBytes() + ")");
return;
}
int yourNameLength = data.readInt();
if (data.readableBytes() < yourNameLength || yourNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (name bytes requested: " + yourNameLength + ")");
int serverNameLength = data.readInt();
if (data.readableBytes() < serverNameLength || serverNameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (name bytes requested: " + serverNameLength + ")");
return;
}
byte[] serverNameBytes = new byte[yourNameLength];
data.readBytes(serverNameBytes, 0, yourNameLength);
String serverName = new String(serverNameBytes, Charsets.UTF_8);
byte[] serverNameBytes = new byte[serverNameLength];
data.readBytes(serverNameBytes, 0, serverNameLength);
String serverName = readString(data, serverNameLength);
Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, new Runnable() {
@Override
public void run() {
Expand Down
Expand Up @@ -34,13 +34,13 @@ public void process(ByteBuf data) {
}
int commamndsLength = data.readInt();
if (data.readableBytes() < commamndsLength || commamndsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (address bytes requested: " + commamndsLength + ")");
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (command bytes requested: " + commamndsLength + ")");
return;
}
String commands = readString(data, commamndsLength);
int defsLength = data.readInt();
if (data.readableBytes() < defsLength || defsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (address bytes requested: " + defsLength + ")");
BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (def bytes requested: " + defsLength + ")");
return;
}
String defs = readString(data, defsLength);
Expand Down
Expand Up @@ -33,13 +33,13 @@ public void process(ByteBuf data) {
}
int nameLength = data.readInt();
if (data.readableBytes() < nameLength || nameLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (address bytes requested: " + nameLength + ")");
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (name bytes requested: " + nameLength + ")");
return;
}
String scriptName = readString(data, nameLength);
int defsLength = data.readInt();
if (data.readableBytes() < defsLength || defsLength < 0) {
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (address bytes requested: " + defsLength + ")");
BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (def bytes requested: " + defsLength + ")");
return;
}
String defs = readString(data, defsLength);
Expand Down
@@ -0,0 +1,30 @@
package com.denizenscript.depenizen.bukkit.bungee.packets.in;

import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketIn;
import com.denizenscript.depenizen.bukkit.commands.bungee.BungeeTagCommand;
import io.netty.buffer.ByteBuf;

public class TagResponsePacketIn extends PacketIn {

@Override
public String getName() {
return "TagResponse";
}

@Override
public void process(ByteBuf data) {
if (data.readableBytes() < 4 + 4) {
BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (bytes available: " + data.readableBytes() + ")");
return;
}
int resLength = data.readInt();
if (data.readableBytes() < resLength || resLength < 0) {
BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (result bytes requested: " + resLength + ")");
return;
}
String result = readString(data, resLength);
int id = data.readInt();
BungeeTagCommand.handleResult(id, result);
}
}
@@ -0,0 +1,33 @@
package com.denizenscript.depenizen.bukkit.bungee.packets.out.redirectable;

import com.denizenscript.depenizen.bukkit.bungee.BungeeBridge;
import com.denizenscript.depenizen.bukkit.bungee.PacketOut;
import io.netty.buffer.ByteBuf;

import java.util.UUID;

public class ReadTagPacketOut extends PacketOut {

public String tag;

public UUID playerUUID;

public String defs;

public int id;

@Override
public int getPacketId() {
return 59;
}

@Override
public void writeTo(ByteBuf buf) {
writeString(buf, BungeeBridge.instance.serverName);
writeString(buf, tag);
writeString(buf, defs);
buf.writeLong(playerUUID.getMostSignificantBits());
buf.writeLong(playerUUID.getLeastSignificantBits());
buf.writeInt(id);
}
}
@@ -0,0 +1,22 @@
package com.denizenscript.depenizen.bukkit.bungee.packets.out.redirectable;

import com.denizenscript.depenizen.bukkit.bungee.PacketOut;
import io.netty.buffer.ByteBuf;

public class TagResponsePacketOut extends PacketOut {

public String result;

public int id;

@Override
public int getPacketId() {
return 60;
}

@Override
public void writeTo(ByteBuf buf) {
writeString(buf, result);
buf.writeInt(id);
}
}
Expand Up @@ -43,6 +43,11 @@ public class BungeeCommand extends BracedCommand {
//
// -->

@Override
public void onEnable() {
setBraced();
}

@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
for (aH.Argument arg : aH.interpretArguments(scriptEntry.aHArgs)) {
Expand Down

0 comments on commit 7f67f2a

Please sign in to comment.