From a6b725c56f7dc71c182d0ce19cfbbb0fe211438e Mon Sep 17 00:00:00 2001 From: CodeDoctorDE Date: Sun, 25 Aug 2024 22:47:49 +0200 Subject: [PATCH] Add log levels --- .github/workflows/build.yml | 7 +++++++ server/lib/asset.dart | 9 +++++++-- server/lib/console.dart | 33 +++++++++++++++++++++++++++++++-- server/lib/main.dart | 27 +++++++++++++-------------- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4fec4b1..713e396 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,6 +33,13 @@ jobs: flutter clean flutter pub get flutter doctor -v + - name: Build nessesary files + working-directory: ./ + run: | + cd tools + dart pub get + cd .. + dart run tools/generate.dart - name: Import files if: ${{ github.event_name != 'pull_request' }} env: diff --git a/server/lib/asset.dart b/server/lib/asset.dart index 873cc88..83685de 100644 --- a/server/lib/asset.dart +++ b/server/lib/asset.dart @@ -2,11 +2,13 @@ import 'dart:io'; import 'package:path/path.dart' as p; import 'package:quokka_api/quokka_api.dart'; +import 'package:quokka_server/console.dart'; class ServerAssetManager extends AssetManager { final Map _packs = {}; - Future init({bool verbose = false}) async { + Future init( + {required ConsoleManager console, bool verbose = false}) async { _packs.clear(); final directory = Directory('packs'); if (!await directory.exists()) { @@ -21,7 +23,10 @@ class ServerAssetManager extends AssetManager { _packs[fileName] = data; } } - print('Loaded ${_packs.length} packs.'); + console.print('Loaded ${_packs.length} packs.', level: LogLevel.info); + if (_packs.isEmpty) { + console.print('No packs loaded.', level: LogLevel.warning); + } if (verbose) { print('Loaded packs: ${_packs.keys.join(', ')}'); } diff --git a/server/lib/console.dart b/server/lib/console.dart index a7acff1..0bc02b4 100644 --- a/server/lib/console.dart +++ b/server/lib/console.dart @@ -39,11 +39,15 @@ abstract class ConsoleProgram { bool get isHidden => getDescription() == null; } +enum LogLevel { verbose, info, warning, error } + class ConsoleManager { StreamSubscription? _subscription; final Map _programs = {}; final String prefix; + LogLevel minLogLevel = LogLevel.info; + bool _firstPrefix = true; ConsoleManager({this.prefix = '\n> '}); @@ -63,11 +67,36 @@ class ConsoleManager { void sendPrefix() { _firstPrefix = false; - stdout.write(' \r$prefix'); + stdout.write('\r$prefix'); } - void print(Object? message) { + void print(Object? message, {LogLevel? level}) { + if (level != null && level.index < minLogLevel.index) return; stdout.write('\r'); + final supportsAnsi = stdout.supportsAnsiEscapes; + if (level != null) { + switch (level) { + case LogLevel.verbose: + // Purple + if (supportsAnsi) stdout.write('\x1B[35m'); + stdout.write('[VERBOSE] '); + break; + case LogLevel.info: + // Blue + if (supportsAnsi) stdout.write('\x1B[36m'); + stdout.write('[INFO] '); + break; + case LogLevel.warning: + // Yellow + if (supportsAnsi) stdout.write('\x1B[33m'); + stdout.write('[WARNING] '); + case LogLevel.error: + // Red + if (supportsAnsi) stdout.write('\x1B[31m'); + stdout.write('[ERROR] '); + } + if (supportsAnsi) stdout.write('\x1B[0m'); + } stdout.write(message); sendPrefix(); } diff --git a/server/lib/main.dart b/server/lib/main.dart index 40a64f9..11ede7f 100644 --- a/server/lib/main.dart +++ b/server/lib/main.dart @@ -16,7 +16,6 @@ final class QuokkaServer extends Bloc { final ConsoleManager consoleManager = ConsoleManager(); final ServerAssetManager assetManager; final String? worldFile; - bool _verbose = false; bool _temp = false; GameTable _table = const GameTable(); @@ -52,7 +51,8 @@ final class QuokkaServer extends Bloc { return QuokkaServer._(worldFile, data); } - void log(Object? message) => consoleManager.print(message); + void log(Object? message, {LogLevel? level}) => + consoleManager.print(message, level: level); static String get defaultWorldFile => 'world.qka'; @@ -61,9 +61,11 @@ final class QuokkaServer extends Bloc { bool verbose = false, bool autosave = false}) async { await _runLogZone(() async { - await assetManager.init(verbose: verbose); + await assetManager.init(console: consoleManager, verbose: verbose); }); - _verbose = verbose; + if (verbose) { + consoleManager.minLogLevel = LogLevel.verbose; + } _temp = autosave; final server = _server = NetworkerSocketServer(InternetAddress.anyIPv4, port); @@ -94,10 +96,8 @@ final class QuokkaServer extends Bloc { _runLogZone(() { consoleManager.run(); }); - log('Server running on ${_server?.address}'); - if (_verbose) { - log('Verbose logging activated'); - } + log('Server running on ${_server?.address}', level: LogLevel.info); + log('Verbose logging activated', level: LogLevel.verbose); await _server?.onClosed.first; } @@ -110,9 +110,8 @@ final class QuokkaServer extends Bloc { table: _table, ); if (process == null) return; - if (_verbose) { - log('Processing event by ${event.channel}: $process'); - } + log('Processing event by ${event.channel}: $process', + level: LogLevel.verbose); _pipe?.sendMessage(process.$1, process.$2); if (process.$2 == kAnyChannel || process.$2 == kAuthorityChannel) { add(process.$1); @@ -121,7 +120,7 @@ final class QuokkaServer extends Bloc { void _onJoin((Channel, ConnectionInfo) event) { final (user, info) = event; - log('${info.address} ($user) joined the game'); + log('${info.address} ($user) joined the game', level: LogLevel.info); _pipe?.sendMessage( WorldInitialized( table: state.table, @@ -133,7 +132,7 @@ final class QuokkaServer extends Bloc { void _onLeave((Channel, ConnectionInfo) event) { final (user, info) = event; - log('${info.address} ($user) left the game'); + log('${info.address} ($user) left the game', level: LogLevel.info); } Future save({bool force = false}) async { @@ -145,7 +144,7 @@ final class QuokkaServer extends Bloc { @override Future close() async { await super.close(); - log('Closing...'); + log('Closing...', level: LogLevel.info); _server?.close(); consoleManager.dispose(); }