1
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:app/request/dto/room/room_info_dto.dart';
|
||||
import 'package:app/request/dto/room/room_user_dto.dart';
|
||||
import 'package:app/request/dto/room/rtc_token_dto.dart';
|
||||
import 'package:app/request/websocket/room_protocol.dart';
|
||||
@@ -7,18 +10,16 @@ import 'package:flutter/cupertino.dart';
|
||||
|
||||
import 'type.dart';
|
||||
|
||||
class StudentsViewModel extends ChangeNotifier {
|
||||
StudentsViewModel({required this.roomId, String? start}) {
|
||||
startTime = parseTime(start!);
|
||||
class TchRoomVM extends ChangeNotifier {
|
||||
TchRoomVM({required this.roomInfo, String? start}) {
|
||||
_startRoom();
|
||||
}
|
||||
|
||||
///学生摄像头列表
|
||||
List<RoomUserDto> _students = [];
|
||||
|
||||
///房间的基础信息,房间id、房间开始时间
|
||||
final int roomId;
|
||||
late final DateTime startTime;
|
||||
///房间的基础信息
|
||||
final RoomInfoDto roomInfo;
|
||||
|
||||
///老师选中的学生id
|
||||
int activeSId = 0;
|
||||
@@ -28,7 +29,7 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
///是否能开始自习室
|
||||
bool get canEnterRoom {
|
||||
final now = DateTime.now();
|
||||
if (now.isAfter(startTime)) {
|
||||
if (now.isAfter(parseTime(roomInfo.startTime))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -36,6 +37,8 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
|
||||
///websocket管理
|
||||
final RoomWebSocket _ws = RoomWebSocket();
|
||||
bool wsConnected = false; // socket连接状态
|
||||
StreamSubscription<RoomMessage>? _sub;
|
||||
|
||||
RtcTokenDto? get rtcToken => _ws.rtcToken;
|
||||
|
||||
@@ -43,18 +46,16 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
void _startRoom() async {
|
||||
//如果socket的token没有,先初始化
|
||||
if (_ws.wsToken.isEmpty) {
|
||||
await _ws.initToken(roomId);
|
||||
await _ws.initToken(roomInfo.id);
|
||||
}
|
||||
//启动连接
|
||||
await _ws.connect();
|
||||
//进入房间命令
|
||||
_ws.send(RoomCommand.joinRoom);
|
||||
|
||||
wsConnected = true;
|
||||
//监听各种ws事件
|
||||
_ws.stream.listen((msg) {
|
||||
_sub = _ws.stream.listen((msg) {
|
||||
// 自习室人员变化
|
||||
if (msg.event == RoomEvent.changeUser) {
|
||||
final list = msg.data['user_list'].map((x) => RoomUserDto.fromJson(x)).toList();
|
||||
final list = RoomUserDto.listFromJson(msg.data['user_list']);
|
||||
onStudentChange(list);
|
||||
} else if ([
|
||||
RoomEvent.openSpeaker,
|
||||
@@ -65,8 +66,7 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
RoomEvent.closeCamera,
|
||||
RoomEvent.handUp,
|
||||
].contains(msg.event)) {
|
||||
onSyncStudentStatus();
|
||||
//TODO 直接同步服务器最新的数组覆盖,或者覆盖这一条学生的
|
||||
onSyncStudentItem(RoomUserDto.fromJson(msg.data));
|
||||
}
|
||||
});
|
||||
notifyListeners();
|
||||
@@ -91,29 +91,31 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
///手动关闭学生扬声器、摄像头、麦克风等操作
|
||||
/// - [uId]: 学生id
|
||||
/// - [action]: 操作类型
|
||||
void closeStudentSpeaker({
|
||||
void closeStudentAction({
|
||||
required int uId,
|
||||
required StudentAction action,
|
||||
}) {
|
||||
final student = _students.firstWhere((t) => t.userId == uId);
|
||||
|
||||
Map<String, int> data = {
|
||||
Map<String, dynamic> data = {
|
||||
'target_user_id': uId,
|
||||
"mute_type": action.value,
|
||||
};
|
||||
//如果是控制扬声器
|
||||
if (action == StudentAction.speaker) {
|
||||
student.speekerStatus = student.speekerStatus == 0 ? 1 : 0;
|
||||
data['speeker'] = student.speekerStatus;
|
||||
bool isOpen = student.speekerStatus == 1;
|
||||
student.speekerStatus = isOpen ? 0 : 1;
|
||||
data['is_mute'] = isOpen ? 1 : 0;
|
||||
} else if (action == StudentAction.camera) {
|
||||
//如果是摄像头,只能关
|
||||
if (student.cameraStatus == 0) return;
|
||||
student.cameraStatus = 0;
|
||||
data['camera'] = 0;
|
||||
data['is_mute'] = 1;
|
||||
} else if (action == StudentAction.microphone) {
|
||||
//如果是麦克风,只能关
|
||||
if (student.microphoneStatus == 0) return;
|
||||
student.microphoneStatus = 0;
|
||||
data['microphone'] = 0;
|
||||
data['is_mute'] = 1;
|
||||
}
|
||||
notifyListeners();
|
||||
_ws.send(RoomCommand.switchStudentCamera, data);
|
||||
@@ -143,13 +145,21 @@ class StudentsViewModel extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
//TODO 同步学生的最新状态
|
||||
void onSyncStudentStatus() {}
|
||||
/// 同步单个学生的最新状态
|
||||
void onSyncStudentItem(RoomUserDto userInfo) {
|
||||
final index = _students.indexWhere((t) => t.userId == userInfo.userId);
|
||||
print(userInfo.toString());
|
||||
if (index != -1) {
|
||||
_students[index] = userInfo;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
//销毁
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_sub?.cancel();
|
||||
_ws.dispose();
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,15 @@
|
||||
///老师操作学生的状态、摄像头、扬声器、麦克风
|
||||
enum StudentAction {
|
||||
///摄像头
|
||||
camera,
|
||||
camera("camera"),
|
||||
|
||||
///麦克风
|
||||
microphone,
|
||||
microphone("microphone"),
|
||||
|
||||
///扬声器
|
||||
speaker,
|
||||
speaker("speeker");
|
||||
|
||||
final String value;
|
||||
|
||||
const StudentAction(this.value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user