/// <summary> /// Client sends auth token after succesful connection to game server /// This method checks if token is correct /// and marks user as authorized. /// Also sends Send_ErrorBadAuthToken and Send_AuthorizedOk /// </summary> /// <param name="connectionId">User who sent</param> /// <param name="tokenString">user's token string</param> /// <returns>true on succesful connect, false on fail</returns> public static bool AuthorizeClientOnGameServer(long connectionId, int tokenHash) { Client client = ClientManager.GetConnectedClient(connectionId); // If client was already authorized then ignore. // It will be true if client did suddenly lost connection // and then reconnected in a short period of time // he will use the same tocken in this case if (client.Authorized) { // Send OK message to client ServerSendPackets.Send_AuthorizedOk(connectionId); ServerSendPackets.Send_UpdateUserData(connectionId); return(true); } // get token from manager if exists Token token = TokenManager.UseToken(tokenHash); // if token doesn't exist then send error if (token == null) { ServerSendPackets.Send_ErrorBadAuthToken(connectionId); return(false); } // Authorized OK client.Authorize(token); // Send OK message to client ServerSendPackets.Send_AuthorizedOk(connectionId); ServerSendPackets.Send_UpdateUserData(connectionId); return(true); }
/// <summary> /// Sent by player who looks at open rooms list. /// Sending him open rooms list /// </summary> public static void RefreshRoomList(long connectionId) { // Get rooms which are not full and not playing var openRooms = GetAvailableRooms(); // select 50 first var openRoomsArray = openRooms.Take(50).ToArray(); ServerSendPackets.Send_RoomList(connectionId, openRoomsArray); }
public static void AddMoney(long userId, double sum) { var user = DatabaseOperations.GetUserById(userId); // create new command var command = new MySqlCommand(); command.CommandText = "UPDATE foolonline.accounts SET `Money`= `Money` + @reward WHERE UserId=@userId"; command.Parameters.AddWithValue("@reward", sum); command.Parameters.AddWithValue("@userId", userId); // execute DatabaseConnection.ExecuteNonQuery(command); var client = ClientManager.GetConnectedClientByUserId(userId); if (client != null) { client.UserData.Money += sum; ServerSendPackets.Send_UpdateUserData(client.ConnectionId); } }
/// <summary> /// Sent by player how wants to create a new room /// </summary> /// <param name="connectionId">Room creator connection id</param> /// <param name="maxPlayers">Max players in room</param> /// <param name="deckSize">Deck size in room</param> public static void CreateRoom(long connectionId, int maxPlayers, int deckSize, double bet) { var client = ClientManager.GetConnectedClient(connectionId); Log.WriteLine("[" + client + "] wants to create room.", typeof(RoomManager)); if (client.IsInRoom) { Log.WriteLine("[" + client + "] is already in room. Abort.", typeof(RoomManager)); return; } //Validate if (maxPlayers < 2 || maxPlayers > 6 || !(deckSize == 24 || deckSize == 36 || deckSize == 52)) { //Send incorrect room return; } RoomInstance room = CreateNewRoomInstance(connectionId); room.MaxPlayers = maxPlayers; room.DeckSize = deckSize; #if TEST_MODE_TWO_CARDS room.DeckSize = 4; #endif room.HostId = connectionId; room.Bet = bet; //Client joins random room if (room.JoinRoom(connectionId)) { //Send 'OK' if room has free slots ServerSendPackets.Send_JoinRoomOk(connectionId, room.RoomId); } }
/// <summary> /// Adds player to room /// </summary> public static bool JoinRoom(long connectionId, long roomId) { //Getting not-full rooms var availableRooms = GetAvailableRooms().ToArray(); RoomInstance roomToJoin = availableRooms.Single(room => room.RoomId == roomId); //If this room is not present if (roomToJoin == null) { //todo send fail to join //ServerSendPackets.Send_FaliToJoin(connectionId); return(false); } if (roomToJoin.JoinRoom(connectionId)) { //Send 'OK' if room has free slots ServerSendPackets.Send_JoinRoomOk(connectionId, roomToJoin.RoomId); return(true); } return(false); }
/// <summary> /// Обработка ответа от платежной системы /// </summary> /// <param name="request"></param> private static void ProcessPayment(HttpRequest request) { // Выход если необходимые параметры не были получены if (!request.GetParams.ContainsKey("ik_pm_no")) { return; } if (!request.GetParams.ContainsKey("ik_sign")) { return; } // Получение записи об оплате Payments.Payment payment = Payments.GetPaymentById(Convert.ToInt64(request.GetParams["ik_pm_no"]), Payments.Type.Income); if (payment.PaymentId == 0) { return; // Выход если запись не найдена } // Настоящая подпись имеет длину 24 знака string receivedSign = request.GetParams["ik_sign"]; if (receivedSign.Length != 24) { return; } var sortedParams = new SortedDictionary <string, string>(request.GetParams); // Убираем подпись sortedParams.Remove("ik_sign"); Dictionary <string, string> parameters = new Dictionary <string, string>(sortedParams); Dictionary <string, string> parametersTest = new Dictionary <string, string>(sortedParams); parameters.Add("ik_sign", Interkassa.SecretKey); parametersTest.Add("ik_sign", Interkassa.TestSecretKey); // Генерация ключа var sign = Interkassa.GetEncodedSign(parameters.Values.ToArray()); var signTest = Interkassa.GetEncodedSign(parametersTest.Values.ToArray()); // Если подпись с нормальным и тестовым ключом не совпадает, то выход if (signTest != receivedSign && sign != receivedSign) { return; } Payments.UpdateStatus(payment.PaymentId, Payments.Status.Payed); // Обновляем статус // Записываем в платеж id из платежной системы if (request.GetParams.ContainsKey("ik_inv_id")) { long extPaymentId = Convert.ToInt64(request.GetParams["ik_inv_id"]); Payments.SetExternalPaymentId(payment.PaymentId, extPaymentId); } var client = ClientManager.GetConnectedClientByUserId(payment.UserId); if (client != null) { ServerSendPackets.Send_Message(client.ConnectionId, $"Платеж проведен успешно. Добавлено {payment.Sum}"); } DatabaseOperations.AddMoney(payment.UserId, payment.Sum); }