Skip to content

Commit bf7c644

Browse files
author
mani1232
committed
Fix loading order and add customs api
1 parent 9588ccd commit bf7c644

File tree

4 files changed

+112
-64
lines changed

4 files changed

+112
-64
lines changed

mcb-api/src/main/kotlin/api/configuration/ConfigDefaults.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
11
package api.configuration
22

3+
import api.configuration.configType.Custom
34
import com.charleskorn.kaml.PolymorphismStyle
45
import com.charleskorn.kaml.Yaml
56
import com.charleskorn.kaml.YamlConfiguration
7+
import kotlinx.serialization.KSerializer
68
import kotlinx.serialization.modules.SerializersModule
9+
import kotlinx.serialization.modules.polymorphic
10+
import kotlinx.serialization.serializer
11+
import kotlin.reflect.KClass
12+
import kotlin.reflect.KType
713

814
class ConfigDefaults {
915
companion object {
16+
17+
private val customsTypesList: MutableList<KType> = mutableListOf()
18+
19+
fun registerCustoms(list: List<KType>) {
20+
customsTypesList.addAll(list)
21+
customsModule = SerializersModule {
22+
polymorphic(Custom::class) {
23+
customsTypesList.forEach {
24+
subclass(it.classifier as KClass<Custom>, serializer(it) as KSerializer<Custom>)
25+
}
26+
}
27+
}
28+
}
29+
30+
fun getCustoms(): MutableList<KType> {
31+
return customsTypesList
32+
}
33+
34+
fun getCustomsModule(): SerializersModule {
35+
return customsModule
36+
}
37+
38+
private var customsModule = SerializersModule {
39+
polymorphic(Custom::class) {
40+
customsTypesList.forEach {
41+
subclass(it.classifier as KClass<Custom>, serializer(it) as KSerializer<Custom>)
42+
}
43+
}
44+
}
45+
1046
fun getConfiguredYaml(module: SerializersModule): Yaml {
1147
return Yaml(
1248
serializersModule = module, configuration = YamlConfiguration(

mcb-core/src/main/kotlin/Main.kt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import kotlinx.coroutines.coroutineScope
66
import kotlinx.coroutines.runBlocking
77
import org.slf4j.Logger
88
import org.slf4j.LoggerFactory
9-
import kotlin.concurrent.thread
109

1110
const val mainFolder = "CustomBot"
1211

@@ -17,26 +16,34 @@ private val logger: Logger = LoggerFactory.getLogger("Main")
1716

1817
fun main(args: Array<String>) = runBlocking {
1918
try {
20-
logger.info("Loading configs")
21-
configVault.loadAll()
19+
logger.info("Starting ModernCustomBot...")
2220
startCustomBot()
23-
logger.info("Loading addons")
24-
addonManager.initAddons()
25-
addonManager.enableAddons()
2621
logger.info("Done!")
2722
} catch (e: Exception) {
2823
logger.error(e.message, e)
2924
}
3025
}
3126

3227
suspend fun startCustomBot() = coroutineScope {
28+
logger.info("Loading addons")
29+
addonManager.initAddons()
30+
addonManager.enableAddons()
31+
logger.info("Loading configs")
32+
configVault.loadAll()
3333
logger.info("Sorting configs")
3434
DCustomAPI.clear()
3535
DCustomAPI.sort(configVault.customDiscordConfig.dirConfigFiles)
3636
logger.info("Starting bots")
3737
configVault.mainConfig.data.await()?.bots?.forEach {
38-
thread {
39-
(it as BotImpl<*>).init()
40-
}
38+
(it as BotImpl<*>).init()
4139
}
40+
Runtime.getRuntime().addShutdownHook(object : Thread() {
41+
override fun run(): Unit = runBlocking {
42+
logger.info("Shutdown bot manager")
43+
addonManager.disableAddons()
44+
configVault.mainConfig.data.await()?.bots?.forEach {
45+
(it as BotImpl<*>).shutdown()
46+
}
47+
}
48+
})
4249
}

mcb-core/src/main/kotlin/configuration/ConfigUtils.kt

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
package configuration
22

3+
import addonManager
4+
import api.configuration.ConfigDefaults
35
import api.configuration.ConfigFile
46
import api.configuration.ConfigsDirectory
5-
import api.configuration.configType.Custom
67
import api.discord.DiscordInteractionEnum
78
import api.discord.dataConfigs.CustomDiscordConfig
8-
import configuration.dataConfigs.*
9+
import configuration.dataConfigs.BotConfig
10+
import configuration.dataConfigs.DiscordBot
11+
import configuration.dataConfigs.TelegramBot
912
import configuration.dataConfigs.discord.*
1013
import kotlinx.coroutines.coroutineScope
11-
import kotlinx.serialization.KSerializer
1214
import kotlinx.serialization.modules.SerializersModule
13-
import kotlinx.serialization.modules.polymorphic
14-
import kotlinx.serialization.serializer
1515
import net.dv8tion.jda.api.entities.channel.ChannelType
1616
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle
1717
import java.io.File
18-
import kotlin.reflect.KClass
19-
import kotlin.reflect.KType
2018
import kotlin.reflect.typeOf
2119

2220
const val MainConfigName = "CustomConfig.yml"
@@ -25,63 +23,53 @@ class ConfigVault(path: String) {
2523

2624
init {
2725
File(path).mkdirs()
28-
}
29-
30-
31-
private val customsTypesList: MutableList<KType> = mutableListOf(
32-
typeOf<SendText>(),
33-
typeOf<BotFilter>(),
34-
typeOf<MessageFilter>(),
35-
typeOf<GuildFilter>(),
36-
typeOf<RegisterCommand>(),
37-
typeOf<DeleteCommand>(),
38-
typeOf<InteractionFilter>(),
39-
)
40-
41-
fun registerCustoms(list: List<KType>) {
42-
customsTypesList.addAll(list)
43-
}
44-
45-
private var customsModule = SerializersModule {
46-
polymorphic(Custom::class) {
47-
customsTypesList.forEach {
48-
subclass(it.classifier as KClass<Custom>, serializer(it) as KSerializer<Custom>)
49-
}
50-
}
26+
ConfigDefaults.registerCustoms(
27+
listOf(
28+
typeOf<SendText>(),
29+
typeOf<BotFilter>(),
30+
typeOf<MessageFilter>(),
31+
typeOf<GuildFilter>(),
32+
typeOf<RegisterCommand>(),
33+
typeOf<DeleteCommand>(),
34+
typeOf<InteractionFilter>(),
35+
)
36+
)
5137
}
5238

5339
val mainConfig: ConfigFile<BotConfig> = ConfigFile.create(File(path, MainConfigName), SerializersModule { })
5440
val customDiscordConfig: ConfigsDirectory<CustomDiscordConfig> =
55-
ConfigsDirectory.create(File(path, "custom/"), customsModule)
41+
ConfigsDirectory.create(File(path, "custom/"), ConfigDefaults.getCustomsModule())
5642

5743
suspend fun loadAll() {
5844
mainConfig.loadDefaultFile(BotConfig(mutableListOf(DiscordBot("ENTER_IT_HERE"), TelegramBot("TODO"))))
5945
customDiscordConfig.loadDefaultFiles(
6046
mutableMapOf(
6147
"PingPongExample.yml" to CustomDiscordConfig(
62-
DiscordInteractionEnum.ON_MESSAGE_RECEIVE,
63-
mutableMapOf(
48+
DiscordInteractionEnum.ON_MESSAGE_RECEIVE, mutableMapOf(
6449
"pingPong" to mutableListOf(
6550
MessageFilter(
6651
onlyChannel = mutableListOf(ChannelType.PRIVATE),
6752
whitelist = true,
6853
messageRegexPatterns = mutableListOf("ping")
69-
),
70-
SendText(text = "pong", reply = true, actionRows = mutableListOf(mutableListOf(ButtonConfig(ButtonStyle.DANGER, "new", emoji = "😃")), mutableListOf(ButtonConfig(ButtonStyle.SECONDARY, "new_other", label = "text"))))
54+
), SendText(
55+
text = "pong", reply = true, actionRows = mutableListOf(
56+
mutableListOf(
57+
ButtonConfig(
58+
ButtonStyle.DANGER, "new", emoji = "😃"
59+
)
60+
), mutableListOf(ButtonConfig(ButtonStyle.SECONDARY, "new_other", label = "text"))
61+
)
62+
)
7163
)
7264
)
73-
),
74-
"RegisterCommands.yml" to CustomDiscordConfig(
65+
), "RegisterCommands.yml" to CustomDiscordConfig(
7566
DiscordInteractionEnum.ON_READY,
7667
mutableMapOf("helpCommand" to mutableListOf(RegisterCommand("help", "send help info")))
77-
),
78-
"ProcessCommands.yml" to CustomDiscordConfig(
79-
DiscordInteractionEnum.ON_COMMAND,
80-
mutableMapOf(
68+
), "ProcessCommands.yml" to CustomDiscordConfig(
69+
DiscordInteractionEnum.ON_COMMAND, mutableMapOf(
8170
"helpCommandCheck" to mutableListOf(
8271
InteractionFilter(
83-
mutableListOf("help"),
84-
whitelist = true
72+
mutableListOf("help"), whitelist = true
8573
), SendText(text = "This is example help", ephemeral = true)
8674
)
8775
)
@@ -93,6 +81,7 @@ class ConfigVault(path: String) {
9381
suspend fun reloadAll() {
9482
mainConfig.loadFile()
9583
customDiscordConfig.loadFolderFiles()
84+
addonManager.reloadAddons()
9685
}
9786

9887
suspend fun updateAllFiles() = coroutineScope {

mcb-core/src/main/kotlin/configuration/dataConfigs/BotConfig.kt

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package configuration.dataConfigs
22

33
import jda.DiscordListeners
4+
import kotlinx.coroutines.Deferred
5+
import kotlinx.coroutines.async
6+
import kotlinx.coroutines.coroutineScope
47
import kotlinx.serialization.SerialName
58
import kotlinx.serialization.Serializable
69
import kotlinx.serialization.Transient
@@ -27,37 +30,50 @@ data class DiscordBot(
2730
val intents: MutableList<GatewayIntent> = mutableListOf(GatewayIntent.GUILD_MESSAGES, GatewayIntent.DIRECT_MESSAGES)
2831
) : Bot(), BotImpl<JDA> {
2932
@Transient
30-
private var bot: JDA? = null
31-
override fun init() {
33+
private lateinit var bot: Deferred<JDA>
34+
override suspend fun init() = coroutineScope {
3235
try {
33-
bot = JDABuilder.createLight(token).enableIntents(intents).build()
34-
bot!!.addEventListener(DiscordListeners())
35-
LoggerFactory.getLogger(bot!!.selfUser.id).info("Bot `${bot!!.selfUser.name}` started!")
36+
bot = async { JDABuilder.createLight(token).enableIntents(intents).build() }
37+
bot.await().addEventListener(DiscordListeners())
38+
LoggerFactory.getLogger(bot.await().selfUser.id).info("Bot `${bot.await().selfUser.name}` started!")
39+
bot
3640
} catch (e: InvalidTokenException) {
3741
LoggerFactory.getLogger("DiscordBot-Builder").error("Error with token: $token, message: ${e.message}")
3842
}
3943
}
4044

41-
override fun get(): JDA? {
45+
override suspend fun get(): Deferred<JDA> {
4246
return bot
4347
}
4448

49+
override suspend fun shutdown() {
50+
bot.await().awaitShutdown()
51+
}
52+
4553
}
4654

4755
@SerialName("telegram")
4856
@Serializable
4957
data class TelegramBot(val token: String) : Bot(), BotImpl<Any> {
50-
override fun init() {
51-
return
58+
override suspend fun init() = coroutineScope {
59+
60+
}
61+
62+
override suspend fun get(): Deferred<Any> = coroutineScope {
63+
async {
64+
""
65+
}
5266
}
5367

54-
override fun get(): Any {
55-
return ""
68+
override suspend fun shutdown() {
69+
5670
}
5771

5872
}
5973

6074
interface BotImpl<T> {
61-
fun init()
62-
fun get(): T?
75+
suspend fun init(): Any
76+
suspend fun get(): Deferred<T>
77+
78+
suspend fun shutdown()
6379
}

0 commit comments

Comments
 (0)