示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// <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);
            }
        }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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);
        }