package org.redegs.crossplay;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.event.CitizensEnableEvent;
import net.citizensnpcs.api.npc.NPC;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import net.citizensnpcs.api.npc.*;
import org.bukkit.entity.*;
import org.bukkit.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public final class Crossplay extends JavaPlugin implements Listener {
boolean CitizensLoaded = false;
@Override
public void onEnable() {
// Plugin startup logic
getLogger().info("Hello from redegs plugin!");
try {
getLogger().info("Attemping to send HTTP Request to Crossplay server!");
sendPlayerDataToServer("PlayersChangedModel", "crossplay_mc_server", "join", null, "mc");
try {
startHttpServer();
getLogger().info("Starting internal HTTP server");
} catch (IOException e) {
getLogger().warning("Internal HTTP server failed, plugin will not work as intended.");
e.printStackTrace();
}
} catch (IOException e) {
getLogger().warning("Outgoing request failed, plugin will not work as intended.");
e.printStackTrace();
}
getServer().getPluginManager().registerEvents(this, this);
this.getCommand("testnpc").setExecutor(new CommandTestNPC());
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
private void startHttpServer() throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/endpoint", new MyHandler());
server.setExecutor(null);
server.start();
}
public static void sendPlayerDataToServer(String modelType, String username, String reqTypeOrPosition, String chatMsg, String platform) throws IOException {
try {
URL url = new URL("http://80.192.241.222:8085/webhook");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
// Construct the payload based on the model type
String payload = null;
switch (modelType) {
case "UpdateModel":
payload = String.format("{\"updatemodel\":{\"username\":\"%s\",\"position\":\"%s\",\"platform\":\"%s\"},\"playerschangedmodel\":null,\"chatmsgmodel\":null}", username, reqTypeOrPosition, platform);
break;
case "PlayersChangedModel":
payload = String.format("{\"updatemodel\":null,\"playerschangedmodel\":{\"username\":\"%s\",\"req_type\":\"%s\",\"platform\":\"%s\"},\"chatmsgmodel\":null}", username, reqTypeOrPosition, platform);
break;
case "ChatMessageModel":
payload = String.format("{\"updatemodel\":null,\"playerschangedmodel\":null,\"chatmsgmodel\":{\"username\":\"%s\",\"chat_msg\":\"%s\",\"platform\":\"%s\"}}", username, chatMsg, platform);
break;
default:
throw new IllegalArgumentException("Invalid model type");
}
byte[] out = payload.getBytes(StandardCharsets.UTF_8);
OutputStream stream = connection.getOutputStream();
stream.write(out);
stream.flush();
stream.close();
Bukkit.getConsoleSender().sendMessage(connection.getResponseCode() + " " + connection.getResponseMessage());
connection.disconnect();
} catch (Exception e) {
Bukkit.getConsoleSender().sendMessage(String.valueOf(e));
Bukkit.getConsoleSender().sendMessage("Failed successfully");
}
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
if ("POST".equals(exchange.getRequestMethod())) {
String requestBody = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);
exchange.sendResponseHeaders(200, 0);
OutputStream os = exchange.getResponseBody();
os.write("Received".getBytes());
os.close();
// Parse the JSON request body
JsonObject jsonObject = JsonParser.parseString(requestBody).getAsJsonObject();
String request_type = jsonObject.get("request_type").getAsString();
Bukkit.getConsoleSender().sendMessage(request_type);
if (request_type.equals("msg")) {
Bukkit.getConsoleSender().sendMessage("recv msg requesat");
String username = jsonObject.get("username").getAsString();
String chatMsg = jsonObject.get("chat_msg").getAsString();
Bukkit.getServer().broadcastMessage(username + ": " + chatMsg);
} else if (request_type.equals("player_changed")) {
Bukkit.getConsoleSender().sendMessage("recv player changed requesat");
String username = jsonObject.get("username").getAsString();
String req_type = jsonObject.get("req_type").getAsString();
if (req_type.equals("join")) {
Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&e" + username + " joined the game"));
Server server = Bukkit.getServer();
if (server.getOnlinePlayers().size() >= 1) {
List player_list = new ArrayList(server.getOnlinePlayers());
Player nearest_player = (Player) player_list.get(0);
Location loc = nearest_player.getLocation();
Bukkit.getServer().broadcastMessage("Attempting to spawn roblox npc at " + loc.toString());
NPC new_npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "Example " + username, loc);
new_npc.spawn(loc);
}
} else {
Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&e" + username + " left the game"));
}
}
} else {
exchange.sendResponseHeaders(405, -1); // Method Not Allowed
}
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) throws IOException {
Player player = event.getPlayer();
String player_name = player.getName();
Bukkit.getConsoleSender().sendMessage("Fired player join event!");
sendPlayerDataToServer("PlayersChangedModel", player_name, "join", null, "mc");
}
@EventHandler
public void onPlayerLeave(PlayerQuitEvent event) throws IOException {
Player player = event.getPlayer();
String player_name = player.getName();
Bukkit.getConsoleSender().sendMessage("Fired player leave event!");
sendPlayerDataToServer("PlayersChangedModel", player_name, "leave", null, "mc");
}
@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event) throws IOException {
String message = event.getMessage();
Player player = event.getPlayer();
String player_name = player.getName();
Bukkit.getConsoleSender().sendMessage("Fired player chat event!");
sendPlayerDataToServer("ChatMessageModel", player_name, null, message, "mc");
}
@EventHandler
public void onCitizensEnable(CitizensEnableEvent event) throws IOException {
this.CitizensLoaded = true;
}
}