3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DiscordからPalworldのサーバ状況を確認して操作できるbotを作る

Last updated at Posted at 2024-01-28

はじめに

 最近 Palworld 流行っていますね。私事ですが、最近自宅鯖を使って色々と勉強していました。そんな中サーバと建てて色々と遊べるゲームということで、勉強がてら友人間で遊ぶためのサーバを立てました。しかし色々と問題が出ています。

課題

課題に対する方策

(NG)定期再起動を仕込む

 これでメモリリークの問題は解決することができますが、少人数(3~5人)のサーバですので、しばらくログインしないパターンもあります。そのため、2つ目の問題が回避できませんでした。

(NG)使うときに連絡してもらって起動する

 それ誰かがホストしたら良くない?

(NG)めっちゃメモリ積む

 そもそも推奨メモリでやりなさいよ(スペックは下記)って話ではありますが、少人数なので許してください。
 今回は自宅鯖ですが、VPSだったらすごい値段になるので、他の手を考えてみたい。

(採用)discordからサーバ起動/停止をすることができるようにする

 せや!Discordからコマンドを打って、サーバの起動状況の確認、再起動ができるようにしたらええやん!

実際の動作

  • Status
    image.png
  • Start
    image.png
  • Stop
    image.png
  • Restart
    image.png

スペック

スペック 備考
OS Ubuntu23.04 Proxmox上で起動
CPU Intel N100(4 vCPU)
Memory 12 GB SWAP 16GB

前提条件

簡単な仕様説明

お願い

急いで作った + pythonが書けないため、エラー処理など甘いです。
よりスマートなコードをお待ちしております。

多人数のサーバを操作する場合は誰かが勝手に落としてしまうなどのいたずらがある可能性も考えられます。
十分に注意して実装ください。

ソース

import discord
from discord.ext import commands
import subprocess

# init
TOKEN = '[BOTのトークン]'
Intents = discord.Intents.default()
Intents.message_content = True

bot = discord.Bot(intents=Intents)

#
# main
#
class StopView(discord.ui.View):
    def __init__(self, timeout=10):
        super().__init__(timeout=timeout)
    
    @discord.ui.button(label="YES", style=discord.ButtonStyle.success)
    async def ok(self, button: discord.ui.Button, interaction: discord.Interaction):
        command = 'sudo -A systemctl stop palworld-dedicated.service'
        result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, text=True)
        await interaction.response.send_message(f"{interaction.user.mention} Server is stoped.")
class RestartView(discord.ui.View):
    def __init__(self, timeout=10):
        super().__init__(timeout=timeout)
    
    @discord.ui.button(label="YES", style=discord.ButtonStyle.success)
    async def ok(self, button: discord.ui.Button, interaction: discord.Interaction):
        command = 'sudo -A systemctl restart palworld-dedicated.service'
        result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, text=True)
        await interaction.response.send_message(f"{interaction.user.mention} Server is restarted.")

@bot.event
async def on_ready():
    print("on_ready")
    print(discord.__version__)

@bot.command(name="status", description="Check PalWorld Status")
async def status(ctx: discord.ApplicationContext):
    await ctx.response.defer()
    command = 'sudo -A systemctl status palworld-dedicated.service  | grep Active:'
    result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, text=True)
    await ctx.followup.send(result.stdout)
 
@bot.command(name="start", description="Start PalWorld Server")
async def start(ctx: discord.ApplicationContext):
    await ctx.response.defer()
    command = 'sudo -A systemctl start palworld-dedicated.service'
    result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, text=True)
    await ctx.followup.send("Start PalWorld Server.")
 
@bot.command(name="stop", description="Stop PalWorld Server")
async def restart(ctx: discord.ApplicationContext):
    await ctx.response.defer()
    await ctx.followup.send('Do you really want to stop Palworld server?[y/n]')
    view = StopView(timeout=None)
    await ctx.channel.send(view=view)
 
@bot.command(name="restart", description="Restart PalWorld Server")
async def restart(ctx: discord.ApplicationContext):
    await ctx.response.defer()
    await ctx.followup.send('Do you really want to restart Palworld server?[y/n]')
    view = RestartView(timeout=None)
    await ctx.channel.send(view=view)
    
bot.run(TOKEN)

まとめ

  • 現状のメモリリークとチャンクの読み込みの仕様をクリアするために、少人数のサーバをdiscord経由で利用者が確認、起動/終了できるようにしました。
  • 現状3人しか使わないので目的は達成できて満足ですが、ソースの改修や追加機能の提案などお待ちしています。
3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?