// Copyright (c) 2015 Christopher "BlayTheNinth" Baker
package net.blay09.mods.eirairc.irc;
import net.blay09.mods.eirairc.api.bot.IBotCommand;
import net.blay09.mods.eirairc.api.bot.IRCBot;
import net.blay09.mods.eirairc.api.config.IConfigManager;
import net.blay09.mods.eirairc.api.irc.IRCChannel;
import net.blay09.mods.eirairc.api.irc.IRCUser;
import net.blay09.mods.eirairc.api.irc.TwitchUser;
import net.blay09.mods.eirairc.bot.IRCBotImpl;
import net.blay09.mods.eirairc.util.ConfigHelper;
import net.blay09.mods.eirairc.util.I19n;
import net.minecraft.util.EnumChatFormatting;
import java.util.*;
public class IRCUserImpl implements IRCUser, TwitchUser {
private static class QueuedAuthCommand {
public final IRCBot bot;
public final IRCChannel channel;
public final IBotCommand command;
public final String[] args;
public QueuedAuthCommand(IRCBot bot, IRCChannel channel, IBotCommand command, String[] args) {
this.bot = bot;
this.channel = channel;
this.command = command;
this.args = args;
}
}
private final IRCConnectionImpl connection;
private final Map<String, IRCChannel> channels = new HashMap<>();
private final Map<String, IRCChannelUserMode> channelModes = new HashMap<>();
private final List<QueuedAuthCommand> authCommandQueue = new ArrayList<>();
private String name;
private String ident;
private String hostname;
private String accountName;
private EnumChatFormatting nameColor;
private boolean isTwitchSubscriber;
private boolean isTwitchTurbo;
private String displayName;
public IRCUserImpl(IRCConnectionImpl connection, String name) {
this.connection = connection;
this.name = name;
}
public void setUsername(String ident) {
this.ident = ident;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public ContextType getContextType() {
return ContextType.IRCUser;
}
@Override
public boolean isOperator(IRCChannel channel) {
IRCChannelUserMode mode = channelModes.get(channel.getName().toLowerCase());
return mode != null && mode != IRCChannelUserMode.VOICE;
}
@Override
public boolean hasVoice(IRCChannel channel) {
IRCChannelUserMode mode = channelModes.get(channel.getName().toLowerCase());
return mode == IRCChannelUserMode.VOICE;
}
@Override
public String getChannelModePrefix(IRCChannel channel) {
IRCChannelUserMode mode = channelModes.get(channel.getName().toLowerCase());
if(mode != null) {
int idx = channel.getConnection().getChannelUserModes().indexOf(mode.modeChar);
if(idx != -1) {
return String.valueOf(channel.getConnection().getChannelUserModePrefixes().charAt(idx));
}
return "";
}
return "";
}
public void setChannelUserMode(IRCChannel channel, IRCChannelUserMode mode) {
if(mode == null) {
channelModes.remove(channel.getName().toLowerCase());
} else {
channelModes.put(channel.getName().toLowerCase(), mode);
}
}
public IRCChannelUserMode getChannelUserMode(IRCChannel channel) {
return channelModes.get(channel.getName().toLowerCase());
}
public void addChannel(IRCChannelImpl channel) {
channels.put(channel.getName(), channel);
}
public void removeChannel(IRCChannelImpl channel) {
channels.remove(channel.getName());
}
@Override
public Collection<IRCChannel> getChannels() {
return channels.values();
}
@Override
public String getIdentifier() {
return connection.getIdentifier() + "/" + name;
}
public IRCConnectionImpl getConnection() {
return connection;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
if(accountName == null || accountName.isEmpty()) {
notice(I19n.format("eirairc:bot.notAuthed"));
} else {
for (QueuedAuthCommand cmd : authCommandQueue) {
if (ConfigHelper.getBotSettings(cmd.channel).interOpAuthList.get().containsString(accountName, false)) {
cmd.command.processCommand(cmd.bot, cmd.channel, this, cmd.args, cmd.command);
} else {
notice(I19n.format("eirairc:bot.noPermission"));
}
}
}
authCommandQueue.clear();
}
@Override
public String getAccountName() {
if(connection.isTwitch()) {
return name;
}
return accountName;
}
@Override
public void notice(String message) {
connection.notice(name, message);
}
@Override
public void message(String message) {
connection.message(name, message);
}
@Override
public void ctcpMessage(String message) {
message(IRCConnectionImpl.CTCP_START + message + IRCConnectionImpl.CTCP_END);
}
@Override
public void ctcpNotice(String message) {
notice(IRCConnectionImpl.CTCP_START + message + IRCConnectionImpl.CTCP_END);
}
@Override
public IConfigManager getGeneralSettings() {
return ConfigHelper.getGeneralSettings(this).manager;
}
@Override
public IConfigManager getBotSettings() {
return ConfigHelper.getBotSettings(this).manager;
}
@Override
public IConfigManager getThemeSettings() {
return ConfigHelper.getTheme(this).manager;
}
public void queueAuthCommand(IRCBotImpl bot, IRCChannel channel, IBotCommand botCommand, String[] args) {
if(accountName == null) {
connection.whois(name);
authCommandQueue.add(new QueuedAuthCommand(bot, channel, botCommand, args));
} else {
if(ConfigHelper.getBotSettings(channel).interOpAuthList.get().containsString(accountName, false)) {
botCommand.processCommand(bot, channel, this, args, botCommand);
} else {
notice(I19n.format("eirairc:bot.noPermission"));
}
}
}
@Override
public boolean isTwitchSubscriber(IRCChannel channel) {
return isTwitchSubscriber;
}
public void setTwitchSubscriber(boolean isSubscriber) {
this.isTwitchSubscriber = isSubscriber;
}
@Override
public boolean isTwitchTurbo() {
return isTwitchTurbo;
}
public void setTwitchTurbo(boolean twitchTurbo) {
this.isTwitchTurbo = twitchTurbo;
}
public void setNameColor(EnumChatFormatting nameColor) {
this.nameColor = nameColor;
}
public EnumChatFormatting getNameColor() {
return nameColor;
}
@Override
public String getUsername() {
return ident;
}
@Override
public String getHostname() {
return hostname;
}
public String getDisplayName() {
return displayName != null ? displayName : getName();
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
@Override
public TwitchUser getTwitchUser() {
return connection.isTwitch() ? this : null;
}
}