Added server icons.

This commit is contained in:
Alex231 2020-11-25 00:13:45 +00:00
parent 1743e725c4
commit d0e65c9031
4 changed files with 197 additions and 167 deletions

View File

@ -1,5 +1,5 @@
name: MineOnlineBroadcast
version: 1.1.0
version: 1.1.1
description: Lists a server on mineonline.codie.gg/servers
author: codieradical
authors: [Codie]

View File

@ -1,12 +1,17 @@
import gg.codie.common.input.EColorCodeColor;
import gg.codie.minecraft.server.MinecraftColorCodeProvider;
import gg.codie.mineonline.api.MineOnlineAPI;
import gg.codie.mineonline.discord.DiscordChatBridge;
import gg.codie.mineonline.discord.IMessageRecievedListener;
import gg.codie.mineonline.discord.IShutdownListener;
import gg.codie.mineonline.discord.MinotarAvatarProvider;
import gg.codie.mineonline.plugin.ProxyThread;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.json.JSONObject;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@ -16,7 +21,9 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -35,6 +42,7 @@ public class MineOnlineBroadcast extends Plugin {
boolean initialized;
String serverName = "Minecraft Server";
private MineOnlineConfig mineOnlineConfig;
String serverUUID;
public void launchProxy() throws IOException {
ServerSocket serverSocket = new ServerSocket(0);
@ -83,81 +91,6 @@ public class MineOnlineBroadcast extends Plugin {
return result.toUpperCase();
}
public static void listServer(
String ip,
String port,
int users,
int maxUsers,
String name,
boolean onlineMode,
String md5,
boolean whitelisted,
String[] playerNames,
String motd,
boolean dontListPlayers,
boolean useBetaEvolutionsAuth
) {
HttpURLConnection connection = null;
try {
URLClassLoader classLoader = new URLClassLoader(new URL[]{MineOnlineBroadcast.class.getProtectionDomain().getCodeSource().getLocation()});
Class jsonObjectClass = classLoader.loadClass("org.json.JSONObject");
Constructor jsonObjectConstructor = jsonObjectClass.getConstructor();
Method jsonObjectPut = jsonObjectClass.getMethod("put", String.class, Object.class);
Method jsonObjectToString = jsonObjectClass.getMethod("toString");
Object jsonObject = jsonObjectConstructor.newInstance();
if (ip != null)
jsonObjectPut.invoke(jsonObject, "ip", ip);
jsonObjectPut.invoke(jsonObject, "port", port);
if (users > -1 && !dontListPlayers)
jsonObjectPut.invoke(jsonObject, "users", users);
jsonObjectPut.invoke(jsonObject, "max", maxUsers);
jsonObjectPut.invoke(jsonObject, "name", name);
jsonObjectPut.invoke(jsonObject, "onlinemode", onlineMode);
jsonObjectPut.invoke(jsonObject, "md5", md5);
jsonObjectPut.invoke(jsonObject, "whitelisted", whitelisted);
if (!dontListPlayers)
jsonObjectPut.invoke(jsonObject, "players", playerNames);
jsonObjectPut.invoke(jsonObject, "motd", motd);
jsonObjectPut.invoke(jsonObject, "dontListPlayers", dontListPlayers);
jsonObjectPut.invoke(jsonObject, "useBetaEvolutionsAuth", useBetaEvolutionsAuth);
String json = (String) jsonObjectToString.invoke(jsonObject);
URL url = new URL("https://mineonline.codie.gg/api/servers");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
connection.getOutputStream().flush();
connection.getOutputStream().close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
}
}
public void enable() {
initialize();
@ -208,7 +141,27 @@ public class MineOnlineBroadcast extends Plugin {
String[] playerNames = etc.getServer().getPlayerList().stream().map(player -> player.getName()).collect(Collectors.toList()).toArray(new String[users]);
listServer(
String serverIcon = null;
try {
BufferedImage serverIconBufferedImage = ImageIO.read(new File(System.getProperty("user.dir") + File.separator + "server-icon.png"));
if (serverIconBufferedImage.getHeight() <= 64 && serverIconBufferedImage.getWidth() <= 64) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ImageIO.write(serverIconBufferedImage, "png", bos);
byte[] bytes = bos.toByteArray();
Base64.Encoder encoder = Base64.getEncoder();
serverIcon = encoder.encodeToString(bytes);
serverIcon = serverIcon.replace(System.lineSeparator(), "");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IIOException ex) {
ex.printStackTrace();
}
serverUUID = MineOnlineAPI.listServer(
ip,
port,
users,
@ -220,10 +173,11 @@ public class MineOnlineBroadcast extends Plugin {
playerNames,
motd,
dontListPlayers,
useBetaEvolutionsAuth
useBetaEvolutionsAuth,
serverIcon
);
} catch (IOException ex) {
//ex.printStackTrace();
ex.printStackTrace();
// ignore.
}
}
@ -263,7 +217,6 @@ public class MineOnlineBroadcast extends Plugin {
String discordWebhookURL = mineOnlineConfig.getConfigString("discord-webhook-url");
serverName = mineOnlineConfig.getConfigString("server-name");
if (discordToken != null && discordChannelID != null) { // Create the discord bot if token and channel are present
discord = new DiscordChatBridge(new MinotarAvatarProvider(), discordChannelID, discordToken, discordWebhookURL, new IMessageRecievedListener() {
@Override
@ -350,6 +303,14 @@ public class MineOnlineBroadcast extends Plugin {
if (!initialized)
return;
if (serverUUID != null) {
try {
MineOnlineAPI.deleteServerListing(serverUUID);
} catch (IOException ex) {
ex.printStackTrace();
}
}
unregister();
if (discord != null)
discord.shutdown();

View File

@ -0,0 +1,119 @@
package gg.codie.mineonline.api;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
public class MineOnlineAPI {
public static void deleteServerListing(String uuid) throws IOException {
HttpURLConnection connection;
URL url = new URL("https://mineonline.codie.gg/api/servers/" + uuid);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
connection.connect();
if (connection != null)
connection.disconnect();
}
public static String listServer(
String ip,
String port,
int users,
int maxUsers,
String name,
boolean onlineMode,
String md5,
boolean whitelisted,
String[] playerNames,
String motd,
boolean dontListPlayers,
boolean useBetaEvolutionsAuth,
String serverIcon
) {
HttpURLConnection connection = null;
try {
URLClassLoader classLoader = new URLClassLoader(new URL[]{MineOnlineAPI.class.getProtectionDomain().getCodeSource().getLocation()});
Class jsonObjectClass = classLoader.loadClass("org.json.JSONObject");
Constructor jsonObjectConstructor = jsonObjectClass.getConstructor();
Method jsonObjectPut = jsonObjectClass.getMethod("put", String.class, Object.class);
Method jsonObjectHas = jsonObjectClass.getMethod("has", String.class);
Method jsonObjectGetString = jsonObjectClass.getMethod("getString", String.class);
Method jsonObjectToString = jsonObjectClass.getMethod("toString");
Object jsonObject = jsonObjectConstructor.newInstance();
if (ip != null)
jsonObjectPut.invoke(jsonObject, "ip", ip);
jsonObjectPut.invoke(jsonObject, "port", port);
if (users > -1 && !dontListPlayers)
jsonObjectPut.invoke(jsonObject, "users", users);
jsonObjectPut.invoke(jsonObject, "max", maxUsers);
jsonObjectPut.invoke(jsonObject, "name", name);
jsonObjectPut.invoke(jsonObject, "onlinemode", onlineMode);
jsonObjectPut.invoke(jsonObject, "md5", md5.toUpperCase());
jsonObjectPut.invoke(jsonObject, "whitelisted", whitelisted);
if (!dontListPlayers)
jsonObjectPut.invoke(jsonObject, "players", playerNames);
jsonObjectPut.invoke(jsonObject, "motd", motd);
jsonObjectPut.invoke(jsonObject, "dontListPlayers", dontListPlayers);
jsonObjectPut.invoke(jsonObject, "useBetaEvolutionsAuth", useBetaEvolutionsAuth);
jsonObjectPut.invoke(jsonObject, "serverIcon", serverIcon);
String json = (String) jsonObjectToString.invoke(jsonObject);
URL url = new URL("https://mineonline.codie.gg/api/servers");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
connection.getOutputStream().flush();
connection.getOutputStream().close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
jsonObjectConstructor = jsonObjectClass.getConstructor(String.class);
Object resObject = jsonObjectConstructor.newInstance(response.toString());
if ((boolean)jsonObjectHas.invoke(resObject, "uuid")) {
return (String)jsonObjectGetString.invoke(resObject, "uuid");
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
}
return null;
}
}

View File

@ -2,6 +2,7 @@ package gg.codie.mineonline.plugin.bukkit;
import gg.codie.common.input.EColorCodeColor;
import gg.codie.minecraft.server.MinecraftColorCodeProvider;
import gg.codie.mineonline.api.MineOnlineAPI;
import gg.codie.mineonline.discord.DiscordChatBridge;
import gg.codie.mineonline.discord.IMessageRecievedListener;
import gg.codie.mineonline.discord.IShutdownListener;
@ -12,16 +13,14 @@ import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.plugin.java.JavaPlugin;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.ServerSocket;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Properties;
import java.util.logging.Logger;
import java.util.regex.Matcher;
@ -36,6 +35,7 @@ public class MineOnlineBroadcastPlugin extends JavaPlugin {
ProxyThread proxyThread;
DiscordChatBridge discord;
private MineOnlineConfig mineOnlineConfig;
String serverUUID;
public void launchProxy() throws IOException {
ServerSocket serverSocket = new ServerSocket(0);
@ -74,79 +74,6 @@ public class MineOnlineBroadcastPlugin extends JavaPlugin {
return complete.digest();
}
public static void listServer(
String ip,
String port,
int users,
int maxUsers,
String name,
boolean onlineMode,
String md5,
boolean whitelisted,
String[] playerNames,
String motd,
boolean dontListPlayers,
boolean useBetaEvolutionsAuth
) {
HttpURLConnection connection = null;
try {
URLClassLoader classLoader = new URLClassLoader(new URL[]{MineOnlineBroadcastPlugin.class.getProtectionDomain().getCodeSource().getLocation()});
Class jsonObjectClass = classLoader.loadClass("org.json.JSONObject");
Constructor jsonObjectConstructor = jsonObjectClass.getConstructor();
Method jsonObjectPut = jsonObjectClass.getMethod("put", String.class, Object.class);
Method jsonObjectToString = jsonObjectClass.getMethod("toString");
Object jsonObject = jsonObjectConstructor.newInstance();
if (ip != null)
jsonObjectPut.invoke(jsonObject, "ip", ip);
jsonObjectPut.invoke(jsonObject, "port", port);
if (users > -1 && !dontListPlayers)
jsonObjectPut.invoke(jsonObject, "users", users);
jsonObjectPut.invoke(jsonObject, "max", maxUsers);
jsonObjectPut.invoke(jsonObject, "name", name);
jsonObjectPut.invoke(jsonObject, "onlinemode", onlineMode);
jsonObjectPut.invoke(jsonObject, "md5", md5);
jsonObjectPut.invoke(jsonObject, "whitelisted", whitelisted);
if (!dontListPlayers)
jsonObjectPut.invoke(jsonObject, "players", playerNames);
jsonObjectPut.invoke(jsonObject, "motd", motd);
jsonObjectPut.invoke(jsonObject, "dontListPlayers", dontListPlayers);
jsonObjectPut.invoke(jsonObject, "useBetaEvolutionsAuth", useBetaEvolutionsAuth);
String json = (String) jsonObjectToString.invoke(jsonObject);
URL url = new URL("https://mineonline.codie.gg/api/servers");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8));
connection.getOutputStream().flush();
connection.getOutputStream().close();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null)
connection.disconnect();
}
}
@Override
public void onEnable() {
initialize();
@ -189,7 +116,27 @@ public class MineOnlineBroadcastPlugin extends JavaPlugin {
String[] playerNames = Arrays.stream(getServer().getOnlinePlayers()).map(Player::getName).collect(Collectors.toList()).toArray(new String[users]);
listServer(
String serverIcon = null;
try {
BufferedImage serverIconBufferedImage = ImageIO.read(new File(System.getProperty("user.dir") + File.separator + "server-icon.png"));
if (serverIconBufferedImage.getHeight() <= 64 && serverIconBufferedImage.getWidth() <= 64) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ImageIO.write(serverIconBufferedImage, "png", bos);
byte[] bytes = bos.toByteArray();
Base64.Encoder encoder = Base64.getEncoder();
serverIcon = encoder.encodeToString(bytes);
serverIcon = serverIcon.replace(System.lineSeparator(), "");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IIOException ex) {
ex.printStackTrace();
}
serverUUID = MineOnlineAPI.listServer(
ip,
port,
users,
@ -201,7 +148,8 @@ public class MineOnlineBroadcastPlugin extends JavaPlugin {
playerNames,
motd,
dontListPlayers,
useBetaEvolutionsAuth
useBetaEvolutionsAuth,
serverIcon
);
} catch (IOException ex) {
// ignore.
@ -308,14 +256,16 @@ public class MineOnlineBroadcastPlugin extends JavaPlugin {
this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_CHAT, this.listener, Event.Priority.Highest, this);
}
// private void unregister() {
// if(registeredListener != null)
// etc.getLoader().removeListener(registeredListener);
// }
@Override
public void onDisable() {
//unregister();
if (serverUUID != null) {
try {
MineOnlineAPI.deleteServerListing(serverUUID);
} catch (Exception ex) {
}
}
if (discord != null)
discord.shutdown();
broadcastThread.interrupt();