public async Task UpdateBetsInCache(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0 || !reqstr.Contains("["))
            {
                await ctx.Session.Send("Invalid request");

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            List <string> errIds     = new List <string>();
            List <Task>   cacheTasks = new List <Task>();

            foreach (var item in req)
            {
                string uuid = item.bet_uuid.ToString();
                cacheTasks.Add(Task.Run(async() =>
                {
                    string cacheErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                    "settle-bet", "settle", m_Node.GetJsonHelper().ToJsonString(item));
                    if (cacheErr != "ok")
                    {
                        errIds.Add(uuid);
                    }
                }));
            }

            Task.WaitAll(cacheTasks.ToArray());

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(errIds));
        }
        public async Task <string> PlayerLogin(string jsonRequest)
        {
            if (m_LocalNode == null)
            {
                return(m_LocalNode.GetJsonHelper().ToJsonString(new
                {
                    error_code = -1,
                    error_message = "Service is not available"
                }));
            }

            m_LocalNode.GetLogger().Info("call merchant api: player-login");

            dynamic req         = m_LocalNode.GetJsonHelper().ToJsonObject(jsonRequest);
            string  merchantUrl = req.merchant_url.ToString();

            m_LocalNode.GetLogger().Info("Player login - [" + req.merchant_code.ToString() + "] " + req.player_id.ToString());
            m_LocalNode.GetLogger().Info("Merchant URL - " + merchantUrl);

            dynamic ret = null;

            var apiReq = new
            {
                req.merchant_code,
                req.currency_code,
                req.player_id,
                req.login_token
            };

            try
            {
                var rawret = await RemoteCaller.Request <Tuple <int, string> >(merchantUrl + "/player/validate-login", apiReq, null, 10 * 1000);

                m_LocalNode.GetLogger().Info("3-Way Login Reply Code: " + rawret.Item1);
                ret = m_LocalNode.GetJsonHelper().ToJsonObject(rawret.Item2);
            }
            catch (Exception ex)
            {
                ret = null;
                m_LocalNode.GetLogger().Error("Three-Way Login Error - Failed to call merchant API: " + ex.Message);
            }

            if (ret == null)
            {
                return(null);
            }

            if (ret.error_code != 0)
            {
                m_LocalNode.GetLogger().Error("Three-Way Login Error: " + (ret == null ? "Failed to call merchant API" : ret.error_message));
                return(m_LocalNode.GetJsonHelper().ToJsonString(new
                {
                    error_code = -1,
                    error_message = "Three-Way Login Error"
                }));
            }

            return(m_LocalNode.GetJsonHelper().ToJsonString(ret));
        }
예제 #3
0
        public async Task GetBetTransactions(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();
            //ctx.Logger.Info("bo-api | get-bet-trans");

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                return;
            }

            var req = ctx.JsonHelper.ToDictionary(reqstr);

            string sessionId = req.ContainsKey("sessionId") ? req["sessionId"].ToString() : "";

            IDictionary <string, object> queryParam = req.ContainsKey("queryParam") ? req["queryParam"] as IDictionary <string, object> : null;

            if (queryParam == null)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -2,
                    error_message = "Failed to get bet trans: missing params",
                }));

                return;
            }

            string merchantCode = queryParam.ContainsKey("merchantCode") ? queryParam["merchantCode"].ToString() : "";
            //string currencyCode = queryParam.ContainsKey("queryCurrency") ? queryParam["queryCurrency"].ToString() : "";
            string betId = queryParam.ContainsKey("betId") ? queryParam["betId"].ToString() : "";


            var dbReq = new
            {
                betId
            };
            string replystr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                            "bo-data", "get-bet-trans", ctx.JsonHelper.ToJsonString(dbReq));

            if (String.IsNullOrEmpty(replystr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -5,
                    error_message = "Failed to get bet transactions from DB",
                }));
            }
            else
            {
                await ctx.Session.Send(replystr);
            }
        }
예제 #4
0
        public async Task ChangeUserPassword(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            var req = ctx.JsonHelper.ToDictionary(reqstr);
            IDictionary <string, object> queryParam = req.ContainsKey("queryParam") ? req["queryParam"] as IDictionary <string, object> : null;

            if (queryParam == null)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to set new password: missing params",
                }));

                return;
            }

            string accountId    = queryParam.ContainsKey("userId") ? queryParam["userId"].ToString() : "";
            string merchantCode = queryParam.ContainsKey("merchantCode") ? queryParam["merchantCode"].ToString() : "";
            string oldPassword  = queryParam.ContainsKey("oldPassword") ? queryParam["oldPassword"].ToString() : "";
            string newPassword  = queryParam.ContainsKey("newPassword") ? queryParam["newPassword"].ToString() : "";

            var dbReq = new
            {
                accountId,
                merchantCode,
                oldPassword,
                newPassword
            };
            string replystr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                            "bo-data", "change-user-password", ctx.JsonHelper.ToJsonString(dbReq));

            if (String.IsNullOrEmpty(replystr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to set new password in DB",
                }));
            }
            else
            {
                await ctx.Session.Send(replystr);
            }
        }
예제 #5
0
        public async Task <string> StartNewRound()
        {
            m_Logger.Info("Start a new round...");

            m_RoundStartTime = DateTime.Now;

            m_RoundIndex++;

            m_PlayerCards.Clear();
            m_BankerCards.Clear();

            PlayerPoints = -1;
            BankerPoints = -1;

            var newGameId = GetGameId();

            m_Logger.Info("New round ID: " + newGameId);

            m_Logger.Info("Saving new game record to database...");

            var saveReq = new
            {
                server     = m_Node.GetName(),
                table      = TableCode,
                shoe       = m_ShoeCode,
                round      = m_RoundIndex,
                state      = (int)m_GameState,
                starttime  = m_RoundStartTime.ToString("yyyy-MM-dd HH:mm:ss"),
                updatetime = m_RoundStartTime.ToString("yyyy-MM-dd HH:mm:ss"),
                player     = String.Join(",", m_PlayerCards.ToArray()),
                banker     = String.Join(",", m_BankerCards.ToArray()),
                result     = 0
            };
            string replystr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                            "game-data", "save-record", m_Node.GetJsonHelper().ToJsonString(saveReq));

            if (replystr == "ok")
            {
                m_Logger.Info("Update database successfully");
            }
            else
            {
                m_Logger.Error("Failed to save game data to database");
            }

            m_GameReadyCountdown   = -1;
            m_BettingTimeCountdown = BET_TIME_COUNTDOWN;
            //m_GameState = GAME_STATUS.BettingTime;
            UpdateRoundState(GAME_STATUS.BettingTime);

            m_Logger.Info("Start betting time...");

            return("");
        }
        public async Task <string> GetPlayerBalance(string jsonRequest)
        {
            if (m_LocalNode == null)
            {
                return(m_LocalNode.GetJsonHelper().ToJsonString(new
                {
                    error_code = -1,
                    error_message = "Service is not available"
                }));
            }

            //m_LocalNode.GetLogger().Info("call merchant api: get-player-balance");

            dynamic req         = m_LocalNode.GetJsonHelper().ToJsonObject(jsonRequest);
            string  merchantUrl = req.merchant_url.ToString();

            //m_LocalNode.GetLogger().Info("Merchant URL - " + merchantUrl);

            dynamic ret = null;

            var apiReq = new
            {
                req.merchant_code,
                req.currency_code,
                req.player_id
            };

            try
            {
                ret = await RemoteCaller.Request(merchantUrl + "/player/get-balance", apiReq, null, 10 * 1000);
            }
            catch (Exception ex)
            {
                ret = null;
                m_LocalNode.GetLogger().Error("Get Player Balance Error - Failed to call merchant API: " + ex.Message);
            }

            if (ret == null)
            {
                return(null);
            }

            if (ret.error_code != 0)
            {
                m_LocalNode.GetLogger().Error("Get Player Balance Error: " + (ret == null ? "Failed to call merchant API" : ret.error_message));
                return(m_LocalNode.GetJsonHelper().ToJsonString(new
                {
                    error_code = -1,
                    error_message = "Get Player Balance Error"
                }));
            }
            return(m_LocalNode.GetJsonHelper().ToJsonString(ret));
        }
        public async Task <string> CreditForSettling(string jsonRequest)
        {
            if (m_LocalNode == null)
            {
                m_LocalNode.GetLogger().Error("CreditForSettling Error: Service is not available");
                return(null);
            }
            ;

            //m_LocalNode.GetLogger().Info("call merchant api: credit-for-settling");

            dynamic req         = m_LocalNode.GetJsonHelper().ToJsonObject(jsonRequest);
            string  merchantUrl = req.merchant_url.ToString();

            //m_LocalNode.GetLogger().Info("Merchant URL - " + merchantUrl);

            dynamic ret = null;

            var apiReq = new
            {
                req.credit_uuid,
                req.bet_uuid,
                req.merchant_code,
                req.currency_code,
                req.player_id,
                req.round_id,
                req.bet_pool,
                req.credit_amount,
                req.bet_settle_time,
                req.request_times,
                req.is_cancelled
            };

            try
            {
                ret = await RemoteCaller.Request(merchantUrl + "/bet/credit-for-settling-bet", apiReq, 20 * 1000);
            }
            catch (Exception ex)
            {
                ret = null;
                m_LocalNode.GetLogger().Error("CreditForSettling Error - Failed to call merchant API: " + ex.Message);
            }

            if (ret == null)
            {
                return(null);
            }

            return(m_LocalNode.GetJsonHelper().ToJsonString(ret));
        }
예제 #8
0
        private void DealingOnePlayerCard(GAME_STATUS nextState = GAME_STATUS.Unknown)
        {
            if (m_WaitingForDealing)
            {
                return;
            }
            try
            {
                m_WaitingForDealing = true;
                Task.Run(async() =>
                {
                    try
                    {
                        string card1 = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "dealing", "cards", "1");
                        if (String.IsNullOrEmpty(card1))
                        {
                            throw new Exception("Table controller no response.");
                        }
                        else
                        {
                            m_PlayerCards.Add(card1);
                        }
                    }
                    catch (Exception ex)
                    {
                        m_WaitingForDealing = false;
                        Console.WriteLine("DealingOnePlayerCard Error - " + ex.ToString());
                        return;
                    }

                    m_WaitingForDealing = false;

                    //if (nextState != GAME_STATUS.Unknown) m_GameState = nextState;
                    if (nextState != GAME_STATUS.Unknown)
                    {
                        UpdateRoundState(nextState);
                    }
                });
            }
            catch (Exception ex)
            {
                m_WaitingForDealing = false;
                Console.WriteLine("DealingOnePlayerCard Error - " + ex.ToString());
            }
        }
        public async Task <string> CancelDebit(string jsonRequest)
        {
            if (m_LocalNode == null)
            {
                m_LocalNode.GetLogger().Error("CancelDebit Error: Service is not available");
                return(null);
            }
            ;

            //m_LocalNode.GetLogger().Info("call merchant api: debit-for-betting");

            dynamic req         = m_LocalNode.GetJsonHelper().ToJsonObject(jsonRequest);
            string  merchantUrl = req.merchant_url.ToString();

            //m_LocalNode.GetLogger().Info("Merchant URL - " + merchantUrl);

            dynamic ret = null;

            var apiReq = new
            {
                req.trans_uuid,
                req.debit_uuid,
                req.merchant_code,
                req.currency_code,
                req.amount
            };

            try
            {
                ret = await RemoteCaller.Request(merchantUrl + "/bet/cancel-debit", apiReq, null, 20 * 1000);
            }
            catch (Exception ex)
            {
                ret = null;
                m_LocalNode.GetLogger().Error("CancelDebit Error - Failed to call merchant API: " + ex.Message);
            }

            if (ret == null)
            {
                return(null);
            }

            return(m_LocalNode.GetJsonHelper().ToJsonString(ret));
        }
        public async Task UpdateSingleWalletForBets(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0 || !reqstr.Contains("["))
            {
                await ctx.Session.Send("Invalid request");

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            List <string> errIds      = new List <string>();
            List <Task>   walletTasks = new List <Task>();

            foreach (var item in req)
            {
                string uuid = item.bet_uuid.ToString();
                walletTasks.Add(Task.Run(async() =>
                {
                    string walletReplyStr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                          "single-wallet", "credit-for-settling-bet", m_Node.GetJsonHelper().ToJsonString(item));
                    if (String.IsNullOrEmpty(walletReplyStr) || !walletReplyStr.Contains('{'))
                    {
                        errIds.Add(uuid);
                    }
                    else
                    {
                        dynamic walletReply = ctx.JsonHelper.ToJsonObject(walletReplyStr);
                        if (walletReply.error_code != 0)
                        {
                            errIds.Add(uuid);
                        }
                    }
                }));
            }

            Task.WaitAll(walletTasks.ToArray());

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(errIds));
        }
        public async Task UpdateBetsInDatabase(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0 || !reqstr.Contains('['))
            {
                await ctx.Session.Send("Invalid request");

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            List <dynamic> passIds = new List <dynamic>();
            List <Task>    dbTasks = new List <Task>();

            foreach (var item in req)
            {
                string uuid = item.bet_uuid.ToString();
                dbTasks.Add(Task.Run(async() =>
                {
                    string dbReply = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                   "bet-data", "update-result", m_Node.GetJsonHelper().ToJsonString(item));
                    //if (dbErr != "ok") errIds.Add(uuid);
                    if (dbReply.Contains('-') && dbReply.Contains('='))
                    {
                        var itemParts = dbReply.Split('=');
                        passIds.Add(new
                        {
                            bet_uuid    = itemParts[0],
                            settle_time = itemParts[1]
                        });
                    }
                }));
            }

            Task.WaitAll(dbTasks.ToArray());

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(passIds));
        }
예제 #12
0
        public async Task GetPlayerBalance(RequestContext ctx)
        {
            string msgName = "player_balance";

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = msgName,
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            var reqIp = ctx.ClientAddress;

            if (reqIp.Contains(":"))
            {
                reqIp = reqIp.Split(':')[0];
            }

            ctx.Logger.Info("Client Ip - " + reqIp);

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string merchantCode = req.merchant_code.ToString();
            string currencyCode = req.currency_code.ToString();

            string merchantInfo = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                "merchant-data", "get-merchant-info", merchantCode + currencyCode);

            if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = msgName,
                    error_code    = -1,
                    error_message = "Merchant info not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            dynamic merchant        = ctx.JsonHelper.ToJsonObject(merchantInfo);
            string  merchantUrl     = merchant.url.ToString();
            string  merchantService = merchant.service.ToString();

            //ctx.Logger.Info("Merchant URL - " + merchantUrl);

            var apiReq = new
            {
                merchant_url = merchantUrl,
                req.merchant_code,
                req.currency_code,
                req.player_id,
                req.session_id,
                player_ip = reqIp
            };
            string retJson = await CallMerchantApi(ctx, merchantService, "get-player-balance", ctx.JsonHelper.ToJsonString(apiReq));

            dynamic ret = string.IsNullOrEmpty(retJson) ? null : ctx.JsonHelper.ToJsonObject(retJson);

            if (ret == null || ret.error_code != 0)
            {
                ctx.Logger.Error("Get Player Balance Error: " + (ret == null ? "Failed to call merchant API" : ret.error_message));
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = msgName,
                    error_code    = -1,
                    error_message = "Get Player Balance Error"
                }));

                return;
            }

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
            {
                msg = msgName,
                req.merchant_code,
                req.currency_code,
                req.player_id,
                ret.player_balance,
                error_code    = 0,
                error_message = "ok"
            }));
        }
예제 #13
0
        private async Task TryToCancelDebits()
        {
            //System.Diagnostics.Debugger.Break();

            //m_Logger.Info("TryToCancelDebits - START -");

            var totalCount = 0;

            Dictionary <string, List <dynamic> > debitItems = new Dictionary <string, List <dynamic> >();
            Dictionary <string, dynamic>         merchants  = new Dictionary <string, dynamic>();
            var dbhelper = m_Node.GetDataHelper();

            using (var cnn = dbhelper.OpenDatabase(m_CommonMerchantDb))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    // select records which need to cancel
                    cmd.CommandText = " select debit_uuid, bet_uuid, player_id, client_id, session_id, "
                                      + " merchant_code, currency_code, debit_amount from tbl_trans_debit "
                                      + " where is_cancelled = 0 and network_error <> 0 ";

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string  debitUuid    = reader["debit_uuid"].ToString();
                            string  betUuid      = reader["bet_uuid"].ToString();
                            string  playerId     = reader["player_id"].ToString();
                            string  clientId     = reader["client_id"].ToString();
                            string  sessionId    = reader["session_id"].ToString();
                            string  merchantCode = reader["merchant_code"].ToString();
                            string  currencyCode = reader["currency_code"].ToString();
                            decimal debitAmount  = Convert.ToDecimal(reader["debit_amount"].ToString());

                            var reqIp = clientId;
                            if (reqIp.Contains(":"))
                            {
                                reqIp = reqIp.Split(':')[0];
                            }

                            var item = new
                            {
                                debit_uuid    = debitUuid,
                                trans_uuid    = debitUuid + "-cancel",
                                bet_uuid      = betUuid,
                                merchant_code = merchantCode,
                                currency_code = currencyCode,
                                player_id     = playerId,
                                player_ip     = reqIp,
                                session_id    = sessionId,
                                amount        = debitAmount
                            };

                            string merchantKey = item.merchant_code + item.currency_code;

                            if (debitItems.ContainsKey(merchantKey))
                            {
                                var list = debitItems[merchantKey];
                                list.Add(item);
                            }
                            else
                            {
                                var list = new List <dynamic>();
                                list.Add(item);
                                debitItems.Add(merchantKey, list);
                            }
                        }
                    }
                }

                foreach (var item in debitItems)
                {
                    if (!merchants.ContainsKey(item.Key))
                    {
                        string merchantInfo = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                            "merchant-data", "get-merchant-info", item.Key);

                        if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
                        {
                            continue;
                        }

                        dynamic merchant = m_Node.GetJsonHelper().ToJsonObject(merchantInfo);
                        if (merchant != null)
                        {
                            merchants.Add(item.Key, merchant);
                        }
                    }

                    if (!merchants.ContainsKey(item.Key))
                    {
                        continue;
                    }

                    string apiUrl = merchants[item.Key].url.ToString();
                    string apiSvc = merchants[item.Key].service.ToString();

                    var list = item.Value;

                    foreach (var debit in list)
                    {
                        var apiReq = new
                        {
                            merchant_url = apiUrl,
                            debit.trans_uuid,
                            debit.debit_uuid,
                            debit.bet_uuid,
                            debit.merchant_code,
                            debit.currency_code,
                            debit.player_id,
                            debit.player_ip,
                            debit.session_id,
                            debit.amount
                        };

                        dynamic ret = null;
                        try
                        {
                            string retJson = await CallMerchantApi(apiSvc, "cancel-debit", m_Node.GetJsonHelper().ToJsonString(apiReq));

                            ret = string.IsNullOrEmpty(retJson) ? null : m_Node.GetJsonHelper().ToJsonObject(retJson);
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            m_Node.GetLogger().Error("Failed to call cancel debit: " + ex.Message);
                        }

                        try
                        {
                            if (ret != null)
                            {
                                int respCode = ret.error_code;

                                var sql = " update tbl_trans_debit "
                                          + " set network_error = 0 , response_error = " + respCode;
                                if (respCode == 0)
                                {
                                    sql += " , is_cancelled = 1 ";
                                }
                                sql += " , update_time = NOW() ";
                                sql += " where debit_uuid = @debit_uuid ";

                                var okay  = false;
                                var trans = cnn.BeginTransaction();

                                using (var cmd = cnn.CreateCommand())
                                {
                                    cmd.Transaction = trans;

                                    dbhelper.AddParam(cmd, "@debit_uuid", debit.debit_uuid);
                                    cmd.CommandText = sql;

                                    okay = cmd.ExecuteNonQuery() > 0;
                                }

                                if (okay)
                                {
                                    sql  = " update tbl_bet_record set cancel_state = 1 ";
                                    sql += " , update_time = CURRENT_TIMESTAMP ";
                                    if (respCode == 0)
                                    {
                                        sql += " , cancel_time = CURRENT_TIMESTAMP ";
                                    }
                                    sql += " where bet_uuid = @bet_uuid ";

                                    using (var cmd = cnn.CreateCommand())
                                    {
                                        cmd.Transaction = trans;

                                        dbhelper.AddParam(cmd, "@bet_uuid", debit.bet_uuid);

                                        cmd.CommandText = sql;

                                        okay = okay && cmd.ExecuteNonQuery() > 0;
                                    }
                                }

                                if (okay)
                                {
                                    trans.Commit();
                                }
                                else
                                {
                                    trans.Rollback();
                                }
                            }

                            totalCount++;
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            m_Node.GetLogger().Error("Failed to call cancel debit: " + ex.Message);
                        }
                    } // end of debits of same merchant
                }     // end of all debits
            }         // end of using db cnn

            if (totalCount > 0)
            {
                m_Logger.Info("TryToCancelDebits - DONE (" + totalCount + ")");
            }
        }
예제 #14
0
        public string DealingFirst4Cards()
        {
            m_Logger.Info("Dealing first 4 cards...");

            if (m_WaitingForDealing)
            {
                return("");
            }

            try
            {
                m_WaitingForDealing = true;
                Task.Run(async() =>
                {
                    try
                    {
                        //System.Diagnostics.Debugger.Break();

                        //var remoteServices = m_Node.GetRemoteServices();
                        //foreach (var key in remoteServices.Keys) Console.WriteLine(key);

                        string card1 = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "dealing", "cards", "1");
                        if (String.IsNullOrEmpty(card1))
                        {
                            throw new Exception("Table controller no response.");
                        }
                        m_PlayerCards.Add(card1);

                        string card2 = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "dealing", "cards", "1");
                        if (String.IsNullOrEmpty(card2))
                        {
                            throw new Exception("Table controller no response.");
                        }
                        m_BankerCards.Add(card2);

                        string card3 = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "dealing", "cards", "1");
                        if (String.IsNullOrEmpty(card3))
                        {
                            throw new Exception("Table controller no response.");
                        }
                        m_PlayerCards.Add(card3);

                        string card4 = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "dealing", "cards", "1");
                        if (String.IsNullOrEmpty(card4))
                        {
                            throw new Exception("Table controller no response.");
                        }
                        m_BankerCards.Add(card4);

                        m_WaitingForDealing = false;

                        //m_GameState = GAME_STATUS.DealingLastPlayerCard;
                        UpdateRoundState(GAME_STATUS.DealingLastPlayerCard);
                    }
                    catch (Exception ex)
                    {
                        m_PlayerCards.Clear();
                        m_BankerCards.Clear();
                        m_WaitingForDealing = false;

                        Console.WriteLine("DealingFirst4Cards Error - " + ex.ToString());
                    }
                });
            }
            catch (Exception ex)
            {
                m_PlayerCards.Clear();
                m_BankerCards.Clear();
                m_WaitingForDealing = false;

                Console.WriteLine("DealingFirst4Cards Error - " + ex.ToString());
            }

            return("");
        }
예제 #15
0
        public async Task CreditForBetting(RequestContext ctx)
        {
            ctx.Logger.Info("Credit for settling-bet...");

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            ctx.Logger.Info("Create credit record in db...");

            var saveReq = new
            {
                bet_uuid      = req.bet_uuid,
                table_code    = req.table_code,
                shoe_code     = req.shoe_code,
                round_number  = req.round_number,
                bet_pool      = req.bet_pool,
                merchant_code = req.merchant_code,
                player_id     = req.player_id,
                pay_amount    = req.pay_amount
            };
            string dbReplyStr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                              "transaction-data", "create-credit", ctx.JsonHelper.ToJsonString(saveReq));

            if (dbReplyStr.Trim().Length <= 0 || !dbReplyStr.Contains('{'))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to create credit record in db: " + dbReplyStr
                }));

                return;
            }

            ctx.Logger.Info("Call merchant site to credit...");

            dynamic dbReply = ctx.JsonHelper.ToJsonObject(dbReplyStr);
            string  apiUrl  = dbReply.request_url;

            var apiReq = new
            {
                dbReply.credit_uuid,
                req.bet_uuid,
                req.merchant_code,
                req.player_id,
                dbReply.round_id,
                req.bet_pool,
                credit_amount   = req.pay_amount,
                bet_settle_time = req.settle_time,
                is_cancelled    = false
            };
            dynamic ret = await RemoteCaller.Request(apiUrl, apiReq, 10 * 1000);

            if (ret == null)
            {
                ctx.Logger.Info("Failed to call credit function from merchant site");

                var updateReq = new
                {
                    dbReply.credit_uuid,
                    req.merchant_code,
                    req.player_id,
                    request_times  = 1,
                    is_success     = 0,
                    network_error  = 1,
                    response_error = 0
                };
                string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                   "transaction-data", "update-credit", ctx.JsonHelper.ToJsonString(updateReq));

                dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);

                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to call credit function from merchant site"
                }));
            }
            else
            {
                ctx.Logger.Info("Update credit record in db...");

                if (ret.error_code == 0)
                {
                    var updateReq = new
                    {
                        dbReply.credit_uuid,
                        req.merchant_code,
                        req.player_id,
                        request_times  = 1,
                        is_success     = 1,
                        network_error  = 0,
                        response_error = 0
                    };
                    string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                       "transaction-data", "update-credit", ctx.JsonHelper.ToJsonString(updateReq));

                    if (String.IsNullOrEmpty(dbReplyStr2))
                    {
                        ctx.Logger.Info("Failed to update credit record in db");
                    }
                    else
                    {
                        dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);
                        ctx.Logger.Info("Update credit record in db - error code: " + dbReply2.error_code.ToString());
                    }
                }
                else
                {
                    var updateReq = new
                    {
                        dbReply.credit_uuid,
                        req.merchant_code,
                        req.player_id,
                        request_times  = 1,
                        is_success     = 0,
                        network_error  = 0,
                        response_error = ret.error_code
                    };
                    string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                       "transaction-data", "update-credit", ctx.JsonHelper.ToJsonString(updateReq));

                    dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);
                }

                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(ret));
            }
        }
예제 #16
0
        public async Task CancelBetDebit(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string betUuid      = req.bet_uuid;
            string merchantCode = req.merchant_code.ToString(); // maybe need to get db name with merchant code

            var     totalCount  = 0;
            decimal totalAmount = 0;

            Dictionary <string, List <dynamic> > debitItems = new Dictionary <string, List <dynamic> >();
            Dictionary <string, dynamic>         merchants  = new Dictionary <string, dynamic>();
            var dbhelper = ctx.DataHelper;

            using (var cnn = dbhelper.OpenDatabase(m_CommonMerchantDb))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    dbhelper.AddParam(cmd, "@bet_uuid", betUuid);

                    // select records which need to cancel
                    cmd.CommandText = " select debit_uuid, bet_uuid, player_id, client_id, session_id, "
                                      + " merchant_code, currency_code, debit_amount from tbl_trans_debit "
                                      + " where is_cancelled = 0 and bet_uuid = @bet_uuid ";

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string debitUuid = reader["debit_uuid"].ToString();
                            //string betUuid = reader["bet_uuid"].ToString();
                            string  playerId        = reader["player_id"].ToString();
                            string  clientId        = reader["client_id"].ToString();
                            string  sessionId       = reader["session_id"].ToString();
                            string  currentMerchant = reader["merchant_code"].ToString();
                            string  currencyCode    = reader["currency_code"].ToString();
                            decimal debitAmount     = Convert.ToDecimal(reader["debit_amount"].ToString());

                            var reqIp = clientId;
                            if (reqIp.Contains(":"))
                            {
                                reqIp = reqIp.Split(':')[0];
                            }

                            var item = new
                            {
                                debit_uuid    = debitUuid,
                                trans_uuid    = debitUuid + "-cancel",
                                bet_uuid      = betUuid,
                                merchant_code = currentMerchant,
                                currency_code = currencyCode,
                                player_id     = playerId,
                                player_ip     = reqIp,
                                session_id    = sessionId,
                                amount        = debitAmount
                            };

                            string merchantKey = item.merchant_code + item.currency_code;

                            if (debitItems.ContainsKey(merchantKey))
                            {
                                var list = debitItems[merchantKey];
                                list.Add(item);
                            }
                            else
                            {
                                var list = new List <dynamic>();
                                list.Add(item);
                                debitItems.Add(merchantKey, list);
                            }
                        }
                    }
                }

                foreach (var item in debitItems)
                {
                    if (!merchants.ContainsKey(item.Key))
                    {
                        string merchantInfo = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                            "merchant-data", "get-merchant-info", item.Key);

                        if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
                        {
                            continue;
                        }

                        dynamic merchant = ctx.JsonHelper.ToJsonObject(merchantInfo);
                        if (merchant != null)
                        {
                            merchants.Add(item.Key, merchant);
                        }
                    }

                    if (!merchants.ContainsKey(item.Key))
                    {
                        continue;
                    }

                    string apiUrl = merchants[item.Key].url.ToString();
                    string apiSvc = merchants[item.Key].service.ToString();

                    var list = item.Value;

                    foreach (var debit in list)
                    {
                        var apiReq = new
                        {
                            merchant_url = apiUrl,
                            debit.trans_uuid,
                            debit.debit_uuid,
                            debit.bet_uuid,
                            debit.merchant_code,
                            debit.currency_code,
                            debit.player_id,
                            debit.player_ip,
                            debit.session_id,
                            debit.amount
                        };

                        dynamic ret = null;
                        try
                        {
                            string retJson = await CallMerchantApi(ctx, apiSvc, "cancel-debit", ctx.JsonHelper.ToJsonString(apiReq));

                            ret = string.IsNullOrEmpty(retJson) ? null : ctx.JsonHelper.ToJsonObject(retJson);
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            ctx.Logger.Error("Failed to call cancel debit: " + ex.Message);
                        }

                        try
                        {
                            if (ret != null)
                            {
                                int respCode = ret.error_code;

                                var sql = " update tbl_trans_debit "
                                          + " set network_error = 0 , response_error = " + respCode;
                                if (respCode == 0)
                                {
                                    sql += " , is_cancelled = 1 ";
                                }
                                sql += " , update_time = NOW() ";
                                sql += " where debit_uuid = @debit_uuid ";

                                var okay  = false;
                                var trans = cnn.BeginTransaction();

                                using (var cmd = cnn.CreateCommand())
                                {
                                    cmd.Transaction = trans;

                                    dbhelper.AddParam(cmd, "@debit_uuid", debit.debit_uuid);
                                    cmd.CommandText = sql;

                                    okay = cmd.ExecuteNonQuery() > 0;
                                }

                                if (okay)
                                {
                                    sql  = " update tbl_bet_record set cancel_state = 1 ";
                                    sql += " , update_time = CURRENT_TIMESTAMP ";
                                    if (respCode == 0)
                                    {
                                        sql += " , cancel_time = CURRENT_TIMESTAMP ";
                                    }
                                    sql += " where bet_uuid = @bet_uuid ";

                                    using (var cmd = cnn.CreateCommand())
                                    {
                                        cmd.Transaction = trans;

                                        dbhelper.AddParam(cmd, "@bet_uuid", debit.bet_uuid);

                                        cmd.CommandText = sql;

                                        okay = okay && cmd.ExecuteNonQuery() > 0;
                                    }
                                }

                                if (okay)
                                {
                                    trans.Commit();
                                }
                                else
                                {
                                    trans.Rollback();
                                }

                                if (okay)
                                {
                                    totalAmount += debit.amount;
                                }
                            }

                            totalCount++;
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            ctx.Logger.Error("Failed to call cancel debit: " + ex.Message);
                        }
                    } // end of debits of same merchant
                }     // end of all debits
            }         // end of using db cnn

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
            {
                error_code    = 0,
                total_amount  = totalAmount,
                error_message = totalCount.ToString()
            }));
        }
        public async Task UserLogin(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            var dataReq = new
            {
                req.account,
                req.merchant,
                req.password
            };

            string dataReplyString = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                   "bo-data", "check-account", ctx.JsonHelper.ToJsonString(dataReq));

            if (String.IsNullOrEmpty(dataReplyString))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to check backoffice account from db: [" + req.merchant.ToString() + "]" + req.account.ToString()
                }));

                return;
            }

            dynamic dataReply = ctx.JsonHelper.ToJsonObject(dataReplyString);

            if (dataReply.error_code != 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    dataReply.error_code,
                    error_message = "Failed to validate backoffice account from db: [" + req.merchant.ToString() + "]"
                                    + req.account.ToString() + " - " + dataReply.error_message.ToString()
                }));

                return;
            }

            ctx.Logger.Info("Backoffice user login - [" + req.merchant.ToString() + "] " + req.account.ToString());

            var okay      = false;
            var sessionId = Guid.NewGuid().ToString();

            var dbhelper = ctx.DataHelper;

            using (var cnn = dbhelper.OpenDatabase(m_MainCache))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    dbhelper.AddParam(cmd, "@session_id", sessionId);
                    dbhelper.AddParam(cmd, "@account_id", req.account);
                    dbhelper.AddParam(cmd, "@merchant_code", req.merchant);

                    cmd.CommandText = " update tbl_bo_session "
                                      + " set session_id = @session_id , last_access_time = NOW() "
                                      + " where merchant_code = @merchant_code and account_id = @account_id ";

                    okay = cmd.ExecuteNonQuery() > 0;

                    if (!okay)
                    {
                        using (var cmd2 = cnn.CreateCommand())
                        {
                            dbhelper.AddParam(cmd2, "@session_id", sessionId);
                            dbhelper.AddParam(cmd2, "@account_id", req.account);
                            dbhelper.AddParam(cmd2, "@merchant_code", req.merchant);

                            cmd2.CommandText = " insert into tbl_bo_session "
                                               + " ( session_id , account_id , merchant_code, last_access_time ) values "
                                               + " ( @session_id, @account_id, @merchant_code, NOW() ) ";

                            okay = cmd2.ExecuteNonQuery() > 0;
                        }
                    }
                }
            }

            if (!okay)
            {
                ctx.Logger.Error("Failed to let backoffice user login: cache error");
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to let backoffice user login: cache error"
                }));

                return;
            }

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
            {
                session_id = sessionId,
                req.account,
                req.merchant,
                error_code    = 0,
                error_message = "ok"
            }));
        }
예제 #18
0
        public async Task CreateCredit(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            bool   okay     = false;
            string creditId = req.bet_uuid + "-credit";
            string gameCode = "Mini-" + req.table_code;
            string roundId  = req.table_code + "-" + req.shoe_code + "-" + req.round_number;

            string providerCode = "mini";

            string merchantCode = req.merchant_code.ToString();

            string merchantUrl = await RemoteCaller.RandomCall(ctx.RemoteServices, "merchant-data", "get-merchant-url", merchantCode);

            if (String.IsNullOrEmpty(merchantUrl))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant API URL not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            string requestUrl = merchantUrl + "/bet/credit-for-settling-bet";

            var dbhelper = ctx.DataHelper;

            using (var cnn = dbhelper.OpenDatabase(merchantCode))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    dbhelper.AddParam(cmd, "@credit_uuid", creditId);
                    dbhelper.AddParam(cmd, "@bet_uuid", req.bet_uuid);

                    dbhelper.AddParam(cmd, "@game_code", gameCode);
                    dbhelper.AddParam(cmd, "@round_id", roundId);
                    dbhelper.AddParam(cmd, "@bet_pool", req.bet_pool);

                    dbhelper.AddParam(cmd, "@provider_code", providerCode);

                    dbhelper.AddParam(cmd, "@merchant_code", req.merchant_code);
                    dbhelper.AddParam(cmd, "@player_id", req.player_id);

                    dbhelper.AddParam(cmd, "@credit_amount", req.pay_amount);

                    dbhelper.AddParam(cmd, "@request_url", requestUrl);

                    cmd.CommandText = " insert into tbl_trans_credit "
                                      + " ( credit_uuid, bet_uuid, game_code, round_id, bet_pool, provider_code, merchant_code, player_id, credit_amount, request_url ) values "
                                      + " ( @credit_uuid, @bet_uuid, @game_code, @round_id , @bet_pool , @provider_code , @merchant_code , @player_id , @credit_amount , @request_url ) "
                    ;

                    okay = cmd.ExecuteNonQuery() > 0;
                }
            }

            if (okay)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code  = 0,
                    credit_uuid = creditId,
                    round_id    = roundId,
                    request_url = requestUrl
                }));
            }
            else
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to update database"
                }));
            }
        }
예제 #19
0
        public async Task GetBetRecords(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();

            //ctx.Logger.Info("bo-api | get-bet-records");

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                return;
            }

            //dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);
            var req = ctx.JsonHelper.ToDictionary(reqstr);

            string sessionId = req.ContainsKey("sessionId") ? req["sessionId"].ToString() : "";

            IDictionary <string, object> queryParam = req.ContainsKey("queryParam") ? req["queryParam"] as IDictionary <string, object> : null;

            if (queryParam == null)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -2,
                    error_message = "Failed to get bet records: missing params",
                }));

                return;
            }

            string pageSize   = queryParam.ContainsKey("rows") ? queryParam["rows"].ToString() : "1";
            string pageNumber = queryParam.ContainsKey("page") ? queryParam["page"].ToString() : "1";

            string currentMerchant = queryParam.ContainsKey("merchantCode") ? queryParam["merchantCode"].ToString() : "";

            string merchantCode = queryParam.ContainsKey("queryMerchant") ? queryParam["queryMerchant"].ToString() : "";
            string currencyCode = queryParam.ContainsKey("queryCurrency") ? queryParam["queryCurrency"].ToString() : "";
            string playerId     = queryParam.ContainsKey("queryPlayer") ? queryParam["queryPlayer"].ToString() : "";

            string betId = queryParam.ContainsKey("betId") ? queryParam["betId"].ToString() : "";

            string userId       = queryParam.ContainsKey("userId") ? queryParam["userId"].ToString() : "";
            string fromDateTime = queryParam.ContainsKey("fromDateTime") ? queryParam["fromDateTime"].ToString() : "";
            string toDateTime   = queryParam.ContainsKey("toDateTime") ? queryParam["toDateTime"].ToString() : "";

            if (currentMerchant != "-" && currentMerchant != merchantCode)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -4,
                    error_message = "Failed to get bet records: missing or invalid merchant",
                }));

                return;
            }

            DateTime dtStart = DateTime.MinValue;
            DateTime dtEnd   = DateTime.MinValue;

            if (!DateTime.TryParseExact(fromDateTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out dtStart) ||
                !DateTime.TryParseExact(toDateTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out dtEnd))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -3,
                    error_message = "Failed to get bet records: missing or invalid datetime",
                }));

                return;
            }

            var dbReq = new
            {
                pageSize,
                pageNumber,

                merchantCode,
                currencyCode,
                playerId,

                betId,

                fromDateTime,
                toDateTime
            };
            string replystr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                            "bo-data", "get-bet-records", ctx.JsonHelper.ToJsonString(dbReq));

            if (String.IsNullOrEmpty(replystr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = -5,
                    error_message = "Failed to get bet records from DB",
                }));
            }
            else
            {
                await ctx.Session.Send(replystr);
            }
        }
예제 #20
0
        public async Task PlayGame(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();

            string replyMsgName = "play_game_reply";

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = replyMsgName,
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            ctx.Logger.Info("Play Cards - " + reqstr);

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string playerId     = req.player_id;
            string merchantCode = req.merchant_code;
            string currencyCode = req.currency_code;
            string tableCode    = req.table_code;
            string gameInput    = req.game_input;

            string frontEnd = m_LocalNode.GetName();

            if (string.IsNullOrEmpty(frontEnd))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = replyMsgName,
                    error_code    = -2,
                    error_message = "Service not available"
                }));

                return;
            }

            var remoteInfo = "";
            var rets       = await RemoteCaller.BroadcastCall(ctx.RemoteServices, "game-table", "find-game-table", tableCode);

            foreach (var item in rets)
            {
                if (item.Value == "ok")
                {
                    remoteInfo = item.Key;
                    break;
                }
            }
            if (string.IsNullOrEmpty(remoteInfo))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    msg           = replyMsgName,
                    error_code    = -2,
                    error_message = "Service not available"
                }));

                return;
            }

            var tablereq = new
            {
                player_id     = playerId,
                merchant_code = merchantCode,
                currency_code = currencyCode,
                table_code    = tableCode,
                game_input    = gameInput
            };

            var reply = await RemoteCaller.SpecifiedCall(ctx.RemoteServices, RemoteCaller.GetServerNameFromRemoteInfo(remoteInfo),
                                                         "game-table", "play-game", ctx.JsonHelper.ToJsonString(tablereq));

            if (string.IsNullOrEmpty(reply))
            {
                reply = ctx.JsonHelper.ToJsonString(new
                {
                    msg           = replyMsgName,
                    error_code    = -8,
                    error_message = "Failed to call play game function"
                });
            }
            else
            {
                dynamic ret = ctx.JsonHelper.ToJsonObject(reply);
                ret.msg = replyMsgName;
                reply   = ctx.JsonHelper.ToJsonString(ret);
            }

            await ctx.Session.Send(reply);
        }
예제 #21
0
        public async Task OutputGameResult()
        {
            m_Logger.Info("Player: " + String.Join(",", m_PlayerCards.ToArray()) + " = " + PlayerPoints);
            m_Logger.Info("Banker: " + String.Join(",", m_BankerCards.ToArray()) + " = " + BankerPoints);
            m_Logger.Info("Final game result - Player: " + PlayerPoints + "  |  Banker: " + BankerPoints);
            if (PlayerPoints > BankerPoints)
            {
                m_Logger.Info("PLAYER WIN");
            }
            if (PlayerPoints < BankerPoints)
            {
                m_Logger.Info("BANKER WIN");
            }
            if (PlayerPoints == BankerPoints)
            {
                m_Logger.Info("TIE");
            }

            m_Logger.Info("Updating game record in database...");

            int gameResult   = 0;
            int playerPoints = PlayerPoints;
            int bankerPoints = BankerPoints;

            if (playerPoints < bankerPoints)
            {
                gameResult = 1;
            }
            if (playerPoints > bankerPoints)
            {
                gameResult = 2;
            }
            if (playerPoints == bankerPoints)
            {
                gameResult = 3;
            }
            gameResult = gameResult * 100 + bankerPoints * 10 + playerPoints;

            var saveReq = new
            {
                server     = m_Node.GetName(),
                table      = TableCode,
                shoe       = m_ShoeCode,
                round      = m_RoundIndex,
                state      = (int)m_GameState,
                updatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                player     = String.Join(",", m_PlayerCards.ToArray()),
                banker     = String.Join(",", m_BankerCards.ToArray()),
                result     = gameResult
            };
            string ret = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                       "game-data", "update-result", m_Node.GetJsonHelper().ToJsonString(saveReq));

            if (ret == "ok")
            {
                m_Logger.Info("Update database successfully");
            }
            else
            {
                m_Logger.Error("Failed to update game data in database");
            }


            m_GameReadyCountdown = GET_READY_COUNTDOWN;
            //m_GameState = GAME_STATUS.GetGameReady;

            UpdateRoundState(GAME_STATUS.GetGameReady);

            //System.Diagnostics.Debugger.Break();

            m_Logger.Info("Settling...");
            string replystr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(), "check-bet-winloss", "check-and-update", m_Node.GetName());

            if (!replystr.Contains('['))
            {
                m_Logger.Error("Failed to update bets by game result - " + replystr);
            }
            else
            {
                dynamic reply = m_Node.GetJsonHelper().ToJsonObject(replystr);

                /*
                 * m_Logger.Info("Update database...");
                 * List<Task> dbTasks = new List<Task>();
                 * foreach (var item in reply)
                 * {
                 *  string uuid = item.bet_uuid.ToString();
                 *  dbTasks.Add(Task.Run(async () =>
                 *  {
                 *      string dbErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                 *                              "bet-data", "update-result", m_Node.GetJsonHelper().ToJsonString(item));
                 *      m_Logger.Info("Update bet in database: " + uuid + " ... " + dbErr); // should do more if really failed to update db...
                 *  }));
                 * }
                 *
                 * Task.WaitAll(dbTasks.ToArray());
                 *
                 * m_Logger.Info("Update cache...");
                 * List<Task> cacheTasks = new List<Task>();
                 * foreach (var item in reply)
                 * {
                 *  string uuid = item.bet_uuid.ToString();
                 *  cacheTasks.Add(Task.Run(async () =>
                 *  {
                 *      string cacheErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                 *                              "settle-bet", "settle", m_Node.GetJsonHelper().ToJsonString(item));
                 *      m_Logger.Info("Update bet cache: " + uuid + " ... " + cacheErr);
                 *  }));
                 * }
                 *
                 * Task.WaitAll(cacheTasks.ToArray());
                 */


                m_Logger.Info("Update bets in database...");

                int idx        = 0;
                int batchCount = 100;

                List <List <dynamic> > dbItems = new List <List <dynamic> >();
                while (idx < reply.Count)
                {
                    List <dynamic> items = new List <dynamic>();
                    int            count = reply.Count - idx >= batchCount ? batchCount : reply.Count - idx;
                    for (var i = 0; i < count; i++)
                    {
                        items.Add(reply[idx + i]);
                    }
                    idx += count;
                    dbItems.Add(items);
                }

                List <Task>   dbBatchTasks             = new List <Task>();
                List <string> dbErrIds                 = new List <string>();
                Dictionary <string, dynamic> passItems = new Dictionary <string, dynamic>();
                foreach (var list in dbItems)
                {
                    dbBatchTasks.Add(Task.Run(async() =>
                    {
                        foreach (var item in list)
                        {
                            string uuid = item.bet_uuid.ToString();
                            dbErrIds.Add(uuid);
                        }

                        string dbErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                     "batch-update", "update-bet-db", m_Node.GetJsonHelper().ToJsonString(list));
                        if (dbErr.Length <= 0 || !dbErr.Contains("["))
                        {
                            m_Logger.Info("Errors found when update bets in db: " + dbErr);
                        }
                        else
                        {
                            dynamic passList = m_Node.GetJsonHelper().ToJsonObject(dbErr);
                            foreach (var item in passList)
                            {
                                string uuid = item.bet_uuid.ToString();
                                dbErrIds.Remove(uuid);
                                passItems.Add(uuid, item);
                            }
                        }
                    }));
                }

                Task.WaitAll(dbBatchTasks.ToArray());

                m_Logger.Info("Updated bets in db: " + (reply.Count - dbErrIds.Count) + " / " + reply.Count);


                List <dynamic> records = new List <dynamic>();
                foreach (var item in reply)
                {
                    string uuid = item.bet_uuid.ToString();
                    if (dbErrIds.Contains(uuid))
                    {
                        m_Logger.Error("Fialed to update bet in db: " + uuid);
                        continue;
                    }
                    else
                    {
                        records.Add(item);  // only keep good records
                    }
                }


                m_Logger.Info("Update wallets...");

                idx        = 0;
                batchCount = 100;

                List <List <dynamic> > walletItems = new List <List <dynamic> >();
                while (idx < records.Count)
                {
                    List <dynamic> items = new List <dynamic>();
                    int            count = records.Count - idx >= batchCount ? batchCount : records.Count - idx;
                    for (var i = 0; i < count; i++) //items.Add(records[idx + i]);
                    {
                        string currentBetId = records[idx + i].bet_uuid;
                        items.Add(new
                        {
                            bet_uuid      = currentBetId,
                            table_code    = TableCode,
                            shoe_code     = m_ShoeCode,
                            round_number  = m_RoundIndex,
                            bet_pool      = records[idx + i].bet_pool,
                            merchant_code = records[idx + i].merchant_code,
                            player_id     = records[idx + i].player_id,
                            pay_amount    = records[idx + i].pay_amount,
                            settle_time   = passItems[currentBetId].settle_time
                        });
                    }
                    idx += count;
                    walletItems.Add(items);
                }

                List <Task>   walletBatchTasks = new List <Task>();
                List <string> walletErrIds     = new List <string>();
                foreach (var list in walletItems)
                {
                    walletBatchTasks.Add(Task.Run(async() =>
                    {
                        string walletErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                         "batch-update", "update-bet-wallet", m_Node.GetJsonHelper().ToJsonString(list));
                        if (walletErr.Length <= 0 || !walletErr.Contains("["))
                        {
                            foreach (var item in list)
                            {
                                string uuid = item.bet_uuid.ToString();
                                walletErrIds.Add(uuid);
                            }
                            m_Logger.Info("Errors found when update wallets with bet results: " + walletErr);
                        }
                        else
                        {
                            dynamic errList = m_Node.GetJsonHelper().ToJsonObject(walletErr);
                            foreach (var item in errList)
                            {
                                string uuid = item.ToString();
                                walletErrIds.Add(uuid);
                            }
                        }
                    }));
                }

                Task.WaitAll(walletBatchTasks.ToArray());

                m_Logger.Info("Updated wallets with bet results: " + (records.Count - walletErrIds.Count) + " / " + records.Count);


                foreach (var item in reply)
                {
                    string uuid = item.bet_uuid.ToString();
                    if (walletErrIds.Contains(uuid))
                    {
                        m_Logger.Error("Fialed to update wallet for bet: " + uuid);
                    }
                }


                m_Logger.Info("Update cache...");

                idx        = 0;
                batchCount = 100;

                List <List <dynamic> > cacheItems = new List <List <dynamic> >();
                while (idx < records.Count)
                {
                    List <dynamic> items = new List <dynamic>();
                    int            count = records.Count - idx >= batchCount ? batchCount : records.Count - idx;
                    for (var i = 0; i < count; i++)
                    {
                        items.Add(records[idx + i]);
                    }
                    idx += count;
                    cacheItems.Add(items);
                }

                List <Task>   cacheBatchTasks = new List <Task>();
                List <string> cacheErrIds     = new List <string>();
                foreach (var list in cacheItems)
                {
                    cacheBatchTasks.Add(Task.Run(async() =>
                    {
                        string cacheErr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                        "batch-update", "update-bet-cache", m_Node.GetJsonHelper().ToJsonString(list));
                        if (cacheErr.Length <= 0 || !cacheErr.Contains("["))
                        {
                            foreach (var item in list)
                            {
                                string uuid = item.bet_uuid.ToString();
                                cacheErrIds.Add(uuid);
                            }
                            m_Logger.Info("Errors found when update bets in cache: " + cacheErr);
                        }
                        else
                        {
                            dynamic errList = m_Node.GetJsonHelper().ToJsonObject(cacheErr);
                            foreach (var item in errList)
                            {
                                string uuid = item.ToString();
                                cacheErrIds.Add(uuid);
                            }
                        }
                    }));
                }

                Task.WaitAll(cacheBatchTasks.ToArray());

                m_Logger.Info("Updated bets in cache: " + (records.Count - cacheErrIds.Count) + " / " + records.Count);

                m_Logger.Info("Settle done");
            }
        }
        public async Task PlayerLogin(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string merchantUrl = await RemoteCaller.RandomCall(m_LocalNode.GetRemoteServices(),
                                                               "merchant-data", "get-merchant-url", req.merchant_code.ToString());

            if (String.IsNullOrEmpty(merchantUrl))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant API URL not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            ctx.Logger.Info("Player login - [" + req.merchant_code.ToString() + "] " + req.player_id.ToString());
            ctx.Logger.Info("Merchant URL - " + merchantUrl);

            var apiReq = new
            {
                req.merchant_code,
                req.player_id,
                req.login_token
            };
            dynamic ret = await RemoteCaller.Request(merchantUrl + "/player/validate-login", apiReq, null, 10 * 1000);

            if (ret == null || ret.error_code != 0)
            {
                ctx.Logger.Error("Three-Way Login Error: " + (ret == null ? "Failed to call merchant API" : ret.error_message));
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Three-Way Login Error"
                }));

                return;
            }

            var okay      = false;
            var sessionId = Guid.NewGuid().ToString();

            var dbhelper = m_LocalNode.GetDataHelper();

            using (var cnn = dbhelper.OpenDatabase(m_MainCache))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    dbhelper.AddParam(cmd, "@session_id", sessionId);
                    dbhelper.AddParam(cmd, "@merchant_code", req.merchant_code);
                    dbhelper.AddParam(cmd, "@player_id", req.player_id);

                    cmd.CommandText = " update tbl_player_session "
                                      + " set session_id = @session_id , update_time = NOW() "
                                      + " where merchant_code = @merchant_code and player_id = @player_id ";

                    okay = cmd.ExecuteNonQuery() > 0;

                    if (!okay)
                    {
                        using (var cmd2 = cnn.CreateCommand())
                        {
                            dbhelper.AddParam(cmd2, "@session_id", sessionId);
                            dbhelper.AddParam(cmd2, "@merchant_code", req.merchant_code);
                            dbhelper.AddParam(cmd2, "@player_id", req.player_id);

                            cmd2.CommandText = " insert into tbl_player_session "
                                               + " ( session_id , merchant_code, player_id, update_time ) values "
                                               + " ( @session_id, @merchant_code, @player_id, NOW() ) ";

                            okay = cmd2.ExecuteNonQuery() > 0;
                        }
                    }
                }
            }

            if (!okay)
            {
                ctx.Logger.Error("Three-Way Login Failed!");
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Three-Way Login Failed"
                }));

                return;
            }

            var remoteServices = m_LocalNode.GetRemoteServices();

            var frontEndUrl  = RandomPickPublicServiceUrl(remoteServices, "table-info");
            var betServerUrl = RandomPickPublicServiceUrl(remoteServices, "accept-bet");

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
            {
                req.merchant_code,
                req.player_id,
                ret.player_balance,
                session_id    = sessionId,
                front_end     = frontEndUrl,
                bet_server    = betServerUrl,
                error_code    = 0,
                error_message = "Three-Way Login Okay"
            }));
        }
예제 #23
0
        private async Task TryToRedoCredits()
        {
            //m_Logger.Info("TryToRedoCredits - START -");

            var totalCount = 0;

            Dictionary <string, List <dynamic> > creditItems = new Dictionary <string, List <dynamic> >();
            Dictionary <string, dynamic>         merchants   = new Dictionary <string, dynamic>();
            var dbhelper = m_Node.GetDataHelper();

            using (var cnn = dbhelper.OpenDatabase(m_CommonMerchantDb))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    //int dtColumnIndex = 11;

                    // select records which need to retry
                    cmd.CommandText = " select credit_uuid, merchant_code, currency_code, "
                                      + " bet_uuid, player_id, client_id, session_id, round_id, request_times, "
                                      + " bet_pool, credit_amount, create_time "
                                      + " from tbl_trans_credit "
                                      + " where is_cancelled = 0 and is_success = 0 "
                                      + " and (network_error <> 0 || (request_times = 0 and TIMESTAMPDIFF(SECOND, create_time, NOW()) > 60)) ";

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            string creditUuid   = reader["credit_uuid"].ToString();
                            string merchantCode = reader["merchant_code"].ToString();
                            string currencyCode = reader["currency_code"].ToString();

                            string betUuid  = reader["bet_uuid"].ToString();
                            string playerId = reader["player_id"].ToString();
                            string roundId  = reader["round_id"].ToString();

                            string clientId  = reader["client_id"].ToString();
                            string sessionId = reader["session_id"].ToString();

                            int     betPool      = Convert.ToInt32(reader["bet_pool"].ToString());
                            decimal creditAmount = Convert.ToDecimal(reader["credit_amount"].ToString());

                            int reqTimes = Convert.ToInt32(reader["request_times"].ToString());

                            //var creditTime = reader.GetDateTime(dtColumnIndex);
                            //var creditdt = creditTime.ToString("yyyy-MM-dd HH:mm:ss");

                            var creditdt = Convert.ToDateTime(reader["create_time"]).ToString("yyyy-MM-dd HH:mm:ss");

                            var reqIp = clientId;
                            if (reqIp.Contains(":"))
                            {
                                reqIp = reqIp.Split(':')[0];
                            }

                            var item = new
                            {
                                credit_uuid     = creditUuid,
                                bet_uuid        = betUuid,
                                merchant_code   = merchantCode,
                                currency_code   = currencyCode,
                                player_id       = playerId,
                                player_ip       = reqIp,
                                session_id      = sessionId,
                                round_id        = roundId,
                                bet_pool        = betPool,
                                credit_amount   = creditAmount,
                                bet_settle_time = creditdt,
                                request_times   = reqTimes + 1,
                                //is_cancelled = false
                            };

                            string merchantKey = item.merchant_code + item.currency_code;

                            if (creditItems.ContainsKey(merchantKey))
                            {
                                var list = creditItems[merchantKey];
                                list.Add(item);
                            }
                            else
                            {
                                var list = new List <dynamic>();
                                list.Add(item);
                                creditItems.Add(merchantKey, list);
                            }
                        }
                    }
                }

                foreach (var item in creditItems)
                {
                    if (!merchants.ContainsKey(item.Key))
                    {
                        string merchantInfo = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                            "merchant-data", "get-merchant-info", item.Key);

                        if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
                        {
                            continue;
                        }

                        dynamic merchant = m_Node.GetJsonHelper().ToJsonObject(merchantInfo);
                        if (merchant != null)
                        {
                            merchants.Add(item.Key, merchant);
                        }
                    }

                    if (!merchants.ContainsKey(item.Key))
                    {
                        continue;
                    }

                    string apiUrl = merchants[item.Key].url.ToString();
                    string apiSvc = merchants[item.Key].service.ToString();

                    var list = item.Value;

                    foreach (var credit in list)
                    {
                        var apiReq = new
                        {
                            merchant_url = apiUrl,
                            credit.credit_uuid,
                            credit.bet_uuid,
                            credit.merchant_code,
                            credit.currency_code,
                            credit.player_id,
                            credit.player_ip,
                            credit.session_id,
                            credit.round_id,
                            credit.bet_pool,
                            credit.credit_amount,
                            credit.bet_settle_time,
                            credit.request_times,
                            is_cancelled = false
                        };

                        dynamic ret = null;
                        try
                        {
                            string retJson = await CallMerchantApi(apiSvc, "credit-for-settling", m_Node.GetJsonHelper().ToJsonString(apiReq));

                            ret = string.IsNullOrEmpty(retJson) ? null : m_Node.GetJsonHelper().ToJsonObject(retJson);
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            m_Node.GetLogger().Error("Failed to call redo credit: " + ex.Message);
                        }

                        try
                        {
                            if (ret != null)
                            {
                                int respCode = ret.error_code;

                                var sql = " update tbl_trans_credit "
                                          + " set network_error = 0 , response_error = " + respCode;
                                if (respCode == 0)
                                {
                                    sql += " , is_success = 1 ";
                                }
                                sql += " , request_times = request_times + 1 , update_time = NOW()  ";
                                sql += " where credit_uuid = @credit_uuid ";

                                var okay  = false;
                                var trans = cnn.BeginTransaction();

                                using (var cmd = cnn.CreateCommand())
                                {
                                    cmd.Transaction = trans;

                                    dbhelper.AddParam(cmd, "@credit_uuid", credit.credit_uuid);
                                    cmd.CommandText = sql;

                                    okay = cmd.ExecuteNonQuery() > 0;
                                }

                                if (okay)
                                {
                                    sql  = " update tbl_bet_record set credit_state = 1 ";
                                    sql += " , update_time = CURRENT_TIMESTAMP ";
                                    sql += " where bet_uuid = @bet_uuid ";

                                    using (var cmd = cnn.CreateCommand())
                                    {
                                        cmd.Transaction = trans;

                                        dbhelper.AddParam(cmd, "@bet_uuid", credit.bet_uuid);

                                        cmd.CommandText = sql;

                                        okay = okay && cmd.ExecuteNonQuery() > 0;
                                    }
                                }

                                if (okay)
                                {
                                    trans.Commit();
                                }
                                else
                                {
                                    trans.Rollback();
                                }
                            }
                            else
                            {
                                var sql = " update tbl_trans_credit ";
                                sql += " set request_times = request_times + 1 , update_time = NOW()  ";
                                sql += " where credit_uuid = @credit_uuid ";

                                using (var cmd = cnn.CreateCommand())
                                {
                                    dbhelper.AddParam(cmd, "@credit_uuid", credit.credit_uuid);
                                    cmd.CommandText = sql;
                                    cmd.ExecuteNonQuery();
                                }
                            }

                            totalCount++;
                        }
                        catch (Exception ex)
                        {
                            ret = null;
                            m_Node.GetLogger().Error("Failed to call redo credit: " + ex.Message);
                        }
                    } // end of credits of same merchant
                }     // end of all credits
            }         // end of using db cnn

            if (totalCount > 0)
            {
                m_Logger.Info("TryToRedoCredits - DONE (" + totalCount + ")");
            }
        }
        public async Task <dynamic> AcceptBet(dynamic betreq)
        {
            string replyMsgType   = "bet_reply";
            int    replyErrorCode = -1;
            string replyErroMsg   = "input invalid";

            if (betreq.bet_pool < 1)
            {
                return(new
                {
                    msg = replyMsgType,

                    error_code = replyErrorCode,
                    error_msg = replyErroMsg
                });
            }

            string  betGuid       = "";
            decimal playerBalance = -1;

            var dbhelper = m_Node.GetDataHelper();

            using (var cnn = dbhelper.OpenDatabase(m_MainCache))
            {
                using (var cmd = cnn.CreateCommand())
                {
                    dbhelper.AddParam(cmd, "@server_code", betreq.server_code);
                    dbhelper.AddParam(cmd, "@table_code", betreq.table_code);
                    dbhelper.AddParam(cmd, "@shoe_code", betreq.shoe_code);
                    dbhelper.AddParam(cmd, "@round_number", betreq.round_number);

                    cmd.CommandText = " select * from tbl_round_state "
                                      + " where round_state = 4 and bet_time_countdown > 0 "
                                      + " and server_code = @server_code and table_code = @table_code "
                                      + " and shoe_code = @shoe_code and round_number = @round_number ";
                    using (var reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            replyErrorCode = 2;
                            replyErroMsg   = "timing is fine";
                        }
                        else
                        {
                            replyErrorCode = -2;
                            replyErroMsg   = "out of betting time";
                        }
                    }
                }

                if (replyErrorCode >= 0)
                {
                    m_Logger.Info("Saving bet record to database...");

                    string betTime = "";
                    string retStr  = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                   "bet-data", "save-record", m_Node.GetJsonHelper().ToJsonString(betreq));

                    if (retStr.Contains("{") && retStr.Contains("-"))
                    {
                        dynamic ret = m_Node.GetJsonHelper().ToJsonObject(retStr);
                        betGuid = ret.bet_uuid;
                        betTime = ret.bet_time;
                        m_Logger.Info("Update database successfully");
                    }
                    else
                    {
                        m_Logger.Error("Failed to save bet data in database");
                    }

                    if (betGuid.Length > 0 && betTime.Length > 0)
                    {
                        // call single wallet

                        m_Logger.Info("Call single wallet...");

                        var swReq = new
                        {
                            bet_uuid      = betGuid,
                            table_code    = betreq.table_code,
                            shoe_code     = betreq.shoe_code,
                            round_number  = betreq.round_number,
                            bet_pool      = betreq.bet_pool,
                            merchant_code = betreq.merchant_code,
                            player_id     = betreq.player_id,
                            bet_amount    = betreq.bet_amount,
                            bet_time      = betTime
                        };

                        string swReplyStr = await RemoteCaller.RandomCall(m_Node.GetRemoteServices(),
                                                                          "single-wallet", "debit-for-placing-bet", m_Node.GetJsonHelper().ToJsonString(swReq));

                        if (String.IsNullOrEmpty(swReplyStr))
                        {
                            replyErrorCode = -5;
                            replyErroMsg   = "failed to call single-wallet service";
                        }
                        else
                        {
                            dynamic ret = m_Node.GetJsonHelper().ToJsonObject(swReplyStr);

                            if (ret.error_code == 0)
                            {
                                playerBalance = ret.player_balance;
                            }
                            else
                            {
                                replyErrorCode = -5;
                                replyErroMsg   = "failed to debit from merchant";
                            }
                        }
                    }
                    else
                    {
                        replyErrorCode = -4;
                        replyErroMsg   = "failed to add it to db";
                    }

                    if (replyErrorCode >= 0 && playerBalance >= 0)
                    {
                        using (var cmd = cnn.CreateCommand())
                        {
                            dbhelper.AddParam(cmd, "@bet_uuid", betGuid);

                            dbhelper.AddParam(cmd, "@merchant_code", betreq.merchant_code);
                            dbhelper.AddParam(cmd, "@player_id", betreq.player_id);

                            dbhelper.AddParam(cmd, "@server_code", betreq.server_code);
                            dbhelper.AddParam(cmd, "@table_code", betreq.table_code);
                            dbhelper.AddParam(cmd, "@shoe_code", betreq.shoe_code);
                            dbhelper.AddParam(cmd, "@round_number", betreq.round_number);
                            dbhelper.AddParam(cmd, "@client_id", betreq.client_id);
                            dbhelper.AddParam(cmd, "@front_end", betreq.front_end);
                            dbhelper.AddParam(cmd, "@bet_pool", betreq.bet_pool);
                            dbhelper.AddParam(cmd, "@bet_amount", betreq.bet_amount);

                            cmd.CommandText = " insert into tbl_bet_record "
                                              + " ( bet_uuid, merchant_code, player_id, server_code, table_code, shoe_code, round_number, client_id, front_end, bet_pool, bet_amount, bet_time ) values "
                                              + " ( @bet_uuid, @merchant_code, @player_id, @server_code , @table_code , @shoe_code , @round_number , @client_id , @front_end , @bet_pool, @bet_amount , CURRENT_TIMESTAMP ) "
                            ;

                            int rows = cmd.ExecuteNonQuery();
                            if (rows > 0)
                            {
                                replyErrorCode = 3;
                                replyErroMsg   = "added to cache";
                            }
                            else
                            {
                                replyErrorCode = -3;
                                replyErroMsg   = "failed to add it to cache";
                            }
                        }
                    }
                }

                if (replyErrorCode >= 0)
                {
                    return(new
                    {
                        msg = replyMsgType,
                        player_balance = playerBalance,
                        error_code = 0,
                        error_msg = "ok"
                    });
                }
                else
                {
                    return new
                           {
                               msg            = replyMsgType,
                               player_balance = playerBalance,
                               error_code     = replyErrorCode,
                               error_msg      = replyErroMsg
                           }
                };
            }
        }
    }
예제 #25
0
 /// <summary>
 /// Вызвать удаленное апи
 /// </summary>
 /// <param name="remoteName"></param>
 /// <param name="workerName"></param>
 /// <param name="methodName"></param>
 /// <param name="methodParams"></param>
 /// <returns></returns>
 public string CallRemoteWorkerMethod(string remoteName, string workerName, string methodName, params dynamic[] methodParams)
 {
     return RemoteCaller.CallRemoteWorkerMethod(remoteName, workerName, methodName, methodParams)
         .ConfigureAwait(false).GetAwaiter().GetResult();
 }
        public async Task PlayerLogin(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            var reqIp = ctx.ClientAddress;

            if (reqIp.Contains(":"))
            {
                reqIp = reqIp.Split(':')[0];
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string merchantCode = req.merchant_code.ToString();
            string currencyCode = req.currency_code.ToString();
            string playerId     = req.player_id.ToString();

            string merchantInfo = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                "merchant-data", "get-merchant-info", merchantCode + currencyCode);

            if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant info not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            bool merchantOK = false;

            dynamic merchant        = ctx.JsonHelper.ToJsonObject(merchantInfo);
            string  merchantUrl     = "";
            string  merchantService = "";

            try
            {
                merchantUrl     = merchant.url.ToString();
                merchantService = merchant.service.ToString();

                if (merchantUrl.Length > 0 && merchantService.Length > 0)
                {
                    if (merchant.active > 0 && merchant.maintaining == 0)
                    {
                        merchantOK = true;
                    }
                }
            }
            catch
            {
                merchantOK = false;
            }

            if (!merchantOK)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant is not available: " + req.merchant_code.ToString()
                }));

                return;
            }


            string loginToken = "";

            try
            {
                loginToken = req.login_token.ToString();
            }
            catch { }

            ctx.Logger.Info("Player login - [" + req.merchant_code.ToString() + "] " + req.player_id.ToString());
            ctx.Logger.Info("Merchant URL - " + merchantUrl);

            var apiReq = new
            {
                merchant_url = merchantUrl,
                player_ip    = reqIp,
                req.merchant_code,
                req.currency_code,
                req.player_id,
                req.login_token
            };

            string retJson = await CallMerchantApi(ctx, merchantService, "player-login", ctx.JsonHelper.ToJsonString(apiReq));

            dynamic ret = string.IsNullOrEmpty(retJson) ? null : ctx.JsonHelper.ToJsonObject(retJson);

            if (ret == null || ret.error_code != 0)
            {
                ctx.Logger.Error("Three-Way Login Error: " + (ret == null ? "Failed to call merchant API" : ret.error_message));
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Three-Way Login Error"
                }));

                return;
            }

            var okay      = false;
            var sessionId = Guid.NewGuid().ToString();

            if (loginToken.Length >= 30)
            {
                sessionId = loginToken;
            }

            var dbhelper = ctx.DataHelper;

            using (var cnn = dbhelper.OpenDatabase(m_MainCache))
            {
                var trans = cnn.BeginTransaction();
                using (var cmd = cnn.CreateCommand())
                {
                    cmd.Transaction = trans;

                    dbhelper.AddParam(cmd, "@session_id", sessionId);
                    dbhelper.AddParam(cmd, "@merchant_code", req.merchant_code);
                    dbhelper.AddParam(cmd, "@currency_code", req.currency_code);
                    dbhelper.AddParam(cmd, "@player_id", req.player_id);

                    cmd.CommandText = " delete from tbl_player_session "
                                      + " where merchant_code = @merchant_code "
                                      + " and currency_code = @currency_code "
                                      + " and player_id = @player_id ";

                    okay = cmd.ExecuteNonQuery() > 0;

                    using (var cmd2 = cnn.CreateCommand())
                    {
                        cmd2.Transaction = trans;

                        dbhelper.AddParam(cmd2, "@session_id", sessionId);
                        dbhelper.AddParam(cmd2, "@merchant_code", req.merchant_code);
                        dbhelper.AddParam(cmd2, "@currency_code", req.currency_code);
                        dbhelper.AddParam(cmd2, "@player_id", req.player_id);

                        cmd2.CommandText = " insert into tbl_player_session "
                                           + " ( session_id , merchant_code, currency_code, player_id, update_time ) values "
                                           + " ( @session_id, @merchant_code, @currency_code, @player_id, NOW() ) ";

                        okay = cmd2.ExecuteNonQuery() > 0;
                    }
                }

                if (okay)
                {
                    trans.Commit();
                }
                else
                {
                    trans.Rollback();
                }
            }

            if (!okay)
            {
                ctx.Logger.Error("Three-Way Login Failed!");
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Three-Way Login Failed"
                }));

                return;
            }
            else
            {
                // try to close old player connection...

                string data = merchantCode + "|" + playerId;
                await RemoteCaller.BroadcastCall(ctx.RemoteServices, "fes-client", "kick-player", data);
            }

            var remoteServices = ctx.RemoteServices;

            var frontEndUrl = RemoteCaller.RandomPickPublicServiceUrl(remoteServices, "fes-table");
            //var betServerUrl = RemoteCaller.RandomPickPublicServiceUrl(remoteServices, "accept-bet");
            //var frontEndApiUrl = RemoteCaller.RandomPickPublicServiceUrl(remoteServices, "fes");
            //var chatServerUrl = RemoteCaller.RandomPickPublicServiceUrl(remoteServices, "chat");

            await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
            {
                req.merchant_code,
                req.currency_code,
                req.player_id,
                ret.player_balance,
                session_id = sessionId,
                merchant.cpc,
                merchant.bpl,
                front_end = frontEndUrl,
                //front_end_api = frontEndApiUrl,
                //bet_server = betServerUrl,
                //chat_server = chatServerUrl,
                error_code    = 0,
                error_message = "Three-Way Login Okay"
            }));
        }
예제 #27
0
        public async Task GetPlayerBets(RequestContext ctx)
        {
            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string startDtStr = req.start_dt;
            string endDtStr   = req.end_dt;

            if (String.IsNullOrEmpty(startDtStr) || String.IsNullOrEmpty(endDtStr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            DateTime dtStart = DateTime.MinValue;
            DateTime dtEnd   = DateTime.MinValue;

            if (!DateTime.TryParseExact(startDtStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out dtStart) ||
                !DateTime.TryParseExact(endDtStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out dtEnd))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            var dbReq = new
            {
                req.merchant_code,
                req.currency_code,
                req.player_id,
                start_dt = startDtStr,
                end_dt   = endDtStr
            };

            string dbReplyStr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                              "bet-data", "get-player-bets", ctx.JsonHelper.ToJsonString(dbReq));

            if (String.IsNullOrEmpty(dbReplyStr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to query DB"
                }));

                return;
            }

            await ctx.Session.Send(dbReplyStr);
        }
예제 #28
0
        public async Task DebitForBetting(RequestContext ctx)
        {
            ctx.Logger.Info("Debit for placing-bet...");

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Invalid request"
                }));

                return;
            }

            dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);

            string merchantCode = req.merchant_code.ToString();
            string currencyCode = req.currency_code.ToString();

            string merchantInfo = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                "merchant-data", "get-merchant-info", merchantCode + currencyCode);

            if (String.IsNullOrEmpty(merchantInfo) || !merchantInfo.Contains('{') || !merchantInfo.Contains(':'))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant info not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            dynamic merchant        = ctx.JsonHelper.ToJsonObject(merchantInfo);
            string  merchantUrl     = merchant.url.ToString();
            string  merchantService = merchant.service.ToString();

            if (String.IsNullOrEmpty(merchantUrl) || String.IsNullOrEmpty(merchantService))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Merchant API URL or Service not found: " + req.merchant_code.ToString()
                }));

                return;
            }

            string reqIp = req.client_id.ToString();

            if (reqIp.Contains(":"))
            {
                reqIp = reqIp.Split(':')[0];
            }

            ctx.Logger.Info("Create debit record in db...");

            var saveReq = new
            {
                bet_uuid      = req.bet_uuid,
                table_code    = req.table_code,
                shoe_code     = req.shoe_code,
                round_number  = req.round_number,
                bet_pool      = req.bet_pool,
                merchant_code = req.merchant_code,
                currency_code = req.currency_code,
                player_id     = req.player_id,
                client_id     = req.client_id,
                session_id    = req.session_id,
                bet_amount    = req.bet_amount
            };
            string dbReplyStr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                              "transaction-data", "create-debit", ctx.JsonHelper.ToJsonString(saveReq));

            if (dbReplyStr.Trim().Length <= 0 || !dbReplyStr.Contains("{"))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to create debit record in db: " + dbReplyStr
                }));

                return;
            }

            ctx.Logger.Info("Call merchant site to debit...");

            dynamic dbReply = ctx.JsonHelper.ToJsonObject(dbReplyStr);

            string apiUrl = merchantUrl;

            var apiReq = new
            {
                merchant_url = apiUrl,
                dbReply.debit_uuid,
                req.bet_uuid,
                req.merchant_code,
                req.currency_code,
                req.player_id,
                player_ip = reqIp,
                req.session_id,
                dbReply.round_id,
                req.bet_pool,
                debit_amount = req.bet_amount,
                req.bet_time,
                is_cancelled = false
            };

            string retJson = await CallMerchantApi(ctx, merchantService, "debit-for-betting", ctx.JsonHelper.ToJsonString(apiReq));

            dynamic ret = string.IsNullOrEmpty(retJson) ? null : ctx.JsonHelper.ToJsonObject(retJson);

            if (ret == null)
            {
                ctx.Logger.Info("Failed to call debit function from merchant site");

                var updateReq = new
                {
                    dbReply.debit_uuid,
                    req.bet_uuid,
                    req.merchant_code,
                    req.currency_code,
                    req.player_id,
                    request_times  = 1,
                    is_success     = 0,
                    network_error  = 1,
                    response_error = 0
                };
                string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                   "transaction-data", "update-debit", ctx.JsonHelper.ToJsonString(updateReq));

                dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);

                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    error_code    = -1,
                    error_message = "Failed to call debit function from merchant site"
                }));
            }
            else
            {
                ctx.Logger.Info("Update debit record in db...");

                if (ret.error_code == 0)
                {
                    var updateReq = new
                    {
                        dbReply.debit_uuid,
                        req.bet_uuid,
                        req.merchant_code,
                        req.currency_code,
                        req.player_id,
                        request_times  = 1,
                        is_success     = 1,
                        network_error  = 0,
                        response_error = 0
                    };
                    string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                       "transaction-data", "update-debit", ctx.JsonHelper.ToJsonString(updateReq));

                    if (String.IsNullOrEmpty(dbReplyStr2))
                    {
                        ctx.Logger.Info("Failed to update debit record in db");
                    }
                    else
                    {
                        dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);
                        ctx.Logger.Info("Update debit record in db - error code: " + dbReply2.error_code.ToString());
                    }
                }
                else
                {
                    var updateReq = new
                    {
                        dbReply.debit_uuid,
                        req.bet_uuid,
                        req.merchant_code,
                        req.currency_code,
                        req.player_id,
                        request_times  = 1,
                        is_success     = 0,
                        network_error  = 0,
                        response_error = ret.error_code
                    };
                    string dbReplyStr2 = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                                       "transaction-data", "update-debit", ctx.JsonHelper.ToJsonString(updateReq));

                    dynamic dbReply2 = ctx.JsonHelper.ToJsonObject(dbReplyStr2);
                }

                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(ret));
            }
        }
        public async Task GetGameResults(RequestContext ctx)
        {
            //System.Diagnostics.Debugger.Break();

            string reqstr = ctx.Data.ToString();

            if (reqstr.Trim().Length <= 0)
            {
                return;
            }

            //dynamic req = ctx.JsonHelper.ToJsonObject(reqstr);
            var req = ctx.JsonHelper.ToDictionary(reqstr);

            string sessionId = req.ContainsKey("sessionId") ? req["sessionId"].ToString() : "";

            IDictionary <string, object> queryParam = req.ContainsKey("queryParam") ? req["queryParam"] as IDictionary <string, object> : null;

            if (queryParam == null)
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = 1,
                    error_message = "Failed to get game results from DB",
                }));

                return;
            }

            string pageSize   = queryParam.ContainsKey("rows") ? queryParam["rows"].ToString() : "1";
            string pageNumber = queryParam.ContainsKey("page") ? queryParam["page"].ToString() : "1";

            string merchantCode = queryParam.ContainsKey("merchantCode") ? queryParam["merchantCode"].ToString() : "";
            string userId       = queryParam.ContainsKey("userId") ? queryParam["userId"].ToString() : "";
            string fromDateTime = queryParam.ContainsKey("fromDateTime") ? queryParam["fromDateTime"].ToString() : "";
            string toDateTime   = queryParam.ContainsKey("toDateTime") ? queryParam["toDateTime"].ToString() : "";

            //ctx.Logger.Info("SessionID is: " + sessionId);
            //ctx.Logger.Info("Page Size is: " + pageSize);
            //ctx.Logger.Info("Page is: " + pageNumber);
            //ctx.Logger.Info("merchantCode is: " + merchantCode);
            //ctx.Logger.Info("fromDateTime is: " + fromDateTime);

            var dbReq = new
            {
                pageSize,
                pageNumber,
                fromGameTime = fromDateTime,
                toGameTime   = toDateTime
            };
            string replystr = await RemoteCaller.RandomCall(ctx.RemoteServices,
                                                            "bo-data", "get-game-results", ctx.JsonHelper.ToJsonString(dbReq));

            if (String.IsNullOrEmpty(replystr))
            {
                await ctx.Session.Send(ctx.JsonHelper.ToJsonString(new
                {
                    total         = 0,
                    rows          = new List <dynamic>(),
                    error_code    = 1,
                    error_message = "Failed to get game results from DB",
                }));
            }
            else
            {
                await ctx.Session.Send(replystr);
            }
        }