From e8bb166faef37cc96b9591e5f9df8dac26cbf353 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 13 Aug 2024 09:45:36 -0400 Subject: [PATCH] moved timer sync logic to seperate function, don't hide bot messages after end of round --- lib/pages/chat/chat.dart | 2 +- lib/pages/chat/chat_view.dart | 1 - .../extensions/sync_update_extension.dart | 4 +- .../pages/games/story_game/round_model.dart | 67 ++++++++++++------- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index cbc5c8bf7..6e6a7487f 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -123,7 +123,7 @@ class ChatController extends State List get completedRoundEventIds => gameRounds .where((round) => round.isCompleted) - .map((round) => round.messageIDs) + .map((round) => round.userMessageIDs) .expand((x) => x) .toList(); // Pangea# diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index c72866c86..ce45043eb 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -13,7 +13,6 @@ import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart'; import 'package:fluffychat/pangea/choreographer/widgets/start_igc_button.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/widgets/chat/chat_floating_action_button.dart'; -import 'package:fluffychat/pangea/widgets/chat/round_timer.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/connection_status_header.dart'; diff --git a/lib/pangea/extensions/sync_update_extension.dart b/lib/pangea/extensions/sync_update_extension.dart index 412ca2b8f..68c1f684a 100644 --- a/lib/pangea/extensions/sync_update_extension.dart +++ b/lib/pangea/extensions/sync_update_extension.dart @@ -10,7 +10,9 @@ extension MembershipUpdate on SyncUpdate { return rooms!.join![chat.id]!.timeline!.events! .where( - (event) => event.type == EventTypes.Message, + (event) => + event.type == EventTypes.Message && + !event.eventId.startsWith("Pangea Chat"), ) .map((event) => Event.fromMatrixEvent(event, chat)) .toList(); diff --git a/lib/pangea/pages/games/story_game/round_model.dart b/lib/pangea/pages/games/story_game/round_model.dart index 61beb6242..c192c36a6 100644 --- a/lib/pangea/pages/games/story_game/round_model.dart +++ b/lib/pangea/pages/games/story_game/round_model.dart @@ -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 roundCompleter = Completer(); @@ -20,42 +21,54 @@ class GameRoundModel { DateTime? endTime; RoundState state = RoundState.notStarted; StreamSubscription? syncSubscription; - final Set messageIDs = {}; + final List userMessageIDs = []; + final List 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();