moved timer sync logic to seperate function, don't hide bot messages after end of round

pull/1384/head
ggurdin 1 year ago
parent f4a0fbaacb
commit e8bb166fae
No known key found for this signature in database
GPG Key ID: A01CB41737CBB478

@ -123,7 +123,7 @@ class ChatController extends State<ChatPageWithRoom>
List<String> get completedRoundEventIds => gameRounds List<String> get completedRoundEventIds => gameRounds
.where((round) => round.isCompleted) .where((round) => round.isCompleted)
.map((round) => round.messageIDs) .map((round) => round.userMessageIDs)
.expand((x) => x) .expand((x) => x)
.toList(); .toList();
// Pangea# // Pangea#

@ -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/choreographer/widgets/start_igc_button.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.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/chat_floating_action_button.dart';
import 'package:fluffychat/pangea/widgets/chat/round_timer.dart';
import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/account_config.dart';
import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart';
import 'package:fluffychat/widgets/connection_status_header.dart'; import 'package:fluffychat/widgets/connection_status_header.dart';

@ -10,7 +10,9 @@ extension MembershipUpdate on SyncUpdate {
return rooms!.join![chat.id]!.timeline!.events! return rooms!.join![chat.id]!.timeline!.events!
.where( .where(
(event) => event.type == EventTypes.Message, (event) =>
event.type == EventTypes.Message &&
!event.eventId.startsWith("Pangea Chat"),
) )
.map((event) => Event.fromMatrixEvent(event, chat)) .map((event) => Event.fromMatrixEvent(event, chat))
.toList(); .toList();

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

Loading…
Cancel
Save