blob: 242bbb1b26009f88a7e714f228e3ee187af1580e [file] [log] [blame]
package hscloud.personal.q3k.minecraft.plugin.hscloud;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.logging.Logger;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.protobuf.services.ProtoReflectionService;
import io.grpc.stub.StreamObserver;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import hscloud.personal.q3k.minecraft.plugin.hscloud.proto.IntrospectorGrpc;
import hscloud.personal.q3k.minecraft.plugin.hscloud.proto.Proto;
public class Main extends JavaPlugin {
private Server server_;
private static final Logger logger_ = Logger.getLogger(Main.class.getName());
private static final int port_ = 2137;
public StateSynchronizer synchronizer_;
public Main() {
synchronizer_ = new StateSynchronizer();
server_ = ServerBuilder
.forPort(port_)
.addService(new IntrospectorService(synchronizer_))
.addService(ProtoReflectionService.newInstance())
.build();
}
@Override
public void onEnable() {
BukkitScheduler scheduler = getServer().getScheduler();
scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
@Override
public void run() {
ArrayList<StateSynchronizer.Player> players = new ArrayList<StateSynchronizer.Player>();
for (Player p : Bukkit.getOnlinePlayers()) {
StateSynchronizer.Player pp = new StateSynchronizer.Player(p.getPlayerListName(), p.getUniqueId().toString());
players.add(pp);
}
synchronizer_.setPlayers(players.toArray(new StateSynchronizer.Player[0]));
World world = Bukkit.getWorld("world");
if (world != null) {
synchronizer_.setTime(world.getTime());
}
}
}, 0, 20L);
try {
server_.start();
} catch (IOException e) {
logger_.severe("could not start gRPC");
e.printStackTrace(System.err);
return;
}
logger_.info("gRPC started, listening on " + port_);
}
@Override
public void onDisable() {
if (server_ != null) {
try {
server_.shutdown().awaitTermination(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger_.severe("could not stop gRPC");
e.printStackTrace(System.err);
}
}
server_ = null;
}
public static class IntrospectorService extends IntrospectorGrpc.IntrospectorImplBase {
private StateSynchronizer synchronizer_;
public IntrospectorService(StateSynchronizer synchronizer) {
synchronizer_ = synchronizer;
}
@Override
public void status(Proto.StatusRequest request, StreamObserver<Proto.StatusResponse> responseObserver) {
StateSynchronizer.Player[] players = synchronizer_.getPlayers();
Proto.StatusResponse.Builder builder = Proto.StatusResponse.newBuilder();
builder.setTime(synchronizer_.getTime());
for (StateSynchronizer.Player p : players) {
builder.addPlayers(Proto.Player.newBuilder()
.setUsername(p.getName())
.setUuid(p.getUUID())
.build());
}
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
}
}