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

97 lines
4.0 KiB
Java

package com.zhangshu.chat.demo.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.zhangshu.chat.demo.config.AgoraProperties;
import com.zhangshu.chat.demo.constant.ERoomUserType;
import com.zhangshu.chat.demo.dto.AgoraChannelEventDto;
import com.zhangshu.chat.demo.dto.AgoraChannelUserEventDto;
import com.zhangshu.chat.demo.dto.AgoraEventDto;
import com.zhangshu.chat.demo.entity.User;
import com.zhangshu.chat.demo.mapper.UserMapper;
import com.zhangshu.chat.demo.vo.RoomUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Objects;
@Service
@EnableConfigurationProperties(AgoraProperties.class)
public class EventServiceImpl implements EventService {
@Autowired
AgoraProperties agoraProperties;
@Autowired
RoomCache roomCache;
@Autowired
UserMapper userMapper;
<T> T mapToBean(Map<String, Object> map, Class<T> targetClass) {
return BeanUtil.mapToBean(map, targetClass, false, CopyOptions.create());
}
@Override
public void agora(AgoraEventDto dto) {
switch (dto.getEventType()) {
case channel_create: {
AgoraChannelEventDto eventDto = dto.convert(AgoraChannelEventDto.class);
roomCache.add(eventDto.getChannelName());
}
break;
case channel_destroy: {
AgoraChannelEventDto eventDto = dto.convert(AgoraChannelEventDto.class);
roomCache.remove(eventDto.getChannelName());
}
break;
case user_join_channel_with_communication_mode:
case broadcaster_join_channel: {
AgoraChannelUserEventDto eventDto = dto.convert(AgoraChannelUserEventDto.class);
User user = userMapper.selectById(eventDto.getUid());
if (Objects.isNull(user)) {
break;
}
roomCache.addUser(eventDto.getChannelName(), RoomUserVo.builder()
.id(eventDto.getUid())
.username(user.getUsername())
.nickname(user.getNickname())
.type(ERoomUserType.broadcaster)
.lastClientSeq(eventDto.getClientSeq())
.build());
}
break;
case user_leave_channel_with_communication_mode:
case broadcaster_leave_channel:
case audience_leave_channel: {
AgoraChannelUserEventDto eventDto = dto.convert(AgoraChannelUserEventDto.class);
roomCache.removeUser(eventDto.getChannelName(), eventDto.getUid());
}
break;
case audience_join_channel: {
AgoraChannelUserEventDto eventDto = dto.convert(AgoraChannelUserEventDto.class);
User user = userMapper.selectById(eventDto.getUid());
if (Objects.isNull(user)) {
break;
}
roomCache.addUser(eventDto.getChannelName(), RoomUserVo.builder()
.id(eventDto.getUid())
.nickname(user.getNickname())
.type(ERoomUserType.audience)
.lastClientSeq(eventDto.getClientSeq())
.build());
}
break;
case client_role_change_to_audience: {
AgoraChannelUserEventDto eventDto = dto.convert(AgoraChannelUserEventDto.class);
roomCache.changeUserType(eventDto.getChannelName(), eventDto.getUid(), ERoomUserType.audience);
}
break;
case client_role_change_to_broadcaster: {
AgoraChannelUserEventDto eventDto = dto.convert(AgoraChannelUserEventDto.class);
roomCache.changeUserType(eventDto.getChannelName(), eventDto.getUid(), ERoomUserType.broadcaster);
}
break;
}
}
}