This commit is contained in:
aozhiwei 2023-09-22 19:44:36 +08:00
commit cd2bd5da77
12 changed files with 1073 additions and 745 deletions

View File

@ -17,7 +17,8 @@ type ChatMgr struct {
worldMsgId uint64
guildMsgId uint64
tmpMsgId uint64
teamMsgId uint64
//tmpMsgId uint64
}
func NewChatMgr(pm *PlayerMgr, fm *FriendsMgr, gm *GuildMgr) *ChatMgr {
@ -32,18 +33,18 @@ func NewChatMgr(pm *PlayerMgr, fm *FriendsMgr, gm *GuildMgr) *ChatMgr {
// Default values
cm.worldMsgId = 1000
cm.guildMsgId = 1000
cm.tmpMsgId = 1000
cm.teamMsgId = 1000
return cm
}
func (cm *ChatMgr) init() {}
func (cm *ChatMgr) FillMFChatMsg(msg *cs.MFChatMsg, accountId *string,
func (cm *ChatMgr) FillMFChatMsg(msg *cs.MFChatMsg, sender *Player,
msgAutoId uint64, chatChannel int32, msgType int32, msgBody *string) {
msg.MsgUuid = &msgAutoId
msg.Sender = accountId
msg.Sender = sender.FillMFChatUser()
msg.ChatChannel = &chatChannel
msg.MsgType = &msgType
msg.MsgBody = msgBody
@ -91,10 +92,9 @@ func (cm *ChatMgr) FillSMUpdatePrivateChatRedPointNotify(p *Player, msg *cs.SMUp
}
func (cm *ChatMgr) ProcWorldChat(p *Player, msg *cs.CMSendChatMsg) {
accountId := p.GetAccountId()
chatMsg := new(cs.MFChatMsg)
cm.worldMsgId++
cm.FillMFChatMsg(chatMsg, &accountId, cm.worldMsgId, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
cm.FillMFChatMsg(chatMsg, p, cm.worldMsgId, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
cm.worldMsgRec.CurrID = cm.worldMsgId
cm.worldMsgRec.AddChatMsg(chatMsg)
@ -114,30 +114,52 @@ func (cm *ChatMgr) ProcGuildChat(p *Player, msg *cs.CMSendChatMsg) {
cm.guildMsgId++
chatMsg := new(cs.MFChatMsg)
cm.FillMFChatMsg(chatMsg, &p.accountId, cm.guildMsgId, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
cm.FillMFChatMsg(chatMsg, p, cm.guildMsgId, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
if msgRec, exists := cm.guildMsgRec[guildId]; exists {
msgRec.AddChatMsg(chatMsg)
} else {
msgRec := &ChatMsgRec{}
msgRec.CurrID = cm.guildMsgId
cm.guildMsgRec[guildId] = msgRec
newMsgRec := &ChatMsgRec{}
newMsgRec.CurrID = cm.guildMsgId
newMsgRec.AddChatMsg(chatMsg)
cm.guildMsgRec[guildId] = newMsgRec
}
// TraverseMember
for _, member := range guild.Members {
guildMember := playerMgr.GetPlayerByAccountId(member.GetAccountId())
guildMember := cm.pm.GetPlayerByAccountId(member.GetAccountId())
if guildMember != nil {
cm.SyncGuildChatMsg(guildMember)
}
}
}
func (cm *ChatMgr) ProcTeamChat(p *Player, msg *cs.CMSendChatMsg) {
chatMsg := new(cs.MFChatMsg)
cm.teamMsgId++
cm.FillMFChatMsg(chatMsg, p, cm.teamMsgId, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
notifyMsg := &cs.SMChatMsgNotify{}
notifyMsg.MsgList = append(notifyMsg.MsgList, chatMsg)
// Traverse msg members
for _, accountId := range msg.GetMembers() {
p2 := cm.pm.GetPlayerByAccountId(accountId)
if p2 != nil {
p2.SendMsg(notifyMsg)
if p2.chatChannel == kCCTeam {
p2.SyncPrivateChatRedPoint()
}
}
}
}
func (cm *ChatMgr) ProcPrivateChat(p *Player, msg *cs.CMSendChatMsg) {
targetAccountId := msg.GetTargetAccountId()
if p.accountId == targetAccountId {
return
}
// 确定是否好友
targetAccount := cm.fm.GetFriendByAccountId(p.accountId, targetAccountId)
if targetAccount == nil {
@ -145,7 +167,7 @@ func (cm *ChatMgr) ProcPrivateChat(p *Player, msg *cs.CMSendChatMsg) {
}
chatMsg := new(cs.MFChatMsg)
cm.FillMFChatMsg(chatMsg, &p.accountId, 0, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
cm.FillMFChatMsg(chatMsg, p, 0, *msg.ChatChannel, *msg.MsgType, msg.MsgBody)
cm.AddChatUser(p.accountId, msg.GetTargetAccountId(), chatMsg, p.IncrPrivateChatLastId())
cm.SyncPrivateChatMsg(p)

View File

@ -74,20 +74,25 @@ const (
PendingReqIsJoinGuildStatusDisband = 3 // 等待验证请求状态, 3 公会已解散
// Event Names
EVENT_CREATE = "event_create"
EVENT_APPLY = "event_apply"
EVENT_APPROVE = "event_approve"
EVENT_REJECT = "event_reject"
EVENT_JOIN = "event_join"
EVENT_LEAVE = "event_leave"
EVENT_DISMISS_MEMBER = "event_dismiss_member"
EVENT_SET_MEMBER_LEVEL = "event_set_member_level"
EVENT_DISBAND = "event_disband"
EVENT_SET_NOTICE = "event_set_notice"
EVENT_GUILD_CREATE = "event_guild_create"
EVENT_GUILD_APPLY = "event_guild_apply"
EVENT_GUILD_APPROVE = "event_guild_approve"
EVENT_GUILD_REJECT = "event_guild_reject"
EVENT_GUILD_JOIN = "event_guild_join"
EVENT_GUILD_LEAVE = "event_guild_leave"
EVENT_GUILD_DISMISS_MEMBER = "event_guild_dismiss_member"
EVENT_GUILD_DISBAND = "event_guild_disband"
EVENT_GUILD_SET_MEMBER_LEVEL = "event_guild_set_member_level"
EVENT_GUILD_SET_NAME = "event_guild_set_name"
EVENT_GUILD_SET_NOTICE = "event_guild_set_notice"
// Err code
ERR_CODE_OK = 0
// Login and Reconnect
ERR_CODE_RECONNECT_PLAYER_NO_EXISTS = 10001
ERR_CODE_RECONNECT_PLAYER_SESSION_ID_NO_VALID = 10002
// Friemds
ERR_CODE_USERS_NO_EXISTS = 11001
ERR_CODE_FRIENDSHIP_IS_FULL = 11002
@ -125,4 +130,6 @@ const (
ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL = 12017
ERR_CODE_REQUEST_PARAMS_ERROR = 12018
ERR_CODE_GUILD_SETMEMBERLEVEL_VICE_LEADER_MAX_LIMIT = 12019
ERR_CODE_GUILD_SETNAME_DUPLICATE_NAMES = 12020
ERR_CODE_GUILD_SETNAME_API_ERROR = 12021
)

File diff suppressed because it is too large Load Diff

View File

@ -151,34 +151,31 @@ func (fm *FriendsMgr) AcceptFriendRequest(account1Id string, account2Id string,
}
user2.Friendships[account1Id] = friendship2
//cacheMgr.LoadPlayerProfile(user1, func(playerProfile *PlayerProfile) {})
//cacheMgr.LoadPlayerProfile(user2, func(playerProfile *PlayerProfile) {})
cb(ERR_CODE_OK, "")
})
}
// RejectFriendRequest 拒绝好友请求
func (fm *FriendsMgr) RejectFriendRequest(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) {
User1 := fm.GetUser(account1Id)
user1 := fm.GetUser(account1Id)
user2 := fm.GetUser(account2Id)
if user2 == nil {
user2 = fm.LoadUser(account2Id)
}
//if User1 == nil || user2 == nil {
// cb(ERR_CODE_USERS_NO_EXISTS, "RejectFriendRequest user no exists")
// return
//}
if user1 == nil || user2 == nil {
cb(ERR_CODE_USERS_NO_EXISTS, "RejectFriendRequest user no exists")
return
}
requestTime := time.Now().Unix()
fm.upsertFriendShip(account2Id, account1Id, FriendshipStatusReject, requestTime, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_PENDING_REQUEST_DB_FAIL, "RejectFriendRequest update pending request db error")
return
}
User1.RemoveFriendRequest(account2Id)
user1.RemoveFriendRequest(account2Id)
user2.RemoveFriendRequest(account1Id)
cb(ERR_CODE_OK, "")
})
}

View File

@ -56,14 +56,6 @@ func (g *Guild) GetMembersViceLeaderCount() int {
return count
}
// GetMember 根据 AccountId 获取成员信息
func (g *Guild) GetMember(accountId string) *GuildMember {
if member, exists := g.Members[accountId]; exists {
return member
}
return nil
}
// IsMember 是否是公会成员
func (g *Guild) IsMember(accountId string) bool {
_, exists := g.Members[accountId]
@ -86,6 +78,22 @@ func (g *Guild) RemoveMember(accountId string) {
delete(g.Members, accountId)
}
// GetMember 获取成员
func (g *Guild) GetMember(accountId string) *GuildMember {
if member, exists := g.Members[accountId]; exists {
return member
}
return nil
}
// GetMemberLevel 获取成员职位
func (g *Guild) GetMemberLevel(accountId string) int32 {
if member, exists := g.Members[accountId]; exists {
return member.Level
}
return 0
}
func (g *Guild) SetNotice(notice *string) {
g.Notice = *notice
}

View File

@ -57,9 +57,7 @@ func (gm *GuildMgr) loadGuildFromDBResult(err error, rows *f5.DataSet) {
Members: make(map[string]*GuildMember, MaxMembers),
PendingReqs: make(map[string]int32, MaxPendingReqs),
}
gm.guilds[guildId] = guild
gm.guildIds = append(gm.guildIds, guildId)
}
q5.UnSetBitFlag(&gm.loadedFlags, LoadGuildFlag)
}

View File

@ -2,9 +2,11 @@ package main
import (
"cs"
"encoding/json"
"f5"
"fmt"
"math/rand"
"mt"
"q5"
"time"
)
@ -19,7 +21,6 @@ const (
type GuildMgr struct {
cs.MsgHandlerImpl
guilds map[int64]*Guild // 公会ID -> 公会
guildIds []int64 // 公会列表 guildIds
guildLogs map[int64][]*GuildLog // 公会ID -> []公会日志列表
userGuilds map[string]int64 // accountId -> 公会ID
loadedFlags int64
@ -34,7 +35,6 @@ func NewGuildMgr() *GuildMgr {
}
func (gm *GuildMgr) init() {
gm.guildIds = make([]int64, 0, 200)
gm.loadFromDB()
}
@ -61,15 +61,18 @@ func (gm *GuildMgr) loadFromDB() {
func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
cb func(errCode int32, errMsg string, guild *Guild)) {
if gm.CheckJoinGuild(leaderId) {
cb(ERR_CODE_JOINED_GUILD, "Joined guild", nil)
cb(ERR_CODE_JOINED_GUILD, "Joined guild", nil)
return
}
guildId := f5.GetApp().NewUuid()
if gm.ExistsGuild(guildId) {
cb(ERR_CODE_CREATE_GUILD_FAIL, "create error ", nil)
return
}
if !gm.CheckGuildNameUnique(name) {
cb(ERR_CODE_CREATE_GUILD_FAIL, "Duplicate guild names", nil)
return
}
unixSec := time.Now().Unix()
fields := [][]string{
@ -85,9 +88,10 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
FRIEND_DB,
"t_guild",
fields,
func(err error, id int64, affectedRows int64) {
func(err error, lastInsertId int64, affectedRows int64) {
if err != nil {
cb(ERR_CODE_CREATE_GUILD_DB_FAIL, "create guild db error ", nil)
f5.GetSysLog().Info("create guild db error:%s", err)
return
}
newMember := &GuildMember{AccountId: leaderId, Level: GuildMemberLevelLeader}
@ -95,11 +99,12 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
func(err error) {
if err != nil {
cb(ERR_CODE_CREATE_GUILD_MEMBER_DB_FAIL, "create guild member db error", nil)
f5.GetSysLog().Info("create guild member db error:%s", err)
return
}
guild := &Guild{
AutoId: id,
AutoId: lastInsertId,
GuildId: guildId,
Name: *name,
LeaderId: leaderId,
@ -120,14 +125,15 @@ func (gm *GuildMgr) CreateGuild(avatar int32, name *string, leaderId string,
// Add event
prop := make(map[string]string)
prop["auto_id"] = q5.ToString(id)
prop["auto_id"] = q5.ToString(lastInsertId)
prop["guild_id"] = q5.ToString(guildId)
prop["guild_name"] = *name
prop["avatar"] = q5.ToString(avatar)
f5.GetTgLog().AddTrackLog(
GAME_ID,
leaderId,
"127.0.0.1",
EVENT_CREATE,
EVENT_GUILD_CREATE,
prop,
)
cb(ERR_CODE_OK, "Create OK", guild)
@ -211,7 +217,7 @@ func (gm *GuildMgr) ApplyToGuild(guildId int64, applicantAccountId string, cb fu
GAME_ID,
applicantAccountId,
"127.0.0.1",
EVENT_APPLY,
EVENT_GUILD_APPLY,
prop,
)
cb(ERR_CODE_OK, "ApplyToGuild ok", guild)
@ -284,7 +290,7 @@ func (gm *GuildMgr) Approve(operatorAccountId, accountId string, cb func(errCode
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_APPROVE,
EVENT_GUILD_APPROVE,
prop,
)
@ -327,26 +333,25 @@ func (gm *GuildMgr) Reject(operatorAccountId, accountId string, cb func(errCode
gm.updatePendingReqs(guild.GuildId, accountId, PendingReqIsJoinGuildStatusReject, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL, "Reject db error")
return
}
guild.RemovePendingReq(accountId)
// Add event
prop := make(map[string]string)
prop["guild_id"] = q5.ToString(guild.GuildId)
prop["reject_account_id"] = q5.ToString(accountId)
prop["members_count"] = q5.ToString(guild.GetMembersCount())
f5.GetTgLog().AddTrackLog(
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_REJECT,
prop,
)
cb(ERR_CODE_OK, "Reject ok")
})
guild.RemovePendingReq(accountId)
// Add event
prop := make(map[string]string)
prop["guild_id"] = q5.ToString(guild.GuildId)
prop["reject_account_id"] = q5.ToString(accountId)
prop["members_count"] = q5.ToString(guild.GetMembersCount())
f5.GetTgLog().AddTrackLog(
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_GUILD_REJECT,
prop,
)
cb(ERR_CODE_OK, "Reject ok")
}
// JoinGuild 直接加入公会
@ -375,7 +380,7 @@ func (gm *GuildMgr) JoinGuild(guild *Guild, accountId string, cb func(errCode in
GAME_ID,
accountId,
"127.0.0.1",
EVENT_JOIN,
EVENT_GUILD_JOIN,
prop,
)
})
@ -454,7 +459,7 @@ func (gm *GuildMgr) LeaveGuild(accountId string, cb func(errCode int32, errMsg s
GAME_ID,
accountId,
"127.0.0.1",
EVENT_LEAVE,
EVENT_GUILD_LEAVE,
prop,
)
cb(ERR_CODE_OK, "LeaveGuild OK", guild)
@ -515,7 +520,7 @@ func (gm *GuildMgr) DismissMember(operatorAccountId, accountId string, cb func(e
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_DISMISS_MEMBER,
EVENT_GUILD_DISMISS_MEMBER,
prop,
)
@ -588,86 +593,11 @@ func (gm *GuildMgr) SetMemberLevel(operatorAccountId, accountId string, newLevel
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_SET_MEMBER_LEVEL,
EVENT_GUILD_SET_MEMBER_LEVEL,
prop,
)
cb(ERR_CODE_OK, "SetMemberLevel OK", guild)
// 转让公长
//if newLevel == GuildMemberLevelLeader {
// updateFields := [][]string{
// {"leader_account_id", q5.ToString(guild.LeaderId)},
// }
// gm.updateGuild(guild, updateFields, nil)
// guild.LeaderId = member.AccountId
// oldMember := guild.GetMember(operatorAccountId)
// oldMemberFields := [][]string{{"level", q5.ToString(GuildMemberLevelDefault)}}
// gm.updateGuildMember(guild, oldMember.AccountId, oldMemberFields, nil)
// oldMember.Level = GuildMemberLevelDefault
//}
//
//gm.updateGuildMember(guild, member.AccountId, fields, func(err error) {
// if err != nil {
// cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error())
// return
// }
//
// // 转让会长的操作
// if newLevel == GuildMemberLevelLeader {
// updateFields := [][]string{
// {"leader_account_id", q5.ToString(member.AccountId)},
// }
// gm.updateGuild(guild, updateFields, func(err error) {
// if err != nil {
// cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error())
// return
// }
// guild.LeaderId = member.AccountId
// // 旧会长 -> 普通成员
// oldMember := guild.GetMember(operatorAccountId)
// oldMemberFields := [][]string{{"level", q5.ToString(GuildMemberLevelDefault)}}
// gm.updateGuildMember(guild, oldMember.AccountId, oldMemberFields,
// func(err error) {
// if err != nil {
// cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error())
// return
// }
// oldMember.Level = GuildMemberLevelDefault
// })
// })
// }
//
// newMemberFields := [][]string{{"level", q5.ToString(newLevel)}}
// gm.updateGuildMember(guild, member.AccountId, newMemberFields,
// func(err error) {
// if err != nil {
// cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error())
// return
// }
// member.Level = newLevel
// })
//
// logContent := fmt.Sprintf("SetMemberLevel[%d-%s-%s-%d-%d]", guild.GuildId, operatorAccountId, accountId, beforeLevel, newLevel)
// gm.WriteLog(guild.GuildId, accountId, LogTypeChangeLevel, logContent)
//
// // Add event
// prop := make(map[string]string)
// prop["guild_id"] = q5.ToString(guild.GuildId)
// prop["accountId"] = q5.ToString(accountId)
// prop["beforeMemberLevel"] = q5.ToString(beforeLevel)
// prop["afterMemberLevel"] = q5.ToString(newLevel)
// prop["members_count"] = q5.ToString(guild.GetMembersCount())
// f5.GetTgLog().AddTrackLog(
// GAME_ID,
// operatorAccountId,
// "127.0.0.1",
// EVENT_SET_MEMBER_LEVEL,
// prop,
// )
//
// cb(ERR_CODE_OK, "SetMemberLevel OK")
//})
}
// Disband 解散公会
@ -695,44 +625,46 @@ func (gm *GuildMgr) Disband(operatorAccountId string, cb func(errCode int32, err
cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error(), nil)
return
}
fields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMembers(guildId, fields, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error(), nil)
return
}
gm.updateAllPendingReqs(guildId, PendingReqIsJoinGuildStatusDisband, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL, err.Error(), nil)
return
}
logContent := fmt.Sprintf("GuildDisbanded[%d-%s]", guildId, guildName)
gm.WriteLog(guildId, operatorAccountId, LogTypeDisband, logContent)
// delete user guilds
for _, member := range guild.Members {
delete(gm.userGuilds, member.AccountId)
}
guild.Members = nil
delete(gm.guilds, guildId)
delete(gm.guildLogs, guildId)
gm.RemoveGuild(guildId)
// Add event
prop := make(map[string]string)
prop["guild_id"] = q5.ToString(guild.GuildId)
f5.GetTgLog().AddTrackLog(
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_DISBAND,
prop,
)
cb(ERR_CODE_OK, "Disband ok", guild)
})
})
})
updateGuildMembersFields := [][]string{{"is_leave_guild", q5.ToString(1)}}
gm.updateGuildMembers(guildId, updateGuildMembersFields, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_MEMBER_DB_FAIL, err.Error(), nil)
return
}
})
gm.updateAllPendingReqs(guildId, PendingReqIsJoinGuildStatusDisband, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_PENDING_REQUEST_DB_FAIL, err.Error(), nil)
return
}
})
logContent := fmt.Sprintf("GuildDisbanded[%d-%s]", guildId, guildName)
gm.WriteLog(guildId, operatorAccountId, LogTypeDisband, logContent)
// delete user guilds
for _, member := range guild.Members {
delete(gm.userGuilds, member.AccountId)
}
guild.Members = nil
delete(gm.guilds, guildId)
delete(gm.guildLogs, guildId)
// Add event
prop := make(map[string]string)
prop["guild_id"] = q5.ToString(guild.GuildId)
f5.GetTgLog().AddTrackLog(
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_GUILD_DISBAND,
prop,
)
cb(ERR_CODE_OK, "Disband ok", guild)
}
func (gm *GuildMgr) CheckGuildAndPermission(operatorAccountId string) (*Guild, bool) {
@ -746,6 +678,15 @@ func (gm *GuildMgr) CheckGuildAndPermission(operatorAccountId string) (*Guild, b
return guild, true
}
func (gm *GuildMgr) CheckGuildNameUnique(newName *string) bool {
for _, g := range gm.guilds {
if g.Name == *newName {
return false
}
}
return true
}
func (gm *GuildMgr) SetAvatar(operatorAccountId string, avatar int32, cb func(errCode int32, errMsg string)) {
guild, ok := gm.CheckGuildAndPermission(operatorAccountId)
if !ok || guild.Avatar == avatar {
@ -763,31 +704,89 @@ func (gm *GuildMgr) SetAvatar(operatorAccountId string, avatar int32, cb func(er
}
guild.Avatar = avatar
cb(ERR_CODE_OK, "SetNotice OK")
cb(ERR_CODE_OK, "SetAvatar OK")
})
}
func (gm *GuildMgr) SetName(operatorAccountId string, name *string, cb func(errCode int32, errMsg string)) {
guild, ok := gm.CheckGuildAndPermission(operatorAccountId)
if !ok || name == nil || guild.Name == *name {
func (gm *GuildMgr) SetName(player *Player, name *string, itemId, itemNum int32, cb func(errCode int32, errMsg string)) {
guild, ok := gm.CheckGuildAndPermission(player.GetAccountId())
if !ok || name == nil {
cb(ERR_CODE_REQUEST_PARAMS_ERROR, "params is null")
return
}
updateFields := [][]string{
{"name", *name},
if !gm.CheckGuildNameUnique(name) {
cb(ERR_CODE_GUILD_SETNAME_DUPLICATE_NAMES, "Duplicate guild names")
return
}
gm.updateGuild(guild, updateFields, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error())
// 扣消耗
gm.SetNameConsume(player, itemId, itemNum, func(errCode int32, errMsg string) {
if errCode != 0 {
cb(errCode, errMsg)
return
}
guild.Name = *name
updateFields := [][]string{
{"name", *name},
}
cb(ERR_CODE_OK, "SetNotice OK")
gm.updateGuild(guild, updateFields, func(err error) {
if err != nil {
cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error())
return
}
// Add event
prop := map[string]string{
"guild_id": q5.ToString(guild.GuildId),
"accountId": q5.ToString(player.GetAccountId()),
"before_guild_name": guild.Name,
"after_guild_name": *name,
}
f5.GetTgLog().AddTrackLog(
GAME_ID,
player.GetAccountId(),
"127.0.0.1",
EVENT_GUILD_SET_NAME,
prop,
)
guild.Name = *name
cb(ERR_CODE_OK, "SetName OK")
})
})
}
func (gm *GuildMgr) SetNameConsume(player *Player, itemId, itemNum int32, cb func(errCode int32, errMsg string)) {
params := map[string]string{
"c": "Bag",
"a": "useItem",
"account_id": player.GetAccountId(),
"session_id": player.GetSessionId(),
"item_id": q5.ToString(itemId),
"item_num": q5.ToString(itemNum),
}
url := fmt.Sprintf("%s/webapp/index.php", mt.Table.Config.GetById(0).GetGameapiUrl())
f5.GetSysLog().Info("SetNameConsume url:%s, params:%+v\n", url, params)
f5.GetHttpCliMgr().SendJsStyleRequest(
url,
params,
func(rsp f5.HttpCliResponse) {
resObj := struct {
ErrCode int32 `json:"errcode"`
ErrMsg string `json:"errmsg"`
}{}
err := json.Unmarshal([]byte(rsp.GetRawData()), &resObj)
if err != nil {
cb(ERR_CODE_GUILD_SETNAME_API_ERROR, "SetNameConsume Api服务器JSON解析错误")
f5.GetSysLog().Info("SetNameConsume Api服务器JSON解析错误:%s\n", err)
return
}
cb(resObj.ErrCode, resObj.ErrMsg)
})
}
// SetNotice 设置公告
func (gm *GuildMgr) SetNotice(operatorAccountId string, notice *string, cb func(errCode int32, errMsg string)) {
guild, ok := gm.CheckGuildAndPermission(operatorAccountId)
@ -804,6 +803,22 @@ func (gm *GuildMgr) SetNotice(operatorAccountId string, notice *string, cb func(
cb(ERR_CODE_UPDATE_GUILD_DB_FAIL, err.Error())
return
}
// Add event
prop := map[string]string{
"guild_id": q5.ToString(guild.GuildId),
"accountId": q5.ToString(operatorAccountId),
"before_notice": guild.Notice,
"after_notice": *notice,
}
f5.GetTgLog().AddTrackLog(
GAME_ID,
operatorAccountId,
"127.0.0.1",
EVENT_GUILD_SET_NOTICE,
prop,
)
guild.Notice = *notice
cb(ERR_CODE_OK, "SetNotice OK")
})
@ -882,25 +897,28 @@ func (gm *GuildMgr) SearchGuild(sinceId int64, name string, cb func(errCode int3
// RandomGuilds 随机10个公会
func (gm *GuildMgr) RandomGuilds() []*Guild {
count := len(gm.guilds)
var results []*Guild
if count <= RandomGuildCount {
for _, guildId := range gm.guildIds {
results = append(results, gm.guilds[guildId])
if len(gm.guilds) <= RandomGuildCount {
var guilds []*Guild
for _, guild := range gm.guilds {
guilds = append(guilds, guild)
}
return results
return guilds
}
for i := 0; i < RandomGuildCount; i++ {
j := rand.Intn(len(gm.guildIds))
gm.guildIds[i], gm.guildIds[j] = gm.guildIds[j], gm.guildIds[i]
guildIds := make([]int64, 0, len(gm.guilds))
for guildId := range gm.guilds {
guildIds = append(guildIds, guildId)
}
rand.Shuffle(len(guildIds), func(i, j int) {
guildIds[i], guildIds[j] = guildIds[j], guildIds[i]
})
shuffledGuilds := make([]*Guild, RandomGuildCount)
for i := 0; i < RandomGuildCount; i++ {
randGuildId := gm.guildIds[i]
results = append(results, gm.guilds[randGuildId])
shuffledGuilds[i] = gm.guilds[guildIds[i]]
}
return results
return shuffledGuilds
}
func (gm *GuildMgr) CheckOperatorPerm(operatorMember *GuildMember, level int32) error {
@ -926,7 +944,6 @@ func (gm *GuildMgr) RemoveUserGuild(accountId string) {
func (gm *GuildMgr) AddGuild(guildId int64, guild *Guild) {
if _, exists := gm.guilds[guildId]; !exists {
gm.guilds[guildId] = guild
gm.guildIds = append(gm.guildIds, guildId)
}
}
@ -958,28 +975,6 @@ func (gm *GuildMgr) CheckJoinGuild(accountId string) bool {
return exists
}
func (gm *GuildMgr) loadGuildIds() {
gm.guildIds = make([]int64, 0, len(gm.guilds))
for guildId := range gm.guilds {
gm.guildIds = append(gm.guildIds, guildId)
}
}
func (gm *GuildMgr) RemoveGuild(guildId int64) {
guildIndex := -1
for i, gId := range gm.guildIds {
if gId == guildId {
guildIndex = i
}
}
if guildIndex < 0 {
return
}
copy(gm.guildIds[guildIndex:], gm.guildIds[guildIndex+1:])
gm.guildIds[len(gm.guildIds)-1] = 0
gm.guildIds = gm.guildIds[:len(gm.guildIds)-1]
}
func (gm *GuildMgr) GetGuildLogs(guildId int64) []*GuildLog {
if logs, exists := gm.guildLogs[guildId]; exists {
return logs

View File

@ -14,6 +14,7 @@ func (this *HandlerMgr) init() {
cs.RegHandlerId(int(cs.CMMessageIdE__CMPing), PLAYER_MGR_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMLogin), PLAYER_MGR_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMReconnect), PLAYER_MGR_HANDLER_ID)
// 好友
cs.RegHandlerId(int(cs.CMMessageIdE__CMSearchUser), PLAYER_HANDLER_ID)
@ -44,6 +45,12 @@ func (this *HandlerMgr) init() {
cs.RegHandlerId(int(cs.CMMessageIdE__CMSetAvatar), PLAYER_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMSetJoinCond), PLAYER_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMSetMemberLevel), PLAYER_HANDLER_ID)
// 聊天
cs.RegHandlerId(int(cs.CMMessageIdE__CMSendChatMsg), PLAYER_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMReadMsgAndOpenChatNotify), PLAYER_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMSetCurrPrivateChatTarget), PLAYER_HANDLER_ID)
cs.RegHandlerId(int(cs.CMMessageIdE__CMCloseChatNotify), PLAYER_HANDLER_ID)
}
func (this *HandlerMgr) unInit() {

View File

@ -3,6 +3,7 @@ package mt
import (
"f5"
"mtb"
"q5"
)
type IMCluster struct {
@ -11,13 +12,18 @@ type IMCluster struct {
type IMClusterTable struct {
f5.IdMetaTable[IMCluster]
selfConf *IMCluster
selfConf *IMCluster
serverInfo string
}
func (this *IMCluster) Init1() {
}
func (this *IMClusterTable) GetIp() string {
return q5.GetLocalIP()
}
func (this *IMClusterTable) GetListenPort() int32 {
return this.selfConf.GetListenPort()
}
@ -31,4 +37,9 @@ func (this *IMClusterTable) PostInit1() {
if this.selfConf == nil {
panic("imserver集群无法读取本服配置")
}
this.serverInfo = this.GetIp() + ":" + q5.ToString(this.GetListenPort())
}
func (this *IMClusterTable) GetServerInfo() string {
return this.serverInfo
}

View File

@ -23,6 +23,22 @@ func (p *Player) GetAccountId() string {
return p.accountId
}
func (p *Player) GetSessionId() string {
return p.sessionId
}
func (p *Player) SendMsg(rspMsg proto.Message) {
wspListener.sendProxyMsg(p.socket.Conn, p.socket.SocketHandle, rspMsg)
}
func (p *Player) ReBind(socket f5.WspCliConn) {
if p.socket.IsValid() {
delete(playerMgr.socketHash, p.socket)
}
p.socket = socket
playerMgr.socketHash[p.socket] = p
}
// CMSearchUser 搜索用户
func (p *Player) CMSearchUser(hdr *f5.MsgHdr, msg *cs.CMSearchUser) {
sinceId := msg.GetSinceId()
@ -230,37 +246,57 @@ func (p *Player) CMRemoveBlacklist(hdr *f5.MsgHdr, msg *cs.CMRemoveBlacklist) {
// CMSendChatMsg 发送聊天消息
func (p *Player) CMSendChatMsg(hdr *f5.MsgHdr, msg *cs.CMSendChatMsg) {
chatChannel := *msg.ChatChannel
if !IsValidChatChannel(chatChannel) {
if !IsValidChatChannel(msg.GetChatChannel()) {
return
}
switch chatChannel {
switch msg.GetChatChannel() {
case kCCWorld:
chatMgr.ProcWorldChat(p, msg)
case kCCPrivate:
chatMgr.ProcPrivateChat(p, msg)
case kCCGuild:
chatMgr.ProcGuildChat(p, msg)
case kCCTeam:
chatMgr.ProcTeamChat(p, msg)
default:
return
}
}
func (p *Player) SyncPrivateChatRedPoint() {
//rspMsg := &cs.SMDeleteFriendShip{}
msg := &cs.SMUpdatePrivateChatRedPointNotify{}
chatMgr.FillSMUpdatePrivateChatRedPointNotify(p, msg)
}
// CMReadMsgAndOpenChatNotify 读取聊天消息列表并且开启聊天通知
func (p *Player) CMReadMsgAndOpenChatNotify(hdr *f5.MsgHdr, msg *cs.CMReadMsgAndOpenChatNotify) {
chatChannel := *msg.CurrChannel
if !IsValidChatChannel(chatChannel) {
if !IsValidChatChannel(msg.GetCurrChannel()) {
return
}
if chatChannel == kCCPrivate {
p.chatChannel = int(msg.GetCurrChannel())
if p.chatChannel == kCCPrivate {
p.SyncPrivateChatRedPoint()
}
// lastIds [{key:1, value:0}, {key:1, value:0}, ]
for _, v := range msg.GetLastIds() {
chatChannel := q5.ToInt32(v.GetKey())
if !IsValidChatChannel(chatChannel) {
continue
}
chatChannelLastId := uint64(v.GetValue())
switch chatChannel {
case kCCWorld:
p.worldChannelLastId = chatChannelLastId
chatMgr.SyncWorldChatMsg(p)
case kCCGuild:
p.guildChannelLastId = chatChannelLastId
chatMgr.SyncGuildChatMsg(p)
default:
break
}
}
}
// CMSetCurrPrivateChatTarget 设置当前私聊目标
@ -275,18 +311,14 @@ func (p *Player) MarkNewMsg() {
p.SendMsg(rspMsg)
}
func (p *Player) SendMsg(rspMsg proto.Message) {
wspListener.sendProxyMsg(p.socket.Conn, p.socket.SocketHandle, rspMsg)
}
func IsValidChatChannel(chatChannel int32) bool {
return chatChannel > kCCBegin && chatChannel < kCCEnd
}
// CMGuildInfo 我的公会信息
// CMGuildInfo 公会信息
func (p *Player) CMGuildInfo(hdr *f5.MsgHdr, msg *cs.CMGuildInfo) {
rspMsg := new(cs.SMGuildInfo)
guild := guildMgr.GetGuildByAccountId(p.accountId)
guild := guildMgr.GetGuildByAccountId(msg.GetAccountId())
if guild != nil {
rspMsg.Guild = p.FillMFGuild(guild)
}
@ -577,8 +609,10 @@ func (p *Player) CMSetAvatar(hdr *f5.MsgHdr, msg *cs.CMSetAvatar) {
// CMSetName 设置公会名称
func (p *Player) CMSetName(hdr *f5.MsgHdr, msg *cs.CMSetName) {
guildMgr.SetName(
p.accountId,
p,
msg.Name,
msg.GetItemId(),
msg.GetItemNum(),
func(errCode int32, errMsg string) {
rspMsg := new(cs.SMSetName)
if errCode != 0 {
@ -765,6 +799,39 @@ func (p *Player) FillMFUser(profile *PlayerProfile) *cs.MFUser {
return resUser
}
// FillMFChatUser 填充聊天信息
func (p *Player) FillMFChatUser() *cs.MFChatUser {
accountId := p.accountId
profile := cacheMgr.GetPlayerProfile(accountId)
if profile == nil {
return nil
}
var guildId int64 = 0
var guildName = ""
var guildLevel int32 = 0
guild := guildMgr.GetGuildByAccountId(profile.AccountId)
if guild != nil {
guildId = guild.GuildId
guildName = guild.Name
guildLevel = guild.GetMemberLevel(accountId)
}
onlineStatus := playerMgr.GetOnlineStatus(profile.AccountId)
res := &cs.MFChatUser{
AccountId: &profile.AccountId,
Username: &profile.Username,
Avatar: &profile.Avatar,
AvatarHead: &profile.AvatarHead,
GuildId: &guildId,
GuildName: &guildName,
GuildLevel: &guildLevel,
OnlineStatus: &onlineStatus,
LastLoginTime: &profile.LastLoginTime,
}
return res
}
func (p *Player) IncrPrivateChatLastId() uint64 {
p.privateChatLastId++
return p.privateChatLastId

View File

@ -5,6 +5,7 @@ import (
"encoding/json"
"f5"
"fmt"
"github.com/golang/protobuf/proto"
"mt"
"q5"
)
@ -116,7 +117,7 @@ func (this *PlayerMgr) CMLoginResult(hdr *f5.MsgHdr, msg *cs.CMLogin, rsp f5.Htt
player := Player{
socket: hdr.GetSocket(),
accountId: accountId,
sessionId: accountId,
sessionId: msg.GetSessionId(),
}
// Add to online user
this.addPlayer(&player)
@ -136,9 +137,11 @@ func (this *PlayerMgr) CMLoginResult(hdr *f5.MsgHdr, msg *cs.CMLogin, rsp f5.Htt
cacheMgr.AddCacheProfile(1, playerProfile)
friendMgr.LoadUser(accountId)
serverInfo := "192.168.100.39:2000"
serverInfo := proto.String(mt.Table.IMCluster.GetServerInfo())
f5.GetSysLog().Info("ServerInfo:%s", serverInfo)
rspMsg := &cs.SMLogin{}
rspMsg.ServerInfo = &serverInfo
rspMsg.ServerInfo = serverInfo
rspMsg.AccountId = &resObj.Info.AccountID
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}
@ -147,7 +150,7 @@ func (this *PlayerMgr) reportServerState(masterIp string, masterPort int32) {
params := map[string]string{
"node_id": q5.ToString(f5.GetApp().GetNodeId()),
"instance_id": q5.ToString(f5.GetApp().GetInstanceId()),
"ip": "192.168.100.164",
"ip": mt.Table.IMCluster.GetIp(),
"port": q5.ToString(mt.Table.IMCluster.GetListenPort()),
"online_num": q5.ToString(0),
"room_num": q5.ToString(0),
@ -198,3 +201,22 @@ func (this *PlayerMgr) GetOnlineStatus(accountId string) int32 {
}
return OnlineStatusOff
}
func (this *PlayerMgr) CMReconnect(hdr *f5.MsgHdr, msg *cs.CMReconnect) {
hum := this.GetPlayerByAccountId(msg.GetAccountId())
rspMsg := &cs.SMReconnect{}
if hum == nil {
rspMsg.Errcode = proto.Int32(ERR_CODE_RECONNECT_PLAYER_NO_EXISTS)
rspMsg.Errmsg = proto.String("player no exists")
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
return
}
if hum.GetSessionId() != msg.GetSessionId() {
rspMsg.Errcode = proto.Int32(ERR_CODE_RECONNECT_PLAYER_SESSION_ID_NO_VALID)
rspMsg.Errmsg = proto.String("session_id no valid")
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
return
}
hum.ReBind(hdr.GetSocket())
wspListener.sendProxyMsg(hdr.Conn, hdr.SocketHandle, rspMsg)
}

View File

@ -351,21 +351,35 @@ message MFChatMsg
!!!msg_uuid可能重复
*/
optional uint64 msg_uuid = 1;
optional string sender = 2; //
optional string receiver = 3; //
optional MFChatUser sender = 2; //
optional MFChatUser receiver = 3; //
optional int32 chat_channel = 4; //
optional int32 msg_type = 5; // 0(json) 1 (json) 2:()
optional string msg_body = 6; //(json类型里的字段!)
optional int64 send_time = 7; //
}
// --- ---
//
message CMGuildInfo
{
//
message MFChatUser{
optional string account_id = 1;
optional string username = 2;
optional int32 avatar = 3;
optional int32 avatar_head = 4;
optional int64 guild_id = 5;
optional string guild_name = 6;
optional int32 guild_level = 7;
optional int32 online_status = 8;
optional int32 last_login_time = 9;
}
//
// --- ---
//
message CMGuildInfo
{
optional string accountId = 1;
}
//
message SMGuildInfo
{
optional int32 errcode = 1;
@ -598,6 +612,8 @@ message MFGuildLog {
message CMSetName
{
optional string name = 1;
optional int32 item_id = 2;
optional int32 item_num = 3;
}
//
@ -673,4 +689,4 @@ message MFGuildMember {
optional int32 last_login_time = 9;
optional int32 level = 10;
optional int32 star = 11;
}
}