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
.where((round) => round.isCompleted)
.map((round) => round.messageIDs)
.map((round) => round.userMessageIDs)
.expand((x) => x)
.toList();
// 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/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';

@ -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();

@ -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();

Loading…
Cancel
Save