blog.euxn.me

minecraft(spigot) のログイン/ログアウト通知を shell+systemd で実装する

2021-01-30 Sat.

Spigot をはじめとする Java 版の minecraft サーバの場合、 logs/latest.log に各通知が記録されるため、そこを tail -f して grep して sed して curl で webhook に飛ばすスクリプトを書き、 systemd に登録する。 以下では例として discord の webhook を使うが、 curl 以降を書き換えることで任意の webhook に対応する。

1#!/bin/bash
2tail -f -n1 /srv/craftbukkit/logs/latest.log | grep --line-buffered 'of player' | sed -u -r 's/.*of\splayer\s(.*)\sis.*/\1/g' | xargs -INAME curl -XPOST -H 'Content-Type:application/json' -d '{ "content": "NAME logged in"}' https://discord.com/api/webhooks/XXXXXX/XXXXXX

ログアウトの場合はこう。

1#!/bin/bash
2tail -f -n1 /srv/craftbukkit/logs/latest.log | grep --line-buffered 'left the game' | sed -u -r 's/.*\s(.*)\sleft\sthe\sgame.*/\1/g' | xargs -INAME curl -XPOST -H 'Content-Type:application/json' -d '{ "content": "NAME left the game"}' https://discord.com/api/webhooks/XXXXXX/XXXXXX

これを実行権限を付け、 craftbukkit ユーザ(グループ)の所有物にして、 systemd に craftbukkit ユーザ(グループ)のプロセスとして登録する。(logout は省略)

1$ sudo chmod +x /srv/craftbukkit/login-notify.sh
2$ sudo chown craftbukkit:craftbukkit /srv/craftbukkit/login-notify.sh

systemd への登録は .service を記述する。

1$ sudo vim /etc/systemd/system/craftbukkit-login-notify.service
2
3
4[Unit]
5Description = craftbukkit login notify daemon
6
7[Service]
8ExecStart = /srv/craftbukkit/login-notify.sh
9Restart = always
10Type = simple
11User = craftbukkit
12Group = craftbukkit
13
14[Install]
15WantedBy = multiuser.target

service を enable にし、 start する。

1$ sudo systemctl enable craftbukkit-login-notify.service
2$ sudo systemctl start craftbukkit-login-notify.service

参考

https://enakai00.hatenablog.com/entry/20130917/1379374797

Other Works
2024-12-01 Sun.
OpenAPI Spec を出力できる DSL、TypeSpec の実践例
- ドワンゴ教育サービス開発者ブログ

2024-11-16 Sat.
型付き API リクエストを実現するいくつかの手法とその選択
- TSKaigi Kansai 2024

2024-09-10 Tue.
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
- Zenn

2024-09-10 Tue.
言語環境の管理は *env や *vm を超えて、 mise へ
- Zenn

2024-06-28 Fri.
TypeSpec を使い倒してる
- Kyoto.js 22

2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024

2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ

2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn

2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ

2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn

2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn

2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn

2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn

2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn

2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn

2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn

2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn