/// <summary>
        /// 获取某个礼品码的平台信息
        /// </summary>
        /// <param name="dbMgr"></param>
        /// <param name="fileName"></param>
        public static int GetLiPinMaPingTaiID2(DBManager dbMgr, int songLiID, string liPinMa, int roleZoneID)
        {
            liPinMa = liPinMa.ToUpper(); //转成大写

            int ptid = -1, ptrepeat = 0, zoneID = 0;

            if (!LiPinMaParse.ParseLiPinMa(liPinMa, out ptid, out ptrepeat, out zoneID))
            {
                return(-1020);
            }

            if (zoneID > 0 && roleZoneID != zoneID)
            {
                return(-1021);
            }

            return(ptid);
        }
Beispiel #2
0
        public static bool ParseLiPinMa2(string lipinma, out int ptid, out int ptrepeat, out int zoneID, out int nMaxUseNum)
        {
            bool result;

            if (GameDBManager.GameConfigMgr.GetGameConfigItemInt("lipinma_v1", 0) == 1)
            {
                result = LiPinMaParse.ParseLiPinMa(lipinma, out ptid, out ptrepeat, out zoneID, out nMaxUseNum);
            }
            else
            {
                ptid       = -1;
                ptrepeat   = 0;
                zoneID     = 0;
                nMaxUseNum = 1;
                int nAddLength = 0;
                if (lipinma.Length > 23)
                {
                    nAddLength = 2;
                }
                if (lipinma.Length < 22 + nAddLength || lipinma.Length > 23 + nAddLength)
                {
                    result = false;
                }
                else
                {
                    lipinma = lipinma.ToUpper();
                    if ("NZ" != lipinma.Substring(0, 2))
                    {
                        result = false;
                    }
                    else
                    {
                        ptid     = Convert.ToInt32(lipinma.Substring(2, 3));
                        ptrepeat = Convert.ToInt32(lipinma.Substring(5, 1));
                        zoneID   = Convert.ToInt32(lipinma.Substring(6, 3));
                        if (nAddLength > 0)
                        {
                            nMaxUseNum = Convert.ToInt32(lipinma.Substring(9, 2));
                        }
                        string crc32Str = lipinma.Substring(9 + nAddLength);
                        MD5    md5      = MD5.Create();
                        byte[] data0    = new byte[25];
                        for (int i = 0; i < 5; i++)
                        {
                            data0[i] = Convert.ToByte(crc32Str.Substring(2 * i + 4, 2), 16);
                        }
                        data0[5] = 31;
                        data0[6] = 22;
                        data0[7] = 5;
                        data0[8] = 150;
                        Array.Copy(BitConverter.GetBytes(ptid), 0, data0, 9, 4);
                        Array.Copy(BitConverter.GetBytes(ptrepeat), 0, data0, 13, 4);
                        Array.Copy(BitConverter.GetBytes(zoneID), 0, data0, 17, 4);
                        Array.Copy(BitConverter.GetBytes(nMaxUseNum), 0, data0, 21, 4);
                        byte[] data = md5.ComputeHash(data0);
                        for (int i = 0; i < 2; i++)
                        {
                            if (Convert.ToByte(crc32Str.Substring(2 * i, 2), 16) != data[i])
                            {
                                return(false);
                            }
                        }
                        result = true;
                    }
                }
            }
            return(result);
        }
        /// <summary>
        /// 使用某个礼品码(自己生成的特定格式的礼品码)
        /// </summary>
        /// <param name="dbMgr"></param>
        /// <param name="fileName"></param>
        public static int UseLiPinMa2(DBManager dbMgr, int roleID, int songLiID, string liPinMa, int roleZoneID)
        {
            if (null == _LiPinMaDict)
            {
                return(-1010);
            }
            Dictionary <string, LiPinMaItem> liPinMaDict = _LiPinMaDict; //先得到

            int usedNum = 0;

            liPinMa = liPinMa.ToUpper(); //转成大写

            int ptid = -1, ptrepeat = 0, zoneID = 0;

            if (!LiPinMaParse.ParseLiPinMa(liPinMa, out ptid, out ptrepeat, out zoneID))
            {
                return(-1020);
            }

            if (zoneID > 0 && roleZoneID != zoneID)
            {
                return(-1021);
            }

            //防止多用户重入
            lock (Mutex)
            {
                LiPinMaItem liPinMaItem = null;
                if (!liPinMaDict.TryGetValue(liPinMa, out liPinMaItem))
                {
                    liPinMaItem = new LiPinMaItem()
                    {
                        LiPinMa       = liPinMa,
                        HuodongID     = 1,
                        MaxNum        = 1,
                        UsedNum       = 0,
                        PingTaiID     = ptid,
                        PingTaiRepeat = ptrepeat,
                    };

                    liPinMaDict[liPinMa] = liPinMaItem;
                }

                if (liPinMaItem.HuodongID != songLiID)
                {
                    return(-1030);
                }

                if (liPinMaItem.MaxNum > 0 && liPinMaItem.UsedNum >= liPinMaItem.MaxNum)
                {
                    return(-1040);
                }

                //如果不允许平台内的礼品码重复领取
                if (liPinMaItem.PingTaiRepeat <= 0)
                {
                    //通过活动ID查询平台ID
                    int pingTaiID = DBQuery.QueryPingTaiIDByHuoDongID(dbMgr, liPinMaItem.HuodongID, roleID, liPinMaItem.PingTaiID);
                    if (pingTaiID == liPinMaItem.PingTaiID)
                    {
                        return(-10000);
                    }
                }

                //添加使用礼品码的平台记录
                DBWriter.AddUsedLiPinMa(dbMgr, liPinMaItem.HuodongID, liPinMaItem.LiPinMa, liPinMaItem.PingTaiID, roleID);

                liPinMaItem.UsedNum++;
                usedNum = liPinMaItem.UsedNum;
            }

            //插入一个新的礼品码的数据
            DBWriter.InsertNewLiPinMa(dbMgr, liPinMa, songLiID.ToString(), "1", ptid.ToString(), ptrepeat.ToString(), "1");

            return(0);
        }