Repository: dwg255/fish Branch: master Commit: a91a14e1f1f1 Files: 58 Total size: 235.5 KB Directory structure: gitextract_5x4ila4d/ ├── .gitignore ├── README.md ├── account/ │ ├── common/ │ │ ├── config.go │ │ └── model.go │ ├── main/ │ │ ├── config.go │ │ ├── init.go │ │ └── main.go │ └── service/ │ └── handle.go ├── common/ │ ├── api/ │ │ └── thrift/ │ │ ├── account.thrift │ │ └── gen-go/ │ │ └── rpc/ │ │ ├── GoUnusedProtection__.go │ │ ├── account-consts.go │ │ ├── account.go │ │ └── user_service-remote/ │ │ └── user_service-remote.go │ ├── conf/ │ │ ├── account.conf │ │ ├── game.conf │ │ ├── hall.conf │ │ └── traces.json │ └── tools/ │ ├── aes.go │ ├── call_rpc.go │ ├── snowFlake.go │ └── tools.go ├── game/ │ ├── common/ │ │ └── config.go │ ├── controllers/ │ │ ├── create_public_room.go │ │ ├── create_room.go │ │ ├── enter_public_room.go │ │ ├── enter_room.go │ │ ├── get_server_info.go │ │ ├── is_room_running.go │ │ └── ping.go │ ├── main/ │ │ ├── config.go │ │ ├── init.go │ │ └── main.go │ ├── router/ │ │ └── router.go │ └── service/ │ ├── client.go │ ├── define.go │ ├── fish_utils.go │ ├── request.go │ └── room.go ├── go.mod ├── go.sum ├── hall/ │ ├── common/ │ │ └── config.go │ ├── controllers/ │ │ ├── enter_public_room.go │ │ ├── get_message.go │ │ ├── get_server_info.go │ │ ├── get_user_status.go │ │ ├── guest.go │ │ ├── login.go │ │ ├── qq_callback.go │ │ ├── qq_login.go │ │ └── register_game_server.go │ ├── main/ │ │ ├── config.go │ │ ├── init.go │ │ └── main.go │ └── router/ │ └── router.go ├── start_account.bat ├── start_fish.bat ├── start_hall.bat └── z-start_all_server.bat ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .idea/ *.exe *.log ================================================ FILE: README.md ================================================ # 捕鱼 运行步骤: 1.下载源码: git clone https://github.com/dwg255/fish 2.编译: cd fish\ go build -o account.exe account\main\main.go account\main\init.go account\main\config.go go build -o hall.exe hall\main\main.go hall\main\init.go hall\main\config.go go build -o fish.exe game\main\main.go game\main\init.go game\main\config.go 3.解压客户端: tar -zxvf fish.tar.gz /var/www/html/client/fish 4.配置nginx: ``` server { listen 80; server_name fish.com; charset utf8; index index.html index.htm; location /qq { add_header Access-Control-Allow-Origin *; proxy_set_header X-Target $request_uri; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:9000; } location / { root /var/www/html/client/fish; add_header Access-Control-Allow-Origin *; expires 7d; } } ``` 配置文件位置 /common/conf 内含redis配置和qq第三方登录配置,请自行修改。 5.在线示例: http://fish.blzz.shop --- License This project is released under the terms of the MIT license. See [LICENSE](LICENSE) for more information or see https://opensource.org/licenses/MIT. --- ![](https://github.com/dwg255/fish/blob/master/client/qg_%E5%89%AF%E6%9C%AC.jpg?raw=true) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/1.jpg) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/2.jpg) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/3.jpg) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/4.jpg) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/5.jpg) ![](https://raw.githubusercontent.com/dwg255/fish/master/client/6.jpg) ![](https://github.com/dwg255/fish/blob/master/client/qg_%E5%89%AF%E6%9C%AC.jpg?raw=true) ================================================ FILE: account/common/config.go ================================================ package common import ( "github.com/go-redis/redis" "github.com/jmoiron/sqlx" ) var ( AccountConf = &AccountServiceConf{ RedisConf: &RedisConf{}, MysqlConf: &MysqlConf{}, } ) type AccountServiceConf struct { AccountAesKey string ThriftPort int LogPath string LogLevel string RedisConf *RedisConf MysqlConf *MysqlConf } type RedisConf struct { RedisAddrs []string RedisKeyPrefix string //RedisPool *redis.ClusterClient RedisPool *redis.Client } type MysqlConf struct { MysqlAddr string MysqlUser string MysqlPassword string MysqlDatabase string Pool *sqlx.DB } ================================================ FILE: account/common/model.go ================================================ package common type FishUser struct { UserId int `json:"userid" dB:"UsERID"` Account string `json:"account" DB:"account"` Name string `json:"name" DB:"name"` Sex int `json:"sex" dB:"sex"` HeadImg string `json:"headimg" DB:"headimg"` Lv int `json:"lv" DB:"LV"` Exp int `json:"exP" Db:"exP"` Coins int `json:"coins" db:"coins"` Vip int `json:"vip" db:"vip"` Money int `json:"money" DB:"money"` Gems int `json:"gems" db:"gems"` RoomId string `json:"roomid" DB:"roomid"` History string `json:"history" dB:"history"` Power int `json:"power" DB:"power"` ReNameCount int `json:"renamecount" db:"renamecount"` ReHeadCount int `json:"reheadcount" db:"reheadcount"` PropId int `json:"propid" db:"propid"` } type InvestUserStake struct { Id int `json:"id" db:"id"` GameTimesId string `json:"game_times_id" db:"game_times_id"` Periods int `json:"record_id" db:"periods"` RoomId int `json:"room_id" db:"room_id"` RoomType int `json:"room_type" db:"room_type"` UserId int `json:"user_id" db:"user_id"` Nickname string `json:"nickname" db:"nickname"` UserAllStake int `json:"stake_gold" db:"user_all_stake"` WinGold int `json:"get_gold" db:"get_gold"` StakeDetail string `json:"stake_detail" db:"stake_detail"` GameResult int `json:"game_result" db:"game_result"` Pool int `json:"game_pool" db:"game_pool"` StakeTime string `json:"stake_time" db:"last_stake_time"` } ================================================ FILE: account/main/config.go ================================================ package main import ( "fish/account/common" "fmt" "github.com/astaxie/beego/config" "github.com/astaxie/beego/logs" ) func initConf() (err error) { conf, err := config.NewConfig("ini", "./common/conf/account.conf") if err != nil { fmt.Println("new config failed,err:", err) return } common.AccountConf.ThriftPort, err = conf.Int("account_port") if err != nil { return } common.AccountConf.AccountAesKey = conf.String("account_aes_key") if common.AccountConf.AccountAesKey == "" || len(common.AccountConf.AccountAesKey) < 16 { return fmt.Errorf("conf err: invalid account_aes_key :%v", common.AccountConf.AccountAesKey) } logs.Debug("account_aes_key :%v",common.AccountConf.AccountAesKey) common.AccountConf.LogPath = conf.String("log_path") if common.AccountConf.LogPath == "" { return fmt.Errorf("conf err: log_path is null") } common.AccountConf.LogLevel = conf.String("log_level") if common.AccountConf.LogLevel == "" { return fmt.Errorf("conf err: log_level is null") } //redis配置 common.AccountConf.RedisConf.RedisAddrs = conf.Strings("redis_addrs") if len(common.AccountConf.RedisConf.RedisAddrs) == 0 { return fmt.Errorf("conf err: redis addr is null") } common.AccountConf.RedisConf.RedisKeyPrefix = conf.String("redis_key_prefix") if len(common.AccountConf.RedisConf.RedisKeyPrefix) == 0 { return fmt.Errorf("conf err: redis_key_prefix is null") } //mysql配置 common.AccountConf.MysqlConf.MysqlAddr = conf.String("mysql_addr") if len(common.AccountConf.MysqlConf.MysqlAddr) == 0 { return fmt.Errorf("conf err: mysql_addr is null") } common.AccountConf.MysqlConf.MysqlUser = conf.String("mysql_user") if len(common.AccountConf.MysqlConf.MysqlUser) == 0 { return fmt.Errorf("conf err: mysql_user is null") } common.AccountConf.MysqlConf.MysqlPassword = conf.String("mysql_password") if len(common.AccountConf.MysqlConf.MysqlPassword) == 0 { return fmt.Errorf("conf err: mysql_password is null") } common.AccountConf.MysqlConf.MysqlDatabase = conf.String("mysql_db") if len(common.AccountConf.MysqlConf.MysqlDatabase) == 0 { return fmt.Errorf("conf err: mysql_db is null") } return } ================================================ FILE: account/main/init.go ================================================ package main import ( "encoding/json" "fish/account/common" "fmt" "github.com/astaxie/beego/logs" "github.com/go-redis/redis" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) func conversionLogLevel(logLevel string) int { switch logLevel { case "debug": return logs.LevelDebug case "warn": return logs.LevelWarn case "info": return logs.LevelInfo case "trace": return logs.LevelTrace } return logs.LevelDebug } func initLogger() (err error) { config := make(map[string]interface{}) config["filename"] = common.AccountConf.LogPath config["level"] = conversionLogLevel(common.AccountConf.LogLevel) configStr, err := json.Marshal(config) if err != nil { return } err = logs.SetLogger(logs.AdapterFile, string(configStr)) return } func initMysql() (err error) { conf := common.AccountConf.MysqlConf dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s", conf.MysqlUser, conf.MysqlPassword, conf.MysqlAddr, conf.MysqlDatabase) logs.Debug(dsn) database, err := sqlx.Open("mysql", dsn) if err != nil { return } common.AccountConf.MysqlConf.Pool = database return } func initRedis() (err error) { //client := redis.NewClusterClient(&redis.ClusterOptions{ // Addrs: common.AccountConf.RedisConf.RedisAddrs, //}) //_, err = client.Ping().Result() //if err != nil { // return //} //common.AccountConf.RedisConf.RedisPool = client client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) common.AccountConf.RedisConf.RedisPool = client return } func initSec() (err error) { err = initLogger() if err != nil { return } err = initRedis() if err != nil { return } /*err = initMysql() if err != nil { return }*/ return } ================================================ FILE: account/main/main.go ================================================ package main import ( "fish/account/common" "fish/account/service" "fish/common/api/thrift/gen-go/rpc" "fmt" "github.com/apache/thrift/lib/go/thrift" "github.com/astaxie/beego/logs" ) func main() { err := initConf() if err != nil { logs.Error("init conf err:%v",err) return } logs.Debug("init conf success") service.InitAesTool() err = initSec() if err != nil { logs.Error("initSec err:%v",err) return } logs.Debug("init sec success") port := fmt.Sprintf(":%d",common.AccountConf.ThriftPort) transport, err := thrift.NewTServerSocket(port) if err != nil { panic(err) } handler := &service.UserServer{} processor := rpc.NewUserServiceProcessor(handler) transportFactory := thrift.NewTBufferedTransportFactory(8192) protocolFactory := thrift.NewTCompactProtocolFactory() server := thrift.NewTSimpleServer4( processor, transport, transportFactory, protocolFactory, ) logs.Debug("account server %s",port) if err := server.Serve(); err != nil { panic(err) } } ================================================ FILE: account/service/handle.go ================================================ package service import ( "context" "fish/account/common" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fmt" "github.com/astaxie/beego/logs" "math/rand" "strconv" "strings" "time" ) var ( redisConf = common.AccountConf.RedisConf aesTool *tools.AesEncrypt ) type UserServer struct { } func InitAesTool() { var err error if aesTool, err = tools.NewAesTool(common.AccountConf.AccountAesKey); err != nil { panic("new aes tool err: " + err.Error()) } } func (p *UserServer) GetUserInfoByOpenId(ctx context.Context, openId string) (r *rpc.Result_, err error) { logs.Debug("getUserInfoByOpenId openId: %v", openId) var existsUserId string var userId int if existsUserId, err = redisConf.RedisPool.HGet(redisConf.RedisKeyPrefix+"open_id2user_id", openId).Result(); err == nil { if userId, err = strconv.Atoi(existsUserId); err == nil { return p.GetUserInfoById(ctx, int32(userId)) } } else { r = &rpc.Result_{ Code: rpc.ErrorCode_UserNotExists, } err = fmt.Errorf("user openId=%v not exists", openId) } return } func (p *UserServer) CreateQQUser(ctx context.Context, userInfo *rpc.UserInfo) (r *rpc.Result_, err error) { logs.Debug("CreateQQUser nickName: %v", userInfo.NickName) var nextUserId int64 var existsUserId string var userId int if existsUserId, err = redisConf.RedisPool.HGet(redisConf.RedisKeyPrefix+"open_id2user_id", userInfo.QqInfo.OpenId).Result(); err == nil { if userId, err = strconv.Atoi(existsUserId); err == nil { return p.GetUserInfoById(ctx, int32(userId)) } } else { nextUserId, err = redisConf.RedisPool.Incr(redisConf.RedisKeyPrefix + "userId").Result() token := "" registerTime := time.Now() if token, err = aesTool.Encrypt(strconv.Itoa(int(nextUserId)) + "-" + strconv.Itoa(int(registerTime.Unix()))); err == nil { rand.Seed(time.Now().UnixNano()) userInfoRedisMap := map[string]interface{}{ "UserId": nextUserId, "UserName": userInfo.UserName, "NickName": userInfo.NickName, "Sex": userInfo.Sex, "HeadImg": userInfo.HeadImg, "Lv": userInfo.Lv, "Exp": userInfo.Exp, "Vip": userInfo.Vip, //VIP级别随机给吧, "Gems": userInfo.Gems, "RoomId": 0, "Power": userInfo.Power, "ReNameCount": userInfo.ReNameCount, "ReHeadCount": userInfo.ReHeadCount, "RegisterDate": registerTime.Format("2006-01-02 15:04:05"), "Ice": 10, "Token": token, "openId": userInfo.QqInfo.OpenId, "FigureUrl": userInfo.QqInfo.FigureUrl, "Province": userInfo.QqInfo.Province, "City": userInfo.QqInfo.City, "TotalSpending": userInfo.QqInfo.TotalSpending, } if _, err = redisConf.RedisPool.HMSet(redisConf.RedisKeyPrefix+strconv.Itoa(int(nextUserId)), userInfoRedisMap).Result(); err == nil { if _, err = redisConf.RedisPool.HSet(redisConf.RedisKeyPrefix+"open_id2user_id", userInfo.QqInfo.OpenId, nextUserId).Result(); err == nil { userInfo.UserId = nextUserId userInfo.Token = token r = &rpc.Result_{ Code: rpc.ErrorCode_Success, UserObj: userInfo, } return } } } } return } func (p *UserServer) CreateNewUser(ctx context.Context, nickName string, avatarAuto string, gold int64) (r *rpc.Result_, err error) { logs.Debug("CreateNewUser nickName: %v", nickName) var nextUserId int64 nextUserId, err = redisConf.RedisPool.Incr(redisConf.RedisKeyPrefix + "userId").Result() token := "" registerTime := time.Now() if token, err = aesTool.Encrypt(strconv.Itoa(int(nextUserId)) + "-" + strconv.Itoa(int(registerTime.Unix()))); err == nil { rand.Seed(time.Now().UnixNano()) vip := int8(rand.Intn(7)) userInfoRedisMap := map[string]interface{}{ "UserId": nextUserId, "UserName": nickName, "NickName": nickName, "Sex": 0, "HeadImg": 1, "Lv": 1, "Exp": 0, "Vip": vip, //VIP级别随机给吧, "Gems": gold, "RoomId": 0, "Power": 0, "ReNameCount": 0, "ReHeadCount": 0, "RegisterDate": registerTime.Format("2006-01-02 15:04:05"), "Ice": 10, "Token": token, } if _, err = redisConf.RedisPool.HMSet(redisConf.RedisKeyPrefix+strconv.Itoa(int(nextUserId)), userInfoRedisMap).Result(); err == nil { r = &rpc.Result_{ Code: rpc.ErrorCode_Success, UserObj: &rpc.UserInfo{ UserId: nextUserId, UserName: nickName, NickName: nickName, Sex: 0, HeadImg: "1", Lv: 1, Exp: 0, Vip: vip, //VIP级别随机给吧 Gems: gold, RoomId: 0, Power: 0, ReNameCount: 0, ReHeadCount: 0, RegisterDate: registerTime.Format("2006-01-02 15:04:05"), Ice: 10, Token: token, }, } return } } return } func (p *UserServer) GetUserInfoById(ctx context.Context, userId int32) (r *rpc.Result_, err error) { logs.Debug("GetUserInfoById: %v", userId) result, err := redisConf.RedisPool.HGetAll(redisConf.RedisKeyPrefix + strconv.Itoa(int(userId))).Result() if err != nil { return r, err } var Lv, Vip, Gems, RoomId, Power, Ice int if Lv, err = strconv.Atoi(result["Lv"]); err != nil { return r, err } if Vip, err = strconv.Atoi(result["Vip"]); err != nil { return r, err } if RoomId, err = strconv.Atoi(result["RoomId"]); err != nil { return r, err } if Gems, err = strconv.Atoi(result["Gems"]); err != nil { return r, err } if Power, err = strconv.Atoi(result["Power"]); err != nil { return r, err } if Ice, err = strconv.Atoi(result["Ice"]); err != nil { return r, err } r = &rpc.Result_{ Code: rpc.ErrorCode_Success, UserObj: &rpc.UserInfo{ UserId: int64(userId), UserName: result["UserName"], NickName: result["NickName"], Sex: 0, HeadImg: result["HeadImg"], Lv: int32(Lv), Exp: 0, Vip: int8(Vip), Gems: int64(Gems), RoomId: int64(RoomId), Power: int64(Power), ReNameCount: 0, ReHeadCount: 0, RegisterDate: result["RegisterDate"], Ice: int64(Ice), Token: result["Token"], }, } return } func (p *UserServer) GetUserInfoByToken(ctx context.Context, token string) (r *rpc.Result_, err error) { logs.Debug("GetUserInfoByToken: %v", token) userIdStr := "" if userIdStr, err = aesTool.Decrypt(token); err == nil { userId := 0 tokenSplit := strings.Split(userIdStr, "-") if len(tokenSplit) > 1 { if userId, err = strconv.Atoi(tokenSplit[0]); err == nil { return p.GetUserInfoById(context.Background(), int32(userId)) } } } return } func (p *UserServer) ModifyUserInfoById(ctx context.Context, behavior string, userId int32, propType rpc.ModifyPropType, incr int64) (r *rpc.Result_, err error) { logs.Debug("ModifyUserInfoById: %v", behavior) var exists int64 userInfoKey := redisConf.RedisKeyPrefix + strconv.Itoa(int(userId)) if exists, err = common.AccountConf.RedisConf.RedisPool.Exists(userInfoKey).Result(); err == nil { if exists == 1 { switch propType { case rpc.ModifyPropType_gems: common.AccountConf.RedisConf.RedisPool.HIncrBy(userInfoKey, "Gems", incr) case rpc.ModifyPropType_ice: common.AccountConf.RedisConf.RedisPool.HIncrBy(userInfoKey, "Ice", incr) case rpc.ModifyPropType_power: common.AccountConf.RedisConf.RedisPool.HIncrBy(userInfoKey, "Power", incr) case rpc.ModifyPropType_roomId: common.AccountConf.RedisConf.RedisPool.HIncrBy(userInfoKey, "RoomId", incr) } return p.GetUserInfoById(context.Background(), userId) } err = fmt.Errorf("user [%d] doesnot exists", userId) } return } func (p *UserServer) GetMessage(ctx context.Context, messageType string) (r string, err error) { logs.Debug("GetMessage messageType: %v", messageType) var redisErr error if messageType == "notice" { r, redisErr = redisConf.RedisPool.Get(redisConf.RedisKeyPrefix + "notice").Result() if r == "" || redisErr != nil { r = "个人开发,仅可用于学习研究。" } } else { r, redisErr = redisConf.RedisPool.Get(redisConf.RedisKeyPrefix + "fkgm").Result() if r == "" || redisErr != nil { r = "爸爸爱你" } } return } func (p *UserServer) RenameUserById(ctx context.Context, userId int32, NewName string) (r *rpc.Result_, err error) { return } ================================================ FILE: common/api/thrift/account.thrift ================================================ namespace go rpc enum ErrorCode{ Success=0 ServerError=5000, VerifyError=5001, UserNotExists=5002, } enum ModifyPropType{ gems = 0 roomId = 1 power = 2 ice = 3 } struct qqInfo{ 1:string openId 2:string figureUrl 3:string province 4:string city 5:i64 totalSpending } struct UserInfo{ 1: i64 userId 2: string userName 3: string nickName 4: i8 sex 5: string headImg 6: i32 lv 7: i64 exp 8: i8 vip 9: i64 gems 10: i64 roomId 11: i64 power 12: i8 reNameCount 13: i8 reHeadCount 14: string registerDate 15: i64 ice 16: string token 17: qqInfo qqInfo } struct Result{ 1: ErrorCode code 2: UserInfo user_obj } service UserService { //创建临时用户 Result createNewUser(1: string nickName 2:string avatarAuto 3: i64 gold )//初始金币 //创建QQ用户 Result createQQUser(1: UserInfo UserInfo) //使用openId获取用户 Result getUserInfoByOpenId(1:string openId) //获取用户信息 BY userId Result getUserInfoById(1:i32 userId) //获取用户信息 BY token Result getUserInfoByToken(1:string token) //修改用户金币 Result modifyUserInfoById(1:string behavior, 2:i32 userId, 3: ModifyPropType propType, 4: i64 incr) Result RenameUserById(1:i32 userId,2:string NewName) string getMessage(1 :string messageType) } ================================================ FILE: common/api/thrift/gen-go/rpc/GoUnusedProtection__.go ================================================ // Autogenerated by Thrift Compiler (0.12.0) // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING package rpc var GoUnusedProtection__ int; ================================================ FILE: common/api/thrift/gen-go/rpc/account-consts.go ================================================ // Autogenerated by Thrift Compiler (0.12.0) // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING package rpc import ( "bytes" "context" "reflect" "fmt" "github.com/apache/thrift/lib/go/thrift" ) // (needed to ensure safety because of naive import list construction.) var _ = thrift.ZERO var _ = fmt.Printf var _ = context.Background var _ = reflect.DeepEqual var _ = bytes.Equal func init() { } ================================================ FILE: common/api/thrift/gen-go/rpc/account.go ================================================ // Autogenerated by Thrift Compiler (0.12.0) // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING package rpc import ( "bytes" "context" "reflect" "database/sql/driver" "errors" "fmt" "github.com/apache/thrift/lib/go/thrift" ) // (needed to ensure safety because of naive import list construction.) var _ = thrift.ZERO var _ = fmt.Printf var _ = context.Background var _ = reflect.DeepEqual var _ = bytes.Equal type ErrorCode int64 const ( ErrorCode_Success ErrorCode = 0 ErrorCode_ServerError ErrorCode = 5000 ErrorCode_VerifyError ErrorCode = 5001 ErrorCode_UserNotExists ErrorCode = 5002 ) func (p ErrorCode) String() string { switch p { case ErrorCode_Success: return "Success" case ErrorCode_ServerError: return "ServerError" case ErrorCode_VerifyError: return "VerifyError" case ErrorCode_UserNotExists: return "UserNotExists" } return "" } func ErrorCodeFromString(s string) (ErrorCode, error) { switch s { case "Success": return ErrorCode_Success, nil case "ServerError": return ErrorCode_ServerError, nil case "VerifyError": return ErrorCode_VerifyError, nil case "UserNotExists": return ErrorCode_UserNotExists, nil } return ErrorCode(0), fmt.Errorf("not a valid ErrorCode string") } func ErrorCodePtr(v ErrorCode) *ErrorCode { return &v } func (p ErrorCode) MarshalText() ([]byte, error) { return []byte(p.String()), nil } func (p *ErrorCode) UnmarshalText(text []byte) error { q, err := ErrorCodeFromString(string(text)) if (err != nil) { return err } *p = q return nil } func (p *ErrorCode) Scan(value interface{}) error { v, ok := value.(int64) if !ok { return errors.New("Scan value is not int64") } *p = ErrorCode(v) return nil } func (p * ErrorCode) Value() (driver.Value, error) { if p == nil { return nil, nil } return int64(*p), nil } type ModifyPropType int64 const ( ModifyPropType_gems ModifyPropType = 0 ModifyPropType_roomId ModifyPropType = 1 ModifyPropType_power ModifyPropType = 2 ModifyPropType_ice ModifyPropType = 3 ) func (p ModifyPropType) String() string { switch p { case ModifyPropType_gems: return "gems" case ModifyPropType_roomId: return "roomId" case ModifyPropType_power: return "power" case ModifyPropType_ice: return "ice" } return "" } func ModifyPropTypeFromString(s string) (ModifyPropType, error) { switch s { case "gems": return ModifyPropType_gems, nil case "roomId": return ModifyPropType_roomId, nil case "power": return ModifyPropType_power, nil case "ice": return ModifyPropType_ice, nil } return ModifyPropType(0), fmt.Errorf("not a valid ModifyPropType string") } func ModifyPropTypePtr(v ModifyPropType) *ModifyPropType { return &v } func (p ModifyPropType) MarshalText() ([]byte, error) { return []byte(p.String()), nil } func (p *ModifyPropType) UnmarshalText(text []byte) error { q, err := ModifyPropTypeFromString(string(text)) if (err != nil) { return err } *p = q return nil } func (p *ModifyPropType) Scan(value interface{}) error { v, ok := value.(int64) if !ok { return errors.New("Scan value is not int64") } *p = ModifyPropType(v) return nil } func (p * ModifyPropType) Value() (driver.Value, error) { if p == nil { return nil, nil } return int64(*p), nil } // Attributes: // - OpenId // - FigureUrl // - Province // - City // - TotalSpending type QqInfo struct { OpenId string `thrift:"openId,1" db:"openId" json:"openId"` FigureUrl string `thrift:"figureUrl,2" db:"figureUrl" json:"figureUrl"` Province string `thrift:"province,3" db:"province" json:"province"` City string `thrift:"city,4" db:"city" json:"city"` TotalSpending int64 `thrift:"totalSpending,5" db:"totalSpending" json:"totalSpending"` } func NewQqInfo() *QqInfo { return &QqInfo{} } func (p *QqInfo) GetOpenId() string { return p.OpenId } func (p *QqInfo) GetFigureUrl() string { return p.FigureUrl } func (p *QqInfo) GetProvince() string { return p.Province } func (p *QqInfo) GetCity() string { return p.City } func (p *QqInfo) GetTotalSpending() int64 { return p.TotalSpending } func (p *QqInfo) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.STRING { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 3: if fieldTypeId == thrift.STRING { if err := p.ReadField3(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 4: if fieldTypeId == thrift.STRING { if err := p.ReadField4(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 5: if fieldTypeId == thrift.I64 { if err := p.ReadField5(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *QqInfo) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.OpenId = v } return nil } func (p *QqInfo) ReadField2(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { p.FigureUrl = v } return nil } func (p *QqInfo) ReadField3(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { p.Province = v } return nil } func (p *QqInfo) ReadField4(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 4: ", err) } else { p.City = v } return nil } func (p *QqInfo) ReadField5(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 5: ", err) } else { p.TotalSpending = v } return nil } func (p *QqInfo) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("qqInfo"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } if err := p.writeField3(oprot); err != nil { return err } if err := p.writeField4(oprot); err != nil { return err } if err := p.writeField5(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *QqInfo) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("openId", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:openId: ", p), err) } if err := oprot.WriteString(string(p.OpenId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.openId (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:openId: ", p), err) } return err } func (p *QqInfo) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("figureUrl", thrift.STRING, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:figureUrl: ", p), err) } if err := oprot.WriteString(string(p.FigureUrl)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.figureUrl (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:figureUrl: ", p), err) } return err } func (p *QqInfo) writeField3(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("province", thrift.STRING, 3); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:province: ", p), err) } if err := oprot.WriteString(string(p.Province)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.province (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 3:province: ", p), err) } return err } func (p *QqInfo) writeField4(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("city", thrift.STRING, 4); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:city: ", p), err) } if err := oprot.WriteString(string(p.City)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.city (4) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 4:city: ", p), err) } return err } func (p *QqInfo) writeField5(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("totalSpending", thrift.I64, 5); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:totalSpending: ", p), err) } if err := oprot.WriteI64(int64(p.TotalSpending)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.totalSpending (5) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 5:totalSpending: ", p), err) } return err } func (p *QqInfo) String() string { if p == nil { return "" } return fmt.Sprintf("QqInfo(%+v)", *p) } // Attributes: // - UserId // - UserName // - NickName // - Sex // - HeadImg // - Lv // - Exp // - Vip // - Gems // - RoomId // - Power // - ReNameCount // - ReHeadCount // - RegisterDate // - Ice // - Token // - QqInfo type UserInfo struct { UserId int64 `thrift:"userId,1" db:"userId" json:"userId"` UserName string `thrift:"userName,2" db:"userName" json:"userName"` NickName string `thrift:"nickName,3" db:"nickName" json:"nickName"` Sex int8 `thrift:"sex,4" db:"sex" json:"sex"` HeadImg string `thrift:"headImg,5" db:"headImg" json:"headImg"` Lv int32 `thrift:"lv,6" db:"lv" json:"lv"` Exp int64 `thrift:"exp,7" db:"exp" json:"exp"` Vip int8 `thrift:"vip,8" db:"vip" json:"vip"` Gems int64 `thrift:"gems,9" db:"gems" json:"gems"` RoomId int64 `thrift:"roomId,10" db:"roomId" json:"roomId"` Power int64 `thrift:"power,11" db:"power" json:"power"` ReNameCount int8 `thrift:"reNameCount,12" db:"reNameCount" json:"reNameCount"` ReHeadCount int8 `thrift:"reHeadCount,13" db:"reHeadCount" json:"reHeadCount"` RegisterDate string `thrift:"registerDate,14" db:"registerDate" json:"registerDate"` Ice int64 `thrift:"ice,15" db:"ice" json:"ice"` Token string `thrift:"token,16" db:"token" json:"token"` QqInfo *QqInfo `thrift:"qqInfo,17" db:"qqInfo" json:"qqInfo"` } func NewUserInfo() *UserInfo { return &UserInfo{} } func (p *UserInfo) GetUserId() int64 { return p.UserId } func (p *UserInfo) GetUserName() string { return p.UserName } func (p *UserInfo) GetNickName() string { return p.NickName } func (p *UserInfo) GetSex() int8 { return p.Sex } func (p *UserInfo) GetHeadImg() string { return p.HeadImg } func (p *UserInfo) GetLv() int32 { return p.Lv } func (p *UserInfo) GetExp() int64 { return p.Exp } func (p *UserInfo) GetVip() int8 { return p.Vip } func (p *UserInfo) GetGems() int64 { return p.Gems } func (p *UserInfo) GetRoomId() int64 { return p.RoomId } func (p *UserInfo) GetPower() int64 { return p.Power } func (p *UserInfo) GetReNameCount() int8 { return p.ReNameCount } func (p *UserInfo) GetReHeadCount() int8 { return p.ReHeadCount } func (p *UserInfo) GetRegisterDate() string { return p.RegisterDate } func (p *UserInfo) GetIce() int64 { return p.Ice } func (p *UserInfo) GetToken() string { return p.Token } var UserInfo_QqInfo_DEFAULT *QqInfo func (p *UserInfo) GetQqInfo() *QqInfo { if !p.IsSetQqInfo() { return UserInfo_QqInfo_DEFAULT } return p.QqInfo } func (p *UserInfo) IsSetQqInfo() bool { return p.QqInfo != nil } func (p *UserInfo) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.I64 { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.STRING { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 3: if fieldTypeId == thrift.STRING { if err := p.ReadField3(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 4: if fieldTypeId == thrift.BYTE { if err := p.ReadField4(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 5: if fieldTypeId == thrift.STRING { if err := p.ReadField5(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 6: if fieldTypeId == thrift.I32 { if err := p.ReadField6(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 7: if fieldTypeId == thrift.I64 { if err := p.ReadField7(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 8: if fieldTypeId == thrift.BYTE { if err := p.ReadField8(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 9: if fieldTypeId == thrift.I64 { if err := p.ReadField9(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 10: if fieldTypeId == thrift.I64 { if err := p.ReadField10(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 11: if fieldTypeId == thrift.I64 { if err := p.ReadField11(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 12: if fieldTypeId == thrift.BYTE { if err := p.ReadField12(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 13: if fieldTypeId == thrift.BYTE { if err := p.ReadField13(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 14: if fieldTypeId == thrift.STRING { if err := p.ReadField14(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 15: if fieldTypeId == thrift.I64 { if err := p.ReadField15(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 16: if fieldTypeId == thrift.STRING { if err := p.ReadField16(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 17: if fieldTypeId == thrift.STRUCT { if err := p.ReadField17(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserInfo) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.UserId = v } return nil } func (p *UserInfo) ReadField2(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { p.UserName = v } return nil } func (p *UserInfo) ReadField3(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { p.NickName = v } return nil } func (p *UserInfo) ReadField4(iprot thrift.TProtocol) error { if v, err := iprot.ReadByte(); err != nil { return thrift.PrependError("error reading field 4: ", err) } else { temp := int8(v) p.Sex = temp } return nil } func (p *UserInfo) ReadField5(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 5: ", err) } else { p.HeadImg = v } return nil } func (p *UserInfo) ReadField6(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 6: ", err) } else { p.Lv = v } return nil } func (p *UserInfo) ReadField7(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 7: ", err) } else { p.Exp = v } return nil } func (p *UserInfo) ReadField8(iprot thrift.TProtocol) error { if v, err := iprot.ReadByte(); err != nil { return thrift.PrependError("error reading field 8: ", err) } else { temp := int8(v) p.Vip = temp } return nil } func (p *UserInfo) ReadField9(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 9: ", err) } else { p.Gems = v } return nil } func (p *UserInfo) ReadField10(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 10: ", err) } else { p.RoomId = v } return nil } func (p *UserInfo) ReadField11(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 11: ", err) } else { p.Power = v } return nil } func (p *UserInfo) ReadField12(iprot thrift.TProtocol) error { if v, err := iprot.ReadByte(); err != nil { return thrift.PrependError("error reading field 12: ", err) } else { temp := int8(v) p.ReNameCount = temp } return nil } func (p *UserInfo) ReadField13(iprot thrift.TProtocol) error { if v, err := iprot.ReadByte(); err != nil { return thrift.PrependError("error reading field 13: ", err) } else { temp := int8(v) p.ReHeadCount = temp } return nil } func (p *UserInfo) ReadField14(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 14: ", err) } else { p.RegisterDate = v } return nil } func (p *UserInfo) ReadField15(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 15: ", err) } else { p.Ice = v } return nil } func (p *UserInfo) ReadField16(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 16: ", err) } else { p.Token = v } return nil } func (p *UserInfo) ReadField17(iprot thrift.TProtocol) error { p.QqInfo = &QqInfo{} if err := p.QqInfo.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.QqInfo), err) } return nil } func (p *UserInfo) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("UserInfo"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } if err := p.writeField3(oprot); err != nil { return err } if err := p.writeField4(oprot); err != nil { return err } if err := p.writeField5(oprot); err != nil { return err } if err := p.writeField6(oprot); err != nil { return err } if err := p.writeField7(oprot); err != nil { return err } if err := p.writeField8(oprot); err != nil { return err } if err := p.writeField9(oprot); err != nil { return err } if err := p.writeField10(oprot); err != nil { return err } if err := p.writeField11(oprot); err != nil { return err } if err := p.writeField12(oprot); err != nil { return err } if err := p.writeField13(oprot); err != nil { return err } if err := p.writeField14(oprot); err != nil { return err } if err := p.writeField15(oprot); err != nil { return err } if err := p.writeField16(oprot); err != nil { return err } if err := p.writeField17(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserInfo) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("userId", thrift.I64, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:userId: ", p), err) } if err := oprot.WriteI64(int64(p.UserId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.userId (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:userId: ", p), err) } return err } func (p *UserInfo) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("userName", thrift.STRING, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:userName: ", p), err) } if err := oprot.WriteString(string(p.UserName)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.userName (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:userName: ", p), err) } return err } func (p *UserInfo) writeField3(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("nickName", thrift.STRING, 3); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:nickName: ", p), err) } if err := oprot.WriteString(string(p.NickName)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.nickName (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 3:nickName: ", p), err) } return err } func (p *UserInfo) writeField4(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("sex", thrift.BYTE, 4); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:sex: ", p), err) } if err := oprot.WriteByte(int8(p.Sex)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.sex (4) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 4:sex: ", p), err) } return err } func (p *UserInfo) writeField5(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("headImg", thrift.STRING, 5); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:headImg: ", p), err) } if err := oprot.WriteString(string(p.HeadImg)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.headImg (5) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 5:headImg: ", p), err) } return err } func (p *UserInfo) writeField6(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("lv", thrift.I32, 6); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:lv: ", p), err) } if err := oprot.WriteI32(int32(p.Lv)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.lv (6) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 6:lv: ", p), err) } return err } func (p *UserInfo) writeField7(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("exp", thrift.I64, 7); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:exp: ", p), err) } if err := oprot.WriteI64(int64(p.Exp)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.exp (7) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 7:exp: ", p), err) } return err } func (p *UserInfo) writeField8(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("vip", thrift.BYTE, 8); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:vip: ", p), err) } if err := oprot.WriteByte(int8(p.Vip)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.vip (8) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 8:vip: ", p), err) } return err } func (p *UserInfo) writeField9(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("gems", thrift.I64, 9); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:gems: ", p), err) } if err := oprot.WriteI64(int64(p.Gems)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.gems (9) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 9:gems: ", p), err) } return err } func (p *UserInfo) writeField10(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("roomId", thrift.I64, 10); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:roomId: ", p), err) } if err := oprot.WriteI64(int64(p.RoomId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.roomId (10) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 10:roomId: ", p), err) } return err } func (p *UserInfo) writeField11(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("power", thrift.I64, 11); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:power: ", p), err) } if err := oprot.WriteI64(int64(p.Power)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.power (11) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 11:power: ", p), err) } return err } func (p *UserInfo) writeField12(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("reNameCount", thrift.BYTE, 12); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 12:reNameCount: ", p), err) } if err := oprot.WriteByte(int8(p.ReNameCount)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.reNameCount (12) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 12:reNameCount: ", p), err) } return err } func (p *UserInfo) writeField13(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("reHeadCount", thrift.BYTE, 13); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 13:reHeadCount: ", p), err) } if err := oprot.WriteByte(int8(p.ReHeadCount)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.reHeadCount (13) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 13:reHeadCount: ", p), err) } return err } func (p *UserInfo) writeField14(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("registerDate", thrift.STRING, 14); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 14:registerDate: ", p), err) } if err := oprot.WriteString(string(p.RegisterDate)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.registerDate (14) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 14:registerDate: ", p), err) } return err } func (p *UserInfo) writeField15(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("ice", thrift.I64, 15); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 15:ice: ", p), err) } if err := oprot.WriteI64(int64(p.Ice)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.ice (15) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 15:ice: ", p), err) } return err } func (p *UserInfo) writeField16(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("token", thrift.STRING, 16); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 16:token: ", p), err) } if err := oprot.WriteString(string(p.Token)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.token (16) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 16:token: ", p), err) } return err } func (p *UserInfo) writeField17(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("qqInfo", thrift.STRUCT, 17); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 17:qqInfo: ", p), err) } if err := p.QqInfo.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.QqInfo), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 17:qqInfo: ", p), err) } return err } func (p *UserInfo) String() string { if p == nil { return "" } return fmt.Sprintf("UserInfo(%+v)", *p) } // Attributes: // - Code // - UserObj type Result_ struct { Code ErrorCode `thrift:"code,1" db:"code" json:"code"` UserObj *UserInfo `thrift:"user_obj,2" db:"user_obj" json:"user_obj"` } func NewResult_() *Result_ { return &Result_{} } func (p *Result_) GetCode() ErrorCode { return p.Code } var Result__UserObj_DEFAULT *UserInfo func (p *Result_) GetUserObj() *UserInfo { if !p.IsSetUserObj() { return Result__UserObj_DEFAULT } return p.UserObj } func (p *Result_) IsSetUserObj() bool { return p.UserObj != nil } func (p *Result_) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.I32 { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.STRUCT { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *Result_) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { temp := ErrorCode(v) p.Code = temp } return nil } func (p *Result_) ReadField2(iprot thrift.TProtocol) error { p.UserObj = &UserInfo{} if err := p.UserObj.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.UserObj), err) } return nil } func (p *Result_) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("Result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *Result_) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("code", thrift.I32, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:code: ", p), err) } if err := oprot.WriteI32(int32(p.Code)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.code (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:code: ", p), err) } return err } func (p *Result_) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("user_obj", thrift.STRUCT, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:user_obj: ", p), err) } if err := p.UserObj.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.UserObj), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:user_obj: ", p), err) } return err } func (p *Result_) String() string { if p == nil { return "" } return fmt.Sprintf("Result_(%+v)", *p) } type UserService interface { // Parameters: // - NickName // - AvatarAuto // - Gold CreateNewUser(ctx context.Context, nickName string, avatarAuto string, gold int64) (r *Result_, err error) // Parameters: // - UserInfo CreateQQUser(ctx context.Context, UserInfo *UserInfo) (r *Result_, err error) // Parameters: // - OpenId GetUserInfoByOpenId(ctx context.Context, openId string) (r *Result_, err error) // Parameters: // - UserId GetUserInfoById(ctx context.Context, userId int32) (r *Result_, err error) // Parameters: // - Token GetUserInfoByToken(ctx context.Context, token string) (r *Result_, err error) // Parameters: // - Behavior // - UserId // - PropType // - Incr ModifyUserInfoById(ctx context.Context, behavior string, userId int32, propType ModifyPropType, incr int64) (r *Result_, err error) // Parameters: // - UserId // - NewName_ RenameUserById(ctx context.Context, userId int32, NewName string) (r *Result_, err error) // Parameters: // - MessageType GetMessage(ctx context.Context, messageType string) (r string, err error) } type UserServiceClient struct { c thrift.TClient } func NewUserServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *UserServiceClient { return &UserServiceClient{ c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t)), } } func NewUserServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *UserServiceClient { return &UserServiceClient{ c: thrift.NewTStandardClient(iprot, oprot), } } func NewUserServiceClient(c thrift.TClient) *UserServiceClient { return &UserServiceClient{ c: c, } } func (p *UserServiceClient) Client_() thrift.TClient { return p.c } // Parameters: // - NickName // - AvatarAuto // - Gold func (p *UserServiceClient) CreateNewUser(ctx context.Context, nickName string, avatarAuto string, gold int64) (r *Result_, err error) { var _args0 UserServiceCreateNewUserArgs _args0.NickName = nickName _args0.AvatarAuto = avatarAuto _args0.Gold = gold var _result1 UserServiceCreateNewUserResult if err = p.Client_().Call(ctx, "createNewUser", &_args0, &_result1); err != nil { return } return _result1.GetSuccess(), nil } // Parameters: // - UserInfo func (p *UserServiceClient) CreateQQUser(ctx context.Context, UserInfo *UserInfo) (r *Result_, err error) { var _args2 UserServiceCreateQQUserArgs _args2.UserInfo = UserInfo var _result3 UserServiceCreateQQUserResult if err = p.Client_().Call(ctx, "createQQUser", &_args2, &_result3); err != nil { return } return _result3.GetSuccess(), nil } // Parameters: // - OpenId func (p *UserServiceClient) GetUserInfoByOpenId(ctx context.Context, openId string) (r *Result_, err error) { var _args4 UserServiceGetUserInfoByOpenIdArgs _args4.OpenId = openId var _result5 UserServiceGetUserInfoByOpenIdResult if err = p.Client_().Call(ctx, "getUserInfoByOpenId", &_args4, &_result5); err != nil { return } return _result5.GetSuccess(), nil } // Parameters: // - UserId func (p *UserServiceClient) GetUserInfoById(ctx context.Context, userId int32) (r *Result_, err error) { var _args6 UserServiceGetUserInfoByIdArgs _args6.UserId = userId var _result7 UserServiceGetUserInfoByIdResult if err = p.Client_().Call(ctx, "getUserInfoById", &_args6, &_result7); err != nil { return } return _result7.GetSuccess(), nil } // Parameters: // - Token func (p *UserServiceClient) GetUserInfoByToken(ctx context.Context, token string) (r *Result_, err error) { var _args8 UserServiceGetUserInfoByTokenArgs _args8.Token = token var _result9 UserServiceGetUserInfoByTokenResult if err = p.Client_().Call(ctx, "getUserInfoByToken", &_args8, &_result9); err != nil { return } return _result9.GetSuccess(), nil } // Parameters: // - Behavior // - UserId // - PropType // - Incr func (p *UserServiceClient) ModifyUserInfoById(ctx context.Context, behavior string, userId int32, propType ModifyPropType, incr int64) (r *Result_, err error) { var _args10 UserServiceModifyUserInfoByIdArgs _args10.Behavior = behavior _args10.UserId = userId _args10.PropType = propType _args10.Incr = incr var _result11 UserServiceModifyUserInfoByIdResult if err = p.Client_().Call(ctx, "modifyUserInfoById", &_args10, &_result11); err != nil { return } return _result11.GetSuccess(), nil } // Parameters: // - UserId // - NewName_ func (p *UserServiceClient) RenameUserById(ctx context.Context, userId int32, NewName string) (r *Result_, err error) { var _args12 UserServiceRenameUserByIdArgs _args12.UserId = userId _args12.NewName_ = NewName var _result13 UserServiceRenameUserByIdResult if err = p.Client_().Call(ctx, "RenameUserById", &_args12, &_result13); err != nil { return } return _result13.GetSuccess(), nil } // Parameters: // - MessageType func (p *UserServiceClient) GetMessage(ctx context.Context, messageType string) (r string, err error) { var _args14 UserServiceGetMessageArgs _args14.MessageType = messageType var _result15 UserServiceGetMessageResult if err = p.Client_().Call(ctx, "getMessage", &_args14, &_result15); err != nil { return } return _result15.GetSuccess(), nil } type UserServiceProcessor struct { processorMap map[string]thrift.TProcessorFunction handler UserService } func (p *UserServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { p.processorMap[key] = processor } func (p *UserServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { processor, ok = p.processorMap[key] return processor, ok } func (p *UserServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { return p.processorMap } func NewUserServiceProcessor(handler UserService) *UserServiceProcessor { self16 := &UserServiceProcessor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)} self16.processorMap["createNewUser"] = &userServiceProcessorCreateNewUser{handler:handler} self16.processorMap["createQQUser"] = &userServiceProcessorCreateQQUser{handler:handler} self16.processorMap["getUserInfoByOpenId"] = &userServiceProcessorGetUserInfoByOpenId{handler:handler} self16.processorMap["getUserInfoById"] = &userServiceProcessorGetUserInfoById{handler:handler} self16.processorMap["getUserInfoByToken"] = &userServiceProcessorGetUserInfoByToken{handler:handler} self16.processorMap["modifyUserInfoById"] = &userServiceProcessorModifyUserInfoById{handler:handler} self16.processorMap["RenameUserById"] = &userServiceProcessorRenameUserById{handler:handler} self16.processorMap["getMessage"] = &userServiceProcessorGetMessage{handler:handler} return self16 } func (p *UserServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { name, _, seqId, err := iprot.ReadMessageBegin() if err != nil { return false, err } if processor, ok := p.GetProcessorFunction(name); ok { return processor.Process(ctx, seqId, iprot, oprot) } iprot.Skip(thrift.STRUCT) iprot.ReadMessageEnd() x17 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function " + name) oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) x17.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, x17 } type userServiceProcessorCreateNewUser struct { handler UserService } func (p *userServiceProcessorCreateNewUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceCreateNewUserArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("createNewUser", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceCreateNewUserResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.CreateNewUser(ctx, args.NickName, args.AvatarAuto, args.Gold); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createNewUser: " + err2.Error()) oprot.WriteMessageBegin("createNewUser", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("createNewUser", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorCreateQQUser struct { handler UserService } func (p *userServiceProcessorCreateQQUser) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceCreateQQUserArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("createQQUser", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceCreateQQUserResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.CreateQQUser(ctx, args.UserInfo); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createQQUser: " + err2.Error()) oprot.WriteMessageBegin("createQQUser", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("createQQUser", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorGetUserInfoByOpenId struct { handler UserService } func (p *userServiceProcessorGetUserInfoByOpenId) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceGetUserInfoByOpenIdArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("getUserInfoByOpenId", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceGetUserInfoByOpenIdResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.GetUserInfoByOpenId(ctx, args.OpenId); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getUserInfoByOpenId: " + err2.Error()) oprot.WriteMessageBegin("getUserInfoByOpenId", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("getUserInfoByOpenId", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorGetUserInfoById struct { handler UserService } func (p *userServiceProcessorGetUserInfoById) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceGetUserInfoByIdArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("getUserInfoById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceGetUserInfoByIdResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.GetUserInfoById(ctx, args.UserId); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getUserInfoById: " + err2.Error()) oprot.WriteMessageBegin("getUserInfoById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("getUserInfoById", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorGetUserInfoByToken struct { handler UserService } func (p *userServiceProcessorGetUserInfoByToken) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceGetUserInfoByTokenArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("getUserInfoByToken", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceGetUserInfoByTokenResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.GetUserInfoByToken(ctx, args.Token); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getUserInfoByToken: " + err2.Error()) oprot.WriteMessageBegin("getUserInfoByToken", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("getUserInfoByToken", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorModifyUserInfoById struct { handler UserService } func (p *userServiceProcessorModifyUserInfoById) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceModifyUserInfoByIdArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("modifyUserInfoById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceModifyUserInfoByIdResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.ModifyUserInfoById(ctx, args.Behavior, args.UserId, args.PropType, args.Incr); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing modifyUserInfoById: " + err2.Error()) oprot.WriteMessageBegin("modifyUserInfoById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("modifyUserInfoById", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorRenameUserById struct { handler UserService } func (p *userServiceProcessorRenameUserById) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceRenameUserByIdArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("RenameUserById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceRenameUserByIdResult{} var retval *Result_ var err2 error if retval, err2 = p.handler.RenameUserById(ctx, args.UserId, args.NewName_); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing RenameUserById: " + err2.Error()) oprot.WriteMessageBegin("RenameUserById", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = retval } if err2 = oprot.WriteMessageBegin("RenameUserById", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } type userServiceProcessorGetMessage struct { handler UserService } func (p *userServiceProcessorGetMessage) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { args := UserServiceGetMessageArgs{} if err = args.Read(iprot); err != nil { iprot.ReadMessageEnd() x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) oprot.WriteMessageBegin("getMessage", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return false, err } iprot.ReadMessageEnd() result := UserServiceGetMessageResult{} var retval string var err2 error if retval, err2 = p.handler.GetMessage(ctx, args.MessageType); err2 != nil { x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getMessage: " + err2.Error()) oprot.WriteMessageBegin("getMessage", thrift.EXCEPTION, seqId) x.Write(oprot) oprot.WriteMessageEnd() oprot.Flush(ctx) return true, err2 } else { result.Success = &retval } if err2 = oprot.WriteMessageBegin("getMessage", thrift.REPLY, seqId); err2 != nil { err = err2 } if err2 = result.Write(oprot); err == nil && err2 != nil { err = err2 } if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { err = err2 } if err2 = oprot.Flush(ctx); err == nil && err2 != nil { err = err2 } if err != nil { return } return true, err } // HELPER FUNCTIONS AND STRUCTURES // Attributes: // - NickName // - AvatarAuto // - Gold type UserServiceCreateNewUserArgs struct { NickName string `thrift:"nickName,1" db:"nickName" json:"nickName"` AvatarAuto string `thrift:"avatarAuto,2" db:"avatarAuto" json:"avatarAuto"` Gold int64 `thrift:"gold,3" db:"gold" json:"gold"` } func NewUserServiceCreateNewUserArgs() *UserServiceCreateNewUserArgs { return &UserServiceCreateNewUserArgs{} } func (p *UserServiceCreateNewUserArgs) GetNickName() string { return p.NickName } func (p *UserServiceCreateNewUserArgs) GetAvatarAuto() string { return p.AvatarAuto } func (p *UserServiceCreateNewUserArgs) GetGold() int64 { return p.Gold } func (p *UserServiceCreateNewUserArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.STRING { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 3: if fieldTypeId == thrift.I64 { if err := p.ReadField3(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceCreateNewUserArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.NickName = v } return nil } func (p *UserServiceCreateNewUserArgs) ReadField2(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { p.AvatarAuto = v } return nil } func (p *UserServiceCreateNewUserArgs) ReadField3(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { p.Gold = v } return nil } func (p *UserServiceCreateNewUserArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("createNewUser_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } if err := p.writeField3(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceCreateNewUserArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("nickName", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:nickName: ", p), err) } if err := oprot.WriteString(string(p.NickName)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.nickName (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:nickName: ", p), err) } return err } func (p *UserServiceCreateNewUserArgs) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("avatarAuto", thrift.STRING, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:avatarAuto: ", p), err) } if err := oprot.WriteString(string(p.AvatarAuto)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.avatarAuto (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:avatarAuto: ", p), err) } return err } func (p *UserServiceCreateNewUserArgs) writeField3(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("gold", thrift.I64, 3); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:gold: ", p), err) } if err := oprot.WriteI64(int64(p.Gold)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.gold (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 3:gold: ", p), err) } return err } func (p *UserServiceCreateNewUserArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceCreateNewUserArgs(%+v)", *p) } // Attributes: // - Success type UserServiceCreateNewUserResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceCreateNewUserResult() *UserServiceCreateNewUserResult { return &UserServiceCreateNewUserResult{} } var UserServiceCreateNewUserResult_Success_DEFAULT *Result_ func (p *UserServiceCreateNewUserResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceCreateNewUserResult_Success_DEFAULT } return p.Success } func (p *UserServiceCreateNewUserResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceCreateNewUserResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceCreateNewUserResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceCreateNewUserResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("createNewUser_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceCreateNewUserResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceCreateNewUserResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceCreateNewUserResult(%+v)", *p) } // Attributes: // - UserInfo type UserServiceCreateQQUserArgs struct { UserInfo *UserInfo `thrift:"UserInfo,1" db:"UserInfo" json:"UserInfo"` } func NewUserServiceCreateQQUserArgs() *UserServiceCreateQQUserArgs { return &UserServiceCreateQQUserArgs{} } var UserServiceCreateQQUserArgs_UserInfo_DEFAULT *UserInfo func (p *UserServiceCreateQQUserArgs) GetUserInfo() *UserInfo { if !p.IsSetUserInfo() { return UserServiceCreateQQUserArgs_UserInfo_DEFAULT } return p.UserInfo } func (p *UserServiceCreateQQUserArgs) IsSetUserInfo() bool { return p.UserInfo != nil } func (p *UserServiceCreateQQUserArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRUCT { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceCreateQQUserArgs) ReadField1(iprot thrift.TProtocol) error { p.UserInfo = &UserInfo{} if err := p.UserInfo.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.UserInfo), err) } return nil } func (p *UserServiceCreateQQUserArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("createQQUser_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceCreateQQUserArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("UserInfo", thrift.STRUCT, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:UserInfo: ", p), err) } if err := p.UserInfo.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.UserInfo), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:UserInfo: ", p), err) } return err } func (p *UserServiceCreateQQUserArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceCreateQQUserArgs(%+v)", *p) } // Attributes: // - Success type UserServiceCreateQQUserResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceCreateQQUserResult() *UserServiceCreateQQUserResult { return &UserServiceCreateQQUserResult{} } var UserServiceCreateQQUserResult_Success_DEFAULT *Result_ func (p *UserServiceCreateQQUserResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceCreateQQUserResult_Success_DEFAULT } return p.Success } func (p *UserServiceCreateQQUserResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceCreateQQUserResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceCreateQQUserResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceCreateQQUserResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("createQQUser_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceCreateQQUserResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceCreateQQUserResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceCreateQQUserResult(%+v)", *p) } // Attributes: // - OpenId type UserServiceGetUserInfoByOpenIdArgs struct { OpenId string `thrift:"openId,1" db:"openId" json:"openId"` } func NewUserServiceGetUserInfoByOpenIdArgs() *UserServiceGetUserInfoByOpenIdArgs { return &UserServiceGetUserInfoByOpenIdArgs{} } func (p *UserServiceGetUserInfoByOpenIdArgs) GetOpenId() string { return p.OpenId } func (p *UserServiceGetUserInfoByOpenIdArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByOpenIdArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.OpenId = v } return nil } func (p *UserServiceGetUserInfoByOpenIdArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoByOpenId_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByOpenIdArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("openId", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:openId: ", p), err) } if err := oprot.WriteString(string(p.OpenId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.openId (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:openId: ", p), err) } return err } func (p *UserServiceGetUserInfoByOpenIdArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByOpenIdArgs(%+v)", *p) } // Attributes: // - Success type UserServiceGetUserInfoByOpenIdResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceGetUserInfoByOpenIdResult() *UserServiceGetUserInfoByOpenIdResult { return &UserServiceGetUserInfoByOpenIdResult{} } var UserServiceGetUserInfoByOpenIdResult_Success_DEFAULT *Result_ func (p *UserServiceGetUserInfoByOpenIdResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceGetUserInfoByOpenIdResult_Success_DEFAULT } return p.Success } func (p *UserServiceGetUserInfoByOpenIdResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceGetUserInfoByOpenIdResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByOpenIdResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceGetUserInfoByOpenIdResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoByOpenId_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByOpenIdResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceGetUserInfoByOpenIdResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByOpenIdResult(%+v)", *p) } // Attributes: // - UserId type UserServiceGetUserInfoByIdArgs struct { UserId int32 `thrift:"userId,1" db:"userId" json:"userId"` } func NewUserServiceGetUserInfoByIdArgs() *UserServiceGetUserInfoByIdArgs { return &UserServiceGetUserInfoByIdArgs{} } func (p *UserServiceGetUserInfoByIdArgs) GetUserId() int32 { return p.UserId } func (p *UserServiceGetUserInfoByIdArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.I32 { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByIdArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.UserId = v } return nil } func (p *UserServiceGetUserInfoByIdArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoById_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByIdArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("userId", thrift.I32, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:userId: ", p), err) } if err := oprot.WriteI32(int32(p.UserId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.userId (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:userId: ", p), err) } return err } func (p *UserServiceGetUserInfoByIdArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByIdArgs(%+v)", *p) } // Attributes: // - Success type UserServiceGetUserInfoByIdResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceGetUserInfoByIdResult() *UserServiceGetUserInfoByIdResult { return &UserServiceGetUserInfoByIdResult{} } var UserServiceGetUserInfoByIdResult_Success_DEFAULT *Result_ func (p *UserServiceGetUserInfoByIdResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceGetUserInfoByIdResult_Success_DEFAULT } return p.Success } func (p *UserServiceGetUserInfoByIdResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceGetUserInfoByIdResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByIdResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceGetUserInfoByIdResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoById_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByIdResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceGetUserInfoByIdResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByIdResult(%+v)", *p) } // Attributes: // - Token type UserServiceGetUserInfoByTokenArgs struct { Token string `thrift:"token,1" db:"token" json:"token"` } func NewUserServiceGetUserInfoByTokenArgs() *UserServiceGetUserInfoByTokenArgs { return &UserServiceGetUserInfoByTokenArgs{} } func (p *UserServiceGetUserInfoByTokenArgs) GetToken() string { return p.Token } func (p *UserServiceGetUserInfoByTokenArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByTokenArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.Token = v } return nil } func (p *UserServiceGetUserInfoByTokenArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoByToken_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByTokenArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("token", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:token: ", p), err) } if err := oprot.WriteString(string(p.Token)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.token (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:token: ", p), err) } return err } func (p *UserServiceGetUserInfoByTokenArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByTokenArgs(%+v)", *p) } // Attributes: // - Success type UserServiceGetUserInfoByTokenResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceGetUserInfoByTokenResult() *UserServiceGetUserInfoByTokenResult { return &UserServiceGetUserInfoByTokenResult{} } var UserServiceGetUserInfoByTokenResult_Success_DEFAULT *Result_ func (p *UserServiceGetUserInfoByTokenResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceGetUserInfoByTokenResult_Success_DEFAULT } return p.Success } func (p *UserServiceGetUserInfoByTokenResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceGetUserInfoByTokenResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetUserInfoByTokenResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceGetUserInfoByTokenResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getUserInfoByToken_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetUserInfoByTokenResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceGetUserInfoByTokenResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetUserInfoByTokenResult(%+v)", *p) } // Attributes: // - Behavior // - UserId // - PropType // - Incr type UserServiceModifyUserInfoByIdArgs struct { Behavior string `thrift:"behavior,1" db:"behavior" json:"behavior"` UserId int32 `thrift:"userId,2" db:"userId" json:"userId"` PropType ModifyPropType `thrift:"propType,3" db:"propType" json:"propType"` Incr int64 `thrift:"incr,4" db:"incr" json:"incr"` } func NewUserServiceModifyUserInfoByIdArgs() *UserServiceModifyUserInfoByIdArgs { return &UserServiceModifyUserInfoByIdArgs{} } func (p *UserServiceModifyUserInfoByIdArgs) GetBehavior() string { return p.Behavior } func (p *UserServiceModifyUserInfoByIdArgs) GetUserId() int32 { return p.UserId } func (p *UserServiceModifyUserInfoByIdArgs) GetPropType() ModifyPropType { return p.PropType } func (p *UserServiceModifyUserInfoByIdArgs) GetIncr() int64 { return p.Incr } func (p *UserServiceModifyUserInfoByIdArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.I32 { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 3: if fieldTypeId == thrift.I32 { if err := p.ReadField3(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 4: if fieldTypeId == thrift.I64 { if err := p.ReadField4(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceModifyUserInfoByIdArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.Behavior = v } return nil } func (p *UserServiceModifyUserInfoByIdArgs) ReadField2(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { p.UserId = v } return nil } func (p *UserServiceModifyUserInfoByIdArgs) ReadField3(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 3: ", err) } else { temp := ModifyPropType(v) p.PropType = temp } return nil } func (p *UserServiceModifyUserInfoByIdArgs) ReadField4(iprot thrift.TProtocol) error { if v, err := iprot.ReadI64(); err != nil { return thrift.PrependError("error reading field 4: ", err) } else { p.Incr = v } return nil } func (p *UserServiceModifyUserInfoByIdArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("modifyUserInfoById_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } if err := p.writeField3(oprot); err != nil { return err } if err := p.writeField4(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceModifyUserInfoByIdArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("behavior", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:behavior: ", p), err) } if err := oprot.WriteString(string(p.Behavior)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.behavior (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:behavior: ", p), err) } return err } func (p *UserServiceModifyUserInfoByIdArgs) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("userId", thrift.I32, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:userId: ", p), err) } if err := oprot.WriteI32(int32(p.UserId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.userId (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:userId: ", p), err) } return err } func (p *UserServiceModifyUserInfoByIdArgs) writeField3(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("propType", thrift.I32, 3); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:propType: ", p), err) } if err := oprot.WriteI32(int32(p.PropType)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.propType (3) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 3:propType: ", p), err) } return err } func (p *UserServiceModifyUserInfoByIdArgs) writeField4(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("incr", thrift.I64, 4); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:incr: ", p), err) } if err := oprot.WriteI64(int64(p.Incr)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.incr (4) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 4:incr: ", p), err) } return err } func (p *UserServiceModifyUserInfoByIdArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceModifyUserInfoByIdArgs(%+v)", *p) } // Attributes: // - Success type UserServiceModifyUserInfoByIdResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceModifyUserInfoByIdResult() *UserServiceModifyUserInfoByIdResult { return &UserServiceModifyUserInfoByIdResult{} } var UserServiceModifyUserInfoByIdResult_Success_DEFAULT *Result_ func (p *UserServiceModifyUserInfoByIdResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceModifyUserInfoByIdResult_Success_DEFAULT } return p.Success } func (p *UserServiceModifyUserInfoByIdResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceModifyUserInfoByIdResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceModifyUserInfoByIdResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceModifyUserInfoByIdResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("modifyUserInfoById_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceModifyUserInfoByIdResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceModifyUserInfoByIdResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceModifyUserInfoByIdResult(%+v)", *p) } // Attributes: // - UserId // - NewName_ type UserServiceRenameUserByIdArgs struct { UserId int32 `thrift:"userId,1" db:"userId" json:"userId"` NewName_ string `thrift:"NewName,2" db:"NewName" json:"NewName"` } func NewUserServiceRenameUserByIdArgs() *UserServiceRenameUserByIdArgs { return &UserServiceRenameUserByIdArgs{} } func (p *UserServiceRenameUserByIdArgs) GetUserId() int32 { return p.UserId } func (p *UserServiceRenameUserByIdArgs) GetNewName_() string { return p.NewName_ } func (p *UserServiceRenameUserByIdArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.I32 { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } case 2: if fieldTypeId == thrift.STRING { if err := p.ReadField2(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceRenameUserByIdArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadI32(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.UserId = v } return nil } func (p *UserServiceRenameUserByIdArgs) ReadField2(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 2: ", err) } else { p.NewName_ = v } return nil } func (p *UserServiceRenameUserByIdArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("RenameUserById_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } if err := p.writeField2(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceRenameUserByIdArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("userId", thrift.I32, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:userId: ", p), err) } if err := oprot.WriteI32(int32(p.UserId)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.userId (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:userId: ", p), err) } return err } func (p *UserServiceRenameUserByIdArgs) writeField2(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("NewName", thrift.STRING, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:NewName: ", p), err) } if err := oprot.WriteString(string(p.NewName_)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.NewName (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:NewName: ", p), err) } return err } func (p *UserServiceRenameUserByIdArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceRenameUserByIdArgs(%+v)", *p) } // Attributes: // - Success type UserServiceRenameUserByIdResult struct { Success *Result_ `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceRenameUserByIdResult() *UserServiceRenameUserByIdResult { return &UserServiceRenameUserByIdResult{} } var UserServiceRenameUserByIdResult_Success_DEFAULT *Result_ func (p *UserServiceRenameUserByIdResult) GetSuccess() *Result_ { if !p.IsSetSuccess() { return UserServiceRenameUserByIdResult_Success_DEFAULT } return p.Success } func (p *UserServiceRenameUserByIdResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceRenameUserByIdResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRUCT { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceRenameUserByIdResult) ReadField0(iprot thrift.TProtocol) error { p.Success = &Result_{} if err := p.Success.Read(iprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) } return nil } func (p *UserServiceRenameUserByIdResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("RenameUserById_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceRenameUserByIdResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := p.Success.Write(oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceRenameUserByIdResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceRenameUserByIdResult(%+v)", *p) } // Attributes: // - MessageType type UserServiceGetMessageArgs struct { MessageType string `thrift:"messageType,1" db:"messageType" json:"messageType"` } func NewUserServiceGetMessageArgs() *UserServiceGetMessageArgs { return &UserServiceGetMessageArgs{} } func (p *UserServiceGetMessageArgs) GetMessageType() string { return p.MessageType } func (p *UserServiceGetMessageArgs) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 1: if fieldTypeId == thrift.STRING { if err := p.ReadField1(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetMessageArgs) ReadField1(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 1: ", err) } else { p.MessageType = v } return nil } func (p *UserServiceGetMessageArgs) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getMessage_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetMessageArgs) writeField1(oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin("messageType", thrift.STRING, 1); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:messageType: ", p), err) } if err := oprot.WriteString(string(p.MessageType)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.messageType (1) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:messageType: ", p), err) } return err } func (p *UserServiceGetMessageArgs) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetMessageArgs(%+v)", *p) } // Attributes: // - Success type UserServiceGetMessageResult struct { Success *string `thrift:"success,0" db:"success" json:"success,omitempty"` } func NewUserServiceGetMessageResult() *UserServiceGetMessageResult { return &UserServiceGetMessageResult{} } var UserServiceGetMessageResult_Success_DEFAULT string func (p *UserServiceGetMessageResult) GetSuccess() string { if !p.IsSetSuccess() { return UserServiceGetMessageResult_Success_DEFAULT } return *p.Success } func (p *UserServiceGetMessageResult) IsSetSuccess() bool { return p.Success != nil } func (p *UserServiceGetMessageResult) Read(iprot thrift.TProtocol) error { if _, err := iprot.ReadStructBegin(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) } for { _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() if err != nil { return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) } if fieldTypeId == thrift.STOP { break; } switch fieldId { case 0: if fieldTypeId == thrift.STRING { if err := p.ReadField0(iprot); err != nil { return err } } else { if err := iprot.Skip(fieldTypeId); err != nil { return err } } default: if err := iprot.Skip(fieldTypeId); err != nil { return err } } if err := iprot.ReadFieldEnd(); err != nil { return err } } if err := iprot.ReadStructEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) } return nil } func (p *UserServiceGetMessageResult) ReadField0(iprot thrift.TProtocol) error { if v, err := iprot.ReadString(); err != nil { return thrift.PrependError("error reading field 0: ", err) } else { p.Success = &v } return nil } func (p *UserServiceGetMessageResult) Write(oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin("getMessage_result"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField0(oprot); err != nil { return err } } if err := oprot.WriteFieldStop(); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil } func (p *UserServiceGetMessageResult) writeField0(oprot thrift.TProtocol) (err error) { if p.IsSetSuccess() { if err := oprot.WriteFieldBegin("success", thrift.STRING, 0); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } if err := oprot.WriteString(string(*p.Success)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.success (0) field write error: ", p), err) } if err := oprot.WriteFieldEnd(); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } } return err } func (p *UserServiceGetMessageResult) String() string { if p == nil { return "" } return fmt.Sprintf("UserServiceGetMessageResult(%+v)", *p) } ================================================ FILE: common/api/thrift/gen-go/rpc/user_service-remote/user_service-remote.go ================================================ // Autogenerated by Thrift Compiler (0.12.0) // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING package main import ( "context" "flag" "fmt" "math" "net" "net/url" "os" "strconv" "strings" "github.com/apache/thrift/lib/go/thrift" "rpc" ) func Usage() { fmt.Fprintln(os.Stderr, "Usage of ", os.Args[0], " [-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:") flag.PrintDefaults() fmt.Fprintln(os.Stderr, "\nFunctions:") fmt.Fprintln(os.Stderr, " Result createNewUser(string nickName, string avatarAuto, i64 gold)") fmt.Fprintln(os.Stderr, " Result createQQUser(UserInfo UserInfo)") fmt.Fprintln(os.Stderr, " Result getUserInfoByOpenId(string openId)") fmt.Fprintln(os.Stderr, " Result getUserInfoById(i32 userId)") fmt.Fprintln(os.Stderr, " Result getUserInfoByToken(string token)") fmt.Fprintln(os.Stderr, " Result modifyUserInfoById(string behavior, i32 userId, ModifyPropType propType, i64 incr)") fmt.Fprintln(os.Stderr, " Result RenameUserById(i32 userId, string NewName)") fmt.Fprintln(os.Stderr, " string getMessage(string messageType)") fmt.Fprintln(os.Stderr) os.Exit(0) } type httpHeaders map[string]string func (h httpHeaders) String() string { var m map[string]string = h return fmt.Sprintf("%s", m) } func (h httpHeaders) Set(value string) error { parts := strings.Split(value, ": ") if len(parts) != 2 { return fmt.Errorf("header should be of format 'Key: Value'") } h[parts[0]] = parts[1] return nil } func main() { flag.Usage = Usage var host string var port int var protocol string var urlString string var framed bool var useHttp bool headers := make(httpHeaders) var parsedUrl *url.URL var trans thrift.TTransport _ = strconv.Atoi _ = math.Abs flag.Usage = Usage flag.StringVar(&host, "h", "localhost", "Specify host and port") flag.IntVar(&port, "p", 9090, "Specify port") flag.StringVar(&protocol, "P", "binary", "Specify the protocol (binary, compact, simplejson, json)") flag.StringVar(&urlString, "u", "", "Specify the url") flag.BoolVar(&framed, "framed", false, "Use framed transport") flag.BoolVar(&useHttp, "http", false, "Use http") flag.Var(headers, "H", "Headers to set on the http(s) request (e.g. -H \"Key: Value\")") flag.Parse() if len(urlString) > 0 { var err error parsedUrl, err = url.Parse(urlString) if err != nil { fmt.Fprintln(os.Stderr, "Error parsing URL: ", err) flag.Usage() } host = parsedUrl.Host useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == "http" || parsedUrl.Scheme == "https" } else if useHttp { _, err := url.Parse(fmt.Sprint("http://", host, ":", port)) if err != nil { fmt.Fprintln(os.Stderr, "Error parsing URL: ", err) flag.Usage() } } cmd := flag.Arg(0) var err error if useHttp { trans, err = thrift.NewTHttpClient(parsedUrl.String()) if len(headers) > 0 { httptrans := trans.(*thrift.THttpClient) for key, value := range headers { httptrans.SetHeader(key, value) } } } else { portStr := fmt.Sprint(port) if strings.Contains(host, ":") { host, portStr, err = net.SplitHostPort(host) if err != nil { fmt.Fprintln(os.Stderr, "error with host:", err) os.Exit(1) } } trans, err = thrift.NewTSocket(net.JoinHostPort(host, portStr)) if err != nil { fmt.Fprintln(os.Stderr, "error resolving address:", err) os.Exit(1) } if framed { trans = thrift.NewTFramedTransport(trans) } } if err != nil { fmt.Fprintln(os.Stderr, "Error creating transport", err) os.Exit(1) } defer trans.Close() var protocolFactory thrift.TProtocolFactory switch protocol { case "compact": protocolFactory = thrift.NewTCompactProtocolFactory() break case "simplejson": protocolFactory = thrift.NewTSimpleJSONProtocolFactory() break case "json": protocolFactory = thrift.NewTJSONProtocolFactory() break case "binary", "": protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() break default: fmt.Fprintln(os.Stderr, "Invalid protocol specified: ", protocol) Usage() os.Exit(1) } iprot := protocolFactory.GetProtocol(trans) oprot := protocolFactory.GetProtocol(trans) client := rpc.NewUserServiceClient(thrift.NewTStandardClient(iprot, oprot)) if err := trans.Open(); err != nil { fmt.Fprintln(os.Stderr, "Error opening socket to ", host, ":", port, " ", err) os.Exit(1) } switch cmd { case "createNewUser": if flag.NArg() - 1 != 3 { fmt.Fprintln(os.Stderr, "CreateNewUser requires 3 args") flag.Usage() } argvalue0 := flag.Arg(1) value0 := argvalue0 argvalue1 := flag.Arg(2) value1 := argvalue1 argvalue2, err20 := (strconv.ParseInt(flag.Arg(3), 10, 64)) if err20 != nil { Usage() return } value2 := argvalue2 fmt.Print(client.CreateNewUser(context.Background(), value0, value1, value2)) fmt.Print("\n") break case "createQQUser": if flag.NArg() - 1 != 1 { fmt.Fprintln(os.Stderr, "CreateQQUser requires 1 args") flag.Usage() } arg21 := flag.Arg(1) mbTrans22 := thrift.NewTMemoryBufferLen(len(arg21)) defer mbTrans22.Close() _, err23 := mbTrans22.WriteString(arg21) if err23 != nil { Usage() return } factory24 := thrift.NewTJSONProtocolFactory() jsProt25 := factory24.GetProtocol(mbTrans22) argvalue0 := rpc.NewUserInfo() err26 := argvalue0.Read(jsProt25) if err26 != nil { Usage() return } value0 := argvalue0 fmt.Print(client.CreateQQUser(context.Background(), value0)) fmt.Print("\n") break case "getUserInfoByOpenId": if flag.NArg() - 1 != 1 { fmt.Fprintln(os.Stderr, "GetUserInfoByOpenId requires 1 args") flag.Usage() } argvalue0 := flag.Arg(1) value0 := argvalue0 fmt.Print(client.GetUserInfoByOpenId(context.Background(), value0)) fmt.Print("\n") break case "getUserInfoById": if flag.NArg() - 1 != 1 { fmt.Fprintln(os.Stderr, "GetUserInfoById requires 1 args") flag.Usage() } tmp0, err28 := (strconv.Atoi(flag.Arg(1))) if err28 != nil { Usage() return } argvalue0 := int32(tmp0) value0 := argvalue0 fmt.Print(client.GetUserInfoById(context.Background(), value0)) fmt.Print("\n") break case "getUserInfoByToken": if flag.NArg() - 1 != 1 { fmt.Fprintln(os.Stderr, "GetUserInfoByToken requires 1 args") flag.Usage() } argvalue0 := flag.Arg(1) value0 := argvalue0 fmt.Print(client.GetUserInfoByToken(context.Background(), value0)) fmt.Print("\n") break case "modifyUserInfoById": if flag.NArg() - 1 != 4 { fmt.Fprintln(os.Stderr, "ModifyUserInfoById requires 4 args") flag.Usage() } argvalue0 := flag.Arg(1) value0 := argvalue0 tmp1, err31 := (strconv.Atoi(flag.Arg(2))) if err31 != nil { Usage() return } argvalue1 := int32(tmp1) value1 := argvalue1 tmp2, err := (strconv.Atoi(flag.Arg(3))) if err != nil { Usage() return } argvalue2 := rpc.ModifyPropType(tmp2) value2 := argvalue2 argvalue3, err32 := (strconv.ParseInt(flag.Arg(4), 10, 64)) if err32 != nil { Usage() return } value3 := argvalue3 fmt.Print(client.ModifyUserInfoById(context.Background(), value0, value1, value2, value3)) fmt.Print("\n") break case "RenameUserById": if flag.NArg() - 1 != 2 { fmt.Fprintln(os.Stderr, "RenameUserById requires 2 args") flag.Usage() } tmp0, err33 := (strconv.Atoi(flag.Arg(1))) if err33 != nil { Usage() return } argvalue0 := int32(tmp0) value0 := argvalue0 argvalue1 := flag.Arg(2) value1 := argvalue1 fmt.Print(client.RenameUserById(context.Background(), value0, value1)) fmt.Print("\n") break case "getMessage": if flag.NArg() - 1 != 1 { fmt.Fprintln(os.Stderr, "GetMessage requires 1 args") flag.Usage() } argvalue0 := flag.Arg(1) value0 := argvalue0 fmt.Print(client.GetMessage(context.Background(), value0)) fmt.Print("\n") break case "": Usage() break default: fmt.Fprintln(os.Stderr, "Invalid function ", cmd) } } ================================================ FILE: common/conf/account.conf ================================================ ;[dev] account_host=127.0.0.1 account_port=4000 account_aes_key=bb6c59d065966e6236fcc635f88f8543 ;日志 log_path=./logs/account.log log_level=debug ;mysql mycat或mysql配置 mysql_addr=localhost:3306 mysql_user=root mysql_password=root mysql_db=fish ;redis cluster 集群配置 redis_addrs=127.0.0.1:7000;127.0.0.1:7001;127.0.0.1:7002;127.0.0.1:8000;127.0.0.1:8001;127.0.0.1:8002 redis_key_prefix=fish_ ================================================ FILE: common/conf/game.conf ================================================ ;[dev] game_host=127.0.0.1 game_port=4002 ;日志 log_path=./logs/game.log log_level=debug ================================================ FILE: common/conf/hall.conf ================================================ ;[dev] hall_host=127.0.0.1 hall_port=9000 hall_secret=7Cw2ALPkht676IUB ;日志 log_path=./logs/hall.log log_level=debug version=20190101 app_id=01673379 app_key=c18b1b56f2f88ef423bfeadbad9a816c redirect_uri=http://fish.blzz.shop/qq/message ================================================ FILE: common/conf/traces.json ================================================ { "201": [[[-548, 1002], [1914, -390]], [[-548, 1002], [1914, -312]], [[-548, 1002], [1914, -234]], [[-548, 1080], [1914, -390]], [[-548, 1080], [1914, -312]], [[-548, 1080], [1914, -234]]], "202": [[[-548, 1158], [1914, -390]], [[-548, 1158], [1914, -312]], [[-548, 1158], [1914, -234]]], "203": [[[1914, -390], [-548, 1002]], [[1914, -390], [-548, 1080]], [[1914, -390], [-548, 1158]]], "204": [[[1914, -312], [-548, 1002]], [[1914, -312], [-548, 1080]], [[1914, -312], [-548, 1158]]], "205": [[[1914, -234], [-548, 1002]], [[1914, -234], [-548, 1080]], [[1914, -234], [-548, 1158]]], "206": [[[-548, 362], [1914, 412]], [[-548, 462], [1914, 384]], [[-548, 462], [1914, 306]]], "207": [[[-548, 384], [1914, 462]], [[-548, 304], [1914, 384]], [[-548, 384], [1914, 306]]], "208": [[[-548, 406], [1914, 462]], [[-548, 326], [1914, 384]], [[-548, 306], [1914, 366]]], "209": [[[1914, 462], [-548, 462]], [[1914, 462], [-548, 384]], [[1914, 462], [-548, 306]]], "210": [[[1914, 384], [-548, 462]], [[1914, 384], [-548, 384]], [[1914, 384], [-548, 306]]], "211": [[[1914, 306], [-548, 462]], [[1914, 306], [-548, 384]], [[1914, 306], [-548, 306]]], "212": [[[-548, -390], [1914, 1002]], [[-548, -390], [1914, 1080]], [[-548, -624], [1914, 1158]]], "213": [[[-548, -312], [1914, 1002]], [[-548, -312], [1914, 1080]], [[-548, -312], [1914, 1158]]], "214": [[[-548, -234], [1914, 1002]], [[-548, -234], [1914, 1080]], [[-548, -234], [1914, 1158]]], "215": [[[1914, 1002], [-548, -390]], [[1914, 1002], [-548, -312]], [[1914, 1002], [-548, -234]]], "216": [[[1914, 1080], [-548, -390]], [[1914, 1080], [-548, -312]], [[1914, 1080], [-548, -234]]], "217": [[[1914, 1158], [-548, -390]], [[1914, 1158], [-548, -312]], [[1914, 1158], [-548, -234]]], "1": [[[10, -500], [0, 768], [2000, 1268]], [[50, -500], [0, 768], [2000, 1268]], [[210, -500], [0, 768], [2000, 1268]], [[250, -500], [0, 768], [2000, 1268]]], "2": [[[2000, -500], [0, 768], [10, 1268]], [[2100, -500], [0, 768], [10, 1268]], [[2150, -500], [0, 768], [10, 1268]], [[2200, -500], [0, 768], [10, 1268]]], "3": [[[-500, 10], [0, 768], [1866, 384]], [[-500, 110], [0, 768], [1866, 484]], [[-500, 210], [0, 768], [1866, 584]], [[-500, 310], [0, 68], [1866, 684]], [[-500, 410], [0, 768], [1866, 784]]], "4": [[[10, 1268], [0, 0], [2083, -500]], [[30, 1268], [0, 0], [2083, -500]]], "5": [[[70, 1268], [0, 0], [1783, -500]], [[110, 1268], [0, 0], [1783, -500]], [[170, 1268], [0, 0], [1783, -500]], [[210, 1268], [0, 0], [1783, -500]]], "6": [[[610, 1268], [0, 0], [1283, -500]], [[710, 1268], [0, 0], [1383, -500]]], "7": [[[1866, 10], [1366, 768], [-500, 384]], [[1866, 110], [1366, 768], [-500, 484]], [[1866, 210], [1366, 768], [-500, 584]], [[1866, 310], [1366, 768], [-500, 684]], [[1866, 410], [1366, 768], [-500, 784]]], "8": [[[60, 1268], [1366, 384], [60, -500]], [[160, 1268], [1366, 384], [160, -500]], [[260, 1268], [1366, 384], [260, -500]], [[360, 1268], [1366, 384], [360, -500]], [[460, 1268], [1366, 384], [460, -500]], [[560, 1268], [1366, 384], [560, -500]], [[660, 1268], [1366, 384], [660, -500]], [[860, 1268], [0, 384], [860, -500]], [[960, 1268], [0, 384], [960, -500]]], "9": [[[1060, 1268], [0, 384], [1060, -500]], [[1160, 1268], [0, 384], [1160, -500]], [[1260, 1268], [0, 384], [1260, -500]]], "10": [[[-500, 60], [683, 768], [1866, 60]], [[-500, 160], [683, 768], [1866, 160]], [[-500, 260], [683, 768], [1866, 260]], [[-500, 360], [683, 768], [1866, 360]], [[-500, 460], [683, 0], [1866, 460]], [[-500, 560], [683, 0], [1866, 560]], [[-500, 660], [683, 0], [1866, 660]], [[-500, 760], [683, 0], [1866, 760]]], "101": [[[-100, 384], [800, 1384], [566, -616], [1466, 384]], [[1466, 384], [566, -616], [800, 1384], [-100, 384]]], "102": [[[683, 868], [1866, 284], [-500, 484], [683, -100]], [[683, -100], [-500, 484], [1866, 284], [683, 868]]], "103": [[[-68, -38], [0, 1368], [1366, -600], [1434, 806]], [[1434, 806], [1366, -600], [0, 1368], [-68, -38]]], "104": [[[-68, -238], [0, 1168], [1366, -800], [1434, 606]], [[1366, 606], [1366, -800], [0, 1168], [-68, -238]]], "105": [[[483, 868], [1666, 284], [-700, 484], [483, -100]], [[483, -100], [-700, 484], [1666, 284], [483, 868]]], "106": [[[-100, 284], [800, 1284], [566, -716], [1466, 284]], [[1466, 284], [566, -716], [800, 1284], [-100, 284]]], "107": [[[-68, 162], [0, 1568], [1366, -400], [1434, 1006]], [[1434, 1006], [1366, -400], [0, 1568], [-68, 162]]], "108": [[[883, 868], [2066, 284], [-300, 484], [883, -100]], [[883, -100], [-300, 484], [2066, 284], [883, 868]]], "109": [[[-100, 484], [800, 1484], [566, -516], [1466, 484]], [[1466, 484], [566, -516], [800, 1484], [-100, 484]]], "110": [[[-68, -38], [1200, 1368], [166, -600], [1434, 806]], [[1434, 851], [166, -600], [1200, 1368], [-68, -38]]] } ================================================ FILE: common/tools/aes.go ================================================ package tools import ( "crypto/aes" "crypto/cipher" "fmt" "encoding/hex" ) func NewAesTool(appSecret string) (aesTool *AesEncrypt,err error) { if len(appSecret) <16 { err = fmt.Errorf("invalid param appsecret of %s",appSecret) return } aesTool = &AesEncrypt{AppSecret:appSecret} return } type AesEncrypt struct { AppSecret string } func (p *AesEncrypt) getKey() []byte { strKey := p.AppSecret keyLen := len(strKey) if keyLen < 16 { panic("res key 长度不能小于16") } arrKey := []byte(strKey) if keyLen >= 32 { //取前32个字节 return arrKey[:32] } if keyLen >= 24 { //取前24个字节 return arrKey[:24] } //取前16个字节 return arrKey[:16] } //加密字符串 func (p *AesEncrypt) Encrypt(strMesg string) (string, error) { key := p.getKey() var iv = []byte(key)[:aes.BlockSize] encrypted := make([]byte, len(strMesg)) aesBlockEncrypter, err := aes.NewCipher(key) if err != nil { return "", err } aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv) aesEncrypter.XORKeyStream(encrypted, []byte(strMesg)) encodeString := fmt.Sprintf("%x",encrypted) //encodeString := base64.StdEncoding.EncodeToString([]byte(encrypted)) return encodeString, nil } //解密字符串 func (p *AesEncrypt) Decrypt(aesEncryptString string) (strDesc string, err error) { src, err := hex.DecodeString(aesEncryptString) //src, err := base64.StdEncoding.DecodeString(aesEncryptString) if err != nil { return } defer func() { //错误处理 if e := recover(); e != nil { err = e.(error) } }() key := p.getKey() var iv = []byte(key)[:aes.BlockSize] decrypted := make([]byte, len(src)) var aesBlockDecrypter cipher.Block aesBlockDecrypter, err = aes.NewCipher([]byte(key)) if err != nil { return "", err } aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv) aesDecrypter.XORKeyStream(decrypted, src) return string(decrypted), nil } ================================================ FILE: common/tools/call_rpc.go ================================================ package tools import ( "fish/common/api/thrift/gen-go/rpc" "fmt" "github.com/apache/thrift/lib/go/thrift" "net" ) func GetRpcClient(host,port string) (client *rpc.UserServiceClient, closeTransport func() error, err error) { var transport thrift.TTransport transport, err = thrift.NewTSocket(net.JoinHostPort(host,port)) if err != nil { err = fmt.Errorf("NewTSocket failed. err: [%v]\n", err) return } transport, err = thrift.NewTBufferedTransportFactory(8192).GetTransport(transport) if err != nil { err = fmt.Errorf("NewTransport failed. err: [%v]\n", err) return } closeTransport = transport.Close if err = transport.Open(); err != nil { err = fmt.Errorf("Transport.Open failed. err: [%v]\n", err) return } protocolFactory := thrift.NewTCompactProtocolFactory() iprot := protocolFactory.GetProtocol(transport) oprot := protocolFactory.GetProtocol(transport) client = rpc.NewUserServiceClient(thrift.NewTStandardClient(iprot, oprot)) return } ================================================ FILE: common/tools/snowFlake.go ================================================ package tools import ( "errors" "sync" "time" ) const ( nodeBits uint8 = 10 stepBits uint8 = 12 nodeMax int64 = -1 ^ (-1 << nodeBits) stepMax int64 = -1 ^ (-1 << stepBits) timeShift uint8 = nodeBits + stepBits nodeShift uint8 = stepBits ) var ( Epoch int64 = 1546272000000 ) type Node struct { mu sync.Mutex timestamp int64 node int64 step int64 GenerateChan chan int64 stop chan bool } func GenerateUid(nodeNum int64) (err error, generateChan <-chan int64) { var node *Node if node, err = NewNode(nodeNum);err == nil { generateChan = node.GenerateChan go node.run() return } return } func (n *Node) run() { for { n.GenerateChan <- n.Generate() } } func NewNode(nodeNum int64) (*Node, error) { if nodeNum < 0 || nodeNum > nodeMax { return nil, errors.New("Node number must be between 0 and 1023") } return &Node{ timestamp: 0, node: nodeNum, step: 0, GenerateChan: make(chan int64), stop: make(chan bool), }, nil } func (n *Node) Generate() int64 { n.mu.Lock() defer n.mu.Unlock() now := time.Now().UnixNano() / 1e6 if n.timestamp == now { n.step++ if n.step > stepMax { for now <= n.timestamp { now = time.Now().UnixNano() / 1e6 } n.step = 0 } } else { n.timestamp = now n.step = 0 } return (now-Epoch)<= FishKind23 && fish.FishKind <= FishKind26 { //一网打尽 killedFishes = c.Room.getAllInOne(fish) } else if fish.FishKind >= FishKind31 && fish.FishKind <= FishKind33 { killedFishes = c.Room.getSameFish(fish) } //加钱 addScore := 0 for _, fish := range killedFishes { addScore += GetFishMulti(fish) * GetBulletMulti(bullet.BulletKind) * c.Room.Conf.BaseScore } //if addScore > c.Room.Conf.BaseScore*200 { //不允许超过200倍 // logs.Error("user %v catch fish kind [%v] add score = %v,base score = %v ,beyond 200 time of base score...", c.UserInfo.UserId, fish.FishKind, addScore, c.Room.Conf.BaseScore) // addScore = c.Room.Conf.BaseScore * 200 //} c.UserInfo.Score += addScore c.UserInfo.Bill += addScore //记账 //todo %1的概率获取冰冻道具 rand.Seed(time.Now().UnixNano()) item := "" if rand.Intn(100) == 0 { item = "ice" } fishes := make([]string, 0) for _, fish := range killedFishes { fishes = append(fishes, strconv.Itoa(int(fish.FishId))) } catchFishAddScore, _ := strconv.ParseFloat(fmt.Sprintf("%.5f", float64(addScore)/1000), 64) catchResult := []interface{}{"catch_fish_reply", map[string]interface{}{ "userId": c.UserInfo.UserId, "chairId": bullet.ChairId, "bulletId": bullet.BulletId, "fishId": strings.Join(fishes, ","), "addScore": catchFishAddScore, "item": item, }} c.Room.broadcast(catchResult) //logs.Debug("catch fish add score %v,catchFishAddScore %v", addScore, catchFishAddScore) for _, fish := range killedFishes { delete(c.Room.AliveFish, fish.FishId) } } else { //logs.Debug("hit fish failed...") } } else { logs.Debug("user [%v] catch fish fishId [%v] not in alive fish array...", c.UserInfo.UserId, fishId) } } else { logs.Debug("user [%v] catch fish bullet [%v] belong to user [%v] ...", c.UserInfo.UserId, bullet.BulletId, bullet.UserId) } delete(c.Room.AliveBullet, bulletId) } else { //客户端会多传命中,愚蠢的客户端 //logs.Debug("user [%v] catch fish bullet [%v] not exists ...", c.UserInfo.UserId, bulletId) } } func (c *Client) frozenScene(startTime time.Time) { //冰冻屏幕 if c.Room.FrozenEndTime.Unix() > time.Now().Unix() { return } logs.Debug("frozenScene") c.Room.Status = GameStatusFrozen c.Room.Utils.StopBuildFish <- true c.Room.FrozenEndTime = startTime.Add(time.Second * 10) cutDown := c.Room.FrozenEndTime.Sub(time.Now()) replyData := []interface{}{"user_frozen_reply", map[string]time.Duration{"cutDownTime": cutDown / 1e6}} c.sendToOthers(replyData) c.Room.frozenEndTimer = time.After(cutDown) } func (c *Client) exitRoom() { delete(c.Room.Users, c.UserInfo.UserId) //todo 持久化结算 } func (c *Client) clearBill() { go func(userId UserId, bill int, roomId RoomId, power float64) { if client, closeTransportHandler, err := tools.GetRpcClient(common.GameConf.AccountHost, strconv.Itoa(common.GameConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() if res, err := client.ModifyUserInfoById(context.Background(), "FISH_GAME_MODIFY", int32(userId), rpc.ModifyPropType_gems, int64(bill)); err == nil { if res.Code == rpc.ErrorCode_Success { logs.Debug("user [%v] clear bill success :in room [%v] fish game , add score : %v", userId, roomId, int64(bill)) } else { logs.Debug("user [%v] clear bill failed :in room [%v] fish game , add score : %v,err code = %v", userId, roomId, int64(bill), res.Code) } } else { logs.Error("user [%v] clearBill [%v] err: %v", userId, bill, err) } if res, err := client.ModifyUserInfoById(context.Background(), "FISH_GAME_MODIFY", int32(userId), rpc.ModifyPropType_power, int64(power)); err == nil { if res.Code == rpc.ErrorCode_Success { logs.Debug("user [%v] clear power success :in room [%v] fish game , add power : %v", userId, roomId, int64(power)) } else { logs.Debug("user [%v] clear power failed :in room [%v] fish game , add power : %v,err code = %v", userId, roomId, int64(power), res.Code) } } else { logs.Error("user [%v] clearBill [%v] err: %v", userId, bill, err) } } }(c.UserInfo.UserId, c.UserInfo.Bill, c.Room.RoomId, c.UserInfo.Power*1000) // 不允许其他协程修改client,默认结算成功。如果需要确认,可以在房间加结算消息chan。 c.UserInfo.Bill = 0 } ================================================ FILE: game/service/define.go ================================================ package service import ( "encoding/json" "fmt" "io" "os" "strconv" ) /* // 座位号 ------------- 0 1 2 7 3 6 5 4 ------------- */ var ( SwitchSceneTimer = 60 * 5 // 5分钟切一次场景 //鱼阵场景 SceneKind1 = 0 SceneKind2 = 1 SceneKind3 = 2 SceneKind4 = 3 SceneKind5 = 4 SceneKind6 = 5 SceneKind7 = 6 SceneKind8 = 7 //鱼的种类 FishKind1 = 1 FishKind2 = 2 FishKind3 = 3 FishKind4 = 4 FishKind5 = 5 FishKind6 = 6 FishKind7 = 7 FishKind8 = 8 FishKind9 = 9 FishKind10 = 10 FishKind11 = 11 FishKind12 = 12 FishKind13 = 13 FishKind14 = 14 FishKind15 = 15 FishKind16 = 16 FishKind17 = 17 FishKind18 = 18 FishKind19 = 19 FishKind20 = 20 FishKind21 = 21 FishKind22 = 22 FishKind23 = 23 // 一网打尽 FishKind24 = 24 // 一网打尽 FishKind25 = 25 // 一网打尽 FishKind26 = 26 // 一网打尽 FishKind27 = 27 FishKind28 = 28 FishKind29 = 29 FishKind30 = 30 // 全屏炸弹 FishKind31 = 31 // 同类炸弹 FishKind32 = 32 // 同类炸弹 FishKind33 = 33 // 同类炸弹 FishKind34 = 34 FishKind35 = 35 FishMulti = map[int]int{ 1: 2, 2: 2, 3: 3, 4: 4, 5: 5, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 18, 15: 25, 16: 30, 17: 35, 18: 40, 19: 45, 20: 50, 21: 80, 22: 100, 23: 45, //45-150, // 一网打尽 24: 45, //45-150, // 一网打尽 25: 45, //45-150, // 一网打尽 26: 45, //45-150, // 一网打尽 27: 50, 28: 60, 29: 70, 30: 100, // 全屏炸弹 31: 110, // 同类炸弹 32: 110, // 同类炸弹 33: 110, // 同类炸弹 34: 120, 35: 200, } BulletKind = map[string]int{ "bullet_kind_normal_1": 0, "bullet_kind_normal_2": 1, "bullet_kind_normal_3": 2, "bullet_kind_vip1_1": 3, "bullet_kind_vip1_2": 4, "bullet_kind_vip1_3": 5, "bullet_kind_vip2_1": 6, "bullet_kind_vip2_2": 7, "bullet_kind_vip2_3": 8, "bullet_kind_vip3_1": 9, "bullet_kind_vip3_2": 10, "bullet_kind_vip3_3": 11, "bullet_kind_vip4_1": 12, "bullet_kind_vip4_2": 13, "bullet_kind_vip4_3": 14, "bullet_kind_vip5_1": 15, "bullet_kind_vip5_2": 16, "bullet_kind_vip5_3": 17, "bullet_kind_vip6_1": 19, "bullet_kind_vip6_2": 20, "bullet_kind_vip6_3": 21, "bullet_kind_laser": 22, } BulletMulti = map[int]int{ 1: 1, 2: 2, 3: 3, 4: 1, 5: 3, 6: 5, 7: 1, 8: 3, 9: 5, 10: 1, 11: 3, 12: 5, 13: 1, 14: 3, 15: 5, 16: 1, 17: 3, 18: 5, 19: 1, 20: 3, 21: 5, 22: 1, // 激光炮 } ) const ( //SUB_S_GAME_CONFIG = "SUB_S_GAME_CONFIG" //SUB_S_FISH_TRACE = "SUB_S_FISH_TRACE" //SUB_S_EXCHANGE_FISHSCORE = "SUB_S_FISH_TRACE" //SUB_S_USER_FIRE = "SUB_S_FISH_TRACE" //SUB_S_CATCH_FISH = "SUB_S_FISH_TRACE" //SUB_S_BULLET_ION_TIMEOUT = "SUB_S_BULLET_ION_TIMEOUT" //SUB_S_LOCK_TIMEOUT = "SUB_S_LOCK_TIMEOUT" //SUB_S_CATCH_SWEEP_FISH = "SUB_S_CATCH_SWEEP_FISH" //SUB_S_CATCH_SWEEP_FISH_RESULT = "SUB_S_CATCH_SWEEP_FISH_RESULT" //SUB_S_HIT_FISH_LK = "SUB_S_HIT_FISH_LK" //SUB_S_SWITCH_SCENE = "SUB_S_SWITCH_SCENE" //SUB_S_STOCK_OPERATE_RESULT = 111 //库存操作 //SUB_S_SCENE_END = 112 //场景结束 //SUB_S_CATCH_FISHRESULT = 113 //捉鱼结果 //SUB_S_SETTLE_FISHSCORE = 114 //解决鱼分数 //SUB_S_SWIM_SCENE = 115 //游泳场景 //SUB_S_SPECIAL_PRICE1 = 116 //特价1 //SUB_S_ADD_PRICE1_SCORE = 117 //添加价格分数 //SUB_S_END_SPECIAL1 = 118 //结束特别 //SUB_S_SPECIAL_PRICE2 = 119 //SUB_S_UPDATE_POS = 120 //SUB_S_END_SPECIAL2 = 121 //SUB_S_SPECIAL_PRICE3 = 122 //SUB_S_END_SPECIAL3 = 123 //SUB_S_LOCK_FISH = 124 //锁定鱼 //SUB_S_BLACK_LIST = 125 //黑名单 //SUB_S_WHITE_LIST = 126 //白名单 //SUB_S_BIGFISH_LIST = 127 //大鱼名单 //SUB_S_LINE_TRACE = 128 //线追踪 //SUB_S_SHOAL_TRACE = 129 //浅追踪 //基础分值,底分 GameBaseScore = 1 //最小携带金币 MinHaveScore = 1 //最大携带金币 MaxHaveScore = 100 //抽水比例,千分比,5代表千分之5 TaxRatio = 5 ) var pathMap = make(map[string][][][]int) func LoadTraceFile(path string) (err error) { _, err = os.Stat(path) if os.IsNotExist(err) { return fmt.Errorf("file %v not exists", path) } file, err := os.Open(path) if err != nil { panic(err) } defer file.Close() var jsonStrByte []byte for { buf := make([]byte, 1024) readNum, err := file.Read(buf) if err != nil && err != io.EOF { panic(err) } for i := 0; i < readNum; i++ { jsonStrByte = append(jsonStrByte, buf[i]) } if 0 == readNum { break } } err = json.Unmarshal(jsonStrByte, &pathMap) if err != nil { fmt.Printf("json unmarsha1 err:%v \n", err) return } else { fmt.Println("success") } return } func getPathMap(id int) [][][]int { return pathMap[strconv.Itoa(id)] } ================================================ FILE: game/service/fish_utils.go ================================================ package service import ( "github.com/astaxie/beego/logs" "math/rand" "time" ) type FishUtil struct { //ActiveFish []*Fish //Lock sync.Mutex CurrentFishId FishId BuildFishChan chan *Fish StopBuildFish chan bool //暂停出鱼 RestartBuildFish chan bool //重新开始出鱼 Exit chan bool //接收信号 } type FishId int //普通鱼 type Fish struct { FishKind int `json:"fishKind"` Trace [][]int `json:"trace"` Speed int `json:"speed"` FishId FishId `json:"fishId"` ActiveTime time.Time `json:"-"` FrontActiveTime int64 `json:"activeTime"` //给客户端的时间 } //组合鱼 type ArrayFish struct { FishKind int `json:"fishKind"` TraceKind int `json:"traceKind"` FishId FishId `json:"fishId"` Speed int `json:"speed"` } type FishArrayRet struct { FormationKind int `json:"formationKind"` FishArray [][]*ArrayFish `json:"fishArray"` EndTime time.Time `json:"-"` EndTimeStamp int64 `json:"endTime"` } func (p *FishUtil) GenerateFishId() FishId { p.CurrentFishId++ return p.CurrentFishId } func (p *FishUtil) BuildFishTrace() { var buildTrace = func() int { // 线路随机生成 var traceId = 101 //var traceRandom = Math.floor(Math.random() * 1000) + 1 rand.Seed(time.Now().UnixNano()) var traceKind = rand.Int() randNum := rand.Int() switch traceKind%3 + 1 { case 1: // 直线 201-217 traceId = randNum%17 + 201 break case 2: // 二阶曲线 1-10 traceId = randNum%10 + 1 break case 3: // 三阶曲线 101 -110 traceId = randNum%10 + 101 break } return traceId } c1 := time.NewTicker(time.Second * 2) c2 := time.NewTicker(time.Second*10 + time.Millisecond*100) c3 := time.NewTicker(time.Second*30 + time.Millisecond*200) c4 := time.NewTicker(time.Second * 61) go func() { defer func() { logs.Trace("exit utils") }() defer func() { c1.Stop() c2.Stop() c3.Stop() c4.Stop() close(p.BuildFishChan) close(p.StopBuildFish) close(p.RestartBuildFish) }() //logs.Debug("utils start running ...") var buildNormalFish = func() { rand.Seed(time.Now().UnixNano()) traceKind := buildTrace() fishKind := rand.Intn(15) + 1 traces := getPathMap(traceKind) //logs.Debug("add normal fish tick run") for i := 0; i < len(traces); i++ { fishId := p.GenerateFishId() p.AddFish(fishKind, traces[i], fishId) } } buildNormalFish() for { //logs.Error("for loop......") select { case <-c1.C: //随机生成鱼 1-15 buildNormalFish() case <-c2.C: // 16-20 //logs.Error("<-c2.C in") rand.Seed(time.Now().UnixNano()) fishKind := rand.Intn(5) + 16 fishId := p.GenerateFishId() traceKind := buildTrace() traces := getPathMap(traceKind) p.AddFish(fishKind, traces[0], fishId) case <-c3.C: // 21-34 //logs.Error("<-c3.C in") rand.Seed(time.Now().UnixNano()) fishKind := rand.Intn(14) + 21 fishId := p.GenerateFishId() traceKind := buildTrace() traces := getPathMap(traceKind) p.AddFish(fishKind, traces[1], fishId) case <-c4.C: // 鱼王 //logs.Error("<-c4.C in") fishKind := 35 fishId := p.GenerateFishId() rand.Seed(time.Now().UnixNano()) traceKind := rand.Intn(10) + 101 traces := getPathMap(traceKind) p.AddFish(fishKind, traces[1], fishId) case <-p.StopBuildFish: //停止出鱼 logs.Trace("build util StopBuildFish...") c1.Stop() c2.Stop() c3.Stop() c4.Stop() //logs.Debug("<-p.StopBuildFish") case <-p.RestartBuildFish: logs.Trace("build util RestartBuildFish...") c1 = time.NewTicker(time.Second * 2) c2 = time.NewTicker(time.Second*10 + time.Millisecond*100) c3 = time.NewTicker(time.Second*30 + time.Millisecond*200) c4 = time.NewTicker(time.Second * 61) //logs.Debug("<-p.RestartBuildFish") //return case <-p.Exit: //logs.Error("<-p.Exit") //退出关闭资源 //close(p.StopBuildFish) //close(p.RestartBuildFish) close(p.Exit) //logs.Debug("<-p.Exit") return } } }() } func (p *FishUtil) AddFish(fishKind int, trace [][]int, fishId FishId) { var speed = 6 if fishId >= 35 { speed = 3 } else if fishId >= 30 { speed = 4 } else if fishId >= 20 { speed = 5 } p.BuildFishChan <- &Fish{ FishKind: fishKind, Trace: trace, Speed: speed, FishId: fishId, ActiveTime: time.Now(), FrontActiveTime: time.Now().UnixNano() / 1e6, } } //启动鱼阵 func BuildFishArray() (ret *FishArrayRet) { var fishId FishId var generateFishId = func() FishId { fishId++ return fishId } var fishArray = make([][]*ArrayFish, 0) var duration = 0 //直线鱼阵 var buildFormationLine = func() { duration = 60 fishArray = append(fishArray, make([]*ArrayFish, 0)) fishArray = append(fishArray, make([]*ArrayFish, 0)) var kind = 14 for i := 0; i < 30; i++ { kind = i/3 + 10 fishArray[0] = append(fishArray[0], &ArrayFish{ FishKind: kind, TraceKind: 0, FishId: generateFishId(), Speed: 0, }) fishArray[1] = append(fishArray[1], &ArrayFish{ FishKind: kind, TraceKind: 0, FishId: generateFishId(), Speed: 0, }) } } //环形鱼阵 var buildCircleGroupFish = func() { duration = 60 kind, fishNum := 1, 20 for i := 0; i < 10; i++ { kind += 2 fishArray = append(fishArray, make([]*ArrayFish, 0)) if i > 20 { fishNum = 10 } for j := 0; j < fishNum; j++ { fishArray[i] = append(fishArray[i], &ArrayFish{ FishKind: kind, TraceKind: 0, FishId: generateFishId(), Speed: 0, }) } } } // 两个螺旋形数组 var buildSpiralGroupFish = func() { duration = 60 fishArray = append(fishArray, make([]*ArrayFish, 0)) fishArray = append(fishArray, make([]*ArrayFish, 0)) kind := 1 for i := 1; i <= 30; i++ { kind = ((i-1)/10 + 1) * 5 fishArray[0] = append(fishArray[0],&ArrayFish{ FishKind: kind, TraceKind: 0, FishId: generateFishId(), Speed: 0, }) fishArray[1] = append(fishArray[1],&ArrayFish{ FishKind: kind, TraceKind: 0, FishId: generateFishId(), Speed: 0, }) } } ret = &FishArrayRet{} ret.FormationKind = rand.Intn(3) + 1 //ret.FormationKind = 1 switch ret.FormationKind { case 1: buildFormationLine() case 2: buildCircleGroupFish() case 3: buildSpiralGroupFish() } ret.FishArray = fishArray ret.EndTime = time.Now().Add(time.Second * time.Duration(duration)) ret.EndTimeStamp = ret.EndTime.Unix() * 1e3 return } //是否命中 func IsHit(f *Fish) bool { rand.Seed(time.Now().UnixNano()) // todo 调整概率 return rand.Intn(GetFishMulti(f)) == 0 //return rand.Intn(GetFishMulti(f)*3/5) == 0 //return true } func GetFishMulti(fish *Fish) int { if multi, ok := FishMulti[fish.FishKind]; ok { return multi } else { return 2 } } // 根据id取得子弹的倍数 func GetBulletMulti(BulletKind int) int { if multi, ok := BulletMulti[BulletKind]; ok { return multi } else { return 1 } } ================================================ FILE: game/service/request.go ================================================ package service import ( "context" "encoding/json" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fish/game/common" "fmt" "github.com/astaxie/beego/logs" "strconv" "strings" "time" ) type UserLockFishReq struct { UserId UserId `json:"userId"` ChairId int `json:"chairId"` FishId FishId `json:"fishId"` } type LaserCatchReq struct { UserId UserId `json:"userId"` ChairId int `json:"chairId"` Fishes string `json:"fishes"` Sign string `json:"sign"` } type UserFireLaserReq struct { UserId UserId `json:"userId"` ChairId int `json:"chairId"` BulletKind int `json:"bulletKind"` BulletId int `json:"bulletId"` Angle float64 `json:"angle"` Sign string `json:"sign"` LockFishId FishId `json:"lockFishId"` } func wsRequest(req []byte, client *Client) { defer func() { if r := recover(); r != nil { logs.Error("wsRequest panic:%v ", r) } }() if req[0] == '4' && req[1] == '2' { reqJson := make([]string, 0) err := json.Unmarshal(req[2:], &reqJson) if err != nil { logs.Error("wsRequest json unmarshal err :%v", err) return } if client.Room == nil { //未登录 logs.Info("未登录 login msg : %v", reqJson[0]) if reqJson[0] == "login" { if len(reqJson) < 2 { return } //if reqByteData, ok := reqJson[1].([]byte); ok { reqData := make(map[string]string) if err := json.Unmarshal([]byte(reqJson[1]), &reqData); err != nil { roomIdStr := reqData["roomId"] if roomIdStr == "" { //客户端重连时roomId用的int类型。。。心累 reqDataReconnect := make(map[string]int) if err := json.Unmarshal([]byte(reqJson[1]), &reqDataReconnect); err != nil { roomIdInt := reqDataReconnect["roomId"] roomIdStr = strconv.Itoa(roomIdInt) } } if roomIdInt, err := strconv.Atoi(roomIdStr); err == nil { roomId := RoomId(roomIdInt) RoomMgr.RoomLock.Lock() logs.Info("login get lock...") defer RoomMgr.RoomLock.Unlock() defer logs.Info("login set free lock...") if room, ok := RoomMgr.Rooms[roomId]; ok { //if room.Status == GameStatusWaitBegin { // room.Status = GameStatusFree // room.Utils.BuildFishTrace() //} logs.Debug("send succ") client.Room = room room.ClientReqChan <- &clientReqData{ client, reqJson, } } else { logs.Error("room %v, not exists", roomId) } } else { logs.Error("roomId %v err : %v", roomIdStr, err) } } //} } else { logs.Error("invalid act %v", reqJson[0]) } } else { //logs.Debug("send req to room [%d] succ 2", client.Room.RoomId) client.Room.ClientReqChan <- &clientReqData{ client, reqJson, } } } else { logs.Error("invalid message %v", req) } } //todo 弱类型语言写的东西重构简直堪比火葬场 func handleUserRequest(clientReq *clientReqData) { reqJson := clientReq.reqData client := clientReq.client if len(reqJson) > 0 { act := reqJson[0] switch act { case "login": //logs.Debug("login") if len(reqJson) < 2 { return } reqData := make(map[string]interface{}) if err := json.Unmarshal([]byte(reqJson[1]), &reqData); err == nil { token := reqData["sign"] if token, ok := token.(string); ok { logs.Debug("token %v", token) if rpcClient, closeTransportHandler, err := tools.GetRpcClient(common.GameConf.AccountHost, strconv.Itoa(common.GameConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() if res, err := rpcClient.GetUserInfoByToken(context.Background(), token); err == nil { //logs.Debug("rpc res : %v", res.Code) if res.Code == rpc.ErrorCode_Success { userId := UserId(res.UserObj.UserId) for _, userInfo := range client.Room.Users { if userId == userInfo.UserId { userInfo.client = client userInfo.Online = true userInfo.Ip = "::1" client.UserInfo = userInfo logs.Debug("client userInfo get data...") seats := make([]interface{}, 0) cannonKindVip := map[int]int{0: 1, 1: 4, 2: 7, 3: 10, 4: 13, 5: 16, 6: 19} //todo check sign //score, _ := strconv.ParseFloat(fmt.Sprintf("%.3f", float64(userInfo.Score)/1000), 64) userInfo.ConversionScore, _ = strconv.ParseFloat(fmt.Sprintf("%.3f", float64(userInfo.Score)/1000), 64) for _, userInfo := range client.Room.Users { seats = append(seats, map[string]interface{}{ "userId": userInfo.UserId, "ip": "", "score": userInfo.ConversionScore, "name": userInfo.Name, "vip": userInfo.Vip, "online": true, "ready": userInfo.Ready, "seatIndex": userInfo.SeatIndex, // 正在使用哪种炮 todo 换为真实vip "cannonKind": cannonKindVip[0], // 能量值 "power": 0, }) } client.sendToClient([]interface{}{ "login_result", map[string]interface{}{ "errcode": 0, "errmsg": "ok", "data": map[string]interface{}{ "roomId": strconv.Itoa(int(client.Room.RoomId)), "conf": client.Room.Conf, "numofgames": 0, "seats": seats, }, }, }) client.sendToOthers([]interface{}{ "new_user_comes_push", client.UserInfo, }) client.sendToClient([]interface{}{ "login_finished", }) return } } //不用断开链接,客户端的问题导致需要保持很多无用链接。。。 logs.Debug("user need enter room") client.closeChan <- true close(client.closeChan) return } else { logs.Error("account server rpc status: %v, err : %v", res.Code, err) } } else { logs.Debug("rpc GetUserInfoByToken err : %v", err) } } else { logs.Debug("get rpc [%v:%v] client err : %v", common.GameConf.AccountHost, common.GameConf.AccountPort, err) } } } else { logs.Error("json unmarshal err : %v", err) } client.Room = nil case "catch_fish": if len(reqJson) < 2 { return } //42["catch_fish","{\"userId\":101,\"chairId\":1,\"bulletId\":\"1_324965\",\"fishId\":\"10318923\",\"sign\":\"8bfef2b82dc7b97e4ad386ec40b83d2b\"}"] catchFishReq := catchFishReq{} if err := json.Unmarshal([]byte(reqJson[1]), &catchFishReq); err == nil { bulletId := catchFishReq.BulletId client.catchFish(catchFishReq.FishId, bulletId) } else { logs.Error("catch_fish req err: %v", err) } case "ready": if len(reqJson) < 2 { return } reqData := make(map[string]int) if err := json.Unmarshal([]byte(reqJson[1]), &reqData); err == nil { userId := UserId(reqData["userId"]) client.Room.Users[userId].Ready = true if client.Room.Status == GameStatusWaitBegin { client.Room.Status = GameStatusFree //client.Room.begin() client.Room.Utils.BuildFishTrace() } client.UserInfo.Online = true roomUsers := make([]*UserInfo, 0) for i := 0; i < 4; i++ { seatHasPlayer := false for _, userInfo := range client.Room.Users { if userInfo.SeatIndex == i { userInfo.ConversionScore, err = strconv.ParseFloat(fmt.Sprintf("%.3f", float64(userInfo.Score)/1000), 64) if err != nil { logs.Error("ParseFloat [%v] err %v", userInfo.Score, err) } roomUsers = append(roomUsers, userInfo) seatHasPlayer = true } } if !seatHasPlayer { roomUsers = append(roomUsers, &UserInfo{ SeatIndex: i, }) } } client.sendToClient([]interface{}{ "game_sync_push", map[string]interface{}{ "roomBaseScore": client.Room.Conf.BaseScore, "seats": roomUsers, }, }) } else { logs.Error("user req ready json unmarshal err : %v", err) } case "user_fire": if len(reqJson) < 2 { return } bullet := Bullet{} if err := json.Unmarshal([]byte(reqJson[1]), &bullet); err == nil { client.Fire(&bullet) } else { // todo 没办法 客户端bulletId 传的int :( userFireLaserReq := &UserFireLaserReq{} if err := json.Unmarshal([]byte(reqJson[1]), &userFireLaserReq); err == nil { bullet.UserId = userFireLaserReq.UserId bullet.ChairId = userFireLaserReq.ChairId bullet.BulletKind = userFireLaserReq.BulletKind bullet.BulletId = "" bullet.Angle = userFireLaserReq.Angle bullet.Sign = userFireLaserReq.Sign bullet.LockFishId = userFireLaserReq.LockFishId client.UserInfo.Power = 0 client.sendToOthers([]interface{}{ "user_fire_Reply", bullet, }) return } logs.Error("user fire json err: %v", err) } case "laser_catch_fish": if len(reqJson) < 2 { return } laserCatchReq := LaserCatchReq{} if err := json.Unmarshal([]byte(reqJson[1]), &laserCatchReq); err == nil { fishIdStrArr := strings.Split(laserCatchReq.Fishes, "-") if len(fishIdStrArr) == 0 { logs.Debug("user [%v] laser_catch_fish catch zero fish...") } killedFishes := make([]string, 0) addScore := 0 for _, fishStr := range fishIdStrArr { if fishIdInt, err := strconv.Atoi(fishStr); err == nil { fishId := FishId(fishIdInt) if fish, ok := client.Room.AliveFish[fishId]; ok { killedFishes = append(killedFishes, strconv.Itoa(int(fish.FishId))) //加钱 addScore += GetFishMulti(fish) * GetBulletMulti(BulletKind["bullet_kind_laser"]) * client.Room.Conf.BaseScore } else { logs.Debug("user [%v] laser_catch_fish fishId [%v] not in alive fish array...", client.UserInfo.UserId, fishId) } } else { logs.Error("laser_catch_fish err : fishId [%v] err", fishStr) } } //if addScore > client.Room.Conf.BaseScore*200 { //最大200倍 // addScore = client.Room.Conf.BaseScore * 200 //} client.UserInfo.Score += addScore client.UserInfo.Bill += addScore //记账 catchFishAddScore, _ := strconv.ParseFloat(fmt.Sprintf("%.5f", float64(addScore)/1000), 64) client.Room.broadcast([]interface{}{ "catch_fish_reply", map[string]interface{}{ "userId": laserCatchReq.UserId, "chairId": laserCatchReq.ChairId, "fishId": strings.Join(killedFishes, ","), "addScore": catchFishAddScore, "isLaser": true, }, }) } else { logs.Error("laser_catch_fish err : %v", err) } case "user_lock_fish": if len(reqJson) < 2 { return } userLockFishReq := UserLockFishReq{} if err := json.Unmarshal([]byte(reqJson[1]), &userLockFishReq); err == nil { client.sendToOthers([]interface{}{ "lock_fish_reply", userLockFishReq, }) } case "user_frozen": if len(reqJson) < 2 { return } client.frozenScene(time.Now()) case "user_change_cannon": if len(reqJson) < 2 { return } userChangeCannonReq := make(map[string]int) if err := json.Unmarshal([]byte(reqJson[1]), &userChangeCannonReq); err == nil { if userChangeCannonReq["cannonKind"] < 1 { return } if userChangeCannonReq["cannonKind"] == BulletKind["bullet_kind_laser"] { if client.UserInfo.Power < 1 { return } } client.UserInfo.CannonKind = userChangeCannonReq["cannonKind"] client.sendToOthers([]interface{}{ "user_change_cannon_reply", userChangeCannonReq, }) } case "exit": client.sendToOthers([]interface{}{ "exit_notify_push", client.UserInfo.UserId, }) jsonByte, err := json.Marshal([]string{"exit_result"}) if err != nil { logs.Error("game ping json marshal err,%v", err) return } client.sendMsg(append([]byte{'4', '2'}, jsonByte...)) client.sendMsg([]byte{'4', '1'}) clientExit(client, false) case "dispress": case "disconnect": case "game_ping": jsonByte, err := json.Marshal([]string{"game_pong"}) if err != nil { logs.Error("game ping json marshal err,%v", err) return } client.sendMsg(append([]byte{'4', '2'}, jsonByte...)) case "client_exit": if client.UserInfo.Online { clientExit(client, true) } } } } func clientExit(client *Client, closeClient bool) { logs.Debug("user %v exit close client: %v ...", client.UserInfo.UserId, closeClient) if client.UserInfo.Bill != 0 { client.clearBill() } RoomMgr.RoomLock.Lock() logs.Info("clientExit get lock...") defer RoomMgr.RoomLock.Unlock() defer logs.Info("clientExit set free lock...") client.UserInfo.Online = false roomUserIdArr := make([]UserId, 0) if roomInfo, ok := RoomMgr.RoomsInfo[client.Room.RoomId]; ok { for _, roomUserId := range roomInfo.UserInfo { if roomUserId != client.UserInfo.UserId { roomUserIdArr = append(roomUserIdArr, roomUserId) } } roomInfo.UserInfo = roomUserIdArr delete(client.Room.Users, client.UserInfo.UserId) if closeClient { client.closeChan <- true close(client.closeChan) //关闭channel不影响取出关闭前传送的数据,继续取将得到零值 :-) } if len(client.Room.Users) == 0 { //房间无人,消除房间 delete(RoomMgr.RoomsInfo, client.Room.RoomId) delete(RoomMgr.Rooms, client.Room.RoomId) logs.Debug("room %v is empty now ...", client.Room.RoomId) client.Room.Exit <- true logs.Debug("send exit sign succ ...") } //close(client.msgChan) } else { logs.Error("exit client not in room...") } } ================================================ FILE: game/service/room.go ================================================ package service import ( "encoding/json" "fish/common/tools" "fmt" "github.com/astaxie/beego/logs" "sync" "time" ) type roomMgr struct { RoomLock sync.Mutex RoomsInfo map[RoomId]*RoomInfo //room暴露出去的信息和channel Rooms map[RoomId]*room RoomIdChan <-chan int64 } type RoomInfo struct { UserInfo []UserId HttpReqChan chan *HttpReqData BaseScore int //差点忘了请求的房间类型要一致才能进入 } var ( RoomMgr = &roomMgr{ RoomLock: sync.Mutex{}, RoomsInfo: make(map[RoomId]*RoomInfo), Rooms: make(map[RoomId]*room), //只在room的协程里操作 RoomIdChan: make(<-chan int64), } ) const ( GameStatusWaitBegin = iota GameStatusFree GameStatusPlay GameStatusFormation GameStatusFrozen ) type RoomId int64 type room struct { RoomId RoomId ActiveFish []*Fish //待激活的鱼 CreateTime time.Time Users map[UserId]*UserInfo Conf *RoomConf FrozenEndTime time.Time //FormationEndTime time.Time Status int AliveFish map[FishId]*Fish AliveBullet map[BulletId]*Bullet Utils *FishUtil fishArrayEndTimer <-chan time.Time frozenEndTimer <-chan time.Time Exit chan bool ClientReqChan chan *clientReqData //todo 客户端的请求通过chan传递,省去加锁的写法.包括加入房间 HttpReqChan chan *HttpReqData } type clientReqData struct { client *Client reqData []string } type HttpReqData struct { UserInfo UserInfo ErrChan chan error } type RoomConf struct { BaseScore int `json:"gamebasescore"` MinHaveScore int `json:"minhavescore"` MaxHaveScore int `json:"maxhavescore"` TaxRatio int `json:"-"` //抽水 千分之 Creator UserId `json:"creator"` } func init() { if err := initGenerateUidTool(); err != nil { panic(err) } } func initGenerateUidTool() (err error) { if err, RoomMgr.RoomIdChan = tools.GenerateUid(1); err != nil { logs.Error("GenerateUid err: %v", err) return } return } func CreatePublicRoom(roomConf *RoomConf) (roomId RoomId) { //方法外获得锁 roomId = RoomId(<-RoomMgr.RoomIdChan) RoomMgr.Rooms[roomId] = &room{ RoomId: roomId, ActiveFish: make([]*Fish, 0), CreateTime: time.Now(), Users: make(map[UserId]*UserInfo, 4), Conf: roomConf, FrozenEndTime: time.Time{}, //FormationEndTime: time.Time{}, Status: GameStatusWaitBegin, AliveFish: make(map[FishId]*Fish), AliveBullet: make(map[BulletId]*Bullet), Utils: &FishUtil{ //ActiveFish: make([]*Fish, 0), //Lock: sync.Mutex{}, BuildFishChan: make(chan *Fish, 10), StopBuildFish: make(chan bool), //暂停出鱼 RestartBuildFish: make(chan bool), //重新开始出鱼 Exit: make(chan bool, 1), //接收信号 }, fishArrayEndTimer: make(<-chan time.Time), frozenEndTimer: make(<-chan time.Time), Exit: make(chan bool, 1), ClientReqChan: make(chan *clientReqData), HttpReqChan: make(chan *HttpReqData), } RoomMgr.RoomsInfo[roomId] = &RoomInfo{ UserInfo: make([]UserId, 0), //ClientReqChan: make(chan *clientReqData), HttpReqChan: RoomMgr.Rooms[roomId].HttpReqChan, BaseScore: roomConf.BaseScore, } RoomMgr.Rooms[roomId].begin() return } func (room *room) EnterRoom(userInfo *UserInfo) (err error) { logs.Debug("user %d request enter room %v", userInfo.UserId, room.RoomId) userCount := len(room.Users) if userCount >= 4 { logs.Error("enterRoom err: room [%v] is full", room.RoomId) return } seatIndex := -1 out: for i := 0; i < 4; i++ { for _, roomUserInfo := range room.Users { if roomUserInfo.SeatIndex == i { continue out } } seatIndex = i break } if seatIndex == -1 { return fmt.Errorf("enterRoom roomId [%v] failed", room.RoomId) } userInfo.SeatIndex = seatIndex room.Users[userInfo.UserId] = userInfo return } func (room *room) begin() { logs.Debug("room %d begin", room.RoomId) buildNormalFishTicker := time.NewTicker(time.Second * 1) //普通鱼每秒刷一次 buildGroupFishTicker := time.NewTicker(time.Second * 5 * 60) //鱼群 flushTimeOutFishTicker := time.NewTicker(time.Second * 5) //清理过期鱼 go func() { defer func() { logs.Trace("room %v exit...", room.RoomId) buildNormalFishTicker.Stop() buildGroupFishTicker.Stop() flushTimeOutFishTicker.Stop() room.Utils.Exit <- true go func() { //启动协程取数据,防止utils阻塞在出鱼阶段导致无法退出 :) for range room.Utils.BuildFishChan { } }() close(room.Exit) close(room.HttpReqChan) close(room.ClientReqChan) RoomMgr.RoomLock.Lock() logs.Info("exit room goroutine get lock...") defer RoomMgr.RoomLock.Unlock() defer logs.Info("exit room goroutine set free lock...") delete(RoomMgr.Rooms, room.RoomId) }() //defer room.Wg.Done() for { select { case <-buildNormalFishTicker.C: room.flushFish() case <-buildGroupFishTicker.C: if room.Status != GameStatusFree { continue } room.Utils.StopBuildFish <- true room.AliveFish = make(map[FishId]*Fish) //清理鱼 room.buildFormation() case <-flushTimeOutFishTicker.C: now := time.Now() AliveFishCheck := make(map[FishId]*Fish) for _, fish := range room.AliveFish { if now.Sub(fish.ActiveTime) < 60*2*time.Second { AliveFishCheck[fish.FishId] = fish } } room.AliveFish = AliveFishCheck case fish := <-room.Utils.BuildFishChan: room.ActiveFish = append(room.ActiveFish, fish) case clientReq := <-room.ClientReqChan: //logs.Debug("room [%d] receive client message %v", room.RoomId, clientReq.reqData) handleUserRequest(clientReq) case httpReq := <-room.HttpReqChan: httpReq.ErrChan <- room.EnterRoom(&httpReq.UserInfo) close(httpReq.ErrChan) case <-room.Exit: return case <-room.fishArrayEndTimer: room.Status = GameStatusFree //room.AliveFish = make(map[FishId]*Fish) //清理鱼,因为时间有可能不同步,所以结束也不清理鱼 room.Utils.RestartBuildFish <- true case <-room.frozenEndTimer: room.Status = GameStatusFree room.Utils.RestartBuildFish <- true } } }() } func (room *room) flushFish() { if room.Status != GameStatusFree { return } newFish := make([]*Fish, 0) for _, fish := range room.ActiveFish { if _, ok := room.AliveFish[fish.FishId]; ok { continue } //if len(room.AliveFish) < 30 { room.AliveFish[fish.FishId] = fish newFish = append(newFish, fish) //} else { // break //} } room.ActiveFish = make([]*Fish, 0) if len(newFish) > 0 { room.broadcast([]interface{}{"build_fish_reply", newFish}) } } func (room *room) buildFormation() { if room.Status != GameStatusFree { room.Utils.RestartBuildFish <- true return } room.Status = GameStatusFormation fishArrayData := BuildFishArray() activeTime := time.Now() for _, fishArray := range fishArrayData.FishArray { for _, arrayFish := range fishArray { room.AliveFish[arrayFish.FishId] = &Fish{ FishId: arrayFish.FishId, FishKind: arrayFish.FishKind, Speed: 0, ActiveTime: activeTime, } } } room.fishArrayEndTimer = time.After(fishArrayData.EndTime.Sub(time.Now())) room.broadcast([]interface{}{ "build_fishArray_reply", fishArrayData, }) } func (room *room) getBombFish() (killedFishes []*Fish) { for _, fish := range room.AliveFish { if len(killedFishes) == 20 { return } if fish.FishKind < FishKind11 { killedFishes = append(killedFishes, fish) } } return } //一网打尽 func (room *room) getAllInOne(oneFish *Fish) (killedFishes []*Fish) { for _, fish := range room.AliveFish { if fish.FishKind >= FishKind23 && fish.FishKind <= FishKind26 { killedFishes = append(killedFishes, fish) } } return } //同类炸弹 func (room *room) getSameFish(oneFish *Fish) (killedFishes []*Fish) { switch oneFish.FishKind { case FishKind31: for _, fish := range room.AliveFish { if fish.FishKind == FishKind31 || fish.FishKind == FishKind12 { killedFishes = append(killedFishes, fish) } } case FishKind32: for _, fish := range room.AliveFish { if fish.FishKind == FishKind32 || fish.FishKind == FishKind1 { killedFishes = append(killedFishes, fish) } } case FishKind33: for _, fish := range room.AliveFish { if fish.FishKind == FishKind33 || fish.FishKind == FishKind7 { killedFishes = append(killedFishes, fish) } } } return } func (room *room) broadcast(data []interface{}) { if dataByte, err := json.Marshal(data); err != nil { logs.Error("broadcast [%v] json marshal err :%v ", data, err) } else { dataByte = append([]byte{'4', '2'}, dataByte...) for _, userInfo := range room.Users { if userInfo.client != nil { userInfo.client.sendMsg(dataByte) } } } } ================================================ FILE: go.mod ================================================ module fish go 1.12 replace ( golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a => github.com/golang/net v0.0.0-20181114220301-adae6a3d119a golang.org/x/sys v0.3.0 => github.com/golang/sys v0.3.0 golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0 ) require ( git.apache.org/thrift.git v0.12.0 github.com/apache/thrift v0.12.0 github.com/astaxie/beego v1.11.1 github.com/garyburd/redigo v1.6.0 github.com/go-redis/redis v6.15.2+incompatible github.com/go-sql-driver/mysql v1.4.1 github.com/golang/go v0.0.0-20190523013941-3e9d8e2e1bb9 // indirect github.com/gorilla/websocket v1.4.0 github.com/jmoiron/sqlx v1.2.0 github.com/orestonce/ChessGame v0.0.0-20190419000812-8e1a70c446b3 // indirect golang.org/x/net v0.0.0-20181114220301-adae6a3d119a ) ================================================ FILE: go.sum ================================================ git.apache.org/thrift.git v0.12.0 h1:CMxsZlAmxKs+VAZMlDDL0wXciMblJcutQbEe3A9CYUM= git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/apache/thrift v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/astaxie/beego v1.11.1 h1:6DESefxW5oMcRLFRKi53/6exzup/IR6N4EzzS1n6CnQ= github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY= github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:uZvAcrsnNaCxlh1HorK5dUQHGmEKPh2H/Rl1kehswPo= github.com/golang/go v0.0.0-20190523013941-3e9d8e2e1bb9 h1:wdEw8NbuJZM04QMvzorGVoSx2yGH/OMxNEKan9uCSP0= github.com/golang/go v0.0.0-20190523013941-3e9d8e2e1bb9/go.mod h1:VnTjtYw+XLkxokOYpCb9NBW3cOTFO8+uqxF7o10XJQk= github.com/golang/net v0.0.0-20181114220301-adae6a3d119a h1:wxhJMi186V9aI731PnbZnsQ1aE0hEeDc/Gf9tTNIssU= github.com/golang/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:98y8FxUyMjTdJ5eOj/8vzuiVO14/dkJ98NYhEPG8QGY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/orestonce/ChessGame v0.0.0-20190419000812-8e1a70c446b3 h1:HYSeOb+ue/GSUi+8Tuc0mliUpBG4LgdEACw6ZZdwq0o= github.com/orestonce/ChessGame v0.0.0-20190419000812-8e1a70c446b3/go.mod h1:DzMpQbwxDX21pjkuZGqrl4AlcKPZIxUFPQ1qHiWYI+M= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= ================================================ FILE: hall/common/config.go ================================================ package common var ( HallConf = &HallServiceConf{} ) type HallServiceConf struct { AccountHost string AccountPort int HallHost string HallPort int HallSecret string LogPath string LogLevel string Version string AppId int //qq登录 AppKey string RedirectUri string } ================================================ FILE: hall/controllers/enter_public_room.go ================================================ package controllers import ( "crypto/md5" "fmt" "github.com/astaxie/beego/logs" "net/http" "strconv" "time" ) func EnterPublicRoom(w http.ResponseWriter, r *http.Request) { lock.Lock() defer lock.Unlock() minLoad := 0 gameUrl := "" for serverUrl,load := range serverInfo{ if minLoad == 0 { minLoad = load gameUrl = serverUrl }else{ if load <= minLoad { minLoad = load gameUrl = serverUrl } } } if gameUrl == "" { logs.Error("no game server running ...") return } target := "http://" + gameUrl + r.URL.Path //target := "http://127.0.0.1:9001" + r.URL.Path timeStamp := time.Now().Unix() data := []byte("t" + strconv.Itoa(int(timeStamp))) token := fmt.Sprintf("%x", md5.Sum(data)) if len(r.URL.RawQuery) > 0 { target += "?" + r.URL.RawQuery + "&token=" + token + "&t=" + strconv.Itoa(int(timeStamp)) } else { target += "?token=" + token + "&t=" + strconv.Itoa(int(timeStamp)) } w.Header().Set("Access-Control-Allow-Origin", "*") http.Redirect(w, r, target, http.StatusMovedPermanently) } ================================================ FILE: hall/controllers/get_message.go ================================================ package controllers import ( "context" "encoding/json" "fish/common/tools" "fish/hall/common" "github.com/astaxie/beego/logs" "net/http" "strconv" ) func GetMessage(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("GetUserInfo panic:%v ", r) } }() messageType := r.FormValue("type") if len(messageType) == 0 { return } //logs.Debug("new request url:[%s]",r.URL) ret := map[string]interface{}{ "errcode": 1, "errmsg": "get message failed", } //logs.Debug("get rpc client %v:%v", common.HallConf.AccountHost, common.HallConf.AccountPort) if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() if res, err := client.GetMessage(context.Background(), messageType); err == nil { ret = map[string]interface{}{ "errcode": 0, "errmsg": "ok", "msg": res, "version": common.HallConf.Version, } } else { logs.Error("call rpc GetMessage err: %v", err) } } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } ================================================ FILE: hall/controllers/get_server_info.go ================================================ package controllers import ( "encoding/json" "fish/hall/common" "github.com/astaxie/beego/logs" "net/http" "strconv" ) func GetServerInfo(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("GetUserInfo panic:%v ", r) } }() //logs.Debug("new request url:[%s]",r.URL) ret := map[string]interface{}{ "appweb": "please wait", "hall": common.HallConf.HallHost + ":" + strconv.Itoa(common.HallConf.HallPort), "version": common.HallConf.Version, } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } ================================================ FILE: hall/controllers/get_user_status.go ================================================ package controllers import ( "context" "encoding/json" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fish/hall/common" "github.com/astaxie/beego/logs" "net/http" "strconv" ) func GetUserStatus(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("GetUserInfo panic:%v ", r) } }() //logs.Debug("new request url:[%s]",r.URL) account := r.FormValue("account") if len(account) == 0 { return } token := r.FormValue("sign") if len(token) == 0 { return } ret := map[string]interface{}{ "errcode": 1, "errmsg": "failed", } if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() if res, err := client.GetUserInfoByToken(context.Background(), token); err == nil { if res.Code == rpc.ErrorCode_Success { ret = map[string]interface{}{ "errcode": 0, "errmsg": "ok", "gems": res.UserObj.Gems, } } } else { logs.Error("call rpc GetUserStatus err: %v", err) } } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } ================================================ FILE: hall/controllers/guest.go ================================================ package controllers import ( "context" "encoding/json" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fish/hall/common" "fmt" "github.com/astaxie/beego/logs" "math/rand" "net/http" "strconv" "time" ) func Guest(w http.ResponseWriter, r *http.Request) { //defer func() { // if r := recover(); r != nil { // logs.Error("Guest panic:%v ", r) // } //}() sign := r.FormValue("sign") if len(sign) == 0 || sign == "null" { qqLoginUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%d&redirect_uri=%s&state=1", appId, redirectUri) ret := map[string]interface{}{ "errcode": 1, "qqLoginUrl": qqLoginUrl, } w.Header().Set("Access-Control-Allow-Origin", "*") data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } } else { rand.Seed(time.Now().UnixNano()) //account = firstName[rand.Intn(len(firstName)-1)] + secondName[rand.Intn(len(secondName)-1)] if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() if r, err := client.GetUserInfoByToken(context.Background(), sign); err == nil { if r.Code == rpc.ErrorCode_Success { sign = r.UserObj.Token } ret := map[string]interface{}{ "errcode": 0, "errmsg": "ok", //"account": "guest_" + account, "account": r.UserObj.NickName, "halladdr": common.HallConf.HallHost + ":" + strconv.Itoa(common.HallConf.HallPort), "sign": sign, } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } else { logs.Error("call rpc Guest err: %v", err) } } else { logs.Error("get rpc client err: %v", err) } } /*defer func() { if r := recover(); r != nil { logs.Error("Guest panic:%v ", r) } }() //logs.Debug("new request url:[%s]",r.URL) account := r.FormValue("account") if len(account) == 0 { return } rand.Seed(time.Now().UnixNano()) account = firstName[rand.Intn(len(firstName)-1)] + secondName[rand.Intn(len(secondName)-1)] if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() sign := "" if r, err := client.CreateNewUser(context.Background(), account, "1", 1000000); err == nil { if r.Code == rpc.ErrorCode_Success { sign = r.UserObj.Token } } else { logs.Error("call rpc Guest err: %v", err) } ret := map[string]interface{}{ "errcode": 0, "errmsg": "ok", //"account": "guest_" + account, "account": account, "halladdr": common.HallConf.HallHost + ":" + strconv.Itoa(common.HallConf.HallPort), "sign": sign, } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } else { logs.Error("get rpc client err: %v", err) }*/ } var ( firstName = []string{ "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", } secondName = []string{ "子璇", "淼", "国栋", "夫子", "瑞堂", "甜", "敏", "尚", "国贤", "贺祥", "晨涛", "昊轩", "易轩", "益辰", "益帆", "益冉", "瑾春", "瑾昆", "春齐", "杨", "文昊", "东东", "雄霖", "浩晨", "熙涵", "溶溶", "冰枫", "欣欣", "宜豪", "欣慧", "建政", "美欣", "淑慧", "文轩", "文杰", "欣源", "忠林", "榕润", "欣汝", "慧嘉", "新建", "建林", "亦菲", "林", "冰洁", "佳欣", "涵涵", "禹辰", "淳美", "泽惠", "伟洋", "涵越", "润丽", "翔", "淑华", "晶莹", "凌晶", "苒溪", "雨涵", "嘉怡", "佳毅", "子辰", "佳琪", "紫轩", "瑞辰", "昕蕊", "萌", "明远", "欣宜", "泽远", "欣怡", "佳怡", "佳惠", "晨茜", "晨璐", "运昊", "汝鑫", "淑君", "晶滢", "润莎", "榕汕", "佳钰", "佳玉", "晓庆", "一鸣", "语晨", "添池", "添昊", "雨泽", "雅晗", "雅涵", "清妍", "诗悦", "嘉乐", "晨涵", "天赫", "玥傲", "佳昊", "天昊", "萌萌", "若萌", } ) ================================================ FILE: hall/controllers/login.go ================================================ package controllers import ( "context" "encoding/json" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fish/hall/common" "github.com/astaxie/beego/logs" "net/http" "strconv" "strings" ) func Login(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("GetUserInfo panic:%v ", r) } }() //logs.Debug("new request url:[%s]",r.URL) account := r.FormValue("account") if len(account) == 0 { return } token := r.FormValue("sign") if len(token) == 0 { return } ret := map[string]interface{}{ "errcode": 0, "errmsg": "ok", } if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() ip := strings.TrimSpace(strings.Split(r.Header.Get("X-Forwarded-For"), ",")[0]) if res, err := client.GetUserInfoByToken(context.Background(), token); err == nil { if res.Code == rpc.ErrorCode_Success { ret = map[string]interface{}{ "errcode": 0, "errmsg": "ok", "account": res.UserObj.NickName, "userid": res.UserObj.UserId, "name": res.UserObj.NickName, "headimg": res.UserObj.HeadImg, "lv": res.UserObj.Lv, "exp": res.UserObj.Exp, "coins": res.UserObj.Gems, "vip": res.UserObj.Vip, "money": res.UserObj.Gems, "gems": res.UserObj.Gems, "ip": ip, "sex": res.UserObj.Sex, "RenameCount": res.UserObj.ReNameCount, "ReHeadCount": res.UserObj.ReHeadCount, "item": map[string]int64{ "ice": res.UserObj.Ice, }, } } } else { logs.Error("call rpc Login err: %v", err) } } defer func() { data, err := json.Marshal(ret) if err != nil { logs.Error("json marsha1 failed err:%v", err) return } w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write(data); err != nil { logs.Error("CreateRoom err: %v", err) } }() } ================================================ FILE: hall/controllers/qq_callback.go ================================================ package controllers import ( "context" "encoding/json" "fish/common/api/thrift/gen-go/rpc" "fish/common/tools" "fish/hall/common" "fmt" "github.com/astaxie/beego/logs" "io/ioutil" "math/rand" "net/http" "net/url" "strconv" "strings" ) type qqUserInfo struct { Ret int `json:"ret"` Msg string `json:"msg"` IsLost int `json:"is_lost"` Nickname string `json:"nickname"` Gender string `json:"gender"` Province string `json:"province"` City string `json:"city"` Year string `json:"year"` Constellation string `json:"constellation"` FigureUrl string `json:"figureurl"` FigureUrl1 string `json:"figureurl_1"` FigureUrl2 string `json:"figureurl_2"` FigureUrlQQ1 string `json:"figureurl_qq_1"` FigureUrlQQ2 string `json:"figureurl_qq_2"` FigureUrlQQ string `json:"figureurl_qq"` FigureUrlType string `json:"figureurl_type"` IsYellowVip string `json:"is_yellow_vip"` Vip string `json:"vip"` YellowVipLevel string `json:"yellow_vip_level"` Level string `json:"level"` IsYellowYearVip string `json:"is_yellow_year_vip"` } func QQCallback(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("QQCallback panic:%v ", r) } }() var sign string defer func() { var script = fmt.Sprintf(``,sign) w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write([]byte(script)); err != nil { logs.Error("QQCallback err: %v", err) } }() r.ParseForm() code := r.FormValue("code") if len(code) == 0 { logs.Error("QQCallback :code is null") } getTokenUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=%d&client_secret=%s&code=%s&redirect_uri=%s", appId, AppKey, code, redirectUri) resp, err := http.Get(getTokenUrl) if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } m, _ := url.ParseQuery(string(body)) if len(m["access_token"]) > 0 { accessToken := m["access_token"][0] getOpenIdUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/me?access_token=%s", accessToken) resp, err := http.Get(getOpenIdUrl) if err != nil { panic(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } callback := string(body) //callback( {"client_id":"101673379","openid":"EC0F4A930140B2581EDC71A08D824985"} ); start := strings.Index(callback, "{") end := strings.Index(callback, "}") retMapStr := callback[start : end+1] retMap := make(map[string]string) if err := json.Unmarshal([]byte(retMapStr), &retMap); err != nil { panic(err) } if len(retMap["openid"]) != 0 { getUserInfoUrl := fmt.Sprintf("https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%d&openid=%s", accessToken, appId, retMap["openid"]) resp, err := http.Get(getUserInfoUrl) if err != nil { panic(err) } defer resp.Body.Close() body, err = ioutil.ReadAll(resp.Body) if err != nil { panic(err) } qqUserInfo := &qqUserInfo{} if err := json.Unmarshal([]byte(body), qqUserInfo); err != nil { panic(err) } fmt.Println(string(body)) fmt.Println(qqUserInfo) fmt.Println(qqUserInfo.Nickname) if client, closeTransportHandler, err := tools.GetRpcClient(common.HallConf.AccountHost, strconv.Itoa(common.HallConf.AccountPort)); err == nil { defer func() { if err := closeTransportHandler(); err != nil { logs.Error("close rpc err: %v", err) } }() var sex int8 if qqUserInfo.Gender != "男" { sex = 1 } if resp, err := client.CreateQQUser(context.Background(), &rpc.UserInfo{ UserName: qqUserInfo.Nickname, NickName: qqUserInfo.Nickname, Sex: sex, HeadImg: "1", Lv: int32(rand.Intn(7)), Exp: 0, Vip: int8(rand.Intn(7)), Gems: 10000, Ice: 10, QqInfo: &rpc.QqInfo{ OpenId: retMap["openid"], FigureUrl: qqUserInfo.FigureUrlQQ1, Province: qqUserInfo.Province, City: qqUserInfo.City, TotalSpending: 0, }, }); err == nil { sign = resp.UserObj.Token } } } } } ================================================ FILE: hall/controllers/qq_login.go ================================================ package controllers import ( "fmt" "github.com/astaxie/beego/logs" "net/http" ) var ( appId = 101673379 AppKey = "c18b1b56f2f88ef423bfeadbad9a816c" redirectUri = "http://fish.blzz.shop/qq/message" ) func QQLogin(w http.ResponseWriter, r *http.Request) { defer func() { if r := recover(); r != nil { logs.Error("QQLogin panic:%v ", r) } }() w.Header().Set("Access-Control-Allow-Origin", "*") //qqLoginUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%d&redirect_uri=%s&state=%d&display=%s",appId,redirectUri,1,"mobile") qqLoginUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%d&redirect_uri=%s&state=%d&display=%s",appId,redirectUri,1,"pc") http.Redirect(w,r,qqLoginUrl,302) } ================================================ FILE: hall/controllers/register_game_server.go ================================================ package controllers import ( "crypto/md5" "fish/hall/common" "fmt" "github.com/astaxie/beego/logs" "net/http" "strconv" "sync" ) var lock = sync.Mutex{} var serverInfo = make(map[string]int) //todo 优化的空间:可以加个注销服务接口。心跳加入时间,长时间未发送心跳的游戏服务器由大厅发起询问或暂时挂起。懒得做 :( func RegisterGameServer(w http.ResponseWriter, r *http.Request) { ret := "failed" defer func() { w.Header().Set("Access-Control-Allow-Origin", "*") if _, err := w.Write([]byte(ret)); err != nil { logs.Error("CreateRoom err: %v", err) } }() gameHost := r.FormValue("gameHost") if len(gameHost) == 0 { logs.Error("load game server failed,err : invalid param gameHost %v", gameHost) return } gamePort := r.FormValue("gamePort") if len(gamePort) == 0 { logs.Error("load game server failed,err : invalid param gamePort %v", gamePort) return } loadStr := r.FormValue("load") if len(loadStr) == 0 { logs.Error("load game server failed,err : invalid param load %v ", loadStr) return } t := r.FormValue("t") if len(t) == 0 { logs.Error("load game server failed,err : invalid param t %v ", t) return } sign := r.FormValue("sign") if len(sign) == 0 { logs.Error("load game server failed,err : invalid param sign %v ", sign) return } if fmt.Sprintf("%x", md5.Sum([]byte(common.HallConf.HallSecret+t))) != sign { logs.Error("load game server failed,check sign failed ") return } if loadInt, err := strconv.Atoi(loadStr); err != nil { logs.Error("load game server [%v:%v],err : invalid param load [%v]", gameHost, gamePort, loadStr) return } else { ret = "success" serverUrl := gameHost + ":" + gamePort lock.Lock() defer lock.Unlock() serverInfo[serverUrl] = loadInt } } ================================================ FILE: hall/main/config.go ================================================ package main import ( "fish/hall/common" "fmt" "github.com/astaxie/beego/config" ) func initConf() (err error) { conf, err := config.NewConfig("ini", "./common/conf/hall.conf") if err != nil { fmt.Println("new hall config failed,err:", err) return } common.HallConf.HallHost = conf.String("hall_host") if common.HallConf.HallHost == "" { return fmt.Errorf("conf err: hall_host is null") } common.HallConf.HallPort, err = conf.Int("hall_port") if err != nil { return fmt.Errorf("conf err: hall_port is null") } common.HallConf.HallSecret = conf.String("hall_secret") if common.HallConf.HallSecret == "" { return fmt.Errorf("conf err: hall_secret is null") } common.HallConf.LogPath = conf.String("log_path") if common.HallConf.LogPath == "" { return fmt.Errorf("conf err: log_path is null") } common.HallConf.LogLevel = conf.String("log_level") if common.HallConf.LogLevel == "" { return fmt.Errorf("conf err: log_level is null") } common.HallConf.Version = conf.String("version") if common.HallConf.Version == "" { return fmt.Errorf("conf err: version is null") } accountConf, err := config.NewConfig("ini", "./common/conf/account.conf") if err != nil { fmt.Println("new account config failed,err:", err) return } common.HallConf.AccountHost = accountConf.String("account_host") if common.HallConf.AccountHost == "" { return fmt.Errorf("conf err: account_host is null") } common.HallConf.AccountPort, err = accountConf.Int("account_port") if err != nil { return fmt.Errorf("conf err: account_port is null") } common.HallConf.AppId, err = conf.Int("app_id") if err != nil { return fmt.Errorf("conf err: app_id is null") } common.HallConf.AppKey = conf.String("app_key") if common.HallConf.AppKey == "" { return fmt.Errorf("conf err: app_key is null") } common.HallConf.RedirectUri = conf.String("redirect_uri") if common.HallConf.RedirectUri == "" { return fmt.Errorf("conf err: redirect_uri is null") } return } ================================================ FILE: hall/main/init.go ================================================ package main import ( "encoding/json" "fish/hall/common" "github.com/astaxie/beego/logs" ) func conversionLogLevel(logLevel string) int { switch logLevel { case "debug": return logs.LevelDebug case "warn": return logs.LevelWarn case "info": return logs.LevelInfo case "trace": return logs.LevelTrace } return logs.LevelDebug } func initLogger() (err error) { config := make(map[string]interface{}) config["filename"] = common.HallConf.LogPath config["level"] = conversionLogLevel(common.HallConf.LogLevel) configStr, err := json.Marshal(config) if err != nil { return } err = logs.SetLogger(logs.AdapterFile, string(configStr)) return } func initSec() (err error) { err = initLogger() if err != nil { return } return } ================================================ FILE: hall/main/main.go ================================================ package main import ( "fish/hall/common" _ "fish/hall/router" "flag" "fmt" "github.com/astaxie/beego/logs" "net/http" ) func main() { err := initConf() if err != nil { logs.Error("init conf err: %v", err) return } err = initSec() if err != nil { logs.Error("init sec err: %v", err) return } var addr = flag.String("addr", fmt.Sprintf(":%d", common.HallConf.HallPort), "http service address") logs.Debug("hall server listen port %v",*addr) err = http.ListenAndServe(*addr, nil) if err != nil { logs.Error("ListenAndServe err: %v", err) } } ================================================ FILE: hall/router/router.go ================================================ package router import ( "fish/hall/controllers" "net/http" ) func init() { http.HandleFunc("/get_serverinfo", controllers.GetServerInfo) http.HandleFunc("/guest", controllers.Guest) http.HandleFunc("/login", controllers.Login) http.HandleFunc("/get_user_status", controllers.GetUserStatus) http.HandleFunc("/get_message", controllers.GetMessage) http.HandleFunc("/enter_public_room", controllers.EnterPublicRoom) http.HandleFunc("/register_game_server", controllers.RegisterGameServer) http.HandleFunc("/qq/login", controllers.QQLogin) http.HandleFunc("/qq/message", controllers.QQCallback) } ================================================ FILE: start_account.bat ================================================ call account.exe pause ================================================ FILE: start_fish.bat ================================================ call fish.exe pause ================================================ FILE: start_hall.bat ================================================ call hall.exe pause ================================================ FILE: z-start_all_server.bat ================================================ start %~dp0\start_account.bat start %~dp0\start_hall.bat start %~dp0\start_fish.bat