|
|
|
|
@ -11,6 +11,7 @@ enum RoundState { notStarted, inProgress, completed }
|
|
|
|
|
|
|
|
|
|
class GameRoundModel {
|
|
|
|
|
static const int timerMaxSeconds = 180;
|
|
|
|
|
final String adminName = BotName.byEnvironment;
|
|
|
|
|
|
|
|
|
|
final ChatController controller;
|
|
|
|
|
final Completer<void> roundCompleter = Completer<void>();
|
|
|
|
|
@ -20,42 +21,54 @@ class GameRoundModel {
|
|
|
|
|
DateTime? endTime;
|
|
|
|
|
RoundState state = RoundState.notStarted;
|
|
|
|
|
StreamSubscription? syncSubscription;
|
|
|
|
|
final Set<String> messageIDs = {};
|
|
|
|
|
final List<String> userMessageIDs = [];
|
|
|
|
|
final List<String> botMessageIDs = [];
|
|
|
|
|
|
|
|
|
|
GameRoundModel({
|
|
|
|
|
required this.controller,
|
|
|
|
|
required this.timer,
|
|
|
|
|
}) {
|
|
|
|
|
createdAt = DateTime.now();
|
|
|
|
|
debugPrint("timeline: ${controller.room.timeline}");
|
|
|
|
|
syncSubscription ??= client.onSync.stream.listen((update) {
|
|
|
|
|
final newMessages = update.messages(controller.room);
|
|
|
|
|
final botMessages = newMessages
|
|
|
|
|
.where((msg) => msg.senderId == BotName.byEnvironment)
|
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
|
|
if (botMessages.isNotEmpty &&
|
|
|
|
|
botMessages.any(
|
|
|
|
|
(msg) =>
|
|
|
|
|
msg.originServerTs.isAfter(createdAt) &&
|
|
|
|
|
!messageIDs.contains(msg.eventId),
|
|
|
|
|
)) {
|
|
|
|
|
if (state == RoundState.notStarted) {
|
|
|
|
|
startRound();
|
|
|
|
|
} else if (state == RoundState.inProgress) {
|
|
|
|
|
endRound();
|
|
|
|
|
return;
|
|
|
|
|
syncSubscription ??= client.onSync.stream.listen(_handleSync);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _handleSync(SyncUpdate update) {
|
|
|
|
|
final newMessages = update
|
|
|
|
|
.messages(controller.room)
|
|
|
|
|
.where((msg) => msg.originServerTs.isAfter(createdAt))
|
|
|
|
|
.toList();
|
|
|
|
|
|
|
|
|
|
final botMessages =
|
|
|
|
|
newMessages.where((msg) => msg.senderId == adminName).toList();
|
|
|
|
|
final userMessages =
|
|
|
|
|
newMessages.where((msg) => msg.senderId != adminName).toList();
|
|
|
|
|
|
|
|
|
|
final hasNewBotMessage = botMessages.any(
|
|
|
|
|
(msg) => !botMessageIDs.contains(msg.eventId),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (hasNewBotMessage) {
|
|
|
|
|
if (state == RoundState.notStarted) {
|
|
|
|
|
startRound();
|
|
|
|
|
} else if (state == RoundState.inProgress) {
|
|
|
|
|
endRound();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (state == RoundState.inProgress) {
|
|
|
|
|
for (final message in botMessages) {
|
|
|
|
|
if (!botMessageIDs.contains(message.eventId)) {
|
|
|
|
|
botMessageIDs.add(message.eventId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (final message in newMessages) {
|
|
|
|
|
if (message.originServerTs.isAfter(createdAt) &&
|
|
|
|
|
!messageIDs.contains(message.eventId) &&
|
|
|
|
|
!message.eventId.startsWith("Pangea Chat")) {
|
|
|
|
|
messageIDs.add(message.eventId);
|
|
|
|
|
for (final message in userMessages) {
|
|
|
|
|
if (!userMessageIDs.contains(message.eventId)) {
|
|
|
|
|
userMessageIDs.add(message.eventId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Client get client => controller.pangeaController.matrixState.client;
|
|
|
|
|
@ -73,7 +86,9 @@ class GameRoundModel {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void endRound() {
|
|
|
|
|
debugPrint("ending round, message IDs: $messageIDs");
|
|
|
|
|
debugPrint(
|
|
|
|
|
"ending round, user message IDs: $userMessageIDs, bot message IDs: $botMessageIDs",
|
|
|
|
|
);
|
|
|
|
|
endTime = DateTime.now();
|
|
|
|
|
state = RoundState.completed;
|
|
|
|
|
controller.roundTimerStateKey.currentState?.resetTimer();
|
|
|
|
|
|