From 017656ec649739f6ce807284b683265119084a5f Mon Sep 17 00:00:00 2001 From: desukuran Date: Fri, 29 Mar 2024 10:43:52 -0400 Subject: [PATCH] Packets 21 and 149 - Fetch Friend Favorite Game Server List (#46) * Preliminary adding, it reads and sends as it should but no real data is sent, just enough to satisfy xfire awaiting something. * This packet deals with fetching all game server information based on Game ID and Friend Favorites. Added Inbound Packet GameServerFetchFriendsFavorites (21) * It only expects a gameid. From there the server sends back GameServerSendFriendsFavorites packet. (Weirdly enough, this one uses the string "gameid" unlike the All packet.) Added Outbound Packet GameServerSendFriendsFavorites (149) * Four attributes are sent: gameid, a list of gameips and a list of gameports (both iterates in sync), list of a list of ints for FriendIds. * I have added as such for future addition: It makes the lists but doesn't populate them and sends back the GameId sent by the client. * The FriendIds nested list is a weird one, only ever used again in FriendofFriends. I had to make a list of userids and then put it inside of FriendIds. I don't know why they designed it as such, as vanilla xfire doesn't use this information at all it seems... XFireMessageType and XFireMessageTypeFactory adds the packets to the lists as needed. --- .../GameServerFetchFriendsFavorites.cs | 19 ++++++++ .../GameServerSendFriendsFavorites.cs | 46 +++++++++++++++++++ .../Protocol/Messages/XFireMessageType.cs | 2 + .../Protocol/XFireMessageTypeFactory.cs | 1 + 4 files changed, 68 insertions(+) create mode 100644 src/PFire.Core/Protocol/Messages/Inbound/GameServerFetchFriendsFavorites.cs create mode 100644 src/PFire.Core/Protocol/Messages/Outbound/GameServerSendFriendsFavorites.cs diff --git a/src/PFire.Core/Protocol/Messages/Inbound/GameServerFetchFriendsFavorites.cs b/src/PFire.Core/Protocol/Messages/Inbound/GameServerFetchFriendsFavorites.cs new file mode 100644 index 0000000..db6b9cb --- /dev/null +++ b/src/PFire.Core/Protocol/Messages/Inbound/GameServerFetchFriendsFavorites.cs @@ -0,0 +1,19 @@ +using PFire.Core.Protocol.Messages.Outbound; +using PFire.Core.Session; +using System.Threading.Tasks; + +namespace PFire.Core.Protocol.Messages.Inbound +{ + internal sealed class GameServerFetchFriendsFavorites : XFireMessage + { + public GameServerFetchFriendsFavorites() : base(XFireMessageType.GameServerFetchFriendsFavorites) { } + + [XMessageField("gameid")] + public int GameId { get; set; } + + public override async Task Process(IXFireClient context) + { + await context.SendAndProcessMessage(new GameServerSendFriendsFavorites(GameId)); + } + } +} diff --git a/src/PFire.Core/Protocol/Messages/Outbound/GameServerSendFriendsFavorites.cs b/src/PFire.Core/Protocol/Messages/Outbound/GameServerSendFriendsFavorites.cs new file mode 100644 index 0000000..1f932f8 --- /dev/null +++ b/src/PFire.Core/Protocol/Messages/Outbound/GameServerSendFriendsFavorites.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using PFire.Core.Session; + +namespace PFire.Core.Protocol.Messages.Outbound +{ + internal sealed class GameServerSendFriendsFavorites : XFireMessage + { + public GameServerSendFriendsFavorites(int gameId) : base(XFireMessageType.GameServerSendFriendsFavorites) + { + GameId = gameId; + GameIps = new List(); + GamePorts = new List(); + FriendIds = new List>(); + } + + [XMessageField("gameid")] + public int GameId { get; set; } + + [XMessageField("gip")] + public List GameIps { get; set; } + + [XMessageField("gport")] + public List GamePorts { get; set; } + + [XMessageField("friends")] + public List> FriendIds { get; set; } + + public override Task Process(IXFireClient context) + { + //TODO: Have a Database of IPs and Ports, with a user id who favorited it that is fetched by gameid + // Probably reads from the favorites database based on userid and gameid. + // + // You will need to start off processing with making a new temporary List to put inside of FriendIds to satisfy the nested list need, this will hold the userid who favorited the server. + // Start off with sending back the GameId sent + // Iterate that list of favorites into Ips and Ports (unsigned ints on both) and your new userid List + // If no hits, send GameIps and GamePorts with empty Lists, for FriendIds send back an empty List> regardless, because the client expects a response. + + return Task.CompletedTask; + } + } +} diff --git a/src/PFire.Core/Protocol/Messages/XFireMessageType.cs b/src/PFire.Core/Protocol/Messages/XFireMessageType.cs index 2f5d05f..c121cb9 100644 --- a/src/PFire.Core/Protocol/Messages/XFireMessageType.cs +++ b/src/PFire.Core/Protocol/Messages/XFireMessageType.cs @@ -17,6 +17,7 @@ public enum XFireMessageType : short NicknameChange = 14, ClientConfiguration = 16, ConnectionInformation = 17, + GameServerFetchFriendsFavorites = 21, GameServerFetchAll = 22, StatusChange = 32, Unknown37 = 37, @@ -34,6 +35,7 @@ public enum XFireMessageType : short UserLookupResult = 143, ServerPong = 144, ServerList = 148, + GameServerSendFriendsFavorites = 149, GameServerSendAll = 150, Groups = 151, GroupsFriends = 152, diff --git a/src/PFire.Core/Protocol/XFireMessageTypeFactory.cs b/src/PFire.Core/Protocol/XFireMessageTypeFactory.cs index 648ea12..4108c2c 100644 --- a/src/PFire.Core/Protocol/XFireMessageTypeFactory.cs +++ b/src/PFire.Core/Protocol/XFireMessageTypeFactory.cs @@ -36,6 +36,7 @@ private XFireMessageTypeFactory() Add(new FriendRequestDecline()); Add(new FriendRemoval()); Add(new GameServerFetchAll()); + Add(new GameServerFetchFriendsFavorites()); Add(new NicknameChange()); Add(new StatusChange()); Add(new Logout());