diff --git a/src/server/GoUtil/GoUtil.go b/src/server/GoUtil/GoUtil.go index 01e965a3..f857f40a 100644 --- a/src/server/GoUtil/GoUtil.go +++ b/src/server/GoUtil/GoUtil.go @@ -11,6 +11,7 @@ import ( "fmt" "io" "math/rand" + "net/http" "reflect" "strconv" "strings" @@ -425,3 +426,102 @@ func GenerateShuffledAlphabet() string { return string(bytes) } + +// 根据IP获取国家名称 +func GetCountryByIP(ip string) (string, error) { + resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/") + if err != nil { + return "", err + } + defer resp.Body.Close() + buf := new(bytes.Buffer) + buf.ReadFrom(resp.Body) + return strings.TrimSpace(buf.String()), nil +} + +// 根据国家名称获取ISO 3166-1国家码 +func GetISOCodeByCountry(country string) (string, error) { + // 简单映射,可以扩展为更完整的映射表 + countryMap := map[string]string{ + "Afghanistan": "004", // 阿富汗 + "Albania": "008", // 阿尔巴尼亚 + "Algeria": "012", // 阿尔及利亚 + "Angola": "024", // 安哥拉 + "Argentina": "032", // 阿根廷 + "Austria": "040", // 奥地利 + "Azerbaijan": "031", // 阿塞拜疆 + "Bahrain": "048", // 巴林 + "Bangladesh": "050", // 孟加拉国 + "Belgium": "056", // 比利时 + "Bolivia": "068", // 玻利维亚 + "Bosnia and Herzegovina": "070", // 波斯尼亚和黑塞哥维那 + "Brazil": "076", // 巴西 + "Bulgaria": "100", // 保加利亚 + "Canada": "124", // 加拿大 + "Chile": "152", // 智利 + "China": "156", // 中国 + "Colombia": "170", // 哥伦比亚 + "Costa Rica": "188", // 哥斯达黎加 + "Croatia": "191", // 克罗地亚 + "Cuba": "192", // 古巴 + "Denmark": "208", // 丹麦 + "Ecuador": "218", // 厄瓜多尔 + "Egypt": "818", // 埃及 + "Ethiopia": "231", // 埃塞俄比亚 + "Finland": "246", // 芬兰 + "France": "250", // 法国 + "Germany": "276", // 德国 + "Ghana": "288", // 加纳 + "Greece": "300", // 希腊 + "Hungary": "348", // 匈牙利 + "India": "356", // 印度 + "Indonesia": "360", // 印度尼西亚 + "Iran": "364", // 伊朗 + "Iraq": "368", // 伊拉克 + "Italy": "380", // 意大利 + "Japan": "392", // 日本 + "Jordan": "400", // 约旦 + "Kenya": "404", // 肯尼亚 + "Kuwait": "414", // 科威特 + "Lebanon": "422", // 黎巴嫩 + "Malaysia": "458", // 马来西亚 + "Mexico": "484", // 墨西哥 + "Morocco": "504", // 摩洛哥 + "Nigeria": "566", // 尼日利亚 + "Norway": "578", // 挪威 + "Pakistan": "586", // 巴基斯坦 + "Peru": "604", // 秘鲁 + "Philippines": "608", // 菲律宾 + "Poland": "616", // 波兰 + "Portugal": "620", // 葡萄牙 + "Qatar": "634", // 卡塔尔 + "Romania": "642", // 罗马尼亚 + "Russia": "643", // 俄罗斯 + "Saudi Arabia": "682", // 沙特阿拉伯 + "South Africa": "710", // 南非 + "South Korea": "410", // 韩国 + "Spain": "724", // 西班牙 + "Sweden": "752", // 瑞典 + "Switzerland": "756", // 瑞士 + "Thailand": "764", // 泰国 + "Turkey": "792", // 土耳其 + "Ukraine": "804", // 乌克兰 + "United Kingdom": "826", // 英国 + "United States": "840", // 美国 + "Vietnam": "704", // 越南 + "Zimbabwe": "716", // 津巴布韦 + } + if code, ok := countryMap[country]; ok { + return code, nil + } + return "", fmt.Errorf("country code not found for %s", country) +} + +// 综合函数:根据IP获取ISO 3166-1国家码 +func GetISOCodeByIP(ip string) (string, error) { + country, err := GetCountryByIP(ip) + if err != nil { + return "", err + } + return GetISOCodeByCountry(country) +} diff --git a/src/server/conf/server.json b/src/server/conf/server.json index 7220520f..4f0f78d4 100644 --- a/src/server/conf/server.json +++ b/src/server/conf/server.json @@ -32,6 +32,7 @@ "RemoteAddr":"host.docker.internal:9001", "Partition":3, "KafkaHost":"kafka-server", + "CountryCode":"004", "KafkaPort":"9092", "Version":"1.0.0", "IdVerify":false diff --git a/src/server/game/Gm.go b/src/server/game/Gm.go index abe726a9..6b4ad170 100644 --- a/src/server/game/Gm.go +++ b/src/server/game/Gm.go @@ -320,7 +320,7 @@ func ReqGmCommand_(player *Player, Command string) error { PlayroomBackData(player) case "addChip": PlayroomMod := player.PlayMod.getPlayroomMod() - PlayroomMod.AddChip(1, 1) + PlayroomMod.AddChip(1, 1, 0) player.PushClientRes(PlayroomMod.NotifyLose()) case "save": player.PlayMod.ClearData(player) diff --git a/src/server/game/PlayerBack.go b/src/server/game/PlayerBack.go index 59195403..72c8c735 100644 --- a/src/server/game/PlayerBack.go +++ b/src/server/game/PlayerBack.go @@ -72,7 +72,8 @@ func PlayroomBackData(p *Player) { ChipMessage := make([]*proto.ChipInfo, 0) for _, v := range PlayroomMod.ChipList { ChipMessage = append(ChipMessage, &proto.ChipInfo{ - Uid: int64(v.Uid), + Uid: int64(v.Uid), + EmojiId: int32(v.Emoji), }) } data := G_GameLogicPtr.GetUserData(int(p.M_DwUin)) diff --git a/src/server/game/PlayerFunc.go b/src/server/game/PlayerFunc.go index ae7ffa47..684239a6 100644 --- a/src/server/game/PlayerFunc.go +++ b/src/server/game/PlayerFunc.go @@ -212,19 +212,21 @@ func handle(p *Player, m *msg.Msg) error { PlayroomMod := p.PlayMod.getPlayroomMod() Items := m.Item GameId := playroom.GAME_TYPE_HOOK + Emoji := 0 if m.Extra != nil { - if val, ok := m.Extra.(int); ok { - GameId = val + if val, ok := m.Extra.(GameResult); ok { + GameId = val.T + Emoji = val.Emoji } } if len(Items) == 0 { return nil } if GameId == playroom.GAME_TYPE_HOOK { - PlayroomMod.AddChip(m.From, m.SendT) - p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT) + PlayroomMod.AddChip(m.From, m.SendT, Emoji) + p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT) } else { - p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT) + p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT) } PlayroomMod.AddMood(playroom.MOOD_TYPE_FOOD, -50) PlayroomMod.AddMood(playroom.MOOD_TYPE_CLEAN, -50) @@ -245,7 +247,13 @@ func handle(p *Player, m *msg.Msg) error { p.PushClientRes(PlayroomMod.NotifyLose()) case msg.HANDLE_TYPE_PLAYROOM_GAME: FriendMod := p.PlayMod.getFriendMod() - p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, "", m.SendT) + Emoji := 0 + if m.Extra != nil { + if val, ok := m.Extra.(GameResult); ok { + Emoji = val.Emoji + } + } + p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, fmt.Sprintf("%d", Emoji), m.SendT) FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT) case msg.FRIEND_TREASURE_HANDLE: // # 好友宝藏 Items := make([]*item.Item, 0) diff --git a/src/server/game/PlayerMod.go b/src/server/game/PlayerMod.go index b236f1a9..5412614a 100644 --- a/src/server/game/PlayerMod.go +++ b/src/server/game/PlayerMod.go @@ -148,7 +148,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) { BaseMod.FackBookId = PlayerBaseMod.Data.FaceBookId is_update = true } - + Ip := p.GetPlayer().agent.RemoteAddr().String() p.ModList.Handbook.InitData() p.ModList.Order.InitData() p.ModList.Decorate.InitData() @@ -158,7 +158,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) { p.ModList.DailyTask.InitData() p.ModList.Face.InitData() p.ModList.Avatar.InitData() - p.ModList.Base.InitData(int(p.Data.DwUin)) + p.ModList.Base.InitData(int(p.Data.DwUin), Ip) p.ModList.SevenLogin.InitData() p.ModList.LimitedTimeEvent.InitData(BaseMod.GetLevel()) p.ModList.Friend.InitData() diff --git a/src/server/game/RegisterNetworkFunc.go b/src/server/game/RegisterNetworkFunc.go index 99c822b9..8afb58e7 100644 --- a/src/server/game/RegisterNetworkFunc.go +++ b/src/server/game/RegisterNetworkFunc.go @@ -3268,6 +3268,10 @@ func ReqPlayroomGame(player *Player, buf []byte) error { To: Target, Type: MsqMod.HANDLE_TYPE_PLAYROOM_GAME, SendT: GoUtil.Now(), + Extra: GameResult{ + T: PlayroomMod.GetGameId(), + Emoji: int(req.EmojiId), + }, }) player.PlayMod.save() ItemsMsg := make(map[int32]*msg.ItemInfo, 0) @@ -3306,7 +3310,10 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error { Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE, SendT: GoUtil.Now(), Item: Items, - Extra: PlayroomMod.GetGameId(), + Extra: GameResult{ + T: PlayroomMod.GetGameId(), + Emoji: int(req.EmojiId), + }, }) G_GameLogicPtr.SetUserData(Target, VAR_OP_CHIP, 1) PlayroomMod.ResetGame() @@ -3497,7 +3504,10 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error { Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE, SendT: GoUtil.Now(), Item: Items, - Extra: PlayroomMod.GetGameId(), + Extra: GameResult{ + T: playroom.GAME_TYPE_FILP, + Emoji: int(req.EmojiId), + }, }) player.PlayMod.save() PlayroomBackData(player) diff --git a/src/server/game/Type.go b/src/server/game/Type.go index 0e5f23f6..5b9387a9 100644 --- a/src/server/game/Type.go +++ b/src/server/game/Type.go @@ -78,8 +78,9 @@ type ChargeExtra struct { } type GameResult struct { - t int // 游戏类型 - r int // 1:赢 2:输 3:平 + T int // 游戏类型 + R int // 1:赢 2:输 3:平 + Emoji int // 表情 } func init() { diff --git a/src/server/game/mod/base/Base.go b/src/server/game/mod/base/Base.go index f974ceaa..cca32ab7 100644 --- a/src/server/game/mod/base/Base.go +++ b/src/server/game/mod/base/Base.go @@ -45,12 +45,16 @@ type Base struct { AddCode string // 用于添加好友的code } -func (b *Base) InitData(Uid int) { +func (b *Base) InitData(Uid int, Ip string) { if b.AddCode == "" { + Code, _ := GoUtil.GetCountryByIP(Ip) CountryCode := conf.Server.CountryCode if CountryCode == "" { CountryCode = "000" } + if Code != "" { + CountryCode = Code + } b.AddCode = fmt.Sprintf("MMM-%s-%s", CountryCode, GoUtil.UniqueStringFromInt(Uid)) } if b.NickName == "" { diff --git a/src/server/game/mod/playroom/playroom.go b/src/server/game/mod/playroom/playroom.go index b77fcbd3..808e4290 100644 --- a/src/server/game/mod/playroom/playroom.go +++ b/src/server/game/mod/playroom/playroom.go @@ -98,8 +98,9 @@ const ( ) type ChipInfo struct { - Uid int - Time int64 + Uid int + Time int64 + Emoji int } type Mood struct { @@ -327,11 +328,11 @@ func (p *PlayroomMod) GetChip() int { return len(p.ChipList) } -func (p *PlayroomMod) AddChip(Uid int, Time int64) { +func (p *PlayroomMod) AddChip(Uid int, Time int64, Emoji int) { if len(p.ChipList) >= playroomCfg.GetChipNum() { return } - p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time}) + p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time, Emoji: Emoji}) p.RevengeUid = int64(Uid) } diff --git a/src/server/msg/Gameapi.pb.go b/src/server/msg/Gameapi.pb.go index cab1eea7..293a6b9f 100644 --- a/src/server/msg/Gameapi.pb.go +++ b/src/server/msg/Gameapi.pb.go @@ -860,7 +860,7 @@ const ( LimitEventParam_CAT_TRICK_ENERGY LimitEventParam = 1 //猫咪能量 LimitEventParam_CAT_TRICK_TYPE LimitEventParam = 2 //猫咪类型 LimitEventParam_PAYBACK_DAY_COUNT LimitEventParam = 3 //回收日 - LimitEventParam_LUCKY_CAT_EARNINGS LimitEventParam = 4 //幸运猫收益 + LimitEventParam_LUCKY_CAT_EARNINGS LimitEventParam = 4 //幸运猫 ) // Enum value maps for LimitEventParam. @@ -20546,7 +20546,8 @@ func (x *NotifyPlayroomLose) GetRevenge() int64 { type ChipInfo struct { state protoimpl.MessageState `protogen:"open.v1"` - Uid int64 `protobuf:"varint,1,opt,name=Uid,proto3" json:"Uid,omitempty"` // 玩家id + Uid int64 `protobuf:"varint,1,opt,name=Uid,proto3" json:"Uid,omitempty"` // 玩家id + EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -20588,6 +20589,13 @@ func (x *ChipInfo) GetUid() int64 { return 0 } +func (x *ChipInfo) GetEmojiId() int32 { + if x != nil { + return x.EmojiId + } + return 0 +} + type NotifyPlayroomMood struct { state protoimpl.MessageState `protogen:"open.v1"` AllMood int32 `protobuf:"varint,1,opt,name=AllMood,proto3" json:"AllMood,omitempty"` // 总心情 @@ -21177,6 +21185,7 @@ func (x *ResPlayroomFlip) GetCardId() int32 { // 领取游戏奖励 type ReqPlayroomFlipReward struct { state protoimpl.MessageState `protogen:"open.v1"` + EmojiId int32 `protobuf:"varint,1,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -21211,6 +21220,13 @@ func (*ReqPlayroomFlipReward) Descriptor() ([]byte, []int) { return file_proto_Gameapi_proto_rawDescGZIP(), []int{367} } +func (x *ReqPlayroomFlipReward) GetEmojiId() int32 { + if x != nil { + return x.EmojiId + } + return 0 +} + type ResPlayroomFlipReward struct { state protoimpl.MessageState `protogen:"open.v1"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` @@ -21265,7 +21281,8 @@ func (x *ResPlayroomFlipReward) GetMsg() string { type ReqPlayroomGame struct { state protoimpl.MessageState `protogen:"open.v1"` - Type int32 `protobuf:"varint,1,opt,name=Type,proto3" json:"Type,omitempty"` // 1:绿色 2:黄色 3:红色 + Type int32 `protobuf:"varint,1,opt,name=Type,proto3" json:"Type,omitempty"` // 1:绿色 2:黄色 3:红色 + EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -21307,6 +21324,13 @@ func (x *ReqPlayroomGame) GetType() int32 { return 0 } +func (x *ReqPlayroomGame) GetEmojiId() int32 { + if x != nil { + return x.EmojiId + } + return 0 +} + type ResPlayroomGame struct { state protoimpl.MessageState `protogen:"open.v1"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` @@ -21587,7 +21611,8 @@ func (x *ResPlayroomSetRoom) GetMsg() string { type ReqPlayroomSelectReward struct { state protoimpl.MessageState `protogen:"open.v1"` - Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 奖励id + Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 奖励id + EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -21629,6 +21654,13 @@ func (x *ReqPlayroomSelectReward) GetId() int32 { return 0 } +func (x *ReqPlayroomSelectReward) GetEmojiId() int32 { + if x != nil { + return x.EmojiId + } + return 0 +} + type ResPlayroomSelectReward struct { state protoimpl.MessageState `protogen:"open.v1"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` @@ -24987,9 +25019,10 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\x12NotifyPlayroomLose\x12.\n" + "\bLoseItem\x18\x01 \x03(\v2\x12.tutorial.ItemInfoR\bLoseItem\x12&\n" + "\x04Chip\x18\x02 \x03(\v2\x12.tutorial.ChipInfoR\x04Chip\x12\x18\n" + - "\aRevenge\x18\x03 \x01(\x03R\aRevenge\"\x1c\n" + + "\aRevenge\x18\x03 \x01(\x03R\aRevenge\"6\n" + "\bChipInfo\x12\x10\n" + - "\x03Uid\x18\x01 \x01(\x03R\x03Uid\"\xb0\x02\n" + + "\x03Uid\x18\x01 \x01(\x03R\x03Uid\x12\x18\n" + + "\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"\xb0\x02\n" + "\x12NotifyPlayroomMood\x12\x18\n" + "\aAllMood\x18\x01 \x01(\x05R\aAllMood\x12:\n" + "\x04Mood\x18\x02 \x03(\v2&.tutorial.NotifyPlayroomMood.MoodEntryR\x04Mood\x12L\n" + @@ -25061,13 +25094,15 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x0e\n" + "\x02Id\x18\x03 \x01(\x05R\x02Id\x12\x16\n" + - "\x06CardId\x18\x04 \x01(\x05R\x06CardId\"\x17\n" + - "\x15ReqPlayroomFlipReward\"Q\n" + + "\x06CardId\x18\x04 \x01(\x05R\x06CardId\"1\n" + + "\x15ReqPlayroomFlipReward\x12\x18\n" + + "\aEmojiId\x18\x01 \x01(\x05R\aEmojiId\"Q\n" + "\x15ResPlayroomFlipReward\x12&\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + - "\x03Msg\x18\x02 \x01(\tR\x03Msg\"%\n" + + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"?\n" + "\x0fReqPlayroomGame\x12\x12\n" + - "\x04Type\x18\x01 \x01(\x05R\x04Type\"\xe9\x01\n" + + "\x04Type\x18\x01 \x01(\x05R\x04Type\x12\x18\n" + + "\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"\xe9\x01\n" + "\x0fResPlayroomGame\x12&\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x12\n" + @@ -25091,9 +25126,10 @@ const file_proto_Gameapi_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\x05R\x05value:\x028\x01\"N\n" + "\x12ResPlayroomSetRoom\x12&\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + - "\x03Msg\x18\x02 \x01(\tR\x03Msg\")\n" + + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"C\n" + "\x17ReqPlayroomSelectReward\x12\x0e\n" + - "\x02Id\x18\x01 \x01(\x05R\x02Id\"S\n" + + "\x02Id\x18\x01 \x01(\x05R\x02Id\x12\x18\n" + + "\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"S\n" + "\x17ResPlayroomSelectReward\x12&\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"\x11\n" +