From 63d691167b0f462ea8cd20931500dd960cf6d759 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 2 Mar 2024 20:12:45 +0200 Subject: [PATCH 01/17] WIP. Added PoC logger through injectable, added proper logs to the migrations manager --- bin/main.dart | 28 ++++++++++++------------ lib/src/injector/injection.config.dart | 30 ++++++++++++++++++++++++++ lib/src/injector/injection.dart | 8 +++++++ lib/src/utils/logger.dart | 26 +++++++++++++++++++++- lib/src/utils/migrations_manager.dart | 8 +++++-- pubspec.yaml | 5 +++++ 6 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 lib/src/injector/injection.config.dart create mode 100644 lib/src/injector/injection.dart diff --git a/bin/main.dart b/bin/main.dart index 704b176..743a074 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -2,8 +2,10 @@ import 'dart:async'; import 'package:dotenv/dotenv.dart'; import 'package:postgres/postgres.dart'; import 'package:weather/weather.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/utils/migrations_manager.dart'; +import 'package:weather/src/utils/logger.dart'; Future getDatabaseConnection(DotEnv env) async { final username = env['dbuser']!; @@ -20,7 +22,7 @@ Future runMigrations(Pool dbConnection) async { await migrationsManager.runMigrations(); } -ChatPlatform getPlatform(String envPlatform) { +ChatPlatform getPlatform(String? envPlatform) { if (envPlatform == 'telegram') return ChatPlatform.telegram; if (envPlatform == 'discord') return ChatPlatform.discord; @@ -28,20 +30,22 @@ ChatPlatform getPlatform(String envPlatform) { } void main(List args) async { + setupInjection(); var env = DotEnv(includePlatformEnvironment: true)..load(); final dbConnection = await getDatabaseConnection(env); + final token = env['bottoken']!; + final adminId = env['adminid']!; + final repoUrl = env['githubrepo']!; + final youtubeKey = env['youtube']!; + final openweatherKey = env['openweather']!; + final conversatorKey = env['conversatorkey']!; + final platformName = getPlatform(env['platform']); + + var logger = Logger(); await runMigrations(dbConnection); runZonedGuarded(() { - final token = env['bottoken']!; - final adminId = env['adminid']!; - final repoUrl = env['githubrepo']!; - final youtubeKey = env['youtube']!; - final openweatherKey = env['openweather']!; - final conversatorKey = env['conversatorkey']!; - final platformName = getPlatform(env['platform']!); - Bot( platformName: platformName, botToken: token, @@ -53,10 +57,6 @@ void main(List args) async { dbConnection: dbConnection, ).startBot(); }, (error, stack) { - var now = DateTime.now(); - - print('[$now]: Error caught'); - print(error); - print(stack); + logger.e('Uncaught error', error); }); } diff --git a/lib/src/injector/injection.config.dart b/lib/src/injector/injection.config.dart new file mode 100644 index 0000000..de1d74c --- /dev/null +++ b/lib/src/injector/injection.config.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// InjectableConfigGenerator +// ************************************************************************** + +// ignore_for_file: type=lint +// coverage:ignore-file + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:get_it/get_it.dart' as _i1; +import 'package:injectable/injectable.dart' as _i2; + +import '../utils/logger.dart' as _i3; + +extension GetItInjectableX on _i1.GetIt { +// initializes the registration of main-scope dependencies inside of GetIt + _i1.GetIt init({ + String? environment, + _i2.EnvironmentFilter? environmentFilter, + }) { + final gh = _i2.GetItHelper( + this, + environment, + environmentFilter, + ); + gh.singleton<_i3.Logger>(_i3.Logger()); + return this; + } +} diff --git a/lib/src/injector/injection.dart b/lib/src/injector/injection.dart new file mode 100644 index 0000000..90b1f57 --- /dev/null +++ b/lib/src/injector/injection.dart @@ -0,0 +1,8 @@ +import 'package:get_it/get_it.dart'; +import 'package:injectable/injectable.dart'; +import 'injection.config.dart'; + +GetIt getIt = GetIt.instance; + +@InjectableInit(preferRelativeImports: true) +void setupInjection() => getIt.init(); diff --git a/lib/src/utils/logger.dart b/lib/src/utils/logger.dart index abfad5e..792ab7f 100644 --- a/lib/src/utils/logger.dart +++ b/lib/src/utils/logger.dart @@ -1 +1,25 @@ -// TODO: add a logger +import 'package:injectable/injectable.dart'; +import 'package:logger/logger.dart' as lg; + +@singleton +class Logger { + late final lg.Logger _logger; + + Logger() { + _logger = lg.Logger(printer: lg.PrettyPrinter(methodCount: 6, printTime: true)); + + i('Logger initialized'); + } + + void i(message) { + _logger.i(message); + } + + void w(message) { + _logger.w(message); + } + + void e(message, [Object? error]) { + _logger.e(message, error: error); + } +} diff --git a/lib/src/utils/migrations_manager.dart b/lib/src/utils/migrations_manager.dart index 435a4e2..976a105 100644 --- a/lib/src/utils/migrations_manager.dart +++ b/lib/src/utils/migrations_manager.dart @@ -1,16 +1,20 @@ import 'dart:io'; import 'package:postgres/postgres.dart'; +import 'package:weather/src/injector/injection.dart'; +import 'package:weather/src/utils/logger.dart'; const String _pathToMigrations = 'assets/db/migrations'; const String _migrationTableMigrationName = '1677944890_migration.sql'; class MigrationsManager { final Pool dbConnection; + final Logger logger; final String _migrationsDirectory = _pathToMigrations; - MigrationsManager(this.dbConnection); + MigrationsManager(this.dbConnection) : logger = getIt(); Future runMigrations() async { + logger.i('Hello, world!'); var migrationsLocation = Directory(_migrationsDirectory); var rawMigrationsContent = await migrationsLocation.list().toList() ..sort((a, b) => a.uri.pathSegments.last.compareTo(b.uri.pathSegments.last)); @@ -26,7 +30,7 @@ class MigrationsManager { var runMigration = await _shouldRunMigration(migrationName); if (runMigration) { - print('Applying migration $migrationName'); + logger.w('Applying migration $migrationName'); var query = await migration.readAsString(); await _runMigration(query, migrationName); diff --git a/pubspec.yaml b/pubspec.yaml index 8ced707..681dc0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,10 +21,15 @@ dependencies: meta: ^1.11.0 uuid: ^4.2.1 event_bus: ^2.0.0 + injectable: ^2.3.2 + get_it: ^7.6.7 + logger: ^2.0.2+1 dev_dependencies: analyzer: ^6.3.0 + build_runner: ^2.4.8 docker_process: ^1.3.1 + injectable_generator: ^2.4.1 lints: ^3.0.0 path: ^1.8.3 test: ^1.6.0 From cadf868dacc653c3c565d58acb0f187d893961c0 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 2 Mar 2024 20:34:11 +0200 Subject: [PATCH 02/17] Updated logger usage for main file --- bin/main.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/main.dart b/bin/main.dart index 743a074..da29192 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -41,8 +41,6 @@ void main(List args) async { final conversatorKey = env['conversatorkey']!; final platformName = getPlatform(env['platform']); - var logger = Logger(); - await runMigrations(dbConnection); runZonedGuarded(() { @@ -57,6 +55,8 @@ void main(List args) async { dbConnection: dbConnection, ).startBot(); }, (error, stack) { + var logger = getIt(); + logger.e('Uncaught error', error); }); } From 8965fd23d6338277c455f64f1749333af2799412 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 2 Mar 2024 20:35:31 +0200 Subject: [PATCH 03/17] Updated logger for migrations manager --- lib/src/utils/migrations_manager.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/utils/migrations_manager.dart b/lib/src/utils/migrations_manager.dart index 976a105..8fe3c44 100644 --- a/lib/src/utils/migrations_manager.dart +++ b/lib/src/utils/migrations_manager.dart @@ -8,13 +8,12 @@ const String _migrationTableMigrationName = '1677944890_migration.sql'; class MigrationsManager { final Pool dbConnection; - final Logger logger; + final Logger _logger; final String _migrationsDirectory = _pathToMigrations; - MigrationsManager(this.dbConnection) : logger = getIt(); + MigrationsManager(this.dbConnection) : _logger = getIt(); Future runMigrations() async { - logger.i('Hello, world!'); var migrationsLocation = Directory(_migrationsDirectory); var rawMigrationsContent = await migrationsLocation.list().toList() ..sort((a, b) => a.uri.pathSegments.last.compareTo(b.uri.pathSegments.last)); @@ -30,7 +29,7 @@ class MigrationsManager { var runMigration = await _shouldRunMigration(migrationName); if (runMigration) { - logger.w('Applying migration $migrationName'); + _logger.w('Applying migration $migrationName'); var query = await migration.readAsString(); await _runMigration(query, migrationName); From 3d19bfaecd67575c78761590b973ff9d0d7d2c80 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Tue, 5 Mar 2024 19:32:15 +0200 Subject: [PATCH 04/17] Added different logger initializations based on environment --- bin/main.dart | 7 ++++++- lib/src/injector/injection.config.dart | 15 ++++++++++++++- lib/src/injector/injection.dart | 4 ++-- lib/src/utils/logger.dart | 17 +++++++++++++---- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/bin/main.dart b/bin/main.dart index da29192..08bd0d4 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -29,8 +29,11 @@ ChatPlatform getPlatform(String? envPlatform) { throw Exception('Invalid platform $envPlatform'); } +bool getIsProductionMode(String? envIsProduction) { + return int.parse(envIsProduction ?? '0') == 1; +} + void main(List args) async { - setupInjection(); var env = DotEnv(includePlatformEnvironment: true)..load(); final dbConnection = await getDatabaseConnection(env); final token = env['bottoken']!; @@ -40,7 +43,9 @@ void main(List args) async { final openweatherKey = env['openweather']!; final conversatorKey = env['conversatorkey']!; final platformName = getPlatform(env['platform']); + final isProduction = getIsProductionMode(env['isproduction']); + setupInjection(isProduction); await runMigrations(dbConnection); runZonedGuarded(() { diff --git a/lib/src/injector/injection.config.dart b/lib/src/injector/injection.config.dart index de1d74c..82ff847 100644 --- a/lib/src/injector/injection.config.dart +++ b/lib/src/injector/injection.config.dart @@ -13,6 +13,9 @@ import 'package:injectable/injectable.dart' as _i2; import '../utils/logger.dart' as _i3; +const String _dev = 'dev'; +const String _prod = 'prod'; + extension GetItInjectableX on _i1.GetIt { // initializes the registration of main-scope dependencies inside of GetIt _i1.GetIt init({ @@ -24,7 +27,17 @@ extension GetItInjectableX on _i1.GetIt { environment, environmentFilter, ); - gh.singleton<_i3.Logger>(_i3.Logger()); + final loggerModule = _$LoggerModule(); + gh.factory<_i3.Logger>( + () => loggerModule.devLogger, + registerFor: {_dev}, + ); + gh.factory<_i3.Logger>( + () => loggerModule.prodLogger, + registerFor: {_prod}, + ); return this; } } + +class _$LoggerModule extends _i3.LoggerModule {} diff --git a/lib/src/injector/injection.dart b/lib/src/injector/injection.dart index 90b1f57..e23c80d 100644 --- a/lib/src/injector/injection.dart +++ b/lib/src/injector/injection.dart @@ -2,7 +2,7 @@ import 'package:get_it/get_it.dart'; import 'package:injectable/injectable.dart'; import 'injection.config.dart'; -GetIt getIt = GetIt.instance; +final GetIt getIt = GetIt.instance; @InjectableInit(preferRelativeImports: true) -void setupInjection() => getIt.init(); +void setupInjection(bool isProd) => getIt.init(environment: isProd ? Environment.prod : Environment.dev); diff --git a/lib/src/utils/logger.dart b/lib/src/utils/logger.dart index 792ab7f..0188ac7 100644 --- a/lib/src/utils/logger.dart +++ b/lib/src/utils/logger.dart @@ -1,14 +1,14 @@ import 'package:injectable/injectable.dart'; import 'package:logger/logger.dart' as lg; -@singleton class Logger { + final bool isProduction; late final lg.Logger _logger; - Logger() { - _logger = lg.Logger(printer: lg.PrettyPrinter(methodCount: 6, printTime: true)); + Logger(this.isProduction) { + _logger = lg.Logger(printer: lg.PrettyPrinter(methodCount: isProduction ? 0 : 6, printTime: true)); - i('Logger initialized'); + i('Logger initialized in ${isProduction ? 'prod' : 'dev'} mode'); } void i(message) { @@ -23,3 +23,12 @@ class Logger { _logger.e(message, error: error); } } + +@module +abstract class LoggerModule { + @dev + Logger get devLogger => Logger(false); + + @prod + Logger get prodLogger => Logger(true); +} From 451ff0e629b8552df200484b71580fbf9dd172b7 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Tue, 5 Mar 2024 19:33:12 +0200 Subject: [PATCH 05/17] Added .env sample for environment --- .env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.example b/.env.example index 3494d27..74d818c 100644 --- a/.env.example +++ b/.env.example @@ -8,3 +8,4 @@ githubrepo=github_repo youtube=youtube_token openweather=openweather_token conversatorkey=chatgpt_token +isproduction=0_or_1 \ No newline at end of file From cec2d508eb0d200e808d7e949d98adfaf6954511 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Tue, 5 Mar 2024 19:59:38 +0200 Subject: [PATCH 06/17] Added different log outputs based on environment --- .gitignore | 1 + lib/src/utils/logger.dart | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f4c53a6..840f8c9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ doc/api/ .env .idea +logs.txt assets/swearwords/swearwords.*.json !assets/swearwords/swearwords.sample.json diff --git a/lib/src/utils/logger.dart b/lib/src/utils/logger.dart index 0188ac7..8f53564 100644 --- a/lib/src/utils/logger.dart +++ b/lib/src/utils/logger.dart @@ -1,12 +1,18 @@ +import 'dart:io'; import 'package:injectable/injectable.dart'; import 'package:logger/logger.dart' as lg; +final logFile = File('logs.txt'); + class Logger { final bool isProduction; late final lg.Logger _logger; Logger(this.isProduction) { - _logger = lg.Logger(printer: lg.PrettyPrinter(methodCount: isProduction ? 0 : 6, printTime: true)); + var printer = isProduction ? lg.SimplePrinter(printTime: true, colors: false) : lg.PrettyPrinter(printTime: true); + var output = isProduction ? lg.MultiOutput([lg.FileOutput(file: logFile), lg.ConsoleOutput()]) : lg.ConsoleOutput(); + + _logger = lg.Logger(printer: printer, output: output); i('Logger initialized in ${isProduction ? 'prod' : 'dev'} mode'); } From 810d730008098aa7ed533a126f506231caf71e04 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Tue, 5 Mar 2024 20:03:37 +0200 Subject: [PATCH 07/17] Updated logger constructor --- lib/src/utils/logger.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/utils/logger.dart b/lib/src/utils/logger.dart index 8f53564..f539734 100644 --- a/lib/src/utils/logger.dart +++ b/lib/src/utils/logger.dart @@ -8,7 +8,7 @@ class Logger { final bool isProduction; late final lg.Logger _logger; - Logger(this.isProduction) { + Logger({required this.isProduction}) { var printer = isProduction ? lg.SimplePrinter(printTime: true, colors: false) : lg.PrettyPrinter(printTime: true); var output = isProduction ? lg.MultiOutput([lg.FileOutput(file: logFile), lg.ConsoleOutput()]) : lg.ConsoleOutput(); @@ -33,8 +33,8 @@ class Logger { @module abstract class LoggerModule { @dev - Logger get devLogger => Logger(false); + Logger get devLogger => Logger(isProduction: false); @prod - Logger get prodLogger => Logger(true); + Logger get prodLogger => Logger(isProduction: true); } From 91fc685104d0565870689ab3c8e18177207e3685 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Tue, 5 Mar 2024 21:02:47 +0200 Subject: [PATCH 08/17] Added logs for platforms --- lib/src/platform/discord_platform.dart | 15 ++++++++++----- lib/src/platform/telegram_platform.dart | 11 ++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/src/platform/discord_platform.dart b/lib/src/platform/discord_platform.dart index cf0637c..0a26ab5 100644 --- a/lib/src/platform/discord_platform.dart +++ b/lib/src/platform/discord_platform.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; -import 'package:nyxx/nyxx.dart'; +import 'package:nyxx/nyxx.dart' hide Logger; import 'package:nyxx_commands/nyxx_commands.dart'; import 'package:uuid/uuid.dart'; import 'package:cron/cron.dart'; @@ -15,9 +15,12 @@ import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/bot_command.dart'; import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/globals/access_level.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; + const uuid = Uuid(); const emptyCharacter = 'ㅤ'; @@ -30,6 +33,7 @@ class DiscordPlatform implements Platform { final Access access; final Chat chat; final weather.User user; + final Logger _logger; final List _commands = []; final Map> _usersOnlineStatus = {}; @@ -43,11 +47,12 @@ class DiscordPlatform implements Platform { required this.eventBus, required this.access, required this.chat, - required this.user}); + required this.user}) + : _logger = getIt(); @override Future initialize() async { - print('No initialize script for Discord'); + _logger.i('No initialize script for Discord'); } @override @@ -60,7 +65,7 @@ class DiscordPlatform implements Platform { _startHeroCheckJob(); _watchUsersStatusUpdate(); - print('Discord platform has been started!'); + _logger.i('Discord platform has been started!'); } @override @@ -234,7 +239,7 @@ class DiscordPlatform implements Platform { await Future.forEach(authorizedChats, (chatId) async { var chatOnlineUsers = _usersOnlineStatus[chatId]; if (chatOnlineUsers == null) { - print('Attempt to get online users for empty chat $chatId'); + _logger.w('Attempt to get online users for empty chat $chatId'); return null; } diff --git a/lib/src/platform/telegram_platform.dart b/lib/src/platform/telegram_platform.dart index 9220fd2..20fcef4 100644 --- a/lib/src/platform/telegram_platform.dart +++ b/lib/src/platform/telegram_platform.dart @@ -16,9 +16,12 @@ import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/globals/bot_command.dart'; import 'package:weather/src/globals/accordion_poll.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; + class TelegramPlatform implements Platform { @override late ChatPlatform chatPlatform; @@ -28,6 +31,7 @@ class TelegramPlatform implements Platform { final Access access; final Chat chat; final User user; + final Logger _logger; // final Debouncer _debouncer = Debouncer(Duration(seconds: 1), initialValue: null); @@ -41,7 +45,8 @@ class TelegramPlatform implements Platform { required this.eventBus, required this.access, required this.chat, - required this.user}); + required this.user}) + : _logger = getIt(); @override Future initialize() async { @@ -54,12 +59,12 @@ class TelegramPlatform implements Platform { _bot.start(); - print('Telegram platform has been started!'); + _logger.i('Telegram platform has been started!'); } @override Future postStart() async { - print('No post-start script for Telegram'); + _logger.i('No post-start script for Telegram'); } @override From fcf352831786b6930a33a2da91da1315a108e560 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 9 Mar 2024 02:11:24 +0200 Subject: [PATCH 09/17] Added toString implementation for MessageEvent, added logs to some of the modules --- lib/src/globals/message_event.dart | 5 +++++ lib/src/modules/accordion_poll_manager.dart | 8 +++++++- lib/src/modules/chat_manager.dart | 11 ++++++++++- lib/src/modules/check_reminder_manager.dart | 10 ++++++++-- lib/src/modules/command_statistics_manager.dart | 10 +++++++++- lib/src/modules/youtube_manager.dart | 10 ++++++++-- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/src/globals/message_event.dart b/lib/src/globals/message_event.dart index 817ad42..b2b3e4d 100644 --- a/lib/src/globals/message_event.dart +++ b/lib/src/globals/message_event.dart @@ -17,4 +17,9 @@ class MessageEvent { required this.otherUserIds, required this.parameters, required this.rawMessage}); + + @override + String toString() { + return '{ platform: $platform, chatId: $chatId, userId: $userId, otherUserIds: $otherUserIds, parameters: $parameters, isBot: $isBot, rawMessage: $rawMessage }'; + } } diff --git a/lib/src/modules/accordion_poll_manager.dart b/lib/src/modules/accordion_poll_manager.dart index ce60d42..1e618ff 100644 --- a/lib/src/modules/accordion_poll_manager.dart +++ b/lib/src/modules/accordion_poll_manager.dart @@ -4,7 +4,9 @@ import 'package:weather/src/core/user.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class AccordionPollManager { @@ -12,10 +14,12 @@ class AccordionPollManager { final EventBus eventBus; final User user; final Chat chat; + final Logger _logger; final AccordionPoll _accordionPoll; AccordionPollManager({required this.platform, required this.eventBus, required this.user, required this.chat}) - : _accordionPoll = AccordionPoll(eventBus: eventBus, chat: chat); + : _logger = getIt(), + _accordionPoll = AccordionPoll(eventBus: eventBus, chat: chat); void startAccordionPoll(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; @@ -26,6 +30,8 @@ class AccordionPollManager { return; } + _logger.i('Starting accordion poll: $event'); + var chatId = event.chatId; var fromUser = await user.getSingleUserForChat(chatId, event.userId); var toUser = await user.getSingleUserForChat(chatId, event.otherUserIds[0]); diff --git a/lib/src/modules/chat_manager.dart b/lib/src/modules/chat_manager.dart index 00c1163..71edfea 100644 --- a/lib/src/modules/chat_manager.dart +++ b/lib/src/modules/chat_manager.dart @@ -1,17 +1,22 @@ import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ChatManager { final Platform platform; final Chat chat; + final Logger _logger; - ChatManager({required this.platform, required this.chat}); + ChatManager({required this.platform, required this.chat}) : _logger = getIt(); void createChat(MessageEvent event) async { + _logger.i('Creating chat: $event'); + var chatId = event.chatId; var chatName = _getNewChatName(event); var result = await chat.createChat(id: chatId, name: chatName, platform: event.platform); @@ -23,6 +28,8 @@ class ChatManager { void writeToChat(MessageEvent event) { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Writing to chat: $event'); + var chatId = event.chatId; var message = event.parameters.join(' '); @@ -32,6 +39,8 @@ class ChatManager { void setSwearwordsConfig(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Setting swearwords config: $event'); + var chatId = event.chatId; var config = event.parameters[0]; var result = await chat.setSwearwordsConfig(chatId, config); diff --git a/lib/src/modules/check_reminder_manager.dart b/lib/src/modules/check_reminder_manager.dart index f655806..80d58f3 100644 --- a/lib/src/modules/check_reminder_manager.dart +++ b/lib/src/modules/check_reminder_manager.dart @@ -3,7 +3,9 @@ import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/check_reminder.dart'; import 'package:weather/src/core/user.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class CheckReminderManager { @@ -11,10 +13,12 @@ class CheckReminderManager { final Database db; final Chat chat; final User user; + final Logger _logger; final CheckReminder _checkReminder; CheckReminderManager({required this.platform, required this.db, required this.chat, required this.user}) - : _checkReminder = CheckReminder(db: db); + : _logger = getIt(), + _checkReminder = CheckReminder(db: db); void initialize() { _checkReminder.initialize(); @@ -24,6 +28,8 @@ class CheckReminderManager { void checkMessage(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Creating message check: $event'); + var chatId = event.chatId; var userId = event.userId; var period = event.parameters[0]; @@ -46,7 +52,7 @@ class CheckReminderManager { sendOperationMessage(checkReminder.chatId, platform: platform, operationResult: true, successfulMessage: checkReminderMessage); } else { - print("Could not send reminder, user not found. chatId: ${checkReminder.chatId}, userId: ${checkReminder.userId}"); + _logger.e('Failed to send reminder: $checkReminder'); } }); } diff --git a/lib/src/modules/command_statistics_manager.dart b/lib/src/modules/command_statistics_manager.dart index e447ca3..16ee301 100644 --- a/lib/src/modules/command_statistics_manager.dart +++ b/lib/src/modules/command_statistics_manager.dart @@ -3,7 +3,9 @@ import 'package:weather/src/core/command_statistics.dart'; import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/event_bus.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class CommandStatisticsManager { @@ -11,10 +13,12 @@ class CommandStatisticsManager { final Database db; final EventBus eventBus; final Chat chat; + final Logger _logger; final CommandStatistics _commandStatistics; CommandStatisticsManager({required this.platform, required this.db, required this.eventBus, required this.chat}) - : _commandStatistics = CommandStatistics(db: db, eventBus: eventBus, chat: chat, chatPlatform: platform.chatPlatform); + : _logger = getIt(), + _commandStatistics = CommandStatistics(db: db, eventBus: eventBus, chat: chat, chatPlatform: platform.chatPlatform); void initialize() { _commandStatistics.initialize(); @@ -22,6 +26,7 @@ class CommandStatisticsManager { } void getChatCommandInvocations(MessageEvent event) async { + _logger.i('Receiving chat command invocations: $event'); var chatId = event.chatId; var commandInvocationData = await _commandStatistics.getChatCommandInvocations(chatId: chatId); var invocationsMessage = _buildCommandInvocationsMessage(commandInvocationData); @@ -33,6 +38,7 @@ class CommandStatisticsManager { void getUserCommandInvocations(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; + _logger.i('Receiving user command invocations: $event'); var userId = event.otherUserIds[0]; var chatId = event.chatId; @@ -49,6 +55,8 @@ class CommandStatisticsManager { void _subscribeToChatReports() { _commandStatistics.chatReportStream.listen((chatReport) async { + _logger.i('Handling chat report data: $chatReport'); + var chatId = chatReport.chatId; var successfulMessage = ''; diff --git a/lib/src/modules/youtube_manager.dart b/lib/src/modules/youtube_manager.dart index d8a3411..615edc4 100644 --- a/lib/src/modules/youtube_manager.dart +++ b/lib/src/modules/youtube_manager.dart @@ -1,19 +1,25 @@ import 'package:weather/src/core/youtube.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class YoutubeManager { final Platform platform; final String apiKey; - + final Logger _logger; final Youtube _youtube; - YoutubeManager({required this.platform, required this.apiKey}) : _youtube = Youtube(apiKey); + YoutubeManager({required this.platform, required this.apiKey}) + : _logger = getIt(), + _youtube = Youtube(apiKey); void searchSong(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Searching for a song: $event'); + var chatId = event.chatId; var query = event.parameters.join(' '); var result = await _youtube.getYoutubeVideoUrl(query); From 2a5d0dad9fd095aaf3e0ede38405dae5babfbfad Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 9 Mar 2024 16:16:49 +0200 Subject: [PATCH 10/17] Added logs to the rest of the modules --- lib/src/modules/conversator_manager.dart | 7 ++++++- lib/src/modules/dadjokes_manager.dart | 9 ++++++++- lib/src/modules/general_manager.dart | 10 +++++++++- lib/src/modules/panorama_manager.dart | 13 ++++++++++--- lib/src/modules/reputation_manager.dart | 11 ++++++++++- lib/src/modules/user_manager.dart | 9 +++++++-- lib/src/modules/weather_manager.dart | 22 +++++++++++++++++++--- lib/src/modules/youtube_manager.dart | 1 - 8 files changed, 69 insertions(+), 13 deletions(-) diff --git a/lib/src/modules/conversator_manager.dart b/lib/src/modules/conversator_manager.dart index 8b8e327..208ebc0 100644 --- a/lib/src/modules/conversator_manager.dart +++ b/lib/src/modules/conversator_manager.dart @@ -2,7 +2,9 @@ import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/conversator.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ConversatorManager { @@ -10,10 +12,12 @@ class ConversatorManager { final Database db; final String conversatorApiKey; final String adminId; + final Logger _logger; final Conversator _conversator; ConversatorManager({required this.platform, required this.db, required this.conversatorApiKey, required this.adminId}) - : _conversator = Conversator(db: db, conversatorApiKey: conversatorApiKey, adminId: adminId); + : _logger = getIt(), + _conversator = Conversator(db: db, conversatorApiKey: conversatorApiKey, adminId: adminId); void initialize() { _conversator.initialize(); @@ -29,6 +33,7 @@ class ConversatorManager { void _getConversatorReply(MessageEvent event, String model) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Getting conversator reply: $event'); var chatId = event.chatId; var userId = event.userId; diff --git a/lib/src/modules/dadjokes_manager.dart b/lib/src/modules/dadjokes_manager.dart index 9152224..f638c3e 100644 --- a/lib/src/modules/dadjokes_manager.dart +++ b/lib/src/modules/dadjokes_manager.dart @@ -1,15 +1,22 @@ import 'package:weather/src/core/dadjokes.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/modules/utils.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; class DadJokesManager { final Platform platform; + final Logger _logger; final DadJokes _dadjokes; - DadJokesManager({required this.platform}) : _dadjokes = DadJokes(); + DadJokesManager({required this.platform}) + : _logger = getIt(), + _dadjokes = DadJokes(); void sendJoke(MessageEvent event) async { + _logger.i('Sending a joke: $event'); + var chatId = event.chatId; var joke = await _dadjokes.getJoke(); diff --git a/lib/src/modules/general_manager.dart b/lib/src/modules/general_manager.dart index cd8d81b..4c5e0c6 100644 --- a/lib/src/modules/general_manager.dart +++ b/lib/src/modules/general_manager.dart @@ -1,6 +1,8 @@ +import 'package:logger/logger.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/general.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; @@ -8,12 +10,16 @@ class GeneralManager { final Platform platform; final Chat chat; final String repositoryUrl; + final Logger _logger; final General _general; GeneralManager({required this.platform, required this.chat, required this.repositoryUrl}) - : _general = General(chat: chat, repositoryUrl: repositoryUrl); + : _logger = getIt(), + _general = General(chat: chat, repositoryUrl: repositoryUrl); void postHealthCheck(MessageEvent event) { + _logger.i('Sending health check: $event'); + var chatId = event.chatId; var result = _general.healthCheck(chatId); @@ -21,6 +27,8 @@ class GeneralManager { } void postUpdateMessage(MessageEvent event) async { + _logger.i('Sending update message: $event'); + var chatId = event.chatId; var result = await _general.getLastCommitMessage(); diff --git a/lib/src/modules/panorama_manager.dart b/lib/src/modules/panorama_manager.dart index 59838e0..0809b47 100644 --- a/lib/src/modules/panorama_manager.dart +++ b/lib/src/modules/panorama_manager.dart @@ -1,8 +1,10 @@ +import 'package:logger/logger.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/panorama.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; @@ -10,9 +12,12 @@ class PanoramaManager { final Platform platform; final Chat chat; final Database db; + final Logger _logger; final PanoramaNews _panoramaNews; - PanoramaManager({required this.platform, required this.chat, required this.db}) : _panoramaNews = PanoramaNews(db: db); + PanoramaManager({required this.platform, required this.chat, required this.db}) + : _logger = getIt(), + _panoramaNews = PanoramaNews(db: db); void initialize() { _panoramaNews.initialize(); @@ -20,6 +25,8 @@ class PanoramaManager { } void sendNewsToChat(MessageEvent event) async { + _logger.i('Sending Panorama news: $event'); + var chatId = event.chatId; var news = await _panoramaNews.getNews(chatId); var successfulMessage = '${news?.title}\n\nFull: ${news?.url}'; @@ -33,9 +40,9 @@ class PanoramaManager { return; } - var panoramaStream = _panoramaNews.panoramaStream; + _panoramaNews.panoramaStream.listen((event) async { + _logger.i('Handling Panorama stream data: $event'); - panoramaStream.listen((event) async { var allChats = await chat.getAllChatIdsForPlatform(ChatPlatform.telegram); allChats.forEach((chatId) { diff --git a/lib/src/modules/reputation_manager.dart b/lib/src/modules/reputation_manager.dart index d4b0bd1..418484a 100644 --- a/lib/src/modules/reputation_manager.dart +++ b/lib/src/modules/reputation_manager.dart @@ -1,8 +1,10 @@ +import 'package:logger/logger.dart'; import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/event_bus.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/reputation.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'utils.dart'; @@ -11,10 +13,12 @@ class ReputationManager { final Database db; final EventBus eventBus; final Chat chat; + final Logger _logger; final Reputation _reputation; ReputationManager({required this.platform, required this.db, required this.eventBus, required this.chat}) - : _reputation = Reputation(db: db, eventBus: eventBus); + : _logger = getIt(), + _reputation = Reputation(db: db, eventBus: eventBus); void initialize() { _reputation.initialize(); @@ -22,6 +26,7 @@ class ReputationManager { void increaseReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; + _logger.i('Increasing reputation: $event'); var chatId = event.chatId; var fromUserId = event.userId; @@ -36,6 +41,7 @@ class ReputationManager { void decreaseReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; + _logger.i('Decreasing reputation: $event'); var chatId = event.chatId; var fromUserId = event.userId; @@ -49,6 +55,8 @@ class ReputationManager { } void sendReputationList(MessageEvent event) async { + _logger.i('Sending reputation list: $event'); + var chatId = event.chatId; var reputationData = await _reputation.getReputationData(chatId); var reputationMessage = _buildReputationListMessage(chatId, reputationData); @@ -59,6 +67,7 @@ class ReputationManager { void createReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; + _logger.i('Creating reputation data: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; diff --git a/lib/src/modules/user_manager.dart b/lib/src/modules/user_manager.dart index cad9d0b..1da15e1 100644 --- a/lib/src/modules/user_manager.dart +++ b/lib/src/modules/user_manager.dart @@ -1,15 +1,18 @@ import 'package:weather/src/core/user.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; +import 'package:weather/src/utils/logger.dart'; class UserManager { final Platform platform; final Chat chat; final User user; + final Logger _logger; - UserManager({required this.platform, required this.chat, required this.user}); + UserManager({required this.platform, required this.chat, required this.user}) : _logger = getIt(); void initialize() { _subscribeToUserUpdates(); @@ -17,6 +20,7 @@ class UserManager { void addUser(MessageEvent event) async { if (!messageEventParametersCheck(platform, event) || !userIdsCheck(platform, event)) return; + _logger.i('Adding a new user: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; @@ -30,6 +34,7 @@ class UserManager { void removeUser(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Removing user: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; @@ -57,7 +62,7 @@ class UserManager { var platformUserPremiumStatus = await platform.getUserPremiumStatus(chatId, chatUser.id); if (chatUser.isPremium != platformUserPremiumStatus) { - print('Updating premium status for ${chatUser.id}'); + _logger.i('Updating premium status for ${chatUser.id}'); await user.updatePremiumStatus(chatUser.id, platformUserPremiumStatus); } diff --git a/lib/src/modules/weather_manager.dart b/lib/src/modules/weather_manager.dart index dec1759..b94e7ae 100644 --- a/lib/src/modules/weather_manager.dart +++ b/lib/src/modules/weather_manager.dart @@ -2,7 +2,9 @@ import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/weather.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class WeatherManager { @@ -10,19 +12,22 @@ class WeatherManager { final Chat chat; final Database db; final String openweatherKey; + final Logger _logger; final Weather _weather; WeatherManager({required this.platform, required this.chat, required this.db, required this.openweatherKey}) - : _weather = Weather(db: db, openweatherKey: openweatherKey); + : _logger = getIt(), + _weather = Weather(db: db, openweatherKey: openweatherKey); void initialize() { _weather.initialize(); - _subscribeToWeatherUpdates(); + _subscribeToWeatherNotifications(); } void addCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Adding a new city: $event'); var chatId = event.chatId; var cityToAdd = event.parameters[0]; @@ -34,6 +39,7 @@ class WeatherManager { void removeCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Removing city: $event'); var chatId = event.chatId; var cityToRemove = event.parameters[0]; @@ -44,6 +50,8 @@ class WeatherManager { } void getWeatherWatchlist(MessageEvent event) async { + _logger.i('Getting a weather watchlist: $event'); + var chatId = event.chatId; var cities = await _weather.getWatchList(chatId); var citiesString = cities.join('\n'); @@ -53,6 +61,7 @@ class WeatherManager { void getWeatherForCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Getting weather for city: $event'); var chatId = event.chatId; var city = event.parameters[0]; @@ -65,6 +74,7 @@ class WeatherManager { void setWeatherNotificationHour(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; + _logger.i('Setting weather notification hour: $event'); var chatId = event.chatId; var hour = event.parameters[0]; @@ -75,6 +85,8 @@ class WeatherManager { } void createWeather(MessageEvent event) async { + _logger.i('Creating weather data: $event'); + var chatId = event.chatId; var result = await _weather.createWeatherData(chatId); var successfulMessage = chat.getText(chatId, 'general.success'); @@ -83,6 +95,8 @@ class WeatherManager { } void getWatchlistWeather(MessageEvent event) async { + _logger.i('Getting watchlist weather: $event'); + var chatId = event.chatId; var watchlistCities = await _weather.getWatchList(chatId); var weatherData = await _weather.getWeatherForCities(watchlistCities); @@ -95,8 +109,10 @@ class WeatherManager { return weatherData.map((data) => 'In city: ${data.city} the temperature is ${data.temp}\n\n').join(); } - void _subscribeToWeatherUpdates() { + void _subscribeToWeatherNotifications() { _weather.weatherStream.listen((weatherData) async { + _logger.i('Handling weather notification data: $weatherData'); + var chatData = await chat.getSingleChat(chatId: weatherData.chatId); if (chatData?.platform != platform.chatPlatform) { diff --git a/lib/src/modules/youtube_manager.dart b/lib/src/modules/youtube_manager.dart index 615edc4..e468179 100644 --- a/lib/src/modules/youtube_manager.dart +++ b/lib/src/modules/youtube_manager.dart @@ -17,7 +17,6 @@ class YoutubeManager { void searchSong(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Searching for a song: $event'); var chatId = event.chatId; From 55d5a8108e8a557efcb5dc52621f76c2eb208917 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 9 Mar 2024 17:04:45 +0200 Subject: [PATCH 11/17] Fixed wrong logger imports --- lib/src/modules/general_manager.dart | 2 +- lib/src/modules/panorama_manager.dart | 2 +- lib/src/modules/reputation_manager.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/modules/general_manager.dart b/lib/src/modules/general_manager.dart index 4c5e0c6..fee360f 100644 --- a/lib/src/modules/general_manager.dart +++ b/lib/src/modules/general_manager.dart @@ -1,10 +1,10 @@ -import 'package:logger/logger.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/general.dart'; import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; +import 'package:weather/src/utils/logger.dart'; class GeneralManager { final Platform platform; diff --git a/lib/src/modules/panorama_manager.dart b/lib/src/modules/panorama_manager.dart index 0809b47..1dcd836 100644 --- a/lib/src/modules/panorama_manager.dart +++ b/lib/src/modules/panorama_manager.dart @@ -1,4 +1,3 @@ -import 'package:logger/logger.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/panorama.dart'; @@ -7,6 +6,7 @@ import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; +import 'package:weather/src/utils/logger.dart'; class PanoramaManager { final Platform platform; diff --git a/lib/src/modules/reputation_manager.dart b/lib/src/modules/reputation_manager.dart index 418484a..11f4e84 100644 --- a/lib/src/modules/reputation_manager.dart +++ b/lib/src/modules/reputation_manager.dart @@ -1,4 +1,3 @@ -import 'package:logger/logger.dart'; import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/event_bus.dart'; import 'package:weather/src/core/chat.dart'; @@ -6,6 +5,7 @@ import 'package:weather/src/core/reputation.dart'; import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ReputationManager { From 52e347752096cedafb466a9145a9a2469899cc8e Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sat, 9 Mar 2024 19:07:43 +0200 Subject: [PATCH 12/17] Added logs for modules exception, added PoC for weather module exception handling --- lib/src/core/weather.dart | 10 +--------- lib/src/modules/utils.dart | 6 +++++- lib/src/modules/weather_manager.dart | 11 +++++++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/src/core/weather.dart b/lib/src/core/weather.dart index ce9f8df..8a76076 100644 --- a/lib/src/core/weather.dart +++ b/lib/src/core/weather.dart @@ -83,15 +83,7 @@ class Weather { } Future getWeatherForCity(String city) async { - try { - var weatherData = await _getCurrentWeather(city); - - return weatherData.temp; - } catch (err) { - print(err); - - return null; - } + return _getCurrentWeather(city).then((weatherData) => weatherData.temp); } Future setNotificationHour(String chatId, int notificationHour) async { diff --git a/lib/src/modules/utils.dart b/lib/src/modules/utils.dart index 05d5c34..5868e12 100644 --- a/lib/src/modules/utils.dart +++ b/lib/src/modules/utils.dart @@ -1,6 +1,8 @@ import 'package:collection/collection.dart'; import 'package:weather/src/globals/message_event.dart'; +import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; +import 'package:weather/src/utils/logger.dart'; bool messageEventParametersCheck(Platform platform, MessageEvent event, [int numberOfParameters = 1]) { if (event.parameters.whereNot((parameter) => parameter.isEmpty).length < numberOfParameters) { @@ -31,6 +33,8 @@ void sendOperationMessage(String chatId, {required Platform platform, required b } void handleException(error, String chatId, Platform platform) { - var errorMessage = error is CustomException ? error.toString() : 'general.something_went_wrong'; + getIt().e('Handling module exception: $error'); + + var errorMessage = CustomException != dynamic && error is CustomException ? error.toString() : 'general.something_went_wrong'; platform.sendMessage(chatId, translation: errorMessage); } diff --git a/lib/src/modules/weather_manager.dart b/lib/src/modules/weather_manager.dart index b94e7ae..fcf7c10 100644 --- a/lib/src/modules/weather_manager.dart +++ b/lib/src/modules/weather_manager.dart @@ -65,11 +65,14 @@ class WeatherManager { var chatId = event.chatId; var city = event.parameters[0]; - var temperature = await _weather.getWeatherForCity(city); - var result = temperature != null; - var successfulMessage = chat.getText(chatId, 'weather.cities.temperature', {'city': city, 'temperature': temperature.toString()}); - sendOperationMessage(chatId, platform: platform, operationResult: result, successfulMessage: successfulMessage); + _weather + .getWeatherForCity(city) + .then((result) => sendOperationMessage(chatId, + platform: platform, + operationResult: true, + successfulMessage: chat.getText(chatId, 'weather.cities.temperature', {'city': city, 'temperature': result.toString()}))) + .catchError((error) => handleException(error, chatId, platform)); } void setWeatherNotificationHour(MessageEvent event) async { From 2d981a853a97e4887e6560be26777e96562e420c Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sun, 10 Mar 2024 14:25:33 +0200 Subject: [PATCH 13/17] Added a couple of TODOs, converted logger to singleton --- bin/main.dart | 2 ++ lib/src/utils/logger.dart | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/main.dart b/bin/main.dart index 08bd0d4..b5418b3 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -7,6 +7,7 @@ import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/utils/migrations_manager.dart'; import 'package:weather/src/utils/logger.dart'; +// TODO: move to database.dart Future getDatabaseConnection(DotEnv env) async { final username = env['dbuser']!; final password = env['dbpassword']!; @@ -36,6 +37,7 @@ bool getIsProductionMode(String? envIsProduction) { void main(List args) async { var env = DotEnv(includePlatformEnvironment: true)..load(); final dbConnection = await getDatabaseConnection(env); + // TODO: move to core config module final token = env['bottoken']!; final adminId = env['adminid']!; final repoUrl = env['githubrepo']!; diff --git a/lib/src/utils/logger.dart b/lib/src/utils/logger.dart index f539734..d7a04f2 100644 --- a/lib/src/utils/logger.dart +++ b/lib/src/utils/logger.dart @@ -7,14 +7,19 @@ final logFile = File('logs.txt'); class Logger { final bool isProduction; late final lg.Logger _logger; + static Logger? _instance; - Logger({required this.isProduction}) { + Logger._internal(this.isProduction) { var printer = isProduction ? lg.SimplePrinter(printTime: true, colors: false) : lg.PrettyPrinter(printTime: true); var output = isProduction ? lg.MultiOutput([lg.FileOutput(file: logFile), lg.ConsoleOutput()]) : lg.ConsoleOutput(); _logger = lg.Logger(printer: printer, output: output); + _logger.i('Logger initialized in ${isProduction ? 'prod' : 'dev'} mode'); + } - i('Logger initialized in ${isProduction ? 'prod' : 'dev'} mode'); + factory Logger({required bool isProduction}) { + _instance ??= Logger._internal(isProduction); + return _instance!; } void i(message) { From 9dcb6390b6b6775eaea0d94609cd427fc796dab2 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sun, 10 Mar 2024 14:34:49 +0200 Subject: [PATCH 14/17] Extracted API URLs to const --- lib/src/core/dadjokes.dart | 4 +++- lib/src/core/general.dart | 4 +++- lib/src/core/weather.dart | 4 +++- lib/src/core/youtube.dart | 7 +++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/src/core/dadjokes.dart b/lib/src/core/dadjokes.dart index 892a6eb..40f6fcd 100644 --- a/lib/src/core/dadjokes.dart +++ b/lib/src/core/dadjokes.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +const _dadjokesApiBase = 'https://icanhazdadjoke.com/'; + class DadJokesJoke { final String joke; @@ -10,7 +12,7 @@ class DadJokesJoke { } class DadJokes { - final String _apiBaseUrl = 'https://icanhazdadjoke.com/'; + final String _apiBaseUrl = _dadjokesApiBase; Future getJoke() async { var response = await http.get(Uri.parse(_apiBaseUrl), headers: {'Accept': 'application/json'}); diff --git a/lib/src/core/general.dart b/lib/src/core/general.dart index b2a31a2..95f3653 100644 --- a/lib/src/core/general.dart +++ b/lib/src/core/general.dart @@ -2,10 +2,12 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'chat.dart'; +const _githubApiBase = 'https://api.github.com'; + class General { final Chat chat; final String repositoryUrl; - final String _baseGithubApiUrl = 'https://api.github.com'; + final String _baseGithubApiUrl = _githubApiBase; General({required this.chat, required this.repositoryUrl}); diff --git a/lib/src/core/weather.dart b/lib/src/core/weather.dart index 8a76076..9a8ac9d 100644 --- a/lib/src/core/weather.dart +++ b/lib/src/core/weather.dart @@ -4,6 +4,8 @@ import 'package:http/http.dart' as http; import 'package:cron/cron.dart'; import 'database.dart'; +const _weatherApiBase = 'https://api.openweathermap.org/data/2.5'; + class OpenWeatherData { final String city; final num temp; @@ -28,7 +30,7 @@ class ChatNotificationHour { class Weather { final Database db; final String openweatherKey; - final String _apiBaseUrl = 'https://api.openweathermap.org/data/2.5'; + final String _apiBaseUrl = _weatherApiBase; late StreamController _weatherStreamController; List _weatherCronTasks = []; diff --git a/lib/src/core/youtube.dart b/lib/src/core/youtube.dart index 1932aa9..b308fb2 100644 --- a/lib/src/core/youtube.dart +++ b/lib/src/core/youtube.dart @@ -1,9 +1,12 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +const _youtubeApiBase = 'https://www.googleapis.com/youtube/v3/search'; +const _youtubeVideoUrlBase = 'https://www.youtube.com/watch'; + class Youtube { final String apiKey; - final String apiBaseUrl = 'https://www.googleapis.com/youtube/v3/search'; + final String apiBaseUrl = _youtubeApiBase; Youtube(this.apiKey); @@ -16,7 +19,7 @@ class Youtube { var videoId = response['items'][0]['id']['videoId']; - return 'https://www.youtube.com/watch?v=$videoId'; + return '$_youtubeVideoUrlBase?v=$videoId'; } Future getRawYoutubeSearchResults(String query) async { From 7838f347dff49143bb2508b984587d731d1cada3 Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sun, 10 Mar 2024 15:14:09 +0200 Subject: [PATCH 15/17] Update watchlist weather handling to support error logs --- lib/src/core/weather.dart | 19 +++++-------------- lib/src/modules/weather_manager.dart | 10 ++++++---- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/src/core/weather.dart b/lib/src/core/weather.dart index 9a8ac9d..c16075c 100644 --- a/lib/src/core/weather.dart +++ b/lib/src/core/weather.dart @@ -101,21 +101,12 @@ class Weather { } Future> getWeatherForCities(List cities) async { - List result = []; + return Future.wait(cities.map((city) async { + var weather = await _getCurrentWeather(city); + await Future.delayed(Duration(milliseconds: 500)); - await Future.forEach(cities, (city) async { - try { - var weather = await _getCurrentWeather(city); - - result.add(OpenWeatherData(weather.city, weather.temp)); - - await Future.delayed(Duration(milliseconds: 500)); - } catch (err) { - print("Can't get weather for city $city"); - } - }); - - return result; + return OpenWeatherData(weather.city, weather.temp); + })); } Future _getCurrentWeather(String city) async { diff --git a/lib/src/modules/weather_manager.dart b/lib/src/modules/weather_manager.dart index fcf7c10..32cf9dd 100644 --- a/lib/src/modules/weather_manager.dart +++ b/lib/src/modules/weather_manager.dart @@ -101,11 +101,13 @@ class WeatherManager { _logger.i('Getting watchlist weather: $event'); var chatId = event.chatId; - var watchlistCities = await _weather.getWatchList(chatId); - var weatherData = await _weather.getWeatherForCities(watchlistCities); - var weatherMessage = _buildWatchlistWeatherMessage(weatherData); - sendOperationMessage(chatId, platform: platform, operationResult: weatherMessage.isNotEmpty, successfulMessage: weatherMessage); + _weather + .getWatchList(chatId) + .then((watchlistCities) => _weather.getWeatherForCities(watchlistCities)) + .then((weatherData) => sendOperationMessage(chatId, + platform: platform, operationResult: true, successfulMessage: _buildWatchlistWeatherMessage(weatherData))) + .catchError((error) => handleException(error, chatId, platform)); } String _buildWatchlistWeatherMessage(List weatherData) { From 8b02dcdd3588035bb17e2ca2aae5dd38331fea2d Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sun, 10 Mar 2024 15:51:14 +0200 Subject: [PATCH 16/17] Added logger to access module instead of separate modules, updated command access logic --- lib/src/core/access.dart | 35 +++++++------------ lib/src/modules/accordion_poll_manager.dart | 8 +---- lib/src/modules/chat_manager.dart | 11 +----- lib/src/modules/check_reminder_manager.dart | 2 -- .../modules/command_statistics_manager.dart | 2 -- lib/src/modules/conversator_manager.dart | 7 +--- lib/src/modules/dadjokes_manager.dart | 9 +---- lib/src/modules/general_manager.dart | 10 +----- lib/src/modules/panorama_manager.dart | 2 -- lib/src/modules/reputation_manager.dart | 11 +----- lib/src/modules/user_manager.dart | 2 -- lib/src/modules/weather_manager.dart | 10 ------ lib/src/modules/youtube_manager.dart | 8 +---- 13 files changed, 20 insertions(+), 97 deletions(-) diff --git a/lib/src/core/access.dart b/lib/src/core/access.dart index 8b37889..16b1230 100644 --- a/lib/src/core/access.dart +++ b/lib/src/core/access.dart @@ -1,8 +1,10 @@ import 'package:weather/src/globals/message_event.dart'; import 'package:weather/src/globals/access_level.dart'; -import 'event_bus.dart'; +import 'package:weather/src/injector/injection.dart'; +import 'package:weather/src/utils/logger.dart'; import 'events/access_events.dart'; import 'database.dart'; +import 'event_bus.dart'; typedef OnSuccessCallback = void Function(MessageEvent event); typedef OnFailureCallback = Future Function(MessageEvent event); @@ -11,8 +13,9 @@ class Access { final Database db; final EventBus eventBus; final String adminId; + final Logger _logger; - Access({required this.db, required this.eventBus, required this.adminId}); + Access({required this.db, required this.eventBus, required this.adminId}) : _logger = getIt(); void execute( {required MessageEvent event, @@ -23,31 +26,19 @@ class Access { var user = await db.user.getSingleUserForChat(event.chatId, event.userId); if (user == null || user.banned) { - onFailure(event); - - return; - } - - if (user.id == adminId) { - eventBus.fire(AccessEvent(chatId: event.chatId, user: user, command: command)); - onSuccess(event); - - return; + return onFailure(event); } - if (accessLevel == AccessLevel.admin) { - onFailure(event); + var canExecuteAsAdmin = user.id == adminId; + var canExecuteAsModerator = accessLevel == AccessLevel.moderator && user.moderator; - return; - } - - if (accessLevel == AccessLevel.moderator && !user.moderator) { - onFailure(event); + if (canExecuteAsAdmin || canExecuteAsModerator) { + _logger.i('Executing /$command with event: $event'); + eventBus.fire(AccessEvent(chatId: event.chatId, user: user, command: command)); - return; + return onSuccess(event); } - eventBus.fire(AccessEvent(chatId: event.chatId, user: user, command: command)); - onSuccess(event); + return onFailure(event); } } diff --git a/lib/src/modules/accordion_poll_manager.dart b/lib/src/modules/accordion_poll_manager.dart index 1e618ff..ce60d42 100644 --- a/lib/src/modules/accordion_poll_manager.dart +++ b/lib/src/modules/accordion_poll_manager.dart @@ -4,9 +4,7 @@ import 'package:weather/src/core/user.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class AccordionPollManager { @@ -14,12 +12,10 @@ class AccordionPollManager { final EventBus eventBus; final User user; final Chat chat; - final Logger _logger; final AccordionPoll _accordionPoll; AccordionPollManager({required this.platform, required this.eventBus, required this.user, required this.chat}) - : _logger = getIt(), - _accordionPoll = AccordionPoll(eventBus: eventBus, chat: chat); + : _accordionPoll = AccordionPoll(eventBus: eventBus, chat: chat); void startAccordionPoll(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; @@ -30,8 +26,6 @@ class AccordionPollManager { return; } - _logger.i('Starting accordion poll: $event'); - var chatId = event.chatId; var fromUser = await user.getSingleUserForChat(chatId, event.userId); var toUser = await user.getSingleUserForChat(chatId, event.otherUserIds[0]); diff --git a/lib/src/modules/chat_manager.dart b/lib/src/modules/chat_manager.dart index 71edfea..00c1163 100644 --- a/lib/src/modules/chat_manager.dart +++ b/lib/src/modules/chat_manager.dart @@ -1,22 +1,17 @@ import 'package:weather/src/core/chat.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ChatManager { final Platform platform; final Chat chat; - final Logger _logger; - ChatManager({required this.platform, required this.chat}) : _logger = getIt(); + ChatManager({required this.platform, required this.chat}); void createChat(MessageEvent event) async { - _logger.i('Creating chat: $event'); - var chatId = event.chatId; var chatName = _getNewChatName(event); var result = await chat.createChat(id: chatId, name: chatName, platform: event.platform); @@ -28,8 +23,6 @@ class ChatManager { void writeToChat(MessageEvent event) { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Writing to chat: $event'); - var chatId = event.chatId; var message = event.parameters.join(' '); @@ -39,8 +32,6 @@ class ChatManager { void setSwearwordsConfig(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Setting swearwords config: $event'); - var chatId = event.chatId; var config = event.parameters[0]; var result = await chat.setSwearwordsConfig(chatId, config); diff --git a/lib/src/modules/check_reminder_manager.dart b/lib/src/modules/check_reminder_manager.dart index 80d58f3..346ff84 100644 --- a/lib/src/modules/check_reminder_manager.dart +++ b/lib/src/modules/check_reminder_manager.dart @@ -28,8 +28,6 @@ class CheckReminderManager { void checkMessage(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Creating message check: $event'); - var chatId = event.chatId; var userId = event.userId; var period = event.parameters[0]; diff --git a/lib/src/modules/command_statistics_manager.dart b/lib/src/modules/command_statistics_manager.dart index 16ee301..f850e3e 100644 --- a/lib/src/modules/command_statistics_manager.dart +++ b/lib/src/modules/command_statistics_manager.dart @@ -26,7 +26,6 @@ class CommandStatisticsManager { } void getChatCommandInvocations(MessageEvent event) async { - _logger.i('Receiving chat command invocations: $event'); var chatId = event.chatId; var commandInvocationData = await _commandStatistics.getChatCommandInvocations(chatId: chatId); var invocationsMessage = _buildCommandInvocationsMessage(commandInvocationData); @@ -38,7 +37,6 @@ class CommandStatisticsManager { void getUserCommandInvocations(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; - _logger.i('Receiving user command invocations: $event'); var userId = event.otherUserIds[0]; var chatId = event.chatId; diff --git a/lib/src/modules/conversator_manager.dart b/lib/src/modules/conversator_manager.dart index 208ebc0..8b8e327 100644 --- a/lib/src/modules/conversator_manager.dart +++ b/lib/src/modules/conversator_manager.dart @@ -2,9 +2,7 @@ import 'package:weather/src/core/database.dart'; import 'package:weather/src/core/conversator.dart'; import 'package:weather/src/globals/chat_platform.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ConversatorManager { @@ -12,12 +10,10 @@ class ConversatorManager { final Database db; final String conversatorApiKey; final String adminId; - final Logger _logger; final Conversator _conversator; ConversatorManager({required this.platform, required this.db, required this.conversatorApiKey, required this.adminId}) - : _logger = getIt(), - _conversator = Conversator(db: db, conversatorApiKey: conversatorApiKey, adminId: adminId); + : _conversator = Conversator(db: db, conversatorApiKey: conversatorApiKey, adminId: adminId); void initialize() { _conversator.initialize(); @@ -33,7 +29,6 @@ class ConversatorManager { void _getConversatorReply(MessageEvent event, String model) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Getting conversator reply: $event'); var chatId = event.chatId; var userId = event.userId; diff --git a/lib/src/modules/dadjokes_manager.dart b/lib/src/modules/dadjokes_manager.dart index f638c3e..9152224 100644 --- a/lib/src/modules/dadjokes_manager.dart +++ b/lib/src/modules/dadjokes_manager.dart @@ -1,22 +1,15 @@ import 'package:weather/src/core/dadjokes.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/modules/utils.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; class DadJokesManager { final Platform platform; - final Logger _logger; final DadJokes _dadjokes; - DadJokesManager({required this.platform}) - : _logger = getIt(), - _dadjokes = DadJokes(); + DadJokesManager({required this.platform}) : _dadjokes = DadJokes(); void sendJoke(MessageEvent event) async { - _logger.i('Sending a joke: $event'); - var chatId = event.chatId; var joke = await _dadjokes.getJoke(); diff --git a/lib/src/modules/general_manager.dart b/lib/src/modules/general_manager.dart index fee360f..cd8d81b 100644 --- a/lib/src/modules/general_manager.dart +++ b/lib/src/modules/general_manager.dart @@ -1,25 +1,19 @@ import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/general.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; import 'package:weather/src/modules/utils.dart'; -import 'package:weather/src/utils/logger.dart'; class GeneralManager { final Platform platform; final Chat chat; final String repositoryUrl; - final Logger _logger; final General _general; GeneralManager({required this.platform, required this.chat, required this.repositoryUrl}) - : _logger = getIt(), - _general = General(chat: chat, repositoryUrl: repositoryUrl); + : _general = General(chat: chat, repositoryUrl: repositoryUrl); void postHealthCheck(MessageEvent event) { - _logger.i('Sending health check: $event'); - var chatId = event.chatId; var result = _general.healthCheck(chatId); @@ -27,8 +21,6 @@ class GeneralManager { } void postUpdateMessage(MessageEvent event) async { - _logger.i('Sending update message: $event'); - var chatId = event.chatId; var result = await _general.getLastCommitMessage(); diff --git a/lib/src/modules/panorama_manager.dart b/lib/src/modules/panorama_manager.dart index 1dcd836..aa8bf08 100644 --- a/lib/src/modules/panorama_manager.dart +++ b/lib/src/modules/panorama_manager.dart @@ -25,8 +25,6 @@ class PanoramaManager { } void sendNewsToChat(MessageEvent event) async { - _logger.i('Sending Panorama news: $event'); - var chatId = event.chatId; var news = await _panoramaNews.getNews(chatId); var successfulMessage = '${news?.title}\n\nFull: ${news?.url}'; diff --git a/lib/src/modules/reputation_manager.dart b/lib/src/modules/reputation_manager.dart index 11f4e84..d4b0bd1 100644 --- a/lib/src/modules/reputation_manager.dart +++ b/lib/src/modules/reputation_manager.dart @@ -3,9 +3,7 @@ import 'package:weather/src/core/event_bus.dart'; import 'package:weather/src/core/chat.dart'; import 'package:weather/src/core/reputation.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class ReputationManager { @@ -13,12 +11,10 @@ class ReputationManager { final Database db; final EventBus eventBus; final Chat chat; - final Logger _logger; final Reputation _reputation; ReputationManager({required this.platform, required this.db, required this.eventBus, required this.chat}) - : _logger = getIt(), - _reputation = Reputation(db: db, eventBus: eventBus); + : _reputation = Reputation(db: db, eventBus: eventBus); void initialize() { _reputation.initialize(); @@ -26,7 +22,6 @@ class ReputationManager { void increaseReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; - _logger.i('Increasing reputation: $event'); var chatId = event.chatId; var fromUserId = event.userId; @@ -41,7 +36,6 @@ class ReputationManager { void decreaseReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; - _logger.i('Decreasing reputation: $event'); var chatId = event.chatId; var fromUserId = event.userId; @@ -55,8 +49,6 @@ class ReputationManager { } void sendReputationList(MessageEvent event) async { - _logger.i('Sending reputation list: $event'); - var chatId = event.chatId; var reputationData = await _reputation.getReputationData(chatId); var reputationMessage = _buildReputationListMessage(chatId, reputationData); @@ -67,7 +59,6 @@ class ReputationManager { void createReputation(MessageEvent event) async { if (!userIdsCheck(platform, event)) return; - _logger.i('Creating reputation data: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; diff --git a/lib/src/modules/user_manager.dart b/lib/src/modules/user_manager.dart index 1da15e1..4241c76 100644 --- a/lib/src/modules/user_manager.dart +++ b/lib/src/modules/user_manager.dart @@ -20,7 +20,6 @@ class UserManager { void addUser(MessageEvent event) async { if (!messageEventParametersCheck(platform, event) || !userIdsCheck(platform, event)) return; - _logger.i('Adding a new user: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; @@ -34,7 +33,6 @@ class UserManager { void removeUser(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Removing user: $event'); var chatId = event.chatId; var userId = event.otherUserIds[0]; diff --git a/lib/src/modules/weather_manager.dart b/lib/src/modules/weather_manager.dart index 32cf9dd..bc05b1e 100644 --- a/lib/src/modules/weather_manager.dart +++ b/lib/src/modules/weather_manager.dart @@ -27,7 +27,6 @@ class WeatherManager { void addCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Adding a new city: $event'); var chatId = event.chatId; var cityToAdd = event.parameters[0]; @@ -39,7 +38,6 @@ class WeatherManager { void removeCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Removing city: $event'); var chatId = event.chatId; var cityToRemove = event.parameters[0]; @@ -50,8 +48,6 @@ class WeatherManager { } void getWeatherWatchlist(MessageEvent event) async { - _logger.i('Getting a weather watchlist: $event'); - var chatId = event.chatId; var cities = await _weather.getWatchList(chatId); var citiesString = cities.join('\n'); @@ -61,7 +57,6 @@ class WeatherManager { void getWeatherForCity(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Getting weather for city: $event'); var chatId = event.chatId; var city = event.parameters[0]; @@ -77,7 +72,6 @@ class WeatherManager { void setWeatherNotificationHour(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Setting weather notification hour: $event'); var chatId = event.chatId; var hour = event.parameters[0]; @@ -88,8 +82,6 @@ class WeatherManager { } void createWeather(MessageEvent event) async { - _logger.i('Creating weather data: $event'); - var chatId = event.chatId; var result = await _weather.createWeatherData(chatId); var successfulMessage = chat.getText(chatId, 'general.success'); @@ -98,8 +90,6 @@ class WeatherManager { } void getWatchlistWeather(MessageEvent event) async { - _logger.i('Getting watchlist weather: $event'); - var chatId = event.chatId; _weather diff --git a/lib/src/modules/youtube_manager.dart b/lib/src/modules/youtube_manager.dart index e468179..352716c 100644 --- a/lib/src/modules/youtube_manager.dart +++ b/lib/src/modules/youtube_manager.dart @@ -1,23 +1,17 @@ import 'package:weather/src/core/youtube.dart'; import 'package:weather/src/globals/message_event.dart'; -import 'package:weather/src/injector/injection.dart'; import 'package:weather/src/platform/platform.dart'; -import 'package:weather/src/utils/logger.dart'; import 'utils.dart'; class YoutubeManager { final Platform platform; final String apiKey; - final Logger _logger; final Youtube _youtube; - YoutubeManager({required this.platform, required this.apiKey}) - : _logger = getIt(), - _youtube = Youtube(apiKey); + YoutubeManager({required this.platform, required this.apiKey}) : _youtube = Youtube(apiKey); void searchSong(MessageEvent event) async { if (!messageEventParametersCheck(platform, event)) return; - _logger.i('Searching for a song: $event'); var chatId = event.chatId; var query = event.parameters.join(' '); From ac69c406152f2f3f32a4a94351dc27cba17379ba Mon Sep 17 00:00:00 2001 From: Dmitrii Baranov Date: Sun, 10 Mar 2024 16:17:30 +0200 Subject: [PATCH 17/17] Removed single data checks, added more logs --- lib/src/core/conversator.dart | 9 ++++++--- lib/src/core/repositories/repository.dart | 12 +++++++----- lib/src/core/repositories/reputation_repository.dart | 6 ------ lib/src/core/repositories/weather_repository.dart | 6 ------ lib/src/core/reputation.dart | 9 ++++++--- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/src/core/conversator.dart b/lib/src/core/conversator.dart index 6468070..06c6a9c 100644 --- a/lib/src/core/conversator.dart +++ b/lib/src/core/conversator.dart @@ -2,6 +2,8 @@ import 'dart:convert'; import 'package:cron/cron.dart'; import 'package:http/http.dart' as http; import 'package:weather/src/globals/module_exception.dart'; +import 'package:weather/src/injector/injection.dart'; +import 'package:weather/src/utils/logger.dart'; import 'database.dart'; const String _converstorApiURL = 'https://api.openai.com/v1/chat/completions'; @@ -39,11 +41,12 @@ class ConversatorUser { class Conversator { final Database db; + final Logger _logger; final String conversatorApiKey; final String adminId; final String _apiBaseUrl = _converstorApiURL; - Conversator({required this.db, required this.conversatorApiKey, required this.adminId}); + Conversator({required this.db, required this.conversatorApiKey, required this.adminId}) : _logger = getIt(); void initialize() { _startResetDailyInvocationsUsageJob(); @@ -130,9 +133,9 @@ class Conversator { var result = await db.conversatorUser.resetDailyInvocations(); if (result == 0) { - print('Something went wrong with resetting conversator daily invocations usage'); + _logger.w('Something went wrong with resetting conversator daily invocations usage'); } else { - print('Reset conversator daily invocation usage for $result rows'); + _logger.i('Reset conversator daily invocation usage for $result rows'); } }); } diff --git a/lib/src/core/repositories/repository.dart b/lib/src/core/repositories/repository.dart index c4bb3d3..ece8a42 100644 --- a/lib/src/core/repositories/repository.dart +++ b/lib/src/core/repositories/repository.dart @@ -1,18 +1,21 @@ import 'dart:io'; import 'package:meta/meta.dart'; import 'package:postgres/postgres.dart'; +import 'package:weather/src/injector/injection.dart'; +import 'package:weather/src/utils/logger.dart'; const String _pathToQueries = 'assets/db/queries'; class Repository { final String repositoryName; final Pool dbConnection; + final Logger _logger; final String _queriesDirectory = _pathToQueries; @protected final Map queriesMap = {}; - Repository({required this.repositoryName, required this.dbConnection}); + Repository({required this.repositoryName, required this.dbConnection}) : _logger = getIt(); initRepository() async { var queriesLocation = Directory('$_queriesDirectory/$repositoryName'); @@ -30,7 +33,7 @@ class Repository { @protected Future executeQuery(String? query, [Map? parameters]) async { if (query == null) { - print('Wrong query $query'); + _logger.e('Wrong query: $query'); return null; } @@ -41,7 +44,7 @@ class Repository { @protected Future executeTransaction(String? query, [Map? parameters]) async { if (query == null) { - print('Wrong query $query'); + _logger.e('Wrong query: $query'); return 0; } @@ -51,8 +54,7 @@ class Repository { return queryResult.affectedRows; }).catchError((error) { - print('DB transaction error'); - print(error); + _logger.e('DB transaction error: $error'); return 0; }); diff --git a/lib/src/core/repositories/reputation_repository.dart b/lib/src/core/repositories/reputation_repository.dart index be69833..245a757 100644 --- a/lib/src/core/repositories/reputation_repository.dart +++ b/lib/src/core/repositories/reputation_repository.dart @@ -24,12 +24,6 @@ class ReputationRepository extends Repository { return null; } - if (data.length != 1) { - print('One piece of reputation data data was expected, got ${data.length} instead'); - - return null; - } - var reputationData = data[0].toColumnMap(); return SingleReputationData( diff --git a/lib/src/core/repositories/weather_repository.dart b/lib/src/core/repositories/weather_repository.dart index e255458..944164e 100644 --- a/lib/src/core/repositories/weather_repository.dart +++ b/lib/src/core/repositories/weather_repository.dart @@ -38,12 +38,6 @@ class WeatherRepository extends Repository { return []; } - if (data.length != 1) { - print('One piece of cities data was expected, got ${data.length} instead'); - - return null; - } - var citiesData = data[0].toColumnMap(); return citiesData['cities']?.split(','); diff --git a/lib/src/core/reputation.dart b/lib/src/core/reputation.dart index 47f4781..adc7666 100644 --- a/lib/src/core/reputation.dart +++ b/lib/src/core/reputation.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:cron/cron.dart'; import 'package:weather/src/globals/module_exception.dart'; +import 'package:weather/src/injector/injection.dart'; +import 'package:weather/src/utils/logger.dart'; import 'events/accordion_poll_events.dart'; import 'database.dart'; import 'event_bus.dart'; @@ -32,8 +34,9 @@ class ChatReputationData { class Reputation { final Database db; final EventBus eventBus; + final Logger _logger; - Reputation({required this.db, required this.eventBus}); + Reputation({required this.db, required this.eventBus}) : _logger = getIt(); void initialize() { _startResetVotesJob(); @@ -137,9 +140,9 @@ class Reputation { var result = await db.reputation.resetChangeOptions(numberOfVoteOptions); if (result == 0) { - print('Something went wrong with resetting reputation change options'); + _logger.w('Something went wrong with resetting reputation change options'); } else { - print('Reset reputation change options for $result rows'); + _logger.i('Reset reputation change options for $result rows'); } }); }