using AscNet.Common.Database; using AscNet.Common.MsgPack; using MessagePack; using Newtonsoft.Json; namespace AscNet.GameServer.Handlers { internal class AccountModule { [RequestPacketHandler("HandshakeRequest")] public static void HandshakeRequestHandler(Session session, Packet.Request packet) { // TODO: make this somehow universal, look into better architecture to handle packets // and automatically log their deserialized form HandshakeResponse response = new() { Code = 0, UtcOpenTime = 0, Sha1Table = null }; session.SendResponse(response, packet.Id); } [RequestPacketHandler("LoginRequest")] public static void LoginRequestHandler(Session session, Packet.Request packet) { LoginRequest request = MessagePackSerializer.Deserialize(packet.Content); Player? player = Player.FromToken(request.Token); if (player is null) { session.SendResponse(new LoginResponse { Code = 1007 // LoginInvalidLoginToken }, packet.Id); return; } session.player = player; session.character = Character.FromUid(player.PlayerData.Id); session.stage = Stage.FromUid(player.PlayerData.Id); session.SendResponse(new LoginResponse { Code = 0, ReconnectToken = player.Token, UtcOffset = 0, UtcServerTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() }, packet.Id); DoLogin(session); } [RequestPacketHandler("ReconnectRequest")] public static void ReconnectRequestHandler(Session session, Packet.Request packet) { ReconnectRequest request = MessagePackSerializer.Deserialize(packet.Content); Player? player; if (session.player is not null) player = session.player; else { player = Player.FromToken(request.Token); if (player is not null && (session.character is null || session.stage is null)) { session.character = Character.FromUid(player.PlayerData.Id); session.stage = Stage.FromUid(player.PlayerData.Id); } } if (player?.PlayerData.Id != request.PlayerId) { session.SendResponse(new ReconnectResponse() { Code = 1029 // ReconnectInvalidToken }, packet.Id); return; } session.player = player; session.SendResponse(new ReconnectResponse() { ReconnectToken = request.Token }, packet.Id); } /* TODO [RequestPacketHandler("ReconnectAck")] public static void ReconnectAckHandler(Session session, Packet.Request packet) { } */ // TODO: Move somewhere else, also split. static void DoLogin(Session session) { NotifyLogin notifyLogin = new() { PlayerData = session.player.PlayerData, TeamGroupData = session.player.TeamGroups, BaseEquipLoginData = new(), FubenData = new() { StageData = session.stage.Stages, FubenBaseData = new() }, FubenMainLineData = new(), FubenChapterExtraLoginData = new(), FubenUrgentEventData = new(), UseBackgroundId = 14000001 // main ui theme, table still failed to dump }; notifyLogin.FashionList.AddRange(session.character.Fashions); NotifyCharacterDataList notifyCharacterData = new(); notifyCharacterData.CharacterDataList.AddRange(session.character.Characters); NotifyEquipDataList notifyEquipData = new(); notifyEquipData.EquipDataList.AddRange(session.character.Equips); session.SendPush(notifyLogin); session.SendPush(notifyCharacterData); session.SendPush(notifyEquipData); // NEEDED to not softlock! session.SendPush(new NotifyFubenPrequelData() { FubenPrequelData = new() }); session.SendPush(new NotifyPrequelChallengeRefreshTime() { NextRefreshTime = (uint)DateTimeOffset.Now.ToUnixTimeSeconds() + 3600 * 24 }); session.SendPush(new NotifyMainLineActivity() { EndTime = 0 }); session.SendPush(new NotifyDailyFubenLoginData() { RefreshTime = (uint)DateTimeOffset.Now.ToUnixTimeSeconds() + 3600 * 24 }); session.SendPush(new NotifyBriefStoryData()); session.SendPush(new NotifyFubenBossSingleData() { FubenBossSingleData = new() { ActivityNo = 1, TotalScore = 0, MaxScore = 0, OldLevelType = 0, LevelType = 1, ChallengeCount = 0, RemainTime = 100000, AutoFightCount = 0, CharacterPoints = new {}, RankPlatform = 0 } }); session.SendPush(new NotifyBfrtData() { BfrtData = new() }); } } }