火箭进房兜底+im发送时机提前
This commit is contained in:
parent
06d4b62190
commit
d26cfa20c3
@ -500,6 +500,12 @@ class RealTimeCommunicationManager extends ChangeNotifier {
|
|||||||
|
|
||||||
void setVoiceRoomRouteVisible(bool visible) {
|
void setVoiceRoomRouteVisible(bool visible) {
|
||||||
_voiceRoomRouteVisible = visible;
|
_voiceRoomRouteVisible = visible;
|
||||||
|
if (visible) {
|
||||||
|
final roomId = (currenRoom?.roomProfile?.roomProfile?.id ?? "").trim();
|
||||||
|
if (roomId.isNotEmpty) {
|
||||||
|
rtmProvider?.handleVoiceRoomReadyForRocketRewards(roomId);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setRoomStartupLoading() {
|
void _setRoomStartupLoading() {
|
||||||
@ -2694,6 +2700,7 @@ class RealTimeCommunicationManager extends ChangeNotifier {
|
|||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
);
|
);
|
||||||
_loadRoomSecondaryData();
|
_loadRoomSecondaryData();
|
||||||
|
rtmProvider?.handleVoiceRoomReadyForRocketRewards(roomId);
|
||||||
} catch (error, stackTrace) {
|
} catch (error, stackTrace) {
|
||||||
if (!_isActiveRoomStartup(entryRequestSerial, roomId)) {
|
if (!_isActiveRoomStartup(entryRequestSerial, roomId)) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -106,6 +106,18 @@ class _LuckGiftPushQueueEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _PendingRoomRocketRewardPopup {
|
||||||
|
const _PendingRoomRocketRewardPopup({
|
||||||
|
required this.roomId,
|
||||||
|
required this.receivedAt,
|
||||||
|
this.initialRoomRecords = const <SCRoomRocketRewardRecordRes>[],
|
||||||
|
});
|
||||||
|
|
||||||
|
final String roomId;
|
||||||
|
final int receivedAt;
|
||||||
|
final List<SCRoomRocketRewardRecordRes> initialRoomRecords;
|
||||||
|
}
|
||||||
|
|
||||||
class RealTimeMessagingManager extends ChangeNotifier {
|
class RealTimeMessagingManager extends ChangeNotifier {
|
||||||
static const String _roomRocketRewardDialogTag = 'showRoomRocketRewardDialog';
|
static const String _roomRocketRewardDialogTag = 'showRoomRocketRewardDialog';
|
||||||
|
|
||||||
@ -121,12 +133,20 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
static const int _roomRocketLaunchRecentTtlMs = 90000;
|
static const int _roomRocketLaunchRecentTtlMs = 90000;
|
||||||
static const int _roomRocketLaunchLooseRecentTtlMs = 12000;
|
static const int _roomRocketLaunchLooseRecentTtlMs = 12000;
|
||||||
static const int _roomRocketRegionBroadcastRecentTtlMs = 90000;
|
static const int _roomRocketRegionBroadcastRecentTtlMs = 90000;
|
||||||
|
static const int _roomRocketRewardPendingTtlMs = 120000;
|
||||||
|
static const int _roomRocketRewardProbeTtlMs = 120000;
|
||||||
static const Duration _createRoomGroupTimeout = Duration(seconds: 12);
|
static const Duration _createRoomGroupTimeout = Duration(seconds: 12);
|
||||||
static const List<Duration> _roomRocketRewardPopupRetryDelays = [
|
static const List<Duration> _roomRocketRewardPopupRetryDelays = [
|
||||||
Duration(milliseconds: 700),
|
Duration(milliseconds: 700),
|
||||||
Duration(seconds: 2),
|
Duration(seconds: 2),
|
||||||
Duration(seconds: 5),
|
Duration(seconds: 5),
|
||||||
];
|
];
|
||||||
|
static const List<Duration> _roomRocketRoomReadyRewardRetryDelays = [
|
||||||
|
Duration(milliseconds: 300),
|
||||||
|
Duration(milliseconds: 900),
|
||||||
|
Duration(seconds: 2),
|
||||||
|
Duration(seconds: 4),
|
||||||
|
];
|
||||||
|
|
||||||
BuildContext? context;
|
BuildContext? context;
|
||||||
|
|
||||||
@ -239,7 +259,11 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
final Map<String, int> _recentRoomRocketLaunchLooseTimes = <String, int>{};
|
final Map<String, int> _recentRoomRocketLaunchLooseTimes = <String, int>{};
|
||||||
final Map<String, int> _recentRoomRocketRegionBroadcastTimes =
|
final Map<String, int> _recentRoomRocketRegionBroadcastTimes =
|
||||||
<String, int>{};
|
<String, int>{};
|
||||||
|
final _pendingRoomRocketRewardPopups =
|
||||||
|
<String, _PendingRoomRocketRewardPopup>{};
|
||||||
|
final Map<String, int> _recentRoomRocketRewardProbeTimes = <String, int>{};
|
||||||
Timer? _roomRocketRewardPopupRetryTimer;
|
Timer? _roomRocketRewardPopupRetryTimer;
|
||||||
|
Timer? _roomRocketRoomReadyRewardRetryTimer;
|
||||||
int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken;
|
int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken;
|
||||||
String? roomRedPacketBroadcastGroupId;
|
String? roomRedPacketBroadcastGroupId;
|
||||||
String? roomRedPacketBroadcastRegionCode;
|
String? roomRedPacketBroadcastRegionCode;
|
||||||
@ -1941,6 +1965,30 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
currentContext,
|
currentContext,
|
||||||
listen: false,
|
listen: false,
|
||||||
);
|
);
|
||||||
|
final isCurrentVisibleRoom =
|
||||||
|
rtcProvider.shouldShowRoomVisualEffects &&
|
||||||
|
rtcProvider.isVoiceRoomRouteVisible;
|
||||||
|
final launch = _buildRoomRocketLaunchFromStatusPayload(
|
||||||
|
rtcProvider: rtcProvider,
|
||||||
|
payload: data,
|
||||||
|
roomId: roomId,
|
||||||
|
);
|
||||||
|
if (_shouldHandleRoomRocketLaunchFromStatusPayload(
|
||||||
|
rtcProvider: rtcProvider,
|
||||||
|
payload: data,
|
||||||
|
launch: launch,
|
||||||
|
)) {
|
||||||
|
if (isCurrentVisibleRoom) {
|
||||||
|
_handleCurrentVisibleRoomRocketLaunch(
|
||||||
|
rtcProvider: rtcProvider,
|
||||||
|
launch: launch,
|
||||||
|
publishRegionBroadcast: true,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
_markRoomRocketRewardProbe(launch.roomId);
|
||||||
|
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
||||||
|
}
|
||||||
|
}
|
||||||
unawaited(rtcProvider.refreshRoomRocketStatus(roomId: roomId));
|
unawaited(rtcProvider.refreshRoomRocketStatus(roomId: roomId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1971,9 +2019,6 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
rtcProvider.shouldShowRoomVisualEffects &&
|
rtcProvider.shouldShowRoomVisualEffects &&
|
||||||
rtcProvider.isVoiceRoomRouteVisible;
|
rtcProvider.isVoiceRoomRouteVisible;
|
||||||
if (isCurrentVisibleRoom) {
|
if (isCurrentVisibleRoom) {
|
||||||
if (!isRegionBroadcast) {
|
|
||||||
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
|
||||||
}
|
|
||||||
_handleCurrentVisibleRoomRocketLaunch(
|
_handleCurrentVisibleRoomRocketLaunch(
|
||||||
rtcProvider: rtcProvider,
|
rtcProvider: rtcProvider,
|
||||||
launch: launch,
|
launch: launch,
|
||||||
@ -1982,8 +2027,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isCurrentVisibleRoom) {
|
||||||
|
_markRoomRocketRewardProbe(launch.roomId);
|
||||||
|
}
|
||||||
if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) {
|
if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) {
|
||||||
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
OverlayManager().addMessage(
|
OverlayManager().addMessage(
|
||||||
@ -1999,18 +2046,34 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
final roomId = _payloadRoomId(data);
|
final roomId = _payloadRoomId(data);
|
||||||
final currentRoomId = _currentVoiceRoomId();
|
final currentRoomId = _currentVoiceRoomId();
|
||||||
final resolvedRoomId = roomId.isEmpty ? currentRoomId : roomId;
|
final resolvedRoomId = roomId.isEmpty ? currentRoomId : roomId;
|
||||||
if (resolvedRoomId.isEmpty ||
|
if (resolvedRoomId.isEmpty) {
|
||||||
(currentRoomId.isNotEmpty && resolvedRoomId != currentRoomId)) {
|
return;
|
||||||
|
}
|
||||||
|
final initialRoomRecords = _roomRocketRewardRecordsFromPayload(data);
|
||||||
|
if (currentRoomId.isNotEmpty && resolvedRoomId != currentRoomId) {
|
||||||
|
_cachePendingRoomRocketRewardPopup(
|
||||||
|
resolvedRoomId,
|
||||||
|
initialRoomRecords: initialRoomRecords,
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!_isCurrentVoiceRoom(resolvedRoomId)) {
|
if (!_isCurrentVoiceRoom(resolvedRoomId)) {
|
||||||
|
_cachePendingRoomRocketRewardPopup(
|
||||||
|
resolvedRoomId,
|
||||||
|
initialRoomRecords: initialRoomRecords,
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!_isCurrentVisibleVoiceRoom(resolvedRoomId)) {
|
if (!_isCurrentVisibleVoiceRoom(resolvedRoomId)) {
|
||||||
|
_cachePendingRoomRocketRewardPopup(
|
||||||
|
resolvedRoomId,
|
||||||
|
initialRoomRecords: initialRoomRecords,
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final initialRoomRecords = _roomRocketRewardRecordsFromPayload(data);
|
_pendingRoomRocketRewardPopups.remove(resolvedRoomId);
|
||||||
|
_recentRoomRocketRewardProbeTimes.remove(resolvedRoomId);
|
||||||
unawaited(
|
unawaited(
|
||||||
_showRoomRocketRewardPopupDialog(
|
_showRoomRocketRewardPopupDialog(
|
||||||
resolvedRoomId,
|
resolvedRoomId,
|
||||||
@ -2019,9 +2082,110 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleVoiceRoomReadyForRocketRewards(String roomId, {int attempt = 0}) {
|
||||||
|
final normalizedRoomId = roomId.trim();
|
||||||
|
if (normalizedRoomId.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
_pruneRoomRocketRewardFallbacks(now);
|
||||||
|
final pending = _pendingRoomRocketRewardPopups[normalizedRoomId];
|
||||||
|
final hasProbe =
|
||||||
|
_recentRoomRocketRewardProbeTimes[normalizedRoomId] != null;
|
||||||
|
if (pending == null && !hasProbe) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!_isCurrentVisibleVoiceRoom(normalizedRoomId)) {
|
||||||
|
_scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (pending == null && attempt == 0) {
|
||||||
|
_scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_pendingRoomRocketRewardPopups.remove(normalizedRoomId);
|
||||||
|
_recentRoomRocketRewardProbeTimes.remove(normalizedRoomId);
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer?.cancel();
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer = null;
|
||||||
|
unawaited(
|
||||||
|
_showRoomRocketRewardPopupDialog(
|
||||||
|
normalizedRoomId,
|
||||||
|
initialRoomRecords:
|
||||||
|
pending?.initialRoomRecords ??
|
||||||
|
const <SCRoomRocketRewardRecordRes>[],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _scheduleRoomRocketReadyRewardRetry(String roomId, int attempt) {
|
||||||
|
if (attempt >= _roomRocketRoomReadyRewardRetryDelays.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer?.cancel();
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer = Timer(
|
||||||
|
_roomRocketRoomReadyRewardRetryDelays[attempt],
|
||||||
|
() {
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer = null;
|
||||||
|
handleVoiceRoomReadyForRocketRewards(roomId, attempt: attempt + 1);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _cachePendingRoomRocketRewardPopup(
|
||||||
|
String roomId, {
|
||||||
|
List<SCRoomRocketRewardRecordRes> initialRoomRecords =
|
||||||
|
const <SCRoomRocketRewardRecordRes>[],
|
||||||
|
}) {
|
||||||
|
final normalizedRoomId = roomId.trim();
|
||||||
|
if (normalizedRoomId.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
_pruneRoomRocketRewardFallbacks(now);
|
||||||
|
final existing = _pendingRoomRocketRewardPopups[normalizedRoomId];
|
||||||
|
final records =
|
||||||
|
initialRoomRecords.isNotEmpty
|
||||||
|
? List<SCRoomRocketRewardRecordRes>.unmodifiable(initialRoomRecords)
|
||||||
|
: existing?.initialRoomRecords ??
|
||||||
|
const <SCRoomRocketRewardRecordRes>[];
|
||||||
|
_pendingRoomRocketRewardPopups[normalizedRoomId] =
|
||||||
|
_PendingRoomRocketRewardPopup(
|
||||||
|
roomId: normalizedRoomId,
|
||||||
|
receivedAt: now,
|
||||||
|
initialRoomRecords: records,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _markRoomRocketRewardProbe(String roomId) {
|
||||||
|
final normalizedRoomId = roomId.trim();
|
||||||
|
if (normalizedRoomId.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
_pruneRoomRocketRewardFallbacks(now);
|
||||||
|
_recentRoomRocketRewardProbeTimes[normalizedRoomId] = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _pruneRoomRocketRewardFallbacks(int now) {
|
||||||
|
_pendingRoomRocketRewardPopups.removeWhere(
|
||||||
|
(_, pending) => now - pending.receivedAt > _roomRocketRewardPendingTtlMs,
|
||||||
|
);
|
||||||
|
_recentRoomRocketRewardProbeTimes.removeWhere(
|
||||||
|
(_, timestamp) => now - timestamp > _roomRocketRewardProbeTtlMs,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _clearRoomRocketRewardFallbackState() {
|
||||||
|
_pendingRoomRocketRewardPopups.clear();
|
||||||
|
_recentRoomRocketRewardProbeTimes.clear();
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer?.cancel();
|
||||||
|
_roomRocketRoomReadyRewardRetryTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
void _handleCurrentVisibleRoomRocketLaunch({
|
void _handleCurrentVisibleRoomRocketLaunch({
|
||||||
required RealTimeCommunicationManager rtcProvider,
|
required RealTimeCommunicationManager rtcProvider,
|
||||||
required RoomRocketLaunchBroadcastMessage launch,
|
required RoomRocketLaunchBroadcastMessage launch,
|
||||||
|
bool publishRegionBroadcast = false,
|
||||||
}) {
|
}) {
|
||||||
if (!_isCurrentVisibleVoiceRoom(launch.roomId)) {
|
if (!_isCurrentVisibleVoiceRoom(launch.roomId)) {
|
||||||
return;
|
return;
|
||||||
@ -2049,6 +2213,9 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
launch,
|
launch,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
if (publishRegionBroadcast) {
|
||||||
|
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
||||||
|
}
|
||||||
rtcProvider.handleRoomRocketLaunchBroadcast(launch);
|
rtcProvider.handleRoomRocketLaunchBroadcast(launch);
|
||||||
}
|
}
|
||||||
unawaited(_showRoomRocketRewardPopupDialog(launch.roomId));
|
unawaited(_showRoomRocketRewardPopupDialog(launch.roomId));
|
||||||
@ -2318,6 +2485,147 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
return ['rocket_launch_loose', launch.roomId, launch.safeLevel].join('|');
|
return ['rocket_launch_loose', launch.roomId, launch.safeLevel].join('|');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _shouldHandleRoomRocketLaunchFromStatusPayload({
|
||||||
|
required RealTimeCommunicationManager rtcProvider,
|
||||||
|
required Map<String, dynamic> payload,
|
||||||
|
required RoomRocketLaunchBroadcastMessage launch,
|
||||||
|
}) {
|
||||||
|
final currentPercent = _roomRocketPayloadPercent(payload);
|
||||||
|
if (currentPercent < 99.5) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final previousPercent = _roomRocketStatusPercent(
|
||||||
|
rtcProvider.roomRocketStatus,
|
||||||
|
);
|
||||||
|
if (previousPercent < 99.5) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
final launchKey = _roomRocketLaunchNoticeKey(launch);
|
||||||
|
if (launchKey.isEmpty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_pruneRecentRoomRocketLaunches(DateTime.now().millisecondsSinceEpoch);
|
||||||
|
final looseLaunchKey = _roomRocketLaunchLooseKey(launch);
|
||||||
|
return !_recentRoomRocketLaunchTimes.containsKey(launchKey) &&
|
||||||
|
(looseLaunchKey.isEmpty ||
|
||||||
|
!_recentRoomRocketLaunchLooseTimes.containsKey(looseLaunchKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
RoomRocketLaunchBroadcastMessage _buildRoomRocketLaunchFromStatusPayload({
|
||||||
|
required RealTimeCommunicationManager rtcProvider,
|
||||||
|
required Map<String, dynamic> payload,
|
||||||
|
required String roomId,
|
||||||
|
}) {
|
||||||
|
final roomProfile = rtcProvider.currenRoom?.roomProfile?.roomProfile;
|
||||||
|
final level = _roomRocketPayloadLevel(
|
||||||
|
payload,
|
||||||
|
rtcProvider.roomRocketStatus?.currentLevel ??
|
||||||
|
rtcProvider.roomRocketStatus?.level?.toInt() ??
|
||||||
|
1,
|
||||||
|
);
|
||||||
|
return RoomRocketLaunchBroadcastMessage(
|
||||||
|
roomId: roomId,
|
||||||
|
roomAccount: _firstNonBlank([
|
||||||
|
roomProfile?.roomAccount,
|
||||||
|
_payloadText(payload['roomAccount'] ?? payload['room_account']),
|
||||||
|
]),
|
||||||
|
roomName: _firstNonBlank([
|
||||||
|
roomProfile?.roomName,
|
||||||
|
_payloadText(payload['roomName'] ?? payload['room_name']),
|
||||||
|
]),
|
||||||
|
roomCoverUrl: _firstNonBlank([
|
||||||
|
roomProfile?.roomCover,
|
||||||
|
_payloadAssetText(payload['roomCoverUrl'] ?? payload['room_cover_url']),
|
||||||
|
_payloadAssetText(payload['roomCover'] ?? payload['room_cover']),
|
||||||
|
_payloadAssetText(payload['roomAvatar'] ?? payload['room_avatar']),
|
||||||
|
_payloadAssetText(payload['roomIcon'] ?? payload['room_icon']),
|
||||||
|
_payloadAssetText(payload['coverUrl'] ?? payload['cover_url']),
|
||||||
|
_payloadAssetText(payload['cover']),
|
||||||
|
_payloadAssetText(_broadcastPayloadMap(payload['room'])['coverUrl']),
|
||||||
|
_payloadAssetText(_broadcastPayloadMap(payload['room'])['cover']),
|
||||||
|
_payloadAssetText(_broadcastPayloadMap(payload['room'])['avatar']),
|
||||||
|
_payloadAssetText(
|
||||||
|
_broadcastPayloadMap(payload['roomInfo'])['coverUrl'],
|
||||||
|
),
|
||||||
|
_payloadAssetText(_broadcastPayloadMap(payload['roomInfo'])['cover']),
|
||||||
|
_payloadAssetText(_broadcastPayloadMap(payload['roomInfo'])['avatar']),
|
||||||
|
]),
|
||||||
|
roundNo:
|
||||||
|
_payloadNum(payload['roundNo'] ?? payload['round_no'])?.toInt() ?? 0,
|
||||||
|
level: level,
|
||||||
|
rocketIconUrl: _firstNonBlank([
|
||||||
|
_rocketIconFromPayload(payload),
|
||||||
|
_rocketIconUrlForLevel(level),
|
||||||
|
]),
|
||||||
|
rocketAnimationUrl: _rocketAnimationFromPayload(payload),
|
||||||
|
durationSeconds: _roomRocketPayloadNoticeSeconds(payload),
|
||||||
|
triggerUser: const RoomRocketLaunchTriggerUser(
|
||||||
|
userId: '',
|
||||||
|
nickname: '',
|
||||||
|
avatar: '',
|
||||||
|
account: '',
|
||||||
|
countryCode: '',
|
||||||
|
countryName: '',
|
||||||
|
),
|
||||||
|
triggerUserId: _payloadText(
|
||||||
|
payload['triggerUserId'] ?? payload['trigger_user_id'],
|
||||||
|
),
|
||||||
|
launchNo: _payloadText(payload['launchNo'] ?? payload['launch_no']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
double _roomRocketStatusPercent(dynamic status) {
|
||||||
|
if (status == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
final displayPercent = _payloadNum(status.displayPercent);
|
||||||
|
if (displayPercent != null) {
|
||||||
|
final raw = displayPercent.toDouble();
|
||||||
|
final percent = raw > 0 && raw <= 1 ? raw * 100 : raw;
|
||||||
|
return percent.clamp(0, 100).toDouble();
|
||||||
|
}
|
||||||
|
final energyPercent = _payloadNum(status.energyPercent);
|
||||||
|
if (energyPercent != null) {
|
||||||
|
final raw = energyPercent.toDouble();
|
||||||
|
final percent = raw > 0 && raw <= 1 ? raw * 100 : raw;
|
||||||
|
return percent.clamp(0, 100).toDouble();
|
||||||
|
}
|
||||||
|
final currentEnergy = _payloadNum(status.currentEnergy);
|
||||||
|
final maxEnergy = _payloadNum(status.maxEnergy ?? status.needEnergy);
|
||||||
|
if (currentEnergy == null || maxEnergy == null || maxEnergy <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ((currentEnergy / maxEnergy) * 100).clamp(0, 100).toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
double _roomRocketPayloadPercent(Map<String, dynamic> payload) {
|
||||||
|
final value = _payloadNum(
|
||||||
|
payload['displayPercent'] ??
|
||||||
|
payload['display_percent'] ??
|
||||||
|
payload['energyPercent'] ??
|
||||||
|
payload['energy_percent'] ??
|
||||||
|
payload['percent'],
|
||||||
|
);
|
||||||
|
if (value != null) {
|
||||||
|
final raw = value.toDouble();
|
||||||
|
final percent = raw > 0 && raw <= 1 ? raw * 100 : raw;
|
||||||
|
return percent.clamp(0, 100).toDouble();
|
||||||
|
}
|
||||||
|
final currentEnergy = _payloadNum(
|
||||||
|
payload['currentEnergy'] ?? payload['current_energy'],
|
||||||
|
);
|
||||||
|
final maxEnergy = _payloadNum(
|
||||||
|
payload['maxEnergy'] ??
|
||||||
|
payload['max_energy'] ??
|
||||||
|
payload['needEnergy'] ??
|
||||||
|
payload['need_energy'],
|
||||||
|
);
|
||||||
|
if (currentEnergy == null || maxEnergy == null || maxEnergy <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ((currentEnergy / maxEnergy) * 100).clamp(0, 100).toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
int _roomRocketPayloadLevel(Map<String, dynamic> payload, int fallback) {
|
int _roomRocketPayloadLevel(Map<String, dynamic> payload, int fallback) {
|
||||||
final value = _payloadNum(
|
final value = _payloadNum(
|
||||||
payload['currentLevel'] ??
|
payload['currentLevel'] ??
|
||||||
@ -2331,6 +2639,25 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
return (value?.toInt() ?? fallback).clamp(1, 99).toInt();
|
return (value?.toInt() ?? fallback).clamp(1, 99).toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _roomRocketPayloadNoticeSeconds(Map<String, dynamic> payload) {
|
||||||
|
final seconds =
|
||||||
|
_payloadNum(
|
||||||
|
payload['countdownSeconds'] ??
|
||||||
|
payload['countdown_seconds'] ??
|
||||||
|
payload['launchDelaySeconds'] ??
|
||||||
|
payload['launch_delay_seconds'] ??
|
||||||
|
payload['delaySeconds'] ??
|
||||||
|
payload['delay_seconds'] ??
|
||||||
|
payload['durationSeconds'] ??
|
||||||
|
payload['duration_seconds'],
|
||||||
|
)?.toInt() ??
|
||||||
|
10;
|
||||||
|
if (seconds > 0 && seconds <= 60) {
|
||||||
|
return seconds;
|
||||||
|
}
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
String _rocketIconFromPayload(Map<String, dynamic> payload) {
|
String _rocketIconFromPayload(Map<String, dynamic> payload) {
|
||||||
return _firstNonBlank([
|
return _firstNonBlank([
|
||||||
_payloadAssetText(payload['rocketIconUrl']),
|
_payloadAssetText(payload['rocketIconUrl']),
|
||||||
@ -2342,6 +2669,22 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String _rocketAnimationFromPayload(Map<String, dynamic> payload) {
|
||||||
|
return _firstNonBlank([
|
||||||
|
_payloadAssetText(payload['rocketAnimationUrl']),
|
||||||
|
_payloadAssetText(payload['rocket_animation_url']),
|
||||||
|
_payloadAssetText(payload['rocketSvgaUrl']),
|
||||||
|
_payloadAssetText(payload['rocket_svga_url']),
|
||||||
|
_payloadAssetText(payload['animationUrl']),
|
||||||
|
_payloadAssetText(payload['animation_url']),
|
||||||
|
_payloadAssetText(payload['launchAnimationUrl']),
|
||||||
|
_payloadAssetText(payload['launch_animation_url']),
|
||||||
|
_payloadAssetText(payload['svgaUrl']),
|
||||||
|
_payloadAssetText(payload['sourceUrl']),
|
||||||
|
_payloadAssetText(payload['source_url']),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
String _payloadRoomId(Map<String, dynamic> payload) {
|
String _payloadRoomId(Map<String, dynamic> payload) {
|
||||||
return _firstNonBlank([
|
return _firstNonBlank([
|
||||||
_payloadText(payload['roomId']),
|
_payloadText(payload['roomId']),
|
||||||
@ -2464,6 +2807,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
logout() async {
|
logout() async {
|
||||||
roomRedPacketBroadcastGroupId = null;
|
roomRedPacketBroadcastGroupId = null;
|
||||||
roomRedPacketBroadcastRegionCode = null;
|
roomRedPacketBroadcastRegionCode = null;
|
||||||
|
_clearRoomRocketRewardFallbackState();
|
||||||
RoomRedPacketOpenDialog.clearClaimedState();
|
RoomRedPacketOpenDialog.clearClaimedState();
|
||||||
RoomRedPacketPendingCache.instance.clear();
|
RoomRedPacketPendingCache.instance.clear();
|
||||||
V2TimCallback logoutRes = await TencentImSDKPlugin.v2TIMManager.logout();
|
V2TimCallback logoutRes = await TencentImSDKPlugin.v2TIMManager.logout();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user