123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- package models
- // roll房
- import (
- "box-gm/utils"
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "sync"
- "time"
- "github.com/astaxie/beego"
- "github.com/astaxie/beego/validation"
- "github.com/garyburd/redigo/redis"
- )
- type RollConditionInfo struct {
- Conditions string `json:"c"` // 条件
- CValue int `json:"cv"` // 条件值
- }
- type RollInfo struct {
- Id int // 活动ID
- Name string `orm:"size(64)" valid:"Required"` // 房间名
- BandShareCode string `orm:"size(10)" valid:"Required"` // 限制绑定推广码
- CreateTime int64 `valid:"Required"` // 创建时间
- ShowStartTime int64 `valid:"Required"` // 开始展示时间
- SignupStartTime int64 `valid:"Required"` // 报名开始时间
- SignupEndTime int64 `valid:"Required"` // 报名结束时间
- AwardTime int64 `valid:"Required"` // 开奖时间
- Conditions []*RollConditionInfo // 参与条件列表
- ItemIdList []int // 奖励物品ID列表
- SignupUidList []int // 报名玩家ID列表列表
- }
- type RollInfoArray []*RollInfo
- type RollCondition struct {
- KeyCondition string
- Name string
- }
- type RES_ROLL struct {
- Code int `json:"code"` // 错误码
- }
- type RollConditionArray []*RollCondition
- var conditionList RollConditionArray
- var rollList RollInfoArray
- var riMutex sync.Mutex
- var ROLL_MAIN_KEY = "roll:room"
- func get_roll_key(id int) string {
- return fmt.Sprintf("%s:%d", ROLL_MAIN_KEY, id)
- }
- func CreateRollId() int {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- fmt.Println("get redis pool fail")
- return 0
- }
- rd := pool.Get()
- if rd == nil {
- fmt.Println("get redis conn fail")
- return 0
- }
- defer rd.Close()
- reply, err := rd.Do("hincrby", "global", "max:roll:room:id", 1)
- if err != nil {
- fmt.Printf("redis hincrby err: %v", err)
- return 0
- }
- id, err := redis.Int(reply, err)
- if err != nil {
- fmt.Printf("redis hincrby err: %v", err)
- return 0
- }
- return id
- }
- // 初始化roll房信息
- func InitRollInfo() {
- // 活跃ID列表
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- fmt.Println("get redis pool fail")
- return
- }
- rd := pool.Get()
- defer rd.Close()
- rollList = RollInfoArray{}
- result, _ := redis.Values(rd.Do("smembers", ROLL_MAIN_KEY))
- for _, v := range result {
- id := utils.StringToInt(string(v.([]byte)))
- pKey := get_roll_key(id)
- log.Printf("InitRollInfo v[%v] id[%d] pKey[%s]", v, id, pKey)
- name, _ := redis.String(rd.Do("hget", pKey, "name"))
- bandShareCode, _ := redis.String(rd.Do("hget", pKey, "bandShareCode"))
- creatTime, _ := redis.Int64(rd.Do("hget", pKey, "creatTime"))
- showStartTime, _ := redis.Int64(rd.Do("hget", pKey, "showStartTime"))
- signupStartTime, _ := redis.Int64(rd.Do("hget", pKey, "signupStartTime"))
- signupEndTime, _ := redis.Int64(rd.Do("hget", pKey, "signupEndTime"))
- awardTime, _ := redis.Int64(rd.Do("hget", pKey, "awardTime"))
- conditions, _ := redis.String(rd.Do("hget", pKey, "conditions"))
- var _conditions []*RollConditionInfo
- json.Unmarshal([]byte(conditions), &_conditions)
- itemIdList, _ := redis.String(rd.Do("hget", pKey, "itemIdList"))
- var _itemIdList []int
- json.Unmarshal([]byte(itemIdList), &_itemIdList)
- signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
- var _signupUidList []int
- json.Unmarshal([]byte(signupUidList), &_signupUidList)
- rollList = append(rollList, &RollInfo{
- Id: id,
- Name: name,
- BandShareCode: bandShareCode,
- CreateTime: creatTime,
- ShowStartTime: showStartTime,
- SignupStartTime: signupStartTime,
- SignupEndTime: signupEndTime,
- AwardTime: awardTime,
- Conditions: _conditions,
- ItemIdList: _itemIdList,
- SignupUidList: _signupUidList,
- })
- }
- conditionList = append(conditionList, &RollCondition{
- KeyCondition: "pay_day_totalAmount",
- Name: "今日充值(单位:分)",
- })
- beego.Info("load roll info", len(rollList))
- }
- func checkRollInfo(hf *RollInfo) (err error) {
- valid := validation.Validation{}
- b, _ := valid.Valid(&hf)
- if !b {
- for _, err := range valid.Errors {
- log.Println(err.Key, err.Message)
- return errors.New(err.Message)
- }
- }
- return nil
- }
- // 新增roll房信息
- func AddRollInfo(hf *RollInfo) error {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- return fmt.Errorf("get redis pool fail")
- }
- rd := pool.Get()
- defer rd.Close()
- if err := checkRollInfo(hf); err != nil {
- return err
- }
- if hf.Id == 0 {
- hf.Id = CreateRollId()
- }
- if hf.Id == 0 {
- return fmt.Errorf("分配roll房ID失败")
- }
- // 插入数据库
- db, err := utils.GetMysqlHandler()
- if err != nil {
- log.Println("GetMysqlHandler, Error: ", err)
- return err
- }
- hf.CreateTime = time.Now().Unix()
- bConditions, _ := json.Marshal(hf.Conditions)
- bItemIdList, _ := json.Marshal(hf.ItemIdList)
- columns := "id,name,bandShareCode,createTime,showStartTime,signupStartTime,signupEndTime,awardTime,conditions,itemIdList"
- values := fmt.Sprintf("%d, '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s'", hf.Id, hf.Name, hf.BandShareCode, hf.CreateTime, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
- sql := fmt.Sprintf("insert into mdl_roll (%s) value (%s);", columns, values)
- log.Println("AddRollInfo sql:", sql)
- _, err = db.Exec(sql)
- if err != nil {
- log.Println("AddRollInfo Insert data Exec Failed, Error: ", err)
- return err
- }
- pKey := get_roll_key(hf.Id)
- rd.Do("hset", pKey, "name", hf.Name)
- rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
- rd.Do("hset", pKey, "createTime", hf.CreateTime)
- rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
- rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
- rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
- rd.Do("hset", pKey, "awardTime", hf.AwardTime)
- rd.Do("hset", pKey, "conditions", bConditions)
- rd.Do("hset", pKey, "itemIdList", bItemIdList)
- rd.Do("sadd", ROLL_MAIN_KEY, hf.Id)
- riMutex.Lock()
- rollList = append(rollList, hf)
- riMutex.Unlock()
- SendGameAddRoll(hf.Id)
- return nil
- }
- // 修改roll房信息
- func UpdateRollInfo(hf *RollInfo) error {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- return fmt.Errorf("get redis pool fail")
- }
- rd := pool.Get()
- defer rd.Close()
- if err := checkRollInfo(hf); err != nil {
- return err
- }
- // 更新数据库
- db, err := utils.GetMysqlHandler()
- if err != nil {
- log.Println("GetMysqlHandler, Error: ", err)
- return err
- }
- bConditions, _ := json.Marshal(hf.Conditions)
- bItemIdList, _ := json.Marshal(hf.ItemIdList)
- sets := fmt.Sprintf("name='%s',bandShareCode='%s',showStartTime=%d,signupStartTime=%d,signupEndTime=%d,awardTime=%d,conditions='%s',itemIdList='%s'",
- hf.Name, hf.BandShareCode, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
- sql := fmt.Sprintf("UPDATE mdl_roll SET %s WHERE id=%d;", sets, hf.Id)
- // log.Println("order_insert_db sql:", sql)
- _, err = db.Exec(sql)
- if err != nil {
- log.Println("UpdateRollInfo update data Exec Failed, Error: ", err)
- return err
- }
- pKey := get_roll_key(hf.Id)
- rd.Do("hset", pKey, "name", hf.Name)
- rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
- rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
- rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
- rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
- rd.Do("hset", pKey, "awardTime", hf.AwardTime)
- rd.Do("hset", pKey, "conditions", bConditions)
- rd.Do("hset", pKey, "itemIdList", bItemIdList)
- riMutex.Lock()
- for i := 0; i < len(rollList); i++ {
- if hf.Id == rollList[i].Id {
- old := rollList[i]
- old.Name = hf.Name
- old.BandShareCode = hf.BandShareCode
- old.ShowStartTime = hf.ShowStartTime
- old.SignupStartTime = hf.SignupStartTime
- old.SignupEndTime = hf.SignupEndTime
- old.AwardTime = hf.AwardTime
- old.Conditions = hf.Conditions
- old.ItemIdList = hf.ItemIdList
- break
- }
- }
- riMutex.Unlock()
- SendGameUpdateRoll(hf.Id)
- return nil
- }
- // 更新参与玩家列表
- func UpdateSignupUidList(id int) error {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- return fmt.Errorf("get redis pool fail")
- }
- rd := pool.Get()
- defer rd.Close()
- pKey := get_roll_key(id)
- signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
- var _signupUidList []int
- json.Unmarshal([]byte(signupUidList), &_signupUidList)
- for i := 0; i < len(rollList); i++ {
- if id == rollList[i].Id {
- old := rollList[i]
- old.SignupUidList = _signupUidList
- break
- }
- }
- return nil
- }
- // 删除roll房信息
- func DelRollInfoById(id int) error {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- return fmt.Errorf("get redis pool fail")
- }
- rd := pool.Get()
- defer rd.Close()
- riMutex.Lock()
- defer riMutex.Unlock()
- pKey := get_roll_key(id)
- _, err := rd.Do("del", pKey)
- if err != nil {
- log.Println(err)
- return err
- }
- rd.Do("srem", ROLL_MAIN_KEY, id)
- for i := 0; i < len(rollList); i++ {
- if id == rollList[i].Id {
- ii := i + 1
- rollList = append(rollList[:i], rollList[ii:]...)
- }
- }
- SendGameDeleteRoll(id)
- return nil
- }
- // 删除非活跃roll房
- func del_unactive_roll_info(id int) error {
- pool := utils.GetAccountRedisPool()
- if pool == nil {
- return fmt.Errorf("get redis pool fail")
- }
- rd := pool.Get()
- defer rd.Close()
- pKey := get_roll_key(id)
- _, err := rd.Do("del", pKey)
- if err != nil {
- log.Println(err)
- return err
- }
- rd.Do("srem", ROLL_MAIN_KEY, id)
- SendGameDeleteRoll(id)
- return nil
- }
- // 获取roll房信息信息
- func GetRollInfoById(id int) (hf *RollInfo) {
- riMutex.Lock()
- defer riMutex.Unlock()
- // 更新参与列表
- UpdateSignupUidList(id)
- for i := 0; i < len(rollList); i++ {
- if id == rollList[i].Id {
- return rollList[i]
- }
- }
- return nil
- }
- func GetRollInfoList() RollInfoArray {
- riMutex.Lock()
- defer riMutex.Unlock()
- // 更新参与列表
- for _, v := range rollList {
- UpdateSignupUidList(v.Id)
- }
- // 已开奖
- var _rollList RollInfoArray
- currTime := time.Now().Unix()
- for _, v := range rollList {
- if v.AwardTime > currTime {
- _rollList = append(_rollList, v)
- } else {
- del_unactive_roll_info(v.Id)
- }
- }
- rollList = _rollList
- return rollList
- }
- func GetRollConditionList() RollConditionArray {
- return conditionList
- }
- // 游戏服 - 新增
- func SendGameAddRoll(id int) error {
- params := make(map[string]interface{})
- params["name"] = "gm_add_roll"
- data := make(map[string]interface{})
- data["id"] = id
- params["data"] = data
- body, _ := json.Marshal(params)
- host := utils.GetKeyConf("gameservers", "web")
- sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
- url := "http://" + host + "/json?sign=" + sign
- buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
- if err != nil {
- return err
- }
- var res RES_ROLL
- err = json.Unmarshal(buff, &res)
- if err != nil {
- return err
- }
- if res.Code != 200 {
- return fmt.Errorf("code:%d", res.Code)
- }
- return nil
- }
- // 游戏服 - 更新
- func SendGameUpdateRoll(id int) error {
- params := make(map[string]interface{})
- params["name"] = "gm_update_roll"
- data := make(map[string]interface{})
- data["id"] = id
- params["data"] = data
- body, _ := json.Marshal(params)
- host := utils.GetKeyConf("gameservers", "web")
- sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
- url := "http://" + host + "/json?sign=" + sign
- buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
- if err != nil {
- return err
- }
- var res RES_ROLL
- err = json.Unmarshal(buff, &res)
- if err != nil {
- return err
- }
- if res.Code != 200 {
- return fmt.Errorf("code:%d", res.Code)
- }
- return nil
- }
- // 游戏服 - 更新
- func SendGameDeleteRoll(id int) error {
- params := make(map[string]interface{})
- params["name"] = "gm_del_roll"
- data := make(map[string]interface{})
- data["id"] = id
- params["data"] = data
- body, _ := json.Marshal(params)
- host := utils.GetKeyConf("gameservers", "web")
- sign := utils.Strtomd5(string(body) + utils.GetKeyConf("app", "gameKey"))
- url := "http://" + host + "/json?sign=" + sign
- buff, err := utils.SendAndRecvHTTP("POST", url, string(body))
- if err != nil {
- return err
- }
- var res RES_ROLL
- err = json.Unmarshal(buff, &res)
- if err != nil {
- return err
- }
- if res.Code != 200 {
- return fmt.Errorf("code:%d", res.Code)
- }
- return nil
- }
|