package com.techcavern.wavetact.utils;
import org.apache.commons.lang3.StringUtils;
import org.pircbotx.Channel;
import org.pircbotx.PircBotX;
import org.pircbotx.User;
import org.pircbotx.hooks.events.WhoisEvent;
import static com.techcavern.wavetactdb.Tables.*;
public class PermUtils {
public static String getAccount(PircBotX network, String userObject, String hostmask) { //gets account of user using hostmask
String authtype = DatabaseUtils.getNetwork(IRCUtils.getNetworkNameByNetwork(network)).getValue(NETWORKS.AUTHTYPE);
switch (authtype) {
case "nickserv":
return getNickServAccountName(network, userObject, hostmask);
case "account":
return getAuthedUser(network, hostmask);
default:
return hostmask;
}
}
public static String authUser(PircBotX network, String userObject) { //gets hostmask of userObject and calls getAccount using it
String hostmask = IRCUtils.getHostmask(network, userObject, false);
if (hostmask != null) {
return getAccount(network, userObject, hostmask);
} else {
return null;
}
}
public static String getNickServAccountName(PircBotX network, String userObject, String hostmask) { //calls getAccoutName() IF its not already found in get AuthedUser
String userString = getAuthedUser(network, hostmask);
if (userString == null) {
userString = getAccountName(network, userObject);
if (userString != null)
Registry.authedUsers.get(network).put(hostmask, userString);
}
return userString;
}
public static String getAuthedUser(PircBotX network, String hostmask) { //gets Authenticated Account Name found in the Authed User db.
String userString = Registry.authedUsers.get(network).get(hostmask);
if (hostmask == null) {
return null;
} else {
return userString;
}
}
@SuppressWarnings("unchecked")
public static String getAccountName(PircBotX network, String userObject) { //gets the actual NickServ ACcount Name
WhoisEvent whois = IRCUtils.WhoisEvent(network, userObject, true);
String userString;
if (whois != null) {
userString = whois.getRegisteredAs();
if (userString != null) {
userString = userString.toLowerCase();
if (userString.isEmpty()) {
userString = userObject.toLowerCase();
}
} else {
userString = null;
}
} else {
userString = null;
}
return userString;
}
private static int getAutomaticPermLevel(User userObject, Channel channelObject) { //gets the Auto Detected Perm Level
if (userObject.isIrcop() && DatabaseUtils.getNetwork(IRCUtils.getNetworkNameByNetwork(userObject.getBot())).getValue(NETWORKS.NETWORKADMINACCESS)) {
return 20;
} else if (channelObject.isOwner(userObject)) {
return 15;
} else if (channelObject.isSuperOp(userObject)) {
return 13;
} else if (channelObject.isOp(userObject)) {
return 10;
} else if (channelObject.isHalfOp(userObject)) {
return 7;
} else if (channelObject.hasVoice(userObject)) {
return 5;
} else {
return 0;
}
}
private static int getManualPermLevel(String userObject, PircBotX network, Channel channelObject, String account) { //gets Manual Perm Level using the account name
if (isIgnored(IRCUtils.getHostmask(network, userObject, false), IRCUtils.getNetworkNameByNetwork(network))) {
return -2;
} else if (account != null && (channelObject == null || (channelObject != null && IRCUtils.getUserByNick(network,userObject).getChannels().contains(channelObject)))) {
String channelName = null;
if (channelObject != null) {
channelName = channelObject.getName();
}
if (isNetworkAdmin(account, IRCUtils.getNetworkNameByNetwork(network))) {
return 20;
} else if (DatabaseUtils.getChannelUserProperty(IRCUtils.getNetworkNameByNetwork(network), channelName, account, "permlevel") != null) {
int permlevel = 0;
try {
permlevel = Integer.parseInt(DatabaseUtils.getChannelUserProperty(IRCUtils.getNetworkNameByNetwork(network), channelName, account, "permlevel").getValue(CHANNELUSERPROPERTY.VALUE));
} catch (Exception e) {
}
if (permlevel > 18) {
permlevel = 18;
}
return permlevel;
} else if (DatabaseUtils.getNetworkUserProperty(IRCUtils.getNetworkNameByNetwork(network), account, "permlevel") != null) {
int permlevel = 0;
try {
permlevel = Integer.parseInt(DatabaseUtils.getNetworkUserProperty(IRCUtils.getNetworkNameByNetwork(network), account, "permlevel").getValue(NETWORKUSERPROPERTY.VALUE));
} catch (Exception e) {
}
if (permlevel > 18) {
permlevel = 18;
}
return permlevel;
} else {
return 1;
}
} else {
return 0;
}
}
public static int getPermLevel(PircBotX network, String userObject, Channel channelObject) { //gets the permlevel of the user in question
String auth = PermUtils.authUser(network, userObject);
return getLevel(network, userObject, channelObject, auth);
}
public static int getLevel(PircBotX network, String userObject, Channel channelObject, String account) { //gets the actual Perm Level
if (channelObject != null) {
int mpermlevel = getManualPermLevel(userObject, network, channelObject, account);
User user = IRCUtils.getUserByNick(network, userObject);
int apermlevel = 0;
if (user != null) {
apermlevel = getAutomaticPermLevel(user, channelObject);
}
if (mpermlevel < 0) {
return mpermlevel;
} else if (apermlevel < mpermlevel) {
return mpermlevel;
} else {
return apermlevel;
}
} else {
return getManualPermLevel(userObject, network, channelObject, account);
}
}
public static boolean isAccountEnabled(PircBotX network) { //checks if account authentication is enabled
return DatabaseUtils.getNetwork(IRCUtils.getNetworkNameByNetwork(network)).getValue(NETWORKS.AUTHTYPE).equalsIgnoreCase("account");
}
public static boolean isNetworkAdmin(String account, String network) {
for (String c : StringUtils.split(DatabaseUtils.getNetwork(network).getValue(NETWORKS.NETWORKADMINS), ", ")) {
if (c.equalsIgnoreCase(account))
return true;
}
return false;
}
public static boolean isIgnored(String hostmask, String network) {
if (DatabaseUtils.getNetworkProperty(network, "ignoredhosts") == null) {
return false;
} else
for (String c : StringUtils.split(DatabaseUtils.getNetworkProperty(network, "ignoredhosts").getValue(NETWORKPROPERTY.VALUE), ",")) {
if (c.equalsIgnoreCase(hostmask))
return true;
}
return false;
}
}