예제 #1
0
    // 超级管理员操作
    private OpRes doScoreSuperAdmin(ParamScore p, long score, GMUser user)
    {
        OpRes res = OpRes.op_res_failed;

        if (p.isAddScore()) // 加分
        {
            if (p.isToPlayer())
            {
                res = addScorePlayer(p, score, user);
            }
            else
            {
                res = addScore(p.m_toAcc, score, user);
            }
        }
        else
        {
            if (p.isToPlayer())
            {
                res = decScorePlayer(p, score, user);
            }
            else
            {
                res = decScore(p.m_toAcc, score, user);
            }
        }
        if (res == OpRes.opres_success)
        {
            addScoreToOnlineGM(p, score);
            scoreLog(TableName.GM_SCORE, p, score, user);
        }
        return(res);
    }
예제 #2
0
    private void scoreLog(string tableName, ParamScore p, long score, GMUser user)
    {
        long remainMoney = ItemHelp.getRemainMoney(p.m_toAcc, p.isToPlayer(), user);

        // 操作账号余额
        long opSrcRemainMoney = ItemHelp.getRemainMoney(user.m_user, false, user);

        /*string cmd = string.Format(SqlStrCMD.SQL_CMD_PLAYER_SCORE,
         *                         tableName,
         *                         DateTime.Now.ToString(ConstDef.DATE_TIME24),
         *                         user.m_user,
         *                         p.m_toAcc,
         *                         p.m_op,
         *                         score,
         *                         user.m_moneyType,
         *                         user.m_depth,
         *                         user.m_createCode,
         *                         p.isToPlayer() ? AccType.ACC_PLAYER : 0,
         *                         remainMoney);
         *
         * user.sqlDb.executeOp(cmd, user.getMySqlServerID(), MySqlDbName.DB_XIANXIA);
         */
        // 生成上下分记录
        OrderInfo oinfo =
            OrderGenerator.genOfflineSuccessOrder(user.m_user, p.m_toAcc, score,
                                                  p.m_op,
                                                  p.isToPlayer() ? AccType.ACC_PLAYER : 0,
                                                  remainMoney, p.m_orderFrom);
        // 生成上下分记录
        string cmd = OrderGenerator.genSqlForLogScore(oinfo, user.m_createCode, opSrcRemainMoney);

        user.sqlDb.executeOp(cmd, user.getMySqlServerID(), MySqlDbName.DB_XIANXIA);
    }
예제 #3
0
    // 上分,下分
    public static void doScore(HttpRequest Request, HttpResponse Response, int op)
    {
        ParamScore param = new ParamScore();

        param.m_gmAccount   = Request.QueryString["gmAcc"];
        param.m_gmPwd       = Request.QueryString["gmPwd"];
        param.m_playerAcc   = Request.QueryString["playerAcc"];
        param.m_score       = Request.QueryString["score"];
        param.m_op          = op;
        param.m_userOrderId = Request.QueryString["userOrderId"];
        param.m_apiCallBack = Request.QueryString["apiCallBack"];
        param.m_sign        = Request.QueryString["sign"];

        if (!param.isParamValid())
        {
            Dictionary <string, object> data = new Dictionary <string, object>();
            data.Add("result", RetCode.RET_PARAM_NOT_VALID);
            Response.Write(Helper.genJsonStr(data));
            return;
        }

        DyOpScore dy     = new DyOpScore();
        string    retStr = dy.doDyop(param);

        Response.Write(retStr);
    }
예제 #4
0
    private bool doScorePlayer(ParamScore p, long score)
    {
        bool res = false;

        if (p.m_op == 0) // 加分
        {
            if (m_gmUser.m_money < score)
            {
                m_retData.Add("result", RetCode.RET_MONEY_NOT_ENOUGH);
                return(false);
            }

            res = addScorePlayer(p.m_playerAcc, score);
            if (res)
            {
                decScore(score);
            }
            else
            {
                m_retData.Add("result", RetCode.RET_DB_ERROR);
                return(false);
            }
        }
        else
        {
            res = decScorePlayer(p.m_playerAcc, score);
            if (res)
            {
                addScore(score);
            }
            else
            {
                m_retData.Add("result", RetCode.RET_DB_ERROR);
                return(false);
            }
        }

        /*if (res)
         * {
         *  long remainMoney = Helper.getRemainMoney(p.m_playerAcc, m_gmUser);
         *  SqlInsertGenerator gen = new SqlInsertGenerator();
         *  gen.addField("opTime", DateTime.Now.ToString(ConstDef.DATE_TIME24), FieldType.TypeString);
         *  gen.addField("opSrc", m_gmUser.m_acc, FieldType.TypeString);
         *  gen.addField("opDst", p.m_playerAcc, FieldType.TypeString);
         *  gen.addField("opType", p.m_op, FieldType.TypeNumber);
         *  gen.addField("opScore", score, FieldType.TypeNumber);
         *  gen.addField("moneyType", m_gmUser.m_moneyType, FieldType.TypeNumber);
         *  gen.addField("opSrcDepth", m_gmUser.m_depth, FieldType.TypeNumber);
         *  gen.addField("opSrcCreateCode", m_gmUser.m_createCode, FieldType.TypeString);
         *  gen.addField("opDstType", AccType.ACC_PLAYER, FieldType.TypeNumber);
         *  gen.addField("opDstRemainMoney", remainMoney, FieldType.TypeNumber);
         *  gen.addField("userOrderId", p.m_userOrderId, FieldType.TypeString);
         *
         *  string cmd = gen.getResultSql(TableName.GM_SCORE);
         *  m_gmUser.sqlDb.executeOp(cmd, MySqlDbName.DB_XIANXIA);
         * }*/
        return(res);
    }
예제 #5
0
    private OrderInfo writeOfflineOrderToMySql(ParamScore p, long score)
    {
        long remainMoney = Helper.getRemainMoney(p.m_playerAcc, m_gmUser);

        OrderInfo oinfo =
            OrderGenerator.genOfflineSuccessOrder(p.m_gmAccount, p.m_playerAcc, score,
                                                  p.m_op, AccType.ACC_PLAYER, remainMoney, OrderGenerator.ORDER_FROM_API, p.m_userOrderId);
        // 生成上下分记录
        string cmd = OrderGenerator.genSqlForLogScore(oinfo, m_gmUser.m_createCode, m_gmUser.m_money);

        m_gmUser.sqlDb.executeOp(cmd, MySqlDbName.DB_XIANXIA);
        return(oinfo);
    }
예제 #6
0
        void scoreToPlayer(int op)
        {
            ParamScore param = new ParamScore();

            param.m_op    = op;
            param.m_toAcc = m_acc.Text;
            param.m_score = m_score.Text;
            param.scoreToPlayer();
            GMUser user = (GMUser)Session["user"];
            OpRes  res  = user.doDyop(param, DyOpType.opTypeDyOpScore);

            m_scoreRes.InnerText = OpResMgr.getInstance().getResultString(res);
        }
예제 #7
0
        public void ProcessRequest(HttpContext context)
        {
            RightMgr.getInstance().opCheck(RIGHT.SCORE, context.Session, context.Response);

            GMUser     user  = (GMUser)context.Session["user"];
            ParamScore param = new ParamScore();

            param.m_op    = Convert.ToInt32(context.Request.Form["op"]);
            param.m_toAcc = context.Request.Form["acc"];
            param.m_score = context.Request.Form["param"];
            int targetType = Convert.ToInt32(context.Request.Form["targetType"]);

            if (targetType == AccType.ACC_PLAYER)
            {
                param.scoreToPlayer();
            }
            else
            {
                param.scoreToMgr();
            }

            OpRes  res = user.doDyop(param, DyOpType.opTypeDyOpScore);
            string str = OpResMgr.getInstance().getResultString(res);

            long remainScoreFixBug = -1;

            if (targetType == AccType.ACC_SUPER_ADMIN || targetType == AccType.ACC_SUPER_ADMIN_SUB)
            {
                remainScoreFixBug = 0;
            }
            else
            {
                remainScoreFixBug = ItemHelp.getRemainMoney(param.m_toAcc, targetType == AccType.ACC_PLAYER, user);
            }

            Dictionary <string, object> ret = new Dictionary <string, object>();

            ret.Add("result", (int)res);
            ret.Add("resultInfo", str);

            string rs = (user.m_accType == AccType.ACC_SUPER_ADMIN ||
                         user.m_accType == AccType.ACC_SUPER_ADMIN_SUB) ? "0" : ItemHelp.toStrByComma(ItemHelp.showMoneyValue(user.m_money));

            ret.Add("remainScoreStr", rs);
            ret.Add("remainScore", ItemHelp.showMoneyValue(user.m_money));
            ret.Add("remainScoreFixBug", ItemHelp.showMoneyValue(remainScoreFixBug));
            str = BaseJsonSerializer.genJsonStr(ret);
            context.Response.ContentType = "text/plain";
            context.Response.Write(str);
        }
예제 #8
0
    private void addScoreToOnlineGM(ParamScore p, long score)
    {
        GMUser dstUser = AccountSys.getInstance().getUser(p.m_toAcc);

        if (dstUser != null)
        {
            if (p.isAddScore())
            {
                dstUser.m_money += score;
            }
            else
            {
                dstUser.m_money -= score;
            }
        }
    }
예제 #9
0
    // 提交玩家在线时订单
    private bool submitPlayerOnlineOrder(ParamScore p, long score, GMUser user)
    {
        OrderGenerator or = new OrderGenerator();
        Dictionary <string, object> orData = or.genOrder(user.m_user, p.m_toAcc, score, p.m_op,
                                                         AccType.ACC_PLAYER,
                                                         p.m_orderFrom, p.m_orderId);

        if (string.IsNullOrEmpty(p.m_orderId))
        {
            p.m_orderId = Convert.ToString(orData["orderId"]);
        }

        bool code = DBMgr.getInstance().insertData(TableName.PLAYER_ORDER_REQ, orData, user.getDbServerID(),
                                                   DbName.DB_PLAYER);

        return(code);
    }
예제 #10
0
    // 订单id是否处理过
    private bool orderIdExists(ParamScore p)
    {
        List <IMongoQuery> queryList = new List <IMongoQuery>();

        queryList.Add(Query.EQ("gmAcc", BsonValue.Create(p.m_gmAccount)));
        queryList.Add(Query.EQ("apiOrderId", BsonValue.Create(p.m_userOrderId)));
        IMongoQuery imq = Query.And(queryList);
        bool        res = MongodbPlayer.Instance.KeyExistsByQuery(TableName.PLAYER_ORDER_REQ, imq);

        if (res)
        {
            return(true);
        }

        string cond = string.Format(" userOrderId='{0}' and opSrc='{1}' ", p.m_userOrderId, p.m_gmAccount);

        res = m_gmUser.sqlDb.keyExists(TableName.GM_SCORE, cond, MySqlDbName.DB_XIANXIA);
        return(res);
    }
예제 #11
0
    OpRes execOrder(ResultPlayerOrderItem item, GMUser user)
    {
        if (item.m_orderState != OrderState.STATE_WAIT)
        {
            return(OpRes.opres_success);
        }

        ParamScore param = new ParamScore();

        param.m_op        = item.m_orderType;
        param.m_toAcc     = item.m_playerAcc;
        param.m_score     = item.m_orderMoney.ToString();
        param.m_orderFrom = OrderGenerator.ORDER_FROM_PLAYER_ORDER;
        param.m_orderId   = item.m_orderId;
        param.scoreToPlayer();

        OpRes res = user.doDyop(param, DyOpType.opTypeDyOpScore);

        if (res == OpRes.opres_success /*||
                                        * res == OpRes.op_res_player_in_game*/)
        {
            OpRes code = removeWait(item, user);
            if (code == OpRes.opres_success)
            {
                if (res == OpRes.opres_success)
                {
                    addFinish(item, user, OrderState.STATE_FINISH);
                }
                else
                {
                    addFinish(item, user, OrderState.STATE_HAS_SUB);
                }
            }
        }
        else if (res == OpRes.op_res_player_in_game)
        {
            string cmd   = CPlayerOrder.genUpdateSql(item.m_orderId, OrderState.STATE_HAS_SUB);
            int    count = user.sqlDb.executeOp(cmd, user.getMySqlServerID(), MySqlDbName.DB_XIANXIA);
            // 返回成功,界面可以重刷订单
            res = OpRes.opres_success;
        }
        return(res);
    }
예제 #12
0
    private OpRes doScore(ParamScore p, long score, GMUser user)
    {
        OpRes res = OpRes.op_res_failed;

        if (p.isAddScore()) // 加分
        {
            if (user.m_money < score)
            {
                return(OpRes.op_res_money_not_enough);
            }

            res = addScore(p.m_toAcc, score, user);
            if (res == OpRes.opres_success)
            {
                addScoreToOnlineGM(p, score);
                user.m_money -= score;
                decScoreDirect(user.m_user, score, user);
            }
        }
        else
        {
            res = decScore(p.m_toAcc, score, user);
            if (res == OpRes.opres_success)
            {
                addScoreToOnlineGM(p, score);
                user.m_money += score;
                addScoreDirect(user.m_user, score, user);
            }
        }

        if (res == OpRes.opres_success)
        {
            scoreLog(TableName.GM_SCORE, p, score, user);
        }

        return(res);
    }
예제 #13
0
    // score传正数
    private OpRes decScorePlayer(ParamScore p, long score, GMUser user)
    {
        OpRes res = canDoScoreToPlayer(p.m_toAcc, score, false, user);

        if (res == OpRes.op_res_player_in_game) // 玩家在游戏内,提交订单请求
        {
            // bool code = submitPlayerOnlineOrder(p, score, user);
            // return code ? OpRes.op_res_player_in_game : OpRes.op_res_db_failed;
            return(OpRes.op_res_player_in_game_cannot_subscore);
        }
        else if (res == OpRes.opres_success)
        {
            string cmd = string.Format(SqlStrCMD.SQL_DEC_SCORE_TO_PLAYER_BYPASS,
                                       TableName.PLAYER_ACCOUNT_XIANXIA,
                                       score,
                                       p.m_toAcc,
                                       PlayerState.STATE_IDLE,
                                       score);
            int count = user.sqlDb.executeOp(cmd, user.getMySqlServerID(), MySqlDbName.DB_XIANXIA);
            return(count > 0 ? OpRes.opres_success : OpRes.op_res_db_failed);
        }

        return(res);
    }
예제 #14
0
    private OpRes doScorePlayer(ParamScore p, long score, GMUser user)
    {
        OpRes res = OpRes.op_res_failed;

        if (p.isAddScore()) // 加分
        {
            if (user.m_money < score)
            {
                return(OpRes.op_res_money_not_enough);
            }

            res = addScorePlayer(p, score, user);
            if (res == OpRes.opres_success ||
                res == OpRes.op_res_player_in_game) // 玩家在线时,先扣gm的钱,若实时给玩家加分失败,订单服务器会返还这部分钱
            {
                user.m_money -= score;
                decScoreDirect(user.m_user, score, user);
            }
        }
        else
        {
            res = decScorePlayer(p, score, user);
            if (res == OpRes.opres_success) // 玩家在线时,先实时给扣玩家分数,成功后,订单服务器会返还这部分钱
            {
                user.m_money += score;
                addScoreDirect(user.m_user, score, user);
            }
        }

        if (res == OpRes.opres_success)
        {
            scoreLog(TableName.GM_SCORE, p, score, user);
        }

        return(res);
    }
예제 #15
0
    public override string doDyop(object param)
    {
        ParamScore p        = (ParamScore)param;
        long       oriScore = 0;

        if (!long.TryParse(p.m_score, out oriScore))
        {
            m_retData.Add("result", RetCode.RET_PARAM_NOT_VALID);
            return(Helper.genJsonStr(m_retData));
        }

        if (oriScore <= 0)
        {
            m_retData.Add("result", RetCode.RET_PARAM_NOT_VALID);
            return(Helper.genJsonStr(m_retData));
        }

        bool cres = createGMUser(p);

        if (!cres)
        {
            return(Helper.genJsonStr(m_retData));
        }

        if (!p.checkSign(m_gmUser))
        {
            m_retData.Add("result", RetCode.RET_SIGN_ERROR);
            return(Helper.genJsonStr(m_retData));
        }

        if (orderIdExists(p))
        {
            m_retData.Add("result", RetCode.RET_ORDER_EXISTS);
            return(Helper.genJsonStr(m_retData));
        }

        long score = Helper.saveMoneyValue(oriScore);

        int code = canDoScoreToPlayer(p.m_playerAcc, score, ScropOpType.isAddScore(p.m_op));

        // 在线,并且是下分,直接返回失败
        if (code == RetCode.RET_PLAYER_ONLINE && !ScropOpType.isAddScore(p.m_op))
        {
            m_retData.Add("result", RetCode.RET_PLAYER_ONLINE);
        }
        else if (code == RetCode.RET_PLAYER_ONLINE && ScropOpType.isAddScore(p.m_op)) // 玩家在线时提交上下分订单
        {
            //if (ScropOpType.isAddScore(p.m_op)) // 上分操作,先扣GM的钱,若订单最终处理失败,会返还GM这部分钱
            {
                decScore(score);
            }

            OrderGenerator or = new OrderGenerator();
            Dictionary <string, object> orData = or.genOrder(p.m_gmAccount, p.m_playerAcc, score, p.m_op,
                                                             AccType.ACC_PLAYER,
                                                             OrderGenerator.ORDER_FROM_API,
                                                             "",
                                                             p.m_userOrderId, p.m_apiCallBack);

            bool res = MongodbPlayer.Instance.ExecuteInsert(TableName.PLAYER_ORDER_REQ, orData);
            if (res)
            {
                m_retData.Add("orderId", Convert.ToString(orData["orderId"]));
                m_retData.Add("result", RetCode.RET_HAS_SUBMIT_ORDER);
            }
            else
            {
                m_retData.Add("result", RetCode.RET_DB_ERROR);
            }
        }
        else if (code == RetCode.RET_SUCCESS) // 玩家离线,可直接修改数据库上下分
        {
            bool res = doScorePlayer(p, score);
            if (res)
            {
                m_retData.Add("result", RetCode.RET_SUCCESS);
                m_retData.Add("playerAcc", p.m_playerAcc);
                m_retData.Add("score", oriScore);

                /*string cmd = string.Format(CONST.SQL_ORDER_ID, TableName.GM_SCORE, m_gmUser.m_acc, p.m_playerAcc, p.m_op);
                 *
                 * Dictionary<string, object> order = m_gmUser.sqlDb.queryOne(cmd, MySqlDbName.DB_XIANXIA);
                 * if (order != null)
                 * {
                 *  int orderId = Convert.ToInt32(order["opId"]);
                 *  m_retData.Add("orderId", orderId);
                 * }*/

                OrderInfo oinfo = writeOfflineOrderToMySql(p, score);
                m_retData.Add("orderId", oinfo.m_orderId);
                m_retData.Add("userOrderId", p.m_userOrderId);
            }
        }
        else
        {
            m_retData.Add("result", code);
        }
        return(Helper.genJsonStr(m_retData));
    }
예제 #16
0
    public override OpRes doDyop(object param, GMUser user)
    {
        ParamScore p     = (ParamScore)param;
        long       score = 0;

        if (!long.TryParse(p.m_score, out score))
        {
            return(OpRes.op_res_param_not_valid);
        }

        if (score < 0)
        {
            return(OpRes.op_res_param_not_valid);
        }

        if (!RightMap.hasRight(user.m_accType, RIGHT.SCORE, user.m_right))
        {
            return(OpRes.op_res_no_right);
        }

        score = ItemHelp.saveMoneyValue(score);

        OpRes res = OpRes.op_res_failed;

        try
        {
            HttpContext.Current.Application.Lock();
            if (user.m_accType == AccType.ACC_SUPER_ADMIN ||
                user.m_accType == AccType.ACC_SUPER_ADMIN_SUB)
            {
                res = doScoreSuperAdmin(p, score, user);
            }
            else
            {
                if (p.isToPlayer()) // 给玩家上分下分
                {
                    res = doScorePlayer(p, score, user);
                }
                else // 给管理,上分下分
                {
                    res = doScore(p, score, user);
                }
            }
        }
        catch (System.Exception ex)
        {
            CLOG.Info("DyOpScore.doDyop, 出现异常:{0}", ex.ToString());
            res = OpRes.op_res_happend_exception;
        }
        finally
        {
            HttpContext.Current.Application.UnLock();
        }

        // 后续处理 对于来自订单的操作,由于订单Id不会变化,采取轮循会有问题
        if (res == OpRes.op_res_player_in_game &&
            p.m_orderFrom == OrderGenerator.ORDER_FROM_BG_OP)
        {
            QueryOrderState qos   = new QueryOrderState();
            int             state = qos.queryOrderState(p.m_orderId,
                                                        user.sqlDb.getServer(user.getMySqlServerID()).queryOne, 10, 1000);
            if (state != PlayerReqOrderState.STATE_PROCESSING)
            {
                res = (state == PlayerReqOrderState.STATE_FINISH) ? OpRes.opres_success : OpRes.op_res_failed;
            }
        }

        return(res);
    }