Skip to content

Commit adbc578

Browse files
committed
feat: refactor party management to session management
1 parent 1b39dc7 commit adbc578

7 files changed

Lines changed: 83 additions & 57 deletions

File tree

Launcher/lib/features/maxima/dialogs/maxima_friends_dialog.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:kyber_launcher/features/maxima/providers/maxima_cubit.dart';
88
import 'package:kyber_launcher/features/maxima/providers/maxima_rtm_cubit.dart';
99
import 'package:kyber_launcher/features/maxima/widgets/friend_list/maxima_friend_list.dart';
1010
import 'package:kyber_launcher/features/maxima/widgets/maxima_avatar.dart';
11-
import 'package:kyber_launcher/features/party/providers/party_cubit.dart';
11+
import 'package:kyber_launcher/features/session/providers/session_cubit.dart';
1212
import 'package:kyber_launcher/gen/assets.gen.dart';
1313
import 'package:kyber_launcher/gen/fonts.gen.dart';
1414
import 'package:kyber_launcher/shared/ui/buttons/button.dart';
@@ -76,7 +76,7 @@ class MaximaFriendsDialog extends StatelessWidget {
7676
),
7777
),
7878
Expanded(
79-
child: BlocBuilder<PartyCubit, UserPartyState>(
79+
child: BlocBuilder<SessionCubit, SessionState>(
8080
builder: (context, state) {
8181
if (state is InParty) {
8282
return _buildPartyList(context);
@@ -221,7 +221,7 @@ class MaximaFriendsDialog extends StatelessWidget {
221221
child: MaximaFriendList(
222222
onFriendSelected: (value) async {
223223
final partyCubit = context
224-
.read<PartyCubit>();
224+
.read<SessionCubit>();
225225
await partyCubit.inviteToParty(
226226
value.id,
227227
);
@@ -260,7 +260,7 @@ class MaximaFriendsDialog extends StatelessWidget {
260260

261261
Widget _buildPartyList(BuildContext context) {
262262
final party = context
263-
.watch<PartyCubit>()
263+
.watch<SessionCubit>()
264264
.state;
265265
final state = (party as InParty).party;
266266

Launcher/lib/features/navigation_bar/services/app_initialization_service.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import 'package:kyber_launcher/features/mods/services/mod_service.dart';
2121
import 'package:kyber_launcher/features/navigation_bar/dialogs/disable_comp_mode_dialog.dart';
2222
import 'package:kyber_launcher/features/navigation_bar/helper/protocol_helper.dart';
2323
import 'package:kyber_launcher/features/nexusmods/widgets/graphql_provider.dart';
24-
import 'package:kyber_launcher/features/party/providers/party_cubit.dart';
2524
import 'package:kyber_launcher/features/server_moderation/providers/moderation_servers_cubit.dart';
25+
import 'package:kyber_launcher/features/session/providers/session_cubit.dart';
2626
import 'package:kyber_launcher/features/settings/dialogs/update_dialog.dart';
2727
import 'package:kyber_launcher/features/setup/dialogs/open_beta_dialog.dart';
2828
import 'package:kyber_launcher/features/setup/dialogs/rules_dialog.dart';
@@ -52,7 +52,7 @@ class AppInitializationService {
5252
if (!context.mounted) return;
5353

5454
context.read<ModerationServersCubit>();
55-
context.read<PartyCubit>();
55+
context.read<SessionCubit>();
5656

5757
unawaited(
5858
sl.isReady<ModService>().then((_) {

Launcher/lib/features/party/providers/party_state.dart

Lines changed: 0 additions & 18 deletions
This file was deleted.

Launcher/lib/features/party/providers/party_cubit.dart renamed to Launcher/lib/features/session/providers/session_cubit.dart

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22
import 'dart:math' as math;
3+
import 'dart:typed_data';
34

45
import 'package:collection/collection.dart';
56
import 'package:equatable/equatable.dart';
@@ -11,18 +12,21 @@ import 'package:kyber_launcher/features/maxima/providers/maxima_cubit.dart';
1112
import 'package:kyber_launcher/injection_container.dart';
1213
import 'package:logging/logging.dart';
1314
import 'package:meta/meta.dart';
15+
import 'package:web_socket_channel/io.dart';
1416

15-
part 'party_state.dart';
17+
part 'session_state.dart';
1618

17-
class PartyCubit extends Cubit<UserPartyState> {
18-
PartyCubit() : super(PartyInitial()) {
19+
class SessionCubit extends Cubit<SessionState> {
20+
SessionCubit() : super(PartyInitial()) {
1921
_connectToStream();
2022
}
2123

22-
final _logger = Logger('party_cubit');
24+
final _logger = Logger('session_cubit');
2325
late final KyberGRPCService _service = sl<KyberGRPCService>();
2426

25-
StreamSubscription<PartyEvent>? _subscription;
27+
StreamSubscription<SessionEvent>? _subscription;
28+
Timer? _keepAliveTimer;
29+
IOWebSocketChannel? _channel;
2630
int _reconnectAttempts = 0;
2731

2832
InParty? get _inParty => state is InParty ? state as InParty : null;
@@ -33,6 +37,7 @@ class PartyCubit extends Cubit<UserPartyState> {
3337
@override
3438
Future<void> close() async {
3539
await _subscription?.cancel();
40+
_keepAliveTimer?.cancel();
3641
return super.close();
3742
}
3843

@@ -61,15 +66,20 @@ class PartyCubit extends Cubit<UserPartyState> {
6166
);
6267
}
6368

64-
emit(InParty(party.rebuild((b) {
65-
b.members
66-
..clear()
67-
..addAll(unique);
68-
})));
69+
emit(
70+
InParty(
71+
party.rebuild((b) {
72+
b.members
73+
..clear()
74+
..addAll(unique);
75+
}),
76+
),
77+
);
6978
_sortPlayers();
7079
}
7180

7281
void _sortPlayers() {
82+
return;
7383
final party = _inParty?.party;
7484
final userId = _userId;
7585
if (party == null || userId == null) return;
@@ -81,11 +91,15 @@ class PartyCubit extends Cubit<UserPartyState> {
8191
return 0;
8292
});
8393

84-
emit(InParty(party.rebuild((b) {
85-
b.members
86-
..clear()
87-
..addAll(sorted);
88-
})));
94+
emit(
95+
InParty(
96+
party.rebuild((b) {
97+
b.members
98+
..clear()
99+
..addAll(sorted);
100+
}),
101+
),
102+
);
89103
}
90104

91105
Future<void> _connectToStream() async {
@@ -116,24 +130,36 @@ class PartyCubit extends Cubit<UserPartyState> {
116130
_logger.warning('Failed to get current party', error);
117131
});
118132

119-
final keepAliveStream = Stream.periodic(
120-
const Duration(seconds: 10),
121-
(_) => Empty(),
133+
_channel = IOWebSocketChannel.connect(
134+
'wss://api.${Preferences.admin.apiEnv}.kyber.gg/ws/session',
135+
headers: {
136+
'Authorization': sl.get<KyberGRPCService>().token,
137+
},
138+
connectTimeout: const Duration(seconds: 10),
122139
);
123140

124-
_subscription = _service.partyServiceClient
125-
.subscribe(keepAliveStream)
126-
.listen(
127-
_handlePartyEvent,
128-
cancelOnError: true,
129-
onError: (error) {
130-
_logger.warning('Party stream error, reconnecting...', error);
131-
_reconnect();
132-
},
133-
onDone: () {
134-
_logger.info('Party stream closed');
135-
},
136-
);
141+
await _channel?.ready;
142+
143+
_channel?.stream.listen(
144+
(event) {
145+
try {
146+
final data = SessionEvent.fromBuffer(event as Uint8List);
147+
} catch (e, s) {
148+
_logger.severe('Error parsing event', e, s);
149+
}
150+
},
151+
onDone: () {
152+
_logger.info('Stream done');
153+
},
154+
onError: (dynamic e, StackTrace s) {
155+
_logger.severe('Stream error', e, s);
156+
},
157+
);
158+
159+
_keepAliveTimer = Timer.periodic(
160+
const Duration(seconds: 10),
161+
(_) async => _channel?.sink.add(''),
162+
);
137163

138164
_reconnectAttempts = 0;
139165
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
part of 'session_cubit.dart';
2+
3+
@immutable
4+
sealed class SessionState extends Equatable {}
5+
6+
final class PartyInitial extends SessionState {
7+
@override
8+
List<Object?> get props => [];
9+
}
10+
11+
final class InParty extends SessionState {
12+
InParty(this.party);
13+
14+
final PartyState party;
15+
16+
@override
17+
List<Object?> get props => [party];
18+
}

Launcher/lib/features/party/screens/party_overlay.dart renamed to Launcher/lib/features/session/screens/party_overlay.dart

File renamed without changes.

Launcher/lib/main.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ import 'package:kyber_launcher/features/mods/providers/mod_list_cubit.dart';
3434
import 'package:kyber_launcher/features/navigation_bar/helper/protocol_helper.dart';
3535
import 'package:kyber_launcher/features/navigation_bar/providers/status_cubit.dart';
3636
import 'package:kyber_launcher/features/nexusmods/widgets/graphql_provider.dart';
37-
import 'package:kyber_launcher/features/party/providers/party_cubit.dart';
3837
import 'package:kyber_launcher/features/server_browser/providers/ingame_view_cubit.dart';
3938
import 'package:kyber_launcher/features/server_browser/providers/server_browser_cubit.dart';
4039
import 'package:kyber_launcher/features/server_browser/providers/server_list_cubit.dart';
4140
import 'package:kyber_launcher/features/server_moderation/providers/moderation_cubit.dart';
4241
import 'package:kyber_launcher/features/server_moderation/providers/moderation_servers_cubit.dart';
42+
import 'package:kyber_launcher/features/session/providers/session_cubit.dart';
4343
import 'package:kyber_launcher/features/stats/providers/stats_cubit.dart';
4444
import 'package:kyber_launcher/features/tutorial/providers/tutorial_cubit.dart';
4545
import 'package:kyber_launcher/gen/assets.gen.dart';
@@ -327,7 +327,7 @@ class _AppState extends State<App> {
327327
BlocProvider(create: (_) => KyberProxyCubit()),
328328
BlocProvider(create: (_) => ModsListCubit()),
329329
BlocProvider(create: (_) => StatsCubit()),
330-
BlocProvider(create: (_) => PartyCubit()),
330+
BlocProvider(create: (_) => SessionCubit()),
331331
BlocProvider(create: (_) => IngameViewCubit()),
332332
BlocProvider(create: (_) => DownloadCubit(), lazy: false),
333333
BlocProvider(

0 commit comments

Comments
 (0)