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)); }
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); } }
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); } }
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)); }
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)); }
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" })); }
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 + ")"); } }
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(""); }
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)); } }
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" })); }
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" })); } }
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); } }
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); }
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" })); }
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 } }; } } }
/// <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" })); }
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); }
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); } }