package org.pokenet.chat.server;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import org.pokenet.chat.server.User.Language;
/**
* Represents a chat room
* @author shadowkanji
*
*/
public class ChatRoom implements Runnable {
private int m_level;
private String m_team;
private HashMap<String, User> m_users;
private Queue<String> m_messageQueue;
private String m_name;
private int m_id;
private Language m_language;
/**
* Constructor
* @param name
* @param id
* @param level
* @param l
*/
public ChatRoom(String name, int id, int level, Language l) {
m_name = name;
m_id = id;
m_level = level;
m_users = new HashMap<String, User>();
m_messageQueue = new LinkedList<String>();
m_language = l;
}
@Override
public void run() {
String message = null;
while(true) {
synchronized(m_messageQueue) {
message = m_messageQueue.poll();
}
if(message != null) {
//Send to everyone in room
synchronized(m_users) {
Iterator<User> it = m_users.values().iterator();
while(it.hasNext()) {
User u = it.next();
if(u != null) {
u.getSession().write("c" + m_id + "," + message);
}
}
}
}
try {
Thread.sleep(250);
} catch (Exception e) {}
/* If nobody is in the room, end the room if it is not a reserved room */
if(m_users.size() == 0) {
if(m_id >= 12) {
ChatProtocolHandler.removeChatRoom(m_id);
}
return;
}
}
}
/**
* Queues a message to be sent to the entire chatroom
* @param u
* @param message
*/
public void queueMessage(User u, String message) {
if(m_users.containsKey(u.getUsername())) {
synchronized(m_messageQueue) {
m_messageQueue.offer("<" + u.getUsername() + "> " + message);
}
}
}
/**
* Returns true if a user can join this chatroom
* @param u
* @return
*/
public boolean isJoinable(User u) {
//Make sure they're of same language
if(m_language != Language.NONE &&
u.getLanguage() != m_language)
return false;
if(u.getLevel() >= m_level) {
//If it's a team chatroom, only allow them if they're on team
if(m_team != null) {
if(u.getTeam().equalsIgnoreCase(m_team)) {
return true;
}
} else {
//Else, they can join
return true;
}
}
return false;
}
/**
* Adds a user to a chatroom. Returns false if they do
* not have appropriate permissions to join.
* @param u
*/
public boolean addUser(User u) {
if(isJoinable(u)) {
synchronized(m_users) {
m_users.put(u.getUsername(), u);
}
u.getSession().write("j" + m_id + "," + m_name);
return true;
}
return false;
}
/**
* Removes a user from the chatroom
* @param username
*/
public boolean removeUser(String username) {
boolean found = false;
synchronized(m_users) {
User u = m_users.remove(username);
if(u != null) {
u.getSession().write("lr" + m_id);
found = true;
}
}
return found;
}
/**
* Returns the id of the chatroom
* @return
*/
public int getId() {
return m_id;
}
/**
* Returns the name of the chatroom
* @return
*/
public String getName() {
return m_name;
}
}