Archived
0

Плагин для BungeeCoord для взаимодействия с ASys

This commit is contained in:
2016-08-27 10:56:52 +03:00
parent 1b7ef9a50e
commit 946b7b7c45
6 changed files with 380 additions and 0 deletions

94
Bridge/pom.xml Normal file
View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>ASys Bridge</name>
<url>http://dmitriymx.ru/</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<bungee.version>1.8-SNAPSHOT</bungee.version>
<bungee.mainclass>asys.bridge.Bridge</bungee.mainclass>
</properties>
<groupId>asys</groupId>
<artifactId>bridge</artifactId>
<version>0.12</version>
<packaging>jar</packaging>
<repositories>
<repository>
<id>bungee-repo</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>${bungee.version}</version>
</dependency>
<dependency>
<groupId>asys.lib</groupId>
<artifactId>protocol</artifactId>
<version>0.3</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>**</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.15</version>
<configuration>
<argLine>-Dfile.encoding=${project.build.sourceEncoding}</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>asys.lib:protocol</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,90 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 2016-08-24
*/
package asys.bridge;
import asys.bridge.netty.Client;
import net.md_5.bungee.api.plugin.Plugin;
import java.io.IOException;
import java.net.ConnectException;
public class Bridge extends Plugin {
private Client netty;
private BungeeServerAPI serverAPI;
@Override
public void onEnable() {
try {
this.serverAPI = new BungeeServerAPI();
} catch (IOException e) {
e.printStackTrace();
return;
}
new Thread(new WatchConnect(), "ASys Client").start();
}
@Override
public void onDisable() {
if (netty != null)
netty.disconnect();
}
public BungeeServerAPI getServerAPI() {
return serverAPI;
}
private class WatchConnect implements Runnable {
@Override
public void run() {
// Попытка первого подключения
// Если false, значит попытка соединения прервана из вне
if (!tryConnect()) return;
// Продолжаем следить за коннектом
while (netty != null) {
if (!netty.isConnected()) {
getLogger().warning("Lost connect! Try reconnect...");
// Если false, значит попытка соединения прервана из вне
if (!tryConnect()) return;
} else {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return;
}
}
}
}
// Если false, значит попытка соединения прервана из вне
private boolean tryConnect() {
netty = new Client("127.0.0.1", (short)6251, Bridge.this);
boolean _try = true;
do {
try {
netty.connect();
_try = false;
} catch (InterruptedException e) {
netty.disconnect();
netty = null;
return false;
} catch (ConnectException e) {
getLogger().warning(e.getMessage());
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
netty = null;
return false;
}
}
} while (_try);
getLogger().info("ASys connected");
return true;
}
}
}

View File

@@ -0,0 +1,74 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 2016-08-26
*/
package asys.bridge;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Map;
public class BungeeServerAPI {
private File file;
private Configuration bungeeConfig;
public BungeeServerAPI() throws IOException {
file = new File(ProxyServer.getInstance().getPluginsFolder().getParentFile(), "config.yml");
bungeeConfig = YamlConfiguration.getProvider(YamlConfiguration.class).load(file);
}
public boolean addServer(String name, String address) {
if (getServers().get(name) != null) return false;
String[] addrPort = address.split(":",2);
InetSocketAddress ipAddress = new InetSocketAddress(addrPort[0], Integer.valueOf(addrPort[1]));
ServerInfo serverInfo = ProxyServer.getInstance().constructServerInfo(name, ipAddress, "", false);
getServers().put(serverInfo.getName(), serverInfo);
bungeeConfig.set("servers." + serverInfo.getName() + ".motd", serverInfo.getMotd());
bungeeConfig.set("servers." + serverInfo.getName() + ".address", serverInfo.getAddress().getAddress().getHostAddress() + ":" + serverInfo.getAddress().getPort());
bungeeConfig.set("servers." + serverInfo.getName() + ".restricted", false);
try {
YamlConfiguration.getProvider(YamlConfiguration.class).save(bungeeConfig, file);
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
public boolean removeServer(String name) {
ServerInfo serverInfo = getServers().get(name);
if (serverInfo == null) return false;
//TODO не совсем корректно...
for (ProxiedPlayer player : serverInfo.getPlayers()) {
player.connect(getServers().get(player.getPendingConnection().getListener().getFallbackServer()));
}
getServers().remove(name);
bungeeConfig.set("servers." + name, null);
try {
YamlConfiguration.getProvider(YamlConfiguration.class).save(bungeeConfig, file);
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
private Map<String, ServerInfo> getServers() {
return ProxyServer.getInstance().getServers();
}
}

View File

@@ -0,0 +1,72 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 2016-08-24
*/
package asys.bridge.netty;
import asys.bridge.Bridge;
import asys.lib.protocol.PacketDecoder;
import asys.lib.protocol.PacketEncoder;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.net.ConnectException;
public class Client {
private String host;
private short port;
private Bridge bridge;
private EventLoopGroup group;
private Channel channel;
public Client(String host, short port, Bridge bridge) {
this.host = host;
this.port = port;
this.bridge = bridge;
}
public void connect() throws InterruptedException, ConnectException {
group = new NioEventLoopGroup();
Bootstrap bootstrap = prepare_Bootstrap();
channel = bootstrap.connect(host, port).sync().channel();
channel.closeFuture();
}
private Bootstrap prepare_Bootstrap() {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(prepare_ChannelInitializer());
return bootstrap;
}
private ChannelInitializer prepare_ChannelInitializer() {
return new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(
new PacketEncoder(),
new PacketDecoder(),
new ClientHandler(bridge)
);
}
};
}
public void disconnect() {
group.shutdownGracefully();
}
public boolean isConnected() {
return channel.isOpen();
}
}

View File

@@ -0,0 +1,47 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 2016-08-21
*/
package asys.bridge.netty;
import asys.bridge.Bridge;
import asys.lib.protocol.Packet;
import asys.lib.protocol.ServerInfoPacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class ClientHandler extends SimpleChannelInboundHandler<Packet> {
private Bridge bridge;
public ClientHandler(Bridge bridge) {
this.bridge = bridge;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, Packet packet) throws Exception {
ServerInfoPacket infoPacket = (ServerInfoPacket)packet;
if (infoPacket.getState() == 1) {
boolean result = bridge.getServerAPI().addServer(infoPacket.getServerId(), infoPacket.getAddress());
if (result) bridge.getLogger().info(String.format("Add server '%s'", infoPacket.getServerId()));
else bridge.getLogger().warning(String.format("Server '%s' can't adding", infoPacket.getServerId()));
} else if (infoPacket.getState() == 0) {
boolean result = bridge.getServerAPI().removeServer(infoPacket.getServerId());
if (result) bridge.getLogger().info(String.format("Remove server '%s'", infoPacket.getServerId()));
else bridge.getLogger().warning(String.format("Server '%s' can't removing", infoPacket.getServerId()));
}
bridge.getLogger().config(String.format(
"Incomming packet: %d | %s | %s",
infoPacket.getState(),
infoPacket.getServerId(),
(infoPacket.getState() == 1 ? infoPacket.getAddress() : "")
));
}
}

View File

@@ -0,0 +1,3 @@
name: ASysBridge
main: ${bungee.mainclass}
version: ${project.version}