From 7b6d897c31e701b77f89cdb4f89bc2b81adad758 Mon Sep 17 00:00:00 2001 From: Major- Date: Wed, 12 Feb 2014 17:46:56 +0000 Subject: [PATCH] Add private message support for r377. --- .../ForwardPrivateMessageEventEncoder.java | 34 +++++++++++++++++ .../apollo/net/release/r377/Release377.java | 3 ++ .../r377/SendPrivateMessageEventDecoder.java | 38 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/org/apollo/net/release/r377/ForwardPrivateMessageEventEncoder.java create mode 100644 src/org/apollo/net/release/r377/SendPrivateMessageEventDecoder.java diff --git a/src/org/apollo/net/release/r377/ForwardPrivateMessageEventEncoder.java b/src/org/apollo/net/release/r377/ForwardPrivateMessageEventEncoder.java new file mode 100644 index 00000000..347d1441 --- /dev/null +++ b/src/org/apollo/net/release/r377/ForwardPrivateMessageEventEncoder.java @@ -0,0 +1,34 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.event.impl.ForwardPrivateMessageEvent; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketBuilder; +import org.apollo.net.meta.PacketType; +import org.apollo.net.release.EventEncoder; +import org.apollo.util.NameUtil; + +/** + * An {@link EventEncoder} for the {@link ForwardPrivateMessageEvent}. + * + * @author Major + */ +public final class ForwardPrivateMessageEventEncoder extends EventEncoder { + + /** + * The amount of messages sent globally, offset by a random variable x, {@code 0 <= x < 100000000}. + */ + private static int messageCount = (int) (Math.random() * 100000000); + + @Override + public GamePacket encode(ForwardPrivateMessageEvent event) { + GamePacketBuilder builder = new GamePacketBuilder(135, PacketType.VARIABLE_BYTE); + + builder.put(DataType.LONG, NameUtil.encodeBase37(event.getSenderUsername())); + builder.put(DataType.INT, messageCount++); + builder.put(DataType.BYTE, event.getSenderPrivilege().toInteger()); + builder.putBytes(event.getMessage()); + return builder.toGamePacket(); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/Release377.java b/src/org/apollo/net/release/r377/Release377.java index e71a35d7..3c70d554 100644 --- a/src/org/apollo/net/release/r377/Release377.java +++ b/src/org/apollo/net/release/r377/Release377.java @@ -4,6 +4,7 @@ import org.apollo.game.event.impl.CloseInterfaceEvent; import org.apollo.game.event.impl.ConfigEvent; import org.apollo.game.event.impl.DisplayTabInterfaceEvent; import org.apollo.game.event.impl.EnterAmountEvent; +import org.apollo.game.event.impl.ForwardPrivateMessageEvent; import org.apollo.game.event.impl.FriendServerStatusEvent; import org.apollo.game.event.impl.IdAssignmentEvent; import org.apollo.game.event.impl.IgnoreListEvent; @@ -134,6 +135,7 @@ public final class Release377 extends Release { register(217, new AddIgnoreEventDecoder()); register(141, new RemoveFriendEventDecoder()); register(160, new RemoveIgnoreEventDecoder()); + register(227, new SendPrivateMessageEventDecoder()); // register encoders register(IdAssignmentEvent.class, new IdAssignmentEventEncoder()); @@ -163,6 +165,7 @@ public final class Release377 extends Release { register(UpdateRunEnergyEvent.class, new UpdateRunEnergyEventEncoder()); register(PrivacyOptionEvent.class, new PrivacyOptionEventEncoder()); + register(ForwardPrivateMessageEvent.class, new ForwardPrivateMessageEventEncoder()); register(FriendServerStatusEvent.class, new FriendServerStatusEventEncoder()); register(IgnoreListEvent.class, new IgnoreListEventEncoder()); register(SendFriendEvent.class, new SendFriendEventEncoder()); diff --git a/src/org/apollo/net/release/r377/SendPrivateMessageEventDecoder.java b/src/org/apollo/net/release/r377/SendPrivateMessageEventDecoder.java new file mode 100644 index 00000000..f26a7449 --- /dev/null +++ b/src/org/apollo/net/release/r377/SendPrivateMessageEventDecoder.java @@ -0,0 +1,38 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.event.impl.SendPrivateMessageEvent; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.release.EventDecoder; +import org.apollo.util.NameUtil; +import org.apollo.util.TextUtil; + +/** + * An {@link EventDecoder} for the {@link SendPrivateMessageEvent}. + * + * @author Major + */ +public final class SendPrivateMessageEventDecoder extends EventDecoder { + + @Override + public SendPrivateMessageEvent decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + + String username = NameUtil.decodeBase37(reader.getSigned(DataType.LONG)); + int length = packet.getLength() - 8; + + byte[] originalCompressed = new byte[length]; + reader.getBytes(originalCompressed); + + String uncompressed = TextUtil.uncompress(originalCompressed, length); + uncompressed = TextUtil.filterInvalidCharacters(uncompressed); + uncompressed = TextUtil.capitalize(uncompressed); + + byte[] recompressed = new byte[length]; + TextUtil.compress(uncompressed, recompressed); + + return new SendPrivateMessageEvent(username, new String(uncompressed), recompressed); + } + +} \ No newline at end of file