mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-20 10:03:02 -04:00
Made a huge refactor to ChatService to improve readability and reduce bugs
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
package services.chat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
@@ -17,6 +18,7 @@ import intents.chat.ChatBroadcastIntent.BroadcastType;
|
||||
import intents.chat.PersistentMessageIntent;
|
||||
import intents.chat.SpatialChatIntent;
|
||||
import network.packets.Packet;
|
||||
import network.packets.swg.SWGPacket;
|
||||
import network.packets.swg.zone.ChatRequestRoomList;
|
||||
import network.packets.swg.zone.chat.ChatDeletePersistentMessage;
|
||||
import network.packets.swg.zone.chat.ChatInstantMessageToCharacter;
|
||||
@@ -71,122 +73,146 @@ public class ChatService extends Service {
|
||||
}
|
||||
|
||||
public void onIntentReceived(Intent i) {
|
||||
if (i instanceof GalacticPacketIntent) {
|
||||
Packet p = ((GalacticPacketIntent) i).getPacket();
|
||||
long netId = ((GalacticPacketIntent) i).getNetworkId();
|
||||
Player player = ((GalacticPacketIntent) i).getPlayerManager().getPlayerFromNetworkId(netId);
|
||||
if (player != null) {
|
||||
switch (i.getType()) {
|
||||
case GalacticPacketIntent.TYPE:
|
||||
if (i instanceof GalacticPacketIntent)
|
||||
processPacket((GalacticPacketIntent) i);
|
||||
break;
|
||||
case SpatialChatIntent.TYPE:
|
||||
if (i instanceof SpatialChatIntent)
|
||||
handleSpatialChat((SpatialChatIntent) i);
|
||||
break;
|
||||
case PersistentMessageIntent.TYPE:
|
||||
if (i instanceof PersistentMessageIntent)
|
||||
handlePersistentMessageIntent((PersistentMessageIntent) i);
|
||||
break;
|
||||
case PlayerEventIntent.TYPE:
|
||||
if (i instanceof PlayerEventIntent)
|
||||
handlePlayerEventIntent((PlayerEventIntent) i);
|
||||
break;
|
||||
case ChatBroadcastIntent.TYPE:
|
||||
if (i instanceof ChatBroadcastIntent)
|
||||
handleChatBroadcast((ChatBroadcastIntent) i);
|
||||
break;
|
||||
case ServerStatusIntent.TYPE:
|
||||
if (i instanceof ServerStatusIntent)
|
||||
if (((ServerStatusIntent)i).getStatus() == ServerStatus.SHUTDOWN_REQUESTED)
|
||||
sendShutdownBroadcasts(((ServerStatusIntent) i).getTime());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void processPacket(GalacticPacketIntent intent) {
|
||||
Player player = intent.getPlayerManager().getPlayerFromNetworkId(intent.getNetworkId());
|
||||
if (player == null)
|
||||
return;
|
||||
Packet p = intent.getPacket();
|
||||
if (p instanceof SWGPacket)
|
||||
processSwgPacket(intent.getPlayerManager(), player, intent.getGalaxy().getName(), (SWGPacket) p);
|
||||
}
|
||||
|
||||
private void processSwgPacket(PlayerManager pm, Player player, String galaxyName, SWGPacket p) {
|
||||
switch (p.getPacketType()) {
|
||||
case CHAT_REQUEST_ROOM_LIST:
|
||||
if (p instanceof ChatRequestRoomList)
|
||||
handleChatRoomListRequest(player, (ChatRequestRoomList) p);
|
||||
else if (p instanceof ChatInstantMessageToCharacter)
|
||||
handleInstantMessage(((GalacticPacketIntent) i).getPlayerManager(), player, (ChatInstantMessageToCharacter) p);
|
||||
else if (p instanceof ChatPersistentMessageToServer)
|
||||
handleSendPersistentMessage(((GalacticPacketIntent) i).getPlayerManager(), player,
|
||||
((GalacticPacketIntent) i).getGalaxy().getName(), (ChatPersistentMessageToServer) p);
|
||||
else if (p instanceof ChatRequestPersistentMessage)
|
||||
handlePersistentMessageRequest(player, ((GalacticPacketIntent) i).getGalaxy().getName(), (ChatRequestPersistentMessage) p);
|
||||
else if (p instanceof ChatDeletePersistentMessage)
|
||||
break;
|
||||
case CHAT_INSTANT_MESSAGE_TO_CHARACTER:
|
||||
if (p instanceof ChatInstantMessageToCharacter)
|
||||
handleInstantMessage(pm, player, (ChatInstantMessageToCharacter) p);
|
||||
break;
|
||||
case CHAT_PERSISTENT_MESSAGE_TO_SERVER:
|
||||
if (p instanceof ChatPersistentMessageToServer)
|
||||
handleSendPersistentMessage(pm, player, galaxyName, (ChatPersistentMessageToServer) p);
|
||||
break;
|
||||
case CHAT_REQUEST_PERSISTENT_MESSAGE:
|
||||
if (p instanceof ChatRequestPersistentMessage)
|
||||
handlePersistentMessageRequest(player, galaxyName, (ChatRequestPersistentMessage) p);
|
||||
break;
|
||||
case CHAT_DELETE_PERSISTENT_MESSAGE:
|
||||
if (p instanceof ChatDeletePersistentMessage)
|
||||
deletePersistentMessage(((ChatDeletePersistentMessage) p).getMailId());
|
||||
}
|
||||
}
|
||||
else if (i instanceof SpatialChatIntent)
|
||||
handleSpatialChat((SpatialChatIntent) i);
|
||||
else if (i instanceof PersistentMessageIntent)
|
||||
handlePersistentMessageIntent((PersistentMessageIntent) i);
|
||||
else if (i instanceof PlayerEventIntent)
|
||||
handlePlayerEventIntent((PlayerEventIntent) i);
|
||||
else if (i instanceof ChatBroadcastIntent)
|
||||
handleChatBroadcast((ChatBroadcastIntent) i);
|
||||
else if (i instanceof ServerStatusIntent && ((ServerStatusIntent) i).getStatus() == ServerStatus.SHUTDOWN_REQUESTED)
|
||||
sendShutdownBroadcasts(((ServerStatusIntent) i).getTime());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void handlePlayerEventIntent(PlayerEventIntent intent) {
|
||||
switch(intent.getEvent()) {
|
||||
case PE_ZONE_IN:
|
||||
sendPersistentMessageHeaders(intent.getPlayer(), intent.getGalaxy());
|
||||
break;
|
||||
default: break;
|
||||
switch (intent.getEvent()) {
|
||||
case PE_ZONE_IN:
|
||||
sendPersistentMessageHeaders(intent.getPlayer(), intent.getGalaxy());
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleChatBroadcast(ChatBroadcastIntent i) {
|
||||
if (i.getBroadcastType() == BroadcastType.AREA)
|
||||
broadcastAreaMessage(i.getMessage(), i.getBroadcaster());
|
||||
else broadcastGalaxyMessage(i.getMessage(), i.getTerrain());
|
||||
else
|
||||
broadcastGalaxyMessage(i.getMessage(), i.getTerrain());
|
||||
}
|
||||
|
||||
|
||||
private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) {
|
||||
// ChatRoomList list = new ChatRoomList();
|
||||
// list.addChatRoom(new ChatRoom(1, 0, 0, "SWG.Josh Wifi.Chat.tcpa", "SWG", "Josh Wifi", player.getCreatureObject().getName(), player.getCreatureObject().getName(), "Chat"));
|
||||
// sendPacket(player, list);
|
||||
|
||||
}
|
||||
|
||||
private void handleSpatialChat(SpatialChatIntent i) {
|
||||
// TODO: Emotes, also figure out one of the unknown ints. Might be that "Player A says to Player B" is one of the unknowns. (targetId in SpatialChat packet)
|
||||
Player sender = i.getPlayer();
|
||||
SWGObject actor = sender.getCreatureObject();
|
||||
|
||||
|
||||
// Send to self
|
||||
SpatialChat message = new SpatialChat(actor.getObjectId(), 0, i.getMessage(), i.getChatType(), i.getMoodId());
|
||||
ObjectController controller = new ObjectController(SpatialChat.CRC, actor.getObjectId(), message);
|
||||
|
||||
sender.sendPacket(controller);
|
||||
sender.sendPacket(new ObjectController(SpatialChat.CRC, actor.getObjectId(), message));
|
||||
|
||||
// Notify observers of the chat message
|
||||
for (Player observer : actor.getObservers()) {
|
||||
if (observer.getCreatureObject() == null)
|
||||
continue;
|
||||
|
||||
controller = new ObjectController(244, observer.getCreatureObject().getObjectId(), message);
|
||||
observer.sendPacket(controller);
|
||||
long id = observer.getCreatureObject().getObjectId();
|
||||
observer.sendPacket(new ObjectController(SpatialChat.CRC, id, message));
|
||||
}
|
||||
}
|
||||
|
||||
private void handleInstantMessage(PlayerManager playerMgr, Player sender, ChatInstantMessageToCharacter request) {
|
||||
String strReceiver = request.getCharacter().toLowerCase();
|
||||
String strSender = sender.getCharacterName().toLowerCase();
|
||||
String strReceiver = request.getCharacter().toLowerCase(Locale.ENGLISH);
|
||||
String strSender = sender.getCharacterName().toLowerCase(Locale.ENGLISH);
|
||||
|
||||
if (strSender.contains(" "))
|
||||
strSender = strSender.split(" ")[0];
|
||||
|
||||
Player receiver = playerMgr.getPlayerByCreatureFirstName(strReceiver);
|
||||
|
||||
|
||||
int errorCode = 0; // 0 = No issue, 4 = "strReceiver is not online"
|
||||
if (receiver == null)
|
||||
errorCode = 4;
|
||||
|
||||
ChatOnSendInstantMessage response = new ChatOnSendInstantMessage(errorCode, request.getSequence());
|
||||
sender.sendPacket(response);
|
||||
sender.sendPacket(new ChatOnSendInstantMessage(errorCode, request.getSequence()));
|
||||
|
||||
if (errorCode == 4)
|
||||
if (receiver == null)
|
||||
return;
|
||||
|
||||
receiver.sendPacket(new ChatInstantMessageToClient(request.getGalaxy(), strSender, request.getMessage()));
|
||||
}
|
||||
|
||||
private void handleSendPersistentMessage(PlayerManager playerMgr, Player sender, String galaxy, ChatPersistentMessageToServer request) {
|
||||
|
||||
String recipientStr = request.getRecipient().toLowerCase();
|
||||
String recipientStr = request.getRecipient().toLowerCase(Locale.ENGLISH);
|
||||
|
||||
if (recipientStr.contains(" "))
|
||||
recipientStr = recipientStr.split(" ")[0];
|
||||
|
||||
Player recipient = playerMgr.getPlayerByCreatureFirstName(recipientStr);
|
||||
|
||||
long recId = (recipient == null ? playerMgr.getCharacterIdByName(request.getRecipient()) : recipient.getCreatureObject().getObjectId());
|
||||
|
||||
int errorCode = 0;
|
||||
|
||||
if (recId == 0)
|
||||
errorCode = 4;
|
||||
|
||||
ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(errorCode, request.getCounter());
|
||||
sender.sendPacket(response);
|
||||
sender.sendPacket(new ChatOnSendPersistentMessage(errorCode, request.getCounter()));
|
||||
|
||||
Mail mail = new Mail(sender.getCharacterName(), request.getSubject(), request.getMessage(), recId);
|
||||
mail.setId(maxMailId);
|
||||
maxMailId++;
|
||||
mail.setId(maxMailId++);
|
||||
mail.setTimestamp((int) (new Date().getTime() / 1000));
|
||||
|
||||
mails.put(mail.getId(), mail);
|
||||
@@ -243,9 +269,8 @@ public class ChatService extends Service {
|
||||
|
||||
private void sendShutdownBroadcasts(final long time) {
|
||||
final AtomicInteger runCount = new AtomicInteger();
|
||||
final long interval = (int) (time / 3);
|
||||
|
||||
final int interval = (int) (time / 3);
|
||||
|
||||
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
|
||||
public void run() {
|
||||
switch(runCount.getAndIncrement()) {
|
||||
@@ -268,14 +293,12 @@ public class ChatService extends Service {
|
||||
}
|
||||
|
||||
private void sendPersistentMessageHeaders(Player player, String galaxy) {
|
||||
|
||||
if (player == null || player.getCreatureObject() == null)
|
||||
return;
|
||||
|
||||
final List <Mail> playersMail = new LinkedList<Mail>();
|
||||
final long receiverId = player.getCreatureObject().getObjectId();
|
||||
|
||||
final List<Mail> playersMail = new ArrayList<Mail>();
|
||||
|
||||
mails.traverse(new Traverser<Mail>() {
|
||||
@Override
|
||||
public void process(Mail element) {
|
||||
@@ -284,10 +307,8 @@ public class ChatService extends Service {
|
||||
}
|
||||
});
|
||||
|
||||
if (playersMail.isEmpty())
|
||||
return;
|
||||
|
||||
for (Mail mail : playersMail) { sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy); }
|
||||
for (Mail mail : playersMail)
|
||||
sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy);
|
||||
}
|
||||
|
||||
private void sendPersistentMessage(Player receiver, Mail mail, MailFlagType requestType, String galaxy) {
|
||||
@@ -296,18 +317,14 @@ public class ChatService extends Service {
|
||||
|
||||
ChatPersistentMessageToClient packet = null;
|
||||
|
||||
switch(requestType) {
|
||||
case FULL_MESSAGE:
|
||||
packet = new ChatPersistentMessageToClient((byte) 0, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), mail.getMessage(), mail.getTimestamp(), mail.getStatus());
|
||||
break;
|
||||
|
||||
case HEADER_ONLY:
|
||||
packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus());
|
||||
break;
|
||||
|
||||
default:
|
||||
packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus());
|
||||
break;
|
||||
switch (requestType) {
|
||||
case FULL_MESSAGE:
|
||||
packet = new ChatPersistentMessageToClient((byte) 0, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), mail.getMessage(), mail.getTimestamp(), mail.getStatus());
|
||||
break;
|
||||
case HEADER_ONLY:
|
||||
default:
|
||||
packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus());
|
||||
break;
|
||||
}
|
||||
|
||||
receiver.sendPacket(packet);
|
||||
|
||||
Reference in New Issue
Block a user