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 mapToBean(Map map, Class 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; } } }