Skip to content

Commit c449aea

Browse files
committed
Add option for server to send link information
1 parent 1e00a2e commit c449aea

File tree

13 files changed

+483
-9
lines changed

13 files changed

+483
-9
lines changed

api/lib/src/event/event.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ const kBroadcastPort = 28007;
1818

1919
@MappableClass(discriminatorKey: 'type')
2020
sealed class WorldEvent with WorldEventMappable {
21-
WorldEvent();
21+
const WorldEvent();
2222
}
2323

2424
/// Events that can be processed by the event management system
2525
/// This can be a ServerWorldEvent or a LocalWorldEvent
2626
@MappableClass(discriminatorKey: 'type')
2727
sealed class PlayableWorldEvent extends WorldEvent
28-
with PlayableWorldEventMappable {}
28+
with PlayableWorldEventMappable {
29+
const PlayableWorldEvent();
30+
}

api/lib/src/event/event.mapper.dart

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class ServerWorldEventMapper extends SubClassMapperBase<ServerWorldEvent> {
134134
DialogOpenedMapper.ensureInitialized();
135135
DialogsClosedMapper.ensureInitialized();
136136
ImagesUpdatedMapper.ensureInitialized();
137+
ServerStateUpdatedMapper.ensureInitialized();
137138
HybridWorldEventMapper.ensureInitialized();
138139
}
139140
return _instance!;
@@ -1650,6 +1651,129 @@ class _ImagesUpdatedCopyWithImpl<$R, $Out>
16501651
_ImagesUpdatedCopyWithImpl<$R2, $Out2>($value, $cast, t);
16511652
}
16521653

1654+
class ServerStateUpdatedMapper extends SubClassMapperBase<ServerStateUpdated> {
1655+
ServerStateUpdatedMapper._();
1656+
1657+
static ServerStateUpdatedMapper? _instance;
1658+
static ServerStateUpdatedMapper ensureInitialized() {
1659+
if (_instance == null) {
1660+
MapperContainer.globals.use(_instance = ServerStateUpdatedMapper._());
1661+
ServerWorldEventMapper.ensureInitialized().addSubMapper(_instance!);
1662+
ServerStateMapper.ensureInitialized();
1663+
}
1664+
return _instance!;
1665+
}
1666+
1667+
@override
1668+
final String id = 'ServerStateUpdated';
1669+
1670+
static ServerState _$state(ServerStateUpdated v) => v.state;
1671+
static const Field<ServerStateUpdated, ServerState> _f$state =
1672+
Field('state', _$state);
1673+
1674+
@override
1675+
final MappableFields<ServerStateUpdated> fields = const {
1676+
#state: _f$state,
1677+
};
1678+
1679+
@override
1680+
final String discriminatorKey = 'type';
1681+
@override
1682+
final dynamic discriminatorValue = 'ServerStateUpdated';
1683+
@override
1684+
late final ClassMapperBase superMapper =
1685+
ServerWorldEventMapper.ensureInitialized();
1686+
1687+
static ServerStateUpdated _instantiate(DecodingData data) {
1688+
return ServerStateUpdated(data.dec(_f$state));
1689+
}
1690+
1691+
@override
1692+
final Function instantiate = _instantiate;
1693+
1694+
static ServerStateUpdated fromMap(Map<String, dynamic> map) {
1695+
return ensureInitialized().decodeMap<ServerStateUpdated>(map);
1696+
}
1697+
1698+
static ServerStateUpdated fromJson(String json) {
1699+
return ensureInitialized().decodeJson<ServerStateUpdated>(json);
1700+
}
1701+
}
1702+
1703+
mixin ServerStateUpdatedMappable {
1704+
String toJson() {
1705+
return ServerStateUpdatedMapper.ensureInitialized()
1706+
.encodeJson<ServerStateUpdated>(this as ServerStateUpdated);
1707+
}
1708+
1709+
Map<String, dynamic> toMap() {
1710+
return ServerStateUpdatedMapper.ensureInitialized()
1711+
.encodeMap<ServerStateUpdated>(this as ServerStateUpdated);
1712+
}
1713+
1714+
ServerStateUpdatedCopyWith<ServerStateUpdated, ServerStateUpdated,
1715+
ServerStateUpdated>
1716+
get copyWith => _ServerStateUpdatedCopyWithImpl(
1717+
this as ServerStateUpdated, $identity, $identity);
1718+
@override
1719+
String toString() {
1720+
return ServerStateUpdatedMapper.ensureInitialized()
1721+
.stringifyValue(this as ServerStateUpdated);
1722+
}
1723+
1724+
@override
1725+
bool operator ==(Object other) {
1726+
return ServerStateUpdatedMapper.ensureInitialized()
1727+
.equalsValue(this as ServerStateUpdated, other);
1728+
}
1729+
1730+
@override
1731+
int get hashCode {
1732+
return ServerStateUpdatedMapper.ensureInitialized()
1733+
.hashValue(this as ServerStateUpdated);
1734+
}
1735+
}
1736+
1737+
extension ServerStateUpdatedValueCopy<$R, $Out>
1738+
on ObjectCopyWith<$R, ServerStateUpdated, $Out> {
1739+
ServerStateUpdatedCopyWith<$R, ServerStateUpdated, $Out>
1740+
get $asServerStateUpdated =>
1741+
$base.as((v, t, t2) => _ServerStateUpdatedCopyWithImpl(v, t, t2));
1742+
}
1743+
1744+
abstract class ServerStateUpdatedCopyWith<$R, $In extends ServerStateUpdated,
1745+
$Out> implements ServerWorldEventCopyWith<$R, $In, $Out> {
1746+
ServerStateCopyWith<$R, ServerState, ServerState> get state;
1747+
@override
1748+
$R call({ServerState? state});
1749+
ServerStateUpdatedCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(
1750+
Then<$Out2, $R2> t);
1751+
}
1752+
1753+
class _ServerStateUpdatedCopyWithImpl<$R, $Out>
1754+
extends ClassCopyWithBase<$R, ServerStateUpdated, $Out>
1755+
implements ServerStateUpdatedCopyWith<$R, ServerStateUpdated, $Out> {
1756+
_ServerStateUpdatedCopyWithImpl(super.value, super.then, super.then2);
1757+
1758+
@override
1759+
late final ClassMapperBase<ServerStateUpdated> $mapper =
1760+
ServerStateUpdatedMapper.ensureInitialized();
1761+
@override
1762+
ServerStateCopyWith<$R, ServerState, ServerState> get state =>
1763+
$value.state.copyWith.$chain((v) => call(state: v));
1764+
@override
1765+
$R call({ServerState? state}) =>
1766+
$apply(FieldCopyWithData({if (state != null) #state: state}));
1767+
@override
1768+
ServerStateUpdated $make(CopyWithData data) =>
1769+
ServerStateUpdated(data.get(#state, or: $value.state));
1770+
1771+
@override
1772+
ServerStateUpdatedCopyWith<$R2, ServerStateUpdated, $Out2> $chain<$R2, $Out2>(
1773+
Then<$Out2, $R2> t) =>
1774+
_ServerStateUpdatedCopyWithImpl($value, $cast, t);
1775+
}
1776+
16531777
class ClientWorldEventMapper extends SubClassMapperBase<ClientWorldEvent> {
16541778
ClientWorldEventMapper._();
16551779

api/lib/src/event/process/server.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,5 +326,9 @@ ServerProcessed processServerEvent(
326326
...event.images,
327327
},
328328
));
329+
case ServerStateUpdated():
330+
return ServerProcessed(state.copyWith(
331+
serverState: event.state,
332+
));
329333
}
330334
}

api/lib/src/event/server.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ part of 'event.dart';
44
/// Naming convention: present tense + Event
55
@MappableClass(discriminatorKey: 'type')
66
sealed class ServerWorldEvent extends PlayableWorldEvent
7-
with ServerWorldEventMappable {}
7+
with ServerWorldEventMappable {
8+
const ServerWorldEvent();
9+
}
810

911
@MappableClass()
1012
final class WorldInitialized extends ServerWorldEvent
@@ -211,6 +213,14 @@ class Base64IdMapHook extends SimpleMapper<Map<String, Uint8List>> {
211213
final class ImagesUpdated extends ServerWorldEvent with ImagesUpdatedMappable {
212214
final Map<String, Uint8List> images;
213215

214-
ImagesUpdated(this.images);
216+
const ImagesUpdated(this.images);
215217
ImagesUpdated.single(String id, Uint8List image) : images = {id: image};
216218
}
219+
220+
@MappableClass()
221+
final class ServerStateUpdated extends ServerWorldEvent
222+
with ServerStateUpdatedMappable {
223+
final ServerState state;
224+
225+
const ServerStateUpdated(this.state);
226+
}

api/lib/src/event/state.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import '../models/data.dart';
88
import '../models/dialog.dart';
99
import '../models/info.dart';
1010
import '../models/meta.dart';
11+
import '../models/server.dart';
1112
import '../models/table.dart';
1213
import '../models/vector.dart';
1314

@@ -32,6 +33,7 @@ final class WorldState with WorldStateMappable {
3233
final List<ChatMessage> messages;
3334
final List<GameDialog> dialogs;
3435
final Map<String, Uint8List> images;
36+
final ServerState serverState;
3537

3638
const WorldState({
3739
this.name,
@@ -44,6 +46,7 @@ final class WorldState with WorldStateMappable {
4446
this.id = kAuthorityChannel,
4547
this.dialogs = const [],
4648
this.images = const {},
49+
this.serverState = const ServerState(),
4750
required this.data,
4851
});
4952

api/lib/src/event/state.mapper.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class WorldStateMapper extends ClassMapperBase<WorldState> {
6464
FileMetadataMapper.ensureInitialized();
6565
ChatMessageMapper.ensureInitialized();
6666
GameDialogMapper.ensureInitialized();
67+
ServerStateMapper.ensureInitialized();
6768
}
6869
return _instance!;
6970
}
@@ -101,6 +102,9 @@ class WorldStateMapper extends ClassMapperBase<WorldState> {
101102
static Map<String, Uint8List> _$images(WorldState v) => v.images;
102103
static const Field<WorldState, Map<String, Uint8List>> _f$images =
103104
Field('images', _$images, opt: true, def: const {});
105+
static ServerState _$serverState(WorldState v) => v.serverState;
106+
static const Field<WorldState, ServerState> _f$serverState =
107+
Field('serverState', _$serverState, opt: true, def: const ServerState());
104108
static SetonixData _$data(WorldState v) => v.data;
105109
static const Field<WorldState, SetonixData> _f$data = Field('data', _$data);
106110

@@ -116,6 +120,7 @@ class WorldStateMapper extends ClassMapperBase<WorldState> {
116120
#id: _f$id,
117121
#dialogs: _f$dialogs,
118122
#images: _f$images,
123+
#serverState: _f$serverState,
119124
#data: _f$data,
120125
};
121126

@@ -131,6 +136,7 @@ class WorldStateMapper extends ClassMapperBase<WorldState> {
131136
id: data.dec(_f$id),
132137
dialogs: data.dec(_f$dialogs),
133138
images: data.dec(_f$images),
139+
serverState: data.dec(_f$serverState),
134140
data: data.dec(_f$data));
135141
}
136142

@@ -197,6 +203,7 @@ abstract class WorldStateCopyWith<$R, $In extends WorldState, $Out>
197203
get dialogs;
198204
MapCopyWith<$R, String, Uint8List, ObjectCopyWith<$R, Uint8List, Uint8List>>
199205
get images;
206+
ServerStateCopyWith<$R, ServerState, ServerState> get serverState;
200207
$R call(
201208
{String? name,
202209
GameTable? table,
@@ -208,6 +215,7 @@ abstract class WorldStateCopyWith<$R, $In extends WorldState, $Out>
208215
int? id,
209216
List<GameDialog>? dialogs,
210217
Map<String, Uint8List>? images,
218+
ServerState? serverState,
211219
SetonixData? data});
212220
WorldStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t);
213221
}
@@ -249,6 +257,9 @@ class _WorldStateCopyWithImpl<$R, $Out>
249257
get images => MapCopyWith($value.images,
250258
(v, t) => ObjectCopyWith(v, $identity, t), (v) => call(images: v));
251259
@override
260+
ServerStateCopyWith<$R, ServerState, ServerState> get serverState =>
261+
$value.serverState.copyWith.$chain((v) => call(serverState: v));
262+
@override
252263
$R call(
253264
{Object? name = $none,
254265
GameTable? table,
@@ -260,6 +271,7 @@ class _WorldStateCopyWithImpl<$R, $Out>
260271
int? id,
261272
List<GameDialog>? dialogs,
262273
Map<String, Uint8List>? images,
274+
ServerState? serverState,
263275
SetonixData? data}) =>
264276
$apply(FieldCopyWithData({
265277
if (name != $none) #name: name,
@@ -272,6 +284,7 @@ class _WorldStateCopyWithImpl<$R, $Out>
272284
if (id != null) #id: id,
273285
if (dialogs != null) #dialogs: dialogs,
274286
if (images != null) #images: images,
287+
if (serverState != null) #serverState: serverState,
275288
if (data != null) #data: data
276289
}));
277290
@override
@@ -286,6 +299,7 @@ class _WorldStateCopyWithImpl<$R, $Out>
286299
id: data.get(#id, or: $value.id),
287300
dialogs: data.get(#dialogs, or: $value.dialogs),
288301
images: data.get(#images, or: $value.images),
302+
serverState: data.get(#serverState, or: $value.serverState),
289303
data: data.get(#data, or: $value.data));
290304

291305
@override

api/lib/src/models/server.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:dart_mappable/dart_mappable.dart';
2+
import 'package:networker/networker.dart';
23

34
import '../event/event.dart';
45
import 'meta.dart';
@@ -98,3 +99,22 @@ class ListProperty extends GameProperty with ListPropertyMappable {
9899
super.packsSignature,
99100
});
100101
}
102+
103+
@MappableClass()
104+
final class PlayerInfo with PlayerInfoMappable {
105+
final Channel id;
106+
final String? name;
107+
108+
const PlayerInfo({
109+
required this.id,
110+
this.name,
111+
});
112+
}
113+
114+
@MappableClass()
115+
final class ServerState with ServerStateMappable {
116+
final String? link;
117+
final List<PlayerInfo> players;
118+
119+
const ServerState({this.link, this.players = const []});
120+
}

0 commit comments

Comments
 (0)