package lib.pircbot;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Created by Nick on 12/22/13.
*/
public class ChannelManager {
private CopyOnWriteArraySet<Channel> channels = new CopyOnWriteArraySet<>();
private CopyOnWriteArraySet<User> users = new CopyOnWriteArraySet<>();
/**
* Creates a blank ChannelManager.
*/
public ChannelManager() {
}
/**
* Adds a channel object to the Channels HashMap.
*
* @param toAdd The channel to add.
*/
public void addChannel(Channel toAdd) {
channels.add(toAdd);
}
/**
* Removes a channel of a given name from the channels HashMap.
*
* @param name The name of the channel.
*/
public void removeChannel(String name) {
removeChannel(getChannel(name));
}
/**
* Removes the channel from the channels HashSet.
*
* @param channel The channel object to remove.
*/
public void removeChannel(Channel channel) {
if (channel != null) {
channel.clear();
channels.remove(channel);
}
}
/**
* Gets the specified channel if it exists. The channel will not be created
* if the channel does not exist.
*
* @param name The name of the channel.
* @return The channel object if it exists, else null.
*/
public Channel getChannel(String name) {
if (name == null || "".equals(name)) return null;
if (!name.startsWith("#")) name = "#" + name;
for (Channel c : channels) {
if (c.getName().equalsIgnoreCase(name)) {
return c;
}
}
return null;
}
/**
* Gets a user by name, and creates the user if non-existent.
*
* @param name The name of the user.
* @param create If true, create the user and add to the user list, else return null.
* @return The user that either exists, was created if create is true, or null.
*/
public User getUser(String name, boolean create) {
for (User u : users) {
if (u.getNick().equalsIgnoreCase(name)) {
return u;
}
}
if (create) {
User u = new User(name);
addUser(u);
return u;
} else {
return null;
}
}
/**
* If a confirmed subscriber is found, this method handles finding and setting that user to true.
*
* @param channel The channel the user is in.
* @param user The name of the user.
*/
public void handleSubscriber(String channel, String user) {
Channel c = getChannel(channel);
if (c != null) c.addSubscriber(user);
}
/**
* Adds a user to the global user list.
*
* @param user The user to add.
*/
public void addUser(User user) {
users.add(user);
}
/**
* Removes a user from the global user list.
*
* @param u The user to remove.
*/
public void removeUser(User u) {
users.remove(u);
}
/**
* Returns a list of users currently in the global user list.
*
* @return an array of users.
*/
public User[] getUsers() {
return users.stream().sorted().toArray(User[]::new);
}
public User[] getUsers(String subWord) {
return users.stream().sorted().filter(s -> s.getLowerNick().startsWith(subWord)).toArray(User[]::new);
}
/**
* Gets all of the names of the channels we are currently in.
*
* @return The names of the channels we are in.
*/
public String[] getChannelNames() {
ArrayList<String> names = new ArrayList<>();
channels.forEach(c -> names.add(c.getName()));
return names.toArray(new String[names.size()]);
}
/**
* Disposes of the channel manager by clearing the channel objects.
*/
public void dispose() {
channels.clear();
users.clear();
}
}