mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-11-04 19:32:17 +08:00 
			
		
		
		
	online status
This commit is contained in:
		
							parent
							
								
									fd2b0b3284
								
							
						
					
					
						commit
						67d17c82d5
					
				
							
								
								
									
										100
									
								
								pkg/common/storage/cache/redis/user.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								pkg/common/storage/cache/redis/user.go
									
									
									
									
										vendored
									
									
								
							@ -128,106 +128,6 @@ func (u *UserCacheRedis) DelUsersGlobalRecvMsgOpt(userIDs ...string) cache.UserC
 | 
				
			|||||||
	return cache
 | 
						return cache
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type RedisUserOnline struct {
 | 
					 | 
				
			||||||
	// 平台id, 平台更新时间
 | 
					 | 
				
			||||||
	PlatformIDs map[int32]int64
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetUserStatus get user status.
 | 
					 | 
				
			||||||
//func (u *UserCacheRedis) GetUserStatus(ctx context.Context, userIDs []string) ([]*user.OnlineStatus, error) {
 | 
					 | 
				
			||||||
//	userStatus := make([]*user.OnlineStatus, 0, len(userIDs))
 | 
					 | 
				
			||||||
//	for _, userID := range userIDs {
 | 
					 | 
				
			||||||
//		UserIDNum := crc32.ChecksumIEEE([]byte(userID))
 | 
					 | 
				
			||||||
//		modKey := strconv.Itoa(int(UserIDNum % statusMod))
 | 
					 | 
				
			||||||
//		var onlineStatus user.OnlineStatus
 | 
					 | 
				
			||||||
//		key := u.getOnlineStatusKey(modKey)
 | 
					 | 
				
			||||||
//		result, err := u.rdb.HGet(ctx, key, userID).Result()
 | 
					 | 
				
			||||||
//		if err != nil {
 | 
					 | 
				
			||||||
//			if errors.Is(err, redis.Nil) {
 | 
					 | 
				
			||||||
//				// key or field does not exist
 | 
					 | 
				
			||||||
//				userStatus = append(userStatus, &user.OnlineStatus{
 | 
					 | 
				
			||||||
//					UserID:      userID,
 | 
					 | 
				
			||||||
//					Status:      constant.Offline,
 | 
					 | 
				
			||||||
//					PlatformIDs: nil,
 | 
					 | 
				
			||||||
//				})
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//				continue
 | 
					 | 
				
			||||||
//			} else {
 | 
					 | 
				
			||||||
//				return nil, errs.Wrap(err)
 | 
					 | 
				
			||||||
//			}
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//		err = json.Unmarshal([]byte(result), &onlineStatus)
 | 
					 | 
				
			||||||
//		if err != nil {
 | 
					 | 
				
			||||||
//			return nil, errs.Wrap(err)
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//		onlineStatus.UserID = userID
 | 
					 | 
				
			||||||
//		onlineStatus.Status = constant.Online
 | 
					 | 
				
			||||||
//		userStatus = append(userStatus, &onlineStatus)
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//	return userStatus, nil
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetUserStatus Set the user status and save it in redis.
 | 
					 | 
				
			||||||
//func (u *UserCacheRedis) SetUserStatus(ctx context.Context, userID string, status, platformID int32) error {
 | 
					 | 
				
			||||||
//	UserIDNum := crc32.ChecksumIEEE([]byte(userID))
 | 
					 | 
				
			||||||
//	modKey := strconv.Itoa(int(UserIDNum % statusMod))
 | 
					 | 
				
			||||||
//	key := u.getOnlineStatusKey(modKey)
 | 
					 | 
				
			||||||
//	log.ZDebug(ctx, "SetUserStatus args", "userID", userID, "status", status, "platformID", platformID, "modKey", modKey, "key", key)
 | 
					 | 
				
			||||||
//	isNewKey, err := u.rdb.Exists(ctx, key).Result()
 | 
					 | 
				
			||||||
//	if err != nil {
 | 
					 | 
				
			||||||
//		return errs.Wrap(err)
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
//	if isNewKey == 0 {
 | 
					 | 
				
			||||||
//		if status == constant.Online {
 | 
					 | 
				
			||||||
//			onlineStatus := user.OnlineStatus{
 | 
					 | 
				
			||||||
//				UserID:      userID,
 | 
					 | 
				
			||||||
//				Status:      constant.Online,
 | 
					 | 
				
			||||||
//				PlatformIDs: []int32{platformID},
 | 
					 | 
				
			||||||
//			}
 | 
					 | 
				
			||||||
//			jsonData, err := json.Marshal(&onlineStatus)
 | 
					 | 
				
			||||||
//			if err != nil {
 | 
					 | 
				
			||||||
//				return errs.Wrap(err)
 | 
					 | 
				
			||||||
//			}
 | 
					 | 
				
			||||||
//			_, err = u.rdb.HSet(ctx, key, userID, string(jsonData)).Result()
 | 
					 | 
				
			||||||
//			if err != nil {
 | 
					 | 
				
			||||||
//				return errs.Wrap(err)
 | 
					 | 
				
			||||||
//			}
 | 
					 | 
				
			||||||
//			u.rdb.Expire(ctx, key, userOlineStatusExpireTime)
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//			return nil
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//	isNil := false
 | 
					 | 
				
			||||||
//	result, err := u.rdb.HGet(ctx, key, userID).Result()
 | 
					 | 
				
			||||||
//	if err != nil {
 | 
					 | 
				
			||||||
//		if errors.Is(err, redis.Nil) {
 | 
					 | 
				
			||||||
//			isNil = true
 | 
					 | 
				
			||||||
//		} else {
 | 
					 | 
				
			||||||
//			return errs.Wrap(err)
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//	if status == constant.Offline {
 | 
					 | 
				
			||||||
//		err = u.refreshStatusOffline(ctx, userID, status, platformID, isNil, err, result, key)
 | 
					 | 
				
			||||||
//		if err != nil {
 | 
					 | 
				
			||||||
//			return err
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//	} else {
 | 
					 | 
				
			||||||
//		err = u.refreshStatusOnline(ctx, userID, platformID, isNil, err, result, key)
 | 
					 | 
				
			||||||
//		if err != nil {
 | 
					 | 
				
			||||||
//			return errs.Wrap(err)
 | 
					 | 
				
			||||||
//		}
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//	return nil
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (u *UserCacheRedis) refreshStatusOffline(ctx context.Context, userID string, status, platformID int32, isNil bool, err error, result, key string) error {
 | 
					func (u *UserCacheRedis) refreshStatusOffline(ctx context.Context, userID string, status, platformID int32, isNil bool, err error, result, key string) error {
 | 
				
			||||||
	if isNil {
 | 
						if isNil {
 | 
				
			||||||
		log.ZWarn(ctx, "this user not online,maybe trigger order not right",
 | 
							log.ZWarn(ctx, "this user not online,maybe trigger order not right",
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user