Skip to content

Commit 53f8fe6

Browse files
authored
feature: Alternative pooping interface (#50)
* feature: Alternative pooping interface * Do not set default value
1 parent 993d4b0 commit 53f8fe6

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

lib/src/commands/admin.dart

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,35 @@ final admin = ChatGroup(
7171
ChatCommand(
7272
"perform-nickname-pooping",
7373
"Perform pooping of usernames in current guild",
74-
id('perform-nickname-pooping', (ChatContext context, [bool dryRun = true, int batchSize = 100]) async {
74+
id('perform-nickname-pooping', (ChatContext context, [int batchSize = 100]) async {
7575
final poopModule = Injector.appInstance.get<PoopNameModule>();
7676

77-
var nickNamesToRemove = <String>[];
77+
final membersToPoop = <Member>[];
7878
for (final disallowedChar in poopCharacters) {
7979
await for (final member in searchMembers(disallowedChar, batchSize, context.guild!)) {
80-
final (performed, nick) = await poopModule.poopMember(member, dryRun: dryRun);
81-
if (performed && (nick ?? '').isNotEmpty) {
82-
nickNamesToRemove.add(nick!);
80+
final shouldBePooped = await poopModule.poopMember(member, dryRun: true);
81+
if (shouldBePooped) {
82+
membersToPoop.add(member);
8383
}
8484
}
8585
}
8686

87-
final outPutMessageHeader = "Pooping nicknames ${dryRun ? "[DRY RUN]" : ""}";
88-
final messageBuilder = await createMessageBuilder(nickNamesToRemove, outPutMessageHeader);
87+
final multiSelectResult = await context.getMultiSelection(
88+
membersToPoop,
89+
MessageBuilder(content: 'Performing members pooping...'),
90+
toSelectMenuOption: (value) =>
91+
SelectMenuOptionBuilder(label: poopModule.getMemberNameForPooping(value)!, value: value.id.toString()),
92+
);
93+
94+
for (final member in multiSelectResult) {
95+
poopModule.poopMember(member, dryRun: false);
96+
}
8997

90-
await context.respond(messageBuilder);
98+
await context.respond(
99+
MessageBuilder(
100+
content: 'Pooped members: `${multiSelectResult.map((value) => poopModule.getMemberNameForPooping(value))}`',
101+
),
102+
);
91103
}),
92104
checks: [GuildCheck.all(), PermissionsCheck(Permissions.manageNicknames)],
93105
),

lib/src/modules/poop_name.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,23 @@ class PoopNameModule implements RequiresInitialization {
5858
poopMember(member, dryRun: false);
5959
}
6060

61-
Future<(bool, String?)> poopMember(Member member, {bool dryRun = true}) async {
62-
final memberName = member.nick ?? member.user?.globalName;
61+
Future<bool> poopMember(Member member, {bool dryRun = true}) async {
62+
final memberName = getMemberNameForPooping(member);
6363
if (memberName == null || !_shouldPoopName(memberName)) {
64-
return (false, null);
64+
return false;
6565
}
6666

6767
if (!dryRun) {
6868
_updateMemberWithPoopEmoji(member);
6969
}
7070

71-
return (true, memberName);
71+
return true;
7272
}
7373

7474
bool _shouldPoopName(String name) => name.startsWith(poopRegexp) || weirdCharsRegexp.hasMatch(name);
7575

76+
String? getMemberNameForPooping(Member member) => member.nick ?? member.user?.globalName ?? member.user?.username;
77+
7678
Future<void> _updateMemberWithPoopEmoji(Member member) =>
7779
member.update(MemberUpdateBuilder(nick: poopEmoji), auditLogReason: 'ROD PoopNameModule moderation');
7880

0 commit comments

Comments
 (0)