Add some test commands. Finalize permissions. Add maintainer level.
This commit is contained in:
parent
d22c8e57bb
commit
bd95ae33dd
|
@ -30,11 +30,11 @@ repositories {
|
|||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
||||
implementation 'org.jetbrains.kotlin:kotlin-reflect'
|
||||
testCompile group: 'junit', name: 'junit', version: '4.12'
|
||||
|
||||
testImplementation "org.junit.jupiter:junit-jupiter:5.4.2"
|
||||
|
||||
implementation 'net.dv8tion:JDA:4.ALPHA.0_88'
|
||||
|
||||
// runtimeOnly "ch.qos.logback:logback-classic:1.2.1"
|
||||
implementation "com.h2database:h2"
|
||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package nl.voidcorp.discord
|
||||
|
||||
import net.dv8tion.jda.api.JDABuilder
|
||||
import nl.voidcorp.discord.command.Command
|
||||
import nl.voidcorp.discord.command.CommandMessage
|
||||
import nl.voidcorp.discord.command.CommandResult
|
||||
import nl.voidcorp.discord.events.CommandListener
|
||||
import nl.voidcorp.discord.events.OttoListener
|
||||
import org.springframework.stereotype.Component
|
||||
|
|
|
@ -2,7 +2,12 @@ package nl.voidcorp.discord.command
|
|||
|
||||
import net.dv8tion.jda.api.Permission
|
||||
import net.dv8tion.jda.api.entities.ChannelType
|
||||
import net.dv8tion.jda.api.entities.Member
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent
|
||||
import nl.voidcorp.discord.creator
|
||||
import nl.voidcorp.discord.storage.GuildRepo
|
||||
import nl.voidcorp.discord.storage.GuildStore
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import java.util.*
|
||||
|
||||
|
||||
|
@ -10,11 +15,12 @@ abstract class Command(
|
|||
val name: String,
|
||||
val helpMesage: String = "",
|
||||
val usage: String = "",
|
||||
val commandGroup: CommandLevel = CommandGroup.VERIFIED,
|
||||
val commandLevel: CommandLevel = CommandGroup.VERIFIED,
|
||||
val aliases: List<String> = emptyList(),
|
||||
val location: CommandSource = CommandSource.BOTH,
|
||||
val permissions: Set<Permission> = emptySet()
|
||||
val location: CommandSource = CommandSource.BOTH
|
||||
) {
|
||||
@Autowired
|
||||
lateinit var repo: GuildRepo
|
||||
|
||||
fun onCommand(event: MessageReceivedEvent, prefix: String): CommandResult {
|
||||
val starts =
|
||||
|
@ -34,7 +40,7 @@ abstract class Command(
|
|||
event.message.contentRaw.drop(prefix.length).trim()
|
||||
) else CommandResult.NOPE
|
||||
CommandSource.BOTH ->
|
||||
if (event.channelType == ChannelType.PRIVATE) guildStuff(
|
||||
if (event.channelType == ChannelType.TEXT) guildStuff(
|
||||
event,
|
||||
event.message.contentRaw.drop(prefix.length).trim()
|
||||
)
|
||||
|
@ -43,7 +49,7 @@ abstract class Command(
|
|||
}
|
||||
|
||||
private fun guildStuff(event: MessageReceivedEvent, str: String) =
|
||||
if ((permissions.intersect(event.member?.permissions as Iterable<Permission>).isNotEmpty() or permissions.isEmpty())) try {
|
||||
if (isPermOK(commandLevel, getLevel(event.member!!))) try {
|
||||
handle(CommandMessage(event, translateCommandline(str)))
|
||||
} catch (e: Exception) {
|
||||
CommandResult.ERROR
|
||||
|
@ -57,11 +63,36 @@ abstract class Command(
|
|||
|
||||
abstract fun handle(event: CommandMessage): CommandResult
|
||||
|
||||
fun getLevel(member: Member): CommandLevel {
|
||||
val guildStore = repo.findByGuildId(member.guild.idLong) ?: GuildStore(-1)
|
||||
|
||||
return when {
|
||||
member.user.idLong == creator.idLong -> CommandGroup.MAINTAINER
|
||||
member.hasPermission(Permission.ADMINISTRATOR)
|
||||
or guildStore.adminRoles.intersect(member.roles.map { it.idLong }).isNotEmpty()
|
||||
-> CommandGroup.ADMIN
|
||||
guildStore.moderatorRoles.intersect(member.roles.map { it.idLong }).isNotEmpty()
|
||||
-> CommandGroup.MODERATOR
|
||||
member.roles.isNotEmpty() or guildStore.defaultVerified -> CommandGroup.VERIFIED
|
||||
else -> CommandGroup.UNVERIFIED
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
var settings = CommandSettings()
|
||||
|
||||
|
||||
fun isPermOK(required: CommandLevel, user: CommandLevel): Boolean {
|
||||
var test: CommandLevel? = required
|
||||
while (test != null) {
|
||||
if (test == user) {
|
||||
return true
|
||||
}
|
||||
test = test.parent
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* [code borrowed from ant.jar]
|
||||
* Crack a command line.
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package nl.voidcorp.discord.command
|
||||
|
||||
object CommandGroup {
|
||||
val ADMIN = CommandLevel("Administrator")
|
||||
val MAINTAINER = CommandLevel("Maintainer")
|
||||
val ADMIN = CommandLevel("Administrator", MAINTAINER)
|
||||
val MODERATOR = CommandLevel("Moderator", ADMIN)
|
||||
val VERIFIED = CommandLevel("Verified", MODERATOR)
|
||||
val UNVERIFIED = CommandLevel("Unverified", VERIFIED)
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
package nl.voidcorp.discord.command
|
||||
|
||||
data class CommandLevel(val levelNAme: String, val parent: CommandLevel? = null)
|
||||
data class CommandLevel(val levelName: String, val parent: CommandLevel? = null)
|
19
src/main/kotlin/nl/voidcorp/discord/commands/DebugCommand.kt
Normal file
19
src/main/kotlin/nl/voidcorp/discord/commands/DebugCommand.kt
Normal file
|
@ -0,0 +1,19 @@
|
|||
package nl.voidcorp.discord.commands
|
||||
|
||||
import nl.voidcorp.discord.command.Command
|
||||
import nl.voidcorp.discord.command.CommandGroup
|
||||
import nl.voidcorp.discord.command.CommandMessage
|
||||
import nl.voidcorp.discord.command.CommandResult
|
||||
import org.springframework.context.annotation.Lazy
|
||||
import org.springframework.stereotype.Service
|
||||
|
||||
@Service
|
||||
class DebugCommand(@Lazy private val list: List<Command>) : Command("debug", commandLevel = CommandGroup.MAINTAINER) {
|
||||
override fun handle(event: CommandMessage): CommandResult {
|
||||
event.reply("DebugInfo")
|
||||
event.reply("Commands found: ${list.size}")
|
||||
event.reply(list.joinToString(prefix = "`debug`, ") { "`${it.name}`" })
|
||||
event.reply("EndDebugInfo")
|
||||
return CommandResult.SUCCESS
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package nl.voidcorp.discord.commands
|
||||
|
||||
import nl.voidcorp.discord.command.Command
|
||||
import nl.voidcorp.discord.command.CommandMessage
|
||||
import nl.voidcorp.discord.command.CommandResult
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
@Component
|
||||
class PermissionLevelCommand : Command("permissions") {
|
||||
override fun handle(event: CommandMessage): CommandResult {
|
||||
event.reply("Your highest permission level is `${getLevel(event.member!!).levelName}`")
|
||||
return CommandResult.SUCCESS
|
||||
}
|
||||
}
|
|
@ -57,13 +57,13 @@ class CommandListener(
|
|||
CommandResult.SUCCESS -> Unit
|
||||
CommandResult.ERROR -> CommandMessage(
|
||||
event,
|
||||
listOf()
|
||||
emptyList()
|
||||
).reply(MessageBuilder("There was an error executing this command").build())
|
||||
CommandResult.PERMISSIONS -> CommandMessage(event, listOf()).reply(
|
||||
CommandResult.PERMISSIONS -> CommandMessage(event, emptyList()).reply(
|
||||
MessageBuilder("Sorry, but you don't seem to have the needed permissions to execute this command...").build()
|
||||
)
|
||||
CommandResult.NOPE -> logger.warn("The command ${command.name} somehow responded with a nope?")
|
||||
CommandResult.PARAMETERS -> CommandMessage(event, listOf()).reply(
|
||||
CommandResult.PARAMETERS -> CommandMessage(event, emptyList()).reply(
|
||||
MessageBuilder("Sorry, but you are missing some parameters: `${command.usage}`").build()
|
||||
)
|
||||
}
|
||||
|
|
9
src/main/kotlin/nl/voidcorp/discord/storage/GuildRepo.kt
Normal file
9
src/main/kotlin/nl/voidcorp/discord/storage/GuildRepo.kt
Normal file
|
@ -0,0 +1,9 @@
|
|||
package nl.voidcorp.discord.storage
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
|
||||
|
||||
interface GuildRepo : JpaRepository<GuildStore, Long> {
|
||||
fun findByGuildId(id: Long): GuildStore?
|
||||
fun existsByGuildId(id: Long): Boolean
|
||||
}
|
|
@ -1,12 +1,18 @@
|
|||
package nl.voidcorp.discord.storage
|
||||
|
||||
import javax.annotation.Generated
|
||||
import javax.persistence.ElementCollection
|
||||
import javax.persistence.Entity
|
||||
import javax.persistence.Id
|
||||
|
||||
|
||||
@Entity
|
||||
data class GuildStore(
|
||||
var guildId: Long,
|
||||
@ElementCollection var moderatorRoles: MutableList<Long> = mutableListOf(),
|
||||
@ElementCollection var adminRoles: MutableList<Long> = mutableListOf(),
|
||||
var defaultVerified: Boolean = false,
|
||||
@Id
|
||||
@Generated
|
||||
var id: Long? = null)
|
||||
var id: Long? = null
|
||||
)
|
|
@ -1,8 +0,0 @@
|
|||
package nl.voidcorp.discord.storage
|
||||
|
||||
import org.springframework.data.repository.Repository
|
||||
|
||||
|
||||
interface GuildRepo : Repository<GuildStore, Long> {
|
||||
fun findById(id: Long): GuildStore
|
||||
}
|
14
src/test/kotlin/nl/voidcorp/discord/CommandTest.kt
Normal file
14
src/test/kotlin/nl/voidcorp/discord/CommandTest.kt
Normal file
|
@ -0,0 +1,14 @@
|
|||
package nl.voidcorp.discord
|
||||
|
||||
import nl.voidcorp.discord.command.Command
|
||||
import nl.voidcorp.discord.command.CommandGroup
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class CommandTest {
|
||||
|
||||
@Test
|
||||
fun `Test permission slide Verified into Admin`() {
|
||||
Assertions.assertTrue(Command.isPermOK(CommandGroup.VERIFIED, CommandGroup.ADMIN))
|
||||
}
|
||||
}
|
4
src/test/kotlin/nl/voidcorp/discord/MainTest.kt
Normal file
4
src/test/kotlin/nl/voidcorp/discord/MainTest.kt
Normal file
|
@ -0,0 +1,4 @@
|
|||
package nl.voidcorp.discord
|
||||
|
||||
class MainTest {
|
||||
}
|
Loading…
Reference in a new issue