11import { BytableMessage } from '@rustymotors/binary' ;
2- import { getServerLogger , ServiceResponse , type ServerLogger } from 'rusty-motors-shared' ;
3- import { MessageNumberMap } from './MessageNumberMap.js' ;
2+ import { databaseManager } from "rusty-motors-database" ;
3+ import {
4+ createCommandEncryptionPair ,
5+ createDataEncryptionPair ,
6+ } from "rusty-motors-gateway" ;
7+ import {
8+ addEncryption ,
9+ fetchStateFromDatabase ,
10+ getEncryption ,
11+ getServerLogger ,
12+ McosEncryption ,
13+ SerializedBufferOld ,
14+ ServiceResponse ,
15+ type ServerLogger ,
16+ } from "rusty-motors-shared" ;
17+ import { getMessageNumber , MessageNumberMap } from "./MessageNumberMap.js" ;
418import { LoginRequest } from './LoginRequest.js' ;
19+ import { UserData } from './UserData.js' ;
520
621export class RoomServer {
722 private _id : number ;
@@ -10,12 +25,14 @@ export class RoomServer {
1025 private _port : number ;
1126 private log : ServerLogger ;
1227
28+ private usersData = new Map < number , UserData > ( ) ;
29+
1330 constructor ( { id, name, ip, port } : { id : number , name : string , ip : string , port : number } ) {
1431 this . _name = name ;
1532 this . _id = id ;
1633 this . log = getServerLogger ( name , 'roomserver' ) ;
1734 this . _ip = ip ;
18- this . _port = port ;
35+ this . _port = port ;
1936 }
2037
2138 async receivePacket ( {
@@ -53,28 +70,98 @@ export class RoomServer {
5370 }
5471 }
5572 private async handleLogin ( { connectionId, packet } : { connectionId : string , packet : BytableMessage } ) : Promise < ServiceResponse > {
56- const log = getServerLogger ( "RoomServer.handleLogin" ) ;
73+ const log = this . log . child ( { connectionId , loggerName : "handlers/_npsRequestGameConnectServer" } ) ;
5774
5875 try {
5976 log . debug ( { connectionId, packet : packet . toHexString ( ) } , "Handling NPS_LOGIN" ) ;
6077
6178 const getServerInfoRequest = new LoginRequest ( ) ;
6279 getServerInfoRequest . deserialize ( packet . getBody ( ) ) ;
6380
64- log . debug ( { connectionId, getServerInfoRequest } , "Received NPS_LOGIN" ) ;
81+
82+ const customerId = getServerInfoRequest . customerNumber ;
83+ const userId = getServerInfoRequest . userInfo . userId ;
84+
85+ log . debug (
86+ { connectionId, customerId : customerId , userId : userId } ,
87+ "Connecting to game server" ,
88+ ) ;
89+
90+ const state = fetchStateFromDatabase ( ) ;
91+
92+ const existingEncryption = getEncryption (
93+ state ,
94+ connectionId ,
95+ ) ;
96+
97+ if ( ! existingEncryption ) {
98+ // Set the encryption keys on the lobby connection
99+ const keys =
100+ await databaseManager . fetchSessionKeyByCustomerId (
101+ customerId ,
102+ ) ;
103+
104+ if ( keys === undefined ) {
105+ throw Error ( "Error fetching session keys!" ) ;
106+ }
107+
108+ // We have the session keys, set them on the connection
109+ const newCommandEncryptionPair =
110+ createCommandEncryptionPair ( keys . sessionKey ) ;
111+
112+ const newDataEncryptionPair =
113+ createDataEncryptionPair ( keys . sessionKey ) ;
114+
115+ const newEncryption = new McosEncryption ( {
116+ connectionId,
117+ commandEncryptionPair : newCommandEncryptionPair ,
118+ dataEncryptionPair : newDataEncryptionPair ,
119+ } ) ;
120+
121+ addEncryption ( state , newEncryption ) . save ( ) ;
122+ }
123+
124+ const userInfo = getServerInfoRequest . userInfo
125+
126+ const userData = userInfo . userData ;
127+
128+ this . usersData . set ( userId , userData ) ;
129+
130+ const response = new BytableMessage ( ) ;
131+ response . header . setMessageId (
132+ getMessageNumber ( "NPS_LOGIN_RESPONSE" ) ,
133+ ) ;
134+ response . header . setMessageVersion ( 0 ) ;
135+ response . setSerializeOrder ( [
136+ { name : "userId" , field : "Dword" } ,
137+ { name : "userName" , field : "Container" } ,
138+ { name : "userData" , field : "Buffer" } ,
139+ ] ) ;
140+
141+ response . setFieldValueByName ( "userId" , userInfo . userId ) ;
142+ response . setFieldValueByName ( "userName" , userInfo . userName ) ;
143+ response . setFieldValueByName ( "userData" , Buffer . from ( userData . get ( ) ) ) ;
144+
145+
146+ log . debug (
147+ { connectionId, response : response . toHexString ( ) } ,
148+ "Sending NPS_LOGIN_RESPONSE" ,
149+ ) ;
150+
151+ return {
152+ connectionId,
153+ messages : [ response ] ,
154+ } ;
155+
65156
66157 } catch ( error : any ) {
67- log . error ( { connectionId, error } , `Error handling NPS_LOGIN: ${ ( error as Error ) . message } ` ) ;
158+ log . error ( { connectionId, error } , `Error handling NPS_LOGIN: ${ ( error as Error ) . message } ` ) ;
68159 return {
69160 connectionId,
70161 messages : [ ] ,
71162 } ;
72163
73164 }
74- return {
75- connectionId,
76- messages : [ ] ,
77- } ;
78165 }
79166
80167 get id ( ) {
0 commit comments