From 8be5c4c33437d38cc1c5445e03fe88c620d62f52 Mon Sep 17 00:00:00 2001 From: roxy Date: Sat, 16 May 2026 05:05:37 +0800 Subject: [PATCH] =?UTF-8?q?keep=E5=8A=A8=E7=94=BB=E9=87=8D=E6=92=AD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/services/audio/rtc_manager.dart | 2 + lib/services/audio/rtm_manager.dart | 108 ++++++++++++++++++++++++---- 2 files changed, 96 insertions(+), 14 deletions(-) diff --git a/lib/services/audio/rtc_manager.dart b/lib/services/audio/rtc_manager.dart index 07f8f0a..7914825 100644 --- a/lib/services/audio/rtc_manager.dart +++ b/lib/services/audio/rtc_manager.dart @@ -499,6 +499,7 @@ class RealTimeCommunicationManager extends ChangeNotifier { _roomEntryEffectTimer = null; _roomRocketLaunchAnimationTimer?.cancel(); _roomRocketLaunchAnimationTimer = null; + SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag); _releaseRoomRocketLaunchTopAvatarNotifier(); _roomRocketGiftRefreshTimer?.cancel(); _roomRocketGiftRefreshTimer = null; @@ -3768,6 +3769,7 @@ class RealTimeCommunicationManager extends ChangeNotifier { _roomEntryEffectTimer = null; _roomRocketLaunchAnimationTimer?.cancel(); _roomRocketLaunchAnimationTimer = null; + SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag); _releaseRoomRocketLaunchTopAvatarNotifier(); _roomRocketGiftRefreshTimer?.cancel(); _roomRocketGiftRefreshTimer = null; diff --git a/lib/services/audio/rtm_manager.dart b/lib/services/audio/rtm_manager.dart index 960d5cc..922fd8f 100644 --- a/lib/services/audio/rtm_manager.dart +++ b/lib/services/audio/rtm_manager.dart @@ -136,6 +136,7 @@ class RealTimeMessagingManager extends ChangeNotifier { static const int _roomRocketRewardPendingTtlMs = 120000; static const int _roomRocketRewardProbeTtlMs = 120000; static const int _roomRocketLaunchCountdownRetainMs = 10000; + static const int _roomRocketLaunchEffectConsumedTtlMs = 120000; static const Duration _createRoomGroupTimeout = Duration(seconds: 12); static const List _roomRocketRewardPopupRetryDelays = [ Duration(milliseconds: 700), @@ -269,6 +270,8 @@ class RealTimeMessagingManager extends ChangeNotifier { final _pendingRoomRocketCountdownLaunches = {}; final Map _roomRocketLaunchEffectTimers = {}; + final Map _consumedRoomRocketLaunchEffectTimes = {}; + final Set _hiddenCurrentRoomRocketLaunchKeys = {}; Timer? _roomRocketRewardPopupRetryTimer; Timer? _roomRocketRoomReadyRewardRetryTimer; int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken; @@ -2020,8 +2023,10 @@ class RealTimeMessagingManager extends ChangeNotifier { publishRegionBroadcast: true, ); } else { - _rememberRoomRocketLaunchCountdown(launch); - _markRoomRocketRewardProbe(launch.roomId); + _rememberRoomRocketLaunchCountdown( + launch, + suppressReplayAfterDue: true, + ); _publishRoomRocketRegionBroadcastIfNeeded(launch); } } @@ -2038,8 +2043,6 @@ class RealTimeMessagingManager extends ChangeNotifier { if (!launch.isValid) { return; } - _rememberRoomRocketLaunchCountdown(launch); - var isCurrentRoom = false; var isCurrentVisibleRoom = false; final currentContext = context; @@ -2060,11 +2063,19 @@ class RealTimeMessagingManager extends ChangeNotifier { rtcProvider: rtcProvider, launch: launch, ); + } else { + _rememberRoomRocketLaunchCountdown( + launch, + suppressReplayAfterDue: true, + ); } } } - if (!isCurrentVisibleRoom) { + if (!isCurrentRoom) { + _rememberRoomRocketLaunchCountdown(launch); + } + if (!isCurrentVisibleRoom && !isCurrentRoom) { _markRoomRocketRewardProbe(launch.roomId); } if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) { @@ -2141,10 +2152,13 @@ class RealTimeMessagingManager extends ChangeNotifier { final resumedLaunch = _resumeRoomRocketLaunchForCurrentRoom( normalizedRoomId, ); - if (pending == null && !hasProbe) { + final pendingAfterResume = _pendingRoomRocketRewardPopups[normalizedRoomId]; + final hasProbeAfterResume = + _recentRoomRocketRewardProbeTimes[normalizedRoomId] != null; + if (pendingAfterResume == null && !hasProbeAfterResume) { return; } - if (!resumedLaunch && pending == null && attempt == 0) { + if (!resumedLaunch && pendingAfterResume == null && attempt == 0) { _scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt); return; } @@ -2156,7 +2170,7 @@ class RealTimeMessagingManager extends ChangeNotifier { _showRoomRocketRewardPopupDialog( normalizedRoomId, initialRoomRecords: - pending?.initialRoomRecords ?? + pendingAfterResume?.initialRoomRecords ?? const [], ), ); @@ -2223,15 +2237,18 @@ class RealTimeMessagingManager extends ChangeNotifier { void _clearRoomRocketRewardFallbackState() { _pendingRoomRocketRewardPopups.clear(); _recentRoomRocketRewardProbeTimes.clear(); + _consumedRoomRocketLaunchEffectTimes.clear(); + _hiddenCurrentRoomRocketLaunchKeys.clear(); _roomRocketRoomReadyRewardRetryTimer?.cancel(); _roomRocketRoomReadyRewardRetryTimer = null; _clearRoomRocketLaunchCountdownState(); } void _rememberRoomRocketLaunchCountdown( - RoomRocketLaunchBroadcastMessage launch, - ) { - if (!launch.isValid) { + RoomRocketLaunchBroadcastMessage launch, { + bool suppressReplayAfterDue = false, + }) { + if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) { return; } final now = DateTime.now().millisecondsSinceEpoch; @@ -2245,12 +2262,15 @@ class RealTimeMessagingManager extends ChangeNotifier { _roomRocketLaunchCountdownDueTimes[key] = dueAt; _roomRocketLaunchCountdownKeysByRoom[launch.roomId] = key; _pendingRoomRocketCountdownLaunches[launch.roomId] = launch; + if (suppressReplayAfterDue) { + _hiddenCurrentRoomRocketLaunchKeys.add(key); + } } void _scheduleRoomRocketLaunchEffectsAfterCountdown( RoomRocketLaunchBroadcastMessage launch, ) { - if (!launch.isValid) { + if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) { return; } _rememberRoomRocketLaunchCountdown(launch); @@ -2278,14 +2298,18 @@ class RealTimeMessagingManager extends ChangeNotifier { void _playRoomRocketLaunchEffectsAndReward( RoomRocketLaunchBroadcastMessage launch, ) { + if (_hasConsumedRoomRocketLaunchEffect(launch)) { + _clearRoomRocketLaunchCountdownForRoom(launch.roomId); + return; + } _clearRoomRocketLaunchCountdownForRoom(launch.roomId); if (!_isCurrentVisibleVoiceRoom(launch.roomId)) { - _markRoomRocketRewardProbe(launch.roomId); + _consumeRoomRocketLaunchWithoutEffects(launch); return; } final currentContext = context; if (currentContext == null || !currentContext.mounted) { - _markRoomRocketRewardProbe(launch.roomId); + _consumeRoomRocketLaunchWithoutEffects(launch); return; } final rtcProvider = Provider.of( @@ -2297,6 +2321,7 @@ class RealTimeMessagingManager extends ChangeNotifier { _recentRoomRocketRewardProbeTimes.containsKey(launch.roomId); final pending = _pendingRoomRocketRewardPopups.remove(launch.roomId); _recentRoomRocketRewardProbeTimes.remove(launch.roomId); + _markRoomRocketLaunchEffectConsumed(launch); rtcProvider.handleRoomRocketLaunchBroadcast(launch); if (shouldFetchReward) { unawaited( @@ -2316,6 +2341,10 @@ class RealTimeMessagingManager extends ChangeNotifier { if (launch == null || !_isCurrentVisibleVoiceRoom(normalizedRoomId)) { return false; } + if (_hasConsumedRoomRocketLaunchEffect(launch)) { + _clearRoomRocketLaunchCountdownForRoom(normalizedRoomId); + return false; + } final currentContext = context; if (currentContext == null || !currentContext.mounted) { return false; @@ -2325,7 +2354,9 @@ class RealTimeMessagingManager extends ChangeNotifier { listen: false, ); final remaining = _roomRocketLaunchCountdownRemaining(normalizedRoomId); + final launchKey = _roomRocketLaunchCountdownKey(launch); if (remaining > Duration.zero) { + _hiddenCurrentRoomRocketLaunchKeys.remove(launchKey); _addRoomRocketLaunchNoticeIfNeeded( rtcProvider: rtcProvider, launch: launch, @@ -2333,6 +2364,10 @@ class RealTimeMessagingManager extends ChangeNotifier { ); _scheduleRoomRocketLaunchEffectsAfterCountdown(launch); } else { + if (_hiddenCurrentRoomRocketLaunchKeys.remove(launchKey)) { + _consumeRoomRocketLaunchWithoutEffects(launch); + return false; + } _playRoomRocketLaunchEffectsAndReward(launch); } return true; @@ -2399,6 +2434,7 @@ class RealTimeMessagingManager extends ChangeNotifier { _roomRocketLaunchCountdownDueTimes.clear(); _roomRocketLaunchCountdownKeysByRoom.clear(); _pendingRoomRocketCountdownLaunches.clear(); + _hiddenCurrentRoomRocketLaunchKeys.clear(); for (final timer in _roomRocketLaunchEffectTimers.values) { timer.cancel(); } @@ -2411,10 +2447,51 @@ class RealTimeMessagingManager extends ChangeNotifier { if (key != null) { _roomRocketLaunchCountdownDueTimes.remove(key); _roomRocketLaunchEffectTimers.remove(key)?.cancel(); + _hiddenCurrentRoomRocketLaunchKeys.remove(key); } _pendingRoomRocketCountdownLaunches.remove(normalizedRoomId); } + bool _hasConsumedRoomRocketLaunchEffect( + RoomRocketLaunchBroadcastMessage launch, + ) { + final key = _roomRocketLaunchCountdownKey(launch); + if (key.isEmpty) { + return false; + } + _pruneConsumedRoomRocketLaunchEffects( + DateTime.now().millisecondsSinceEpoch, + ); + return _consumedRoomRocketLaunchEffectTimes.containsKey(key); + } + + void _markRoomRocketLaunchEffectConsumed( + RoomRocketLaunchBroadcastMessage launch, + ) { + final key = _roomRocketLaunchCountdownKey(launch); + if (key.isEmpty) { + return; + } + _consumedRoomRocketLaunchEffectTimes[key] = + DateTime.now().millisecondsSinceEpoch; + _hiddenCurrentRoomRocketLaunchKeys.remove(key); + } + + void _consumeRoomRocketLaunchWithoutEffects( + RoomRocketLaunchBroadcastMessage launch, + ) { + _clearRoomRocketLaunchCountdownForRoom(launch.roomId); + _pendingRoomRocketRewardPopups.remove(launch.roomId); + _recentRoomRocketRewardProbeTimes.remove(launch.roomId); + _markRoomRocketLaunchEffectConsumed(launch); + } + + void _pruneConsumedRoomRocketLaunchEffects(int now) { + _consumedRoomRocketLaunchEffectTimes.removeWhere( + (_, timestamp) => now - timestamp > _roomRocketLaunchEffectConsumedTtlMs, + ); + } + void _handleCurrentVisibleRoomRocketLaunch({ required RealTimeCommunicationManager rtcProvider, required RoomRocketLaunchBroadcastMessage launch, @@ -2965,6 +3042,7 @@ class RealTimeMessagingManager extends ChangeNotifier { _recentRoomRocketLaunchLooseTimes.removeWhere( (_, timestamp) => now - timestamp > _roomRocketLaunchLooseRecentTtlMs, ); + _pruneConsumedRoomRocketLaunchEffects(now); } String _roomRocketLaunchNoticeKeyForValues({ @@ -4006,6 +4084,8 @@ class RealTimeMessagingManager extends ChangeNotifier { _recentRoomRocketLaunchTimes.clear(); _recentRoomRocketLaunchLooseTimes.clear(); _recentRoomRocketRegionBroadcastTimes.clear(); + _consumedRoomRocketLaunchEffectTimes.clear(); + _hiddenCurrentRoomRocketLaunchKeys.clear(); _roomRocketRewardPopupRetryTimer?.cancel(); _roomRocketRewardPopupRetryTimer = null; onNewMessageListenerGroupMap.forEach((k, v) {