4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Spigot(Paper)+Kotlin+Exposedでなんかやってみる

Posted at

Exposed

Kotlinsqlをやるライブラリだそうです

動機

こちらの記事を拝見し、ぼくもExposedを使ってみようと思った

ライブラリを追加する

Gradle

build.gradle
repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.jetbrains.exposed:exposed-core:0.35.1'
    implementation 'org.jetbrains.exposed:exposed-dao:0.35.1'
    implementation 'org.jetbrains.exposed:exposed-jdbc:0.35.1'
    // カラムの型に日付、時間を使いたい場合これがいる
    implementation 'org.jetbrains.exposed:exposed-java-time:0.35.1'
    // ドライバー(今回はmysqlを使う)
    implementation 'mysql:mysql-connector-java:8.0.26'
}

使ってみる

テーブルを定義

今回はプレイヤーのmcid,uuid,最終ログイン日時を記録するプラグインを作ってみます

User.kt
object User : Table() {
    val mcid = varchar("mcid", 16)
    val uuid = uuid("uuid").primaryKey()
    val login = datetime("login")
}

データベースの作成

ターミナルからMysqlに接続してデータベースを作成します。

mysql> create database exposed_sample;

テーブルの作成

プラグインが起動したとき、Mysqlに接続してUserテーブルを作成します。

override fun onEnable() {

        Database.connect("jdbc:mysql://localhost/exposed_sample", driver = "com.mysql.jdbc.Driver", user = "user", password = "password")
        transaction {
            // データを作成
            SchemaUtils.create(User)
        }       

    }

起動すると、テーブルが自動で作成されてるのが分かります。

mysql> use exposed_sample;
mysql> show tables;
+--------------------------+
| Tables_in_exposed_sample |
+--------------------------+
| user                     |
+--------------------------+
1 row in set (0.00 sec)

もう一度起動したらどうなる?

どうやら実行されるSQL文には、自動的にIF NOT EXISTSが付くので気にしなくてもいいようです。テーブルを削除する時も同様です。

プレイヤーデータの追加

プレイヤーがサーバーに参加した時、プレイヤーの情報をデータベースに書き込みます。

@EventHandler
fun onJoin(event: PlayerJoinEvent) {

    val player = event.player

    transaction {

        User.insert {
            it[mcid] = player.name
            it[uuid] = player.uniqueId
            it[login] = LocalDateTime.now()
        }

    }
}

データの取得

プレイヤーがサーバーに入って来た時、前回のログイン日時をチャットで送信する仕組みを作ってみます。
先ほどのonJoinを書き換えて...

@EventHandler
fun onJoin(event: PlayerJoinEvent) {

    val player = event.player

    transaction {

        val user = User.select { User.uuid eq player.uniqueId }
        // ユーザーデータがあればアップデート&前回のログインを通知
        if (user.count() > 0L) {
            player.sendMessage("ようこそ!前回のログインは${user.single()[User.login].format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))}です!")
            User.update({ User.uuid eq player.uniqueId }) { it[login] = LocalDateTime.now() }
            return@transaction
        }

        // なければ追加&初めまして      
        User.insert {
            it[mcid] = player.name
            it[uuid] = player.uniqueId
            it[login] = LocalDateTime.now()
        }
        player.sendMessage("初めまして${player.name}さん!")

    }
}

実際の動きはこんな感じ

初めてサーバーに参加したとき

image.png

二回目以降

image.png

最後に

Javaはどうすればいいんですか

えっとJavaの場合は、Kotlinを使ってみるといいです。

感想

Exposedの使い方が分かりました(小並感)
ユーザーデータがあるかどうかを確かめるとき、返ってくるQueryのカウントが0かどうか見てるんですがisEmptyみたいなのないんですかね。まだまだ調査が必要です。

ぼくsqlはまだ完全に理解すらしていないので、間違ってることがあれば遠慮なくコメントなりSNSなりで指摘してください。
あとTwitterフォローお願いします。
https://twitter.com/Gorayan_kun

参考

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?