package javastory.channel.handling;
import java.rmi.RemoteException;
import javastory.channel.ChannelCharacter;
import javastory.channel.ChannelClient;
import javastory.channel.ChannelServer;
import javastory.channel.Messenger;
import javastory.channel.MessengerMember;
import javastory.channel.PartyMember;
import javastory.io.PacketFormatException;
import javastory.io.PacketReader;
import javastory.rmi.WorldChannelInterface;
import javastory.tools.packets.ChannelPackets;
public class ChatHandler {
public static void handleGeneralChat(final String text, final byte unk, final ChannelClient c, final ChannelCharacter chr) {
// TODO: Add commands later.
if (!chr.isGM() && text.length() >= 80) {
return;
}
final ChannelCharacter player = c.getPlayer();
chr.getMap().broadcastMessage(ChannelPackets.getChatText(chr.getId(), text, player.isGM(), unk), player.getPosition());
}
public static void handleGroupChat(final PacketReader reader, final ChannelClient c, final ChannelCharacter chr) throws PacketFormatException {
final int type = reader.readByte();
final byte numRecipients = reader.readByte();
final int recipients[] = new int[numRecipients];
for (byte i = 0; i < numRecipients; i++) {
recipients[i] = reader.readInt();
}
final String message = reader.readLengthPrefixedString();
try {
final WorldChannelInterface worldInterface = ChannelServer.getWorldInterface();
switch (type) {
case 0:
worldInterface.buddyChat(recipients, chr.getId(), chr.getName(), message);
break;
case 1:
final PartyMember member = chr.getPartyMembership();
if (member == null) {
break;
}
worldInterface.partyChat(member.getPartyId(), message, chr.getName());
break;
case 2:
worldInterface.guildChat(chr.getGuildId(), chr.getName(), chr.getId(), message);
break;
}
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
}
public static void handleMessenger(final PacketReader reader, final ChannelClient c) throws PacketFormatException {
String input;
final WorldChannelInterface wci = ChannelServer.getWorldInterface();
final ChannelCharacter player = c.getPlayer();
Messenger messenger = player.getMessenger();
switch (reader.readByte()) {
case 0x00: // open
if (messenger == null) {
final int messengerid = reader.readInt();
if (messengerid == 0) { // create
try {
final MessengerMember messengerplayer = new MessengerMember(player);
messenger = wci.createMessenger(messengerplayer);
player.setMessenger(messenger);
player.setMessengerPosition(0);
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
} else { // join
try {
messenger = wci.getMessenger(messengerid);
if (messenger != null) {
final int position = messenger.getLowestPosition();
final MessengerMember messengerplayer = new MessengerMember(player, position);
if (messenger.getMembers().size() < 3) {
player.setMessenger(messenger);
player.setMessengerPosition(position);
wci.joinMessenger(messenger.getId(), messengerplayer, player.getName(), messengerplayer.getChannel());
}
}
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
}
}
break;
case 0x02: // exit
if (messenger != null) {
final MessengerMember messengerplayer = new MessengerMember(player);
try {
wci.leaveMessenger(messenger.getId(), messengerplayer);
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
player.setMessenger(null);
player.setMessengerPosition(4);
}
break;
case 0x03: // invite
if (messenger.getMembers().size() < 3) {
input = reader.readLengthPrefixedString();
final ChannelCharacter target = ChannelServer.getPlayerStorage().getCharacterByName(input);
if (target != null) {
if (target.getMessenger() == null) {
target.getClient().write(ChannelPackets.messengerInvite(player.getName(), messenger.getId()));
if (!target.isGM()) {
c.write(ChannelPackets.messengerNote(input, 4, 1));
} else {
c.write(ChannelPackets.messengerNote(input, 4, 0));
}
} else {
c.write(ChannelPackets.messengerChat(player.getName() + " : " + input + " is already using Maple Messenger"));
}
} else {
try {
if (wci.isConnected(input)) {
wci.messengerInvite(player.getName(), messenger.getId(), input, c.getChannelId());
} else {
c.write(ChannelPackets.messengerNote(input, 4, 0));
}
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
}
}
break;
case 0x05: // decline
final String targeted = reader.readLengthPrefixedString();
final ChannelCharacter target = ChannelServer.getPlayerStorage().getCharacterByName(targeted);
if (target != null) { // This channel
if (target.getMessenger() != null) {
target.getClient().write(ChannelPackets.messengerNote(player.getName(), 5, 0));
}
} else { // Other channel
try {
if (!player.isGM()) {
wci.declineChat(targeted, player.getName());
}
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
}
break;
case 0x06: // message
if (messenger != null) {
final MessengerMember messengerplayer = new MessengerMember(player);
input = reader.readLengthPrefixedString();
try {
wci.messengerChat(messenger.getId(), messengerplayer.getName(), input);
} catch (final RemoteException e) {
ChannelServer.pingWorld();
}
}
break;
}
}
public static void handleWhisper(final PacketReader reader, final ChannelClient c) throws PacketFormatException {
final byte mode = reader.readByte();
reader.readInt();
final ChannelCharacter player = c.getPlayer();
switch (mode) {
case 5: { // Find
final String recipient = reader.readLengthPrefixedString();
final ChannelCharacter target = ChannelServer.getPlayerStorage().getCharacterByName(recipient);
if (target != null) {
if (!target.isGM() || player.isGM() && target.isGM()) {
c.write(ChannelPackets.getFindReplyWithMap(target.getName(), target.getMap().getId()));
} else {
c.write(ChannelPackets.getWhisperReply(recipient, (byte) 0));
}
} else { // Not found
// TODO: Not complete, finish when proper ChannelServer remoting
// is done.
c.write(ChannelPackets.getWhisperReply(recipient, (byte) 0));
}
break;
}
case 6: { // Whisper
final String recipient = reader.readLengthPrefixedString();
final String text = reader.readLengthPrefixedString();
final ChannelCharacter target = ChannelServer.getPlayerStorage().getCharacterByName(recipient);
if (target != null) {
target.getClient().write(ChannelPackets.getWhisper(player.getName(), c.getChannelId(), text));
if (target.isGM()) {
c.write(ChannelPackets.getWhisperReply(recipient, (byte) 0));
} else {
c.write(ChannelPackets.getWhisperReply(recipient, (byte) 1));
}
} else { // Not found
// TODO: Not complete, finish when proper ChannelServer remoting
// is done.
c.write(ChannelPackets.getWhisperReply(recipient, (byte) 0));
}
break;
}
}
}
}