排行榜优化
This commit is contained in:
parent
9b653d37e6
commit
ff3c6468cf
2
.gitignore
vendored
2
.gitignore
vendored
@ -20,3 +20,5 @@ src/server/test/teLog/*
|
|||||||
src/server/*.exe*
|
src/server/*.exe*
|
||||||
src/server/msg/Gameapi.pb.go
|
src/server/msg/Gameapi.pb.go
|
||||||
src/server/gen-go
|
src/server/gen-go
|
||||||
|
src/server/GeoLite2-Country
|
||||||
|
src/server/test/GeoLite2-Country
|
||||||
|
|||||||
@ -72,6 +72,7 @@ func (p *Player) ActivityFire(ChargeId int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if Item == nil {
|
if Item == nil {
|
||||||
|
log.Debug("ActivityFire err : %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
|
err = p.HandleItem(Item, proto.ITEM_POP_LABEL_ActivityGift.String())
|
||||||
|
|||||||
@ -612,9 +612,7 @@ func ReqGmCommand_(player *Player, Command string) error {
|
|||||||
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
|
BaseMod.AddCode = fmt.Sprintf("MMM-%s-%s", "156", GoUtil.UniqueStringFromInt(int(BaseMod.Uid)))
|
||||||
player.BackUserInfo()
|
player.BackUserInfo()
|
||||||
case "debug":
|
case "debug":
|
||||||
player.AddPlayroomUpvote(100100129)
|
player.HandleInUserRank()
|
||||||
i := player.GetPlayroomUpvote(100100129)
|
|
||||||
log.Debug("debug upvote:%d", i)
|
|
||||||
case "addLimitEvent":
|
case "addLimitEvent":
|
||||||
Id, _ := strconv.Atoi(arg[1])
|
Id, _ := strconv.Atoi(arg[1])
|
||||||
Cd, _ := strconv.Atoi(arg[2])
|
Cd, _ := strconv.Atoi(arg[2])
|
||||||
|
|||||||
@ -45,9 +45,15 @@ type Base struct {
|
|||||||
AddCode string // 用于添加好友的code
|
AddCode string // 用于添加好友的code
|
||||||
DiviceId string // 设备id
|
DiviceId string // 设备id
|
||||||
RegisterTime int64 // 注册时间
|
RegisterTime int64 // 注册时间
|
||||||
|
CountryCode string // 国家码
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Base) InitData(Uid int, Ip string) {
|
func (b *Base) InitData(Uid int, Ip string) {
|
||||||
|
if b.CountryCode == "" {
|
||||||
|
Ip = GoUtil.GetIPFromAddr(Ip)
|
||||||
|
code, _ := GoUtil.GetCountryByIP(Ip)
|
||||||
|
b.CountryCode = code
|
||||||
|
}
|
||||||
if b.AddCode == "" && Ip != "" {
|
if b.AddCode == "" && Ip != "" {
|
||||||
Code, _ := GoUtil.GetCountryByIP(Ip)
|
Code, _ := GoUtil.GetCountryByIP(Ip)
|
||||||
CountryCode := conf.Server.CountryCode
|
CountryCode := conf.Server.CountryCode
|
||||||
|
|||||||
@ -1110,6 +1110,9 @@ func (p *Player) HandleInUserRank() {
|
|||||||
Uid: int(p.M_DwUin),
|
Uid: int(p.M_DwUin),
|
||||||
Score: float64(Score),
|
Score: float64(Score),
|
||||||
RankType: RANK_TYPE_USER,
|
RankType: RANK_TYPE_USER,
|
||||||
|
Extra: map[string]interface{}{
|
||||||
|
"country": p.PlayMod.getBaseMod().CountryCode,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
G_GameLogicPtr.RankMgrSend(m)
|
G_GameLogicPtr.RankMgrSend(m)
|
||||||
|
|||||||
@ -48,6 +48,7 @@ type RankMsg struct {
|
|||||||
Uid int
|
Uid int
|
||||||
Score float64
|
Score float64
|
||||||
RankType int
|
RankType int
|
||||||
|
Extra map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RankMgr) Init() {
|
func (r *RankMgr) Init() {
|
||||||
@ -100,13 +101,25 @@ func (r *RankMgr) getRank(RankType int) []*Rank {
|
|||||||
|
|
||||||
// 获取排行榜信息
|
// 获取排行榜信息
|
||||||
func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
|
func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
|
||||||
data := m.Extra.(RankMsg)
|
data, ok := m.Extra.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return &RankInfo{
|
||||||
|
List: []*Rank{},
|
||||||
|
MyRank: 0,
|
||||||
|
MyScore: 0,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
// 全球排行榜
|
// 全球排行榜
|
||||||
if data.RankType == RANK_TYPE_GLOBAL {
|
rank_type := RANK_TYPE_GLOBAL
|
||||||
|
info, ok := data["rank_type"]
|
||||||
|
if ok {
|
||||||
|
rank_type = GoUtil.Int(info)
|
||||||
|
}
|
||||||
|
if rank_type == RANK_TYPE_GLOBAL {
|
||||||
return r.getRedisRankInfo(m)
|
return r.getRedisRankInfo(m)
|
||||||
}
|
}
|
||||||
// 国家排行榜
|
// 国家排行榜
|
||||||
if data.RankType == RANK_TYPE_USER {
|
if rank_type == RANK_TYPE_USER {
|
||||||
return r.getRedisCountryRankInfo(m)
|
return r.getRedisCountryRankInfo(m)
|
||||||
}
|
}
|
||||||
return &RankInfo{
|
return &RankInfo{
|
||||||
@ -117,7 +130,16 @@ func (r *RankMgr) getRankInfo(m *msg.Msg) (interface{}, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *RankMgr) getRedisCountryRankInfo(m *msg.Msg) (interface{}, error) {
|
func (r *RankMgr) getRedisCountryRankInfo(m *msg.Msg) (interface{}, error) {
|
||||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, conf.Server.CountryCode)
|
data, ok := m.Extra.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return &RankInfo{}, nil
|
||||||
|
}
|
||||||
|
country := "000"
|
||||||
|
info, ok := data["country"]
|
||||||
|
if ok && info != "" {
|
||||||
|
country = info.(string)
|
||||||
|
}
|
||||||
|
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, country)
|
||||||
RedisList, err := db.RedisZRevRangeWithScores(RedisKey, 0, 100)
|
RedisList, err := db.RedisZRevRangeWithScores(RedisKey, 0, 100)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &RankInfo{}, nil
|
return &RankInfo{}, nil
|
||||||
@ -167,16 +189,22 @@ func (r *RankMgr) getRedisRankInfo(m *msg.Msg) (interface{}, error) {
|
|||||||
|
|
||||||
// 进入排行榜
|
// 进入排行榜
|
||||||
func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
|
func (r *RankMgr) inRank(m *msg.Msg) (interface{}, error) {
|
||||||
data := m.Extra.(RankMsg)
|
data, ok := m.Extra.(RankMsg)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("invalid rank msg")
|
||||||
|
}
|
||||||
if data.RankType == RANK_TYPE_USER {
|
if data.RankType == RANK_TYPE_USER {
|
||||||
// 全球玩家排行榜
|
// 全球玩家排行榜
|
||||||
Uid := strconv.Itoa(data.Uid)
|
Uid := strconv.Itoa(data.Uid)
|
||||||
TimeSort := fmt.Sprintf("0.%d", RANK_TIME_SORT-GoUtil.Now())
|
TimeSort := fmt.Sprintf("0.%d", RANK_TIME_SORT-GoUtil.Now())
|
||||||
TimeSortF, _ := strconv.ParseFloat(TimeSort, 64)
|
TimeSortF, _ := strconv.ParseFloat(TimeSort, 64)
|
||||||
db.RedisZAdd(RANK_USER, Uid, data.Score+TimeSortF)
|
db.RedisZAdd(RANK_USER, Uid, data.Score+TimeSortF)
|
||||||
|
info, ok := data.Extra["country"]
|
||||||
|
if !ok || info == "" {
|
||||||
|
info = "000"
|
||||||
|
}
|
||||||
// 地区玩家排行榜
|
// 地区玩家排行榜
|
||||||
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, conf.Server.CountryCode)
|
RedisKey := fmt.Sprintf("%s_%s", RANK_COUNTRY_USER, info)
|
||||||
db.RedisZAdd(RedisKey, Uid, data.Score+TimeSortF)
|
db.RedisZAdd(RedisKey, Uid, data.Score+TimeSortF)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2333,10 +2333,14 @@ func ReqRank(player *Player, buf []byte) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
BaseMod := player.PlayMod.getBaseMod()
|
||||||
m := &MsqMod.Msg{
|
m := &MsqMod.Msg{
|
||||||
From: int(player.M_DwUin),
|
From: int(player.M_DwUin),
|
||||||
Type: MsqMod.HANDLE_TYPE_RANK_INFO,
|
Type: MsqMod.HANDLE_TYPE_RANK_INFO,
|
||||||
Extra: RankMsg{RankType: int(req.Type)},
|
Extra: map[string]interface{}{
|
||||||
|
"country": BaseMod.CountryCode,
|
||||||
|
"rank_type": int(req.Type),
|
||||||
|
},
|
||||||
SendT: GoUtil.Now(),
|
SendT: GoUtil.Now(),
|
||||||
}
|
}
|
||||||
RankInfo := G_GameLogicPtr.RankMgrCall(m).(*RankInfo)
|
RankInfo := G_GameLogicPtr.RankMgrCall(m).(*RankInfo)
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
"server/pkg/github.com/name5566/leaf/log"
|
"server/pkg/github.com/name5566/leaf/log"
|
||||||
@ -20,6 +21,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/oschwald/geoip2-golang"
|
||||||
)
|
)
|
||||||
|
|
||||||
var bufferPool = sync.Pool{
|
var bufferPool = sync.Pool{
|
||||||
@ -478,15 +481,28 @@ func GenerateShuffledAlphabet() string {
|
|||||||
|
|
||||||
// 根据IP获取国家名称
|
// 根据IP获取国家名称
|
||||||
func GetCountryByIP(ip string) (string, error) {
|
func GetCountryByIP(ip string) (string, error) {
|
||||||
return "", nil
|
parsedIP := net.ParseIP(ip)
|
||||||
// resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/")
|
if parsedIP == nil {
|
||||||
// if err != nil {
|
return "", fmt.Errorf("invalid ip: %s", ip)
|
||||||
// return "", err
|
}
|
||||||
// }
|
|
||||||
// defer resp.Body.Close()
|
db, err := geoip2.Open("./GeoLite2-Country/GeoLite2-City.mmdb")
|
||||||
// buf := new(bytes.Buffer)
|
if err != nil {
|
||||||
// buf.ReadFrom(resp.Body)
|
return "", err
|
||||||
// return strings.TrimSpace(buf.String()), nil
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
record, err := db.Country(parsedIP)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
countryName := record.Country.Names["en"]
|
||||||
|
if countryName == "" {
|
||||||
|
return "", fmt.Errorf("country name not found for ip %s", ip)
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetISOCodeByCountry(countryName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据国家名称获取ISO 3166-1国家码
|
// 根据国家名称获取ISO 3166-1国家码
|
||||||
@ -569,11 +585,7 @@ func GetISOCodeByCountry(country string) (string, error) {
|
|||||||
|
|
||||||
// 综合函数:根据IP获取ISO 3166-1国家码
|
// 综合函数:根据IP获取ISO 3166-1国家码
|
||||||
func GetISOCodeByIP(ip string) (string, error) {
|
func GetISOCodeByIP(ip string) (string, error) {
|
||||||
country, err := GetCountryByIP(ip)
|
return GetCountryByIP(ip)
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return GetISOCodeByCountry(country)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetVarKey(Uid int) string {
|
func GetVarKey(Uid int) string {
|
||||||
@ -658,3 +670,35 @@ func ElemNumber(list []int, ele int) int {
|
|||||||
}
|
}
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetIPFromAddr(addr string) string {
|
||||||
|
ip, _, err := net.SplitHostPort(addr)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetGeoInfo(ip string) (string, string, error) {
|
||||||
|
parsedIP := net.ParseIP(ip)
|
||||||
|
if parsedIP == nil {
|
||||||
|
return "", "", fmt.Errorf("invalid ip: %s", ip)
|
||||||
|
}
|
||||||
|
|
||||||
|
db, err := geoip2.Open("./GeoLite2-Country/GeoLite2-City.mmdb")
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
record, err := db.Country(parsedIP)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
countryCode, err := GetISOCodeByCountry(record.Country.Names["en"])
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return countryCode, record.Country.IsoCode, nil
|
||||||
|
}
|
||||||
|
|||||||
@ -48,6 +48,8 @@ require (
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/apache/thrift v0.22.0 // indirect
|
github.com/apache/thrift v0.22.0 // indirect
|
||||||
|
github.com/oschwald/geoip2-golang v1.13.0 // indirect
|
||||||
|
github.com/oschwald/maxminddb-golang v1.13.0 // indirect
|
||||||
golang.org/x/sys v0.29.0 // indirect
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -146,6 +146,10 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb
|
|||||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/oschwald/geoip2-golang v1.13.0 h1:Q44/Ldc703pasJeP5V9+aFSZFmBN7DKHbNsSFzQATJI=
|
||||||
|
github.com/oschwald/geoip2-golang v1.13.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo=
|
||||||
|
github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU=
|
||||||
|
github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
|||||||
@ -31,5 +31,5 @@ func TestWatchAd(t *testing.T) {
|
|||||||
func TestActivityGiftAdd(t *testing.T) {
|
func TestActivityGiftAdd(t *testing.T) {
|
||||||
p1 := new(game.Player)
|
p1 := new(game.Player)
|
||||||
p1.InitPlayer("3625212")
|
p1.InitPlayer("3625212")
|
||||||
p1.Charge(76)
|
p1.Charge(71)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -285,3 +285,10 @@ func TestChampionShipCreateRobot(t *testing.T) {
|
|||||||
func TestRedisZset(t *testing.T) {
|
func TestRedisZset(t *testing.T) {
|
||||||
db.RedisZAdd("rank_user", "100001", 100)
|
db.RedisZAdd("rank_user", "100001", 100)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGeoIp(t *testing.T) {
|
||||||
|
ip := "117.30.95.111:5557"
|
||||||
|
ip = GoUtil.GetIPFromAddr(ip)
|
||||||
|
code, _ := GoUtil.GetCountryByIP(ip)
|
||||||
|
fmt.Printf("IP: %s, Country Code: %s\n", ip, code)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user