diff --git a/src/main/java/chat/ChatApiClient.java b/src/main/java/chat/ChatApiClient.java new file mode 100644 index 0000000..b62a355 --- /dev/null +++ b/src/main/java/chat/ChatApiClient.java @@ -0,0 +1,50 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericMessage; +import chat.util.ChatUnicodeString; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; + +public class ChatApiClient { + + private Channel channel; + private ChatUnicodeString address; + + public ChatApiClient(Channel channel) { + this.channel = channel; + } + + public Channel getChannel() { + return channel; + } + + public void setChannel(Channel channel) { + this.channel = channel; + } + + public void send(ByteBuffer byteBuffer) { + ByteBuf buf = GenericMessage.alloc.buffer(byteBuffer.capacity()).order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.flip(); + buf.writeBytes(byteBuffer); + channel.writeAndFlush(buf); + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public int getNodeId() { + if(address != null) + return address.getString().hashCode(); + else + return 0; + } + +} diff --git a/src/main/java/chat/ChatApiServer.java b/src/main/java/chat/ChatApiServer.java new file mode 100644 index 0000000..2557a27 --- /dev/null +++ b/src/main/java/chat/ChatApiServer.java @@ -0,0 +1,3187 @@ +package chat; + +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.TIntIntMap; +import gnu.trove.map.hash.TIntIntHashMap; +import io.netty.channel.Channel; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.iq80.leveldb.CompressionType; +import org.iq80.leveldb.DB; +import org.iq80.leveldb.Options; +import static org.fusesource.leveldbjni.JniDBFactory.*; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +import chat.protocol.message.MDestroyRoom; +import chat.protocol.message.MFriendLogin; +import chat.protocol.message.MFriendLogout; +import chat.protocol.message.MForcedLogout; +import chat.protocol.message.MLeaveRoom; +import chat.protocol.message.MEnterRoom; +import chat.protocol.message.MPersistentMessage; +import chat.protocol.message.MRoomMessage; +import chat.protocol.message.MSendInstantMessage; +import chat.protocol.request.RAddBan; +import chat.protocol.request.RAddFriend; +import chat.protocol.request.RAddIgnore; +import chat.protocol.request.RAddInvite; +import chat.protocol.request.RAddModerator; +import chat.protocol.request.RCreateRoom; +import chat.protocol.request.RDestroyRoom; +import chat.protocol.request.RDestroyAvatar; +import chat.protocol.request.REnterRoom; +import chat.protocol.request.RFailoverReloginAvatar; +import chat.protocol.request.RFailoverRecreateRoom; +import chat.protocol.request.RGetAnyAvatar; +import chat.protocol.request.RGetRoom; +import chat.protocol.request.RGetRoomSummaries; +import chat.protocol.request.RKickAvatar; +import chat.protocol.request.RLeaveRoom; +import chat.protocol.request.RLoginAvatar; +import chat.protocol.request.RLogoutAvatar; +import chat.protocol.request.RRemoveBan; +import chat.protocol.request.RRemoveFriend; +import chat.protocol.request.RRemoveIgnore; +import chat.protocol.request.RRemoveInvite; +import chat.protocol.request.RRemoveModerator; +import chat.protocol.request.RSendInstantMessage; +import chat.protocol.request.RSendPersistentMessage; +import chat.protocol.request.RSendRoomMessage; +import chat.protocol.response.ResAddBan; +import chat.protocol.response.ResAddFriend; +import chat.protocol.response.ResAddIgnore; +import chat.protocol.response.ResAddInvite; +import chat.protocol.response.ResAddModerator; +import chat.protocol.response.ResCreateRoom; +import chat.protocol.response.ResDestroyRoom; +import chat.protocol.response.ResDestroyAvatar; +import chat.protocol.response.ResEnterRoom; +import chat.protocol.response.ResFailoverRecreateRoom; +import chat.protocol.response.ResFailLoginAvatar; +import chat.protocol.response.ResGetAnyAvatar; +import chat.protocol.response.ResGetRoom; +import chat.protocol.response.ResGetRoomSummaries; +import chat.protocol.response.ResKickAvatar; +import chat.protocol.response.ResLeaveRoom; +import chat.protocol.response.ResLoginAvatar; +import chat.protocol.response.ResLogoutAvatar; +import chat.protocol.response.ResRemoveBan; +import chat.protocol.response.ResRemoveFriend; +import chat.protocol.response.ResRemoveIgnore; +import chat.protocol.response.ResRemoveInvite; +import chat.protocol.response.ResRemoveModerator; +import chat.protocol.response.ResSendInstantMessage; +import chat.protocol.response.ResSendPersistentMessage; +import chat.protocol.response.ResSendRoomMessage; +import chat.protocol.response.ResUnregisterRoom; +import chat.protocol.response.ResponseResult; +import chat.util.ChatUnicodeString; +import chat.util.Config; +import chat.util.PersistentMessageStatus; + + +public class ChatApiServer { + + private final Config config; + private static ChatApiServer instance; + private ChatApiTcpListener registrar; + private ChatApiTcpListener gateway; + private static Logger logger = LogManager.getLogger(); + private static final ThreadLocal kryos = new ThreadLocal() { + protected Kryo initialValue() { + Kryo kryo = new Kryo(); + //TODO: configure kryo instance, customize settings + return kryo; + }; + }; + + private ExecutorService packetProcessor = Executors.newSingleThreadExecutor(); + private List connectedClusters = new CopyOnWriteArrayList<>(); + private DB avatarDb; + private DB chatRoomDb; + private DB mailDb; + private final Map onlineAvatars = new HashMap<>(); + private ExecutorService persister; + private int highestAvatarId; + private TIntIntMap roomMessageIdMap = new TIntIntHashMap(); + private Map roomMap = new HashMap<>(); + private Map roomMap1 = new HashMap<>(); + private Map roomMap2 = new HashMap<>(); + private Map roomMap3 = new HashMap<>(); + private Map roomMap4 = new HashMap<>(); + private Map roomMap5 = new HashMap<>(); + private Map roomMap6 = new HashMap<>(); + private Map roomMap7 = new HashMap<>(); + private Map roomMap8 = new HashMap<>(); + private Map roomMap9 = new HashMap<>(); + private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + public ChatApiServer() { + config = new Config("config.cfg"); + } + + public static void main(String[] args) throws InterruptedException, IOException { + instance = new ChatApiServer(); + System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); + instance.start(); + while(true) { + Thread.sleep(10000); + } + } + + private void start() throws IOException { + persister = Executors.newFixedThreadPool(config.getInt("persisterThreads")); + Options levelDbOptions = new Options(); + levelDbOptions.createIfMissing(true); + levelDbOptions.cacheSize(config.getInt("levelDbCache")); + avatarDb = factory.open(new File("./db/chatAvatars"), levelDbOptions); + chatRoomDb = factory.open(new File("./db/chatRooms"), levelDbOptions); + if(config.getBoolean("compressMails")) + levelDbOptions.compressionType(CompressionType.SNAPPY); + mailDb = factory.open(new File("./db/mails"), levelDbOptions); + getHighestAvatarIdFromDatabase(); + registrar = new ChatApiTcpListener(config.getInt("registrarPort")); + gateway = new ChatApiTcpListener(config.getInt("gatewayPort")); + registrar.start(); + gateway.start(); + } + + private void getHighestAvatarIdFromDatabase() { + byte[] buf = avatarDb.get("highestId".getBytes()); + if(buf == null) { + highestAvatarId = 0; + Integer idObj = new Integer(highestAvatarId); + Output output = new Output(new ByteArrayOutputStream()); + kryos.get().writeClassAndObject(output, idObj); + avatarDb.put("highestId".getBytes(), output.toBytes()); + output.close(); + return; + } + Input input = new Input(new ByteArrayInputStream(buf)); + Integer idObj = (Integer) kryos.get().readClassAndObject(input); + highestAvatarId = idObj; + input.close(); + } + + private int getNewAvatarId() { + int nextAvatarId = ++highestAvatarId; + Integer idObj = new Integer(highestAvatarId); + Output output = new Output(new ByteArrayOutputStream()); + kryos.get().writeClassAndObject(output, idObj); + avatarDb.put("highestId".getBytes(), output.toBytes()); + output.close(); + return nextAvatarId; + } + + public void handleLoginAvatar(ChatApiClient cluster, RLoginAvatar request) { + String fullAddress = request.getAddress().getString() + "+" + request.getName().getString(); + ResLoginAvatar response = new ResLoginAvatar(); + response.setTrack(request.getTrack()); + if(onlineAvatars.get(fullAddress) != null) { + response.setAvatar(onlineAvatars.get(fullAddress)); + response.setResult(ResponseResult.CHATRESULT_DUPLICATELOGIN); + cluster.send(response.serialize()); + return; + } + ChatAvatar avatar = getAvatarFromDatabase(fullAddress); + if(avatar != null) { + System.out.println("Got avatar from DB " + avatar.getAddressAndName()); + loginAvatar(cluster, avatar); + } else { + avatar = createAvatar(cluster, request, fullAddress); + System.out.println("Creating new avatar " + fullAddress); + } + response.setAvatar(avatar); + response.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(response.serialize()); + + //send all avatars in all rooms that avatar has entered + + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + avatar.setLoggedIn(true); + + //Avatar and UserCount + TIntList UserCount = new TIntArrayList(); + int avatarCount = getHighestAvatarId(); + for (int a = 0;a < avatarCount + 1 ; a++){ + ChatAvatar nextuser = getAvatarById(a); + if (nextuser != null){ + int UserIdcount = nextuser.getUserId(); + //System.out.println("User Count : " + nextuser.getUserId()); + if(!UserCount.contains(UserIdcount)) { + UserCount.add(UserIdcount); + } + } + } + System.out.println("Avatar Count total: " + onlineAvatars.size()); + System.out.println("Account Count total: " + UserCount.size()); + } + + public void handleFailoverReloginAvatar(ChatApiClient cluster, RFailoverReloginAvatar request) { + String fullAddress = request.getAddress().getString().toUpperCase() + "+" + request.getName().getString(); + ResFailLoginAvatar response = new ResFailLoginAvatar(); + response.setTrack(request.getTrack()); + if(onlineAvatars.get(fullAddress) != null) { + response.setAvatar(onlineAvatars.get(fullAddress)); + response.setResult(ResponseResult.CHATRESULT_DUPLICATELOGIN); + cluster.send(response.serialize()); + return; + } + ChatAvatar avatar = getAvatarFromDatabase(fullAddress); + if(avatar != null) { + System.out.println("Got avatar from DB " + avatar.getAddressAndName()); + loginAvatar(cluster, avatar); + } + else { + avatar = createAvatar(cluster, request, fullAddress); + System.out.println("Creating new avatar " + fullAddress); + } + response.setAvatar(avatar); + System.out.println("____________________________________________"); + System.out.println("Avatar failover logged in " + avatar.getAddressAndName()); + /*System.out.println("AvatarID " + avatar.getAvatarId()); + System.out.println("UserID " + avatar.getUserId()); + System.out.println("AvatarName " + avatar.getName().getString()); + System.out.println("AvatarAddress " + avatar.getAddress().getString()); + System.out.println("AvatarGateway " + avatar.getGateway().getString()); + System.out.println("AvatarServer " + avatar.getServer().getString()); + System.out.println("AvatarGatewayID " + avatar.getGatewayId()); + System.out.println("AvatarServerID " + avatar.getServerId()); + System.out.println("AvatarLoginLocation " + avatar.getLoginLocation().getString()); + System.out.println("AvatarAttribute " + avatar.getAttributes());*/ + System.out.println("____________________________________________"); + + response.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(response.serialize()); + + //Avatar and UserCount + TIntList UserCount = new TIntArrayList(); + int avatarCount = getHighestAvatarId(); + for (int a = 0;a < avatarCount + 1 ; a++){ + ChatAvatar nextuser = getAvatarById(a); + if (nextuser != null){ + int UserIdcount = nextuser.getUserId(); + //System.out.println("User Count : " + nextuser.getUserId()); + if(!UserCount.contains(UserIdcount)) { + UserCount.add(UserIdcount); + } + } + } + System.out.println("Avatar Count total: " + onlineAvatars.size()); + System.out.println("Account Count total: " + UserCount.size()); + } + + public void handleInstantMessage(ChatApiClient cluster, RSendInstantMessage req) { + // TODO: add ignore list check and gm stuff if needed + int srcAvatarId = req.getSrcAvatarId(); + ResSendInstantMessage res = new ResSendInstantMessage(); + res.setTrack(req.getTrack()); + ChatAvatar srcAvatar = getAvatarById(srcAvatarId); + if(srcAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAddress().getString().toUpperCase() + "+" + req.getDestName().getString()); + if(destAvatar == null || destAvatar.isInvisible()) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + //System.out.println("Dest Avatar not online " + req.getDestAddress().getString().toUpperCase() + "+" + req.getDestName().getString()); + return; + } + if(!srcAvatar.isGm() && !srcAvatar.isSuperGm() && destAvatar.hasIgnore(srcAvatar.getAvatarId())) { + res.setResult(ResponseResult.CHATRESULT_IGNORING); + cluster.send(res.serialize()); + return; + } + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + MSendInstantMessage msg = new MSendInstantMessage(); + msg.setDestAvatarId(destAvatar.getAvatarId()); + msg.setMessage(req.getMessage()); + msg.setSrcAvatar(srcAvatar); + msg.setOob(req.getOob()); + destAvatar.getCluster().send(msg.serialize()); + cluster.send(res.serialize()); + } + + private ChatAvatar createAvatar(ChatApiClient cluster, RLoginAvatar request, String fullAddress) { + ChatAvatar avatar = new ChatAvatar(); + avatar.setAvatarId(getNewAvatarId()); + avatar.setAddress(request.getAddress()); + avatar.setName(request.getName()); + avatar.setAttributes(request.getLoginAttributes()); + avatar.setLoginLocation(request.getLoginLocation()); + avatar.setUserId(request.getUserId()); + persistAvatar(avatar, false); + loginAvatar(cluster, avatar); + return avatar; + } + + private ChatAvatar createAvatar(ChatApiClient cluster, RFailoverReloginAvatar request, String fullAddress) { + ChatAvatar avatar = new ChatAvatar(); + avatar.setAvatarId(getNewAvatarId()); + avatar.setAddress(request.getAddress()); + avatar.setName(request.getName()); + avatar.setAttributes(request.getLoginAttributes()); + avatar.setLoginLocation(request.getLoginLocation()); + avatar.setUserId(request.getUserId()); + persistAvatar(avatar, false); + loginAvatar(cluster, avatar); + return avatar; + } + + public void persistAvatar(ChatAvatar avatar, boolean async) { + if(async) + persister.execute(() -> persistAvatar(avatar)); + else + persistAvatar(avatar); + } + + private void persistAvatar(ChatAvatar avatar) { + Output output = new Output(new ByteArrayOutputStream()); + kryos.get().writeClassAndObject(output, avatar); + avatarDb.put(avatar.getAddressAndName().getBytes(), output.toBytes()); + output.close(); + } + + private void loginAvatar(ChatApiClient cluster, ChatAvatar avatar) { + onlineAvatars.put(avatar.getAddressAndName(), avatar); + avatar.setCluster(cluster); + avatar.setLoggedIn(true); + //TODO: add chat room + friends status updates etc. + for(int mailId : avatar.getMailIds().toArray()) { + PersistentMessage pm = getPersistentMessageFromDb(mailId); + if(pm == null) + continue; + int daysUntilDelete = config.getInt("deleteMailTimerInDays"); + int elapsedDays = (int) TimeUnit.MILLISECONDS.toDays((System.currentTimeMillis() / 1000) - pm.getTimestamp()); + if(elapsedDays >= daysUntilDelete) { + destroyPersistentMessage(avatar, pm); + continue; + } + avatar.getPmList().put(mailId, pm); + } + if(!avatar.isInvisible()) { + for(ChatAvatar avatar2 : onlineAvatars.values()) { + if(avatar2.hasFriend(avatar.getAvatarId())) { + MFriendLogin msg = new MFriendLogin(); + msg.setDestAvatarId(avatar2.getAvatarId()); + msg.setFriendAvatar(avatar); + msg.setFriendAddress(avatar.getAddress()); + avatar2.getFriend(avatar.getAvatarId()).setStatus((short) 1); + avatar2.getCluster().send(msg.serialize()); + } + } + + System.out.println("____________________________________________"); + System.out.println("Avatar logged in " + avatar.getAddressAndName()); + /*System.out.println("AvatarID " + avatar.getAvatarId()); + System.out.println("UserID " + avatar.getUserId()); + System.out.println("AvatarName " + avatar.getName().getString()); + System.out.println("AvatarAddress " + avatar.getAddress().getString()); + System.out.println("AvatarGateway " + avatar.getGateway().getString()); + System.out.println("AvatarServer " + avatar.getServer().getString()); + System.out.println("AvatarGatewayID " + avatar.getGatewayId()); + System.out.println("AvatarServerID " + avatar.getServerId()); + System.out.println("AvatarLoginLocation " + avatar.getLoginLocation().getString()); + System.out.println("AvatarAttribute " + avatar.getAttributes());*/ + System.out.println("____________________________________________"); + + + //hier weitermachennnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + for(ChatRoom room : roomMap.values()) { + TIntArrayList destAvatarIdList = new TIntArrayList(); + room.getAvatarList().stream().map(ChatAvatar::getAvatarId).forEach(destAvatarIdList::add); + if(destAvatarIdList.contains(avatar.getAvatarId())) { + + + MEnterRoom msg = new MEnterRoom() ; + msg.setSrcAvatar(avatar); + msg.setCreator(systemavatar); + msg.setAvatarName(avatar.getName()); + msg.setAvatarAddress(avatar.getAddress()); + msg.setGateway(avatar.getGateway()); + msg.setServer(avatar.getServer()); + //msg.setRoomAddress(room.getRoomAddress()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + + } + } + } + for(ChatFriend friend : avatar.getFriendsList()) { + if(onlineAvatars.containsKey(friend.getFullAddress())) + friend.setStatus((short) 1); + else + friend.setStatus((short) 0); + } + //System.out.println("Login roomMessageIdMap before remove " + roomMessageIdMap.values()); + roomMessageIdMap.remove(avatar.getAvatarId()); + if(avatar.getName().getString().equalsIgnoreCase("system")) { + createRootGameRoom(cluster, avatar); + //createRootClusterRoom(cluster, avatar); + } + } + + public ChatAvatar getAvatarFromDatabase(String fullAddress) { + byte[] buf = avatarDb.get(fullAddress.getBytes()); + if(buf == null) + return null; + Input input = new Input(new ByteArrayInputStream(buf)); + ChatAvatar avatar = (ChatAvatar) kryos.get().readClassAndObject(input); + input.close(); + if(avatar == null) + return null; + return avatar; + } + + public ChatAvatar getAvatarById(int avatarId) { + return onlineAvatars.values().stream().filter(avatar -> avatar.getAvatarId() == avatarId).findFirst().orElse(null); + } + + public final Config getConfig() { + return config; + } + + public static ChatApiServer getInstance() { + return instance; + } + + public ChatApiTcpListener getRegistrar() { + return registrar; + } + + public void setRegistrar(ChatApiTcpListener registrar) { + this.registrar = registrar; + } + + public ChatApiTcpListener getGateway() { + return gateway; + } + + public void setGateway(ChatApiTcpListener gateway) { + this.gateway = gateway; + } + + public ExecutorService getPacketProcessor() { + return packetProcessor; + } + + public void setPacketProcessor(ExecutorService packetProcessor) { + this.packetProcessor = packetProcessor; + } + + public List getConnectedClusters() { + return connectedClusters; + } + + public void setConnectedClusters(List connectedClusters) { + this.connectedClusters = connectedClusters; + } + + public DB getAvatarDb() { + return avatarDb; + } + + public void setAvatarDb(DB avatarDb) { + this.avatarDb = avatarDb; + } + + public DB getChatRoomDb() { + return chatRoomDb; + } + + public void setChatRoomDb(DB chatRoomDb) { + this.chatRoomDb = chatRoomDb; + } + + public DB getMailDb() { + return mailDb; + } + + public void setMailDb(DB mailDb) { + this.mailDb = mailDb; + } + + public ChatApiClient getClusterByChannel(Channel channel) { + for(ChatApiClient cluster : connectedClusters) { + if(cluster.getChannel() == channel) + return cluster; + } + return null; + } + + public void addCluster(Channel channel) { + ChatApiClient cluster = new ChatApiClient(channel); + connectedClusters.add(cluster); + } + + public void removeCluster(Channel channel) { + if (getClusterByChannel(channel).getAddress() != null){ + System.out.println("SWG Server is offline " + getClusterByChannel(channel).getAddress().getString()); + int avatarCount = getHighestAvatarId(); + for (int a = 0;a < avatarCount + 1 ; a++){ + ChatAvatar nextuser = getAvatarById(a); + if (nextuser != null){ + //System.out.println("auto read UserID " + nextuser.getAddress().getString().toUpperCase()); + if (nextuser.getAddress().getString().toUpperCase().equals( getClusterByChannel(channel).getAddress().getString().toUpperCase())){ + logoutAvatar(nextuser,true ); + //logoutAvatar(systemuser,true ); + //System.out.println("auto logout UserID" + a); + } + } + } + for(ChatRoom room : roomMap.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap.clear(); + //System.out.println("roomMap cleared"); + break; + } + } + for(ChatRoom room : roomMap1.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap1.clear(); + //System.out.println("roomMap1 cleared"); + break; + } + } + for(ChatRoom room : roomMap2.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap2.clear(); + //System.out.println("roomMap2 cleared"); + break; + } + } + for(ChatRoom room : roomMap3.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap3.clear(); + //System.out.println("roomMap3 cleared"); + break; + } + } + for(ChatRoom room : roomMap4.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap4.clear(); + //System.out.println("roomMap4 cleared"); + break; + } + } + for(ChatRoom room : roomMap5.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap5.clear(); + //System.out.println("roomMap5 cleared"); + break; + } + } + for(ChatRoom room : roomMap6.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap6.clear(); + //System.out.println("roomMap6 cleared"); + break; + } + } + for(ChatRoom room : roomMap7.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap7.clear(); + //System.out.println("roomMap7 cleared"); + break; + } + } + for(ChatRoom room : roomMap8.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap8.clear(); + //System.out.println("roomMap8 cleared"); + break; + } + } + for(ChatRoom room : roomMap9.values()) { + if((room.getRoomAddress().getString().contains(getClusterByChannel(channel).getAddress().getString()))) { + roomMap9.clear(); + //System.out.println("roomMap9 cleared"); + break; + } + } + } + + connectedClusters.remove(getClusterByChannel(channel)); + //System.out.println("Cluster removed"); + // TODO: add disconnect handling + } + + public Map getOnlineAvatars() { + return onlineAvatars; + } + + public ExecutorService getPersister() { + return persister; + } + + public void setPersister(ExecutorService persister) { + this.persister = persister; + } + + public int getHighestAvatarId() { + return highestAvatarId; + } + + public void setHighestAvatarId(int highestAvatarId) { + this.highestAvatarId = highestAvatarId; + } + + public void handleLogoutAvatar(ChatApiClient cluster, RLogoutAvatar req) { + ResLogoutAvatar res = new ResLogoutAvatar(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getAvatarId()); + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + logoutAvatar(avatar, true); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + + //send all avatars in all rooms that avatar has leaved + for(ChatRoom room : roomMap.values()) { + if(room.isInRoom(avatar)) { + + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap1.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap2.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap3.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap4.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap5.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap6.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap7.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap8.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + + for(ChatRoom room : roomMap9.values()) { + if(room.isInRoom(avatar)) { + MLeaveRoom msg = new MLeaveRoom(); + msg.setSrcAvatarId(req.getAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + } + } + //Avatar and UserCount + TIntList UserCount = new TIntArrayList(); + int avatarCount = getHighestAvatarId(); + for (int a = 0;a < avatarCount + 1 ; a++){ + ChatAvatar nextuser = getAvatarById(a); + if (nextuser != null){ + int UserIdcount = nextuser.getUserId(); + //System.out.println("User Count : " + nextuser.getUserId()); + if(!UserCount.contains(UserIdcount)) { + UserCount.add(UserIdcount); + } + } + } + System.out.println("Avatar Count total: " + onlineAvatars.size()); + System.out.println("Account Count total: " + UserCount.size()); + } + + void logoutAvatar(ChatAvatar avatar, boolean persist) { + onlineAvatars.remove(avatar.getAddressAndName()); + avatar.setLoggedIn(false); + ChatAvatar systemavatar = onlineAvatars.get(avatar.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + if(persist){ + persistAvatar(avatar, true); + } + + //TODO: remove chat room + friends status updates etc. + for(PersistentMessage pm : avatar.getPmList().valueCollection()) { + persistPersistentMessage(pm, true); + } + for(ChatAvatar avatar2 : onlineAvatars.values()) { + if(avatar2.hasFriend(avatar.getAvatarId())) { + MFriendLogout msg = new MFriendLogout(); + msg.setDestAvatarId(avatar2.getAvatarId()); + msg.setFriendAvatar(avatar); + msg.setFriendAddress(avatar.getAddress()); + avatar2.getFriend(avatar.getAvatarId()).setStatus((short) 0); + avatar2.getCluster().send(msg.serialize()); + } + } + roomMessageIdMap.remove(avatar.getAvatarId()); + } + + protected void persistPersistentMessage(PersistentMessage pm, boolean async) { + if(async) + persister.execute(() -> persistPersistentMessage(pm)); + else + persistPersistentMessage(pm); + } + + public void handleDestroyAvatar(ChatApiClient cluster, RDestroyAvatar req) { + ResDestroyAvatar res = new ResDestroyAvatar(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + destroyAvatar(avatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + + public void destroyPersistentMessage(ChatAvatar avatar, PersistentMessage pm) { + avatar.removeMail(pm); + mailDb.delete(ByteBuffer.allocate(4).putInt(pm.getMessageId()).array()); + } + + private void destroyAvatar(ChatAvatar avatar) { + //TODO: destroy mails, update friends/ignore lists, update chat rooms etc. + logoutAvatar(avatar, false); + avatarDb.delete(avatar.getAddressAndName().getBytes()); + } + + public void handleGetAnyAvatar(ChatApiClient cluster, RGetAnyAvatar req) { + ResGetAnyAvatar res = new ResGetAnyAvatar(); + res.setTrack(req.getTrack()); + String fullAddress = req.getAddress() + "+" + req.getName(); + ChatAvatar avatar = onlineAvatars.get(fullAddress); + if(avatar != null) { + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setAvatar(avatar); + res.setLoggedIn(true); + cluster.send(res.serialize()); + return; + } + avatar = getAvatarFromDatabase(fullAddress); + if(avatar != null) { + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setAvatar(avatar); + res.setLoggedIn(false); + cluster.send(res.serialize()); + return; + } + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + res.setLoggedIn(false); + cluster.send(res.serialize()); + } + + private int getNewPmId() { + boolean found = false; + int mailId = 0; + while(!found) { + mailId = ThreadLocalRandom.current().nextInt(); + if(mailId != 0 && getPersistentMessageFromDb(mailId) == null) + found = true; + } + return mailId; + } + + protected PersistentMessage getPersistentMessageFromDb(int messageId) { + byte[] key = ByteBuffer.allocate(4).putInt(messageId).array(); + byte[] value = mailDb.get(key); + if(value == null) + return null; + Input input = new Input(new ByteArrayInputStream(value)); + PersistentMessage pm = (PersistentMessage) kryos.get().readClassAndObject(input); + return pm; + } + + private void persistPersistentMessage(PersistentMessage pm) { + byte[] key = ByteBuffer.allocate(4).putInt(pm.getMessageId()).array(); + Output output = new Output(new ByteArrayOutputStream()); + kryos.get().writeClassAndObject(output, pm); + mailDb.put(key, output.toBytes()); + } + +//################################################################################ + public void handleSendPersistentMessage(ChatApiClient cluster, RSendPersistentMessage req) { + ResSendPersistentMessage res = new ResSendPersistentMessage(); + res.setTrack(req.getTrack()); + ChatAvatar srcAvatar = null; + + if(req.isAvatarPresence() != 0) { + srcAvatar = getAvatarById(req.getSrcAvatarId()); + } else { + String srcName = req.getSrcName().getString(); + if(srcName.contains(" ")) + srcName = srcName.split(" ")[0]; + srcAvatar = onlineAvatars.get(cluster.getAddress().getString() + "+" + srcName); + } + if(srcAvatar == null) { + if(req.isAvatarPresence() == 0) { + // for auctioneer, planetary civil authority, and .stf sender names + srcAvatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + } else { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + } + String destFullAdress = req.getDestAddress().getString().toUpperCase() + "+" + req.getDestName().getString(); + ChatAvatar destAvatar = onlineAvatars.get(destFullAdress); + if(destAvatar == null) { + destAvatar = getAvatarFromDatabase(destFullAdress); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + } + if(!srcAvatar.isGm() && !srcAvatar.isSuperGm() && destAvatar.hasIgnore(srcAvatar.getAvatarId())) { + res.setResult(ResponseResult.CHATRESULT_IGNORING); + cluster.send(res.serialize()); + return; + } + PersistentMessage pm = new PersistentMessage(); + pm.setAvatarId(destAvatar.getAvatarId()); + pm.setMessage(req.getMessage()); + pm.setOob(req.getOob()); + pm.setMessageId(getNewPmId()); + pm.setCategory(req.getCategory()); + pm.setSenderAddress(srcAvatar.getAddress()); + if(req.isAvatarPresence() == 0){ + pm.setSenderName(req.getSrcName()); + } + else + pm.setSenderName(srcAvatar.getName()); + pm.setStatus(PersistentMessageStatus.NEW); + pm.setSubject(req.getSubject()); + pm.setTimestamp((int) (System.currentTimeMillis() / 1000)); + persistPersistentMessage(pm); + persistAvatar(destAvatar, true); + destAvatar.addMail(pm); + //System.out.println(req.getSubject().getString()); + //System.out.println(req.getMessage().getString()); + //System.out.println(req.getOob().getString()); + + if(destAvatar.getCluster() != null && destAvatar.isLoggedIn()) { + MPersistentMessage msg = new MPersistentMessage(); + msg.setPm(pm); + destAvatar.getCluster().send(msg.serialize()); + } + persistPersistentMessage(pm); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setMessageId(pm.getMessageId()); + cluster.send(res.serialize()); + } + + public ChatApiClient getClusterByAddress(ChatUnicodeString address) { + for(ChatApiClient cluster : connectedClusters) { + if(cluster.getAddress().getString().equals(address.getString())) + return cluster; + } + return null; + } + + public void handleAddFriend(ChatApiClient cluster, RAddFriend req) { + ResAddFriend res = new ResAddFriend(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + //System.out.println(req.getDestName().getString()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + if(avatar.hasFriend(req.getDestAddress(), req.getDestName())) { + res.setResult(ResponseResult.CHATRESULT_DUPLICATEFRIEND); + cluster.send(res.serialize()); + return; + } + String fullAddress = req.getDestAddress().getString().toString().toUpperCase() + "+" + req.getDestName().getString(); + ChatAvatar destAvatar = onlineAvatars.get(fullAddress); + if(destAvatar == null) { + destAvatar = getAvatarFromDatabase(fullAddress); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + } + if(destAvatar == avatar) { + res.setResult(ResponseResult.CHATRESULT_INVALID_INPUT); + cluster.send(res.serialize()); + return; + } + ChatFriend friend = new ChatFriend(); + friend.setAvatarId(destAvatar.getAvatarId()); + friend.setAddress(destAvatar.getAddress()); + friend.setName(destAvatar.getName()); + friend.setComment(req.getComment()); + friend.setStatus((short) (destAvatar.isLoggedIn() ? 1 : 0)); + avatar.addFriend(friend); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + if(friend.getStatus() != 0) { + MFriendLogin msg = new MFriendLogin(); + msg.setDestAvatarId(avatar.getAvatarId()); + msg.setFriendAvatar(destAvatar); + msg.setFriendAddress(destAvatar.getAddress()); + cluster.send(msg.serialize()); + } + } + + public void handleRemoveFriend(ChatApiClient cluster, RRemoveFriend req) { + ResRemoveFriend res = new ResRemoveFriend(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + if(!avatar.hasFriend(req.getDestAddress(), req.getDestName())) { + res.setResult(ResponseResult.CHATRESULT_FRIENDNOTFOUND); + cluster.send(res.serialize()); + return; + } + avatar.removeFriend(req.getDestAddress(), req.getDestName()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + + public void handleAddIgnore(ChatApiClient cluster, RAddIgnore req) { + ResAddIgnore res = new ResAddIgnore(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + if(avatar.hasIgnore(req.getDestAddress(), req.getDestName())) { + res.setResult(ResponseResult.CHATRESULT_DUPLICATEIGNORE); + cluster.send(res.serialize()); + return; + } + String fullAddress = req.getDestAddress().getString().toUpperCase() + "+" + req.getDestName().getString(); + //System.out.println(fullAddress); + ChatAvatar destAvatar = onlineAvatars.get(fullAddress); + if(destAvatar == null) { + destAvatar = getAvatarFromDatabase(fullAddress); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + } + if(destAvatar == avatar) { + res.setResult(ResponseResult.CHATRESULT_INVALID_INPUT); + cluster.send(res.serialize()); + return; + } + ChatIgnore ignore = new ChatIgnore(); + ignore.setAvatarId(destAvatar.getAvatarId()); + ignore.setAddress(destAvatar.getAddress()); + ignore.setName(destAvatar.getName()); + avatar.addIgnore(ignore); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + + public void handleRemoveIgnore(ChatApiClient cluster, RRemoveIgnore req) { + ResRemoveIgnore res = new ResRemoveIgnore(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + if(!avatar.hasIgnore(req.getDestAddress(), req.getDestName())) { + res.setResult(ResponseResult.CHATRESULT_IGNORENOTFOUND); + cluster.send(res.serialize()); + return; + } + avatar.removeIgnore(req.getDestAddress(), req.getDestName()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + + public TIntIntMap getRoomMessageIdMap() { + return roomMessageIdMap; + } + + public void setRoomMessageIdMap(TIntIntMap roomMessageIdMap) { + this.roomMessageIdMap = roomMessageIdMap; + } + + public void handleGetRoomSummaries(ChatApiClient cluster, RGetRoomSummaries req){ + ResGetRoomSummaries res = new ResGetRoomSummaries(); + res.setTrack(req.getTrack()); + List rooms = new ArrayList<>(); + rooms.clear(); + + //up to 10 swg servers + if(cluster.getAddress() != null ) { + for(ChatRoom room : roomMap.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map "+ roomMap.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap1.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map1 "+ roomMap1.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap2.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map2 "+ roomMap2.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap3.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map3 "+ roomMap3.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap4.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map4 "+ roomMap4.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap5.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map5 "+ roomMap5.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap6.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map6 "+ roomMap6.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap7.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map7 "+ roomMap7.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap8.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map8 "+ roomMap8.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + for(ChatRoom room : roomMap9.values()) { + if((room.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("handle get roomSummarie room Map9 "+ roomMap9.size() + " " + cluster.getAddress().getString()); + rooms.add(room); + } + } + } + + //System.out.println("_________________________________________________"); + res.setRooms(rooms); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + + +//################################################################################ + public void handleCreateRoom(ChatApiClient cluster, RCreateRoom req) { + ResCreateRoom res = new ResCreateRoom(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + //System.out.println("handle create room Cluster " + cluster.getAddress().getString()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + if(roomMap.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + //System.out.println("handle create room allready exist Map " + req.getRoomAddress().getString() + "+" + req.getRoomName().getString()); + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap1.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + //System.out.println("handle create room allready exist Map1 " + req.getRoomAddress().getString() + "+" + req.getRoomName().getString()); + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap2.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap3.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap4.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap5.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap6.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap7.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap8.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap9.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + + ChatRoom room = new ChatRoom(); + room.setCreateTime((int) (System.currentTimeMillis() / 1000)); + room.setRoomId(getNewRoomId()); + //System.out.println("getNewRoomId " + room.getRoomId()); + room.setCreatorId(avatar.getAvatarId()); + //System.out.println("getAvatarId " + avatar.getAvatarId()); + room.setCreatorAddress(avatar.getAddress()); + //System.out.println("Avatar getAddress " + avatar.getAddress().getString()); + room.setCreatorName(avatar.getName()); + //System.out.println("getAvatarName " + avatar.getName().getString()); + room.setRoomAddress(new ChatUnicodeString(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString())); + //System.out.println("setRoomAddress " + (req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString())); + room.setRoomAttributes(req.getRoomAttributes()); + //System.out.println("setRoomAttributes " + (req.getRoomAttributes())); + room.setRoomName(req.getRoomName()); + //System.out.println("setRoomName " + (req.getRoomName().getString())); + room.setRoomPassword(req.getRoomPassword()); + room.setRoomTopic(req.getRoomTopic()); + //System.out.println("setRoomTopic " + (req.getRoomTopic().getString())); + room.setNodeLevel(room.getRoomAddress().getString().split("\\+").length); + //System.out.println("setNodeLevel " + (room.getRoomAddress().getString().split("\\+").length)); + room.setMaxRoomSize(req.getMaxRoomSize()); + //System.out.println("setMaxRoomSize " + (req.getMaxRoomSize())); + room.addAvatar(avatar); + room.addAdmin(avatar); + + + //uo to 10 swg servers + for(ChatRoom rooma : roomMap.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map put " + (req.getRoomName().getString())); + roomMap.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap1.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map1 put " + (req.getRoomName().getString())); + roomMap1.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap2.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map2 put " + (req.getRoomName().getString())); + roomMap2.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap3.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map3 put " + (req.getRoomName().getString())); + roomMap3.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap4.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map4 put " + (req.getRoomName().getString())); + roomMap4.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap5.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map5 put " + (req.getRoomName().getString())); + roomMap5.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap6.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map6 put " + (req.getRoomName().getString())); + roomMap6.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap7.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map7 put " + (req.getRoomName().getString())); + roomMap7.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap8.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map8 put " + (req.getRoomName().getString())); + roomMap8.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap9.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map9 put " + (req.getRoomName().getString())); + roomMap9.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + } + + //################################################################################ + public void handleFailoverRecreateRoom(ChatApiClient cluster, RFailoverRecreateRoom req) { + ResFailoverRecreateRoom res = new ResFailoverRecreateRoom(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + int notonline = 0; + if(avatar == null) { + String fullAddress = req.getAddress().getString().toUpperCase() + "+" + req.getcreatorName().getString(); + avatar = getAvatarFromDatabase(fullAddress); + //System.out.println("CreatorName not online anymore " + req.getAddress().getString().toUpperCase() + "+" + req.getcreatorName().getString()); + notonline = 1; + } + + + if(roomMap.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + //System.out.println("handle create room allready exist Map " + req.getRoomAddress().getString() + "+" + req.getRoomName().getString()); + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap1.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + //System.out.println("handle create room allready exist Map1 " + req.getRoomAddress().getString() + "+" + req.getRoomName().getString()); + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap2.get(req.getRoomAddress().getString() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap3.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap4.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap5.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap6.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap7.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap8.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + if(roomMap9.get(req.getRoomAddress().getString().toUpperCase() + "+" + req.getRoomName().getString()) != null) { + res.setResult(ResponseResult.CHATRESULT_ROOM_ALREADYEXISTS); + cluster.send(res.serialize()); + return; + } + + ChatRoom room = new ChatRoom(); + room.setCreatorName(avatar.getName()); + room.setCreatorAddress(avatar.getAddress()); + room.setCreatorId(avatar.getAvatarId()); + room.setRoomName(req.getRoomName()); + room.setRoomTopic(req.getRoomTopic()); + room.setRoomPassword(req.getRoomPassword()); + room.setNodeLevel(req.getRoomAddress().getString().split("\\+").length); + room.setRoomAddress(new ChatUnicodeString(req.getRoomAddress().getString())); + System.out.println("RoomAddress recreated " + (req.getRoomAddress().getString())); + room.setRoomAttributes(req.getRoomAttributes()); + room.setMaxRoomSize(req.getMaxRoomSize()); + room.setRoomId(req.getroomFailID()); + room.setCreateTime((int) (System.currentTimeMillis() / 1000)); + + if(notonline == 0) { + room.addAvatar(avatar); + } + room.addAdmin(avatar); + + + //System.out.println("getAvatarList before" + room.getAvatarList().toString()); + //System.out.println("getavatarCount in ChatApi " + req.getavatarCount()); + + //inRoomAvatars + if (req.getavatarCount() > 1 ){ + for (int i = 0; i < req.getavatarCount();i++){ + int destavatar2 = req.getinRoomAvatarlist().get(i); + + //System.out.println("destavatar2 " + destavatar2); + ChatAvatar destavatar = getAvatarById(destavatar2); + if (destavatar != null){ + //ChatAvatar destavatar = getAvatarById(req.getinRoomAvatarId()); + //ChatAvatar destavatar = onlineAvatars.get(req.getAvaAddress().getString().toUpperCase() + "+" + req.getAvaName().getString()); + if(!room.isInRoom(destavatar)){ + room.addAvatar(destavatar); + res.setGotRoom(true); + } + } + } + } + //inRoomAdmin + if (req.getAdminCount() > 1 ){ + for (int i = 0; i < req.getAdminCount();i++){ + int destavatar3 = req.getinRoomAdminlist().get(i); + //System.out.println("destAdmin2 " + destavatar3); + ChatAvatar destavatar = getAvatarById(destavatar3); + //ChatAvatar destavatar = getAvatarById(req.getinRoomAvatarId()); + //ChatAvatar destavatar = onlineAvatars.get(req.getAvaAddress().getString().toUpperCase() + "+" + req.getAvaName().getString()); + if(!room.isAdmin(destavatar)){ + room.addAdmin(destavatar); + } + } + } + + //inRoomModerator + if (req.getModeratorCount() > 0 ){ + for (int i = 0; i < req.getModeratorCount();i++){ + int destavatar4 = req.getinRoomModeratorlist().get(i); + //System.out.println("destModerator2 " + destavatar4); + ChatAvatar destavatar = getAvatarById(destavatar4); + //ChatAvatar destavatar = getAvatarById(req.getinRoomAvatarId()); + //ChatAvatar destavatar = onlineAvatars.get(req.getAvaAddress().getString().toUpperCase() + "+" + req.getAvaName().getString()); + if(!room.isModerator(destavatar)){ + room.addModerator(destavatar); + } + } + } + + //inRoomBan + if (req.getBanCount() > 0 ){ + for (int i = 0; i < req.getBanCount();i++){ + int destavatar5 = req.getinRoomBanlist().get(i); + //System.out.println("destBann2 " + destavatar5); + ChatAvatar destavatar = getAvatarById(destavatar5); + //ChatAvatar destavatar = getAvatarById(req.getinRoomAvatarId()); + //ChatAvatar destavatar = onlineAvatars.get(req.getAvaAddress().getString().toUpperCase() + "+" + req.getAvaName().getString()); + if(!room.isBanned(destavatar)){ + room.addBan(destavatar); + } + } + } + + //inRoomInvite + if (req.getInviteCount() > 0 ){ + for (int i = 0; i < req.getInviteCount();i++){ + int destavatar6 = req.getinRoomInvitelist().get(i); + //System.out.println("destInvite2 " + destavatar6); + ChatAvatar destavatar = getAvatarById(destavatar6); + if (destavatar != null){ + //ChatAvatar destavatar = getAvatarById(req.getinRoomAvatarId()); + //ChatAvatar destavatar = onlineAvatars.get(req.getAvaAddress().getString().toUpperCase() + "+" + req.getAvaName().getString()); + if(!room.isInvited(destavatar)){ + room.AddInvite(destavatar); + } + } + } + } + + //uo to 10 swg servers + for(ChatRoom rooma : roomMap.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map put " + (req.getRoomName().getString())); + roomMap.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap1.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map1 put " + (req.getRoomName().getString())); + roomMap1.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap2.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map2 put " + (req.getRoomName().getString())); + roomMap2.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap3.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map3 put " + (req.getRoomName().getString())); + roomMap3.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap4.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map4 put " + (req.getRoomName().getString())); + roomMap4.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap5.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map5 put " + (req.getRoomName().getString())); + roomMap5.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap6.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map6 put " + (req.getRoomName().getString())); + roomMap6.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap7.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map7 put " + (req.getRoomName().getString())); + roomMap7.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap8.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map8 put " + (req.getRoomName().getString())); + roomMap8.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + for(ChatRoom rooma : roomMap9.values()) { + if((rooma.getRoomAddress().getString().contains(cluster.getAddress().getString()))) { + //System.out.println("cR Map9 put " + (req.getRoomName().getString())); + roomMap9.put(room.getRoomAddress().getString(), room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + res.setRoom(room); + List parentRooms = getParentRooms(room); + res.setExtraRooms(parentRooms); + cluster.send(res.serialize()); + return; + } + } + + + } + +//################################################################################ + public void handleDestroyRoom(ChatApiClient cluster, RDestroyRoom req) { + ResDestroyRoom res = new ResDestroyRoom(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getRoomAddress().getString()); + if(room != null) { + //System.out.println("enterroom found in map " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map1 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map2 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map3 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map4 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map5 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map6 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map7 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map8 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map9 " + req.getRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + + + if (req.getRoomAddress().getString().contains("group+")){ + MDestroyRoom msg = new MDestroyRoom(); + msg.setSrcAvatar(systemavatar); + ChatRoom grouproom = roomMap.get(req.getRoomAddress().getString() + "+GroupChat"); + msg.setRoomId(grouproom.getRoomId()); + //System.out.println("Group SUB room deleted " + grouproom.getRoomAddress().getString()); + //System.out.println("Group SUB room deleted RoomId " + grouproom.getRoomId()); + cluster.send(msg.serialize()); + roomMap.remove(grouproom.getRoomAddress().getString(), grouproom); + + + MDestroyRoom msg2 = new MDestroyRoom(); + msg2.setSrcAvatar(systemavatar); + msg2.setRoomId(room.getRoomId()); + cluster.send(msg2.serialize()); + roomMap.remove(room.getRoomAddress().getString(), room); + } + else if + (req.getRoomAddress().getString().contains("guild+")){ + MDestroyRoom msg = new MDestroyRoom(); + msg.setSrcAvatar(systemavatar); + ChatRoom guildroom = roomMap.get(req.getRoomAddress().getString() + "+GuildChat"); + msg.setRoomId(guildroom.getRoomId()); + //System.out.println("Guild SUB room deleted " + guildroom.getRoomAddress().getString()); + //System.out.println("Guild SUB room deleted RoomId " + guildroom.getRoomId()); + cluster.send(msg.serialize()); + roomMap.remove(guildroom.getRoomAddress().getString(), guildroom); + + + MDestroyRoom msg2 = new MDestroyRoom(); + msg2.setSrcAvatar(systemavatar); + msg2.setRoomId(room.getRoomId()); + cluster.send(msg2.serialize()); + roomMap.remove(room.getRoomAddress().getString(), room); + } + else + { + MDestroyRoom msg2 = new MDestroyRoom(); + msg2.setSrcAvatar(avatar); + msg2.setRoomId(room.getRoomId()); + cluster.send(msg2.serialize()); + roomMap.remove(room.getRoomAddress().getString(), room); + } + + res.setDestRoomId(room.getRoomId()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + + //room.removeAvatar(avatar); + //room.clear(); + //roomMap.remove(room.getRoomAddress().getString(), room); + //System.out.println("room deleted " + req.getRoomAddress().getString()); + //System.out.println("room deleted RoomId " + room.getRoomId()); + + List rooms = new ArrayList<>(); + for(ChatRoom rooma : roomMap.values()) { + //System.out.println("room after deleted Name" + rooms.toArray().toString()); + //System.out.println("room after del list IDs " + rooma.getRoomId()); + //if(room.getRoomAddress().getString().startsWith(req.getStartNodeAddress().getString()) && room.getRoomAddress().getString().contains(req.getRoomFilter().getString())) + //rooms.add(room); + } + + + } +//################################################################################ + public void handleGetRoom(ChatApiClient cluster, RGetRoom req) { + ResGetRoom res = new ResGetRoom(); + res.setTrack(req.getTrack()); + + + //System.out.println("handle get room Map " + cluster.getAddress().getString()); + ChatRoom room = roomMap.get(req.getRoomAddress().getString()); + + if(room == null) { + room = roomMap1.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getRoomAddress().getString()); + } + + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setRoom(room); + List parentRooms = getParentRooms(room); + //List subRooms = getSubRooms(room); + res.setExtraRooms(parentRooms); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + + } + + private List getParentRooms(ChatRoom room) { + List parentRooms = new ArrayList<>(); + for(ChatRoom parent : roomMap.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap1.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap2.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap3.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap4.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap5.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap6.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap7.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap8.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + for(ChatRoom parent : roomMap9.values()) { + if(room.getRoomAddress().getString().startsWith(parent.getRoomAddress().getString())) + parentRooms.add(parent); + } + return parentRooms; + } + + private List getSubRooms(ChatRoom room) { + List subRooms = new ArrayList<>(); + for(ChatRoom sub : roomMap.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap1.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap2.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap3.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap4.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap5.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap6.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap7.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap8.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + for(ChatRoom sub : roomMap9.values()) { + if(sub.getRoomAddress().getString().startsWith(room.getRoomAddress().getString())) + subRooms.add(sub); + } + return subRooms; + } +//################################################################################ + public void handleEnterRoom(ChatApiClient cluster, REnterRoom req) { + ResEnterRoom res = new ResEnterRoom() ; + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getRoomAddress().getString()); + if(room != null) { + //System.out.println("enterroom found in map " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map1 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map2 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map3 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map4 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map5 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map6 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map7 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map8 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getRoomAddress().getString()); + //System.out.println("enterroom found in map9 " + req.getRoomAddress().getString()); + } + + + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setRoomId(room.getRoomId()); + if(room.isOnBanList(avatar)) { + //swg crash if send it + //res.setResult(ResponseResult.CHATRESULT_ROOM_BANNEDAVATAR); + //cluster.send(res.serialize()); + return; + } + if(room.hasPassword() && !room.validatePassword(req.getRoomPassword())) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + if(room.isBanned(avatar)) { + //swg crash if send it + //res.setResult(ResponseResult.CHATRESULT_ROOM_BANNEDAVATAR); + //cluster.send(res.serialize()); + return; + } + if(!room.isPrivate()){ + } else if (avatar.getAvatarId() == 1){ + //System.out.println("Systemava"); + } else if (room.isOwner(avatar)){ + //System.out.println("src is Owner"); + } else if (avatar.isGm()){ + //System.out.println("src is Gm"); + } else if (avatar.isSuperGm()){ + //System.out.println("src is SuperGm"); + } else if(!room.isInvited(avatar)) { + //System.out.println("Ava is not invited"); + res.setGotRoom(false); + res.setRoom(room); + //swg crash if send it + //res.setResult(ResponseResult.CHATRESULT_ROOM_PRIVATEROOM); + //cluster.send(res.serialize()); + return; + } + room.addAvatar(avatar); + res.setGotRoom(true); + + res.setRoom(room); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + + MEnterRoom msg = new MEnterRoom() ; + msg.setSrcAvatar(avatar); + msg.setCreator(systemavatar); + msg.setAvatarName(avatar.getName()); + msg.setAvatarAddress(avatar.getAddress()); + msg.setSrcAvatarId(avatar.getAvatarId()); + msg.setGateway(avatar.getGateway()); + msg.setServer(avatar.getServer()); + //msg.setRoomAddress(room.getRoomAddress()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + + } + +//################################################################################ + public void handleLeaveRoom(ChatApiClient cluster, RLeaveRoom req) { + ResLeaveRoom res = new ResLeaveRoom() ; + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + ChatAvatar systemavatar = onlineAvatars.get(cluster.getAddress().getString().toUpperCase() + "+" + "SYSTEM"); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + + ChatRoom room = roomMap.get(req.getRoomAddress().getString()); + if(room != null) { + //System.out.println("leaveroom found in map " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map1 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map2 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map3 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map4 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map5 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map6 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map7 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map8 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getRoomAddress().getString()); + //System.out.println("leaveroom found in map9 " + req.getRoomAddress().getString()); + } + + + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + //System.out.println("Room " + room.getRoomId()); + //System.out.println("getAvatarList before leave" + room.getAvatarList().toString()); + res.setRoomId(room.getRoomId()); + room.leaveRoom(avatar); + room.leaveRoom(systemavatar); + + //System.out.println("getAvatarList after leave" + room.getAvatarList().toString()); + res.setGotRoom(false); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + + MLeaveRoom msg = new MLeaveRoom(); + //TIntArrayList destAvatarIdList = new TIntArrayList(); + //room.getAvatarList().stream().map(ChatAvatar::getAvatarId).forEach(destAvatarIdList::add); + //msg.setDestAvatarIdList(destAvatarIdList); + msg.setSrcAvatarId(req.getSrcAvatarId()); + msg.setRoomId(room.getRoomId()); + cluster.send(msg.serialize()); + + } + + public Map getRoomMap() { + return roomMap; + } + + public void setRoomMap(Map roomMap) { + this.roomMap = roomMap; + } + + public ChatRoom getRoomById(int roomId) { + for(ChatRoom room : roomMap.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap1.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap2.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap3.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap4.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap5.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap6.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap7.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap8.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + for(ChatRoom room : roomMap9.values()) { + if(room.getRoomId() == roomId) { + return room; + } + } + return null; + } + + private int getNewRoomId() { + boolean found = false; + int roomId = 0; + while(!found) { + roomId = ThreadLocalRandom.current().nextInt(); + if(roomId != 0 && getRoomById(roomId) == null) + found = true; + } + return roomId; + } + + private void persistChatRoom(ChatRoom room) { + Output output = new Output(new ByteArrayOutputStream()); + kryos.get().writeClassAndObject(output, room); + byte[] value = output.toBytes(); + byte[] key = room.getRoomAddress().getString().getBytes(); + chatRoomDb.put(key, value); + } + + public ScheduledExecutorService getScheduler() { + return scheduler; + } + + public void setScheduler(ScheduledExecutorService scheduler) { + this.scheduler = scheduler; + } +//################################################################################ + public void handleSendRoomMessage(ChatApiClient cluster, RSendRoomMessage req) { + ResSendRoomMessage res = new ResSendRoomMessage() ; + res.setTrack(req.getTrack()); + //System.out.println(req.getRoomAddress().getString()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getRoomAddress().getString()); + if(room != null) { + //System.out.println("sendRoomMessage found in map " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map1 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map2 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map3 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map4 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map5 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map6 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map7 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map8 " + req.getRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getRoomAddress().getString()); + //System.out.println("sendRoomMessage found in map9 " + req.getRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + //System.out.println("sending room msg"); + res.setDestRoomId(room.getRoomId()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + MRoomMessage msg = new MRoomMessage(); + TIntArrayList destAvatarIdList = new TIntArrayList(); + room.getAvatarList().stream().map(ChatAvatar::getAvatarId).forEach(destAvatarIdList::add); + msg.setDestAvatarIdList(destAvatarIdList); + msg.setMessage(req.getMsg()); + msg.setOob(req.getOob()); + msg.setRoomId(room.getRoomId()); + msg.setMessageId(getNewRoomMsgId(avatar)); + msg.setAvatar(avatar); + cluster.send(msg.serialize()); + } + + private int getNewRoomMsgId(ChatAvatar avatar) { + boolean found = false; + int msgId = 0; + while(!found) { + msgId = ThreadLocalRandom.current().nextInt(); + if(msgId != 0 && roomMessageIdMap.get(avatar.getAvatarId()) != msgId) + found = true; + } + roomMessageIdMap.put(avatar.getAvatarId(), msgId); + return msgId; + } + + private void createRootClusterRoom(ChatApiClient cluster, ChatAvatar systemAvatar) { + String clusterFullAddress = cluster.getAddress().getString(); + String[] splitAddress = clusterFullAddress.split("\\+"); + ChatRoom room = new ChatRoom(); + room.setCreateTime((int) (System.currentTimeMillis() / 1000)); + room.setRoomId(getNewRoomId()); + room.setCreatorId(systemAvatar.getAvatarId()); + room.setCreatorAddress(systemAvatar.getAddress()); + room.setCreatorName(systemAvatar.getName()); + room.setRoomAddress(new ChatUnicodeString(splitAddress[0] + "+" + splitAddress[1] + "+" + splitAddress[2])); + room.setRoomAttributes(0); + room.setRoomName(new ChatUnicodeString(splitAddress[2])); + room.setRoomPassword(new ChatUnicodeString()); + room.setRoomTopic(new ChatUnicodeString()); + room.setMaxRoomSize(0); + room.addAvatar(systemAvatar); + room.addAdmin(systemAvatar); + //System.out.println("got handle create root room2 for Cluster " + cluster.getAddress().getString()); + //System.out.println("got handle create root room2 " + room.getRoomAddress().getString()); + + + if(roomMap.values().size() == 1) { + //System.out.println("handle create root room2 Map put " + cluster.getAddress().getString()); + roomMap.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap1.values().size() == 1) { + //System.out.println("handle create root room2 Map1 put " + cluster.getAddress().getString()); + roomMap1.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap2.values().size() == 1) { + //System.out.println("handle create root room2 Map2 put " + cluster.getAddress().getString()); + roomMap2.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap3.values().size() == 1) { + //System.out.println("handle create root room2 Map3 put " + cluster.getAddress().getString()); + roomMap3.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap4.values().size() == 1) { + //System.out.println("handle create root room2 Map4 put " + cluster.getAddress().getString()); + roomMap4.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap5.values().size() == 1) { + //System.out.println("handle create root room2 Map5 put " + cluster.getAddress().getString()); + roomMap5.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap6.values().size() == 1) { + //System.out.println("handle create root room2 Map6 put " + cluster.getAddress().getString()); + roomMap6.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap7.values().size() == 1) { + //System.out.println("handle create root room2 Map7 put " + cluster.getAddress().getString()); + roomMap7.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap8.values().size() == 1) { + //System.out.println("handle create root room2 Map8 put " + cluster.getAddress().getString()); + roomMap8.put(room.getRoomAddress().getString(), room); + return; + } + if(roomMap9.values().size() == 1) { + //System.out.println("handle create root room2 Map9 put " + cluster.getAddress().getString()); + roomMap9.put(room.getRoomAddress().getString(), room); + return; + } + + } +//################################################################################ + private void createRootGameRoom(ChatApiClient cluster, ChatAvatar systemAvatar) { + String clusterFullAddress = cluster.getAddress().getString(); + String[] splitAddress = clusterFullAddress.split("\\+"); + ChatRoom room = new ChatRoom(); + room.setCreateTime((int) (System.currentTimeMillis() / 1000)); + room.setRoomId(getNewRoomId()); + room.setCreatorId(systemAvatar.getAvatarId()); + room.setCreatorAddress(systemAvatar.getAddress()); + room.setCreatorName(systemAvatar.getName()); + room.setRoomAddress(new ChatUnicodeString(splitAddress[0] + "+" + splitAddress[1])); + room.setRoomAttributes(0); + room.setRoomName(new ChatUnicodeString(splitAddress[1])); + room.setRoomPassword(new ChatUnicodeString()); + room.setRoomTopic(new ChatUnicodeString()); + room.setMaxRoomSize(0); + room.addAvatar(systemAvatar); + room.addAdmin(systemAvatar); + System.out.println("New cluster " + cluster.getAddress().getString()); + //System.out.println("got handle create root room " + room.getRoomAddress().getString()); + + if(roomMap.isEmpty()) { + //System.out.println("handle create root room Map put room " + room.getRoomAddress().getString()); + roomMap.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap1.isEmpty()) { + //System.out.println("handle create root room Map1 put room " + room.getRoomAddress().getString()); + roomMap1.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap2.isEmpty()) { + //System.out.println("handle create root room Map2 put room " + room.getRoomAddress().getString()); + roomMap2.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap3.isEmpty()) { + //System.out.println("handle create root room Map3 put room " + room.getRoomAddress().getString()); + roomMap3.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap4.isEmpty()) { + //System.out.println("handle create root room Map4 put room " + room.getRoomAddress().getString()); + roomMap4.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap5.isEmpty()) { + //System.out.println("handle create root room Map5 put room " + room.getRoomAddress().getString()); + roomMap5.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap6.isEmpty()) { + //System.out.println("handle create root room Map6 put room " + room.getRoomAddress().getString()); + roomMap6.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap7.isEmpty()) { + //System.out.println("handle create root room Map7 put room " + room.getRoomAddress().getString()); + roomMap7.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap8.isEmpty()) { + //System.out.println("handle create root room Map8 put room " + room.getRoomAddress().getString()); + roomMap8.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + if(roomMap9.isEmpty()) { + //System.out.println("handle create root room Map9 put room " + room.getRoomAddress().getString()); + roomMap9.put(room.getRoomAddress().getString(), room); + createRootClusterRoom(cluster, systemAvatar); + return; + } + + } +//################################################################################ + public void handleAddModerator(ChatApiClient cluster, RAddModerator req) { + ResAddModerator res = new ResAddModerator(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("AddMod found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("AddMod found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isModerated()) { + res.setResult(ResponseResult.CHATRESULT_ROOM_MODERATEDROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTNOTINROOM); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar) || !room.isOwner(avatar)) && (!avatar.isGm() || !avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // cluster.send(res.serialize()); + // return; + //} + if(room.isModerator(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DUPLICATEMODERATOR); + cluster.send(res.serialize()); + return; + } + room.addModerator(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleRemoveModerator(ChatApiClient cluster, RRemoveModerator req) { + ResRemoveModerator res = new ResRemoveModerator(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("removeMod found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("removeMod found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isModerated()) { + res.setResult(ResponseResult.CHATRESULT_ROOM_MODERATEDROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTNOTINROOM); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar) || !room.isOwner(avatar) || !room.isModerator(avatar)) && (!avatar.isGm() || !avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // cluster.send(res.serialize()); + // return; + //} + + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + + if(!room.isModerator(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTAVATARISMODERATOR); + cluster.send(res.serialize()); + return; + } + room.removeModerator(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleAddBan(ChatApiClient cluster, RAddBan req) { + ResAddBan res = new ResAddBan(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + + //String fullAddress = request.getAddress().getString().toUpperCase() + "+" + request.getName().getString(); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + String destAvataraa = (req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + //ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarName().getString()); + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + String fullAddress = req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString(); + //ChatAvatar destAvatar = onlineAvatars.get(fullAddress); + //System.out.println("show onlinelist " + onlineAvatars.toString()); + //System.out.println("got ban from " + avatar + " to " + destAvataraa); + if(destAvatar == null) { + destAvatar = getAvatarFromDatabase(fullAddress); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + //System.out.println("destAva does not exist"); + cluster.send(res.serialize()); + return; + } + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("AddBan found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("AddBan found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + //System.out.println("srcAva not in room"); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar)) || (!room.isOwner(avatar)) || (!room.isModerator(avatar)) || (!avatar.isGm()) || (!avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // System.out.println("no src right"); + // cluster.send(res.serialize()); + // return; + //} + + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + + if(room.isBanned(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DUPLICATEBAN); + cluster.send(res.serialize()); + return; + } + if(destAvatar.isGm() || destAvatar.isSuperGm() || room.isOwner(destAvatar) && (!avatar.isGm() || !avatar.isSuperGm())) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + room.addBan(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + room.removeAvatar(destAvatar); + room.RemoveInvite(destAvatar); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleRemoveBan(ChatApiClient cluster, RRemoveBan req) { + ResRemoveBan res = new ResRemoveBan(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("RemoveBan found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveBan found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + //System.out.println("srcAva not in room"); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar)) || (!room.isOwner(avatar)) || (!room.isModerator(avatar)) || (!avatar.isGm()) || (!avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // System.out.println("src no right"); + // cluster.send(res.serialize()); + // return; + //} + + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + + if(!room.isBanned(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTAVATARNOTBANNED); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + room.removeBan(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleRemoveInvite(ChatApiClient cluster, RRemoveInvite req) { + ResRemoveInvite res = new ResRemoveInvite(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("RemoveInvite found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("RemoveInvite found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar)) || (!room.isOwner(avatar)) || (!room.isModerator(avatar)) || (!avatar.isGm()) || (!avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // cluster.send(res.serialize()); + // return; + //} + + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + + //if(!room.isBanned(destAvatar)) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_DESTAVATARNOTBANNED); + // cluster.send(res.serialize()); + // return; + //} + //room.addBan(destAvatar); + room.RemoveInvite(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleKickAvatar(ChatApiClient cluster, RKickAvatar req) { + ResKickAvatar res = new ResKickAvatar(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("KickAva found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("KickAva found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isModerated()) { + res.setResult(ResponseResult.CHATRESULT_ROOM_MODERATEDROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + cluster.send(res.serialize()); + return; + } + if(!room.isInRoom(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTNOTINROOM); + cluster.send(res.serialize()); + return; + } + //if((!room.isAdmin(avatar)) || (!room.isOwner(avatar)) || (!room.isModerator(avatar)) || (!avatar.isGm()) || (!avatar.isSuperGm())) { + // res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + // System.out.println("kick src no rights"); + // cluster.send(res.serialize()); + // return; + //} + + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + + if(destAvatar.isGm() || destAvatar.isSuperGm() || room.isOwner(destAvatar) && (!avatar.isGm() || !avatar.isSuperGm())) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + if(room.isModerator(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DESTAVATARISMODERATOR); + cluster.send(res.serialize()); + return; + } + //room.removeAvatar(destAvatar); + room.kickAvatar(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } +//################################################################################ + public void handleAddInvite(ChatApiClient cluster, RAddInvite req) { + ResAddInvite res = new ResAddInvite(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatAvatar destAvatar = onlineAvatars.get(req.getDestAvatarAddress().getString().toUpperCase() + "+" + req.getDestAvatarName().getString().toLowerCase()); + if(destAvatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + ChatRoom room = roomMap.get(req.getDestRoomAddress().getString()); + if(room != null) { + //System.out.println("AddInvite found in map " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap1.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map1 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap2.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map2 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap3.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map3 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap4.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map4 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap5.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map5 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap6.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map6 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap7.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map7 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap8.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map8 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + room = roomMap9.get(req.getDestRoomAddress().getString()); + //System.out.println("AddInvite found in map9 " + req.getDestRoomAddress().getString()); + } + if(room == null) { + res.setResult(ResponseResult.CHATRESULT_ADDRESSDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + if(!room.isInRoom(avatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOTINROOM); + cluster.send(res.serialize()); + return; + } + if (room.isAdmin(avatar)){ + } else if (room.isOwner(avatar)){ + } else if (room.isModerator(avatar)){ + } else if (avatar.isGm()){ + } else if (avatar.isSuperGm()){ + } else { + res.setResult(ResponseResult.CHATRESULT_ROOM_NOPRIVILEGES); + cluster.send(res.serialize()); + return; + } + if(room.isInvited(destAvatar)) { + res.setResult(ResponseResult.CHATRESULT_ROOM_DUPLICATEINVITE); + cluster.send(res.serialize()); + return; + } + res.setDestRoomId(room.getRoomId()); + room.AddInvite(destAvatar); + //room.removeBan(destAvatar); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + } + +} diff --git a/src/main/java/chat/ChatApiTcpHandler.java b/src/main/java/chat/ChatApiTcpHandler.java new file mode 100644 index 0000000..acad1c0 --- /dev/null +++ b/src/main/java/chat/ChatApiTcpHandler.java @@ -0,0 +1,504 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.management.timer.Timer; + + + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import chat.protocol.GenericMessage; +import chat.protocol.GenericRequest; +import chat.protocol.request.RAddBan; +import chat.protocol.request.RAddFriend; +import chat.protocol.request.RAddIgnore; +import chat.protocol.request.RAddInvite; +import chat.protocol.request.RAddModerator; +import chat.protocol.request.RCreateRoom; +import chat.protocol.request.RDestroyRoom; +import chat.protocol.request.RDestroyAvatar; +import chat.protocol.request.REnterRoom; +import chat.protocol.request.RFailoverReloginAvatar; +import chat.protocol.request.RFailoverRecreateRoom; +import chat.protocol.request.RFriendStatus; +import chat.protocol.request.RGetAnyAvatar; +import chat.protocol.request.RGetPersistentHeaders; +import chat.protocol.request.RGetPersistentMessage; +import chat.protocol.request.RGetRoom; +import chat.protocol.request.RGetRoomSummaries; +import chat.protocol.request.RIgnoreStatus; +import chat.protocol.request.RKickAvatar; +import chat.protocol.request.RLeaveRoom; +import chat.protocol.request.RLoginAvatar; +import chat.protocol.request.RLogoutAvatar; +import chat.protocol.request.RRegistrarGetChatServer; +import chat.protocol.request.RRemoveBan; +import chat.protocol.request.RRemoveFriend; +import chat.protocol.request.RRemoveIgnore; +import chat.protocol.request.RRemoveInvite; +import chat.protocol.request.RRemoveModerator; +import chat.protocol.request.RSendApiVersion; +import chat.protocol.request.RSendInstantMessage; +import chat.protocol.request.RSendPersistentMessage; +import chat.protocol.request.RSendRoomMessage; +import chat.protocol.request.RSetAvatarAttributes; +import chat.protocol.request.RUpdatePersistentMessage; +import chat.protocol.request.RUpdatePersistentMessages; +import chat.protocol.response.ResFriendStatus; +import chat.protocol.response.ResGetPersistentHeaders; +import chat.protocol.response.ResGetPersistentMessage; +import chat.protocol.response.ResIgnoreStatus; +import chat.protocol.response.ResRegistrarGetChatServer; +import chat.protocol.response.ResSendApiVersion; +import chat.protocol.response.ResSetAvatarAttributes; +import chat.protocol.response.ResUpdatePersistentMessage; +import chat.protocol.response.ResUpdatePersistentMessages; +import chat.protocol.response.ResponseResult; +import chat.protocol.message.MDestroyRoom; +import chat.protocol.message.MLeaveRoom; +import chat.protocol.message.MEnterRoom; +import chat.protocol.message.MFriendLogin; +import chat.protocol.message.MFriendLogout; +import chat.util.ChatUnicodeString; +import chat.util.PersistentMessageStatus; +import gnu.trove.map.TShortObjectMap; +import gnu.trove.map.hash.TShortObjectHashMap; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelHandler; + +@ChannelHandler.Sharable +public class ChatApiTcpHandler extends ChannelInboundHandlerAdapter { + + private TShortObjectMap packetTypes; + private static Logger logger = LogManager.getLogger(ChatApiTcpHandler.class); + private ChatApiServer server = ChatApiServer.getInstance(); + + + public ChatApiTcpHandler() { + packetTypes = new TShortObjectHashMap<>(); + insertPacketHandlers(); + } + + // TODO: change this entire handler system to a dependency injection based system + private void insertPacketHandlers() { + packetTypes.put(GenericRequest.REQUEST_REGISTRAR_GETCHATSERVER, (cluster, packet) -> { + RRegistrarGetChatServer req = new RRegistrarGetChatServer(); + req.deserialize(packet); + String hostname = server.getConfig().getString("hostname"); + int port = server.getConfig().getInt("gatewayPort"); + ResRegistrarGetChatServer res = new ResRegistrarGetChatServer(); + res.setTrack(req.getTrack()); + res.setHostname(new ChatUnicodeString(hostname)); + res.setPort((short) port); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + server.getScheduler().schedule(() -> cluster.send(res.serialize()), 15, TimeUnit.SECONDS); // fix bug where server wouldnt create system rooms + logger.info("Registrar recieved GetChatServer requested"); + }); + packetTypes.put(GenericRequest.REQUEST_SETAPIVERSION, (cluster, packet) -> { + int version = server.getConfig().getInt("apiVersion"); + RSendApiVersion req = new RSendApiVersion(); + req.deserialize(packet); + ResSendApiVersion res = new ResSendApiVersion(); + res.setTrack(req.getTrack()); + res.setVersion(version); + if(version == req.getVersion()) { + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + } else { + res.setResult(ResponseResult.CHATRESULT_WRONGCHATSERVERFORREQUEST); + } + cluster.send(res.serialize()); + }); + packetTypes.put(GenericRequest.REQUEST_LOGINAVATAR, (cluster, packet) -> { + RLoginAvatar req = new RLoginAvatar(); + req.deserialize(packet); + if(cluster.getAddress() == null) // store the clusters address at first login since api client doesnt send us any address information otherwise + cluster.setAddress(req.getAddress()); + //System.out.println(req.getAddress().getString() + "+" + req.getName().getString()); + //System.out.println(req.getLoginLocation().getString()); + //System.out.println("Attributes: " + req.getLoginAttributes()); + server.handleLoginAvatar(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_SENDINSTANTMESSAGE, (cluster, packet) -> { + RSendInstantMessage req = new RSendInstantMessage(); + req.deserialize(packet); + server.handleInstantMessage(cluster, req); + }); + packetTypes.put(GenericMessage.MESSAGE_DESTROYROOM, (cluster, packet) -> { + MDestroyRoom msg = new MDestroyRoom(); + msg.deserialize(packet); + //System.out.println("Got MESSAGE for MDESTROYROOM"); + //server.handleInstantMessage(cluster, msg); + }); + packetTypes.put(GenericMessage.MESSAGE_LEAVEROOM, (cluster, packet) -> { + MLeaveRoom msg = new MLeaveRoom(); + msg.deserialize(packet); + //System.out.println("Got MESSAGE for MLEAVEROOM"); + //server.handleInstantMessage(cluster, msg); + }); + packetTypes.put(GenericMessage.MESSAGE_ENTERROOM, (cluster, packet) -> { + MEnterRoom msg = new MEnterRoom(); + msg.deserialize(packet); + //System.out.println("Got MESSAGE for MENTERROOM"); + //server.handleInstantMessage(cluster, msg); + }); + packetTypes.put(GenericMessage.MESSAGE_FRIENDLOGIN, (cluster, packet) -> { + MFriendLogin msg = new MFriendLogin(); + msg.deserialize(packet); + //System.out.println("Got MESSAGE for MFRIENDLOGIN"); + //server.handleInstantMessage(cluster, msg); + }); + packetTypes.put(GenericMessage.MESSAGE_FRIENDLOGOUT, (cluster, packet) -> { + MFriendLogout msg = new MFriendLogout(); + msg.deserialize(packet); + //System.out.println("Got MESSAGE for MFRIENDLOGOUT"); + //server.handleInstantMessage(cluster, msg); + }); + packetTypes.put(GenericRequest.REQUEST_LOGOUTAVATAR, (cluster, packet) -> { + RLogoutAvatar req = new RLogoutAvatar(); + //System.out.println("Got Request for Logout"); + req.deserialize(packet); + server.handleLogoutAvatar(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_DESTROYAVATAR, (cluster, packet) -> { + RDestroyAvatar req = new RDestroyAvatar(); + req.deserialize(packet); + server.handleDestroyAvatar(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_KICKAVATAR, (cluster, packet) -> { + RKickAvatar req = new RKickAvatar(); + //System.out.println("got kick in handler"); + req.deserialize(packet); + server.handleKickAvatar(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_ADDINVITE, (cluster, packet) -> { + RAddInvite req = new RAddInvite(); + //System.out.println("got addinvite in handler"); + req.deserialize(packet); + server.handleAddInvite(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_REMOVEINVITE, (cluster, packet) -> { + RRemoveInvite req = new RRemoveInvite(); + //System.out.println("got remove invite in handler"); + req.deserialize(packet); + server.handleRemoveInvite(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_ADDBAN, (cluster, packet) -> { + RAddBan req = new RAddBan(); + req.deserialize(packet); + //System.out.println("got ban in handler " + req.toString()); + server.handleAddBan(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_REMOVEBAN, (cluster, packet) -> { + RRemoveBan req = new RRemoveBan(); + req.deserialize(packet); + server.handleRemoveBan(cluster, req); + }); + + packetTypes.put(GenericRequest.REQUEST_SETAVATARATTRIBUTES, (cluster, packet) -> { + RSetAvatarAttributes req = new RSetAvatarAttributes(); + req.deserialize(packet); + ResSetAvatarAttributes res = new ResSetAvatarAttributes(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_DESTAVATARDOESNTEXIST); + cluster.send(res.serialize()); + } else { + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + avatar.setAttributes(req.getAvatarAttributes()); + res.setAvatar(avatar); + cluster.send(res.serialize()); + server.persistAvatar(avatar, true); + } + }); + packetTypes.put(GenericRequest.REQUEST_GETAVATAR, (cluster, packet) -> {}); // not used for SWG + packetTypes.put(GenericRequest.REQUEST_GETANYAVATAR, (cluster, packet) -> { + RGetAnyAvatar req = new RGetAnyAvatar(); + req.deserialize(packet); + server.handleGetAnyAvatar(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_SENDPERSISTENTMESSAGE, (cluster, packet) -> { + //System.out.println("recv mail"); + RSendPersistentMessage req = new RSendPersistentMessage(); + req.deserialize(packet); + server.handleSendPersistentMessage(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_GETPERSISTENTMESSAGE, (cluster, packet) -> { + RGetPersistentMessage req = new RGetPersistentMessage(); + req.deserialize(packet); + ResGetPersistentMessage res = new ResGetPersistentMessage(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + PersistentMessage pm = avatar.getPm(req.getMessageId()); + if(pm == null) { + res.setResult(ResponseResult.CHATRESULT_PMSGNOTFOUND); + cluster.send(res.serialize()); + return; + } + if(pm.getStatus() == PersistentMessageStatus.NEW) + pm.setStatus(PersistentMessageStatus.READ); + res.setPm(pm); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + }); + packetTypes.put(GenericRequest.REQUEST_UPDATEPERSISTENTMESSAGE, (cluster, packet) -> { + RUpdatePersistentMessage req = new RUpdatePersistentMessage(); + req.deserialize(packet); + //System.out.println("got request for updatepersistentmessage"); + ResUpdatePersistentMessage res = new ResUpdatePersistentMessage(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + PersistentMessage pm = avatar.getPm(req.getMessageId()); + if(pm == null) { + res.setResult(ResponseResult.CHATRESULT_PMSGNOTFOUND); + cluster.send(res.serialize()); + return; + } + pm.setStatus(req.getStatus()); + if(pm.getStatus() == PersistentMessageStatus.DELETED) + server.destroyPersistentMessage(avatar, pm); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + server.persistAvatar(avatar, true); + }); + packetTypes.put(GenericRequest.REQUEST_UPDATEPERSISTENTMESSAGES, (cluster, packet) -> { + RUpdatePersistentMessages req = new RUpdatePersistentMessages(); + req.deserialize(packet); + ResUpdatePersistentMessages res = new ResUpdatePersistentMessages(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + Collection pmList = avatar.getPmList().valueCollection(); + for(PersistentMessage pm : pmList) { + if(pm.getStatus() == req.getCurrentStatus()) { + pm.setStatus(req.getNewStatus()); + if(pm.getStatus() == PersistentMessageStatus.DELETED) + server.destroyPersistentMessage(avatar, pm); + } + } + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + server.persistAvatar(avatar, true); + }); + packetTypes.put(GenericRequest.REQUEST_GETPERSISTENTHEADERS, (cluster, packet) -> { + //System.out.println("got request for headers"); + RGetPersistentHeaders req = new RGetPersistentHeaders(); + req.deserialize(packet); + ResGetPersistentHeaders res = new ResGetPersistentHeaders(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + cluster.send(res.serialize()); + return; + } + List pmList = res.getPmList(); + pmList.addAll(avatar.getPmList().valueCollection()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + }); + packetTypes.put(GenericRequest.REQUEST_FRIENDSTATUS, (cluster, packet) -> { + RFriendStatus req = new RFriendStatus(); + req.deserialize(packet); + ResFriendStatus res = new ResFriendStatus(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + res.setFriendsList(new ArrayList<>()); + cluster.send(res.serialize()); + return; + } + res.setFriendsList(avatar.getFriendsList()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + }); + packetTypes.put(GenericRequest.REQUEST_IGNORESTATUS, (cluster, packet) -> { + RIgnoreStatus req = new RIgnoreStatus(); + req.deserialize(packet); + ResIgnoreStatus res = new ResIgnoreStatus(); + res.setTrack(req.getTrack()); + ChatAvatar avatar = server.getAvatarById(req.getSrcAvatarId()); + if(avatar == null) { + res.setResult(ResponseResult.CHATRESULT_SRCAVATARDOESNTEXIST); + res.setIgnoreList(new ArrayList<>()); + cluster.send(res.serialize()); + return; + } + res.setIgnoreList(avatar.getIgnoreList()); + res.setResult(ResponseResult.CHATRESULT_SUCCESS); + cluster.send(res.serialize()); + }); + packetTypes.put(GenericRequest.REQUEST_ADDFRIEND, (cluster, packet) -> { + //System.out.println("recv add friend req"); + RAddFriend req = new RAddFriend(); + req.deserialize(packet); + server.handleAddFriend(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_REMOVEFRIEND, (cluster, packet) -> { + RRemoveFriend req = new RRemoveFriend(); + req.deserialize(packet); + server.handleRemoveFriend(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_ADDIGNORE, (cluster, packet) -> { + RAddIgnore req = new RAddIgnore(); + req.deserialize(packet); + server.handleAddIgnore(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_REMOVEIGNORE, (cluster, packet) -> { + RRemoveIgnore req = new RRemoveIgnore(); + req.deserialize(packet); + server.handleRemoveIgnore(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_GETROOMSUMMARIES, (cluster, packet) -> { + RGetRoomSummaries req = new RGetRoomSummaries(); + //System.out.println("got req RGetRoomSummaries"); + req.deserialize(packet); + server.handleGetRoomSummaries(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_CREATEROOM, (cluster, packet) -> { + //System.out.println("got req for create room"); + RCreateRoom req = new RCreateRoom(); + req.deserialize(packet); + server.handleCreateRoom(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_DESTROYROOM, (cluster, packet) -> { + //System.out.println("got del room req"); + RDestroyRoom req = new RDestroyRoom(); + req.deserialize(packet); + server.handleDestroyRoom(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_GETROOM, (cluster, packet) -> { + //System.out.println("got get room req"); + RGetRoom req = new RGetRoom(); + req.deserialize(packet); + server.handleGetRoom(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_ENTERROOM, (cluster, packet) -> { + //System.out.println("got enter room req"); + REnterRoom req = new REnterRoom(); + req.deserialize(packet); + server.handleEnterRoom(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_FAILOVER_RECREATEROOM, (cluster, packet) -> { + RFailoverRecreateRoom req = new RFailoverRecreateRoom(); + //System.out.println("got request Failover RecreateRoom"); + req.deserialize(packet); + server.handleFailoverRecreateRoom(cluster, req); + }); + + packetTypes.put(GenericRequest.REQUEST_FAILOVER_RELOGINAVATAR, (cluster, packet) -> { + RFailoverReloginAvatar req = new RFailoverReloginAvatar(); + //System.out.println("got request FailoverReloginAvatar"); + req.deserialize(packet); + if(cluster.getAddress() == null) // store the clusters address at first login since api client doesnt send us any address information otherwise + cluster.setAddress(req.getAddress()); + //System.out.println(req.getAddress().getString() + "+" + req.getName().getString()); + //System.out.println(req.getLoginLocation().getString()); + //System.out.println("Attributes: " + req.getLoginAttributes()); + server.handleFailoverReloginAvatar(cluster, req); + }); + + packetTypes.put(GenericRequest.REQUEST_LEAVEROOM, (cluster, packet) -> { + RLeaveRoom req = new RLeaveRoom(); + req.deserialize(packet); + //System.out.println("Got request leaveRoom: "); + server.handleLeaveRoom(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_SENDROOMMESSAGE, (cluster, packet) -> { + //System.out.println("got room msg"); + RSendRoomMessage req = new RSendRoomMessage(); + req.deserialize(packet); + server.handleSendRoomMessage(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_ADDMODERATOR, (cluster, packet) -> { + RAddModerator req = new RAddModerator(); + req.deserialize(packet); + server.handleAddModerator(cluster, req); + }); + packetTypes.put(GenericRequest.REQUEST_REMOVEMODERATOR, (cluster, packet) -> { + RRemoveModerator req = new RRemoveModerator(); + req.deserialize(packet); + server.handleRemoveModerator(cluster, req); + }); + + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + ChatApiClient cluster = server.getClusterByChannel(ctx.channel()); + // msg comes in as an unpooled unsafe buffer in native memory + ByteBuf unsafe = (ByteBuf) msg; + ByteBuffer packet = ByteBuffer.allocate(((ByteBuf) msg).readableBytes()).order(ByteOrder.LITTLE_ENDIAN); + unsafe.getBytes(0, packet); + packet.position(0);unsafe.release(); + if(packet.capacity() < 10) { + logger.warn("Recieved packet of size < 6 bytes"); + ctx.writeAndFlush(unsafe); + return; + } + if(cluster == null) { + logger.warn("ChatApiClient object not found for given channel"); + return; + } + packet.getInt(); //length of packet in big endian + short type = packet.getShort(4); + PacketHandler handler = packetTypes.get(type); + if(handler == null) { + logger.info("Unhandled packet type: {}", type); + System.out.println(type); + return; + } + // we are in the IO thread and the submit the handler function to the packet processor to avoid stalling IO operations + server.getPacketProcessor().execute(() -> { + handler.handle(cluster, packet); + }); + } + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + server.removeCluster(ctx.channel()); + } + + public void channelActive(ChannelHandlerContext ctx) throws Exception { + server.addCluster(ctx.channel()); + } + +} diff --git a/src/main/java/chat/ChatApiTcpListener.java b/src/main/java/chat/ChatApiTcpListener.java new file mode 100644 index 0000000..7746834 --- /dev/null +++ b/src/main/java/chat/ChatApiTcpListener.java @@ -0,0 +1,58 @@ +package chat; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ChatApiTcpListener { + + private final int port; + private Thread recvThread; + private ServerBootstrap bootstrap; + private static Logger logger = LogManager.getLogger(ChatApiTcpListener.class); + + public ChatApiTcpListener(int port) { + this.port = port; + } + + public void start() { + recvThread = new Thread(() -> { + EventLoopGroup group = new NioEventLoopGroup(); + try { + bootstrap = new ServerBootstrap(); + bootstrap.group(group) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_KEEPALIVE, true) + .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast("decoder", new LengthFieldBasedFrameDecoder(1000000, 0, 4, -4, 0)); + ch.pipeline().addLast(new ChatApiTcpHandler()); + } + }); + logger.info("TCP Server starting on port {}", port); + bootstrap.bind(port).sync().channel().closeFuture().await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + group.shutdownGracefully(); + } + }); + recvThread.start(); + + } + + public int getPort() { + return port; + } + +} diff --git a/src/main/java/chat/ChatAvatar.java b/src/main/java/chat/ChatAvatar.java new file mode 100644 index 0000000..fe372c7 --- /dev/null +++ b/src/main/java/chat/ChatAvatar.java @@ -0,0 +1,290 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import gnu.trove.list.array.TIntArrayList; +import gnu.trove.map.TIntObjectMap; +import gnu.trove.map.hash.TIntObjectHashMap; +import chat.util.ChatUnicodeString; + +public class ChatAvatar { + + public static final int AVATARATTR_INVISIBLE = 1 << 0; + public static final int AVATARATTR_GM = 1 << 1; + public static final int AVATARATTR_SUPERGM = 1 << 2; + public static final int AVATARATTR_SUPERSNOOP = 1 << 3; + public static final int AVATARATTR_EXTENDED = 1 << 4; + + private ChatUnicodeString name; + private ChatUnicodeString address; + private ChatUnicodeString server = new ChatUnicodeString(); // can just be empty dont need + private ChatUnicodeString gateway = new ChatUnicodeString(); // can just be empty dont need + private ChatUnicodeString loginLocation; + private int avatarId; + private int userId; // station ID + private int serverId; + private int gatewayId; + private int attributes; + private transient boolean isLoggedIn = false; + private transient ChatApiClient cluster; + private TIntArrayList mailIds = new TIntArrayList(); + private transient TIntObjectMap pmList = new TIntObjectHashMap<>(); + private List friendsList = new ArrayList<>(); + private List ignoreList = new ArrayList<>(); + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public ChatUnicodeString getServer() { + return server; + } + + public void setServer(ChatUnicodeString server) { + this.server = server; + } + + public ChatUnicodeString getGateway() { + return gateway; + } + + public void setGateway(ChatUnicodeString gateway) { + this.gateway = gateway; + } + + public ChatUnicodeString getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(ChatUnicodeString loginLocation) { + this.loginLocation = loginLocation; + } + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public int getUserId() { + //System.out.println("userId " + userId); + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getServerId() { + return serverId; + } + + public void setServerId(int serverId) { + this.serverId = serverId; + } + + public int getGatewayId() { + return gatewayId; + } + + public void setGatewayId(int gatewayId) { + this.gatewayId = gatewayId; + } + + public int getAttributes() { + return attributes; + } + + public void setAttributes(int attributes) { + this.attributes = attributes; + } + + public boolean isLoggedIn() { + return isLoggedIn; + } + + public void setLoggedIn(boolean isLoggedIn) { + this.isLoggedIn = isLoggedIn; + } + + public ChatApiClient getCluster() { + return cluster; + } + + public void setCluster(ChatApiClient cluster) { + this.cluster = cluster; + } + + public TIntArrayList getMailIds() { + return mailIds; + } + + public void setMailIds(TIntArrayList mailIds) { + this.mailIds = mailIds; + } + + public byte[] serialize() { + ByteBuffer buf = ByteBuffer.allocate(40 + name.getStringLength() * 2 + address.getStringLength() * 2 + loginLocation.getStringLength() * 2 + server.getStringLength() * 2 + gateway.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(avatarId); + buf.putInt(userId); + buf.put(name.serialize()); + buf.put(address.serialize()); + buf.put(gateway.serialize()); + buf.put(server.serialize()); + buf.putInt(gatewayId); + buf.putInt(serverId); + buf.put(loginLocation.serialize()); + buf.putInt(attributes); + + + + + + return buf.array(); + } + + public String getAddressAndName() { + return address.getString() + "+" + name.getString(); + } + + public boolean isInvisible() { + return (getAttributes() & AVATARATTR_INVISIBLE) == 1; + } + + public boolean isGm() { + return (getAttributes() & AVATARATTR_GM) == 1; + } + + public boolean isSuperGm() { + return (getAttributes() & AVATARATTR_SUPERGM) == 1; + } + + public boolean isSuperSnoop() { + return (getAttributes() & AVATARATTR_SUPERSNOOP) == 1; + } + + public void addMail(PersistentMessage pm) { + mailIds.add(pm.getMessageId()); + pmList.put(pm.getMessageId(), pm); + System.out.println("addMail destAva mailIds " + mailIds); + System.out.println("adddMail destAva pmList " + pmList); + } + + public TIntObjectMap getPmList() { + return pmList; + } + + public void setPmList(TIntObjectMap pmList) { + this.pmList = pmList; + } + + public PersistentMessage getPm(int messageId) { + return pmList.get(messageId); + } + + public void removeMail(PersistentMessage pm) { + pmList.remove(pm.getMessageId()); + mailIds.remove(pm.getMessageId()); + } + + public List getFriendsList() { + return friendsList; + } + + public void setFriendsList(List friendsList) { + this.friendsList = friendsList; + } + + public List getIgnoreList() { + return ignoreList; + } + + public void setIgnoreList(List ignoreList) { + this.ignoreList = ignoreList; + } + + public void addFriend(ChatFriend friend) { + friendsList.add(friend); + } + + public void addIgnore(ChatIgnore ignore) { + ignoreList.add(ignore); + } + + public boolean hasFriend(ChatUnicodeString destAddress, ChatUnicodeString destName) { + for(ChatFriend friend : friendsList) { + if(friend.getAddress().equals(destAddress) && friend.getName().equals(destName)) + return true; + } + return false; + } + + public void removeFriend(ChatUnicodeString destAddress, ChatUnicodeString destName) { + Iterator it = friendsList.iterator(); + while(it.hasNext()) { + ChatFriend friend = it.next(); + if(friend.getAddress().equals(destAddress) && friend.getName().equals(destName)) + it.remove(); + } + } + + public boolean hasFriend(int avatarId) { + for(ChatFriend friend : friendsList) { + if(friend.getAvatarId() == avatarId) + return true; + } + return false; + } + + public ChatFriend getFriend(int avatarId) { + for(ChatFriend friend : friendsList) { + if(friend.getAvatarId() == avatarId) + return friend; + } + return null; + } + + public boolean hasIgnore(ChatUnicodeString destAddress, ChatUnicodeString destName) { + for(ChatIgnore ignore : ignoreList) { + if(ignore.getAddress().equals(destAddress) && ignore.getName().equals(destName)) + return true; + } + return false; + } + + public void removeIgnore(ChatUnicodeString destAddress, ChatUnicodeString destName) { + Iterator it = ignoreList.iterator(); + while(it.hasNext()) { + ChatIgnore ignore = it.next(); + if(ignore.getAddress().equals(destAddress) && ignore.getName().equals(destName)) + it.remove(); + } + } + + public boolean hasIgnore(int avatarId) { + for(ChatIgnore ignore : ignoreList) { + if(ignore.getAvatarId() == avatarId) + return true; + } + return false; + } + +} diff --git a/src/main/java/chat/ChatFriend.java b/src/main/java/chat/ChatFriend.java new file mode 100644 index 0000000..4b591f4 --- /dev/null +++ b/src/main/java/chat/ChatFriend.java @@ -0,0 +1,69 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.util.ChatUnicodeString; + +public class ChatFriend { + + private int avatarId; + private ChatUnicodeString name; + private ChatUnicodeString address; + private ChatUnicodeString comment; + private short status; + + public byte[] serialize() { + ByteBuffer buf = ByteBuffer.allocate(14 + name.getStringLength() * 2 + address.getStringLength() * 2 + comment.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.put(name.serialize()); + buf.put(address.serialize()); + buf.put(comment.serialize()); + buf.putShort(status); + return buf.array(); + } + + public ChatUnicodeString getComment() { + return comment; + } + + public void setComment(ChatUnicodeString comment) { + this.comment = comment; + } + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public short getStatus() { + return status; + } + + public void setStatus(short status) { + this.status = status; + } + + public String getFullAddress() { + return address.getString() + "+" + name.getString(); + } + +} diff --git a/src/main/java/chat/ChatIgnore.java b/src/main/java/chat/ChatIgnore.java new file mode 100644 index 0000000..ebf5e0f --- /dev/null +++ b/src/main/java/chat/ChatIgnore.java @@ -0,0 +1,45 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.util.ChatUnicodeString; + +public class ChatIgnore { + + private int avatarId; + private ChatUnicodeString name; + private ChatUnicodeString address; + + public byte[] serialize() { + ByteBuffer buf = ByteBuffer.allocate(8 + name.getStringLength() * 2 + address.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.put(name.serialize()); + buf.put(address.serialize()); + return buf.array(); + } + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + +} diff --git a/src/main/java/chat/ChatRoom.java b/src/main/java/chat/ChatRoom.java new file mode 100644 index 0000000..9c86ca8 --- /dev/null +++ b/src/main/java/chat/ChatRoom.java @@ -0,0 +1,376 @@ +package chat; + +import io.netty.buffer.ByteBuf; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import chat.protocol.GenericMessage; +import chat.util.ChatUnicodeString; + +public class ChatRoom { + + public static final int ROOMATTR_PRIVATE = 1 << 0; + public static final int ROOMATTR_MODERATED = 1 << 1; + public static final int ROOMATTR_PERSISTENT = 1 << 2; + public static final int ROOMATTR_LOCAL_WORLD = 1 << 4; + public static final int ROOMATTR_LOCAL_GAME = 1 << 5; + + private ChatUnicodeString creatorName; + private ChatUnicodeString creatorAddress; + private int creatorId; + private ChatUnicodeString roomName; + private ChatUnicodeString roomTopic; + private ChatUnicodeString roomPrefix = new ChatUnicodeString(); + private ChatUnicodeString roomAddress; + private ChatUnicodeString roomPassword; + private int roomAttributes; + private int maxRoomSize = Integer.MAX_VALUE; + private int roomId; + private int createTime; + private int nodeLevel; + /*private TIntList avatarList = new TIntArrayList(); + private TIntList adminList = new TIntArrayList(); + private TIntList moderatorList = new TIntArrayList(); + private TIntList tmpModList = new TIntArrayList(); + private TIntList banList = new TIntArrayList(); + private TIntList inviteList = new TIntArrayList(); + private TIntList voiceList = new TIntArrayList();*/ + + private List avatarList = new ArrayList<>(); + private List adminList = new ArrayList<>(); + private List moderatorList = new ArrayList<>(); + private List tmpModList = new ArrayList<>(); + private List banList = new ArrayList<>(); + private List inviteList = new ArrayList<>(); + private List voiceList = new ArrayList<>(); + + + public ChatUnicodeString getCreatorName() { + return creatorName; + } + + public void setCreatorName(ChatUnicodeString creatorName) { + this.creatorName = creatorName; + } + + public ChatUnicodeString getCreatorAddress() { + return creatorAddress; + } + + public void setCreatorAddress(ChatUnicodeString creatorAddress) { + this.creatorAddress = creatorAddress; + } + + public int getCreatorId() { + return creatorId; + } + + public void setCreatorId(int creatorId) { + this.creatorId = creatorId; + } + + public ChatUnicodeString getRoomName() { + return roomName; + } + + public void setRoomName(ChatUnicodeString roomName) { + this.roomName = roomName; + } + + public ChatUnicodeString getRoomTopic() { + return roomTopic; + } + + public void setRoomTopic(ChatUnicodeString roomTopic) { + this.roomTopic = roomTopic; + } + + public ChatUnicodeString getRoomPrefix() { + return roomPrefix; + } + + public void setRoomPrefix(ChatUnicodeString roomPrefix) { + this.roomPrefix = roomPrefix; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public ChatUnicodeString getRoomPassword() { + return roomPassword; + } + + public void setRoomPassword(ChatUnicodeString roomPassword) { + this.roomPassword = roomPassword; + } + + public int getRoomAttributes() { + return roomAttributes; + } + + public void setRoomAttributes(int roomAttributes) { + this.roomAttributes = roomAttributes; + } + + public int getMaxRoomSize() { + return maxRoomSize; + } + + public void setMaxRoomSize(int maxRoomSize) { + this.maxRoomSize = maxRoomSize; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public int getCreateTime() { + return createTime; + } + + public void setCreateTime(int createTime) { + this.createTime = createTime; + } + + public int getNodeLevel() { + return nodeLevel; + } + + public void setNodeLevel(int nodeLevel) { + this.nodeLevel = nodeLevel; + } + + public List getAvatarList() { + return avatarList; + } + + public void setAvatarList(List avatarList) { + this.avatarList = avatarList; + } + + public List getAdminList() { + return adminList; + } + + public void setAdminList(List adminList) { + this.adminList = adminList; + } + + public List getModeratorList() { + return moderatorList; + } + + public void setModeratorList(List moderatorList) { + this.moderatorList = moderatorList; + } + + public List getTmpModList() { + return tmpModList; + } + + public void setTmpModList(List tmpModList) { + this.tmpModList = tmpModList; + } + + public List getBanList() { + return banList; + } + + public void setBanList(List banList) { + this.banList = banList; + } + + public List getInviteList() { + return inviteList; + } + + public void setInviteList(List inviteList) { + this.inviteList = inviteList; + } + + public List getVoiceList() { + return voiceList; + } + + public void setVoiceList(List voiceList) { + this.voiceList = voiceList; + } + + public boolean isPrivate() { + return (getRoomAttributes() & ROOMATTR_PRIVATE) == ROOMATTR_PRIVATE; + } + + public boolean isModerated() { + return (getRoomAttributes() & ROOMATTR_MODERATED) == ROOMATTR_MODERATED; + } + + public boolean isPersistent() { + return (getRoomAttributes() & ROOMATTR_PERSISTENT) == ROOMATTR_PERSISTENT; + } + + public boolean isLocalWorld() { + return (getRoomAttributes() & ROOMATTR_LOCAL_WORLD) == ROOMATTR_LOCAL_WORLD; + } + + public boolean isLocalGame() { + return (getRoomAttributes() & ROOMATTR_LOCAL_GAME) == ROOMATTR_LOCAL_GAME; + } + + public byte[] serialize() { + ByteBuf buf = GenericMessage.alloc.buffer().order(ByteOrder.LITTLE_ENDIAN); + buf.writeBytes(creatorName.serialize()); + buf.writeBytes(creatorAddress.serialize()); + buf.writeInt(creatorId); + buf.writeBytes(roomName.serialize()); + buf.writeBytes(roomTopic.serialize()); + buf.writeBytes(roomPrefix.serialize()); + buf.writeBytes(roomAddress.serialize()); + buf.writeBytes(roomPassword.serialize()); + buf.writeInt(roomAttributes); + buf.writeInt(maxRoomSize); + buf.writeInt(roomId); + buf.writeInt(createTime); + buf.writeInt(nodeLevel); + buf.writeInt(avatarList.size()); + for(ChatAvatar avatar : avatarList) { + buf.writeBytes(avatar.serialize()); + } + buf.writeInt(adminList.size()); + for(ChatAvatar admin : adminList) { + buf.writeBytes(admin.serialize()); + } + buf.writeInt(moderatorList.size()); + for(ChatAvatar mod : moderatorList) { + buf.writeBytes(mod.serialize()); + } + buf.writeInt(tmpModList.size()); + for(ChatAvatar mod : tmpModList) { + buf.writeBytes(mod.serialize()); + } + buf.writeInt(banList.size()); + for(ChatAvatar banned : banList) { + buf.writeBytes(banned.serialize()); + } + buf.writeInt(inviteList.size()); + for(ChatAvatar invite : inviteList) { + buf.writeBytes(invite.serialize()); + } + buf.writeInt(voiceList.size()); + for(ChatAvatar voice : voiceList) { + buf.writeBytes(voice.serialize()); + } + ByteBuffer packet = ByteBuffer.allocate(buf.writerIndex()).order(ByteOrder.LITTLE_ENDIAN); + buf.getBytes(0, packet);buf.release(); + return packet.array(); + } + + public byte[] serializeSummary() { + ByteBuf buf = GenericMessage.alloc.buffer().order(ByteOrder.LITTLE_ENDIAN); + buf.writeBytes(roomAddress.serialize()); + buf.writeBytes(roomTopic.serialize()); + buf.writeInt(roomAttributes); + buf.writeInt(avatarList.size()); + buf.writeInt(maxRoomSize); + ByteBuffer packet = ByteBuffer.allocate(buf.writerIndex()).order(ByteOrder.LITTLE_ENDIAN); + buf.getBytes(0, packet);buf.release(); + return packet.array(); + } + + public void addAvatar(ChatAvatar avatar) { + avatarList.add(avatar); + } + + public void addAdmin(ChatAvatar avatar) { + adminList.add(avatar); + } + + public void removeAvatar(ChatAvatar avatar) { + avatarList.remove(avatar); + } + + public boolean isOnBanList(ChatAvatar avatar) { + return banList.contains(avatar); + } + + public boolean hasPassword() { + return !roomPassword.getString().equals(""); + } + + public boolean validatePassword(ChatUnicodeString roomPassword) { + return this.roomPassword.equals(roomPassword); + } + + public boolean isInRoom(ChatAvatar avatar) { + return avatarList.contains(avatar); + } + + public boolean isAdmin(ChatAvatar avatar) { + return adminList.contains(avatar); + } + + public boolean isOwner(ChatAvatar avatar) { + return creatorId == avatar.getAvatarId(); + } + + public void addModerator(ChatAvatar destAvatar) { + moderatorList.add(destAvatar); + } + + public boolean isModerator(ChatAvatar destAvatar) { + return moderatorList.contains(destAvatar); + } + + public void removeModerator(ChatAvatar destAvatar) { + moderatorList.remove(destAvatar); + } + + public boolean isBanned(ChatAvatar destAvatar) { + return banList.contains(destAvatar); + } + public boolean isInvited(ChatAvatar destAvatar) { + return inviteList.contains(destAvatar); + } + + public void addBan(ChatAvatar destAvatar) { + banList.add(destAvatar); + System.out.println("Banlist " + banList.toString()); + } + public void removeBan(ChatAvatar destAvatar) { + banList.remove(destAvatar); + System.out.println("Banlist " + banList.toString()); + } + + public void AddInvite(ChatAvatar destAvatar) { + inviteList.add(destAvatar); + System.out.println("added to inviteList " + inviteList); + } + public void RemoveInvite(ChatAvatar destAvatar) { + inviteList.remove(destAvatar); + System.out.println("removed from inviteList " + inviteList); + } + public void kickAvatar(ChatAvatar destAvatar) { + avatarList.remove(destAvatar); + //System.out.println("avatarList " + avatarList); + } + + public void clear() { + // TODO Auto-generated method stub + + } + + public void leaveRoom(ChatAvatar srcAvatarId) { + avatarList.remove(srcAvatarId); + //System.out.println("avatarList " + avatarList); + } + +} diff --git a/src/main/java/chat/PacketHandler.java b/src/main/java/chat/PacketHandler.java new file mode 100644 index 0000000..2c90b03 --- /dev/null +++ b/src/main/java/chat/PacketHandler.java @@ -0,0 +1,10 @@ +package chat; + +import java.nio.ByteBuffer; + +@FunctionalInterface +public interface PacketHandler { + + public void handle(ChatApiClient cluster, ByteBuffer packet); + +} diff --git a/src/main/java/chat/PersistentMessage.java b/src/main/java/chat/PersistentMessage.java new file mode 100644 index 0000000..bff5a46 --- /dev/null +++ b/src/main/java/chat/PersistentMessage.java @@ -0,0 +1,148 @@ +package chat; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import chat.util.ChatUnicodeString; + +public class PersistentMessage { + + // Header + private int messageId; + private int avatarId; + private int timestamp; + private int status; + private ChatUnicodeString senderName; + private ChatUnicodeString senderAddress; + private ChatUnicodeString subject; + private ChatUnicodeString folder; // not used in SWG and optional in API mail packets + private ChatUnicodeString category; // not used in SWG and optional in API mail packets + // + Body + private ChatUnicodeString message; + private ChatUnicodeString oob; + private int fetchResult; + + public int getMessageId() { + return messageId; + } + + public void setMessageId(int messageId) { + this.messageId = messageId; + } + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public int getTimestamp() { + return timestamp; + } + + public void setTimestamp(int timestamp) { + this.timestamp = timestamp; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public ChatUnicodeString getSenderName() { + return senderName; + } + + public void setSenderName(ChatUnicodeString senderName) { + this.senderName = senderName; + } + + public ChatUnicodeString getSenderAddress() { + return senderAddress; + } + + public void setSenderAddress(ChatUnicodeString senderAddress) { + this.senderAddress = senderAddress; + } + + public ChatUnicodeString getSubject() { + return subject; + } + + public void setSubject(ChatUnicodeString subject) { + this.subject = subject; + } + + public ChatUnicodeString getFolder() { + return folder; + } + + public void setFolder(ChatUnicodeString folder) { + this.folder = folder; + } + + public ChatUnicodeString getCategory() { + return category; + } + + public void setCategory(ChatUnicodeString category) { + this.category = category; + } + + public ChatUnicodeString getMessage() { + return message; + } + + public void setMessage(ChatUnicodeString message) { + this.message = message; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + + public int getFetchResult() { + return fetchResult; + } + + public void setFetchResult(int fetchResult) { + this.fetchResult = fetchResult; + } + + public byte[] serializeHeader() { + ByteBuffer buf = ByteBuffer.allocate(28 + senderName.getStringLength() * 2 + senderAddress.getStringLength() * 2 + subject.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(messageId); + buf.putInt(avatarId); + buf.put(senderName.serialize()); + buf.put(senderAddress.serialize()); + buf.put(subject.serialize()); + buf.putInt(timestamp); + buf.putInt(status); + return buf.array(); + } + + public byte[] serialize() { + ByteBuffer buf = ByteBuffer.allocate(36 + senderName.getStringLength() * 2 + senderAddress.getStringLength() * 2 + subject.getStringLength() * 2 + message.getStringLength() * 2 + oob.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(messageId); + buf.putInt(avatarId); + buf.put(senderName.serialize()); + buf.put(senderAddress.serialize()); + buf.put(subject.serialize()); + buf.putInt(timestamp); + buf.putInt(status); + buf.put(message.serialize()); + buf.put(oob.serialize()); + return buf.array(); + } + + + +} diff --git a/src/main/java/chat/protocol/GenericMessage.java b/src/main/java/chat/protocol/GenericMessage.java new file mode 100644 index 0000000..01e28a3 --- /dev/null +++ b/src/main/java/chat/protocol/GenericMessage.java @@ -0,0 +1,80 @@ +package chat.protocol; + +import java.nio.ByteBuffer; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.PooledByteBufAllocator; + +public abstract class GenericMessage { + + public static final ByteBufAllocator alloc = PooledByteBufAllocator.DEFAULT; + + protected short type; + + public final short getType() { + return type; + } + + protected void writeSize(ByteBuffer buf) { + int size = buf.capacity(); + buf.putInt(0, ((size & 0xff) << 24 | (size & 0xff00) << 8 | (size & 0xff0000) >> 8 | (size >> 24) & 0xff)); + } + + public abstract ByteBuffer serialize(); + + public abstract void deserialize(ByteBuffer buf); + + public static final short MESSAGE_INSTANTMESSAGE = 0; + public static final short MESSAGE_ROOMMESSAGE = 1; + public static final short MESSAGE_BROADCASTMESSAGE = 2; + public static final short MESSAGE_FRIENDLOGIN = 3; + public static final short MESSAGE_FRIENDLOGOUT = 4; + public static final short MESSAGE_KICKROOM = 5; + public static final short MESSAGE_ADDMODERATORROOM = 6; + public static final short MESSAGE_REMOVEMODERATORROOM = 7; + public static final short MESSAGE_REMOVEMODERATORAVATAR = 8; + public static final short MESSAGE_ADDBANROOM = 9; + public static final short MESSAGE_REMOVEBANROOM = 10; + public static final short MESSAGE_REMOVEBANAVATAR = 11; + public static final short MESSAGE_ADDINVITEROOM = 12; + public static final short MESSAGE_ADDINVITEAVATAR = 13; + public static final short MESSAGE_REMOVEINVITEROOM = 14; + public static final short MESSAGE_REMOVEINVITEAVATAR = 15; + public static final short MESSAGE_ENTERROOM = 16; + public static final short MESSAGE_LEAVEROOM = 17; + public static final short MESSAGE_DESTROYROOM = 18; + public static final short MESSAGE_SETROOMPARAMS = 19; + public static final short MESSAGE_PERSISTENTMESSAGE = 20; + public static final short MESSAGE_FORCEDLOGOUT = 21; + public static final short MESSAGE_UNREGISTERROOMREADY = 22; + public static final short MESSAGE_KICKAVATAR = 23; + public static final short MESSAGE_ADDMODERATORAVATAR = 24; + public static final short MESSAGE_ADDBANAVATAR = 25; + public static final short MESSAGE_ADDADMIN = 26; + public static final short MESSAGE_REMOVEADMIN = 27; + public static final short MESSAGE_FRIENDCONFIRMREQUEST = 28; + public static final short MESSAGE_FRIENDCONFIRMRESPONSE = 29; + public static final short MESSAGE_CHANGEROOMOWNER = 30; + public static final short MESSAGE_FORCEROOMFAILOVER = 31; + public static final short MESSAGE_ADDTEMPORARYMODERATORROOM = 32; + public static final short MESSAGE_ADDTEMPORARYMODERATORAVATAR = 33; + public static final short MESSAGE_REMOVETEMPORARYMODERATORROOM = 34; + public static final short MESSAGE_REMOVETEMPORARYMODERATORAVATAR = 35; + public static final short MESSAGE_GRANTVOICEROOM = 36; + public static final short MESSAGE_GRANTVOICEAVATAR = 37; + public static final short MESSAGE_REVOKEVOICEROOM = 38; + public static final short MESSAGE_REVOKEVOICEAVATAR = 39; + public static final short MESSAGE_SNOOP = 40; + public static final short MESSAGE_UIDLIST = 41; + public static final short MESSAGE_REQUESTROOMENTRY = 42; + public static final short MESSAGE_DELAYEDROOMENTRY = 43; + public static final short MESSAGE_DENIEDROOMENTRY = 44; + public static final short MESSAGE_FRIENDSTATUS = 45; + public static final short MESSAGE_FRIENDCONFIRMRECIPROCATE_REQUEST = 46; + public static final short MESSAGE_FRIENDCONFIRMRECIPROCATE_RESPONSE = 47; + public static final short MESSAGE_FILTERMESSAGE = 48; + public static final short MESSAGE_FAILOVER_AVATAR_LIST = 49; + public static final short MESSAGE_NOTIFY_FRIENDS_LIST_CHANGE = 50; + public static final short MESSAGE_NOTIFY_FRIEND_IS_REMOVED = 51; + + +} diff --git a/src/main/java/chat/protocol/GenericRequest.java b/src/main/java/chat/protocol/GenericRequest.java new file mode 100644 index 0000000..34b571c --- /dev/null +++ b/src/main/java/chat/protocol/GenericRequest.java @@ -0,0 +1,102 @@ +package chat.protocol; + +public abstract class GenericRequest extends GenericMessage { + + protected int track; + private long timeout; + + public int getTrack() { + return track; + } + + public void setTrack(int track) { + this.track = track; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public static final short REQUEST_LOGINAVATAR = 0; + public static final short REQUEST_LOGOUTAVATAR = 1; + public static final short REQUEST_DESTROYAVATAR = 2; + public static final short REQUEST_GETAVATAR = 3; + public static final short REQUEST_CREATEROOM = 4; + public static final short REQUEST_DESTROYROOM = 5; + public static final short REQUEST_SENDINSTANTMESSAGE = 6; + public static final short REQUEST_SENDROOMMESSAGE = 7; + public static final short REQUEST_SENDBROADCASTMESSAGE = 8; + public static final short REQUEST_ADDFRIEND = 9; + public static final short REQUEST_REMOVEFRIEND = 10; + public static final short REQUEST_FRIENDSTATUS = 11; + public static final short REQUEST_ADDIGNORE = 12; + public static final short REQUEST_REMOVEIGNORE = 13; + public static final short REQUEST_ENTERROOM = 14; + public static final short REQUEST_LEAVEROOM = 15; + public static final short REQUEST_ADDMODERATOR = 16; + public static final short REQUEST_REMOVEMODERATOR = 17; + public static final short REQUEST_ADDBAN = 18; + public static final short REQUEST_REMOVEBAN = 19; + public static final short REQUEST_ADDINVITE = 20; + public static final short REQUEST_REMOVEINVITE = 21; + public static final short REQUEST_KICKAVATAR = 22; + public static final short REQUEST_SETROOMPARAMS = 23; + public static final short REQUEST_GETROOM = 24; + public static final short REQUEST_GETROOMSUMMARIES = 25; + public static final short REQUEST_SENDPERSISTENTMESSAGE = 26; + public static final short REQUEST_GETPERSISTENTHEADERS = 27; + public static final short REQUEST_GETPERSISTENTMESSAGE = 28; + public static final short REQUEST_UPDATEPERSISTENTMESSAGE = 29; + public static final short REQUEST_UNREGISTERROOM = 30; + public static final short REQUEST_IGNORESTATUS = 31; + public static final short REQUEST_FAILOVER_RELOGINAVATAR = 32; + public static final short REQUEST_FAILOVER_RECREATEROOM = 33; + public static final short REQUEST_CONFIRMFRIEND = 34; + public static final short REQUEST_GETAVATARKEYWORDS = 35; + public static final short REQUEST_SETAVATARKEYWORDS = 36; + public static final short REQUEST_SEARCHAVATARKEYWORDS = 37; + public static final short REQUEST_GETFANCLUBHANDLE = 38; + public static final short REQUEST_UPDATEPERSISTENTMESSAGES = 39; + public static final short REQUEST_FINDAVATARBYUID = 40; + public static final short REQUEST_CHANGEROOMOWNER = 41; + public static final short REQUEST_SETAPIVERSION = 42; + public static final short REQUEST_ADDTEMPORARYMODERATOR = 43; + public static final short REQUEST_REMOVETEMPORARYMODERATOR = 44; + public static final short REQUEST_GRANTVOICE = 45; + public static final short REQUEST_REVOKEVOICE = 46; + public static final short REQUEST_SETAVATARATTRIBUTES = 47; + public static final short REQUEST_ADDSNOOPAVATAR = 48; + public static final short REQUEST_REMOVESNOOPAVATAR = 49; + public static final short REQUEST_ADDSNOOPROOM = 50; + public static final short REQUEST_REMOVESNOOPROOM = 51; + public static final short REQUEST_GETSNOOPLIST = 52; + public static final short REQUEST_PARTIALPERSISTENTHEADERS = 53; + public static final short REQUEST_COUNTPERSISTENTMESSAGES = 54; + public static final short REQUEST_PURGEPERSISTENTMESSAGES = 55; + public static final short REQUEST_SETFRIENDCOMMENT = 56; + public static final short REQUEST_TRANSFERAVATAR = 57; + public static final short REQUEST_CHANGEPERSISTENTFOLDER = 58; + public static final short REQUEST_ALLOWROOMENTRY = 59; + public static final short REQUEST_SETAVATAREMAIL = 60; + public static final short REQUEST_SETAVATARINBOXLIMIT = 61; + public static final short REQUEST_SENDMULTIPLEPERSISTENTMESSAGES = 62; + public static final short REQUEST_GETMULTIPLEPERSISTENTMESSAGES = 63; + public static final short REQUEST_ALTERPERISTENTMESSAGE = 64; + public static final short REQUEST_GETANYAVATAR = 65; + public static final short REQUEST_TEMPORARYAVATAR = 66; + public static final short REQUEST_AVATARLIST = 67; + public static final short REQUEST_SETAVATARSTATUSMESSAGE = 68; + public static final short REQUEST_CONFIRMFRIEND_RECIPROCATE = 69; + public static final short REQUEST_ADDFRIEND_RECIPROCATE = 70; + public static final short REQUEST_REMOVEFRIEND_RECIPROCATE = 71; + public static final short REQUEST_FILTERMESSAGE = 72; + public static final short REQUEST_FILTERMESSAGE_EX = 73; + + public static final short REQUEST_REGISTRAR_GETCHATSERVER = 20001; + + +} diff --git a/src/main/java/chat/protocol/GenericResponse.java b/src/main/java/chat/protocol/GenericResponse.java new file mode 100644 index 0000000..3479da9 --- /dev/null +++ b/src/main/java/chat/protocol/GenericResponse.java @@ -0,0 +1,112 @@ +package chat.protocol; + +import chat.protocol.response.ResponseResult; + +public abstract class GenericResponse extends GenericMessage { + + protected int track; + private long timeout; + protected ResponseResult result = ResponseResult.CHATRESULT_TIMEOUT; + + public int getTrack() { + return track; + } + + public void setTrack(int track) { + this.track = track; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public ResponseResult getResult() { + return result; + } + + public void setResult(ResponseResult result) { + this.result = result; + } + + public static final short RESPONSE_LOGINAVATAR = 0; + public static final short RESPONSE_LOGOUTAVATAR = 1; + public static final short RESPONSE_DESTROYAVATAR = 2; + public static final short RESPONSE_GETAVATAR = 3; + public static final short RESPONSE_CREATEROOM = 4; + public static final short RESPONSE_DESTROYROOM = 5; + public static final short RESPONSE_SENDINSTANTMESSAGE = 6; + public static final short RESPONSE_SENDROOMMESSAGE = 7; + public static final short RESPONSE_SENDBROADCASTMESSAGE = 8; + public static final short RESPONSE_ADDFRIEND = 9; + public static final short RESPONSE_REMOVEFRIEND = 10; + public static final short RESPONSE_FRIENDSTATUS = 11; + public static final short RESPONSE_ADDIGNORE = 12; + public static final short RESPONSE_REMOVEIGNORE = 13; + public static final short RESPONSE_ENTERROOM = 14; + public static final short RESPONSE_LEAVEROOM = 15; + public static final short RESPONSE_ADDMODERATOR = 16; + public static final short RESPONSE_REMOVEMODERATOR = 17; + public static final short RESPONSE_ADDBAN = 18; + public static final short RESPONSE_REMOVEBAN = 19; + public static final short RESPONSE_ADDINVITE = 20; + public static final short RESPONSE_REMOVEINVITE = 21; + public static final short RESPONSE_KICKAVATAR = 22; + public static final short RESPONSE_SETROOMPARAMS = 23; + public static final short RESPONSE_GETROOM = 24; + public static final short RESPONSE_GETROOMSUMMARIES = 25; + public static final short RESPONSE_SENDPERSISTENTMESSAGE = 26; + public static final short RESPONSE_GETPERSISTENTHEADERS = 27; + public static final short RESPONSE_GETPERSISTENTMESSAGE = 28; + public static final short RESPONSE_UPDATEPERSISTENTMESSAGE = 29; + public static final short RESPONSE_UNREGISTERROOM = 30; + public static final short RESPONSE_IGNORESTATUS = 31; + public static final short RESPONSE_FAILOVER_RELOGINAVATAR = 32; + public static final short RESPONSE_FAILOVER_RECREATEROOM = 33; + public static final short RESPONSE_CONFIRMFRIEND = 34; + public static final short RESPONSE_GETAVATARKEYWORDS = 35; + public static final short RESPONSE_SETAVATARKEYWORDS = 36; + public static final short RESPONSE_SEARCHAVATARKEYWORDS = 37; + public static final short RESPONSE_GETFANCLUBHANDLE = 38; + public static final short RESPONSE_UPDATEPERSISTENTMESSAGES = 39; + public static final short RESPONSE_FINDAVATARBYUID = 40; + public static final short RESPONSE_CHANGEROOMOWNER = 41; + public static final short RESPONSE_SETAPIVERSION = 42; + public static final short RESPONSE_ADDTEMPORARYMODERATOR = 43; + public static final short RESPONSE_REMOVETEMPORARYMODERATOR = 44; + public static final short RESPONSE_GRANTVOICE = 45; + public static final short RESPONSE_REVOKEVOICE = 46; + public static final short RESPONSE_SETAVATARATTRIBUTES = 47; + public static final short RESPONSE_ADDSNOOPAVATAR = 48; + public static final short RESPONSE_REMOVESNOOPAVATAR = 49; + public static final short RESPONSE_ADDSNOOPROOM = 50; + public static final short RESPONSE_REMOVESNOOPROOM = 51; + public static final short RESPONSE_GETSNOOPLIST = 52; + public static final short RESPONSE_PARTIALPERSISTENTHEADERS = 53; + public static final short RESPONSE_COUNTPERSISTENTMESSAGES = 54; + public static final short RESPONSE_PURGEPERSISTENTMESSAGES = 55; + public static final short RESPONSE_SETFRIENDCOMMENT = 56; + public static final short RESPONSE_TRANSFERAVATAR = 57; + public static final short RESPONSE_CHANGEPERSISTENTFOLDER = 58; + public static final short RESPONSE_ALLOWROOMENTRY = 59; + public static final short RESPONSE_SETAVATAREMAIL = 60; + public static final short RESPONSE_SETAVATARINBOXLIMIT = 61; + public static final short RESPONSE_SENDMULTIPLEPERSISTENTMESSAGES = 62; + public static final short RESPONSE_GETMULTIPLEPERSISTENTMESSAGES = 63; + public static final short RESPONSE_ALTERPERSISTENTMESSAGE = 64; + public static final short RESPONSE_GETANYAVATAR = 65; + public static final short RESPONSE_TEMPORARYAVATAR = 66; + public static final short RESPONSE_AVATARLIST = 67; + public static final short RESPONSE_SETSTATUSMESSAGE = 68; + public static final short RESPONSE_CONFIRMFRIEND_RECIPROCATE = 69; + public static final short RESPONSE_ADDFRIEND_RECIPROCATE = 70; + public static final short RESPONSE_REMOVEFRIEND_RECIPROCATE = 71; + public static final short RESPONSE_FILTERMESSAGE = 72; + public static final short RESPONSE_FILTERMESSAGE_EX = 73; + + public static final short RESPONSE_REGISTRAR_GETCHATSERVER = 20001; + +} diff --git a/src/main/java/chat/protocol/message/MDestroyRoom.java b/src/main/java/chat/protocol/message/MDestroyRoom.java new file mode 100644 index 0000000..448ca4a --- /dev/null +++ b/src/main/java/chat/protocol/message/MDestroyRoom.java @@ -0,0 +1,58 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericMessage; + +public class MDestroyRoom extends GenericMessage { + + private ChatAvatar srcAvatar; + private int roomId; + + public MDestroyRoom() { + type = MESSAGE_DESTROYROOM; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = srcAvatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(14 + avatarBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.put(avatarBuf); + buf.putInt(roomId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatAvatar getSrcAvatar() { + return srcAvatar; + } + + public void setSrcAvatar(ChatAvatar srcAvatar) { + this.srcAvatar = srcAvatar; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + +} diff --git a/src/main/java/chat/protocol/message/MEnterRoom.java b/src/main/java/chat/protocol/message/MEnterRoom.java new file mode 100644 index 0000000..0e6f500 --- /dev/null +++ b/src/main/java/chat/protocol/message/MEnterRoom.java @@ -0,0 +1,104 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericMessage; +import chat.util.ChatUnicodeString; + +public class MEnterRoom extends GenericMessage { + + private ChatAvatar srcAvatar; + private ChatAvatar Creator; + private int roomId; + private int SrcAvatarId; + private ChatUnicodeString AvatarName; + private ChatUnicodeString AvatarAddress; + private ChatUnicodeString RoomAddress; + private ChatUnicodeString Gateway; + private ChatUnicodeString Server; + + public MEnterRoom() { + type = MESSAGE_ENTERROOM; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = srcAvatar.serialize(); + //byte[] CreatorBuf = Creator.serialize(); + //ByteBuffer buf = ByteBuffer.allocate(30 + avatarBuf.length + AvatarName.getStringLength() * 2 + AvatarAddress.getStringLength() * 2 + Gateway.getStringLength() * 2 + Server.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + ByteBuffer buf = ByteBuffer.allocate(14 + avatarBuf.length ).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + + //buf.put(CreatorBuf); + //buf.putInt(roomId); + //buf.putInt(SrcAvatarId); + //buf.putInt(0); + buf.put(avatarBuf); + //buf.put(AvatarAddress.serialize()); + //buf.put(AvatarName.serialize()); + //buf.put(Gateway.serialize()); + //buf.put(Server.serialize()); + //buf.putInt(0); + + //buf.put(RoomAddress.serialize()); + buf.putInt(roomId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatAvatar getSrcAvatar() { + return srcAvatar; + } + + public void setSrcAvatar(ChatAvatar srcAvatar) { + this.srcAvatar = srcAvatar; + } + + public void setCreator(ChatAvatar Creator) { + this.Creator = Creator; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public void setSrcAvatarId(int SrcAvatarId) { + this.SrcAvatarId = SrcAvatarId; + } + + public void setAvatarName(ChatUnicodeString AvatarName) { + this.AvatarName = AvatarName; + } + + public void setAvatarAddress(ChatUnicodeString AvatarAddress) { + this.AvatarAddress = AvatarAddress; + } + + public void setGateway(ChatUnicodeString Gateway) { + this.Gateway = Gateway; + } + + public void setServer(ChatUnicodeString Server) { + this.Server = Server; + } + +} diff --git a/src/main/java/chat/protocol/message/MForcedLogout.java b/src/main/java/chat/protocol/message/MForcedLogout.java new file mode 100644 index 0000000..4ada27c --- /dev/null +++ b/src/main/java/chat/protocol/message/MForcedLogout.java @@ -0,0 +1,89 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatAvatar; +import chat.ChatRoom; +import chat.protocol.GenericMessage; +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; + +public class MForcedLogout extends GenericMessage { + + private int destRoomId; + private List extraRooms = new ArrayList(); + private int roomId; + private boolean gotRoom = true; + private TIntList destAvatarIdList = new TIntArrayList(); + private ChatAvatar avatar; + int SrcAvatarId; + + public MForcedLogout() { + type = MESSAGE_FORCEDLOGOUT; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + //buf.putInt(destAvatarIdList.size()); + //for(int avatarId : destAvatarIdList.toArray()) { + // buf.putInt(avatarId); + //} + buf.putInt(SrcAvatarId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + + public void setSrcAvatarId(int SrcAvatarId) { + this.SrcAvatarId = SrcAvatarId; + } + + public void setGotRoom(boolean b) { + this.gotRoom = gotRoom; + + } + public boolean isGotRoom() { + return gotRoom; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public void setDestAvatarIdList(TIntList destAvatarIdList) { + this.destAvatarIdList = destAvatarIdList; + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + +} \ No newline at end of file diff --git a/src/main/java/chat/protocol/message/MFriendLogin.java b/src/main/java/chat/protocol/message/MFriendLogin.java new file mode 100644 index 0000000..880e82b --- /dev/null +++ b/src/main/java/chat/protocol/message/MFriendLogin.java @@ -0,0 +1,74 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class MFriendLogin extends GenericRequest { + + private ChatAvatar friendAvatar; + private ChatUnicodeString friendAddress; + private int destAvatarId; + private ChatUnicodeString friendStatus = new ChatUnicodeString(); + + public MFriendLogin() { + type = MESSAGE_FRIENDLOGIN; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = friendAvatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(22 + avatarBuf.length + friendAddress.getStringLength() * 2 + friendStatus.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.put(avatarBuf); + buf.put(friendAddress.serialize()); + buf.putInt(destAvatarId); + buf.put(friendStatus.serialize()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatAvatar getFriendAvatar() { + return friendAvatar; + } + + public void setFriendAvatar(ChatAvatar friendAvatar) { + this.friendAvatar = friendAvatar; + } + + public ChatUnicodeString getFriendAddress() { + return friendAddress; + } + + public void setFriendAddress(ChatUnicodeString friendAddress) { + this.friendAddress = friendAddress; + } + + public int getDestAvatarId() { + return destAvatarId; + } + + public void setDestAvatarId(int destAvatarId) { + this.destAvatarId = destAvatarId; + } + + public ChatUnicodeString getFriendStatus() { + return friendStatus; + } + + public void setFriendStatus(ChatUnicodeString friendStatus) { + this.friendStatus = friendStatus; + } + +} diff --git a/src/main/java/chat/protocol/message/MFriendLogout.java b/src/main/java/chat/protocol/message/MFriendLogout.java new file mode 100644 index 0000000..231a90c --- /dev/null +++ b/src/main/java/chat/protocol/message/MFriendLogout.java @@ -0,0 +1,64 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class MFriendLogout extends GenericRequest { + + private ChatAvatar friendAvatar; + private ChatUnicodeString friendAddress; + private int destAvatarId; + + public MFriendLogout() { + type = MESSAGE_FRIENDLOGOUT; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = friendAvatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(18 + avatarBuf.length + friendAddress.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.put(avatarBuf); + buf.put(friendAddress.serialize()); + buf.putInt(destAvatarId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatAvatar getFriendAvatar() { + return friendAvatar; + } + + public void setFriendAvatar(ChatAvatar friendAvatar) { + this.friendAvatar = friendAvatar; + } + + public ChatUnicodeString getFriendAddress() { + return friendAddress; + } + + public void setFriendAddress(ChatUnicodeString friendAddress) { + this.friendAddress = friendAddress; + } + + public int getDestAvatarId() { + return destAvatarId; + } + + public void setDestAvatarId(int destAvatarId) { + this.destAvatarId = destAvatarId; + } + +} diff --git a/src/main/java/chat/protocol/message/MLeaveRoom.java b/src/main/java/chat/protocol/message/MLeaveRoom.java new file mode 100644 index 0000000..c4ffede --- /dev/null +++ b/src/main/java/chat/protocol/message/MLeaveRoom.java @@ -0,0 +1,90 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatAvatar; +import chat.ChatRoom; +import chat.protocol.GenericMessage; +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; + +public class MLeaveRoom extends GenericMessage { + + private int destRoomId; + private List extraRooms = new ArrayList(); + private int roomId; + private boolean gotRoom = true; + private TIntList destAvatarIdList = new TIntArrayList(); + private ChatAvatar avatar; + int SrcAvatarId; + + public MLeaveRoom() { + type = MESSAGE_LEAVEROOM; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + //buf.putInt(destAvatarIdList.size()); + //for(int avatarId : destAvatarIdList.toArray()) { + // buf.putInt(avatarId); + //} + buf.putInt(SrcAvatarId); + buf.putInt(roomId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + + public void setSrcAvatarId(int SrcAvatarId) { + this.SrcAvatarId = SrcAvatarId; + } + + public void setGotRoom(boolean b) { + this.gotRoom = gotRoom; + + } + public boolean isGotRoom() { + return gotRoom; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public void setDestAvatarIdList(TIntList destAvatarIdList) { + this.destAvatarIdList = destAvatarIdList; + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + +} \ No newline at end of file diff --git a/src/main/java/chat/protocol/message/MPersistentMessage.java b/src/main/java/chat/protocol/message/MPersistentMessage.java new file mode 100644 index 0000000..6a442d1 --- /dev/null +++ b/src/main/java/chat/protocol/message/MPersistentMessage.java @@ -0,0 +1,43 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.PersistentMessage; +import chat.protocol.GenericMessage; + +public class MPersistentMessage extends GenericMessage { + + private PersistentMessage pm; + + public MPersistentMessage() { + type = MESSAGE_PERSISTENTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + byte[] pmBuf = pm.serializeHeader(); + ByteBuffer buf = ByteBuffer.allocate(14 + pmBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.putInt(pm.getAvatarId()); + buf.put(pmBuf); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public PersistentMessage getPm() { + return pm; + } + + public void setPm(PersistentMessage pm) { + this.pm = pm; + } + +} diff --git a/src/main/java/chat/protocol/message/MRoomMessage.java b/src/main/java/chat/protocol/message/MRoomMessage.java new file mode 100644 index 0000000..5e73cbf --- /dev/null +++ b/src/main/java/chat/protocol/message/MRoomMessage.java @@ -0,0 +1,100 @@ +package chat.protocol.message; + +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericMessage; +import chat.util.ChatUnicodeString; + +public class MRoomMessage extends GenericMessage { + + private ChatUnicodeString message; + private ChatUnicodeString oob; + private int roomId; + private TIntList destAvatarIdList = new TIntArrayList(); + private int messageId; + private ChatAvatar avatar; + + public MRoomMessage() { + type = MESSAGE_ROOMMESSAGE; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = avatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(30 + avatarBuf.length + message.getStringLength() * 2 + oob.getStringLength() * 2 + destAvatarIdList.size() * 4).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.put(avatarBuf); + buf.putInt(roomId); + buf.putInt(destAvatarIdList.size()); + for(int avatarId : destAvatarIdList.toArray()) { + buf.putInt(avatarId); + } + buf.put(message.serialize()); + buf.put(oob.serialize()); + buf.putInt(messageId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatUnicodeString getMessage() { + return message; + } + + public void setMessage(ChatUnicodeString message) { + this.message = message; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public TIntList getDestAvatarIdList() { + return destAvatarIdList; + } + + public void setDestAvatarIdList(TIntList destAvatarIdList) { + this.destAvatarIdList = destAvatarIdList; + } + + public int getMessageId() { + return messageId; + } + + public void setMessageId(int messageId) { + this.messageId = messageId; + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + +} diff --git a/src/main/java/chat/protocol/message/MSendInstantMessage.java b/src/main/java/chat/protocol/message/MSendInstantMessage.java new file mode 100644 index 0000000..40b7bc8 --- /dev/null +++ b/src/main/java/chat/protocol/message/MSendInstantMessage.java @@ -0,0 +1,74 @@ +package chat.protocol.message; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericMessage; +import chat.util.ChatUnicodeString; + +public class MSendInstantMessage extends GenericMessage { + + private ChatAvatar srcAvatar; + private int destAvatarId; + private ChatUnicodeString message; + private ChatUnicodeString oob; + + public MSendInstantMessage() { + type = MESSAGE_INSTANTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = srcAvatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(22 + avatarBuf.length + message.getStringLength() * 2 + oob.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(0); + buf.put(avatarBuf); + buf.putInt(destAvatarId); + buf.put(message.serialize()); + buf.put(oob.serialize()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatAvatar getSrcAvatar() { + return srcAvatar; + } + + public void setSrcAvatar(ChatAvatar srcAvatar) { + this.srcAvatar = srcAvatar; + } + + public int getDestAvatarId() { + return destAvatarId; + } + + public void setDestAvatarId(int destAvatarId) { + this.destAvatarId = destAvatarId; + } + + public ChatUnicodeString getMessage() { + return message; + } + + public void setMessage(ChatUnicodeString message) { + this.message = message; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + +} diff --git a/src/main/java/chat/protocol/request/RAddBan.java b/src/main/java/chat/protocol/request/RAddBan.java new file mode 100644 index 0000000..ebc9feb --- /dev/null +++ b/src/main/java/chat/protocol/request/RAddBan.java @@ -0,0 +1,74 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RAddBan extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RAddFriend.java b/src/main/java/chat/protocol/request/RAddFriend.java new file mode 100644 index 0000000..b5bead1 --- /dev/null +++ b/src/main/java/chat/protocol/request/RAddFriend.java @@ -0,0 +1,82 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RAddFriend extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString comment = new ChatUnicodeString(); + private boolean confirm; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destName.deserialize(buf); + destAddress.deserialize(buf); + comment.deserialize(buf); + confirm = buf.get() != 0; + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getComment() { + return comment; + } + + public void setComment(ChatUnicodeString comment) { + this.comment = comment; + } + + public boolean isConfirm() { + return confirm; + } + + public void setConfirm(boolean confirm) { + this.confirm = confirm; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RAddIgnore.java b/src/main/java/chat/protocol/request/RAddIgnore.java new file mode 100644 index 0000000..22bee47 --- /dev/null +++ b/src/main/java/chat/protocol/request/RAddIgnore.java @@ -0,0 +1,63 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RAddIgnore extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destName.deserialize(buf); + destAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RAddInvite.java b/src/main/java/chat/protocol/request/RAddInvite.java new file mode 100644 index 0000000..82096de --- /dev/null +++ b/src/main/java/chat/protocol/request/RAddInvite.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RAddInvite extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RAddModerator.java b/src/main/java/chat/protocol/request/RAddModerator.java new file mode 100644 index 0000000..c4f5ce5 --- /dev/null +++ b/src/main/java/chat/protocol/request/RAddModerator.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RAddModerator extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RCreateRoom.java b/src/main/java/chat/protocol/request/RCreateRoom.java new file mode 100644 index 0000000..eaa29a7 --- /dev/null +++ b/src/main/java/chat/protocol/request/RCreateRoom.java @@ -0,0 +1,105 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RCreateRoom extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + private ChatUnicodeString roomName = new ChatUnicodeString(); + private ChatUnicodeString roomTopic = new ChatUnicodeString(); + private ChatUnicodeString roomPassword = new ChatUnicodeString(); + private int roomAttributes; + private int maxRoomSize; + private int roomID; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + roomName.deserialize(buf); + roomTopic.deserialize(buf); + roomPassword.deserialize(buf); + roomAttributes = buf.getInt(); + maxRoomSize = buf.getInt(); + roomAddress.deserialize(buf); + srcAddress.deserialize(buf); + + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public int getRoomAttributes() { + return roomAttributes; + } + + public void setRoomAttributes(int roomAttributes) { + this.roomAttributes = roomAttributes; + } + + public ChatUnicodeString getRoomName() { + return roomName; + } + + public void setRoomName(ChatUnicodeString roomName) { + this.roomName = roomName; + } + + public ChatUnicodeString getRoomTopic() { + return roomTopic; + } + + public void setRoomTopic(ChatUnicodeString roomTopic) { + this.roomTopic = roomTopic; + } + + public ChatUnicodeString getRoomPassword() { + return roomPassword; + } + + public void setRoomPassword(ChatUnicodeString roomPassword) { + this.roomPassword = roomPassword; + } + + public int getMaxRoomSize() { + return maxRoomSize; + } + + public void setMaxRoomSize(int maxRoomSize) { + this.maxRoomSize = maxRoomSize; + } + +} diff --git a/src/main/java/chat/protocol/request/RDestroyAvatar.java b/src/main/java/chat/protocol/request/RDestroyAvatar.java new file mode 100644 index 0000000..a1b11b8 --- /dev/null +++ b/src/main/java/chat/protocol/request/RDestroyAvatar.java @@ -0,0 +1,44 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RDestroyAvatar extends GenericRequest { + + private int avatarId; + private ChatUnicodeString address = new ChatUnicodeString(); + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + avatarId = buf.getInt(); + address.deserialize(buf); + } + + +} diff --git a/src/main/java/chat/protocol/request/RDestroyRoom.java b/src/main/java/chat/protocol/request/RDestroyRoom.java new file mode 100644 index 0000000..ecbfd71 --- /dev/null +++ b/src/main/java/chat/protocol/request/RDestroyRoom.java @@ -0,0 +1,72 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RDestroyRoom extends GenericRequest { + + private int srcAvatarId; + private int RoomId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + + + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + roomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18 + roomAddress.getStringLength() * 2 + srcAddress.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + //buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(srcAvatarId); + buf.put(roomAddress.serialize()); + buf.put(srcAddress.serialize()); + writeSize(buf); + return buf; + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public void setRoomId(int RoomId) { + this.RoomId = RoomId; + } + + public void setTrack(int track) { + this.track = track; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/REnterRoom.java b/src/main/java/chat/protocol/request/REnterRoom.java new file mode 100644 index 0000000..aa17c4e --- /dev/null +++ b/src/main/java/chat/protocol/request/REnterRoom.java @@ -0,0 +1,133 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class REnterRoom extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + private ChatUnicodeString roomPassword = new ChatUnicodeString(); + private boolean passiveCreate; + private int roomAttributes; + private int maxRoomSize; + private ChatUnicodeString roomTopic = new ChatUnicodeString(); + private boolean requestingEntry; // not used for SWG + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(42 + roomAddress.getStringLength() * 2 + roomPassword.getStringLength() * 2 + roomTopic.getStringLength() * 2 + srcAddress.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + //buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(srcAvatarId); + buf.put(roomAddress.serialize()); + buf.put(roomPassword.serialize()); + buf.putInt(1); + //passiveCreate = buf.put() ; + //if(passiveCreate) { + buf.put(roomTopic.serialize()); + buf.putInt(roomAttributes); + buf.putInt(maxRoomSize); + //} + buf.putInt(1); + //requestingEntry = buf.get() != 0; + buf.put(srcAddress.serialize()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + roomAddress.deserialize(buf); + roomPassword.deserialize(buf); + passiveCreate = buf.get() != 0; + if(passiveCreate) { + roomTopic.deserialize(buf); + roomAttributes = buf.getInt(); + maxRoomSize = buf.getInt(); + } + requestingEntry = buf.get() != 0; + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public ChatUnicodeString getRoomPassword() { + return roomPassword; + } + + public void setRoomPassword(ChatUnicodeString roomPassword) { + this.roomPassword = roomPassword; + } + + public int getRoomAttributes() { + return roomAttributes; + } + + public void setRoomAttributes(int roomAttributes) { + this.roomAttributes = roomAttributes; + } + + public boolean isPassiveCreate() { + return passiveCreate; + } + + public void setPassiveCreate(boolean passiveCreate) { + this.passiveCreate = passiveCreate; + } + + public int getMaxRoomSize() { + return maxRoomSize; + } + + public void setMaxRoomSize(int maxRoomSize) { + this.maxRoomSize = maxRoomSize; + } + + public ChatUnicodeString getRoomTopic() { + return roomTopic; + } + + public void setRoomTopic(ChatUnicodeString roomTopic) { + this.roomTopic = roomTopic; + } + + public boolean isRequestingEntry() { + return requestingEntry; + } + + public void setRequestingEntry(boolean requestingEntry) { + this.requestingEntry = requestingEntry; + } + +} diff --git a/src/main/java/chat/protocol/request/RFailoverRecreateRoom.java b/src/main/java/chat/protocol/request/RFailoverRecreateRoom.java new file mode 100644 index 0000000..3ec537f --- /dev/null +++ b/src/main/java/chat/protocol/request/RFailoverRecreateRoom.java @@ -0,0 +1,462 @@ +package chat.protocol.request; + +import java.lang.reflect.Array; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatAvatar; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; +import gnu.trove.list.TIntList; +import gnu.trove.list.array.TIntArrayList; + +public class RFailoverRecreateRoom extends GenericRequest { + + private int srcAvatarId; + private int inRoomAvatarId; + private int destAvatarId; + private int StationId; + private int AvaTyp; + private int Zahl2; + + private int roomFailID; + //private int roomPrefix; + private int createTime; + private int avatarCount; + private int adminCount; + private int moderatorCount; + private int tempModeratorCount; + private int bannedCount; + private int inviteCount; + private int VoiceCount; + private TIntArrayList inRoomAvatarlist = new TIntArrayList(); + private TIntArrayList inRoomAdminlist = new TIntArrayList(); + private TIntArrayList inRoomModeratorlist = new TIntArrayList(); + private TIntArrayList inRoomTempModeratorlist = new TIntArrayList(); + private TIntArrayList inRoomBanlist = new TIntArrayList(); + private TIntArrayList inRoomInvitelist = new TIntArrayList(); + private TIntArrayList inRoomVoicelist = new TIntArrayList(); + + private List destAvatarIdList = new ArrayList<>(); + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + private ChatUnicodeString roomName = new ChatUnicodeString(); + private ChatUnicodeString roomTopic = new ChatUnicodeString(); + private ChatUnicodeString roomPassword = new ChatUnicodeString(); + private ChatUnicodeString name = new ChatUnicodeString(); + private ChatUnicodeString Address = new ChatUnicodeString(); + private ChatUnicodeString roomPrefix = new ChatUnicodeString(); + private ChatUnicodeString AvaName = new ChatUnicodeString(); + private ChatUnicodeString AvaAddress = new ChatUnicodeString(); + + private ChatUnicodeString AdminAvaName = new ChatUnicodeString(); + private ChatUnicodeString AdminAvaAddress = new ChatUnicodeString(); + private int inRoomAdminAvatarId; + private int AdminStationId; + private int AdminAvaTyp; + + private ChatUnicodeString ModeratorAvaName = new ChatUnicodeString(); + private ChatUnicodeString ModeratorAvaAddress = new ChatUnicodeString(); + private int inRoomModeratorAvatarId; + private int ModeratorStationId; + private int ModeratorAvaTyp; + + private ChatUnicodeString TempModeratorAvaName = new ChatUnicodeString(); + private ChatUnicodeString TempModeratorAvaAddress = new ChatUnicodeString(); + private int inRoomTempModeratorAvatarId; + private int TempModeratorStationId; + private int TempModeratorAvaTyp; + + private ChatUnicodeString BannedAvaName = new ChatUnicodeString(); + private ChatUnicodeString BannedAvaAddress = new ChatUnicodeString(); + private int inRoomBannedAvatarId; + private int BannedStationId; + private int BannedAvaTyp; + + private ChatUnicodeString InviteAvaName = new ChatUnicodeString(); + private ChatUnicodeString InviteAvaAddress = new ChatUnicodeString(); + private int inRoomInviteAvatarId; + private int InviteStationId; + private int InviteAvaTyp; + + private ChatUnicodeString VoiceAvaName = new ChatUnicodeString(); + private ChatUnicodeString VoiceAvaAddress = new ChatUnicodeString(); + private int inRoomVoiceAvatarId; + private int VoiceStationId; + private int VoiceAvaTyp; + + private int roomAttributes; + private int maxRoomSize; + private ChatUnicodeString serializeWithLocalAvatarsOnly = new ChatUnicodeString(); + + + + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + serializeWithLocalAvatarsOnly(); + name.deserialize(buf); + Address.deserialize(buf); + srcAvatarId = buf.getInt(); + roomName.deserialize(buf); + roomTopic.deserialize(buf); + roomPassword.deserialize(buf); + roomPrefix.deserialize(buf); + roomAddress.deserialize(buf); + roomAttributes = buf.getInt(); + maxRoomSize = buf.getInt(); + roomFailID = buf.getInt();//System.out.println("roomFailID " + roomFailID); + createTime = buf.getInt(); + + + //adminCount = buf.getInt(); System.out.println("adminCount " + adminCount); + //AvatarId = buf.getInt(); System.out.println("AvatarId1 " + AvatarId); + //moderatorCount = buf.getInt(); System.out.println("moderatorCount " + moderatorCount); + //tempModeratorCount = buf.getInt(); System.out.println("tempModeratorCount " + tempModeratorCount); + //bannedCount = buf.getInt(); System.out.println("bannedCount " + bannedCount); + //inviteCount = buf.getInt(); System.out.println("inviteCount " + inviteCount); + //VoiceCount = buf.getInt(); System.out.println("VoiceCount " + VoiceCount); + //System.out.println("hasArraylenght " + buf.array().length); + //System.out.println("hasArraygetClass " + buf.array().getClass()); + //System.out.println("hasArraygetPosition " + buf.position()); + //System.out.println("hasArraygetCapacity " + buf.capacity()); + + + ArrayList AvatarIds = new ArrayList<>(); + int [] einArray; + einArray = new int[buf.remaining()]; + + //inRoomAvatars + avatarCount = buf.getInt();// System.out.println("avatarCount " + avatarCount); + for (int i=0;i < avatarCount ; i++){ + inRoomAvatarId = buf.getInt(); + //System.out.println("inRoomAvatarId " + inRoomAvatarId); + inRoomAvatarlist.add(inRoomAvatarId); + //System.out.println("inRoomAvatarlist " + inRoomAvatarlist); + StationId = buf.getInt(); + //System.out.println("StationId " + StationId); + AvaName.deserialize(buf); + //System.out.println("AvaName " + AvaName.getString()); + AvaAddress.deserialize(buf); + //System.out.println("AvaAddress " + AvaAddress.getString()); + AvaTyp = buf.getInt(); + //System.out.println("AvaTyp " + AvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + + //AvatarIds.add((byte) buf.getChar()); + //int digits = (int)Math.floor(Math.log10(Math.abs(AvatarId))); + //if (digits == 10 || digits == 9 ){ + //} + } + //Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + + //inRoomAdmin + adminCount = buf.getInt(); + //System.out.println("adminCount " + adminCount); + for (int i=0;i < adminCount ; i++){ + inRoomAdminAvatarId = buf.getInt(); + //System.out.println("inRoomAdminAvatarId " + inRoomAdminAvatarId); + inRoomAdminlist.add(inRoomAdminAvatarId); + //System.out.println("inRoomAdminlist " + inRoomAdminlist); + AdminStationId = buf.getInt(); + //System.out.println("AdminStationId " + AdminStationId); + AdminAvaName.deserialize(buf); + //System.out.println("AdminAvaName " + AdminAvaName.getString()); + AdminAvaAddress.deserialize(buf); + //System.out.println("AdminAvaAddress " + AdminAvaAddress.getString()); + AdminAvaTyp = buf.getInt(); + //System.out.println("AdminAvaTyp " + AdminAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + + } + + //Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + + //inRoomModerator + moderatorCount = buf.getInt(); + //System.out.println("moderatorCount " + moderatorCount); + for (int i=0;i < moderatorCount ; i++){ + inRoomModeratorAvatarId = buf.getInt(); + //System.out.println("inRoomModeratorAvatarId " + inRoomModeratorAvatarId); + inRoomModeratorlist.add(inRoomModeratorAvatarId); + //System.out.println("inRoomModeratorlist " + inRoomModeratorlist); + ModeratorStationId = buf.getInt(); + //System.out.println("ModeratorStationId " + ModeratorStationId); + ModeratorAvaName.deserialize(buf); + //System.out.println("ModeratorAvaName " + ModeratorAvaName.getString()); + ModeratorAvaAddress.deserialize(buf); + //System.out.println("ModeratorAvaAddress " + ModeratorAvaAddress.getString()); + ModeratorAvaTyp = buf.getInt(); + //System.out.println("ModeratorAvaTyp " + ModeratorAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + } + + //inRoomTempModerator + tempModeratorCount = buf.getInt(); + //System.out.println("tempModeratorCount " + tempModeratorCount); + for (int i=0;i < tempModeratorCount ; i++){ + inRoomTempModeratorAvatarId = buf.getInt(); + //System.out.println("inRoomTempModeratorAvatarId " + inRoomTempModeratorAvatarId); + inRoomTempModeratorlist.add(inRoomTempModeratorAvatarId); + //System.out.println("inRoomTempModeratorlist " + inRoomTempModeratorlist); + TempModeratorStationId = buf.getInt(); + //System.out.println("TempModeratorStationId " + TempModeratorStationId); + TempModeratorAvaName.deserialize(buf); + //System.out.println("TempModeratorAvaName " + TempModeratorAvaName.getString()); + TempModeratorAvaAddress.deserialize(buf); + //System.out.println("TempModeratorAvaAddress " + TempModeratorAvaAddress.getString()); + TempModeratorAvaTyp = buf.getInt(); + //System.out.println("TempModeratorAvaTyp " + TempModeratorAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + } + + //inRoomBanned + bannedCount = buf.getInt(); + //System.out.println("bannedCount " + bannedCount); + for (int i=0;i < bannedCount ; i++){ + inRoomBannedAvatarId = buf.getInt(); + //System.out.println("inRoomBannedAvatarId " + inRoomBannedAvatarId); + inRoomBanlist.add(inRoomBannedAvatarId); + //System.out.println("inRoomBanlist " + inRoomBanlist); + BannedStationId = buf.getInt(); + //System.out.println("BannedStationId " + BannedStationId); + BannedAvaName.deserialize(buf); + //System.out.println("BannedAvaName " + BannedAvaName.getString()); + BannedAvaAddress.deserialize(buf); + //System.out.println("BannedAvaAddress " + BannedAvaAddress.getString()); + BannedAvaTyp = buf.getInt(); + //System.out.println("BannedAvaTyp " + BannedAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + } + + //inRoomInvited + inviteCount = buf.getInt(); + //System.out.println("inviteCount " + inviteCount); + for (int i=0;i < inviteCount ; i++){ + inRoomInviteAvatarId = buf.getInt(); + //System.out.println("inRoomInviteAvatarId " + inRoomInviteAvatarId); + inRoomInvitelist.add(inRoomInviteAvatarId); + //System.out.println("inRoomInvitelist " + inRoomInvitelist); + InviteStationId = buf.getInt(); + //System.out.println("InviteStationId " + InviteStationId); + InviteAvaName.deserialize(buf); + //System.out.println("InviteAvaName " + InviteAvaName.getString()); + InviteAvaAddress.deserialize(buf); + //System.out.println("InviteAvaAddress " + InviteAvaAddress.getString()); + InviteAvaTyp = buf.getInt(); + //System.out.println("InviteAvaTyp " + InviteAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + } + //inRoomVoice + VoiceCount = buf.getInt(); + //System.out.println("VoiceCount " + VoiceCount); + for (int i=0;i < VoiceCount ; i++){ + inRoomVoiceAvatarId = buf.getInt(); + //System.out.println("inRoomVoiceAvatarId " + inRoomVoiceAvatarId); + inRoomVoicelist.add(inRoomVoiceAvatarId); + //System.out.println("inRoomVoicelist " + inRoomVoicelist); + VoiceStationId = buf.getInt(); + //System.out.println("VoiceStationId " + VoiceStationId); + VoiceAvaName.deserialize(buf); + //System.out.println("VoiceAvaName " + VoiceAvaName.getString()); + VoiceAvaAddress.deserialize(buf); + //System.out.println("VoiceAvaAddress " + VoiceAvaAddress.getString()); + VoiceAvaTyp = buf.getInt(); + //System.out.println("VoiceAvaTyp " + VoiceAvaTyp); + Zahl2 = buf.getInt(); + //System.out.println("Zahl2 " + Zahl2); + } + } + + private void serializeWithLocalAvatarsOnly() { + // TODO Auto-generated method stub + } + + public ChatUnicodeString getcreatorName() { + return name; + } + + public ChatUnicodeString getAddress() { + return Address; + } + + public ChatUnicodeString getroomPrefix() { + return roomPrefix; + } + + public int getroomFailID() { + return roomFailID; + } + public void setRoomPrefix(ChatUnicodeString roomPrefix) { + this.roomPrefix = roomPrefix; + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public int getdestAvatarId() { + return destAvatarId; + } + + public int getavatarCount() { + return avatarCount; + } + + public TIntArrayList getinRoomAvatarlist() { + return inRoomAvatarlist; + } + + public ChatUnicodeString getAvaAddress() { + return AvaAddress; + } + + public ChatUnicodeString getAvaName() { + return AvaName; + } + + public int getinRoomAvatarId() { + return inRoomAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public int getRoomAttributes() { + return roomAttributes; + } + + public void setRoomAttributes(int roomAttributes) { + this.roomAttributes = roomAttributes; + } + + public ChatUnicodeString getRoomName() { + return roomName; + } + + public void setRoomName(ChatUnicodeString roomName) { + this.roomName = roomName; + } + + public ChatUnicodeString getRoomTopic() { + return roomTopic; + } + + public void setRoomTopic(ChatUnicodeString roomTopic) { + this.roomTopic = roomTopic; + } + + public ChatUnicodeString getRoomPassword() { + return roomPassword; + } + + public void setRoomPassword(ChatUnicodeString roomPassword) { + this.roomPassword = roomPassword; + } + + public int getMaxRoomSize() { + return maxRoomSize; + } + + public void setMaxRoomSize(int maxRoomSize) { + this.maxRoomSize = maxRoomSize; + } + + public TIntList getDestAvatarIdList() { + return (TIntList) destAvatarIdList; + } + + //inRoomAdmin + public int getAdminCount() { + return adminCount; + } + + public TIntArrayList getinRoomAdminlist() { + return inRoomAdminlist; + } + + //inRoomModerator + public int getModeratorCount() { + return moderatorCount; + } + + public TIntArrayList getinRoomModeratorlist() { + return inRoomModeratorlist; + } + + //inRoomTempModerator + public int getTempModeratorCount() { + return tempModeratorCount; + } + + public TIntArrayList getinRoomTempModeratorlist() { + return inRoomTempModeratorlist; + } + + //inRoomBan + public int getBanCount() { + return bannedCount; + } + + public TIntArrayList getinRoomBanlist() { + return inRoomBanlist; + } + + //inRoomInvite + public int getInviteCount() { + return inviteCount; + } + + public TIntArrayList getinRoomInvitelist() { + return inRoomInvitelist; + } + + //inRoomVoice + public int getVoiceCount() { + return VoiceCount; + } + + public TIntArrayList getinRoomVoicelist() { + return inRoomVoicelist; + } + + + //public void setDestAvatarIdList(TIntList destAvatarIdList) { + // this.destAvatarIdList = destAvatarIdList; + //} + +} diff --git a/src/main/java/chat/protocol/request/RFailoverReloginAvatar.java b/src/main/java/chat/protocol/request/RFailoverReloginAvatar.java new file mode 100644 index 0000000..fdad575 --- /dev/null +++ b/src/main/java/chat/protocol/request/RFailoverReloginAvatar.java @@ -0,0 +1,92 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RFailoverReloginAvatar extends GenericRequest { + + private int userId; + private int AvatarId; + private ChatUnicodeString name = new ChatUnicodeString(); + private ChatUnicodeString address = new ChatUnicodeString(); + private ChatUnicodeString loginLocation = new ChatUnicodeString(); + private int loginPriority; + private int loginAttributes; + + + @Override + public ByteBuffer serialize() { + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + setAvatarId(buf.getInt()); + setUserId(buf.getInt()); + name.deserialize(buf); + address.deserialize(buf); + loginLocation.deserialize(buf); + setLoginPriority(buf.getInt()); + setLoginAttributes(buf.getInt()); + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getAvatarId() { + return AvatarId; + } + + public void setAvatarId(int userId) { + this.AvatarId = AvatarId; + } + + public int getLoginPriority() { + return loginPriority; + } + + public void setLoginPriority(int loginPriority) { + this.loginPriority = loginPriority; + } + + public int getLoginAttributes() { + return loginAttributes; + } + + public void setLoginAttributes(int loginAttributes) { + this.loginAttributes = loginAttributes; + } + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public ChatUnicodeString getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(ChatUnicodeString loginLocation) { + this.loginLocation = loginLocation; + } + +} diff --git a/src/main/java/chat/protocol/request/RFriendStatus.java b/src/main/java/chat/protocol/request/RFriendStatus.java new file mode 100644 index 0000000..b9f13ef --- /dev/null +++ b/src/main/java/chat/protocol/request/RFriendStatus.java @@ -0,0 +1,43 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RFriendStatus extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RGetAnyAvatar.java b/src/main/java/chat/protocol/request/RGetAnyAvatar.java new file mode 100644 index 0000000..6c33ec3 --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetAnyAvatar.java @@ -0,0 +1,42 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RGetAnyAvatar extends GenericRequest { + + private ChatUnicodeString name = new ChatUnicodeString(); + private ChatUnicodeString address = new ChatUnicodeString(); + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + name.deserialize(buf); + address.deserialize(buf); + } +} diff --git a/src/main/java/chat/protocol/request/RGetAvatar.java b/src/main/java/chat/protocol/request/RGetAvatar.java new file mode 100644 index 0000000..90cdbab --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetAvatar.java @@ -0,0 +1,44 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RGetAvatar extends GenericRequest { + + private ChatUnicodeString name = new ChatUnicodeString(); + private ChatUnicodeString address = new ChatUnicodeString(); + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + name.deserialize(buf); + address.deserialize(buf); + } + + +} diff --git a/src/main/java/chat/protocol/request/RGetPersistentHeaders.java b/src/main/java/chat/protocol/request/RGetPersistentHeaders.java new file mode 100644 index 0000000..8e8a81a --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetPersistentHeaders.java @@ -0,0 +1,42 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; + +public class RGetPersistentHeaders extends GenericRequest { + + private int srcAvatarId; + private int category; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + category = buf.getInt(); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public int getCategory() { + return category; + } + + public void setCategory(int category) { + this.category = category; + } + +} diff --git a/src/main/java/chat/protocol/request/RGetPersistentMessage.java b/src/main/java/chat/protocol/request/RGetPersistentMessage.java new file mode 100644 index 0000000..d0d6621 --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetPersistentMessage.java @@ -0,0 +1,42 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; + +public class RGetPersistentMessage extends GenericRequest { + + private int srcAvatarId; + private int messageId; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + messageId = buf.getInt(); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public int getMessageId() { + return messageId; + } + + public void setMessageId(int messageId) { + this.messageId = messageId; + } + +} diff --git a/src/main/java/chat/protocol/request/RGetRoom.java b/src/main/java/chat/protocol/request/RGetRoom.java new file mode 100644 index 0000000..84870a3 --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetRoom.java @@ -0,0 +1,57 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatApiTcpHandler; +import chat.ChatAvatar; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RGetRoom extends GenericRequest { + + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + private ChatAvatar avatar; + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(10 + roomAddress.getString().length() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putShort(type); + buf.putInt(track); + buf.put(roomAddress.serialize()); + //buf.putInt(roomId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + roomAddress.deserialize(buf); + //System.out.println(ChatApiTcpHandler.bytesToHex(buf.array())); + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public ChatAvatar getAvatarAddress() { + // TODO Auto-generated method stub + return avatar; + } + + public int setTrack() { + return track; + } + +} diff --git a/src/main/java/chat/protocol/request/RGetRoomSummaries.java b/src/main/java/chat/protocol/request/RGetRoomSummaries.java new file mode 100644 index 0000000..7c3666b --- /dev/null +++ b/src/main/java/chat/protocol/request/RGetRoomSummaries.java @@ -0,0 +1,43 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RGetRoomSummaries extends GenericRequest { + + private ChatUnicodeString startNodeAddress = new ChatUnicodeString(); + private ChatUnicodeString roomFilter = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + startNodeAddress.deserialize(buf); + roomFilter.deserialize(buf); + } + + public ChatUnicodeString getStartNodeAddress() { + return startNodeAddress; + } + + public void setStartNodeAddress(ChatUnicodeString startNodeAddress) { + this.startNodeAddress = startNodeAddress; + } + + public ChatUnicodeString getRoomFilter() { + return roomFilter; + } + + public void setRoomFilter(ChatUnicodeString roomFilter) { + this.roomFilter = roomFilter; + } + +} diff --git a/src/main/java/chat/protocol/request/RIgnoreStatus.java b/src/main/java/chat/protocol/request/RIgnoreStatus.java new file mode 100644 index 0000000..dcdabba --- /dev/null +++ b/src/main/java/chat/protocol/request/RIgnoreStatus.java @@ -0,0 +1,43 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RIgnoreStatus extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RKickAvatar.java b/src/main/java/chat/protocol/request/RKickAvatar.java new file mode 100644 index 0000000..624e36c --- /dev/null +++ b/src/main/java/chat/protocol/request/RKickAvatar.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RKickAvatar extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RLeaveRoom.java b/src/main/java/chat/protocol/request/RLeaveRoom.java new file mode 100644 index 0000000..aef93a2 --- /dev/null +++ b/src/main/java/chat/protocol/request/RLeaveRoom.java @@ -0,0 +1,53 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RLeaveRoom extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + roomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RLoginAvatar.java b/src/main/java/chat/protocol/request/RLoginAvatar.java new file mode 100644 index 0000000..b8a303c --- /dev/null +++ b/src/main/java/chat/protocol/request/RLoginAvatar.java @@ -0,0 +1,82 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RLoginAvatar extends GenericRequest { + + private int userId; + private ChatUnicodeString name = new ChatUnicodeString(); + private ChatUnicodeString address = new ChatUnicodeString(); + private ChatUnicodeString loginLocation = new ChatUnicodeString(); + private int loginPriority; + private int loginAttributes; + + + @Override + public ByteBuffer serialize() { + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + setUserId(buf.getInt()); + name.deserialize(buf); + address.deserialize(buf); + loginLocation.deserialize(buf);//System.out.println("LoginLocation " + loginLocation.getString()); + setLoginPriority(buf.getInt());//System.out.println("LoginPriority " + loginPriority); + setLoginAttributes(buf.getInt());//System.out.println("setLoginAttributes " + loginAttributes); + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getLoginPriority() { + return loginPriority; + } + + public void setLoginPriority(int loginPriority) { + this.loginPriority = loginPriority; + } + + public int getLoginAttributes() { + return loginAttributes; + } + + public void setLoginAttributes(int loginAttributes) { + this.loginAttributes = loginAttributes; + } + + public ChatUnicodeString getName() { + return name; + } + + public void setName(ChatUnicodeString name) { + this.name = name; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public ChatUnicodeString getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(ChatUnicodeString loginLocation) { + this.loginLocation = loginLocation; + } + +} diff --git a/src/main/java/chat/protocol/request/RLogoutAvatar.java b/src/main/java/chat/protocol/request/RLogoutAvatar.java new file mode 100644 index 0000000..08006f7 --- /dev/null +++ b/src/main/java/chat/protocol/request/RLogoutAvatar.java @@ -0,0 +1,44 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RLogoutAvatar extends GenericRequest { + + private int avatarId; + private ChatUnicodeString address = new ChatUnicodeString(); + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + avatarId = buf.getInt(); + address.deserialize(buf); + } + + +} diff --git a/src/main/java/chat/protocol/request/RRegistrarGetChatServer.java b/src/main/java/chat/protocol/request/RRegistrarGetChatServer.java new file mode 100644 index 0000000..90e52a9 --- /dev/null +++ b/src/main/java/chat/protocol/request/RRegistrarGetChatServer.java @@ -0,0 +1,37 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRegistrarGetChatServer extends GenericRequest { + + private ChatUnicodeString hostname = new ChatUnicodeString(); + private short port; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + hostname.deserialize(buf); + setPort(buf.getShort()); + } + + public short getPort() { + return port; + } + + public void setPort(short port) { + this.port = port; + } + + + +} diff --git a/src/main/java/chat/protocol/request/RRemoveBan.java b/src/main/java/chat/protocol/request/RRemoveBan.java new file mode 100644 index 0000000..7865d4f --- /dev/null +++ b/src/main/java/chat/protocol/request/RRemoveBan.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRemoveBan extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RRemoveFriend.java b/src/main/java/chat/protocol/request/RRemoveFriend.java new file mode 100644 index 0000000..5d9f8be --- /dev/null +++ b/src/main/java/chat/protocol/request/RRemoveFriend.java @@ -0,0 +1,63 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRemoveFriend extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destName.deserialize(buf); + destAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RRemoveIgnore.java b/src/main/java/chat/protocol/request/RRemoveIgnore.java new file mode 100644 index 0000000..eaac365 --- /dev/null +++ b/src/main/java/chat/protocol/request/RRemoveIgnore.java @@ -0,0 +1,63 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRemoveIgnore extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destName.deserialize(buf); + destAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RRemoveInvite.java b/src/main/java/chat/protocol/request/RRemoveInvite.java new file mode 100644 index 0000000..20046b2 --- /dev/null +++ b/src/main/java/chat/protocol/request/RRemoveInvite.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRemoveInvite extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RRemoveModerator.java b/src/main/java/chat/protocol/request/RRemoveModerator.java new file mode 100644 index 0000000..2ff8f81 --- /dev/null +++ b/src/main/java/chat/protocol/request/RRemoveModerator.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RRemoveModerator extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString destAvatarName = new ChatUnicodeString(); + private ChatUnicodeString destAvatarAddress = new ChatUnicodeString(); + private ChatUnicodeString destRoomAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destAvatarName.deserialize(buf); + destAvatarAddress.deserialize(buf); + destRoomAddress.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getDestAvatarName() { + return destAvatarName; + } + + public void setDestAvatarName(ChatUnicodeString destAvatarName) { + this.destAvatarName = destAvatarName; + } + + public ChatUnicodeString getDestAvatarAddress() { + return destAvatarAddress; + } + + public void setDestAvatarAddress(ChatUnicodeString destAvatarAddress) { + this.destAvatarAddress = destAvatarAddress; + } + + public ChatUnicodeString getDestRoomAddress() { + return destRoomAddress; + } + + public void setDestRoomAddress(ChatUnicodeString destRoomAddress) { + this.destRoomAddress = destRoomAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RSendApiVersion.java b/src/main/java/chat/protocol/request/RSendApiVersion.java new file mode 100644 index 0000000..7d44ba8 --- /dev/null +++ b/src/main/java/chat/protocol/request/RSendApiVersion.java @@ -0,0 +1,32 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; + +public class RSendApiVersion extends GenericRequest { + + private int version; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + version = buf.getInt(); + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + +} diff --git a/src/main/java/chat/protocol/request/RSendInstantMessage.java b/src/main/java/chat/protocol/request/RSendInstantMessage.java new file mode 100644 index 0000000..d1fdb86 --- /dev/null +++ b/src/main/java/chat/protocol/request/RSendInstantMessage.java @@ -0,0 +1,82 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RSendInstantMessage extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString message = new ChatUnicodeString(); + private ChatUnicodeString oob = new ChatUnicodeString(); + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + destName.deserialize(buf); + destAddress.deserialize(buf); + message.deserialize(buf); + oob.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getMessage() { + return message; + } + + public void setMessage(ChatUnicodeString message) { + this.message = message; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + +} diff --git a/src/main/java/chat/protocol/request/RSendPersistentMessage.java b/src/main/java/chat/protocol/request/RSendPersistentMessage.java new file mode 100644 index 0000000..1ddb487 --- /dev/null +++ b/src/main/java/chat/protocol/request/RSendPersistentMessage.java @@ -0,0 +1,134 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RSendPersistentMessage extends GenericRequest { + + private short avatarPresence; + private int srcAvatarId; + private ChatUnicodeString srcName = new ChatUnicodeString(); + private ChatUnicodeString destName = new ChatUnicodeString(); + private ChatUnicodeString destAddress = new ChatUnicodeString(); + private ChatUnicodeString subject = new ChatUnicodeString(); + private ChatUnicodeString message = new ChatUnicodeString(); + private ChatUnicodeString oob = new ChatUnicodeString(); + private ChatUnicodeString category = new ChatUnicodeString(); + private boolean enforceInboxLimit; + private int categoryLimit; + + @Override + public ByteBuffer serialize() { + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + avatarPresence = buf.getShort(); + if(avatarPresence != 0) + srcAvatarId = buf.getInt(); + else + srcName.deserialize(buf); + destName.deserialize(buf); + destAddress.deserialize(buf); + subject.deserialize(buf); + message.deserialize(buf); + oob.deserialize(buf); + category.deserialize(buf); + enforceInboxLimit = buf.get() != 0; + categoryLimit = buf.getInt(); + } + + public short isAvatarPresence() { + return avatarPresence; + } + + public void setAvatarPresence(short avatarPresence) { + this.avatarPresence = avatarPresence; + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcName() { + return srcName; + } + + public void setSrcName(ChatUnicodeString srcName) { + this.srcName = srcName; + } + + public ChatUnicodeString getDestName() { + return destName; + } + + public void setDestName(ChatUnicodeString destName) { + this.destName = destName; + } + + public ChatUnicodeString getDestAddress() { + return destAddress; + } + + public void setDestAddress(ChatUnicodeString destAddress) { + this.destAddress = destAddress; + } + + public ChatUnicodeString getSubject() { + return subject; + } + + public void setSubject(ChatUnicodeString subject) { + this.subject = subject; + } + + public ChatUnicodeString getMessage() { + return message; + } + + public void setMessage(ChatUnicodeString message) { + this.message = message; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + + public ChatUnicodeString getCategory() { + return category; + } + + public void setCategory(ChatUnicodeString category) { + this.category = category; + } + + public boolean isEnforceInboxLimit() { + return enforceInboxLimit; + } + + public void setEnforceInboxLimit(boolean enforceInboxLimit) { + this.enforceInboxLimit = enforceInboxLimit; + } + + public int getCategoryLimit() { + return categoryLimit; + } + + public void setCategoryLimit(int categoryLimit) { + this.categoryLimit = categoryLimit; + } + +} diff --git a/src/main/java/chat/protocol/request/RSendRoomMessage.java b/src/main/java/chat/protocol/request/RSendRoomMessage.java new file mode 100644 index 0000000..89d5bc5 --- /dev/null +++ b/src/main/java/chat/protocol/request/RSendRoomMessage.java @@ -0,0 +1,73 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RSendRoomMessage extends GenericRequest { + + private int srcAvatarId; + private ChatUnicodeString srcAddress = new ChatUnicodeString(); + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + private ChatUnicodeString msg = new ChatUnicodeString(); + private ChatUnicodeString oob = new ChatUnicodeString(); + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + srcAvatarId = buf.getInt(); + roomAddress.deserialize(buf); + msg.deserialize(buf); + oob.deserialize(buf); + srcAddress.deserialize(buf); + } + + public int getSrcAvatarId() { + return srcAvatarId; + } + + public void setSrcAvatarId(int srcAvatarId) { + this.srcAvatarId = srcAvatarId; + } + + public ChatUnicodeString getSrcAddress() { + return srcAddress; + } + + public void setSrcAddress(ChatUnicodeString srcAddress) { + this.srcAddress = srcAddress; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public ChatUnicodeString getMsg() { + return msg; + } + + public void setMsg(ChatUnicodeString msg) { + this.msg = msg; + } + + public ChatUnicodeString getOob() { + return oob; + } + + public void setOob(ChatUnicodeString oob) { + this.oob = oob; + } + +} diff --git a/src/main/java/chat/protocol/request/RSetAvatarAttributes.java b/src/main/java/chat/protocol/request/RSetAvatarAttributes.java new file mode 100644 index 0000000..6210af2 --- /dev/null +++ b/src/main/java/chat/protocol/request/RSetAvatarAttributes.java @@ -0,0 +1,63 @@ +package chat.protocol.request; + +import java.nio.ByteBuffer; + +import chat.protocol.GenericRequest; +import chat.util.ChatUnicodeString; + +public class RSetAvatarAttributes extends GenericRequest { + + private int avatarId; + private ChatUnicodeString address = new ChatUnicodeString(); + private int avatarAttributes; + private boolean persistent; + + @Override + public ByteBuffer serialize() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void deserialize(ByteBuffer buf) { + type = buf.getShort(); + track = buf.getInt(); + avatarId = buf.getInt(); + avatarAttributes = buf.getInt(); + persistent = buf.get() != 0; + //address.deserialize(buf); + } + + public int getAvatarId() { + return avatarId; + } + + public void setAvatarId(int avatarId) { + this.avatarId = avatarId; + } + + public ChatUnicodeString getAddress() { + return address; + } + + public void setAddress(ChatUnicodeString address) { + this.address = address; + } + + public int getAvatarAttributes() { + return avatarAttributes; + } + + public void setAvatarAttributes(int avatarAttributes) { + this.avatarAttributes = avatarAttributes; + } + + public boolean isPersistent() { + return persistent; + } + + public void setPersistent(boolean persistent) { + this.persistent = persistent; + } + +} diff --git a/src/main/java/chat/protocol/response/ResAddBan.java b/src/main/java/chat/protocol/response/ResAddBan.java new file mode 100644 index 0000000..8460890 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResAddBan.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResAddBan extends GenericResponse { + + private int destRoomId; + + public ResAddBan() { + type = RESPONSE_ADDBAN; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResAddFriend.java b/src/main/java/chat/protocol/response/ResAddFriend.java new file mode 100644 index 0000000..c2e51b0 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResAddFriend.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResAddFriend extends GenericResponse { + + public ResAddFriend() { + type = RESPONSE_ADDFRIEND; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResAddIgnore.java b/src/main/java/chat/protocol/response/ResAddIgnore.java new file mode 100644 index 0000000..1d5035f --- /dev/null +++ b/src/main/java/chat/protocol/response/ResAddIgnore.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResAddIgnore extends GenericResponse { + + public ResAddIgnore() { + type = RESPONSE_ADDIGNORE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResAddInvite.java b/src/main/java/chat/protocol/response/ResAddInvite.java new file mode 100644 index 0000000..50b4635 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResAddInvite.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResAddInvite extends GenericResponse { + + private int destRoomId; + + public ResAddInvite() { + type = RESPONSE_ADDINVITE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResAddModerator.java b/src/main/java/chat/protocol/response/ResAddModerator.java new file mode 100644 index 0000000..38d187f --- /dev/null +++ b/src/main/java/chat/protocol/response/ResAddModerator.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResAddModerator extends GenericResponse { + + private int destRoomId; + + public ResAddModerator() { + type = RESPONSE_ADDMODERATOR; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResCreateRoom.java b/src/main/java/chat/protocol/response/ResCreateRoom.java new file mode 100644 index 0000000..520caf2 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResCreateRoom.java @@ -0,0 +1,80 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResCreateRoom extends GenericResponse { + + private ChatRoom room; + private List extraRooms = new ArrayList(); + + public ResCreateRoom() { + type = RESPONSE_CREATEROOM; + } + + @Override + public ByteBuffer serialize() { + List roomBufs = new ArrayList<>(); + int roomBufsSize = 0; + for(ChatRoom room : extraRooms) { + byte[] roomBuf = room.serialize(); + roomBufsSize += roomBuf.length; + roomBufs.add(roomBuf); + } + int roomSize = 0; + byte[] roomBuf = null; + if(result == ResponseResult.CHATRESULT_SUCCESS) { + roomBuf = room.serialize(); + roomSize = roomBuf.length; + } + ByteBuffer buf; + if(result == ResponseResult.CHATRESULT_SUCCESS) + buf = ByteBuffer.allocate(18 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + else + buf = ByteBuffer.allocate(14 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) { + buf.put(roomBuf); + buf.putInt(extraRooms.size()); + for(byte[] sumBuf : roomBufs) { + buf.put(sumBuf); + } + } + writeSize(buf); freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatRoom getRoom() { + return room; + } + + public void setRoom(ChatRoom room) { + this.room = room; + } + + public List getExtraRooms() { + return extraRooms; + } + + public void setExtraRooms(List extraRooms) { + this.extraRooms = extraRooms; + } + +} diff --git a/src/main/java/chat/protocol/response/ResDestroyAvatar.java b/src/main/java/chat/protocol/response/ResDestroyAvatar.java new file mode 100644 index 0000000..ba4f547 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResDestroyAvatar.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResDestroyAvatar extends GenericResponse { + + public ResDestroyAvatar() { + type = RESPONSE_DESTROYAVATAR; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResDestroyRoom.java b/src/main/java/chat/protocol/response/ResDestroyRoom.java new file mode 100644 index 0000000..0d663a2 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResDestroyRoom.java @@ -0,0 +1,46 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResDestroyRoom extends GenericResponse { + + private int destRoomId; + + public ResDestroyRoom() { + type = RESPONSE_DESTROYROOM; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResEnterRoom.java b/src/main/java/chat/protocol/response/ResEnterRoom.java new file mode 100644 index 0000000..66daeb5 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResEnterRoom.java @@ -0,0 +1,93 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResEnterRoom extends GenericResponse { + + private ChatRoom room; + private List extraRooms = new ArrayList(); + private int roomId; + private boolean gotRoom = false; + + public ResEnterRoom() { + type = RESPONSE_ENTERROOM; + } + + @Override + public ByteBuffer serialize() { + List roomBufs = new ArrayList<>(); + int roomBufsSize = 0; + for(ChatRoom room : extraRooms) { + byte[] roomBuf = room.serialize(); + roomBufsSize += roomBuf.length; + roomBufs.add(roomBuf); + } + int roomSize = 0; + byte[] roomBuf = null; + if(gotRoom) { + roomBuf = room.serialize(); + roomSize = roomBuf.length; + } + ByteBuffer buf = ByteBuffer.allocate(23 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(roomId); + buf.put((byte) (gotRoom ? 1 : 0)); + if(gotRoom) { + buf.put(roomBuf); + buf.putInt(extraRooms.size()); + for(byte[] sumBuf : roomBufs) { + buf.put(sumBuf); + } + } + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatRoom getRoom() { + return room; + } + + public void setRoom(ChatRoom room) { + this.room = room; + } + + public List getExtraRooms() { + return extraRooms; + } + + public void setExtraRooms(List extraRooms) { + this.extraRooms = extraRooms; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isGotRoom() { + return gotRoom; + } + + public void setGotRoom(boolean gotRoom) { + this.gotRoom = gotRoom; + } + +} diff --git a/src/main/java/chat/protocol/response/ResFailLoginAvatar.java b/src/main/java/chat/protocol/response/ResFailLoginAvatar.java new file mode 100644 index 0000000..45cdf5f --- /dev/null +++ b/src/main/java/chat/protocol/response/ResFailLoginAvatar.java @@ -0,0 +1,49 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import chat.ChatAvatar; +import chat.protocol.GenericResponse; + +public class ResFailLoginAvatar extends GenericResponse { + + private ChatAvatar avatar; + + public ResFailLoginAvatar() { + type = RESPONSE_FAILOVER_RELOGINAVATAR; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = avatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(14 + avatarBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) { + buf.put(avatarBuf); + // These are optional and not used for SWG + //buf.putInt(requiredLoginPriority); + //buf.put(email.serialize()); + //buf.putInt(inboxLimit); + } + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + + +} diff --git a/src/main/java/chat/protocol/response/ResFailoverRecreateRoom.java b/src/main/java/chat/protocol/response/ResFailoverRecreateRoom.java new file mode 100644 index 0000000..f49cc1f --- /dev/null +++ b/src/main/java/chat/protocol/response/ResFailoverRecreateRoom.java @@ -0,0 +1,82 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResFailoverRecreateRoom extends GenericResponse { + + private ChatRoom room; + private List extraRooms = new ArrayList(); + private boolean gotRoom = false; + + public ResFailoverRecreateRoom() { + type = RESPONSE_FAILOVER_RECREATEROOM; + } + + @Override + public ByteBuffer serialize() { + List roomBufs = new ArrayList<>(); + int roomBufsSize = 0; + for(ChatRoom room : extraRooms) { + byte[] roomBuf = room.serialize(); + roomBufsSize += roomBuf.length; + roomBufs.add(roomBuf); + //System.out.println("roomBuf " + roomBuf); + } + int roomSize = 0; + byte[] roomBuf = null; + if(result == ResponseResult.CHATRESULT_SUCCESS) { + roomBuf = room.serialize(); + roomSize = roomBuf.length; + } + ByteBuffer buf; + if(result == ResponseResult.CHATRESULT_SUCCESS) + buf = ByteBuffer.allocate(18 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + else + buf = ByteBuffer.allocate(14 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) { + buf.put(roomBuf); + buf.putInt(extraRooms.size()); + for(byte[] sumBuf : roomBufs) { + buf.put(sumBuf); + } + } + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatRoom getRoom() { + return room; + } + + public void setRoom(ChatRoom room) { + this.room = room; + } + + public List getExtraRooms() { + return extraRooms; + } + + public void setExtraRooms(List extraRooms) { + this.extraRooms = extraRooms; + } + + public void setGotRoom(boolean gotRoom) { + this.gotRoom = gotRoom; + } + +} diff --git a/src/main/java/chat/protocol/response/ResFriendStatus.java b/src/main/java/chat/protocol/response/ResFriendStatus.java new file mode 100644 index 0000000..3e961ba --- /dev/null +++ b/src/main/java/chat/protocol/response/ResFriendStatus.java @@ -0,0 +1,54 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatFriend; +import chat.protocol.GenericResponse; + +public class ResFriendStatus extends GenericResponse { + + private List friendsList; + + public ResFriendStatus() { + type = RESPONSE_FRIENDSTATUS; + } + + @Override + public ByteBuffer serialize() { + List friendBufs = new ArrayList<>(); + int friendBufsSize = 0; + for(ChatFriend friend : friendsList) { + byte[] friendBuf = friend.serialize(); + friendBufsSize += friendBuf.length; + friendBufs.add(friendBuf); + } + ByteBuffer buf = ByteBuffer.allocate(18 + friendBufsSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(friendBufs.size()); + for(byte[] friendBuf : friendBufs) + buf.put(friendBuf); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public List getFriendsList() { + return friendsList; + } + + public void setFriendsList(List friendsList) { + this.friendsList = friendsList; + } + +} diff --git a/src/main/java/chat/protocol/response/ResGetAnyAvatar.java b/src/main/java/chat/protocol/response/ResGetAnyAvatar.java new file mode 100644 index 0000000..fca3d44 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResGetAnyAvatar.java @@ -0,0 +1,63 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericResponse; + +public class ResGetAnyAvatar extends GenericResponse { + + private ChatAvatar avatar; + private boolean isLoggedIn; + + public ResGetAnyAvatar() { + type = RESPONSE_GETANYAVATAR; + } + + @Override + public ByteBuffer serialize() { + if(result == ResponseResult.CHATRESULT_SUCCESS) { + byte[] avatarBuf = avatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(15 + avatarBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.put((byte) (isLoggedIn ? 1 : 0)); + buf.put(avatarBuf); + writeSize(buf); + return buf; + } else { + ByteBuffer buf = ByteBuffer.allocate(15).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.put((byte) (isLoggedIn ? 1 : 0)); + writeSize(buf); + return buf; + } + } + + @Override + public void deserialize(ByteBuffer buf) { + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + + public boolean isLoggedIn() { + return isLoggedIn; + } + + public void setLoggedIn(boolean isLoggedIn) { + this.isLoggedIn = isLoggedIn; + } + +} diff --git a/src/main/java/chat/protocol/response/ResGetPersistentHeaders.java b/src/main/java/chat/protocol/response/ResGetPersistentHeaders.java new file mode 100644 index 0000000..11b632e --- /dev/null +++ b/src/main/java/chat/protocol/response/ResGetPersistentHeaders.java @@ -0,0 +1,57 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.PersistentMessage; +import chat.protocol.GenericResponse; + +public class ResGetPersistentHeaders extends GenericResponse { + + private List pmList = new ArrayList<>(); + + public ResGetPersistentHeaders() { + type = RESPONSE_GETPERSISTENTHEADERS; + } + + @Override + public ByteBuffer serialize() { + List pmBuffers = new ArrayList<>(); + int pmBufSize = 0; + for(PersistentMessage pm : pmList) { + byte[] pmBuf = pm.serializeHeader(); + pmBufSize += pmBuf.length; + pmBuffers.add(pmBuf); + } + ByteBuffer buf = ByteBuffer.allocate(18 + pmBufSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(pmList.size()); + for(byte[] pmBuf : pmBuffers) + buf.put(pmBuf); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public List getPmList() { + return pmList; + } + + public void setPmList(List pmList) { + this.pmList = pmList; + } + + public void addPersistentMessage(PersistentMessage pm) { + pmList.add(pm); + } + +} diff --git a/src/main/java/chat/protocol/response/ResGetPersistentMessage.java b/src/main/java/chat/protocol/response/ResGetPersistentMessage.java new file mode 100644 index 0000000..7c6dfc5 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResGetPersistentMessage.java @@ -0,0 +1,46 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.PersistentMessage; +import chat.protocol.GenericResponse; + +public class ResGetPersistentMessage extends GenericResponse { + + private PersistentMessage pm; + + public ResGetPersistentMessage() { + type = RESPONSE_GETPERSISTENTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + byte[] pmBuf = null; + if(result == ResponseResult.CHATRESULT_SUCCESS) + pmBuf = pm.serialize(); + ByteBuffer buf = ByteBuffer.allocate(pmBuf == null ? 14 : (14 + pmBuf.length)).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) + buf.put(pmBuf); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public PersistentMessage getPm() { + return pm; + } + + public void setPm(PersistentMessage pm) { + this.pm = pm; + } + +} diff --git a/src/main/java/chat/protocol/response/ResGetRoom.java b/src/main/java/chat/protocol/response/ResGetRoom.java new file mode 100644 index 0000000..0fe1ef0 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResGetRoom.java @@ -0,0 +1,77 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResGetRoom extends GenericResponse { + + private ChatRoom room; + private List extraRooms = new ArrayList(); + + public ResGetRoom() { + type = RESPONSE_GETROOM; + } + + @Override + public ByteBuffer serialize() { + List roomBufs = new ArrayList<>(); + int roomBufsSize = 0; + for(ChatRoom room : extraRooms) { + byte[] roomBuf = room.serialize(); + roomBufsSize += roomBuf.length; + roomBufs.add(roomBuf); + } + int roomSize = 0; + byte[] roomBuf = null; + if(result == ResponseResult.CHATRESULT_SUCCESS) { + roomBuf = room.serialize(); + roomSize = roomBuf.length; + } + ByteBuffer buf; + if(result == ResponseResult.CHATRESULT_SUCCESS) + buf = ByteBuffer.allocate(18 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + else + buf = ByteBuffer.allocate(14 + roomBufsSize + roomSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) { + buf.put(roomBuf); + buf.putInt(extraRooms.size()); + for(byte[] sumBuf : roomBufs) { + buf.put(sumBuf); + } + } + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public ChatRoom getRoom() { + return room; + } + + public void setRoom(ChatRoom room) { + this.room = room; + } + + public List getExtraRooms() { + return extraRooms; + } + + public void setExtraRooms(List extraRooms) { + this.extraRooms = extraRooms; + } + +} diff --git a/src/main/java/chat/protocol/response/ResGetRoomSummaries.java b/src/main/java/chat/protocol/response/ResGetRoomSummaries.java new file mode 100644 index 0000000..54438f4 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResGetRoomSummaries.java @@ -0,0 +1,59 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResGetRoomSummaries extends GenericResponse { + + private List rooms; + + public ResGetRoomSummaries() { + type = RESPONSE_GETROOMSUMMARIES; + } + + @Override + public ByteBuffer serialize() { + List sumBufs = new ArrayList<>(); + int sumBufsSize = 0; + for(ChatRoom room : rooms) { + byte[] sumBuf = room.serializeSummary(); + sumBufsSize += sumBuf.length; + sumBufs.add(sumBuf); + } + ByteBuffer buf = ByteBuffer.allocate(18 + sumBufsSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(rooms.size()); + for(byte[] sumBuf : sumBufs) { + buf.put(sumBuf); + } + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + +} diff --git a/src/main/java/chat/protocol/response/ResIgnoreStatus.java b/src/main/java/chat/protocol/response/ResIgnoreStatus.java new file mode 100644 index 0000000..cd6859c --- /dev/null +++ b/src/main/java/chat/protocol/response/ResIgnoreStatus.java @@ -0,0 +1,53 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import chat.ChatIgnore; +import chat.protocol.GenericResponse; + +public class ResIgnoreStatus extends GenericResponse { + + private List ignoreList; + + public ResIgnoreStatus() { + type = RESPONSE_IGNORESTATUS; + } + + @Override + public ByteBuffer serialize() { + List ignoreBufs = new ArrayList<>(); + int ignoreBufsSize = 0; + for(ChatIgnore ignore : ignoreList) { + byte[] ignoreBuf = ignore.serialize(); + ignoreBufsSize += ignoreBuf.length; + ignoreBufs.add(ignoreBuf); + } + ByteBuffer buf = ByteBuffer.allocate(18 + ignoreBufsSize).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(ignoreBufs.size()); + for(byte[] ignoreBuf : ignoreBufs) + buf.put(ignoreBuf); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public List getIgnoreList() { + return ignoreList; + } + + public void setIgnoreList(List ignoreList) { + this.ignoreList = ignoreList; + } + +} diff --git a/src/main/java/chat/protocol/response/ResKickAvatar.java b/src/main/java/chat/protocol/response/ResKickAvatar.java new file mode 100644 index 0000000..660e716 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResKickAvatar.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResKickAvatar extends GenericResponse { + + private int destRoomId; + + public ResKickAvatar() { + type = RESPONSE_KICKAVATAR; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResLeaveRoom.java b/src/main/java/chat/protocol/response/ResLeaveRoom.java new file mode 100644 index 0000000..76b4044 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResLeaveRoom.java @@ -0,0 +1,60 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; + +import chat.ChatRoom; +import chat.protocol.GenericResponse; + +public class ResLeaveRoom extends GenericResponse { + + private int destRoomId; + private List extraRooms = new ArrayList(); + private int roomId; + private boolean gotRoom = true; + + public ResLeaveRoom() { + type = RESPONSE_LEAVEROOM; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + //buf.putInt(srcAvatarId); + buf.putInt(roomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + + public void setGotRoom(boolean b) { + this.gotRoom = gotRoom; + + } + public boolean isGotRoom() { + return gotRoom; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResLoginAvatar.java b/src/main/java/chat/protocol/response/ResLoginAvatar.java new file mode 100644 index 0000000..1a29cd8 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResLoginAvatar.java @@ -0,0 +1,49 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import chat.ChatAvatar; +import chat.protocol.GenericResponse; + +public class ResLoginAvatar extends GenericResponse { + + private ChatAvatar avatar; + + public ResLoginAvatar() { + type = RESPONSE_LOGINAVATAR; + } + + @Override + public ByteBuffer serialize() { + byte[] avatarBuf = avatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(14 + avatarBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) { + buf.put(avatarBuf); + // These are optional and not used for SWG + //buf.putInt(requiredLoginPriority); + //buf.put(email.serialize()); + //buf.putInt(inboxLimit); + } + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + + +} diff --git a/src/main/java/chat/protocol/response/ResLogoutAvatar.java b/src/main/java/chat/protocol/response/ResLogoutAvatar.java new file mode 100644 index 0000000..9535166 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResLogoutAvatar.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResLogoutAvatar extends GenericResponse { + + public ResLogoutAvatar() { + type = RESPONSE_LOGOUTAVATAR; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResRegistrarGetChatServer.java b/src/main/java/chat/protocol/response/ResRegistrarGetChatServer.java new file mode 100644 index 0000000..2be9bcb --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRegistrarGetChatServer.java @@ -0,0 +1,51 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import chat.protocol.GenericResponse; +import chat.util.ChatUnicodeString; + +public class ResRegistrarGetChatServer extends GenericResponse { + + private ChatUnicodeString hostname; + private short port; + + public ResRegistrarGetChatServer() { + type = GenericResponse.RESPONSE_REGISTRAR_GETCHATSERVER; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(20 + hostname.getStringLength() * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.put(hostname.serialize()); + buf.putShort(port); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + } + + public ChatUnicodeString getHostname() { + return hostname; + } + + public void setHostname(ChatUnicodeString hostname) { + this.hostname = hostname; + } + + public short getPort() { + return port; + } + + public void setPort(short port) { + this.port = port; + } + +} diff --git a/src/main/java/chat/protocol/response/ResRemoveBan.java b/src/main/java/chat/protocol/response/ResRemoveBan.java new file mode 100644 index 0000000..f1f47a4 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRemoveBan.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResRemoveBan extends GenericResponse { + + private int destRoomId; + + public ResRemoveBan() { + type = RESPONSE_REMOVEBAN; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResRemoveFriend.java b/src/main/java/chat/protocol/response/ResRemoveFriend.java new file mode 100644 index 0000000..9ed357a --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRemoveFriend.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResRemoveFriend extends GenericResponse { + + public ResRemoveFriend() { + type = RESPONSE_REMOVEFRIEND; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResRemoveIgnore.java b/src/main/java/chat/protocol/response/ResRemoveIgnore.java new file mode 100644 index 0000000..1b985d1 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRemoveIgnore.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResRemoveIgnore extends GenericResponse { + + public ResRemoveIgnore() { + type = RESPONSE_REMOVEIGNORE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResRemoveInvite.java b/src/main/java/chat/protocol/response/ResRemoveInvite.java new file mode 100644 index 0000000..db7a681 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRemoveInvite.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResRemoveInvite extends GenericResponse { + + private int destRoomId; + + public ResRemoveInvite() { + type = RESPONSE_REMOVEINVITE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResRemoveModerator.java b/src/main/java/chat/protocol/response/ResRemoveModerator.java new file mode 100644 index 0000000..505003a --- /dev/null +++ b/src/main/java/chat/protocol/response/ResRemoveModerator.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResRemoveModerator extends GenericResponse { + + private int destRoomId; + + public ResRemoveModerator() { + type = RESPONSE_REMOVEMODERATOR; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResSendApiVersion.java b/src/main/java/chat/protocol/response/ResSendApiVersion.java new file mode 100644 index 0000000..b3c9a74 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResSendApiVersion.java @@ -0,0 +1,42 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResSendApiVersion extends GenericResponse { + + private int version; + + public ResSendApiVersion() { + type = RESPONSE_SETAPIVERSION; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(version); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + +} diff --git a/src/main/java/chat/protocol/response/ResSendInstantMessage.java b/src/main/java/chat/protocol/response/ResSendInstantMessage.java new file mode 100644 index 0000000..236a533 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResSendInstantMessage.java @@ -0,0 +1,31 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResSendInstantMessage extends GenericResponse { + + public ResSendInstantMessage() { + type = RESPONSE_SENDINSTANTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/chat/protocol/response/ResSendPersistentMessage.java b/src/main/java/chat/protocol/response/ResSendPersistentMessage.java new file mode 100644 index 0000000..853de96 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResSendPersistentMessage.java @@ -0,0 +1,42 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResSendPersistentMessage extends GenericResponse { + + private int messageId; + + public ResSendPersistentMessage() { + type = RESPONSE_SENDPERSISTENTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(result == ResponseResult.CHATRESULT_SUCCESS ? 18 : 14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + if(result == ResponseResult.CHATRESULT_SUCCESS) + buf.putInt(messageId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getMessageId() { + return messageId; + } + + public void setMessageId(int messageId) { + this.messageId = messageId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResSendRoomMessage.java b/src/main/java/chat/protocol/response/ResSendRoomMessage.java new file mode 100644 index 0000000..0467292 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResSendRoomMessage.java @@ -0,0 +1,41 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResSendRoomMessage extends GenericResponse { + + private int destRoomId; + + public ResSendRoomMessage() { + type = RESPONSE_SENDROOMMESSAGE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.putInt(destRoomId); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResSetAvatarAttributes.java b/src/main/java/chat/protocol/response/ResSetAvatarAttributes.java new file mode 100644 index 0000000..6c6ad07 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResSetAvatarAttributes.java @@ -0,0 +1,52 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatAvatar; +import chat.protocol.GenericResponse; + +public class ResSetAvatarAttributes extends GenericResponse { + + private ChatAvatar avatar; + + public ResSetAvatarAttributes() { + type = RESPONSE_SETAVATARATTRIBUTES; + } + + @Override + public ByteBuffer serialize() { + if(result == ResponseResult.CHATRESULT_SUCCESS) { + byte[] avatarBuf = avatar.serialize(); + ByteBuffer buf = ByteBuffer.allocate(14 + avatarBuf.length).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + buf.put(avatarBuf); + writeSize(buf); + return buf; + } else { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + } + + @Override + public void deserialize(ByteBuffer buf) { + } + + public ChatAvatar getAvatar() { + return avatar; + } + + public void setAvatar(ChatAvatar avatar) { + this.avatar = avatar; + } + +} diff --git a/src/main/java/chat/protocol/response/ResUnregisterRoom.java b/src/main/java/chat/protocol/response/ResUnregisterRoom.java new file mode 100644 index 0000000..a8068eb --- /dev/null +++ b/src/main/java/chat/protocol/response/ResUnregisterRoom.java @@ -0,0 +1,62 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.ChatRoom; +import chat.protocol.GenericResponse; +import chat.util.ChatUnicodeString; + +public class ResUnregisterRoom extends GenericResponse { + + private int destRoomId; + private ChatRoom destRoom; + private ChatUnicodeString roomAddress = new ChatUnicodeString(); + + public ResUnregisterRoom() { + type = RESPONSE_UNREGISTERROOM; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(18).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track+1); + buf.putInt(result.ordinal()); + roomAddress.deserialize(buf); + writeSize(buf);freeNative(buf); + return buf; + } + + private void freeNative(ByteBuffer buf) { + // TODO Auto-generated method stub + + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + + public int getDestRoomId() { + return destRoomId; + } + + public ChatRoom getDestRoom() { + return destRoom; + } + + public ChatUnicodeString getRoomAddress() { + return roomAddress; + } + + public void setRoomAddress(ChatUnicodeString roomAddress) { + this.roomAddress = roomAddress; + } + + public void setDestRoomId(int destRoomId) { + this.destRoomId = destRoomId; + } + +} diff --git a/src/main/java/chat/protocol/response/ResUpdatePersistentMessage.java b/src/main/java/chat/protocol/response/ResUpdatePersistentMessage.java new file mode 100644 index 0000000..d7eb7c4 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResUpdatePersistentMessage.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResUpdatePersistentMessage extends GenericResponse { + + public ResUpdatePersistentMessage() { + type = RESPONSE_UPDATEPERSISTENTMESSAGE; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResUpdatePersistentMessages.java b/src/main/java/chat/protocol/response/ResUpdatePersistentMessages.java new file mode 100644 index 0000000..97991c0 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResUpdatePersistentMessages.java @@ -0,0 +1,30 @@ +package chat.protocol.response; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import chat.protocol.GenericResponse; + +public class ResUpdatePersistentMessages extends GenericResponse { + + public ResUpdatePersistentMessages() { + type = RESPONSE_UPDATEPERSISTENTMESSAGES; + } + + @Override + public ByteBuffer serialize() { + ByteBuffer buf = ByteBuffer.allocate(14).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(0); + buf.putShort(type); + buf.putInt(track); + buf.putInt(result.ordinal()); + writeSize(buf); + return buf; + } + + @Override + public void deserialize(ByteBuffer buf) { + + } + +} diff --git a/src/main/java/chat/protocol/response/ResponseResult.java b/src/main/java/chat/protocol/response/ResponseResult.java new file mode 100644 index 0000000..d225623 --- /dev/null +++ b/src/main/java/chat/protocol/response/ResponseResult.java @@ -0,0 +1,81 @@ +package chat.protocol.response; + +public enum ResponseResult { + + CHATRESULT_SUCCESS, + CHATRESULT_TIMEOUT, + CHATRESULT_DUPLICATELOGIN, + CHATRESULT_SRCAVATARDOESNTEXIST, + CHATRESULT_DESTAVATARDOESNTEXIST, + CHATRESULT_ADDRESSDOESNTEXIST, + CHATRESULT_ADDRESSNOTROOM, + CHATRESULT_ADDRESSNOTAID, + CHATRESULT_FRIENDNOTFOUND, + CHATRESULT_ROOM_UNKNOWNFAILURE, + CHATRESULT_ROOM_SRCNOTINROOM, + CHATRESULT_ROOM_DESTNOTINROOM, + CHATRESULT_ROOM_BANNEDAVATAR, + CHATRESULT_ROOM_PRIVATEROOM, + CHATRESULT_ROOM_MODERATEDROOM, + CHATRESULT_ROOM_NOTINROOM, + CHATRESULT_ROOM_NOPRIVILEGES, + CHATRESULT_DATABASE, + CHATRESULT_CANNOTGETAVATARID, + CHATRESULT_CANNOTGETNODEID, + CHATRESULT_CANNOTGETPMSGID, + CHATRESULT_PMSGNOTFOUND, + CHATRESULT_ROOMMAXAVATARSREACHED, + CHATRESULT_IGNORING, + CHATRESULT_ROOM_ALREADYEXISTS, + CHATRESULT_NOTHINGTOCONFIRM, + CHATRESULT_DUPLICATEFRIEND, + CHATRESULT_IGNORENOTFOUND, + CHATRESULT_DUPLICATEIGNORE, + CHATRESULT_DBFAIL, + CHATRESULT_ROOM_DESTAVATARISMODERATOR, + CHATRESULT_ROOM_DESTAVATARNOTINVITED, + CHATRESULT_ROOM_AVATARNOTINVITED, + CHATRESULT_ROOM_DESTAVATARISINVITED, + CHATRESULT_ROOM_DESTAVATARNOTBANNED, + CHATRESULT_ROOM_DUPLICATEBAN, + CHATRESULT_ROOM_DUPLICATEMODERATOR, + CHATRESULT_ROOM_DUPLICATEINVITE, + CHATRESULT_ROOM_ALREADYINROOM, + CHATRESULT_ROOM_PARENTNONPERSISTENT, + CHATRESULT_ROOM_PARENTBADNODETYPE, + CHATRESULT_NOFANCLUBHANDLE, + CHATRESULT_AIDALREADYEXISTS, + CHATRESULT_UIDALREADYEXISTS, + CHATRESULT_WRONGCHATSERVERFORREQUEST, + CHATRESULT_SUCCESSBADDATA, + CHATRESULT_NULLNAMELOGIN, + CHATRESULT_SERVER_IDENTITY_EMPTY, + CHATRESULT_SERVER_IDENTITY_TAKEN, + CHATRESULT_REMOTESERVERDOWN, + CHATRESULT_NODEIDCONFLICT, + CHATRESULT_INVALIDNODENAME, + CHATRESULT_INSUFFICIENTGMPRIVS, + CHATRESULT_SNOOPALREADYADDED, + CHATRESULT_NOTSNOOPING, + CHATRESULT_ROOM_DESTAVATARNOTTEMPORARYMODERATOR, + CHATRESULT_ROOM_DESTAVATARNOTVOICE, + CHATRESULT_ROOM_DUPLICATETEMPORARYMODERATOR, + CHATRESULT_ROOM_DUPLICATEVOICE, + CHATRESULT_AVATARMUSTBELOGGEDOUT, + CHATRESULT_NOTHINGTODO, + CHATRESULT_TRANSFERNAMENULL, + CHATRESULT_TRANSFERUSERIDZERO, + CHATRESULT_TRANSFERADDRESSNULL, + CHATRESULT_OUTOFIDS, + CHATRESULT_ROOM_LOCALROOM, + CHATRESULT_ROOM_GAMEROOM, + CHATRESULT_ROOM_DESTAVATARNOTENTERING, + CHATRESULT_INSUFFICIENTPRIORITY, + CHATRESULT_ROOM_WAITINGFORENTRY, + CHATRESULT_INBOXLIMITEXCEEDED, + CHATRESULT_DUPLICATEDESTINATION, + CHATRESULT_CATEGORYLIMITEXCEEDED, + CHATRESULT_MESSAGE_FILTER_FAILURE, + CHATRESULT_INVALID_INPUT, + +} diff --git a/src/main/java/chat/util/ChatUnicodeString.java b/src/main/java/chat/util/ChatUnicodeString.java new file mode 100644 index 0000000..02286b1 --- /dev/null +++ b/src/main/java/chat/util/ChatUnicodeString.java @@ -0,0 +1,50 @@ +package chat.util; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; + +public class ChatUnicodeString { + + private String string; + + public ChatUnicodeString(String string) { + setString(string); + } + + public ChatUnicodeString() { + string = new String(); + } + + public String getString() { + return string; + } + + public void setString(String string) { + this.string = string; + } + + public byte[] serialize() { + int length = getStringLength(); + ByteBuffer buf = ByteBuffer.allocate(4 + length * 2).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(length); + buf.put(string.getBytes(StandardCharsets.UTF_16LE)); + return buf.array(); + } + + public void deserialize(ByteBuffer buf) { + int length = buf.getInt(); + byte [] data = new byte[length * 2]; + buf.get(data); + string = new String(data, StandardCharsets.UTF_16LE); + } + + public int getStringLength() { + return string.length(); + } + + public boolean equals(ChatUnicodeString string) { + return getString().equals(string.getString()); + } + +} diff --git a/src/main/java/chat/util/Config.java b/src/main/java/chat/util/Config.java new file mode 100644 index 0000000..818fca7 --- /dev/null +++ b/src/main/java/chat/util/Config.java @@ -0,0 +1,141 @@ +package chat.util; + +import java.io.FileReader; +import java.io.FileWriter; +import java.util.Properties; + +/*! Reads and stores configuration data from a file */ +public class Config { + + Properties configData; + + String filePath; + + public Config() { + initialize(); + }; + + public Config(String filename) { + initialize(); + setFilePath(filename); + loadConfigFile(getFilePath()); + } + + /* ! Displays the current filePath and the key:value pairs of configData */ + public void displayData() { + System.out.println("File Path: " + getFilePath()); + configData.list(System.out); + } + + public boolean keyExists(String key) { + return (configData.getProperty(key) != null); + } + + public double getDouble(String key) { + return Double.parseDouble(getString(key)); + } + + public String getFilePath() { + return this.filePath; + } + + public int getInt(String key) { + return Integer.parseInt(getString(key)); + } + + public byte getByte(String key) { + return Byte.parseByte(getString(key)); + } + + public String getProperty(String key) { + return configData.getProperty(key); + } + + public String getString(String key) { + return getProperty(key); + } + + public boolean getBoolean(String key) { + return Boolean.valueOf(getString(key)); + } + + public void initialize() { + configData = new Properties(); + } + + public boolean loadConfigFile() { + + if (getFilePath() == null || getFilePath().isEmpty()) { + System.err + .println("Config.java loadConfigFile(): Attempted to load from a null or empty file path."); + return false; + } else + return loadConfigFile(getFilePath()); + } + + public boolean loadConfigFile(String filename) { + + FileReader reader; + + try { + + reader = new FileReader(filename); + synchronized (reader) { + configData = new Properties(); + configData.load(reader); + + return true; + } + + } catch (Exception e) { + e.printStackTrace(); + return false; + + } + } + + public boolean saveConfig() { + if (getFilePath() == null || getFilePath().isEmpty()) { + System.err + .println("Config.java saveConfig(): Attempted to save configuration to a null or empty filepath."); + return false; + } else { + return saveConfig(getFilePath()); + } + } + + public boolean saveConfig(String filename) { + FileWriter writer; + try { + writer = new FileWriter(filename); + synchronized (writer) { + configData.store(writer, null); + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public void setFilePath(String filename) { + this.filePath = filename; + } + + public void setProperty(String key, double value) { + String v = "" + value; + setProperty(key, v); + } + + public void setProperty(String key, int value) { + String v = "" + value; + setProperty(key, v); + } + + public void setProperty(String key, String value) { + configData.setProperty(key, value); + saveConfig(); + + } + +} \ No newline at end of file diff --git a/src/main/java/chat/util/PersistentAlterationStatus.java b/src/main/java/chat/util/PersistentAlterationStatus.java new file mode 100644 index 0000000..abbb655 --- /dev/null +++ b/src/main/java/chat/util/PersistentAlterationStatus.java @@ -0,0 +1,12 @@ +package chat.util; + +public class PersistentAlterationStatus { + + public static final byte ALTER_SENDER = 1; + public static final byte ALTER_SUBJECT = 2; + public static final byte ALTER_MSG = 4; + public static final byte ALTER_OOB = 8; + public static final byte ALTER_SENT_TIME = 16; + public static final byte ALTER_CATEGORY = 32; + +} diff --git a/src/main/java/chat/util/PersistentMessageStatus.java b/src/main/java/chat/util/PersistentMessageStatus.java new file mode 100644 index 0000000..073d82b --- /dev/null +++ b/src/main/java/chat/util/PersistentMessageStatus.java @@ -0,0 +1,11 @@ +package chat.util; + +public class PersistentMessageStatus { + + public static final byte NEW = 1; + public static final byte UNREAD = 2; + public static final byte READ = 3; + public static final byte TRASH = 4; + public static final byte DELETED = 5; + +} diff --git a/src/main/java/chat/util/SnoopTypes.java b/src/main/java/chat/util/SnoopTypes.java new file mode 100644 index 0000000..69ccb1f --- /dev/null +++ b/src/main/java/chat/util/SnoopTypes.java @@ -0,0 +1,10 @@ +package chat.util; + +public class SnoopTypes { + + public static final byte SNOOP_INSTANTMESSAGE = 0; + public static final byte SNOOP_ROOMMESSAGE = 1; + public static final byte SNOOP_PERSISTENTMESSAGE = 2; + public static final byte SNOOP_END = 3; + +} diff --git a/src/main/java/log4j2.xml b/src/main/java/log4j2.xml new file mode 100644 index 0000000..c7ffa02 --- /dev/null +++ b/src/main/java/log4j2.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file