Skip to content

Commit 66416a4

Browse files
committed
Redact player names in messages
1 parent 7399f95 commit 66416a4

3 files changed

Lines changed: 52 additions & 12 deletions

File tree

Apps/Redact/Program.cs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Text.RegularExpressions;
34

45
using OXGaming.TibiaAPI;
56
using OXGaming.TibiaAPI.Constants;
@@ -9,6 +10,8 @@ namespace Redact
910
{
1011
class Program
1112
{
13+
static Regex _lookPlayerRx = new Regex(@"you see .*\(level \d+\).*(she|he) is", RegexOptions.Compiled | RegexOptions.IgnoreCase);
14+
1215
static string _recordingName;
1316

1417
static bool _keepClientPackets;
@@ -126,6 +129,7 @@ static void Redact()
126129
client.Connection.OnReceivedServerCreateOnMapPacket += Connection_OnReceivedServerCreateOnMapPacket;
127130
client.Connection.OnReceivedServerCreatureUpdatePacket += Connection_OnReceivedServerCreatureUpdatePacket;
128131
client.Connection.OnReceivedServerTalkPacket += Connection_OnReceivedServerTalkPacket;
132+
client.Connection.OnReceivedServerMessagePacket += Connection_OnReceivedServerMessagePacket;
129133

130134
// These packets aren't necessary in a redacted recording.
131135
if (_keepClientPackets)
@@ -165,21 +169,29 @@ static void Redact()
165169

166170
writer.Write(version);
167171

172+
var clientSequenceNumber = 0u;
173+
var serverSequenceNumber = 0u;
174+
168175
while (reader.BaseStream.Position < reader.BaseStream.Length)
169176
{
170177
var packetType = (PacketType)reader.ReadByte();
171178
var timestamp = reader.ReadInt64();
172179
var size = reader.ReadUInt32();
180+
181+
// If the Record app wasn't properly shutdown, a recording could
182+
// possibly be missing data at the end.
183+
if (reader.BaseStream.Length - reader.BaseStream.Position < size)
184+
{
185+
break;
186+
}
187+
173188
_ = reader.ReadUInt16(); // packet size
174-
var sequenceNumber = reader.ReadUInt32();
189+
_ = reader.ReadUInt32(); // sequence number
190+
var outMessage = new NetworkMessage(client);
175191
var message = new NetworkMessage(client)
176192
{
177193
Size = size
178194
};
179-
var outMessage = new NetworkMessage(client)
180-
{
181-
SequenceNumber = sequenceNumber
182-
};
183195

184196
reader.BaseStream.Position -= 6;
185197
Array.Copy(reader.ReadBytes((int)message.Size), message.GetBuffer(), message.Size);
@@ -199,9 +211,10 @@ static void Redact()
199211
continue;
200212
}
201213

202-
// Prepare the message to send without an XTEA key so that the proper
214+
// Prepare the message without an XTEA key so that the proper
203215
// sizes are added to the packet data, but it stays unencrypted.
204216
outMessage.PrepareToSend(null);
217+
outMessage.SequenceNumber = packetType == PacketType.Client ? clientSequenceNumber++ : serverSequenceNumber++;
205218

206219
var data = outMessage.GetData();
207220

@@ -221,17 +234,35 @@ private static bool Connection_OnReceivedClientTalkPacket(Packet packet)
221234
return true;
222235
}
223236

237+
private static bool Connection_OnReceivedServerMessagePacket(Packet packet)
238+
{
239+
var p = (OXGaming.TibiaAPI.Network.ServerPackets.Message)packet;
240+
if (p.MessageMode == MessageModeType.Look)
241+
{
242+
if (_lookPlayerRx.IsMatch(p.Text) || p.Text.Contains("You see yourself."))
243+
{
244+
p.Text = "Redacted";
245+
}
246+
}
247+
return true;
248+
}
249+
224250
private static bool Connection_OnReceivedServerTalkPacket(Packet packet)
225251
{
226252
var p = (OXGaming.TibiaAPI.Network.ServerPackets.Talk)packet;
227-
p.SpeakerName = "Redacted";
253+
var creature = p.Client.CreatureStorage.GetCreature(p.SpeakerName);
254+
if (creature is null || creature.Type == CreatureType.Player)
255+
{
256+
p.SpeakerLevel = 100;
257+
p.SpeakerName = "Redacted";
258+
}
228259
return true;
229260
}
230261

231262
private static bool Connection_OnReceivedServerCreatureUpdatePacket(Packet packet)
232263
{
233264
var p = (OXGaming.TibiaAPI.Network.ServerPackets.CreatureUpdate)packet;
234-
if (p.Creature is object)
265+
if (p.Creature is object && p.Creature.Type == CreatureType.Player)
235266
{
236267
p.Creature.Name = "Redacted";
237268
}
@@ -241,7 +272,7 @@ private static bool Connection_OnReceivedServerCreatureUpdatePacket(Packet packe
241272
private static bool Connection_OnReceivedServerCreateOnMapPacket(Packet packet)
242273
{
243274
var p = (OXGaming.TibiaAPI.Network.ServerPackets.CreateOnMap)packet;
244-
if (p.Creature is object)
275+
if (p.Creature is object && p.Creature.Type == CreatureType.Player)
245276
{
246277
p.Creature.Name = "Redacted";
247278
}

TibiaAPI/Creatures/CreatureStorage.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ public Creature GetCreature(uint creatureId)
2020
return _creatures.FirstOrDefault(c => c.Id == creatureId);
2121
}
2222

23+
public Creature GetCreature(string name)
24+
{
25+
if (string.IsNullOrEmpty(name))
26+
{
27+
return null;
28+
}
29+
return _creatures.FirstOrDefault(c => c.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
30+
}
31+
2332
public void RemoveCreature(uint creatureId)
2433
{
2534
var creature = GetCreature(creatureId);

TibiaAPI/Network/NetworkMessage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,17 +1054,17 @@ public void Write(Creature value, CreatureInstanceType type)
10541054
Write(value.HealthPercent);
10551055
Write((byte)value.Direction);
10561056

1057-
if (value.Outfit is OutfitInstance)
1057+
if (value.Outfit is OutfitInstance instance)
10581058
{
1059-
Write((OutfitInstance)value.Outfit);
1059+
Write(instance);
10601060
}
10611061
else
10621062
{
10631063
Write((ushort)0);
10641064
Write((ushort)value.Outfit.Id);
10651065
}
10661066

1067-
Write(value.Mount.Id);
1067+
Write((ushort)value.Mount.Id);
10681068
Write(value.Brightness);
10691069
Write(value.LightColor);
10701070
Write(value.Speed);

0 commit comments

Comments
 (0)