You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
8.8 KiB
Dart
285 lines
8.8 KiB
Dart
import 'dart:async';
|
|
import 'dart:developer';
|
|
|
|
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
|
import 'package:collection/collection.dart';
|
|
import 'package:fluffychat/pangea/constants/class_default_values.dart';
|
|
import 'package:fluffychat/pangea/constants/model_keys.dart';
|
|
import 'package:fluffychat/pangea/constants/pangea_room_types.dart';
|
|
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';
|
|
import 'package:fluffychat/pangea/models/analytics/analytics_event.dart';
|
|
import 'package:fluffychat/pangea/models/analytics/constructs_event.dart';
|
|
import 'package:fluffychat/pangea/models/analytics/summary_analytics_event.dart';
|
|
import 'package:fluffychat/pangea/models/analytics/summary_analytics_model.dart';
|
|
import 'package:fluffychat/pangea/models/bot_options_model.dart';
|
|
import 'package:fluffychat/pangea/models/class_model.dart';
|
|
import 'package:fluffychat/pangea/models/tokens_event_content_model.dart';
|
|
import 'package:fluffychat/pangea/utils/bot_name.dart';
|
|
import 'package:fluffychat/pangea/utils/error_handler.dart';
|
|
import 'package:fluffychat/widgets/matrix.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
|
// import markdown.dart
|
|
import 'package:html_unescape/html_unescape.dart';
|
|
import 'package:matrix/matrix.dart';
|
|
import 'package:matrix/src/utils/markdown.dart';
|
|
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
|
|
import '../../../config/app_config.dart';
|
|
import '../../constants/pangea_event_types.dart';
|
|
import '../../enum/use_type.dart';
|
|
import '../../models/choreo_record.dart';
|
|
import '../../models/representation_content_model.dart';
|
|
import '../client_extension/client_extension.dart';
|
|
|
|
part "children_and_parents_extension.dart";
|
|
part "class_and_exchange_settings_extension.dart";
|
|
part "events_extension.dart";
|
|
part "room_analytics_extension.dart";
|
|
part "room_information_extension.dart";
|
|
part "room_settings_extension.dart";
|
|
part "user_permissions_extension.dart";
|
|
|
|
extension PangeaRoom on Room {
|
|
// analytics
|
|
|
|
Future<void> joinAnalyticsRoomsInSpace() async =>
|
|
await _joinAnalyticsRoomsInSpace();
|
|
|
|
Future<void> ensureAnalyticsRoomExists() async =>
|
|
await _ensureAnalyticsRoomExists();
|
|
|
|
Future<void> addAnalyticsRoomToSpace(Room analyticsRoom) async =>
|
|
await _addAnalyticsRoomToSpace(analyticsRoom);
|
|
|
|
Future<void> addAnalyticsRoomToSpaces() async =>
|
|
await _addAnalyticsRoomToSpaces();
|
|
|
|
Future<void> addAnalyticsRoomsToSpace() async =>
|
|
await _addAnalyticsRoomsToSpace();
|
|
|
|
Future<void> inviteSpaceTeachersToAnalyticsRoom(Room analyticsRoom) async =>
|
|
await _inviteSpaceTeachersToAnalyticsRoom(analyticsRoom);
|
|
|
|
Future<void> inviteTeachersToAnalyticsRoom() async =>
|
|
await _inviteTeachersToAnalyticsRoom();
|
|
|
|
// Invite teachers of 1 space to all users' analytics rooms
|
|
Future<void> inviteSpaceTeachersToAnalyticsRooms() async =>
|
|
await _inviteSpaceTeachersToAnalyticsRooms();
|
|
|
|
Future<AnalyticsEvent?> getLastAnalyticsEvent(
|
|
String type,
|
|
String userId,
|
|
) async =>
|
|
await _getLastAnalyticsEvent(type, userId);
|
|
|
|
Future<DateTime?> analyticsLastUpdated(String type, String userId) async {
|
|
return await _analyticsLastUpdated(type, userId);
|
|
}
|
|
|
|
Future<List<AnalyticsEvent>?> getAnalyticsEvents({
|
|
required String type,
|
|
required String userId,
|
|
DateTime? since,
|
|
}) async =>
|
|
await _getAnalyticsEvents(type: type, since: since, userId: userId);
|
|
|
|
String? get madeForLang => _madeForLang;
|
|
|
|
bool isMadeForLang(String langCode) => _isMadeForLang(langCode);
|
|
|
|
// children_and_parents
|
|
|
|
List<Room> get joinedChildren => _joinedChildren;
|
|
|
|
List<String> get joinedChildrenRoomIds => _joinedChildrenRoomIds;
|
|
|
|
Future<List<Room>> getChildRooms() async => await _getChildRooms();
|
|
|
|
Future<void> joinSpaceChild(String roomID) async =>
|
|
await _joinSpaceChild(roomID);
|
|
|
|
Room? firstParentWithState(String stateType) =>
|
|
_firstParentWithState(stateType);
|
|
|
|
List<Room> get immediateClassParents => _immediateClassParents;
|
|
|
|
List<Room> get pangeaSpaceParents => _pangeaSpaceParents;
|
|
|
|
List<String> get allSpaceChildRoomIds => _allSpaceChildRoomIds;
|
|
|
|
// class_and_exchange_settings
|
|
|
|
DateTime? get rulesUpdatedAt => _rulesUpdatedAt;
|
|
|
|
String get classCode => _classCode;
|
|
|
|
void checkClass() => _checkClass();
|
|
|
|
List<User> get students => _students;
|
|
|
|
Future<List<User>> get teachers async => await _teachers;
|
|
|
|
Future<void> setClassPowerLevels() async => await _setClassPowerLevels();
|
|
|
|
DateTime? get classSettingsUpdatedAt => _classSettingsUpdatedAt;
|
|
|
|
ClassSettingsModel? get classSettings => _classSettings;
|
|
|
|
Event? get languageSettingsStateEvent => _languageSettingsStateEvent;
|
|
|
|
Event? get pangeaRoomRulesStateEvent => _pangeaRoomRulesStateEvent;
|
|
|
|
ClassSettingsModel? get firstLanguageSettings => _firstLanguageSettings;
|
|
|
|
// events
|
|
|
|
Future<bool> leaveIfFull() async => await _leaveIfFull();
|
|
Future<void> archive() async => await _archive();
|
|
|
|
Future<bool> archiveSpace(
|
|
BuildContext context,
|
|
Client client, {
|
|
bool onlyAdmin = false,
|
|
}) async =>
|
|
await _archiveSpace(context, client, onlyAdmin: onlyAdmin);
|
|
|
|
Future<bool> leaveSpace(BuildContext context, Client client) async =>
|
|
await _leaveSpace(context, client);
|
|
|
|
Future<Event?> sendPangeaEvent({
|
|
required Map<String, dynamic> content,
|
|
required String parentEventId,
|
|
required String type,
|
|
}) async =>
|
|
await _sendPangeaEvent(
|
|
content: content,
|
|
parentEventId: parentEventId,
|
|
type: type,
|
|
);
|
|
|
|
Future<String?> pangeaSendTextEvent(
|
|
String message, {
|
|
String? txid,
|
|
Event? inReplyTo,
|
|
String? editEventId,
|
|
bool parseMarkdown = true,
|
|
bool parseCommands = false,
|
|
String msgtype = MessageTypes.Text,
|
|
String? threadRootEventId,
|
|
String? threadLastEventId,
|
|
PangeaRepresentation? originalSent,
|
|
PangeaRepresentation? originalWritten,
|
|
PangeaMessageTokens? tokensSent,
|
|
PangeaMessageTokens? tokensWritten,
|
|
ChoreoRecord? choreo,
|
|
UseType? useType,
|
|
}) =>
|
|
_pangeaSendTextEvent(
|
|
message,
|
|
txid: txid,
|
|
inReplyTo: inReplyTo,
|
|
editEventId: editEventId,
|
|
parseMarkdown: parseMarkdown,
|
|
parseCommands: parseCommands,
|
|
msgtype: msgtype,
|
|
threadRootEventId: threadRootEventId,
|
|
threadLastEventId: threadLastEventId,
|
|
originalSent: originalSent,
|
|
originalWritten: originalWritten,
|
|
tokensSent: tokensSent,
|
|
tokensWritten: tokensWritten,
|
|
choreo: choreo,
|
|
useType: useType,
|
|
);
|
|
|
|
Future<String> updateStateEvent(Event stateEvent) =>
|
|
_updateStateEvent(stateEvent);
|
|
|
|
// room_information
|
|
|
|
Future<int> get numNonAdmins async => await _numNonAdmins;
|
|
|
|
DateTime? get creationTime => _creationTime;
|
|
|
|
String? get creatorId => _creatorId;
|
|
|
|
String get domainString => _domainString;
|
|
|
|
bool isChild(String roomId) => _isChild(roomId);
|
|
|
|
bool isFirstOrSecondChild(String roomId) => _isFirstOrSecondChild(roomId);
|
|
|
|
bool get isExchange => _isExchange;
|
|
|
|
bool get isDirectChatWithoutMe => _isDirectChatWithoutMe;
|
|
|
|
// bool isMadeForLang(String langCode) => _isMadeForLang(langCode);
|
|
|
|
Future<bool> get isBotRoom async => await _isBotRoom;
|
|
|
|
Future<bool> get isBotDM async => await _isBotDM;
|
|
|
|
bool get isLocked => _isLocked;
|
|
|
|
bool get isPangeaClass => _isPangeaClass;
|
|
|
|
bool isAnalyticsRoomOfUser(String userId) => _isAnalyticsRoomOfUser(userId);
|
|
|
|
bool get isAnalyticsRoom => _isAnalyticsRoom;
|
|
|
|
// room_settings
|
|
|
|
Future<void> updateRoomCapacity(int newCapacity) =>
|
|
_updateRoomCapacity(newCapacity);
|
|
|
|
int? get capacity => _capacity;
|
|
|
|
PangeaRoomRules? get pangeaRoomRules => _pangeaRoomRules;
|
|
|
|
PangeaRoomRules? get firstRules => _firstRules;
|
|
|
|
IconData? get roomTypeIcon => _roomTypeIcon;
|
|
|
|
Text nameAndRoomTypeIcon([TextStyle? textStyle]) =>
|
|
_nameAndRoomTypeIcon(textStyle);
|
|
|
|
BotOptionsModel? get botOptions => _botOptions;
|
|
|
|
Future<void> setSuggested(bool suggested) async =>
|
|
await _setSuggested(suggested);
|
|
|
|
Future<bool> isSuggested() async => await _isSuggested();
|
|
|
|
// user_permissions
|
|
|
|
Future<bool> isOnlyAdmin() async => await _isOnlyAdmin();
|
|
|
|
bool isMadeByUser(String userId) => _isMadeByUser(userId);
|
|
|
|
bool get isSpaceAdmin => _isSpaceAdmin;
|
|
|
|
bool isUserRoomAdmin(String userId) => _isUserRoomAdmin(userId);
|
|
|
|
bool isUserSpaceAdmin(String userId) => _isUserSpaceAdmin(userId);
|
|
|
|
bool get isRoomOwner => _isRoomOwner;
|
|
|
|
bool get isRoomAdmin => _isRoomAdmin;
|
|
|
|
bool get showClassEditOptions => _showClassEditOptions;
|
|
|
|
bool get canDelete => _canDelete;
|
|
|
|
bool canIAddSpaceChild(Room? room) => _canIAddSpaceChild(room);
|
|
|
|
bool get canIAddSpaceParents => _canIAddSpaceParents;
|
|
|
|
bool pangeaCanSendEvent(String eventType) => _pangeaCanSendEvent(eventType);
|
|
|
|
int? get eventsDefaultPowerLevel => _eventsDefaultPowerLevel;
|
|
}
|