diff --git a/src/main/kotlin/com/fardragi/nyaruko/App.kt b/src/main/kotlin/com/fardragi/nyaruko/App.kt index a5adbfc..1143750 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/App.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/App.kt @@ -7,6 +7,7 @@ import com.fardragi.nyaruko.config.DiscordConfig import com.fardragi.nyaruko.core.CoreModule import com.fardragi.nyaruko.database.DatabaseConnection import com.fardragi.nyaruko.permission.PermissionModule +import com.fardragi.nyaruko.services.CommandService import com.fardragi.nyaruko.services.SessionsService import com.fardragi.nyaruko.services.UserService import org.koin.core.module.dsl.createdAtStart @@ -25,15 +26,10 @@ val appModule = module { } single { CoreModule() } - scope { } - single { AuthModule() } - scope { - scoped { UserService() } - } - single { PermissionModule() } - scope { } + single { UserService() } single { SessionsService() } + single { CommandService() } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/NyarukoMod.kt b/src/main/kotlin/com/fardragi/nyaruko/NyarukoMod.kt index a23e83c..a76e58b 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/NyarukoMod.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/NyarukoMod.kt @@ -1,6 +1,6 @@ package com.fardragi.nyaruko -import com.fardragi.nyaruko.server.ServerProxy +import com.fardragi.nyaruko.shared.IProxy import cpw.mods.fml.common.Mod import cpw.mods.fml.common.SidedProxy import cpw.mods.fml.common.event.FMLInitializationEvent @@ -19,24 +19,28 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent ) object NyarukoMod { @SidedProxy(serverSide = "$GROUPNAME.server.ServerProxy", clientSide = "$GROUPNAME.client.ClientProxy") - lateinit var proxy: ServerProxy + lateinit var proxy: IProxy @Mod.EventHandler + @Suppress("UNUSED") fun onPreInit(event: FMLPreInitializationEvent) { proxy.onPreInit(event) } @Mod.EventHandler + @Suppress("UNUSED") fun onInit(event: FMLInitializationEvent) { proxy.onInit(event) } @Mod.EventHandler + @Suppress("UNUSED") fun onPostInit(event: FMLPostInitializationEvent) { proxy.onPostInit(event) } @Mod.EventHandler + @Suppress("UNUSED") fun onServerStarting(event: FMLServerStartingEvent) { proxy.onServerStarting(event) } diff --git a/src/main/kotlin/com/fardragi/nyaruko/auth/AuthModule.kt b/src/main/kotlin/com/fardragi/nyaruko/auth/AuthModule.kt index 0347569..bd7d61c 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/auth/AuthModule.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/auth/AuthModule.kt @@ -5,17 +5,13 @@ import com.fardragi.nyaruko.auth.commands.RegisterCommand import com.fardragi.nyaruko.auth.handlers.AuthHandler import com.fardragi.nyaruko.auth.handlers.CheckHandler import com.fardragi.nyaruko.shared.IModule -import org.koin.core.component.KoinScopeComponent -import org.koin.core.component.createScope -class AuthModule() : KoinScopeComponent, IModule { - override val scope by lazy { createScope(this) } +class AuthModule() : IModule { + override suspend fun start() { + AuthHandler().register() + CheckHandler().register() - override fun start() { - AuthHandler(scope.get(), scope.get(), scope.get()).register() - CheckHandler(scope.get()).register() - - RegisterCommand(scope.get()).register() - LoginCommand(scope.get(), scope.get()).register() + RegisterCommand().register() + LoginCommand().register() } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/auth/commands/LoginCommand.kt b/src/main/kotlin/com/fardragi/nyaruko/auth/commands/LoginCommand.kt index d49be13..caf0f53 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/auth/commands/LoginCommand.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/auth/commands/LoginCommand.kt @@ -10,11 +10,13 @@ import com.fardragi.nyaruko.shared.commands.NyarukoCommandBase import com.fardragi.nyaruko.shared.messages.DefaultMessage import net.minecraft.command.ICommandSender import net.minecraft.entity.player.EntityPlayerMP +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class LoginCommand() : NyarukoCommandBase(), KoinComponent { + private val userService: UserService by inject() + private val sessionsService: SessionsService by inject() -class LoginCommand( - private val userService: UserService, - private val sessionsService: SessionsService -) : NyarukoCommandBase() { override fun getCommandName(): String { return "login" } @@ -44,7 +46,7 @@ class LoginCommand( } override fun getRequiredPermissionLevel(): Int { - return PermissionLevel.True.level + return PermissionLevel.All.level } override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean { diff --git a/src/main/kotlin/com/fardragi/nyaruko/auth/commands/RegisterCommand.kt b/src/main/kotlin/com/fardragi/nyaruko/auth/commands/RegisterCommand.kt index 41a3465..36c9b7f 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/auth/commands/RegisterCommand.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/auth/commands/RegisterCommand.kt @@ -9,8 +9,12 @@ import com.fardragi.nyaruko.shared.commands.NyarukoCommandBase import com.fardragi.nyaruko.shared.messages.DefaultMessage import net.minecraft.command.ICommandSender import net.minecraft.entity.player.EntityPlayerMP +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class RegisterCommand() : NyarukoCommandBase(), KoinComponent { + private val userService: UserService by inject() -class RegisterCommand(private val userService: UserService) : NyarukoCommandBase() { override fun getCommandName(): String { return "register" } @@ -44,7 +48,7 @@ class RegisterCommand(private val userService: UserService) : NyarukoCommandBase } override fun getRequiredPermissionLevel(): Int { - return PermissionLevel.True.level + return PermissionLevel.All.level } override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean { diff --git a/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/AuthHandler.kt b/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/AuthHandler.kt index 9ab85c2..1894099 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/AuthHandler.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/AuthHandler.kt @@ -15,12 +15,14 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class AuthHandler() : NyarukoHandlerBase(), KoinComponent { + private val userService: UserService by inject() + private val discordConfig: DiscordConfig by inject() + private val sessionsService: SessionsService by inject() -class AuthHandler( - private val userService: UserService, - private val discordConfig: DiscordConfig, - private val sessionsService: SessionsService -) : NyarukoHandlerBase() { @SubscribeEvent(priority = EventPriority.LOWEST) fun onPlayerJoin(event: PlayerLoggedInEvent) { val player = event.player diff --git a/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/CheckHandler.kt b/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/CheckHandler.kt index a2d1272..1cbebc9 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/CheckHandler.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/auth/handlers/CheckHandler.kt @@ -9,8 +9,12 @@ import com.fardragi.nyaruko.shared.handlers.NyarukoHandlerBase import cpw.mods.fml.common.eventhandler.EventPriority import cpw.mods.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.event.entity.item.ItemTossEvent +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class CheckHandler() : NyarukoHandlerBase(), KoinComponent { + private val sessionsService: SessionsService by inject() -class CheckHandler(private val sessionsService: SessionsService) : NyarukoHandlerBase() { @SubscribeEvent(priority = EventPriority.HIGHEST) fun onPlayerMove(event: PlayerMoveEvent) { if (sessionsService.isAuthenticated(event.player.uniqueID) || !event.player.isTruePlayer()) diff --git a/src/main/kotlin/com/fardragi/nyaruko/client/ClientProxy.kt b/src/main/kotlin/com/fardragi/nyaruko/client/ClientProxy.kt index 718a22b..f3ce72a 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/client/ClientProxy.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/client/ClientProxy.kt @@ -1,6 +1,6 @@ package com.fardragi.nyaruko.client -import com.fardragi.nyaruko.server.ServerProxy +import com.fardragi.nyaruko.shared.IProxy -class ClientProxy : ServerProxy() { +class ClientProxy : IProxy { } diff --git a/src/main/kotlin/com/fardragi/nyaruko/config/DatabaseConfig.kt b/src/main/kotlin/com/fardragi/nyaruko/config/DatabaseConfig.kt index 64a5da8..df34be0 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/config/DatabaseConfig.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/config/DatabaseConfig.kt @@ -5,7 +5,7 @@ private const val CATEGORY = "database" class DatabaseConfig(config: Config) { val host: String = config.configuration.getString("host", CATEGORY, "localhost", "Database host") val port: Int = config.configuration.getInt("port", CATEGORY, 3306, 0, 65535, "Database port") - val name: String = config.configuration.getString("name", CATEGORY, "dragi_utils", "Database name") + val name: String = config.configuration.getString("name", CATEGORY, "nyaruko", "Database name") val password: String = config.configuration.getString("password", CATEGORY, "root", "Database password") val user: String = config.configuration.getString("user", CATEGORY, "root", "Database user") diff --git a/src/main/kotlin/com/fardragi/nyaruko/core/CoreModule.kt b/src/main/kotlin/com/fardragi/nyaruko/core/CoreModule.kt index 96a5d26..c4b2a54 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/core/CoreModule.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/core/CoreModule.kt @@ -8,7 +8,7 @@ import org.koin.core.component.createScope class CoreModule() : KoinScopeComponent, IModule { override val scope by lazy { createScope(this) } - override fun start() { + override suspend fun start() { PlayerTickHandler().register() } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/core/events/PlayerMoveEvent.kt b/src/main/kotlin/com/fardragi/nyaruko/core/events/PlayerMoveEvent.kt index dec77f1..90f2075 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/core/events/PlayerMoveEvent.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/core/events/PlayerMoveEvent.kt @@ -1,6 +1,6 @@ package com.fardragi.nyaruko.core.events -import com.fardragi.nyaruko.shared.NyarukoEvent +import com.fardragi.nyaruko.shared.events.NyarukoEvent import com.fardragi.nyaruko.viewmodels.PositionViewModel import cpw.mods.fml.common.eventhandler.Cancelable import net.minecraft.entity.player.EntityPlayerMP diff --git a/src/main/kotlin/com/fardragi/nyaruko/database/DatabaseConnection.kt b/src/main/kotlin/com/fardragi/nyaruko/database/DatabaseConnection.kt index 2236136..806c97b 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/database/DatabaseConnection.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/database/DatabaseConnection.kt @@ -1,7 +1,8 @@ package com.fardragi.nyaruko.database import com.fardragi.nyaruko.config.DatabaseConfig -import com.fardragi.nyaruko.database.tables.UsersTable +import com.fardragi.nyaruko.database.tables.Commands +import com.fardragi.nyaruko.database.tables.Users import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -19,7 +20,7 @@ class DatabaseConnection(config: DatabaseConfig) { CoroutineScope(Dispatchers.IO).launch { query { - SchemaUtils.createMissingTablesAndColumns(UsersTable) + SchemaUtils.createMissingTablesAndColumns(Users, Commands) } } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/database/tables/Commands.kt b/src/main/kotlin/com/fardragi/nyaruko/database/tables/Commands.kt new file mode 100644 index 0000000..aa62ce0 --- /dev/null +++ b/src/main/kotlin/com/fardragi/nyaruko/database/tables/Commands.kt @@ -0,0 +1,12 @@ +package com.fardragi.nyaruko.database.tables + +import com.fardragi.nyaruko.enums.PermissionLevel +import org.jetbrains.exposed.dao.id.IdTable + +object Commands : IdTable("commands") { + override val id = uinteger("id").entityId().autoIncrement() + val name = varchar("name", 255) + val level = enumerationByName("level", 6, PermissionLevel::class) + + override val primaryKey = PrimaryKey(id) +} diff --git a/src/main/kotlin/com/fardragi/nyaruko/database/tables/Users.kt b/src/main/kotlin/com/fardragi/nyaruko/database/tables/Users.kt index c1d0546..2aa1a4f 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/database/tables/Users.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/database/tables/Users.kt @@ -3,7 +3,7 @@ package com.fardragi.nyaruko.database.tables import org.jetbrains.exposed.dao.id.IdTable import java.util.UUID -object UsersTable : IdTable("users") { +object Users : IdTable("users") { override val id = uuid("id").entityId() val name = varchar("name", 50) val hash = varchar("hash", 128).nullable() diff --git a/src/main/kotlin/com/fardragi/nyaruko/enums/PermissionLevel.kt b/src/main/kotlin/com/fardragi/nyaruko/enums/PermissionLevel.kt index 96348a1..de3e340 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/enums/PermissionLevel.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/enums/PermissionLevel.kt @@ -1,7 +1,17 @@ package com.fardragi.nyaruko.enums enum class PermissionLevel(val level: Int) { - True(0), + All(0), Op(4), - False(5), + Nobody(5); + + companion object { + fun fromLevel(level: Int): PermissionLevel { + return when (level) { + 0 -> All + in 1..4 -> Op + else -> Nobody + } + } + } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/models/Command.kt b/src/main/kotlin/com/fardragi/nyaruko/models/Command.kt new file mode 100644 index 0000000..6d885c8 --- /dev/null +++ b/src/main/kotlin/com/fardragi/nyaruko/models/Command.kt @@ -0,0 +1,13 @@ +package com.fardragi.nyaruko.models + +import com.fardragi.nyaruko.database.tables.Commands +import org.jetbrains.exposed.dao.Entity +import org.jetbrains.exposed.dao.EntityClass +import org.jetbrains.exposed.dao.id.EntityID + +class Command(id: EntityID) : Entity(id) { + companion object : EntityClass(Commands) + + var name by Commands.name + var level by Commands.level +} diff --git a/src/main/kotlin/com/fardragi/nyaruko/models/User.kt b/src/main/kotlin/com/fardragi/nyaruko/models/User.kt index 644d68a..75b6f25 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/models/User.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/models/User.kt @@ -1,6 +1,6 @@ package com.fardragi.nyaruko.models -import com.fardragi.nyaruko.database.tables.UsersTable +import com.fardragi.nyaruko.database.tables.Users import org.jetbrains.exposed.dao.Entity import org.jetbrains.exposed.dao.EntityClass import org.jetbrains.exposed.dao.id.EntityID @@ -8,10 +8,10 @@ import org.springframework.security.crypto.argon2.Argon2PasswordEncoder import java.util.UUID class User(id: EntityID) : Entity(id) { - companion object : EntityClass(UsersTable) + companion object : EntityClass(Users) - var name by UsersTable.name - private var hash by UsersTable.hash + var name by Users.name + private var hash by Users.hash val isRegistered get() = hash != null diff --git a/src/main/kotlin/com/fardragi/nyaruko/permission/PermissionModule.kt b/src/main/kotlin/com/fardragi/nyaruko/permission/PermissionModule.kt index c25504d..7d51a83 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/permission/PermissionModule.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/permission/PermissionModule.kt @@ -1,13 +1,23 @@ package com.fardragi.nyaruko.permission +import com.fardragi.nyaruko.enums.PermissionLevel +import com.fardragi.nyaruko.services.CommandService import com.fardragi.nyaruko.shared.IModule -import org.koin.core.component.KoinScopeComponent -import org.koin.core.component.createScope +import net.minecraft.command.CommandBase +import net.minecraft.server.MinecraftServer +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject -class PermissionModule() : KoinScopeComponent, IModule { - override val scope by lazy { createScope(this) } +class PermissionModule() : IModule, KoinComponent { + private val commandService: CommandService by inject() - override fun start() { - TODO("Not yet implemented") + override suspend fun start() { + val commands = MinecraftServer.getServer().commandManager.commands.mapValues { (_, v) -> + return@mapValues if (v is CommandBase) + PermissionLevel.fromLevel(v.requiredPermissionLevel) + else PermissionLevel.Op + } + + commandService.registerCommands(commands as HashMap) } } diff --git a/src/main/kotlin/com/fardragi/nyaruko/server/ServerProxy.kt b/src/main/kotlin/com/fardragi/nyaruko/server/ServerProxy.kt index 0a9b7a7..e5f19f9 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/server/ServerProxy.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/server/ServerProxy.kt @@ -3,30 +3,32 @@ package com.fardragi.nyaruko.server import com.fardragi.nyaruko.appModule import com.fardragi.nyaruko.auth.AuthModule import com.fardragi.nyaruko.core.CoreModule +import com.fardragi.nyaruko.permission.PermissionModule +import com.fardragi.nyaruko.shared.IProxy import cpw.mods.fml.common.event.FMLInitializationEvent -import cpw.mods.fml.common.event.FMLPostInitializationEvent import cpw.mods.fml.common.event.FMLPreInitializationEvent -import cpw.mods.fml.common.event.FMLServerStartingEvent +import kotlinx.coroutines.runBlocking import org.koin.core.KoinApplication import org.koin.core.context.startKoin -open class ServerProxy { +class ServerProxy : IProxy { private lateinit var app: KoinApplication - fun onPreInit(event: FMLPreInitializationEvent) { + override fun onPreInit(event: FMLPreInitializationEvent) { app = startKoin { modules(appModule) } } - fun onInit(event: FMLInitializationEvent) { + override fun onInit(event: FMLInitializationEvent) { val coreModule = app.koin.get() val authModule = app.koin.get() + val permissionModule = app.koin.get() - coreModule.start() - authModule.start() + runBlocking { + coreModule.start() + authModule.start() + permissionModule.start() + } } - - fun onPostInit(event: FMLPostInitializationEvent) {} - fun onServerStarting(event: FMLServerStartingEvent) {} } diff --git a/src/main/kotlin/com/fardragi/nyaruko/services/CommandService.kt b/src/main/kotlin/com/fardragi/nyaruko/services/CommandService.kt new file mode 100644 index 0000000..1339643 --- /dev/null +++ b/src/main/kotlin/com/fardragi/nyaruko/services/CommandService.kt @@ -0,0 +1,28 @@ +package com.fardragi.nyaruko.services + +import com.fardragi.nyaruko.database.query +import com.fardragi.nyaruko.database.tables.Commands +import com.fardragi.nyaruko.enums.PermissionLevel +import com.fardragi.nyaruko.models.Command + +class CommandService { + suspend fun registerCommands(commands: HashMap) { + query { + commands.forEach { + val command = Command.find { Commands.name eq it.key }.firstOrNull() + + if (command == null) { + Command.new { + name = it.key + level = it.value + } + return@forEach + } + + command.apply { + level = it.value + } + } + } + } +} diff --git a/src/main/kotlin/com/fardragi/nyaruko/shared/IModule.kt b/src/main/kotlin/com/fardragi/nyaruko/shared/IModule.kt index 96fbcd0..37f25d6 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/shared/IModule.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/shared/IModule.kt @@ -1,5 +1,5 @@ package com.fardragi.nyaruko.shared fun interface IModule { - fun start() + suspend fun start() } diff --git a/src/main/kotlin/com/fardragi/nyaruko/shared/IProxy.kt b/src/main/kotlin/com/fardragi/nyaruko/shared/IProxy.kt new file mode 100644 index 0000000..c56a0cf --- /dev/null +++ b/src/main/kotlin/com/fardragi/nyaruko/shared/IProxy.kt @@ -0,0 +1,21 @@ +package com.fardragi.nyaruko.shared + +import cpw.mods.fml.common.event.FMLInitializationEvent +import cpw.mods.fml.common.event.FMLPostInitializationEvent +import cpw.mods.fml.common.event.FMLPreInitializationEvent +import cpw.mods.fml.common.event.FMLServerStartingEvent + +interface IProxy { + fun onPreInit(event: FMLPreInitializationEvent){ + return + } + fun onInit(event: FMLInitializationEvent){ + return + } + fun onPostInit(event: FMLPostInitializationEvent){ + return + } + fun onServerStarting(event: FMLServerStartingEvent){ + return + } +} diff --git a/src/main/kotlin/com/fardragi/nyaruko/shared/NyarukoEvent.kt b/src/main/kotlin/com/fardragi/nyaruko/shared/events/NyarukoEvent.kt similarity index 82% rename from src/main/kotlin/com/fardragi/nyaruko/shared/NyarukoEvent.kt rename to src/main/kotlin/com/fardragi/nyaruko/shared/events/NyarukoEvent.kt index ee1f601..af5e148 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/shared/NyarukoEvent.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/shared/events/NyarukoEvent.kt @@ -1,4 +1,4 @@ -package com.fardragi.nyaruko.shared +package com.fardragi.nyaruko.shared.events import cpw.mods.fml.common.eventhandler.Event import net.minecraftforge.common.MinecraftForge diff --git a/src/main/kotlin/com/fardragi/nyaruko/utils/Minecraft.kt b/src/main/kotlin/com/fardragi/nyaruko/utils/Minecraft.kt index 3b59441..555d268 100644 --- a/src/main/kotlin/com/fardragi/nyaruko/utils/Minecraft.kt +++ b/src/main/kotlin/com/fardragi/nyaruko/utils/Minecraft.kt @@ -10,6 +10,6 @@ object Minecraft { if (FMLCommonHandler.instance().side.isClient) Minecraft.getMinecraft().mcDataDir else File(".") - return File(baseDir, "/DragiUtils") + return File(baseDir, "/Nyaruko") } }