aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/com/romangraef/jdacommander/start.kt
blob: 465d79cd4900c4d3790fa56fc4c40678470203ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.romangraef.jdacommander

import com.beust.jcommander.JCommander
import net.dv8tion.jda.api.JDABuilder
import net.dv8tion.jda.api.events.message.MessageReceivedEvent
import net.dv8tion.jda.api.hooks.ListenerAdapter
import org.reflections.Reflections

fun loadCommands(packageName: String): Map<String, Class<out ICommand>> {
	val reflections = Reflections(packageName)
	return reflections.getTypesAnnotatedWith(Command::class.java)
		.map {
			println(it)
			it
		}
		.filter { ICommand::class.java.isAssignableFrom(it) }
		.map {
			it.getAnnotation(Command::class.java).value to (it as Class<out ICommand>)
		}.toMap()
}

fun main() {
	val allCommands = loadCommands("com.romangraef.jdacommander.commands")
	JDABuilder.createDefault(System.getenv("DISCORD_TOKEN"))
		.addEventListeners(object : ListenerAdapter() {
			override fun onMessageReceived(event: MessageReceivedEvent) {
				val text = event.message.contentRaw
				if (!text.startsWith("!")) return
				val jCommander = JCommander()
				val bi = BaseInformation()
				allCommands.forEach { (name, `class`) ->
					jCommander.addCommand(name, `class`.newInstance())
				}
				jCommander.addObject(bi)
				jCommander.parse(*text.substring(1).split("\\s+".toRegex()).toTypedArray())
				val parsedCommand = jCommander.parsedCommand
				jCommander.findCommandByAlias(parsedCommand).objects.filterIsInstance<ICommand>().forEach {
					it.base = bi
					it.message = event.message
					it.run()
				}
			}
		})
		.build()
}