1
1
package io.github.freya022.botcommands.internal.parameters.resolvers
2
2
3
- import io.github.freya022.botcommands.api.commands.application.checkGuildOnly
4
- import io.github.freya022.botcommands.api.core.service.annotations.BService
5
- import io.github.freya022.botcommands.api.core.service.annotations.ResolverFactory
6
- import io.github.freya022.botcommands.api.parameters.resolverFactory
3
+ import io.github.freya022.botcommands.api.commands.application.slash.options.SlashCommandOption
4
+ import io.github.freya022.botcommands.api.commands.text.BaseCommandEvent
5
+ import io.github.freya022.botcommands.api.commands.text.options.TextCommandOption
6
+ import io.github.freya022.botcommands.api.components.options.ComponentOption
7
+ import io.github.freya022.botcommands.api.parameters.ClassParameterResolver
8
+ import io.github.freya022.botcommands.api.parameters.resolvers.ComponentParameterResolver
9
+ import io.github.freya022.botcommands.api.parameters.resolvers.SlashParameterResolver
10
+ import io.github.freya022.botcommands.api.parameters.resolvers.TextParameterResolver
11
+ import io.github.freya022.botcommands.internal.utils.throwInternal
7
12
import net.dv8tion.jda.api.entities.Role
13
+ import net.dv8tion.jda.api.events.interaction.component.GenericComponentInteractionCreateEvent
14
+ import net.dv8tion.jda.api.events.message.MessageReceivedEvent
15
+ import net.dv8tion.jda.api.interactions.commands.CommandInteractionPayload
16
+ import net.dv8tion.jda.api.interactions.commands.OptionMapping
17
+ import net.dv8tion.jda.api.interactions.commands.OptionType
18
+ import java.util.regex.Pattern
8
19
9
- @BService
10
- internal data object RoleResolverFactoryProvider {
11
- @ResolverFactory
12
- internal fun roleResolverFactory () = resolverFactory { request ->
13
- request.checkGuildOnly(Role ::class )
14
- RoleResolver ()
20
+ /* *
21
+ * @see RoleResolverFactoryProvider
22
+ */
23
+ class RoleResolver : ClassParameterResolver <RoleResolver , Role >(Role : :class),
24
+ TextParameterResolver <RoleResolver , Role >,
25
+ SlashParameterResolver <RoleResolver , Role >,
26
+ ComponentParameterResolver <RoleResolver , Role > {
27
+
28
+ override val pattern: Pattern = Pattern .compile(" <@&(\\ d+)>|(\\ d+)" )
29
+ override val testExample: String = " <@&1234>"
30
+ override fun getHelpExample (option : TextCommandOption , event : BaseCommandEvent ): String {
31
+ return event.member.roles.stream().findAny()
32
+ .or { event.guild.roleCache.streamUnordered().findAny() }
33
+ .map { obj: Role -> obj.asMention }
34
+ .orElse(" role-id/mention" )
35
+ }
36
+
37
+ override suspend fun resolveSuspend (
38
+ option : TextCommandOption ,
39
+ event : MessageReceivedEvent ,
40
+ args : Array <String ?>
41
+ ): Role ? {
42
+ val id = args[0 ] ? : args[1 ] ? : throwInternal(" How can it not have either" )
43
+ if (event.guild.id == id) return null // @everyone role
44
+
45
+ return event.guild.getRoleById(id)
46
+ }
47
+
48
+
49
+ override val optionType: OptionType get() = OptionType .ROLE
50
+
51
+ override suspend fun resolveSuspend (
52
+ option : SlashCommandOption ,
53
+ event : CommandInteractionPayload ,
54
+ optionMapping : OptionMapping
55
+ ): Role = optionMapping.asRole
56
+
57
+ override suspend fun resolveSuspend (
58
+ option : ComponentOption ,
59
+ event : GenericComponentInteractionCreateEvent ,
60
+ arg : String
61
+ ): Role ? {
62
+ val guild = event.guild
63
+ requireNotNull(guild) { " Can't get a role from DMs" }
64
+
65
+ return guild.getRoleById(arg)
15
66
}
16
- }
67
+ }
0 commit comments