LoginSignup
2
1

マイクラサーバーをディスコードBOTから起動、終了出来るようにした

Posted at

初めに

マイクラサーバーを自分のPCに立てたけど、複数人でやるとき自分がいちいちPCで起動、終了コマンド打つのめんどいなーと思ってこの記事を書きました。24時間鯖起動は電気代的にちょっと...って人向けです。
*PCは24時間起動で常に自分のディスコードBOTが動くことを想定しています。
*マイクラ以外でも同じPCで実行するものなら何でもできます。

この記事でできること

  • ディスコードでコマンドを入力すると自動的にマイクラ鯖が起動、終了します。
  • いま鯖が起動しているかどうかもコマンドで確認できます。

もし起動コマンドを2連続で打っても1回しか起動しませんので安心してください。

この記事で解説していないこと

  • マイクラ鯖の構築方法

サーバー起動シェルスクリプト作成

みなさんが普段入力しているサーバーの起動コマンドがあると思いますので、コマンドを記述したシェルスクリプトファイルを作成します。
僕の場合のコマンド↓

java -Xms20G -Xmx20G -jar mohist-1.20.1-550-server.jar

以下にshファイルを記述しますが、ご自分のコマンドに適宜変えてください。
また、このshファイルは裏画面でCLIを起動し、コマンドを実行させています。
shファイルは普段起動コマンドを実行しているディレクトリに配置してください

shファイルは今回
"dsc_run.sh"
"dsc_status.sh"(サーバーが今起動しているか確認するよう)
"dsc_stop.sh"
の3つ作成します。

dsc_run.sh

#!/bin/bash

# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"

# 既にスクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
    echo "サーバーが既に起動しています。"
else
    # スクリーンセッションを作成してサーバーを開始
    screen -dmS $SESSION_NAME java -Xms20G -Xmx20G -jar mohist-1.20.1-550-server.jar
    sleep 10  # 10秒待つ
    echo "サーバーが起動しました。"
fi

dsc_status.sh

#!/bin/bash

# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"

# 既にスクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
    echo "サーバー:起動中"
else
    echo "サーバー:停止中"
fi

dsc_stop.sh

#!/bin/bash

# スクリーンセッションの名前を定義
SESSION_NAME="minecraft_server"

# スクリーンセッションが存在するか確認
if screen -list | grep -q "\.$SESSION_NAME"; then
    # サーバーを停止する
    screen -S $SESSION_NAME -p 0 -X stuff "stop$(printf \\r)"
    sleep 10  # 10秒待つ
    # スクリーンセッションを終了
    #screen -S $SESSION_NAME -X quit
    echo "サーバーが停止しました。"
else
    echo "サーバーは起動していません。"
fi

ディスコードBOT作成

コマンドが来たとき、上で作成したshファイルを実行するようにBOTを動かしているpythonファイルを書き換えます。
作成まではここで解説されています。

dir_pathにはshファイルがあるディレクトリのパスを記述してください
async def on_messageの中のif分岐を追加

import os
import subprocess

dir_path = "YOUR PATH" #shファイルのパスを記述

#メッセージ受信で起動する関数
@client.event
async def on_message(message):
  try:
  
    if message.content.startswith('!micra_run'):
      await message.channel.send('マイクラサーバー起動中・・・')
      # シェルスクリプトを実行し、標準出力を受け取る
      result = subprocess.run(f'cd {dir_path} && ./dsc_run.sh', shell=True, capture_output=True, text=True)
      await message.channel.send(result.stdout)
      
    if message.content.startswith('!micra_stop'):
      await message.channel.send('マイクラサーバー停止中・・・')
      result2 = subprocess.run(f'cd {dir_path} && ./dsc_stop.sh', shell=True, capture_output=True, text=True)
      await message.channel.send(result2.stdout)
      
    if message.content.startswith('!micra_status'):
      result3 = subprocess.run(f'cd {dir_path} && ./dsc_status.sh', shell=True, capture_output=True, text=True)
      await message.channel.send(result3.stdout)

今回はコマンドを!micra_runのようにしています。

ディスコードからコマンド入力

ディスコードBOTを起動させて以下のコマンドを実行しました

スクリーンショット 2024-04-01 033434.png

おわりに

クラウドが主流になりつつある現代で24時間PCを起動させてる人少ないと思いますが(僕はPCが余っていたのでローカルでやっています)、これでディスコード鯖にいる人なら誰でもマイクラを起動させることが出来るようになりました。友達とやるくらいなら使えるんじゃないかと思います。

2
1
0

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
2
1