function.go 9.69 KB
package logic

import (
	"HttpServer/jsonconf"
	"HttpServer/redishandler"
	"bytes"
	"common/logger"
	"common/redis"
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"errors"
	"io/ioutil"
	"net/http"
	"sort"
	"strconv"
	"time"
)

func SetHeader(w http.ResponseWriter) {
	w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
	w.Header().Set("Content-Type", "application/json")
	w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Uuid,Gameid,Channel")
}

func GettotalParam(paramlist []string) string {
	//排序
	sort.Strings(paramlist)

	//拼接
	sumparam := ""
	for _, val := range paramlist {
		sumparam += val
	}

	return sumparam
}

func GetHashValue(signsum string) string {
	/*h := sha1.New()
	h.Write([]byte(signsum))
	bs := h.Sum(nil)
	sign := hex.EncodeToString(bs)*/
	ctx := md5.New()
	ctx.Write([]byte(signsum))
	return hex.EncodeToString(ctx.Sum(nil))
}

func DoHttpPost(bys []byte, apistr string) (string, error) {
	body := bytes.NewBuffer(bys)
	url1 := XIAOXINGXING_SDKURLOFFICAL + apistr //"api/server/addcoin"

	res, err := http.Post(url1, "application/json;charset=utf-8", body)
	if err != nil {
		logger.Error("DoHttpPost failed err=%v", err)
		return "", err
	}
	result, _ := ioutil.ReadAll(res.Body)
	defer res.Body.Close()

	return string(result), nil
}

func GetCoinFromSdk(uuid int, gameid string, channel string) (int, error) {

	SERVERKEY := XIAOXINGXING_SERVERKEYTEST
	if gameid == "1015" {
		SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015
	}

	var paramlist []string
	var params GetCoinDesc
	params.Sign_type = "md5"
	params.Gameid = gameid
	params.Channel = channel
	params.Uid = uuid
	params.Time_stamp = strconv.Itoa(int(time.Now().Unix()))
	signtypestr := "sign_type=" + params.Sign_type
	timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix()))
	paramgameid := "gameid=" + gameid
	pchannel := "channel=" + channel
	puid := "uid=" + strconv.Itoa(uuid)
	paramlist = append(paramlist, signtypestr)
	paramlist = append(paramlist, timestampstr)
	paramlist = append(paramlist, paramgameid)
	paramlist = append(paramlist, pchannel)
	paramlist = append(paramlist, puid)

	sumparam := GettotalParam(paramlist)
	//加serverkey
	signsum := sumparam + SERVERKEY

	//进行hash
	sign := GetHashValue(signsum)
	params.Sign = sign
	logger.Info("GetCoinFromSdk sumparam is:%v,sign is:", signsum, sign)

	bys, err := json.Marshal(&params)
	if err != nil {
		logger.Error("GetCoinFromSdk failed=%v", err)
		return 0, err
	}
	res, err := DoHttpPost(bys, "api/server/getcoin")
	if err != nil {
		logger.Error("GetCoinFromSdk failed=%v", err)
		return 0, err
	}

	logger.Info("GetCoinFromSdk res=%v", res)

	var resp AddCoinResp
	err = json.Unmarshal([]byte(res), &resp)
	if err != nil {
		logger.Error("GetCoinFromSdk failed=%v", err)
		return 0, err
	}

	if resp.Code != "0" {
		logger.Error("GetCoinFromSdk failed=%v", resp.Msg)
		return 0, err
	}

	return resp.Data.Mycoin, nil
}

//1任务 2成就
func GetTaskInfo(uuid int, tasktype int, channel string) (*TaskList, error) {
	unqiueuuid := strconv.Itoa(uuid) + channel
	var data string
	var err error
	if tasktype == 1 {
		data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid)
		//兼容老的数据
		if err != nil {
			//没有读到数据 则去读取一下老的id
			olddata, err := redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid))
			if err == nil {
				err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, unqiueuuid, olddata)
				if err == nil {
					//删除老的数据 以后都走新的数据
					err = redishandler.GetRedisClient().HDel(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid))
					logger.Info("GetTaskInfo uuid=%v do set", uuid)
				}
				data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid)
			}
		}
	} else if tasktype == 2 {
		data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid)
		//成就这一块需要兼容老的数据
		if err != nil {
			//没有读到数据 则去读取一下老的id
			olddata, err := redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid))
			if err == nil {
				err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid, olddata)
				if err == nil {
					//删除老的数据 以后都走新的数据
					err = redishandler.GetRedisClient().HDel(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid))
					logger.Info("GetTaskInfo uuid=%v do set", uuid)
				}
				data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid)
			}
		}
	} else {
		logger.Error("tasktype invalid")
		return nil, errors.New("tasktype invalid")
	}

	if err != nil {
		return nil, err
	}

	var list TaskList
	err = json.Unmarshal([]byte(data), &list)
	if err != nil {
		logger.Error("GetTaskInfo err=%v", err)
		return nil, err
	}

	return &list, err
}

func SaveTaskInfo(uuid string, tasktype int, list *TaskList) error {
	savestr, err := json.Marshal(list)
	if err != nil {
		logger.Error("SaveTaskInfo err =%v", err)
		return err
	}

	if tasktype == 1 {
		err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, uuid, string(savestr))
	} else if tasktype == 2 {
		err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, uuid, string(savestr))
		//logger.Info("SaveTaskInfo savestr=%v", string(savestr))
	} else {
		logger.Error("tasktype invalid")
		return errors.New("tasktype invalid")
	}
	return err
}

func (t *TaskList) IsInTaskList(id int) bool {
	for _, val := range t.Taskdata {
		if val.Taskid == id {
			return true
		}
	}
	return false
}

func InitTaskAndAchievement(uuid int, channel string) error {
	unqiueid := strconv.Itoa(uuid) + channel
	//先初始化任务
	tlist, err := GetTaskInfo(uuid, 1, channel)
	if tlist == nil {
		tasklist := new(TaskList)
		for _, val := range jsonconf.GetJsonConf().TaskConfig {
			var tmp TaskListDesc
			tmp.Taskstatus = 1
			tmp.Taskid = val.Id
			tmp.Taskprogress = 0
			tasklist.Taskdata = append(tasklist.Taskdata, tmp)
		}

		err := SaveTaskInfo(unqiueid, 1, tasklist)
		if err != nil {
			logger.Error("InitTaskAndAchievement err=%v", err)
			//return err
		}
	} else {
		for _, val := range jsonconf.GetJsonConf().TaskConfig {
			if !tlist.IsInTaskList(val.Id) {
				var tmp TaskListDesc
				tmp.Taskstatus = 1
				tmp.Taskid = val.Id
				tmp.Taskprogress = 0
				tlist.Taskdata = append(tlist.Taskdata, tmp)
			}
		}

		for k, _ := range tlist.Taskdata {
			tlist.Taskdata[k].Taskprogress = 0
			tlist.Taskdata[k].Taskstatus = 1

		}

		err := SaveTaskInfo(unqiueid, 1, tlist)
		if err != nil {
			logger.Error("InitTaskAndAchievement err=%v", err)
			//return err
		}
	}

	//成就
	alist, err := GetTaskInfo(uuid, 2, channel)
	if alist == nil {
		achievelist := new(TaskList)
		for _, val := range jsonconf.GetJsonConf().AchieventConfig {
			var tmp TaskListDesc
			tmp.Taskstatus = 1
			tmp.Taskid = val.Id
			tmp.Taskprogress = 0
			achievelist.Taskdata = append(achievelist.Taskdata, tmp)
		}

		err = SaveTaskInfo(unqiueid, 2, achievelist)
		if err != nil {
			logger.Error("InitTaskAndAchievement err=%v", err)
			return err
		}
	} else {
		for _, val := range jsonconf.GetJsonConf().AchieventConfig {
			if !alist.IsInTaskList(val.Id) {
				var tmp TaskListDesc
				tmp.Taskstatus = 1
				tmp.Taskid = val.Id
				tmp.Taskprogress = 0
				alist.Taskdata = append(alist.Taskdata, tmp)
			}
		}

		err = SaveTaskInfo(unqiueid, 2, alist)
		if err != nil {
			logger.Error("InitTaskAndAchievement err=%v", err)
			return err
		}
	}

	return nil
}


func InitUserInfo(resp *UserLoginResp, uniqueuid ,gameid ,channel string,uuid int) error {

	var initdata UserData
	initdata.Lv = 1
	initdata.LvRewardGet = 0
	initdata.Exp = 0
	initdata.Userid = uniqueuid
	initdata.ContinueLoginDay = 1
	initdata.SumLoginDay = 1
	initdata.GetFromGuanCnt = 0
	initdata.GuanGold = 0
	initdata.LastLoginTime = int(time.Now().Unix())
	goldnum, _ := GetCoinFromSdk(uuid, gameid, channel)
	initdata.RealGold = goldnum
	initdata.WatchAddsTime = WATCH_ADD_DAY_LIMIT
	initdata.LeftFreeRB = FREE_REDBAG_NUM
	initdata.UpLvCostTime = 0
	initdata.UpLvCostTimeSec = int(time.Now().Unix())
	initdata.NickName = "著名沙雕"
	initdata.HeadUrl = "1"
	initdata.RegTime = int(time.Now().Unix())

	for _, val := range jsonconf.GetJsonConf().RmbConfig {
		var tmp WithDrawDesc
		tmp.Cid = val.Id
		tmp.Cnum = val.Rmb_num
		if val.Time == 1 {
			tmp.Isnew = 1
		} else {
			tmp.Isnew = 2
		}
		if val.Id == 1 {
			tmp.Preisfind = 1
		} else {
			tmp.Preisfind = 0
		}
		tmp.Day = val.Login_day
		initdata.WithDraw.Cashdata = append(initdata.WithDraw.Cashdata, tmp)
	}

	resp.Data.Guangold = initdata.GuanGold
	resp.Data.Walletgold = initdata.RealGold
	resp.Data.Isnew = 1

	err := SaveUserInfo(&initdata, uniqueuid)
	if err != nil {
		logger.Error("InitUserInfo err=%v", err)
		return err
	}

	//初始化一下玩家的任务与成就数据数据
	err = InitTaskAndAchievement(uuid, channel)

	return err
}

func SaveUserInfo(data *UserData, uniqueid string) error {

	savestr, err := json.Marshal(data)
	if err != nil {
		return err
	}

	err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, string(savestr))

	return err
}

func GetUserInfo(uniqueid string) (*UserData, error) {

	data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, uniqueid)
	if err != nil {
		return nil, err
	}
	var tmp UserData
	err = json.Unmarshal([]byte(data), &tmp)
	if err != nil {
		return nil, err
	}

	return &tmp, nil
}

func SaveUserSelfData(uniqueid ,savedata string) error {
	err := redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, savedata)
	return err
}

func GetUserSelfData(uniqueid string) (string,error) {
	data, err := redishandler.GetRedisClient().HGet(redis.USER_SELF_DATA_KEY, uniqueid)
	if err != nil {
		return "", err
	}


	return data, nil
}