package com.techcavern.wavetact.consoleCommands.config;
import com.techcavern.wavetact.annot.ConCMD;
import com.techcavern.wavetact.objects.CommandIO;
import com.techcavern.wavetact.objects.ConsoleCommand;
import com.techcavern.wavetact.utils.*;
import org.jooq.Record;
import org.pircbotx.PircBotX;
import java.util.Scanner;
import static com.techcavern.wavetactdb.Tables.NETWORKS;
@ConCMD
public class Network extends ConsoleCommand {
public Network() {
super(GeneralUtils.toArray("network"), "network (+/-)[networkname] (Property) (Value)", "Creates, modifies or removes network configurations");
}
@Override
public void onCommand(String command, String[] args, CommandIO commandIO) throws Exception {
Scanner input = new Scanner(commandIO.getInputStream());
if (args[0].startsWith("+")) {
Record network = DatabaseUtils.getNetwork(args[0].replaceFirst("\\+", ""));
boolean viewonly = false;
if (args.length < 3) {
viewonly = true;
}
boolean isSuccess = false;
if (network != null) {
switch (args[1].toLowerCase()) {
case "channels":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.CHANNELS));
else {
network.setValue(NETWORKS.CHANNELS, GeneralUtils.buildMessage(2, args.length, args));
isSuccess = true;
}
break;
case "server":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.SERVER));
else {
network.setValue(NETWORKS.SERVER, args[2]);
isSuccess = true;
}
break;
case "port":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.PORT));
else {
int port = 6667;
boolean SSL = false;
String portinput = args[2];
if (!portinput.isEmpty()) {
if(portinput.startsWith("+")){
SSL = true;
portinput = portinput.replaceFirst("\\+","");
}
port = Integer.parseInt(portinput);
}
network.setValue(NETWORKS.PORT, port);
network.setValue(NETWORKS.SSL, SSL);
isSuccess = true;
}
break;
case "nick":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.NICK));
else {
network.setValue(NETWORKS.NICK, args[2]);
isSuccess = true;
}
break;
case "netadmins":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.NETWORKADMINS));
else {
network.setValue(NETWORKS.NETWORKADMINS, GeneralUtils.buildMessage(2, args.length, args));
isSuccess = true;
}
break;
case "bindhost":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.BINDHOST));
else {
network.setValue(NETWORKS.BINDHOST, args[2]);
isSuccess = true;
}
break;
case "serverpass":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.SERVERPASS));
else if (args[2].equalsIgnoreCase("null")) {
network.setValue(NETWORKS.SERVERPASS, null);
isSuccess = true;
} else {
network.setValue(NETWORKS.SERVERPASS, args[2]);
isSuccess = true;
}
break;
case "nickservcommand":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.NICKSERVCOMMAND));
else if (args[2].equalsIgnoreCase("null")) {
network.setValue(NETWORKS.NICKSERVCOMMAND, null);
isSuccess = true;
} else {
network.setValue(NETWORKS.NICKSERVCOMMAND, GeneralUtils.buildMessage(2, args.length, args));
isSuccess = true;
}
break;
case "nickservnick":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.NICKSERVNICK));
else {
network.setValue(NETWORKS.NICKSERVNICK, args[2]);
isSuccess = true;
}
break;
case "netadminaccess":
if (viewonly)
commandIO.getPrintStream().println(network.getValue(NETWORKS.NETWORKADMINACCESS));
else {
network.setValue(NETWORKS.NETWORKADMINACCESS, Boolean.valueOf(args[2]));
isSuccess = true;
}
break;
default:
commandIO.getPrintStream().println("Failed to parse property");
}
if (isSuccess) {
DatabaseUtils.updateNetwork(network);
commandIO.getPrintStream().println("Property Modified");
}
} else {
commandIO.getPrintStream().println("Network does not exist");
}
} else if (args[0].startsWith("-")) {
DatabaseUtils.removeNetwork(args[0].replaceFirst("\\-", ""));
DatabaseUtils.removeChannelUserPropertyByNetwork(args[0].replaceFirst("\\-", ""));
DatabaseUtils.removeNetworkUserPropertyByNetwork(args[0].replaceFirst("\\-", ""));
PircBotX network = IRCUtils.getNetworkByNetworkName(args[0].replaceFirst("\\-", ""));
Registry.networks.inverse().remove(network);
Registry.messageQueue.remove(network);
Registry.authedUsers.remove(network);
Registry.whoisEventCache.remove(network);
Registry.lastWhois.remove(network);
Registry.lastLeftChannel.remove(network);
network.stopBotReconnect();
network.sendIRC().quitServer();
commandIO.getPrintStream().println("network removed");
} else {
if (DatabaseUtils.getNetwork(args[0]) != null) {
commandIO.getPrintStream().println("network already exists");
return;
}
commandIO.getPrintStream().println("Adding " + args[0]);
String name = args[0];
commandIO.getPrintStream().print("Server host: ");
String server = input.nextLine();
commandIO.getPrintStream().print("Server port (Press enter to use default, insert + beforehand for SSL): ");
int port = 6667;
boolean SSL = false;
String portinput = input.nextLine();
if (!portinput.isEmpty()) {
if(portinput.startsWith("+")){
SSL = true;
portinput = portinput.replaceFirst("\\+","");
}
port = Integer.parseInt(portinput);
}
commandIO.getPrintStream().print("Server nick: ");
String nick = input.nextLine();
commandIO.getPrintStream().print("Channels (#chan1, #chan2, etc): ");
String channels = input.nextLine();
commandIO.getPrintStream().print("Server Pass (Press enter to ignore): ");
String serverpass = null;
String serverpassinput = input.nextLine();
if (!serverpassinput.isEmpty())
serverpass = serverpassinput;
commandIO.getPrintStream().print("NickServ Nick (Press enter to use default - NickServ): ");
String nickservnick = null;
String nickservnickinput = input.nextLine();
if (!nickservnickinput.isEmpty())
nickservnick = nickservnickinput;
commandIO.getPrintStream().print("NickServ Command (eg. IDENTIFY PASSWORD1234, Press enter to ignore): ");
String nickservcommand = null;
String nickservcommandinput = input.nextLine();
if (!nickservcommandinput.isEmpty())
nickservcommand = nickservcommandinput;
commandIO.getPrintStream().print("Bindhost (Press enter to use default): ");
String bindhost = null;
String bindhostinput = input.nextLine();
if (!bindhostinput.isEmpty())
bindhost = bindhostinput;
commandIO.getPrintStream().print("AuthType (nickserv/account/hostmask): ");
String authtype = input.nextLine();
commandIO.getPrintStream().print("Auto Allow Network Operators NetAdmin Level Access? (True/False): ");
boolean netadminaccess = Boolean.valueOf(input.nextLine());
commandIO.getPrintStream().print("Network Admins: (account1, account2, etc) (Press enter to ignore): ");
String netadmins = "";
String netadminsinput = input.nextLine();
if (!netadminsinput.isEmpty())
netadmins = netadminsinput;
DatabaseUtils.addNetwork(name, port, server, nick, channels, bindhost, netadminaccess, netadmins, authtype, nickservcommand, serverpass, nickservnick, SSL);
PircBotX network = ConfigUtils.createNetwork(serverpass, nick, server, port, bindhost, name, SSL);
Registry.networks.put(name, network);
LoadUtils.addMessageQueue(network);
Registry.WaveTact.addNetwork(network);
}
}
}