// Copyright (c) 2015, Christopher "BlayTheNinth" Baker
package net.blay09.mods.eirairc.util;
import net.blay09.mods.eirairc.ConnectionManager;
import net.blay09.mods.eirairc.EiraIRC;
import net.blay09.mods.eirairc.api.EiraIRCAPI;
import net.blay09.mods.eirairc.api.irc.IRCChannel;
import net.blay09.mods.eirairc.api.irc.IRCConnection;
import net.blay09.mods.eirairc.api.irc.IRCContext;
import net.blay09.mods.eirairc.api.irc.IRCUser;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.Util;
import org.apache.commons.lang3.ArrayUtils;
import org.lwjgl.Sys;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Utils {
public static void sendLocalizedMessage(ICommandSender sender, String key, Object... args) {
if (EiraIRCAPI.hasClientSideInstalled(sender)) {
sender.addChatMessage(new ChatComponentTranslation("eirairc:" + key, args));
} else {
sender.addChatMessage(new ChatComponentText(new ChatComponentTranslation("eirairc:" + key, args).getUnformattedText()));
}
}
public static void addMessageToChat(IChatComponent chatComponent) {
if (MinecraftServer.getServer() != null && MinecraftServer.getServer().getConfigurationManager() != null && !MinecraftServer.getServer().isSinglePlayer()) {
MinecraftServer.getServer().getConfigurationManager().sendChatMsg(translateToDefault(chatComponent));
} else {
if (Minecraft.getMinecraft().thePlayer != null) {
Minecraft.getMinecraft().thePlayer.addChatMessage(chatComponent);
}
}
}
public static String unquote(String s) {
return s.startsWith("\"") ? s.substring(1, s.length() - 1) : s;
}
public static String quote(String s) {
return "\"" + s + "\"";
}
public static String getNickIRC(EntityPlayer player, IRCContext context) {
return MessageFormat.formatNick(player.getDisplayNameString(), context, MessageFormat.Target.IRC, MessageFormat.Mode.Message);
}
public static String getNickGame(EntityPlayer player) {
return player.getDisplayNameString();
}
public static String getServerAddress() {
ServerData serverData = Minecraft.getMinecraft().getCurrentServerData();
if (serverData != null) {
return serverData.serverIP;
}
return null;
}
public static boolean isOP(ICommandSender sender) {
return MinecraftServer.getServer() == null || (MinecraftServer.getServer().isSinglePlayer() && !MinecraftServer.getServer().isDedicatedServer()) || sender.canCommandSenderUseCommand(3, "");
}
public static void addConnectionsToList(List<String> list) {
for (IRCConnection connection : ConnectionManager.getConnections()) {
list.add(connection.getHost());
}
}
public static void sendUserList(ICommandSender player, IRCConnection connection, IRCChannel channel) {
Collection<IRCUser> userList = channel.getUserList();
if (userList.size() == 0) {
ChatComponentBuilder.create().lang("eirairc:commands.who.noUsersOnline", connection.getHost(), channel.getName()).send(player);
return;
}
ChatComponentBuilder ccb = new ChatComponentBuilder();
ccb.lang("eirairc:commands.who.usersOnline", ccb.push().text("[" + connection.getHost() + "] ").color('b').text(userList.size()).pop(), ccb.color('e').text(channel.getName()).color('f').text(":").pop()).send(player);
String s = " * ";
for (IRCUser user : userList) {
if (s.length() + user.getName().length() > Globals.CHAT_MAX_LENGTH) {
if (player == null) {
addMessageToChat(new ChatComponentText(s));
} else {
player.addChatMessage(new ChatComponentText(s));
}
s = " * ";
}
if (s.length() > 3) {
s += ", ";
}
s += user.getName();
}
if (s.length() > 3) {
if (player == null) {
addMessageToChat(new ChatComponentText(s));
} else {
player.addChatMessage(new ChatComponentText(s));
}
}
}
public static void sendPlayerList(IRCContext context) {
if (MinecraftServer.getServer() == null || MinecraftServer.getServer().isSinglePlayer()) {
return;
}
List<EntityPlayerMP> playerList = MinecraftServer.getServer().getConfigurationManager().playerEntityList;
if (playerList.size() == 0) {
if (context instanceof IRCUser) {
context.notice(I19n.format("eirairc:bot.noPlayersOnline"));
} else if (context instanceof IRCChannel) {
context.message(I19n.format("eirairc:bot.noPlayersOnline"));
}
return;
}
if (context instanceof IRCUser) {
context.notice(I19n.format("eirairc:bot.playersOnline", playerList.size()));
} else if (context instanceof IRCChannel) {
context.message(I19n.format("eirairc:bot.playersOnline", playerList.size()));
}
String s = " * ";
for (EntityPlayer entityPlayer : playerList) {
String alias = getNickIRC(entityPlayer, null);
if (s.length() + alias.length() > Globals.CHAT_MAX_LENGTH) {
if (context instanceof IRCUser) {
context.notice(s);
} else if (context instanceof IRCChannel) {
context.message(s);
}
s = " * ";
}
if (s.length() > 3) {
s += ", ";
}
s += alias;
}
if (s.length() > 3) {
if (context instanceof IRCUser) {
context.notice(s);
} else if (context instanceof IRCChannel) {
context.message(s);
}
}
}
public static IRCContext getSuggestedTarget() {
IRCContext result = EiraIRC.instance.getChatSessionHandler().getChatTarget();
if (result == null) {
IRCConnection connection = ConnectionManager.getDefaultConnection();
if (connection != null) {
if (connection.getChannels().size() == 1) {
return connection.getChannels().iterator().next();
}
return null;
}
return null;
}
return result;
}
public static String getUsername() {
String username = EiraIRC.proxy.getUsername();
if (username == null) {
return "EiraBot" + Math.round(Math.random() * 10000);
}
return username;
}
public static void openDirectory(File dir) {
if (Util.getOSType() == Util.EnumOS.OSX) {
try {
Runtime.getRuntime().exec(new String[]{"/usr/bin/open", dir.getAbsolutePath()});
return;
} catch (IOException ignored) {
}
} else if (Util.getOSType() == Util.EnumOS.WINDOWS) {
try {
Runtime.getRuntime().exec(String.format("cmd.exe /C start \"Open file\" \"%s\"", dir.getAbsolutePath()));
return;
} catch (IOException ignored) {
}
}
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
desktop.browse(dir.toURI());
return;
} catch (Exception ignored) {
}
}
Sys.openURL("file://" + dir.getAbsolutePath());
}
public static void openWebpage(String url) {
try {
openWebpage(new URL(url).toURI());
} catch (URISyntaxException | MalformedURLException e) {
e.printStackTrace();
}
}
public static void openWebpage(URL url) {
try {
openWebpage(url.toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
public static void openWebpage(URI uri) {
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
desktop.browse(uri);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void setClipboardString(String s) {
StringSelection selection = new StringSelection(s);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
try {
clipboard.setContents(selection, selection);
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
public static String getCurrentServerName() {
if (MinecraftServer.getServer() != null) {
if (MinecraftServer.getServer().isSinglePlayer()) {
return "Singleplayer";
} else {
return MinecraftServer.getServer().getServerHostname();
}
} else {
return "Multiplayer";
}
}
public static boolean isServerSide() {
return MinecraftServer.getServer() != null && MinecraftServer.getServer().isDedicatedServer();
}
public static String extractHost(String url) {
int colonIdx = url.indexOf(':');
int lastColonIdx = url.lastIndexOf(':');
boolean isIPV6 = colonIdx != lastColonIdx;
if (isIPV6) {
int endIdx = url.lastIndexOf(']');
if (endIdx != -1) {
return url.substring(0, endIdx);
} else {
return url;
}
} else {
if (lastColonIdx != -1) {
return url.substring(0, lastColonIdx);
} else {
return url;
}
}
}
public static int[] extractPorts(String url, int defaultPort) {
int colonIdx = url.indexOf(':');
int lastColonIdx = url.indexOf(':');
boolean isIPV6 = colonIdx != lastColonIdx;
int portIdx = lastColonIdx;
if (isIPV6) {
int endIdx = url.lastIndexOf(']');
if (endIdx == -1) {
portIdx = -1;
}
}
if (portIdx != -1) {
try {
String[] portRanges = url.substring(portIdx + 1).split("\\+");
List<Integer> portList = new ArrayList<>();
for (int i = 0; i < portRanges.length; i++) {
int sepIdx = portRanges[i].indexOf('-');
if (sepIdx != -1) {
int min = Integer.parseInt(portRanges[i].substring(0, sepIdx));
int max = Integer.parseInt(portRanges[i].substring(sepIdx + 1));
if (min > max) {
int oldMin = min;
min = max;
max = oldMin;
}
if (max - min > 5) {
throw new RuntimeException("EiraIRC: Port ranges bigger than 5 are not allowed! Split them up if you really have to.");
}
for (int j = min; j <= max; j++) {
portList.add(j);
}
} else {
portList.add(Integer.parseInt(portRanges[i]));
}
}
return ArrayUtils.toPrimitive(portList.toArray(new Integer[portList.size()]));
} catch (NumberFormatException e) {
return new int[]{defaultPort};
}
}
return new int[]{defaultPort};
}
@Deprecated
public static String getModpackId() {
return "";
}
@Deprecated
public static IChatComponent translateToDefault(IChatComponent component) {
if (component instanceof ChatComponentText) {
return translateChildrenToDefault((ChatComponentText) component);
} else if (component instanceof ChatComponentTranslation) {
return translateComponentToDefault((ChatComponentTranslation) component);
}
return null;
}
@Deprecated
private static IChatComponent translateChildrenToDefault(ChatComponentText chatComponent) {
ChatComponentText copyComponent = new ChatComponentText(chatComponent.getChatComponentText_TextValue());
copyComponent.setChatStyle(chatComponent.getChatStyle());
for (Object object : chatComponent.getSiblings()) {
IChatComponent adjustedComponent = translateToDefault((IChatComponent) object);
if (adjustedComponent != null) {
copyComponent.appendSibling(adjustedComponent);
}
}
return copyComponent;
}
@Deprecated
public static IChatComponent translateComponentToDefault(ChatComponentTranslation chatComponent) {
Object[] formatArgs = chatComponent.getFormatArgs();
Object[] copyFormatArgs = new Object[formatArgs.length];
for (int i = 0; i < formatArgs.length; i++) {
if (formatArgs[i] instanceof IChatComponent) {
copyFormatArgs[i] = translateToDefault((IChatComponent) formatArgs[i]);
} else {
ChatComponentText textComponent = new ChatComponentText(formatArgs[i] == null ? "null" : formatArgs[i].toString());
textComponent.getChatStyle().setParentStyle(chatComponent.getChatStyle());
copyFormatArgs[i] = textComponent;
}
}
ChatComponentText translateComponent = new ChatComponentText(I19n.format(chatComponent.getKey(), copyFormatArgs));
translateComponent.setChatStyle(chatComponent.getChatStyle());
for (Object object : chatComponent.getSiblings()) {
IChatComponent adjustedComponent = translateToDefault((IChatComponent) object);
if (adjustedComponent != null) {
translateComponent.appendSibling(adjustedComponent);
}
}
return translateComponent;
}
}