Skip to content

Commit c7fc66d

Browse files
committed
feat: add /nickname
1 parent a63f900 commit c7fc66d

File tree

9 files changed

+75
-39
lines changed

9 files changed

+75
-39
lines changed

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ plugins {
55
}
66

77
group = "net.azisaba"
8-
version = "2.1.4"
8+
version = "2.2.0"
99

1010
repositories {
1111
mavenCentral()
12-
maven { url = uri("https://repo.acrylicstyle.xyz/repository/maven-public/") }
12+
maven { url = uri("https://repo.azisaba.net/repository/maven-public/") }
1313
}
1414

1515
java.toolchain.languageVersion.set(JavaLanguageVersion.of(17))
@@ -22,7 +22,7 @@ dependencies {
2222
implementation("org.mariadb.jdbc:mariadb-java-client:3.0.8")
2323
implementation("com.zaxxer:HikariCP:5.0.1")
2424
implementation("com.charleskorn.kaml:kaml:0.47.0") // YAML support for kotlinx.serialization
25-
implementation("net.azisaba.interchat:api:2.1.2")
25+
implementation("net.azisaba.interchat:api:2.4.1-SNAPSHOT")
2626
// ByteBuf
2727
implementation("io.netty:netty-buffer:4.1.82.Final")
2828
// Support for minecraft chat components

src/main/kotlin/net/azisaba/guildchatdiscord/InterChatDiscord.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.azisaba.guildchatdiscord
22

3+
import dev.kord.core.entity.User
34
import net.azisaba.guildchatdiscord.util.DatabaseManager
45
import net.azisaba.interchat.api.InterChat
56
import net.azisaba.interchat.api.Logger
@@ -8,6 +9,7 @@ import net.azisaba.interchat.api.guild.SQLGuildManager
89
import net.azisaba.interchat.api.user.SQLUserManager
910
import net.azisaba.interchat.api.user.UserManager
1011
import org.slf4j.LoggerFactory
12+
import java.util.*
1113
import java.util.concurrent.Executor
1214
import java.util.concurrent.Executors
1315

@@ -24,4 +26,16 @@ object InterChatDiscord : InterChat {
2426
override fun getUserManager(): UserManager = userManager
2527

2628
override fun getAsyncExecutor(): Executor = asyncExecutor
27-
}
29+
}
30+
31+
fun User.getMinecraftIdName() =
32+
DatabaseManager.query("SELECT `minecraft_uuid`, `minecraft_name` FROM `users` WHERE `discord_id` = ?") { stmt ->
33+
stmt.setLong(1, id.value.toLong())
34+
stmt.executeQuery().use { rs ->
35+
if (rs.next()) {
36+
Pair(UUID.fromString(rs.getString("minecraft_uuid")), rs.getString("minecraft_name"))
37+
} else {
38+
null
39+
}
40+
}
41+
}

src/main/kotlin/net/azisaba/guildchatdiscord/InterChatPacketListener.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ object InterChatPacketListener : PacketListener {
4040
nickname.orElse(null),
4141
packet.message(),
4242
packet.transliteratedMessage(),
43+
emptyMap(), // TODO: support prefix and suffix
4344
)
4445
val formattedComponent = LEGACY_COMPONENT_SERIALIZER.deserialize(formattedText)
4546
val plainText = PLAIN_TEXT_COMPONENT_SERIALIZER.serialize(formattedComponent)

src/main/kotlin/net/azisaba/guildchatdiscord/Main.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ import dev.kord.core.on
99
import dev.kord.gateway.Intent
1010
import dev.kord.gateway.Intents
1111
import dev.kord.gateway.PrivilegedIntent
12-
import net.azisaba.guildchatdiscord.commands.ConnectCommand
13-
import net.azisaba.guildchatdiscord.commands.LinkCommand
14-
import net.azisaba.guildchatdiscord.commands.UnconnectCommand
15-
import net.azisaba.guildchatdiscord.commands.UnlinkCommand
12+
import net.azisaba.guildchatdiscord.commands.*
1613
import net.azisaba.guildchatdiscord.util.DatabaseManager
1714
import net.azisaba.interchat.api.InterChatProviderProvider
1815
import net.azisaba.interchat.api.network.Protocol
@@ -27,6 +24,7 @@ private val commandHandlers = mutableMapOf(
2724
"unlink" to UnlinkCommand,
2825
"connect" to ConnectCommand,
2926
"unconnect" to UnconnectCommand,
27+
"nickname" to NickCommand,
3028
)
3129

3230
@OptIn(PrivilegedIntent::class)

src/main/kotlin/net/azisaba/guildchatdiscord/commands/ConnectCommand.kt

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import dev.kord.core.entity.interaction.ApplicationCommandInteraction
88
import dev.kord.rest.builder.interaction.GlobalMultiApplicationCommandBuilder
99
import dev.kord.rest.builder.interaction.string
1010
import net.azisaba.guildchatdiscord.InterChatDiscord
11+
import net.azisaba.guildchatdiscord.getMinecraftIdName
1112
import net.azisaba.guildchatdiscord.util.DatabaseManager
1213
import net.azisaba.guildchatdiscord.util.optString
1314
import net.azisaba.interchat.api.user.User
@@ -21,18 +22,8 @@ object ConnectCommand : CommandHandler {
2122
defer.respond { content = "BotがこのチャンネルにWebhookを作成する権限がありません。" }
2223
return
2324
}
24-
val minecraftUuid = DatabaseManager.query("SELECT `minecraft_uuid` FROM `users` WHERE `discord_id` = ?") {
25-
it.setLong(1, interaction.user.id.value.toLong())
26-
it.executeQuery().use { rs ->
27-
if (rs.next()) {
28-
UUID.fromString(rs.getString("minecraft_uuid"))
29-
} else {
30-
null
31-
}
32-
}
33-
}
34-
if (minecraftUuid == null) {
35-
defer.respond { content = "Minecraftアカウントと連携されていません。" }
25+
val (minecraftUuid) = interaction.user.getMinecraftIdName() ?: run {
26+
defer.respond { content = "Minecraftアカウントが連携されていません。" }
3627
return
3728
}
3829
val user: User = InterChatDiscord.userManager.fetchUser(minecraftUuid).join()
@@ -84,10 +75,10 @@ object ConnectCommand : CommandHandler {
8475
}
8576

8677
override fun register(builder: GlobalMultiApplicationCommandBuilder) {
87-
builder.input("connect", "Connect the guild chat") {
78+
builder.input("connect", "ギルドチャットを連携します") {
8879
dmPermission = false
8980
defaultMemberPermissions = Permissions(Permission.ManageWebhooks)
90-
string("guild", "Guild name") {
81+
string("guild", "ギルド名") {
9182
required = true
9283
}
9384
}

src/main/kotlin/net/azisaba/guildchatdiscord/commands/LinkCommand.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ object LinkCommand : CommandHandler {
6767
}
6868

6969
override fun register(builder: GlobalMultiApplicationCommandBuilder) {
70-
builder.input("link", "Link the Minecraft account") {
71-
string("code", "Code that you got from the Minecraft server") {
70+
builder.input("link", "Minecraftアカウントを連携します") {
71+
string("code", "サーバー内から入手したコード") {
7272
required = true
7373
}
7474
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package net.azisaba.guildchatdiscord.commands
2+
3+
import dev.kord.core.behavior.interaction.respondEphemeral
4+
import dev.kord.core.entity.interaction.ApplicationCommandInteraction
5+
import dev.kord.core.kordLogger
6+
import dev.kord.rest.builder.interaction.GlobalMultiApplicationCommandBuilder
7+
import dev.kord.rest.builder.interaction.string
8+
import net.azisaba.guildchatdiscord.InterChatDiscord
9+
import net.azisaba.guildchatdiscord.getMinecraftIdName
10+
import net.azisaba.guildchatdiscord.util.optString
11+
import net.azisaba.interchat.api.guild.GuildMember
12+
13+
object NickCommand : CommandHandler {
14+
override suspend fun handle0(interaction: ApplicationCommandInteraction) {
15+
val guildName = interaction.optString("guild")!!
16+
val newName = interaction.optString("name")
17+
val (uuid) = interaction.user.getMinecraftIdName() ?: run {
18+
interaction.respondEphemeral { content = "Minecraftアカウントが連携されていません。" }
19+
return
20+
}
21+
val guild = try {
22+
InterChatDiscord.guildManager.fetchGuildByName(guildName).join()
23+
} catch (e: Exception) {
24+
interaction.respondEphemeral { content = "ギルドの取得に失敗しました。ギルドが存在しない可能性があります。" }
25+
kordLogger.info("Could not find guild by name $guildName", e)
26+
return
27+
}
28+
val oldMember = guild.getMember(uuid).join()
29+
val newMember = GuildMember(oldMember.guildId(), oldMember.uuid(), oldMember.role(), newName)
30+
newMember.update()
31+
interaction.respondEphemeral { content = "ニックネームを `$newName` に変更しました。" }
32+
}
33+
34+
override fun register(builder: GlobalMultiApplicationCommandBuilder) {
35+
builder.input("nickname", "ギルドでのニックネームを変更または削除します") {
36+
string("guild", "ギルドの名前") {
37+
required = true
38+
}
39+
string("name", "新しいニックネーム")
40+
}
41+
}
42+
}

src/main/kotlin/net/azisaba/guildchatdiscord/commands/UnconnectCommand.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ object UnconnectCommand : CommandHandler {
4848
}
4949

5050
override fun register(builder: GlobalMultiApplicationCommandBuilder) {
51-
builder.input("unconnect", "Removes the integration with the guild chat.") {
51+
builder.input("unconnect", "ギルドチャットの連携を解除します") {
5252
dmPermission = false
5353
defaultMemberPermissions = Permissions(Permission.ManageWebhooks)
5454
}
5555
}
56-
}
56+
}

src/main/kotlin/net/azisaba/guildchatdiscord/commands/UnlinkCommand.kt

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,15 @@ package net.azisaba.guildchatdiscord.commands
33
import dev.kord.core.behavior.interaction.respondEphemeral
44
import dev.kord.core.entity.interaction.ApplicationCommandInteraction
55
import dev.kord.rest.builder.interaction.GlobalMultiApplicationCommandBuilder
6+
import net.azisaba.guildchatdiscord.getMinecraftIdName
67
import net.azisaba.guildchatdiscord.util.DatabaseManager
78

89
object UnlinkCommand : CommandHandler {
910
override suspend fun handle0(interaction: ApplicationCommandInteraction) {
10-
val uuidName = DatabaseManager.query("SELECT `minecraft_uuid`, `minecraft_name` FROM `users` WHERE `discord_id` = ?") { stmt ->
11-
stmt.setLong(1, interaction.user.id.value.toLong())
12-
stmt.executeQuery().use { rs ->
13-
if (rs.next()) {
14-
Pair(rs.getString("minecraft_uuid"), rs.getString("minecraft_name"))
15-
} else {
16-
null
17-
}
18-
}
19-
}
20-
if (uuidName == null) {
11+
val (uuid, name) = interaction.user.getMinecraftIdName() ?: run {
2112
interaction.respondEphemeral { content = "このアカウントは連携されていません。" }
2213
return
2314
}
24-
val (uuid, name) = uuidName
2515
DatabaseManager.query("DELETE FROM `users` WHERE `discord_id` = ?") { stmt ->
2616
stmt.setLong(1, interaction.user.id.value.toLong())
2717
stmt.executeUpdate()
@@ -30,6 +20,6 @@ object UnlinkCommand : CommandHandler {
3020
}
3121

3222
override fun register(builder: GlobalMultiApplicationCommandBuilder) {
33-
builder.input("unlink", "Unlink the Minecraft account")
23+
builder.input("unlink", "Minecraftアカウントの連携を解除します")
3424
}
3525
}

0 commit comments

Comments
 (0)