chat-demo/src/main/java/com/zhangshu/chat/demo/service/RoomCache.java

114 lines
3.6 KiB
Java

package com.zhangshu.chat.demo.service;
import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import cn.hutool.core.lang.UUID;
import com.zhangshu.chat.demo.constant.ERoomUserType;
import com.zhangshu.chat.demo.entity.Room;
import com.zhangshu.chat.demo.vo.RoomUserVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
@Component
public class RoomCache {
private final Cache<String, Room> roomCache = CacheUtil.newFIFOCache(4);
private final Cache<Long, String> userRoomCache = CacheUtil.newFIFOCache(16);
/**
* 正在创建
*/
private final Cache<String, Room> roomCreatingCache = CacheUtil.newFIFOCache(4);
public List<Room> list() {
List<Room> resp = new ArrayList<>(roomCache.size());
roomCache.forEach(resp::add);
return resp;
}
/**
*
* @param userId
* @return
* NullException
*/
public Room getRoomByUser(Long userId){
String roomId = userRoomCache.get(userId);
if (StringUtils.isBlank(roomId)) {
return null;
}
return roomCache.get(roomId);
}
public boolean isExistUser(Long userId){
return userRoomCache.containsKey(userId);
}
public synchronized Room addCreating(String roomName) {
Room room = Room.builder()
.id(UUID.fastUUID().toString())
.name(roomName)
.build();
roomCreatingCache.put(room.getId(), room);
return room;
}
public boolean createSuccess(String roomId) {
return roomCache.containsKey(roomId);
}
public Room get(String roomId) {
return roomCache.get(roomId);
}
public synchronized void add(String roomId) {
Room room = roomCreatingCache.get(roomId);
if (Objects.isNull(room)) {
return;
}
roomCache.put(roomId, room);
roomCreatingCache.remove(roomId);
}
public synchronized void addUser(String roomId, RoomUserVo user) {
Room room = roomCache.get(roomId);
if (Objects.nonNull(room) && room.getUserList().stream().noneMatch(v -> v.getId().equals(user.getId()))) {
if (room.getUserList().size() == 0) {
user.setType(ERoomUserType.lord);
}
room.getUserList().add(user);
userRoomCache.put(user.getId(), room.getId());
}
}
public void remove(String roomId) {
roomCache.remove(roomId);
}
public synchronized void removeUser(String roomId, Long userId) {
Room room = roomCache.get(roomId);
if (Objects.nonNull(room)) {
room.getUserList().stream().filter(v -> v.getId().equals(userId)).findFirst().ifPresent(user -> {
room.getUserList().remove(user);
userRoomCache.remove(userId);
//设置最早的一个成为房主
if (ERoomUserType.lord.equals(user.getType())) {
room.getUserList().stream().filter(v->ERoomUserType.broadcaster.equals(v.getType()))
.min(Comparator.comparing(RoomUserVo::getJoinTime))
.ifPresent(user2 -> user2.setType(ERoomUserType.lord));
}
});
}
}
public void changeUserType(String roomId, Long userId, ERoomUserType type) {
Room room = roomCache.get(roomId);
if (Objects.nonNull(room)) {
room.getUserList().stream().filter(v -> v.getId().equals(userId)).findFirst().ifPresent(v -> v.setType(type));
}
}
}