Skip to content

Commit

Permalink
Rework FeatureSettingsService; Implement feature setting streams
Browse files Browse the repository at this point in the history
  • Loading branch information
l7ssha committed Nov 14, 2024
1 parent 2c07469 commit a6c45eb
Show file tree
Hide file tree
Showing 10 changed files with 44 additions and 17 deletions.
4 changes: 2 additions & 2 deletions lib/src/checks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:nyxx/nyxx.dart';
import 'package:nyxx_commands/nyxx_commands.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/settings.dart';

const jellyfinFeatureEnabledCheckName = 'jellyfinFeatureEnabledCheck';
Expand All @@ -18,7 +18,7 @@ FutureOr<bool> _checkForSetting(Setting setting, CommandContext context) {
return true;
}

return Injector.appInstance.get<FeatureSettingsService>().isEnabled(Setting.jellyfin, context.guild!.id);
return Injector.appInstance.get<FeatureSettingsModule>().isEnabled(Setting.jellyfin, context.guild!.id);
}

final kavitaJellyfinCheck = Check(
Expand Down
6 changes: 3 additions & 3 deletions lib/src/commands/feature_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:nyxx_commands/nyxx_commands.dart';
import 'package:nyxx_extensions/nyxx_extensions.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';

final featureSettings = ChatGroup(
'settings',
Expand Down Expand Up @@ -38,7 +38,7 @@ final featureSettings = ChatGroup(
data: data,
);

await Injector.appInstance.get<FeatureSettingsService>().enable(featureSetting);
await Injector.appInstance.get<FeatureSettingsModule>().enable(featureSetting);

await context.respond(MessageBuilder(content: 'Successfully enabled setting!'));
}),
Expand All @@ -54,7 +54,7 @@ final featureSettings = ChatGroup(
await Injector.appInstance.get<FeatureSettingsRepository>().fetchSetting(setting, context.guild!.id);

if (featureSetting != null) {
Injector.appInstance.get<FeatureSettingsService>().disable(featureSetting);
Injector.appInstance.get<FeatureSettingsModule>().disable(featureSetting);
}

await context.respond(MessageBuilder(content: 'Successfully disabled setting!'));
Expand Down
5 changes: 3 additions & 2 deletions lib/src/init.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import 'package:running_on_dart/src/repository/kavita.dart';
import 'package:running_on_dart/src/repository/reminder.dart';
import 'package:running_on_dart/src/repository/tag.dart';
import 'package:running_on_dart/src/services/db.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';

Future<void> setupContainer(NyxxGateway client) async {
Injector.appInstance
Expand All @@ -28,7 +28,7 @@ Future<void> setupContainer(NyxxGateway client) async {
..registerSingleton(() => ReminderRepository())
..registerSingleton(() => TagRepository())
..registerSingleton(() => KavitaRepository())
..registerSingleton(() => FeatureSettingsService())
..registerSingleton(() => FeatureSettingsModule())
..registerSingleton(() => BotStartDuration())
..registerSingleton(() => PoopNameModule())
..registerSingleton(() => JoinLogsModule())
Expand All @@ -42,6 +42,7 @@ Future<void> setupContainer(NyxxGateway client) async {
..registerSingleton(() => EmojiReactModule());

await Injector.appInstance.get<DatabaseService>().init();
await Injector.appInstance.get<FeatureSettingsModule>().init();
await Injector.appInstance.get<JellyfinModuleV2>().init();
await Injector.appInstance.get<DocsModule>().init();
await Injector.appInstance.get<TagModule>().init();
Expand Down
2 changes: 1 addition & 1 deletion lib/src/models/feature_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ enum Setting {
kavita('kavita', 'Allows usage of jellyfin command', true,
DataType.json), // {"create_instance_role":"419506523467939853"}
emojiReact('emoji_react', 'React to predefined words with emojis', true,
DataType.string); //{"use_builtin": true|false, "mode": "react|message", "process_other_bots": true}
DataType.string); //{"use_builtin": true|false, "mode": "react|message", "process_other_bots": false}

/// name of setting
final String name;
Expand Down
9 changes: 9 additions & 0 deletions lib/src/modules/emoji_react_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:injector/injector.dart';
import 'package:nyxx/nyxx.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/settings.dart';
import 'package:running_on_dart/src/util/util.dart';

Expand Down Expand Up @@ -36,6 +37,7 @@ class EmojiFeatureSetting {
class EmojiReactModule implements RequiresInitialization {
final NyxxGateway _client = Injector.appInstance.get();
final FeatureSettingsRepository _featureSettingsRepository = Injector.appInstance.get();
final FeatureSettingsModule _featureSettingsService = Injector.appInstance.get();

late Set<ApplicationEmoji> _emojis;
late Map<Snowflake, EmojiFeatureSetting> _emojiFeatureSettingsCache;
Expand All @@ -53,6 +55,13 @@ class EmojiReactModule implements RequiresInitialization {
.toSet(); // TODO: Add ability to reload module (download new emojis in this case)

_client.onMessageCreate.listen(_handleMessage);

_featureSettingsService.onFeatureEnabled
.where((s) => s.setting == Setting.emojiReact)
.listen((s) => _emojiFeatureSettingsCache[s.guildId] = (EmojiFeatureSetting.fromJson(s.dataAsJson!)));
_featureSettingsService.onFeatureDisabled
.where((s) => s.setting == Setting.emojiReact)
.listen((s) => _emojiFeatureSettingsCache.remove(s.guildId));
}

Future<void> _handleMessage(MessageCreateEvent event) async {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
import 'dart:async';

import 'package:injector/injector.dart';
import 'package:nyxx/nyxx.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/util/util.dart';

class FeatureSettingsService {
class FeatureSettingsModule implements RequiresInitialization {
final _featureSettingsRepository = Injector.appInstance.get<FeatureSettingsRepository>();

final StreamController<FeatureSetting> _onFeatureEnabled = StreamController.broadcast();
final StreamController<FeatureSetting> _onFeatureDisabled = StreamController.broadcast();

late Stream<FeatureSetting> onFeatureEnabled;
late Stream<FeatureSetting> onFeatureDisabled;

@override
Future<void> init() async {
onFeatureDisabled = _onFeatureDisabled.stream;
onFeatureEnabled = _onFeatureEnabled.stream;
}

Future<(bool, FeatureSetting?)> fetchSetting(Setting setting, Snowflake guildId) async {
final result = await _featureSettingsRepository.fetchSetting(setting, guildId);

Expand All @@ -22,10 +37,12 @@ class FeatureSettingsService {
/// Enable a setting in a guild.
Future<void> enable(FeatureSetting setting) async {
await _featureSettingsRepository.enableSetting(setting);
_onFeatureEnabled.add(setting);
}

/// Disable a setting in a guild.
Future<void> disable(FeatureSetting setting) async {
await _featureSettingsRepository.disableSetting(setting);
_onFeatureDisabled.add(setting);
}
}
4 changes: 2 additions & 2 deletions lib/src/modules/join_logs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import 'package:nyxx/nyxx.dart';
import 'package:nyxx_extensions/nyxx_extensions.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/settings.dart';
import 'package:running_on_dart/src/util/util.dart';

class JoinLogsModule implements RequiresInitialization {
final NyxxGateway _client = Injector.appInstance.get();
final FeatureSettingsRepository _featureSettingsRepository = Injector.appInstance.get();
final FeatureSettingsService _featureSettingsService = Injector.appInstance.get();
final FeatureSettingsModule _featureSettingsService = Injector.appInstance.get();

final Logger _logger = Logger('ROD.JoinLogs');

Expand Down
4 changes: 2 additions & 2 deletions lib/src/modules/mentions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:async';
import 'package:injector/injector.dart';
import 'package:nyxx/nyxx.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/util/util.dart';

extension MapExtensions<K, V> on Map<K, V> {
Expand All @@ -25,7 +25,7 @@ final _mentionRegex = RegExp(r'<@!?\d+>');

class MentionsMonitoringModule implements RequiresInitialization {
final NyxxGateway _client = Injector.appInstance.get();
final FeatureSettingsService _featureSettings = Injector.appInstance.get();
final FeatureSettingsModule _featureSettings = Injector.appInstance.get();

final _logger = Logger('ROD.MentionsMonitoringModule');

Expand Down
4 changes: 2 additions & 2 deletions lib/src/modules/mod_log.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import 'package:nyxx_extensions/nyxx_extensions.dart';
import 'package:running_on_dart/running_on_dart.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/repository/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/util/util.dart';

class ModLogsModule implements RequiresInitialization {
final NyxxGateway _client = Injector.appInstance.get();
final FeatureSettingsRepository _featureSettingsRepository = Injector.appInstance.get();
final FeatureSettingsService _featureSettingsService = Injector.appInstance.get();
final FeatureSettingsModule _featureSettingsService = Injector.appInstance.get();
final Logger _logger = Logger('ROD.ModLogs');

final handledEventTypes = [
Expand Down
4 changes: 2 additions & 2 deletions lib/src/modules/poop_name.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:injector/injector.dart';
import 'package:nyxx/nyxx.dart';
import 'package:running_on_dart/src/models/feature_settings.dart';
import 'package:running_on_dart/src/services/feature_settings.dart';
import 'package:running_on_dart/src/modules/feature_settings.dart';
import 'package:running_on_dart/src/settings.dart';
import 'package:running_on_dart/src/util/util.dart';

Expand Down Expand Up @@ -50,6 +50,6 @@ class PoopNameModule implements RequiresInitialization {
return false;
}

return await Injector.appInstance.get<FeatureSettingsService>().isEnabled(Setting.poopName, guildId);
return await Injector.appInstance.get<FeatureSettingsModule>().isEnabled(Setting.poopName, guildId);
}
}

0 comments on commit a6c45eb

Please sign in to comment.