package handling.world;
import client.MapleCharacter;
import handling.channel.ChannelServer;
import handling.world.messenger.MapleMessenger;
import handling.world.messenger.MapleMessengerCharacter;
import handling.world.messenger.MessengerType;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import tools.packet.MessengerPacket;
public class WorldMessengerService {
private final Map<Integer, MapleMessenger> messengers;
private final AtomicInteger runningMessengerId;
public static WorldMessengerService getInstance() {
return SingletonHolder.instance;
}
private WorldMessengerService() {
this.runningMessengerId = new AtomicInteger(1);
this.messengers = new HashMap();
}
public MapleMessenger createMessenger(MapleMessengerCharacter chrfor, MessengerType type, boolean gm) {
int messengerid = this.runningMessengerId.getAndIncrement();
MapleMessenger messenger = new MapleMessenger(messengerid, chrfor, type, gm);
this.messengers.put(messenger.getId(), messenger);
return messenger;
}
public void declineChat(String target, String nameFrom) {
MapleCharacter player = WorldFindService.getInstance().findCharacterByName(target);
if ((player != null)
&& (player.getMessenger() != null)) {
player.getClient().getSession().write(MessengerPacket.messengerNote(nameFrom, 5, 0));
}
}
public MapleMessenger getMessenger(int messengerId) {
return (MapleMessenger) this.messengers.get(messengerId);
}
public MapleMessenger getRandomMessenger(MessengerType type) {
for (Map.Entry ms : this.messengers.entrySet()) {
MapleMessenger messenger = (MapleMessenger) ms.getValue();
if ((messenger != null) && (messenger.getType() == type) && (messenger.getLowestPosition() != -1) && (!messenger.isHide())) {
return messenger;
}
}
return null;
}
public MapleMessenger getRandomHideMessenger(MessengerType type) {
for (Map.Entry ms : this.messengers.entrySet()) {
MapleMessenger messenger = (MapleMessenger) ms.getValue();
if ((messenger != null) && (messenger.getType() == type) && (messenger.getLowestPosition() != -1) && (messenger.isHide())) {
return messenger;
}
}
return null;
}
public void leaveMessenger(int messengerId, MapleMessengerCharacter target) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
int position = messenger.getPositionByName(target.getName());
messenger.removeMember(target);
for (MapleMessengerCharacter mmc : messenger.getMembers()) {
if (mmc != null) {
MapleCharacter player = WorldFindService.getInstance().findCharacterById(mmc.getId());
if (player != null) {
player.getClient().getSession().write(MessengerPacket.removeMessengerPlayer(position));
}
}
}
}
public void silentLeaveMessenger(int messengerId, MapleMessengerCharacter target) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
messenger.silentRemoveMember(target);
}
public void silentJoinMessenger(int messengerId, MapleMessengerCharacter target) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
messenger.silentAddMember(target);
}
public void updateMessenger(int messengerId, String nameFrom, int fromChannel) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
int position = messenger.getPositionByName(nameFrom);
for (MapleMessengerCharacter mmc : messenger.getMembers()) {
if ((mmc != null) && (!mmc.getName().equals(nameFrom))) {
MapleCharacter player = WorldFindService.getInstance().findCharacterByName(mmc.getName());
if (player != null) {
MapleCharacter fromplayer = ChannelServer.getInstance(fromChannel).getPlayerStorage().getCharacterByName(nameFrom);
if (fromplayer != null) {
player.getClient().getSession().write(MessengerPacket.updateMessengerPlayer(nameFrom, fromplayer, position, fromChannel - 1));
}
}
}
}
}
public void joinMessenger(int messengerId, MapleMessengerCharacter target, String from, int fromChannel) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
messenger.addMember(target);
int position = messenger.getPositionByName(target.getName());
for (MapleMessengerCharacter mmc : messenger.getMembers()) {
if (mmc != null) {
int mposition = messenger.getPositionByName(mmc.getName());
MapleCharacter player = WorldFindService.getInstance().findCharacterByName(mmc.getName());
if (player != null) {
if (!mmc.getName().equals(from)) {
MapleCharacter fromplayer = ChannelServer.getInstance(fromChannel).getPlayerStorage().getCharacterByName(from);
if (fromplayer != null) {
player.getClient().getSession().write(MessengerPacket.addMessengerPlayer(from, fromplayer, position, fromChannel - 1));
fromplayer.getClient().getSession().write(MessengerPacket.addMessengerPlayer(player.getName(), player, mposition, mmc.getChannel() - 1));
}
} else {
player.getClient().getSession().write(MessengerPacket.joinMessenger(mposition));
}
}
}
}
}
public void messengerChat(int messengerId, String chatText, String namefrom, String postxt) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
for (MapleMessengerCharacter mmc : messenger.getMembers()) {
if ((mmc != null) && (!mmc.getName().equals(namefrom))) {
MapleCharacter player = WorldFindService.getInstance().findCharacterByName(mmc.getName());
if (player != null) {
player.getClient().getSession().write(MessengerPacket.messengerChat(chatText, postxt));
}
}
}
}
public void messengerWhisper(int messengerId, String chatText, String namefrom, int position) {
MapleMessenger messenger = getMessenger(messengerId);
if (messenger == null) {
throw new IllegalArgumentException("No messenger with the specified messengerid exists");
}
MapleMessengerCharacter mmc = messenger.getMemberByPos(position);
if ((mmc != null) && (!mmc.getName().equals(namefrom))) {
MapleCharacter player = WorldFindService.getInstance().findCharacterByName(mmc.getName());
if (player != null) {
player.getClient().getSession().write(MessengerPacket.messengerWhisper(namefrom, chatText));
}
}
}
public void messengerInvite(String sender, int messengerId, String target, int fromChannel, boolean gm) {
MapleCharacter fromplayer = ChannelServer.getInstance(fromChannel).getPlayerStorage().getCharacterByName(sender);
MapleCharacter targetplayer = WorldFindService.getInstance().findCharacterByName(target);
if ((targetplayer != null) && (fromplayer != null)) {
if ((!targetplayer.isIntern()) || (gm)) {
targetplayer.getClient().getSession().write(MessengerPacket.messengerInvite(sender, messengerId, fromChannel - 1));
fromplayer.getClient().getSession().write(MessengerPacket.messengerNote(target, 4, 1));
} else {
fromplayer.getClient().getSession().write(MessengerPacket.messengerNote(target, 4, 0));
}
}
}
private static class SingletonHolder {
protected static final WorldMessengerService instance = new WorldMessengerService();
}
}