diff --git a/server/imserver_new/friend/friendmgr.go b/server/imserver_new/friend/friendmgr.go new file mode 100644 index 00000000..1c81a987 --- /dev/null +++ b/server/imserver_new/friend/friendmgr.go @@ -0,0 +1,54 @@ +package friend + +import ( +) + +type FriendMgr struct { + friendHash map[string]*map[string]int32 + blackHash map[string]*map[string]int32 + byBlackHash map[string]*map[string]int32 +} + +func (this *FriendMgr) Init() { +} + +func (this *FriendMgr) UnInit() { +} + +func (this *FriendMgr) loadFromDB() { + //this.loadFriendships() + //this.loadBlacklist() +} + +func (this *FriendMgr) IsFriend(accountId1 string, accountId2 string) bool { + myFriends := this.getFriends(accountId1) + if myFriends != nil { + if _, ok := (*myFriends)[accountId2]; ok { + return ok + } + } + return false +} + +func (this *FriendMgr) HasFriend(accountId string) bool { + myFriends := this.getFriends(accountId) + if myFriends != nil { + return len(*myFriends) > 0 + } + return false +} + +func (this *FriendMgr) GetFriendNum(accountId string) int32 { + myFriends := this.getFriends(accountId) + if myFriends != nil { + return int32(len(*myFriends)) + } + return 0 +} + +func (this *FriendMgr) getFriends(accountId string) *map[string]int32 { + if friends, ok := this.friendHash[accountId]; ok { + return friends + } + return nil +} diff --git a/server/imserver_new/friend/friendsdbmgr.go b/server/imserver_new/friend/friendsdbmgr.go deleted file mode 100644 index 3bb956d2..00000000 --- a/server/imserver_new/friend/friendsdbmgr.go +++ /dev/null @@ -1,271 +0,0 @@ -package friend - -import ( - "f5" - "fmt" - "q5" - "strings" - "main/constant" - "main/common" - . "main/global" -) - -func (fm *FriendsMgr) upsertFriendShip(account1Id string, account2Id string, isFriendship int, requestTime int64, cb func(error)) { - account1Id, account2Id = SwapAccountIds(account1Id, account2Id) - - where := [][]string{ - {"account1_id", account1Id}, - {"account2_id", account2Id}, - } - insertKv := [][]string{ - {"account1_id", account1Id}, - {"account2_id", account2Id}, - {"is_friendship", q5.ToString(isFriendship)}, - {"createtime", q5.ToString(requestTime)}, - {"modifytime", q5.ToString(requestTime)}, - } - updateKv := [][]string{ - {"is_friendship", q5.ToString(isFriendship)}, - {"modifytime", q5.ToString(requestTime)}, - } - f5.GetJsStyleDb().Upsert( - constant.FRIEND_DB, - "t_friend_ships", - where, - updateKv, - insertKv, - func(err error, lastInsertId int64, rowsAffected int64) { - cb(err) - }, - ) -} - -func (fm *FriendsMgr) updateFriendShip(account1Id string, account2Id string, fields [][]string, cb func(error)) { - account1Id, account2Id = SwapAccountIds(account1Id, account2Id) - where := [][]string{ - {"account1_id", account1Id}, - {"account2_id", account2Id}, - } - f5.GetJsStyleDb().Update( - constant.FRIEND_DB, - "t_friend_ships", - fields, - where, - func(err error, lastInsertId int64, rowsAffected int64) { - cb(err) - }, - ) -} - -func (fm *FriendsMgr) upsertBlacklist(account1Id string, account2Id string, isRemoved int, cb func(error)) { - where := [][]string{ - {"account_id", account1Id}, - } - insertKv := [][]string{ - {"account_id", account1Id}, - {"blocked_account_id", account2Id}, - {"is_removed", q5.ToString(isRemoved)}, - } - updateKv := [][]string{ - {"is_removed", q5.ToString(isRemoved)}, - } - f5.GetJsStyleDb().Upsert( - constant.FRIEND_DB, - "t_friend_blacklist", - where, - updateKv, - insertKv, - func(err error, lastInsertId int64, rowsAffected int64) { - cb(err) - //if err != nil { - // fmt.Printf("error:%v\n", err) - //} - //fmt.Printf("lastInsertId:%d\n", lastInsertId) - //fmt.Printf("rowsAffected:%d\n", rowsAffected) - }, - ) -} - -func (fm *FriendsMgr) findUsersByUsername(username string, sinceId int64, cb func(err error, lastId int64, profiles []*common.PlayerProfile)) { - fields := []string{"idx", "account_id", "name", "head_id", "head_frame", "star_num", "rank", "last_login_time"} - var where [][]string - usernameLike := fmt.Sprintf("%%%s%%", username) - likeWhere := [][]string{ - {"name", usernameLike}, - } - f5.GetJsStyleDb().SelectLike( - constant.GAME_DB, - "t_user", - fields, - where, - likeWhere, - sinceId, - constant.MaxSearchResults, - func(err error, rows *f5.DataSet) { - if err != nil { - cb(err, 0, nil) - return - } - lastId := sinceId - profiles := make([]*common.PlayerProfile, 0, constant.MaxSearchResults) - for rows.Next() { - autoId := q5.ToInt64(rows.GetByIndex(0)) - if autoId > lastId { - lastId = autoId - } - accountId := q5.ToString(rows.GetByIndex(1)) - onlineStatus := GetPlayerMgr().GetOnlineStatus(accountId) - profile := &common.PlayerProfile{ - AccountId: q5.ToString(rows.GetByIndex(1)), - Username: q5.ToString(rows.GetByIndex(2)), - Avatar: q5.ToInt32(rows.GetByIndex(3)), - AvatarHead: q5.ToInt32(rows.GetByIndex(4)), - Star: q5.ToInt32(rows.GetByIndex(5)), - Rank: q5.ToInt32(rows.GetByIndex(6)), - LastLoginTime: q5.ToInt32(rows.GetByIndex(7)), - OnlineStatus: onlineStatus, - } - profiles = append(profiles, profile) - } - cb(nil, lastId, profiles) - }, - ) -} - -// loadFriendships 加载好友关系表 -func (fm *FriendsMgr) loadFriendships() { - fields := []string{"account1_id", "account2_id", "is_friendship", "createtime"} - var where [][]string - f5.GetJsStyleDb().Select( - constant.FRIEND_DB, - "t_friend_ships", - fields, - where, - func(err error, rows *f5.DataSet) { - if err != nil { - panic(err) - } - userMap := make(map[string]*User) - for rows.Next() { - account1Id := q5.ToString(rows.GetByIndex(0)) - account2Id := q5.ToString(rows.GetByIndex(1)) - isFriendship := q5.ToInt32(rows.GetByIndex(2)) - requestTime := q5.ToInt64(rows.GetByIndex(3)) - // 检查用户是否已经存在,如果不存在则创建 - user1, exists1 := userMap[account1Id] - if !exists1 { - user1 = NewUser(account1Id) - GetFriendMgr().AddUser(account1Id, user1) - userMap[account1Id] = user1 - } - user2, exists2 := userMap[account2Id] - if !exists2 { - user2 = NewUser(account2Id) - GetFriendMgr().AddUser(account2Id, user2) - userMap[account2Id] = user2 - } - // 创建好友关系并添加到用户对象中 - friendship1 := &Friendship{ - FriendAccountId: account2Id, - IsFriendship: isFriendship, - RequestTime: requestTime, - } - user1.Friendships[account2Id] = friendship1 - - friendship2 := &Friendship{ - FriendAccountId: account1Id, - IsFriendship: isFriendship, - RequestTime: requestTime, - } - user2.Friendships[account1Id] = friendship2 - } - }, - ) -} - -func (fm *FriendsMgr) loadUserFriendships(user *User, where [][]string) { - fields := []string{"account1_id", "account2_id", "is_friendship", "createtime"} - f5.GetJsStyleDb().Select( - constant.FRIEND_DB, - "t_friend_ships", - fields, - where, - func(err error, rows *f5.DataSet) { - if err != nil { - return - } - for rows.Next() { - account1Id := q5.ToString(rows.GetByIndex(0)) - account2Id := q5.ToString(rows.GetByIndex(1)) - isFriendship := q5.ToInt32(rows.GetByIndex(2)) - requestTime := q5.ToInt64(rows.GetByIndex(3)) - if user.AccountId == account1Id { - friendship1 := &Friendship{ - FriendAccountId: account2Id, - IsFriendship: isFriendship, - RequestTime: requestTime, - } - user.Friendships[account2Id] = friendship1 - - user2 := NewUser(account2Id) - GetFriendMgr().AddUser(account2Id, user2) - friendship2 := &Friendship{ - FriendAccountId: account1Id, - IsFriendship: isFriendship, - RequestTime: requestTime, - } - user2.Friendships[account1Id] = friendship2 - GetCacheMgr().LoadUserProfile(account2Id) - } - - if user.AccountId == account2Id { - friendUser := NewUser(account1Id) - GetFriendMgr().AddUser(account1Id, friendUser) - friendship := &Friendship{ - FriendAccountId: account1Id, - IsFriendship: isFriendship, - RequestTime: requestTime, - } - user.Friendships[account1Id] = friendship - GetCacheMgr().LoadUserProfile(account1Id) - } - } - }, - ) -} - -// loadPendingRequests 加载黑名单列表 -func (fm *FriendsMgr) loadBlacklist() { - fields := []string{"account_id", "blocked_account_id"} - where := [][]string{ - {"is_removed", "0"}, - } - f5.GetJsStyleDb().Select( - constant.FRIEND_DB, - "t_friend_blacklist", - fields, - where, - func(err error, rows *f5.DataSet) { - if err != nil { - return - } - for rows.Next() { - account1Id := q5.ToString(rows.GetByIndex(0)) - account2Id := q5.ToString(rows.GetByIndex(1)) - friendBlackList := &FriendBlackList{ - AccountId: account2Id, - IsRemoved: 0, - } - user := fm.GetUser(account1Id) - user.FriendBlackList[account2Id] = friendBlackList - } - }, - ) -} - -func SwapAccountIds(account1Id, account2Id string) (string, string) { - if strings.Compare(account1Id, account2Id) > 0 { - account1Id, account2Id = account2Id, account1Id - } - return account1Id, account2Id -} diff --git a/server/imserver_new/friend/friendsmgr.go b/server/imserver_new/friend/friendsmgr.go deleted file mode 100644 index f563a7ef..00000000 --- a/server/imserver_new/friend/friendsmgr.go +++ /dev/null @@ -1,368 +0,0 @@ -package friend - -import ( - "cs" - "f5" - "q5" - "sync" - "time" - "main/constant" - "main/common" - . "main/global" -) - -type FriendsMgr struct { - cs.MsgHandlerImpl - mu sync.RWMutex - Users map[string]*User // accountId -> 用户 - UserCount int // 用户总数 -} - -func (fm *FriendsMgr) init() { - fm.Users = make(map[string]*User) - fm.UserCount = 0 - fm.loadFromDB() -} - -func (fm *FriendsMgr) unInit() { - // 1. Loop struct data - // 2. Struct Data Persist to DB -} - -func (fm *FriendsMgr) loadFromDB() { - // 加载好友关系表 列表 - fm.loadFriendships() - // 加载黑名单列表 - // fm.loadBlacklist() -} - -// SearchByAccountId 搜索指定用户 -func (fm *FriendsMgr) SearchByAccountId(accountId string, cb func(errCode int32, errMsg string, playerProfile *common.PlayerProfile)) { - GetCacheMgr().GetProfileByAccountId(accountId, func(err error, profile *common.PlayerProfile) { - if err != nil { - cb(constant.ERR_CODE_SEARCH_USER_DB_FAIL, "SearchByAccountId db error", nil) - return - } - cb(0, "OK", profile) - }) -} - -// SearchUsers 搜索用户 -func (fm *FriendsMgr) SearchUsers(accountId, username string, sinceId int64, cb func(errCode int32, errMsg string, lastId int64, listFriend []*common.PlayerProfile)) { - var profiles = make([]*common.PlayerProfile, 0, constant.MaxSearchResults) - if len(username) > constant.SearchWord { - cb(constant.ERR_CODE_SEARCH_USERS_SIZE_FULL, "SearchUsers username size full", sinceId, profiles) - return - } - fm.findUsersByUsername(username, sinceId, func(err error, lastId int64, profiles []*common.PlayerProfile) { - if err != nil { - cb(constant.ERR_CODE_SEARCH_USERS_DB_FAIL, "SearchUsers username db error", sinceId, profiles) - return - } - cb(0, "OK", lastId, profiles) - }) -} - -// AddFriendRequest 添加好友请求 By default, account1Id is me -func (fm *FriendsMgr) AddFriendRequest(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) { - user1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if user2 == nil { - user2 = fm.LoadUser(account2Id) - } - - //found1 := user1.IsInBlacklist(account2Id) - //found2 := user2.IsInBlacklist(account1Id) - //if found1 || found2 { - // cb(ERR_CODE_USER_IN_BLACKLIST, "AddFriendRequest user in blacklist") - // return - //} - - // 检查已发送请求 - friendship, exists := user1.Friendships[account2Id] - if exists { - if friendship.IsFriendship == 0 { - cb(constant.ERR_CODE_OK, "AddFriendRequest ok") - return - } - if friendship.IsFriendship == 1 { - cb(constant.ERR_CODE_ALREADY_FRIEND, "Already a friend") - return - } - } - - // 好友已满 - if fm.GetFriendCount(account1Id) >= constant.MaxFriendMembers || fm.GetFriendCount(account2Id) >= constant.MaxFriendMembers { - cb(constant.ERR_CODE_FRIENDSHIP_IS_FULL, "AddFriendRequest friendship is full") - return - } - - // 待请求已满 - if fm.GetFriendRequestCount(account1Id) >= constant.MaxPendingFriendReqs || - fm.GetFriendRequestCount(account2Id) >= constant.MaxPendingFriendReqs { - cb(constant.ERR_CODE_PENDING_REQUEST_IS_FULL, "AddFriendRequest pending request is full") - return - } - requestTime := time.Now().Unix() - fm.upsertFriendShip(account1Id, account2Id, constant.FriendshipStatusPending, requestTime, func(err error) { - if err != nil { - cb(constant.ERR_CODE_UPDATE_FRIENDSHIP_DB_FAIL, "AddFriendRequest update friendship db error") - f5.GetSysLog().Info("AddFriendRequest update friendship db error") - return - } - - user1.AddFriendRequest(account2Id, constant.FriendshipStatusPending, requestTime) - user2.AddFriendRequest(account1Id, constant.FriendshipStatusPending, requestTime) - - cb(constant.ERR_CODE_OK, "AddFriendRequest ok") - }) -} - -// AcceptFriendRequest 接受好友请求 -func (fm *FriendsMgr) AcceptFriendRequest(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) { - user1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if user2 == nil { - user2 = fm.LoadUser(account2Id) - } - - friendship, exists := user1.Friendships[account2Id] - if !exists { - cb(constant.ERR_CODE_NO_IN_REQ, "AcceptFriendRequest user2 no in user1 pending request") - return - } - if friendship.IsFriendship != 0 { - cb(constant.ERR_CODE_ALREADY_FRIEND, "Already a friend") - return - } - - if fm.GetFriendCount(account1Id) >= constant.MaxFriendMembers || fm.GetFriendCount(account2Id) >= constant.MaxFriendMembers { - cb(constant.ERR_CODE_USERS_IS_FULL, "AcceptFriendRequest users is full") - return - } - - requestTime := time.Now().Unix() - fm.upsertFriendShip(account1Id, account2Id, constant.FriendshipStatusOK, requestTime, func(err error) { - if err != nil { - cb(constant.ERR_CODE_UPDATE_FRIENDSHIP_DB_FAIL, "AcceptFriendRequest update friendship db error") - return - } - - friendship1 := &Friendship{ - FriendAccountId: account2Id, - IsFriendship: constant.FriendshipStatusOK, - RequestTime: time.Now().Unix(), - } - user1.Friendships[account2Id] = friendship1 - - friendship2 := &Friendship{ - FriendAccountId: account1Id, - IsFriendship: constant.FriendshipStatusOK, - RequestTime: time.Now().Unix(), - } - user2.Friendships[account1Id] = friendship2 - - cb(constant.ERR_CODE_OK, "") - }) -} - -// RejectFriendRequest 拒绝好友请求 -func (fm *FriendsMgr) RejectFriendRequest(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) { - user1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if user2 == nil { - user2 = fm.LoadUser(account2Id) - } - if user1 == nil || user2 == nil { - cb(constant.ERR_CODE_USERS_NO_EXISTS, "RejectFriendRequest user no exists") - return - } - - friendship, exists := user1.Friendships[account2Id] - if !exists { - cb(constant.ERR_CODE_NO_IN_REQ, "AcceptFriendRequest user2 no in user1 pending request") - return - } - if friendship.IsFriendship == 1 { - cb(constant.ERR_CODE_ALREADY_FRIEND, "Already a friend") - return - } - - requestTime := time.Now().Unix() - fm.upsertFriendShip(account2Id, account1Id, constant.FriendshipStatusReject, requestTime, func(err error) { - if err != nil { - cb(constant.ERR_CODE_UPDATE_PENDING_REQUEST_DB_FAIL, "RejectFriendRequest update pending request db error") - return - } - user1.RemoveFriendRequest(account2Id) - user2.RemoveFriendRequest(account1Id) - cb(constant.ERR_CODE_OK, "") - }) -} - -// DeleteFriendShip 删除好友 -func (fm *FriendsMgr) DeleteFriendShip(account1Id, account2Id string, cb func(errCode int32, errMsg string)) { - user1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if user2 == nil { - user2 = fm.LoadUser(account2Id) - } - - if user1 == nil || user2 == nil { - cb(constant.ERR_CODE_USERS_NO_EXISTS, "DeleteFriendShip user no exists") - return - } - - friendship, exists := user1.Friendships[account2Id] - if !exists || friendship.IsFriendship != 1 { - cb(constant.ERR_CODE_FRIEND_NO_EXISTS, "DeleteFriendShip user no exists") - return - } - - user1.RemoveFriendShip(account2Id) - user2.RemoveFriendShip(account1Id) - - updateFields := [][]string{{"is_friendship", q5.ToString(constant.FriendshipStatusDeleted)}} - fm.updateFriendShip(account1Id, account2Id, updateFields, func(err error) { - if err != nil { - f5.GetSysLog().Info("DeleteFriendShip, updateFriendShip accountId:[%s-%s], db error:%s", account1Id, account2Id, err) - cb(constant.ERR_CODE_UPDATE_FRIENDSHIP_DB_FAIL, "DeleteFriendShip update friendship db error") - return - } - cb(constant.ERR_CODE_OK, "") - }) -} - -// AddBlacklist 加入黑名单 -func (fm *FriendsMgr) AddBlacklist(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) { - User1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if User1 == nil || user2 == nil { - cb(constant.ERR_CODE_USERS_NO_EXISTS, "AddBlacklist user no exists") - return - } - - user2Blocked := User1.GetBlacklist(account2Id) - if user2Blocked != nil && user2Blocked.IsRemoved != 0 { - cb(constant.ERR_CODE_USER_IN_BLACKLIST, "AddBlacklist user in blacklist") - return - } - - if User1.GetBlacklistCount() >= constant.MaxBlockedMembers { - cb(constant.ERR_CODE_BLACKLIST_FULL, "AddBlacklist blacklist is full") - return - } - - fm.upsertBlacklist(account1Id, account2Id, constant.BlacklistStatusDefault, func(err error) { - if err != nil { - cb(constant.ERR_CODE_UPDATE_BLACKLIST_DB_FAIL, err.Error()) - return - } - User1.AddBlacklist(&FriendBlackList{ - AccountId: account2Id, - IsRemoved: 0, - }) - cb(constant.ERR_CODE_OK, "") - }) -} - -// RemoveBlacklist 移除黑名单 -func (fm *FriendsMgr) RemoveBlacklist(account1Id string, account2Id string, cb func(errCode int32, errMsg string)) { - user1 := fm.GetUser(account1Id) - user2 := fm.GetUser(account2Id) - if user1 == nil || user2 == nil { - cb(constant.ERR_CODE_USERS_NO_EXISTS, "RemoveBlacklist user no exists") - return - } - - user2Blocked := user1.GetBlacklist(account2Id) - if user2Blocked == nil || user2Blocked.IsRemoved == 1 { - cb(constant.ERR_CODE_USER_NOT_IN_BLACKLIST, "RemoveBlacklist user not in blacklist") - return - } - - fm.upsertBlacklist(account1Id, account2Id, constant.BlacklistStatusIsRemoved, func(err error) { - if err != nil { - cb(constant.ERR_CODE_UPDATE_BLACKLIST_DB_FAIL, err.Error()) - return - } - user1.RemoveBlacklist(account2Id) - cb(constant.ERR_CODE_OK, "") - }) -} - -// GetFriendCount 好友数量 -func (fm *FriendsMgr) GetFriendCount(accountId string) int { - user := fm.GetUser(accountId) - return len(user.Friendships) -} - -// GetFriendRequestCount 等待请求数量 -func (fm *FriendsMgr) GetFriendRequestCount(accountId string) int { - user := fm.GetUser(accountId) - if user != nil { - count := 0 - for _, friendship := range user.Friendships { - if friendship.IsFriendship == 0 { - count++ - } - } - return count - } - return 0 -} - -func (fm *FriendsMgr) CleanFriendship(accountID string) { - user := fm.GetUser(accountID) - if user != nil { - user.Friendships = make(map[string]*Friendship, constant.MaxFriendMembers) - } -} - -func (fm *FriendsMgr) AddFriendshipToMap(accountID string, friendship *Friendship) { - user := fm.GetUser(accountID) - user.Friendships[friendship.FriendAccountId] = friendship -} - -func (fm *FriendsMgr) GetFriendByAccountId(account1Id, account2Id string) *User { - user := fm.GetUser(account1Id) - friendship, exists := user.Friendships[account2Id] - if exists && friendship.IsFriendship == 1 { - return fm.GetUser(account2Id) - } - return nil -} - -func (fm *FriendsMgr) AddUser(accountId string, user *User) { - if _, exists := fm.Users[accountId]; !exists { - fm.Users[accountId] = user - //fm.UserCount = len(fm.Users) - fm.UserCount++ - } -} - -func (fm *FriendsMgr) GetUser(accountId string) *User { - if user, ok := fm.Users[accountId]; ok { - return user - } - return nil -} - -func (fm *FriendsMgr) LoadUser(accountId string) *User { - existsUser, exists := fm.Users[accountId] - if !exists { - user := NewUser(accountId) - GetFriendMgr().AddUser(accountId, user) - // 加载我的好友关系表 - GetFriendMgr().LoadUserFriendships(user, [][]string{ - {"account1_id", user.AccountId}, - }) - GetFriendMgr().LoadUserFriendships(user, [][]string{ - {"account2_id", user.AccountId}, - }) - // 加载我的黑名单列表 - // friendMgr.loadBlacklist(user) - return user - } - return existsUser -} diff --git a/server/matchserver/team/matchmgr.go b/server/matchserver/team/matchmgr.go index 40b3acd6..59ea7cfe 100644 --- a/server/matchserver/team/matchmgr.go +++ b/server/matchserver/team/matchmgr.go @@ -110,7 +110,9 @@ func (this *matchMgr) execMatch(m *matchingInfo) { func (this *matchMgr) onMatchOk(m *matchingInfo) { f5.GetTimer().DeleteRunningTimer() - f5.GetTimer().Delete(m.matchOk.matchTimerWp) + if !m.matchOk.matchTimerWp.Expired() { + f5.GetTimer().Delete(m.matchOk.matchTimerWp) + } m.team.setMatchOk(m.matchOk.team) m.matchOk.team.setMatchOk(m.team) diff --git a/server/matchserver/team/team.go b/server/matchserver/team/team.go index 326db209..fe6b88ad 100644 --- a/server/matchserver/team/team.go +++ b/server/matchserver/team/team.go @@ -205,7 +205,7 @@ func (this *team) GetMemberNum() int32 { } func (this *team) chooseNextLeader() { - nextLeader := this.owner + var nextLeader common.Player for _, m := range this.memberIdHash { if nextLeader == nil { nextLeader = m