package com.fiteclub.android.smack;
import java.util.Random;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smackx.muc.MultiUserChat;
public class XmppManager {
private static XmppManager manager;
private XMPPConnection connection;
private String xmppServer;
private String xmppServiceName;
private int port;
private int timeout;
private String loginName;
private String password;
private String matchRoomName;
private String userName;
private String fullMatchUserName;
private String planRoomName;
private MultiUserChat mucMatch;
private XmppManager()
{
}
public static XmppManager getManager()
{
if (manager == null)
manager = new XmppManager();
return manager;
}
public boolean checkConnection()
{
if ((connection == null) || (!connection.isConnected()))
{
initConnectionInfo();
connection = SmackUtil.getConnection(connection, xmppServer, port, xmppServiceName, timeout);
}
if ((connection == null) || (!connection.isConnected()))
{
disconnect();
return false;
}
return true;
}
private void disconnect()
{
if ((connection != null) && (connection.isConnected()))
{
connection.disconnect();
}
connection = null;
}
private void initConnectionInfo()
{
xmppServer = "xmpp.fiteclub.net";
port = 5222;
xmppServiceName = xmppServer;
timeout = 15;
int rnd = new Random(System.currentTimeMillis()).nextInt(1000);
loginName = "fiteclub.player." + rnd;
password = "fite2009";
matchRoomName = "fyteclub.room@conference.xmpp.fiteclub.net"; //should be all lowercase
userName = "player." + rnd;
fullMatchUserName = matchRoomName + '/' + userName;
planRoomName = "fyteclub.game." + rnd + "@conference.xmpp.fiteclub.net";
}
public boolean checkLogin()
{
if ((connection == null) || (!connection.isConnected()))
return false;
if (!connection.isAuthenticated())
SmackUtil.doLogin(connection, loginName, password);
if (!connection.isAuthenticated())
{
disconnect();
return false;
}
return true;
}
public boolean checkMatchRoom()
{
if ((connection == null) || (!connection.isAuthenticated()))
return false;
if ((mucMatch == null) || (!mucMatch.isJoined()))
mucMatch = SmackUtil.joinChatRoom(connection, matchRoomName, userName);
if ((mucMatch == null) || (!mucMatch.isJoined()))
{
disconnect();
return false;
}
return true;
}
public void clear()
{
leaveMatchRoom();
disconnect();
}
public void leaveMatchRoom()
{
if ((mucMatch != null) && (mucMatch.isJoined()))
{
mucMatch.leave();
}
mucMatch = null;
}
public String getNextMatchMessage()
{
if ((mucMatch == null) || (!mucMatch.isJoined()))
return null;
while (true)
{
Message message = mucMatch.nextMessage(300);
if (message == null)
return null;
if (message.getFrom().equals(fullMatchUserName))
continue;
return message.getBody();
}
}
public void sendMatchMessage(String sendJsonText)
{
if ((mucMatch != null) && (mucMatch.isJoined()))
SmackUtil.sendMessage(mucMatch, sendJsonText);
}
public String getUserName()
{
return userName;
}
public String getPlanRoomName()
{
return planRoomName;
}
public MultiUserChat joinGameRoom(String roomName, String userName)
{
if ((connection == null) || (!connection.isAuthenticated()))
return null;
return SmackUtil.joinChatRoom(connection, roomName, userName);
}
public MultiUserChat openGameRoom(String roomName, final MessageListener listener)
{
if (!checkConnection())
return null;
if (!checkLogin())
return null;
MultiUserChat muc = SmackUtil.joinChatRoom(connection, roomName, userName);
final String fullName = roomName + '/' + userName;
muc.addMessageListener(new PacketListener() {
public void processPacket(Packet packet)
{
if (fullName.equals(packet.getFrom()))
return;
if (packet instanceof Message)
{
String message = ((Message)packet).getBody();
listener.processMessage(message);
}
}
});
return muc;
}
}