Discord Botで時間制限でロールを付与する方法


はじめに

Discordサーバーで特定の期間だけユーザーにロールを付与し、期間が終わったら自動でロールを削除するボットを作成する方法を解説します。このコードでは、Pythonを使って、特定の日付にロールdiscord.pyをを削除する機能を実装しています。


準備

必要なライブラリ

  • discord.py: Discord Botを開発するためのライブラリ

    1. バッシュ

機能概要

  • ロール付与コマンド: 特定のユーザーに一定期間ロールを付与します。

  • 自動ロール削除: 設定した日にロールを自動で削除します。

  • データ保存: JSON形式でデータを保存し、ボットが再起動しても設定が持続します。


コード詳細

以下にコードを詳しく解説します。


1. 基本設定

import datetime
from discord.ext import commands, tasks
import discord
import json

各ライブラリの役割

  • datetime : 日付と時間を操作するために使用します。

  • discord.ext.commands : ボットコマンドやイベントを実装するための拡張機能。

  • task : 定期的な処理を行うタスクの実行に使用します。

  • json : ロール付与データの永続化に使用します。

JSTタイムゾーン設定

jst = datetime.timezone(datetime.timedelta(hours=9), 'JST')

日本標準時(JST)を設定しています。


2. ボットの基本設定

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
tree = bot.tree
  • command_prefix : コマンドの接頭辞を「!」に設定します。

  • インテント: サーバー内のメンバーやメッセージなどにアクセスするための権限設定。


3. データの読み込み

try:
    data = json.loads(open("data.json","r",encoding="utf_8").read())
except:
    data = []
  • data.json : 付与されたロールの情報を保持するファイル。

  • ファイルが存在しない場合は空のリストを初期化します。


4. 定期処理のタスク設定

@tasks.loop(time=time)
async def day_change():
    await remove_role()

定期タスク

毎日0時(日本時間)に実行されるタスクロール定義をしています。remove_role関数を投稿して、削除日が入ったを削除します。


5. ロール削除処理

async def remove_role():
    date = datetime.datetime.now(jst)
    date = "{}-{}-{}".format(date.year, date.month, date.day)
    for d in data:
        d = d.split(":")
        if d[0] == date:
            guild = bot.get_guild(int(d[1]))
            member = await guild.fetch_member(int(d[2]))
            await member.remove_roles(guild.get_role(int(d[3])))
        data.remove(d)
    save_data()


処理の流れ

  1. 現在の日付を取得してYYYY-MM-DD形式にフォーマット。

  2. dataリストに保存された各エントリ(date:guild_id:member_id:role_id)をチェック。

  3. 日付が一致した個別に、該当するサーバー、メンバー、ロールを特定して削除。

  4. 削除後、エントリをからdata削除


6. データ保存

def save_data():
    open("data.json","w",encoding="utf_8").write(json.dumps(data))
  • save_data関数:dataリストを`data.jsonに書き込み


7.ボット起動時の処理

@bot.event
async def on_ready():
    await remove_role()
    day_change.start()
    await tree.sync()

処理内容

  • ボット起動時にremove_role一度実行して、再起動中に期限が過ぎたロールを削除。

  • 定期的なタスクday_changeを開始します。

  • アプリケーションコマンド(tree.command)を同期します。


8. ロール付与コマンド

@tree.command(name="role", description="一定期間ロールを付与します")
async def role(interaction, member:discord.Member, role:discord.Role, amount:int):
    if not amount:
        await interaction.response.send_message("amountは1日以上でないといけません", ephemeral=True)
        return
    await member.add_roles(role)
    date = datetime.datetime.now(jst) + datetime.timedelta(days=amount)
    await interaction.response.send_message("{}-{}-{}に<@{}>の<@&{}>を剥奪します".format(date.year, date.month, date.day, member.id, role.id), ephemeral=True)
    data.append("{}-{}-{}:{}:{}:{}".format(date.year, date.month, date.day, interaction.guild.id, member.id, role.id))
    save_data()

コマンドの動作

  1. 引数の説明

    • member:ロールを付与するユーザー。

    • role: 付与するロール。

    • amount: ロールを保持する日。

  2. 動作フロー

    • 入力されたamountが0以下の場合、エラーメッセージを返します。

    • ユーザーに指定されたロールを付与。

    • 削除予定日を計算してメッセージを送信。

    • dataリストにロール付与情報を追加して保存します。


9. ボットの起動

bot.run("token")
  • "token" : ボットの場合をここに入力します。

  • このコードでボットが実際にDiscordサーバーに接続します。


おわりに

このコードを利用することで、特定の期間だけユーザーにロールを付与する機能を簡単に実現できます。Discordサーバーでの管理がさらにスムーズになるので、ぜひ導入してみてください!

また、この記事を参考に自分でコードをカスタマイズして、さらに便利な機能を追加してみるのもおすすめです!

全コード

ここから先は

1,721字

¥ 300

PayPay
PayPayで支払うと抽選でお得 〜1/7まで
ポイント
抽選でnoteポイント最大100%還元 〜1/9まで

この記事が気に入ったらチップで応援してみませんか?