はじめに
会員(友人)制のMinecraftの鯖管をやっている筆者であるが、稼働率が高くすぐ負荷に耐えられなくなり、よくサーバの再起動を命ぜられる👍
以前はPHPでAPIとWebサイトを簡易的に作り、ログイン式のWebサイトから再起動やバックアップの作成を行えるようにして鯖管をサボっていたわけですが、今回そのAPI部分をNode.js
+TypeScript
+Express
で新規機能を追加しながら作成してみたいと思います✨
このソースコードはGitHubに公開しているので、修正点やアドバイス等があれば是非プルリクをお願いします。またMITライセンスにしておりますので、どうぞご自由にお使いください!
仕様
基本的には以下のことができるAPIサーバを作成する。(予定)
- サーバ稼働状況やバージョンの取得 ← 今回
- オンラインメンバーの一覧取得 ← 今回
- Discordへのエラー通知とDBへのログの保存
- サーバアイコンの取得
- サーバの起動・停止・再起動
- ワールドデータの日常的なGoogleDriveへのバックアップ
プログラムと説明
importexpressfrom'express'import{pingAsync,pingOnlineAsync}from"./ping"constapp:express.Express=express()constrouter:express.Router=express.Router()app.use((req,res,next)=>{res.header("Access-Control-Allow-Origin","*")res.header("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept")next()})app.use(express.json())app.use(express.urlencoded({extended:true}))// --- Get Operational Status --------------------------------------------------router.get('/api/state',(req:express.Request,res:express.Response)=>{pingAsync().then((json)=>{res.send(json)}).catch((err)=>{res.send(err)})})// -----------------------------------------------------------------------------// --- Get Online Member -------------------------------------------------------router.get('/api/state/online',(req:express.Request,res:express.Response)=>{pingOnlineAsync().then((json)=>{res.send(json)}).catch((err)=>{res.send(err)})})// -----------------------------------------------------------------------------app.use(router)app.listen(3000,()=>{console.log('Listening on port 3000...')})
require('dotenv').config()constmc_ping=require('mc-ping-updated')exportfunctionpingAsync():Promise<any>{returnnewPromise((resolve,reject)=>{mc_ping(process.env.SERVER_URL,process.env.SERVER_PORT,function(err:any,res:any){if(err)reject('stop')elseresolve(res)})})}exportfunctionpingOnlineAsync():Promise<any>{returnnewPromise((resolve,reject)=>{mc_ping(process.env.SERVER_URL,process.env.SERVER_PORT,function(err:any,res:any){if(err)reject('stop')elseif(res.players.sample)resolve(res.players.sample)elseresolve('nobody')})})}
Minecraftサーバとの通信は、mc-ping-updatedを使用させていただきました。api/state
にGETメゾットを送ることで このようなフォーマットのJSONを返し、api/state/online
にGETメゾットを送ることで、オンラインメンバーの一覧を取得できます。
SERVER_URL='example.com'
SERVER_PORT=25565
.env
ファイルにまとめてサーバアドレスやポート番号など(随時追加)を記述してあるので、お好みの値に書き換えることで自由にお使えいただけます。
次回はサーバの起動・停止・再起動の追加と、その際のDiscordへのエラー通知とDBへのログの保存機能を搭載したいと思います。ぜひご覧ください!
参考
https://qiita.com/notakaos/items/3bbd2293e2ff286d9f49
https://qiita.com/pochopocho13/items/79a4735031ce11a91df7
https://www.npmjs.com/package/mc-ping-updated
https://wiki.vg/Server_List_Ping