Skip to content

Commit

Permalink
✨ 認証済みのユーザーにパーミッションを適用するコマンドの追加
Browse files Browse the repository at this point in the history
  • Loading branch information
Alpha9n committed Feb 15, 2023
1 parent 9ebf57e commit 26b6158
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 32 deletions.
15 changes: 11 additions & 4 deletions src/main/kotlin/jp/aoichaan0513/fslink/api/MainAPI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ class MainAPI {

fun hidePlayers(p: Player, isRefresh: Boolean = false) {
if (isRefresh)
for (player: Player in Bukkit.getOnlinePlayers().filter { player -> !hidePlayers.contains(player.uniqueId) })
for (player: Player in Bukkit.getOnlinePlayers()
.filter { player -> !hidePlayers.contains(player.uniqueId) })
p.showPlayer(player)
for (uuid in hidePlayers.filter { isPlayerOnline(it) }.toSet())
p.hidePlayer(Bukkit.getPlayer(uuid)!!)
Expand Down Expand Up @@ -69,16 +70,16 @@ class MainAPI {
return "$backColor> $forwardColor"
}

fun getPostgrestClient(): PostgrestDefaultClient?{
fun getPostgrestClient(): PostgrestDefaultClient? {
val serviceKey = Main.pluginInstance.config.getString("supabase.serviceKey")
val uri = Main.pluginInstance.config.getString("supabase.requestURI")
if (serviceKey == null || uri == null) {
println("§cserviceKey又はrequestURIが設定されていません,config.ymlを確認してください")
return null
}
return PostgrestDefaultClient(
uri = URI(uri),
headers = mapOf("Authorization" to "Bearer $serviceKey", "apikey" to serviceKey)
uri = URI(uri),
headers = mapOf("Authorization" to "Bearer $serviceKey", "apikey" to serviceKey)
)
}
}
Expand Down Expand Up @@ -129,4 +130,10 @@ class MainAPI {
}
}
}

enum class TableName(val table: String) {
FREESERVER_USER("freeserver_user"),
BANK_BALANCES("bank_balances"),
WALLET_BALANCES("wallet_balances")
}
}
50 changes: 37 additions & 13 deletions src/main/kotlin/jp/aoichaan0513/fslink/commands/main/Auth.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package jp.aoichaan0513.fslink.commands.main

import jp.aoichaan0513.fslink.api.MainAPI
import jp.aoichaan0513.fslink.api.MainAPI.Companion.getPostgrestClient
import jp.aoichaan0513.fslink.api.PerseAPI.Companion.fromJson
import jp.aoichaan0513.fslink.commands.ICommand
import jp.aoichaan0513.fslink.listener.BotListener
import jp.aoichaan0513.fslink.Main
import jp.aoichaan0513.fslink.consts.FreeserverUser
import net.md_5.bungee.api.ChatMessageType
import net.md_5.bungee.api.chat.ClickEvent
import net.md_5.bungee.api.chat.ComponentBuilder
Expand All @@ -21,25 +21,39 @@ import org.bukkit.entity.Player
class Auth(name: String) : ICommand(name) {

override fun onPlayerCommand(sp: Player, cmd: Command, label: String, args: Array<String>) {
val discord_id = getPostgrestClient()!!.from<String>("freeserver_user")
.select("discord_id")
.eq("mcuuid", sp.uniqueId)
.execute()
val discord_id = getPostgrestClient()
?.from<String>(MainAPI.TableName.FREESERVER_USER.table)
?.select("discord_id")
?.eq("mcuuid", sp.uniqueId)
?.executeAndGetSingle<FreeserverUser>()
?.discord_id

if (fromJson(discord_id.body!!, "discord_id") == null) {
if (discord_id == null) {
val code = RandomStringUtils.randomAlphanumeric(6)
BotListener.hashMap[code] = sp.uniqueId

val inviteLink = Main.pluginInstance.config.getString("inviteLink", "https://discord.gg/WudKwEj")

val textComponent1 = TextComponent("${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}下記のコードを${ChatColor.GOLD}${ChatColor.BOLD}#${Main.botInstance.getTextChannelById(Main.pluginInstance.config.getLong("channelId"))?.name}${ChatColor.RESET}${ChatColor.GRAY}に送信してください。\n")
val textComponent2 = TextComponent("${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}コード: ${ChatColor.GOLD}${ChatColor.BOLD}")
val textComponent1 = TextComponent(
"${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}下記のコードを${ChatColor.GOLD}${ChatColor.BOLD}#${
Main.botInstance.getTextChannelById(Main.pluginInstance.config.getLong("channelId"))?.name
}${ChatColor.RESET}${ChatColor.GRAY}に送信してください。\n"
)
val textComponent2 =
TextComponent("${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}コード: ${ChatColor.GOLD}${ChatColor.BOLD}")
val textComponent3 = TextComponent(code)
textComponent3.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, ComponentBuilder("${ChatColor.GOLD}${ChatColor.BOLD}${ChatColor.UNDERLINE}クリックでコードをコピー").create())
textComponent3.hoverEvent = HoverEvent(
HoverEvent.Action.SHOW_TEXT,
ComponentBuilder("${ChatColor.GOLD}${ChatColor.BOLD}${ChatColor.UNDERLINE}クリックでコードをコピー").create()
)
textComponent3.clickEvent = ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, code)
val textComponent4 = TextComponent("\n${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}招待リンク: ${ChatColor.GOLD}${ChatColor.BOLD}")
val textComponent4 =
TextComponent("\n${MainAPI.getPrefix(MainAPI.PrefixType.SECONDARY)}招待リンク: ${ChatColor.GOLD}${ChatColor.BOLD}")
val textComponent5 = TextComponent(inviteLink)
textComponent5.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, ComponentBuilder("${ChatColor.GOLD}${ChatColor.BOLD}${ChatColor.UNDERLINE}クリックでリンクを開く").create())
textComponent5.hoverEvent = HoverEvent(
HoverEvent.Action.SHOW_TEXT,
ComponentBuilder("${ChatColor.GOLD}${ChatColor.BOLD}${ChatColor.UNDERLINE}クリックでリンクを開く").create()
)
textComponent5.clickEvent = ClickEvent(ClickEvent.Action.OPEN_URL, inviteLink)

textComponent1.addExtra(textComponent2)
Expand All @@ -61,11 +75,21 @@ class Auth(name: String) : ICommand(name) {
return emptyList()
}

override fun onBlockTabComplete(bs: BlockCommandSender, cmd: Command, alias: String, args: Array<String>): List<String> {
override fun onBlockTabComplete(
bs: BlockCommandSender,
cmd: Command,
alias: String,
args: Array<String>
): List<String> {
return emptyList()
}

override fun onConsoleTabComplete(cs: ConsoleCommandSender, cmd: Command, alias: String, args: Array<String>): List<String> {
override fun onConsoleTabComplete(
cs: ConsoleCommandSender,
cmd: Command,
alias: String,
args: Array<String>
): List<String> {
return emptyList()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package jp.aoichaan0513.fslink.commands.main

import jp.aoichaan0513.fslink.Main
import jp.aoichaan0513.fslink.api.MainAPI
import jp.aoichaan0513.fslink.api.MainAPI.Companion.getPostgrestClient
import jp.aoichaan0513.fslink.commands.ICommand
import jp.aoichaan0513.fslink.consts.FreeserverUser
import net.dv8tion.jda.api.EmbedBuilder
import net.luckperms.api.model.data.DataMutateResult
import net.luckperms.api.node.Node
import org.bukkit.Bukkit
import org.bukkit.command.BlockCommandSender
import org.bukkit.command.Command
import org.bukkit.command.ConsoleCommandSender
import org.bukkit.entity.Player
import java.lang.Error
import java.lang.NullPointerException
import java.time.Instant

class CheckVerified(name: String) : ICommand(name){
override fun onPlayerCommand(sp: Player, cmd: Command, label: String, args: Array<String>) {
val playerList = getPostgrestClient()
?.from<FreeserverUser>(MainAPI.TableName.FREESERVER_USER.table)
?.select("discord_id")
?.executeAndGetList<FreeserverUser>()
val userManager = Main.luckPerms.userManager
val groupName = Main.pluginInstance.config.getString("authedGroup", "sabamin")!!
val defaultGroupName = "default"

if (playerList != null) {
for (player in playerList) {
if (player.discord_id != null) {
val userFuture = userManager.loadUser(player.mcuuid)
userFuture.thenAcceptAsync { lpUser ->
val result1 = lpUser.data().remove(Node.builder("group.${groupName}").build())
val result2 = lpUser.data().add(Node.builder("group.${defaultGroupName}").build())
if (result1 == DataMutateResult.SUCCESS && result2 == DataMutateResult.SUCCESS) {
lpUser.primaryGroup = defaultGroupName
Main.luckPerms.userManager.saveUser(lpUser)
Bukkit.getLogger().info("The discordID of ${player.mcuuid} is ${player.discord_id}.")
} else {
Bukkit.getLogger().severe("予期しないエラーが発生しました")
return@thenAcceptAsync
}
}
} else {
Bukkit.getLogger().info("${player.mcuuid} is not verified.")
}
}
return
}
throw NullPointerException("playerList is null")
}

override fun onBlockCommand(bs: BlockCommandSender, cmd: Command, label: String, args: Array<String>) {}

override fun onConsoleCommand(cs: ConsoleCommandSender, cmd: Command, label: String, args: Array<String>) {}

override fun onPlayerTabComplete(sp: Player, cmd: Command, alias: String, args: Array<String>): List<String> {
return emptyList()
}

override fun onBlockTabComplete(
bs: BlockCommandSender,
cmd: Command,
alias: String,
args: Array<String>
): List<String> {
return emptyList()
}

override fun onConsoleTabComplete(
cs: ConsoleCommandSender,
cmd: Command,
alias: String,
args: Array<String>
): List<String> {
return emptyList()
}


}
11 changes: 11 additions & 0 deletions src/main/kotlin/jp/aoichaan0513/fslink/consts/FreeserverUser.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package jp.aoichaan0513.fslink.consts

import java.util.*

data class FreeserverUser constructor(
val mcuuid: UUID,
val discord_id: String?,
val permissions: String,
val bank_id: UUID?,
val wallet_id: UUID?
)
44 changes: 29 additions & 15 deletions src/main/kotlin/jp/aoichaan0513/fslink/listener/BotListener.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,26 @@ class BotListener : ListenerAdapter() {
Main.pluginInstance.config.set("authedUsers.${user.idLong}", null)
Main.pluginInstance.saveConfig()

getPostgrestClient()!!.from<String>("freeserver_user")
.update(mapOf("discord_id" to null))
.eq("mcuuid", uuid)
.execute()
getPostgrestClient()?.from<String>(MainAPI.TableName.FREESERVER_USER.table)
?.update(mapOf("discord_id" to null))
?.eq("mcuuid", uuid)
?.execute()

val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("成功").setDescription("${user.asMention} とMinecraft アカウントとの連携を解除しました。\nMinecraft サーバーに再度参加して認証を行うことが出来ます。")
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("成功")
.setDescription("${user.asMention} とMinecraft アカウントとの連携を解除しました。\nMinecraft サーバーに再度参加して認証を行うことが出来ます。")
channel.sendMessage(embedBuilder.build()).queue()
return@thenAcceptAsync
} else {
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー").setDescription("予期しないエラーが発生しました。")
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー")
.setDescription("予期しないエラーが発生しました。")
channel.sendMessage(embedBuilder.build()).queue()
return@thenAcceptAsync
}
}
return
}
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー").setDescription("連携されていないため連携の解除ができませんでした。\nMinecraft サーバーに参加して連携を開始してください。")
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー")
.setDescription("連携されていないため連携の解除ができませんでした。\nMinecraft サーバーに参加して連携を開始してください。")
channel.sendMessage(embedBuilder.build()).queue()
return
} else {
Expand All @@ -81,33 +84,44 @@ class BotListener : ListenerAdapter() {
object : BukkitRunnable() {
override fun run() {
for (map in Main.pluginInstance.config.getMapList("runCommands")) {
val cmd = (map.get("command") as String).replace("{replace:player_name}", p.name!!).replace("{replace:player_uuid}", uuid.toString())
val cmd = (map.get("command") as String).replace("{replace:player_name}", p.name!!)
.replace("{replace:player_uuid}", uuid.toString())
val type = map.getOrDefault("type", "console") as String

Bukkit.dispatchCommand(if (type.equals("player", true) && p.isOnline) p.player!! else Bukkit.getConsoleSender(), cmd)
Bukkit.dispatchCommand(
if (type.equals(
"player",
true
) && p.isOnline
) p.player!! else Bukkit.getConsoleSender(), cmd
)
}
}
}.runTaskLater(Main.pluginInstance, 0)

val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setThumbnail("https://minotar.net/helm/${p.uniqueId}").setTitle("成功").setDescription("${user.asMention} のDiscord アカウントを${MarkdownUtil.bold(p.name!!)}と連携しました。")
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now())
.setThumbnail("https://minotar.net/helm/${p.uniqueId}").setTitle("成功")
.setDescription("${user.asMention} のDiscord アカウントを${MarkdownUtil.bold(p.name!!)}と連携しました。")
channel.sendMessage(embedBuilder.build()).queue()

getPostgrestClient()!!.from<String>("freeserver_user")
.update(mapOf("discord_id" to user.id))
.eq("mcuuid", uuid)
.execute()
.update(mapOf("discord_id" to user.id))
.eq("mcuuid", uuid)
.execute()

if (p.isOnline)
p.player!!.sendMessage("${MainAPI.getPrefix(MainAPI.PrefixType.SUCCESS)}あなたのMinecraft アカウントを${ChatColor.BOLD}${user.asTag}${ChatColor.RESET}${ChatColor.GREEN}と連携しました。")
hashMap.remove(msg.contentRaw)
return
} else {
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー").setDescription("予期しないエラーが発生しました。")
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー")
.setDescription("予期しないエラーが発生しました。")
channel.sendMessage(embedBuilder.build()).queue()
return
}
} else {
val embedBuilder = EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー").setDescription("そのコードは見つかりませんでした。")
val embedBuilder =
EmbedBuilder().setTimestamp(Instant.now()).setTitle("エラー").setDescription("そのコードは見つかりませんでした。")
channel.sendMessage(embedBuilder.build()).queue()
}
return
Expand Down

0 comments on commit 26b6158

Please sign in to comment.