Skip to content

Commit

Permalink
Add architectury / fabricmc / minecraft version listener
Browse files Browse the repository at this point in the history
Signed-off-by: shedaniel <[email protected]>
  • Loading branch information
shedaniel committed Feb 26, 2021
1 parent 571f83e commit b9ee664
Show file tree
Hide file tree
Showing 24 changed files with 526 additions and 49 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ npm-debug.log
.tmpaccesswidener/

logs/
listeners/
/listeners/
37 changes: 35 additions & 2 deletions src/main/kotlin/me/shedaniel/linkie/discord/LinkieBot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,40 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.shedaniel.linkie.LinkieConfig
import me.shedaniel.linkie.Namespaces
import me.shedaniel.linkie.discord.commands.*
import me.shedaniel.linkie.discord.commands.AWCommand
import me.shedaniel.linkie.discord.commands.AboutCommand
import me.shedaniel.linkie.discord.commands.AddTrickCommand
import me.shedaniel.linkie.discord.commands.EvaluateCommand
import me.shedaniel.linkie.discord.commands.FTBDramaCommand
import me.shedaniel.linkie.discord.commands.FabricCommand
import me.shedaniel.linkie.discord.commands.FabricDramaCommand
import me.shedaniel.linkie.discord.commands.ForgeCommand
import me.shedaniel.linkie.discord.commands.GetValueCommand
import me.shedaniel.linkie.discord.commands.GoogleCommand
import me.shedaniel.linkie.discord.commands.HelpCommand
import me.shedaniel.linkie.discord.commands.ListAllTricksCommand
import me.shedaniel.linkie.discord.commands.ListTricksCommand
import me.shedaniel.linkie.discord.commands.ListenerCommand
import me.shedaniel.linkie.discord.commands.NamespacesCommand
import me.shedaniel.linkie.discord.commands.QueryClassCommand
import me.shedaniel.linkie.discord.commands.QueryCompoundCommand
import me.shedaniel.linkie.discord.commands.QueryFieldCommand
import me.shedaniel.linkie.discord.commands.QueryMethodCommand
import me.shedaniel.linkie.discord.commands.QueryTranslateClassCommand
import me.shedaniel.linkie.discord.commands.QueryTranslateFieldCommand
import me.shedaniel.linkie.discord.commands.QueryTranslateMethodCommand
import me.shedaniel.linkie.discord.commands.RandomClassCommand
import me.shedaniel.linkie.discord.commands.RemoveTrickCommand
import me.shedaniel.linkie.discord.commands.RunTrickCommand
import me.shedaniel.linkie.discord.commands.SetValueCommand
import me.shedaniel.linkie.discord.commands.TrickInfoCommand
import me.shedaniel.linkie.discord.commands.TricksCommand
import me.shedaniel.linkie.discord.commands.ValueCommand
import me.shedaniel.linkie.discord.commands.ValueListCommand
import me.shedaniel.linkie.discord.config.ConfigManager
import me.shedaniel.linkie.discord.listener.ChannelListeners
import me.shedaniel.linkie.discord.listener.listeners.ArchitecturyVersionListener
import me.shedaniel.linkie.discord.listener.listeners.FabricMCVersionListener
import me.shedaniel.linkie.discord.listener.listeners.MinecraftVersionListener
import me.shedaniel.linkie.discord.tricks.TricksManager
import me.shedaniel.linkie.discord.utils.event
Expand All @@ -44,7 +75,6 @@ import me.shedaniel.linkie.namespaces.MojangSrgNamespace
import me.shedaniel.linkie.namespaces.PlasmaNamespace
import me.shedaniel.linkie.namespaces.YarnNamespace
import me.shedaniel.linkie.namespaces.YarrnNamespace
import me.shedaniel.linkie.utils.similarity
import java.io.File
import java.util.*

Expand Down Expand Up @@ -182,8 +212,11 @@ fun registerCommands(commands: CommandHandler) {
commands.registerCommand(FabricCommand, "fabric")
commands.registerCommand(ForgeCommand, "forge")
commands.registerCommand(GoogleCommand, "google")
commands.registerCommand(ListenerCommand, "listener")
}

fun registerListeners(listeners: ChannelListeners) {
listeners["minecraft"] = MinecraftVersionListener
listeners["fabricmc"] = FabricMCVersionListener
listeners["architectury"] = ArchitecturyVersionListener
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ import discord4j.core.event.domain.message.MessageCreateEvent
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.gateway
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.discord.utils.addField
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateEmpty

object AboutCommand : CommandBase {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,15 @@ package me.shedaniel.linkie.discord.commands
import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.config.ConfigManager
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateAdmin
import me.shedaniel.linkie.discord.validateInGuild
import me.shedaniel.linkie.discord.validateUsage

object GetValueCommand : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,17 @@ import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import discord4j.core.spec.EmbedCreateSpec
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.ValueKeeper
import me.shedaniel.linkie.discord.scripting.LinkieScripting
import me.shedaniel.linkie.discord.sendPages
import me.shedaniel.linkie.discord.tricks.Trick
import me.shedaniel.linkie.discord.tricks.TricksManager
import me.shedaniel.linkie.discord.utils.addInlineField
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateEmpty
import me.shedaniel.linkie.utils.dropAndTake
import java.time.Duration
import java.time.Instant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,17 @@ import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import discord4j.core.spec.EmbedCreateSpec
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.ValueKeeper
import me.shedaniel.linkie.discord.scripting.LinkieScripting
import me.shedaniel.linkie.discord.sendPages
import me.shedaniel.linkie.discord.tricks.Trick
import me.shedaniel.linkie.discord.tricks.TricksManager
import me.shedaniel.linkie.discord.utils.addInlineField
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateUsage
import me.shedaniel.linkie.utils.dropAndTake
import java.time.Duration
import java.time.Instant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,42 +17,129 @@
package me.shedaniel.linkie.discord.commands

import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.GuildMessageChannel
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import discord4j.rest.util.Permission
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.SubCommandHolder
import me.shedaniel.linkie.discord.config.ConfigManager
import me.shedaniel.linkie.discord.gateway
import me.shedaniel.linkie.discord.listener.ChannelListeners
import me.shedaniel.linkie.discord.sendPages
import me.shedaniel.linkie.discord.utils.buildReactions
import me.shedaniel.linkie.discord.utils.buildSafeDescription
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateAdmin
import me.shedaniel.linkie.discord.validateInGuild
import me.shedaniel.linkie.discord.validateUsage
import me.shedaniel.linkie.utils.dropAndTake
import java.time.Duration
import kotlin.math.ceil

object ListenerCommand : SubCommandHolder() {
val listen = Listen
val list = subCmd(List)
val listen = subCmd(Listen)
val unlisten = subCmd(UnListen)

object List : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
event.validateInGuild()
event.member.get().validateAdmin()
val config = ConfigManager[event.guildId.get().asLong()]
val channelId = event.message.channelId.asLong()
val listened = config.listenerChannels.filterValues { channelIds -> channelId in channelIds }.keys.toList().sorted()
val maxPage = ceil(listened.size / 10.0).toInt()
message.sendPages(0, listened.size / 10, user) { page ->
setFooter("Requested by ${user.discriminatedName}", user.avatarUrl)
setTimestampToNow()
if (maxPage > 1) setTitle("List of Listeners (Page ${page + 1}/$maxPage)")
else setTitle("List of Listeners")
buildSafeDescription {
listened.dropAndTake(10 * page, 10).forEach { id ->
if (isNotEmpty())
append('\n')
append("- $id")
}
}
}
}
}

object Listen : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
event.validateInGuild()
event.member.get().validateAdmin()
require((channel as GuildMessageChannel).getEffectivePermissions(gateway.selfId).block()?.contains(Permission.MANAGE_MESSAGES) == true) { "Linkie currently lacks the `MANAGE_MESSAGES` permission!" }
args.validateUsage(prefix, 1, "$cmd <id>")
ChannelListeners[args[0].toLowerCase()]
val config = ConfigManager[event.guildId.get().asLong()]
val channels = config.listenerChannels.getOrPut(args[0].toLowerCase(), ::mutableListOf)
val channels = config.listenerChannels.getOrPut(args[0].toLowerCase(), ::mutableSetOf)
val channelId = event.message.channelId.asLong()
if (channels.contains(channelId)) {
throw IllegalStateException("You have already this listener to this channel!")
throw IllegalStateException("You have already added this listener to this channel!")
} else {
channels.add(channelId)
ConfigManager.save()
message.sendEmbed {
setTitle("Listener added")
setDescription("You have successfully added listener id `${args[0].toLowerCase()}`.\nThis message will self-destruct in 20 seconds to keep this channel clean.")
setDescription("You have successfully added listener id `${args[0].toLowerCase()}`.\nThis message will self-destruct in 20 seconds to keep this channel clean.\n" +
"Or alternatively you can just click that ❌ emote.")
}.subscribe {
var deleted = false
buildReactions(Duration.ofMinutes(2)) {
registerB("") {
deleted = true
it.delete().subscribe()
false
}
}.build(it) { it == user.id }
GlobalScope.launch {
delay(20000)
if (!deleted)
it.delete().subscribe()
}
}
}
}
}

object UnListen : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
event.validateInGuild()
event.member.get().validateAdmin()
args.validateUsage(prefix, 1, "$cmd <id>")
ChannelListeners[args[0].toLowerCase()]
val config = ConfigManager[event.guildId.get().asLong()]
val channels = config.listenerChannels.getOrPut(args[0].toLowerCase(), ::mutableSetOf)
val channelId = event.message.channelId.asLong()
if (!channels.contains(channelId)) {
throw IllegalStateException("You have not added this listener to this channel!")
} else {
channels.remove(channelId)
ConfigManager.save()
message.sendEmbed {
setTitle("Listener removed")
setDescription("You have successfully removed listener id `${args[0].toLowerCase()}`.\nThis message will self-destruct in 20 seconds to keep this channel clean.\n" +
"Or alternatively you can just click that ❌ emote.")
}.subscribe {
var deleted = false
buildReactions(Duration.ofMinutes(2)) {
registerB("") {
deleted = true
it.delete().subscribe()
false
}
}.build(it) { it == user.id }
GlobalScope.launch {
delay(20000)
it.delete()
if (!deleted)
it.delete().subscribe()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import me.shedaniel.linkie.Namespaces
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.sendEmbedMessage
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateEmpty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import kotlinx.coroutines.runBlocking
import me.shedaniel.linkie.*
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.discord.utils.isValidIdentifier
import me.shedaniel.linkie.namespaces.YarnNamespace
import me.shedaniel.linkie.utils.*
import java.time.Duration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.utils.dropAndTake
import me.shedaniel.linkie.utils.onlyClass
import me.shedaniel.linkie.utils.remapDescriptor
import java.time.Duration
import java.util.concurrent.atomic.AtomicInteger
import kotlin.math.ceil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.utils.dropAndTake
import me.shedaniel.linkie.utils.onlyClass
import me.shedaniel.linkie.utils.remapDescriptor
import java.time.Duration
import java.util.concurrent.atomic.AtomicInteger
import kotlin.math.ceil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package me.shedaniel.linkie.discord.commands

import discord4j.core.`object`.entity.Message
import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
Expand All @@ -25,11 +24,19 @@ import me.shedaniel.linkie.Class
import me.shedaniel.linkie.MappingsContainer
import me.shedaniel.linkie.MappingsProvider
import me.shedaniel.linkie.Namespaces
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.ValueKeeper
import me.shedaniel.linkie.discord.utils.buildReactions
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.utils.tryRemoveAllReactions
import me.shedaniel.linkie.discord.validateGuild
import me.shedaniel.linkie.discord.validateNamespace
import me.shedaniel.linkie.discord.validateUsage
import java.time.Duration
import java.util.*
import java.util.concurrent.atomic.AtomicReference

object RandomClassCommand : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,15 @@ package me.shedaniel.linkie.discord.commands
import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.config.ConfigManager
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateAdmin
import me.shedaniel.linkie.discord.validateInGuild
import me.shedaniel.linkie.discord.validateUsage

object SetValueCommand : CommandBase {
override suspend fun execute(event: MessageCreateEvent, message: MessageCreator, prefix: String, user: User, cmd: String, args: MutableList<String>, channel: MessageChannel) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.scripting.LinkieScripting
import me.shedaniel.linkie.discord.tricks.TricksManager
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.discord.utils.addField
import me.shedaniel.linkie.discord.utils.addInlineField
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateUsage
import java.time.Instant

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,18 @@ import discord4j.core.`object`.entity.User
import discord4j.core.`object`.entity.channel.MessageChannel
import discord4j.core.event.domain.message.MessageCreateEvent
import discord4j.core.spec.EmbedCreateSpec
import me.shedaniel.linkie.discord.*
import me.shedaniel.linkie.discord.CommandBase
import me.shedaniel.linkie.discord.MessageCreator
import me.shedaniel.linkie.discord.config.ConfigManager
import me.shedaniel.linkie.discord.config.GuildConfig
import me.shedaniel.linkie.discord.utils.*
import me.shedaniel.linkie.discord.sendPages
import me.shedaniel.linkie.discord.utils.addInlineField
import me.shedaniel.linkie.discord.utils.description
import me.shedaniel.linkie.discord.utils.discriminatedName
import me.shedaniel.linkie.discord.utils.setTimestampToNow
import me.shedaniel.linkie.discord.validateAdmin
import me.shedaniel.linkie.discord.validateEmpty
import me.shedaniel.linkie.discord.validateInGuild
import me.shedaniel.linkie.utils.dropAndTake
import kotlin.math.ceil

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ data class GuildConfig(
var evalEnabled: Boolean = true,
var whitelistedMappings: List<String> = listOf(),
var blacklistedMappings: List<String> = listOf(),
var listenerChannels: MutableMap<String, MutableList<Long>> = mutableMapOf(),
var listenerChannels: MutableMap<String, MutableSet<Long>> = mutableMapOf(),
) {
fun isMappingsEnabled(namespace: String): Boolean {
if (whitelistedMappings.isNotEmpty())
Expand Down
Loading

0 comments on commit b9ee664

Please sign in to comment.