Skip to content

Commit 75d2eb4

Browse files
committed
Add simple plugin system, move events to plugin package
1 parent 2743aae commit 75d2eb4

File tree

9 files changed

+166
-43
lines changed

9 files changed

+166
-43
lines changed

plugin/lib/src/event.dart

Whitespace-only changes.

server/lib/src/events/model.dart renamed to plugin/lib/src/events/model.dart

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,18 @@ import 'package:dart_mappable/dart_mappable.dart';
44
import 'package:networker/networker.dart';
55
import 'package:setonix_api/setonix_api.dart';
66

7-
import '../server.dart';
8-
97
part 'model.mapper.dart';
108

11-
mixin ServerReference {
12-
SetonixServer get server;
13-
14-
void sendEvent(ServerWorldEvent event, [Channel target = kAnyChannel]) =>
15-
server.sendEvent(event, target);
16-
17-
WorldState get state => server.state;
18-
19-
GameTable? getTable(String name) => state.getTable(name);
20-
GameTable getTableOrDefault(String name) => state.getTableOrDefault(name);
21-
}
22-
23-
base class Event<T> with ServerReference {
24-
@override
25-
final SetonixServer server;
9+
base class Event<T> {
2610
final T clientEvent;
2711
final Channel source;
2812
ServerWorldEvent serverEvent;
2913
Channel target;
3014
bool cancelled = false;
3115
Set<Channel>? needsUpdate;
3216

33-
Event(this.server, this.serverEvent, this.target, this.clientEvent,
34-
this.source, this.needsUpdate);
17+
Event(this.serverEvent, this.target, this.clientEvent, this.source,
18+
this.needsUpdate);
3519

3620
Event<C> castEvent<C extends WorldEvent>() {
3721
return _LinkedEvent<C>(this);
@@ -44,9 +28,7 @@ base class Event<T> with ServerReference {
4428
}
4529

4630
// Allows casting an event to another
47-
final class _LinkedEvent<T extends WorldEvent?>
48-
with ServerReference
49-
implements Event<T> {
31+
final class _LinkedEvent<T extends WorldEvent?> implements Event<T> {
5032
final Event parent;
5133

5234
_LinkedEvent(this.parent);
@@ -75,9 +57,6 @@ final class _LinkedEvent<T extends WorldEvent?>
7557
@override
7658
T get clientEvent => parent.clientEvent as T;
7759

78-
@override
79-
SetonixServer get server => parent.server;
80-
8160
@override
8261
Channel get source => parent.source;
8362

@@ -98,14 +77,11 @@ final class ServerPing {
9877
});
9978
}
10079

101-
final class UserLeaveCallback with ServerReference {
102-
@override
103-
final SetonixServer server;
80+
final class UserLeaveCallback {
10481
final Channel channel;
10582
final ConnectionInfo info;
10683

10784
UserLeaveCallback({
108-
required this.server,
10985
required this.channel,
11086
required this.info,
11187
});

server/lib/src/events/system.dart renamed to plugin/lib/src/events/system.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'dart:async';
22
import 'dart:io';
33

4-
import 'package:setonix_server/setonix_server.dart';
4+
import 'package:networker/networker.dart';
5+
import 'package:setonix_api/setonix_api.dart';
6+
import 'package:setonix_plugin/src/events/model.dart';
57

68
final class EventSystem {
79
final StreamController<Event> _controller =
@@ -36,10 +38,8 @@ final class EventSystem {
3638
return ping.response;
3739
}
3840

39-
void runLeaveCallback(
40-
SetonixServer server, Channel channel, ConnectionInfo info) {
41-
final callback =
42-
UserLeaveCallback(server: server, channel: channel, info: info);
41+
void runLeaveCallback(Channel channel, ConnectionInfo info) {
42+
final callback = UserLeaveCallback(channel: channel, info: info);
4343
_leaveController.add(callback);
4444
}
4545

plugin/lib/src/plugin.dart

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import 'dart:async';
2+
3+
import 'package:networker/networker.dart';
4+
import 'package:setonix_api/event.dart';
5+
import 'package:setonix_plugin/src/events/system.dart';
6+
7+
typedef PluginProcessCallback = void Function(String, WorldEvent, [bool force]);
8+
typedef PluginSendEventCallback = void Function(
9+
String, NetworkerPacket<PlayableWorldEvent>);
10+
11+
final class PluginSystem {
12+
final Map<String, SetonixPlugin> _plugins = {};
13+
final PluginProcessCallback _onProcess;
14+
final PluginSendEventCallback _onSendEvent;
15+
16+
PluginSystem(
17+
{required PluginProcessCallback onProcess,
18+
required PluginSendEventCallback onSendEvent})
19+
: _onProcess = onProcess,
20+
_onSendEvent = onSendEvent;
21+
22+
SetonixPlugin registerPlugin(String name) {
23+
final plugin = SetonixPlugin._();
24+
_register(name, plugin);
25+
return plugin;
26+
}
27+
28+
void _register(String name, SetonixPlugin plugin) {
29+
_plugins[name] = plugin;
30+
plugin.onProcess
31+
.listen((message) => _onProcess(name, message.event, message.force));
32+
plugin.onSendEvent.listen((event) => _onSendEvent(name, event));
33+
}
34+
35+
void unregisterPlugin(String name) {
36+
_plugins.remove(name)?.dispose();
37+
}
38+
39+
void dispose() {
40+
_plugins.values.forEach((plugin) => plugin.dispose());
41+
_plugins.clear();
42+
}
43+
}
44+
45+
final class ProcessMessage {
46+
final WorldEvent event;
47+
final bool force;
48+
49+
ProcessMessage(this.event, this.force);
50+
}
51+
52+
final class SetonixPlugin {
53+
final EventSystem eventSystem = EventSystem();
54+
final StreamController<ProcessMessage> _onProcessController =
55+
StreamController.broadcast();
56+
final StreamController<NetworkerPacket<PlayableWorldEvent>>
57+
_onSendEventController = StreamController.broadcast();
58+
59+
SetonixPlugin._();
60+
61+
Stream<ProcessMessage> get onProcess => _onProcessController.stream;
62+
Stream<NetworkerPacket<PlayableWorldEvent>> get onSendEvent =>
63+
_onSendEventController.stream;
64+
65+
void process(WorldEvent event, {bool force = false}) =>
66+
_onProcessController.add(ProcessMessage(event, force));
67+
68+
void sendEvent(PlayableWorldEvent event, [Channel target = kAnyChannel]) =>
69+
_onSendEventController.add(NetworkerPacket(event, target));
70+
71+
void dispose() {
72+
eventSystem.dispose();
73+
_onProcessController.close();
74+
_onSendEventController.close();
75+
}
76+
}

plugin/pubspec.lock

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ packages:
1717
url: "https://pub.dev"
1818
source: hosted
1919
version: "6.4.1"
20+
archive:
21+
dependency: transitive
22+
description:
23+
name: archive
24+
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
25+
url: "https://pub.dev"
26+
source: hosted
27+
version: "4.0.2"
2028
args:
2129
dependency: transitive
2230
description:
@@ -157,10 +165,27 @@ packages:
157165
dependency: transitive
158166
description:
159167
name: crypto
160-
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
168+
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
169+
url: "https://pub.dev"
170+
source: hosted
171+
version: "3.0.6"
172+
dart_leap:
173+
dependency: transitive
174+
description:
175+
path: "packages/dart_leap"
176+
ref: db69a03082e6811c58dc2d0e5c23d04305e1623f
177+
resolved-ref: db69a03082e6811c58dc2d0e5c23d04305e1623f
178+
url: "https://github.com/LinwoodDev/dart_pkgs.git"
179+
source: git
180+
version: "1.0.0"
181+
dart_mappable:
182+
dependency: transitive
183+
description:
184+
name: dart_mappable
185+
sha256: f69a961ae8589724ebb542e588f228ae844c5f78028899cbe2cc718977c1b382
161186
url: "https://pub.dev"
162187
source: hosted
163-
version: "3.0.3"
188+
version: "4.3.0"
164189
dart_style:
165190
dependency: transitive
166191
description:
@@ -297,6 +322,15 @@ packages:
297322
url: "https://pub.dev"
298323
source: hosted
299324
version: "1.2.0"
325+
lw_file_system_api:
326+
dependency: transitive
327+
description:
328+
path: "packages/lw_file_system_api"
329+
ref: e4c17cb5e3a53c0cd02d4127458c2215f7c6e7d4
330+
resolved-ref: e4c17cb5e3a53c0cd02d4127458c2215f7c6e7d4
331+
url: "https://github.com/LinwoodDev/dart_pkgs.git"
332+
source: git
333+
version: "1.0.0"
300334
matcher:
301335
dependency: transitive
302336
description:
@@ -306,7 +340,7 @@ packages:
306340
source: hosted
307341
version: "0.12.16+1"
308342
meta:
309-
dependency: transitive
343+
dependency: "direct main"
310344
description:
311345
name: meta
312346
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
@@ -321,6 +355,15 @@ packages:
321355
url: "https://pub.dev"
322356
source: hosted
323357
version: "1.0.4"
358+
networker:
359+
dependency: "direct main"
360+
description:
361+
path: "packages/networker/networker"
362+
ref: "0bdc62d3af7f31e19a694d9cd39fe020dced8754"
363+
resolved-ref: "0bdc62d3af7f31e19a694d9cd39fe020dced8754"
364+
url: "https://github.com/LinwoodDev/dart_pkgs.git"
365+
source: git
366+
version: "1.0.0"
324367
package_config:
325368
dependency: transitive
326369
description:
@@ -345,6 +388,14 @@ packages:
345388
url: "https://pub.dev"
346389
source: hosted
347390
version: "1.5.1"
391+
posix:
392+
dependency: transitive
393+
description:
394+
name: posix
395+
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
396+
url: "https://pub.dev"
397+
source: hosted
398+
version: "6.0.1"
348399
pub_semver:
349400
dependency: transitive
350401
description:
@@ -369,6 +420,13 @@ packages:
369420
url: "https://pub.dev"
370421
source: hosted
371422
version: "3.2.1"
423+
setonix_api:
424+
dependency: "direct main"
425+
description:
426+
path: "../api"
427+
relative: true
428+
source: path
429+
version: "0.2.0"
372430
shelf:
373431
dependency: transitive
374432
description:
@@ -457,6 +515,14 @@ packages:
457515
url: "https://pub.dev"
458516
source: hosted
459517
version: "1.0.1"
518+
type_plus:
519+
dependency: transitive
520+
description:
521+
name: type_plus
522+
sha256: d5d1019471f0d38b91603adb9b5fd4ce7ab903c879d2fbf1a3f80a630a03fcc9
523+
url: "https://pub.dev"
524+
source: hosted
525+
version: "2.1.1"
460526
typed_data:
461527
dependency: transitive
462528
description:
@@ -506,4 +572,4 @@ packages:
506572
source: hosted
507573
version: "2.1.1"
508574
sdks:
509-
dart: ">=3.4.0 <4.0.0"
575+
dart: ">=3.5.1 <4.0.0"

plugin/pubspec.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ dependencies:
99
js: ^0.6.5
1010
collection: ^1.16.0
1111
freezed_annotation: ^2.2.0
12+
setonix_api:
13+
path: ../api
14+
networker:
15+
git:
16+
url: https://github.com/LinwoodDev/dart_pkgs.git
17+
ref: 0bdc62d3af7f31e19a694d9cd39fe020dced8754
18+
path: packages/networker/networker
19+
meta: ^1.16.0
1220
dev_dependencies:
1321
build_runner: ^2.4.4
1422
freezed: ^2.1.0+1

server/lib/setonix_server.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
library;
33

44
export 'package:setonix_api/setonix_api.dart';
5+
export 'package:setonix_plugin/setonix_plugin.dart';
56
export 'src/asset.dart';
6-
export 'src/events/model.dart';
7-
export 'src/events/system.dart';
87
export 'src/main.dart';
98
export 'src/server.dart';
109
export 'src/programs/kick.dart';

server/lib/src/server.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@ import 'package:networker/networker.dart';
99
import 'package:networker_socket/server.dart';
1010
import 'package:setonix_api/setonix_api.dart';
1111
import 'package:setonix_server/src/asset.dart';
12-
import 'package:setonix_server/src/events/system.dart';
12+
import 'package:setonix_plugin/src/events/system.dart';
1313
import 'package:setonix_server/src/programs/packs.dart';
1414
import 'package:setonix_server/src/programs/players.dart';
1515
import 'package:setonix_server/src/programs/save.dart';
1616
import 'package:setonix_server/src/programs/say.dart';
1717
import 'package:setonix_server/src/programs/stop.dart';
1818
import 'package:setonix_plugin/setonix_plugin.dart';
1919

20-
import 'events/model.dart';
21-
2220
Future<ServerProcessed> _computeEvent(ServerWorldEvent event, WorldState state,
2321
List<SignatureMetadata> signature) {
2422
return Isolate.run(

0 commit comments

Comments
 (0)