Discord Botで時間制限でロールを付与する方法
はじめに
Discordサーバーで特定の期間だけユーザーにロールを付与し、期間が終わったら自動でロールを削除するボットを作成する方法を解説します。このコードでは、Pythonを使って、特定の日付にロールdiscord.pyをを削除する機能を実装しています。
準備
必要なライブラリ
discord.py: Discord Botを開発するためのライブラリ
バッシュ
機能概要
ロール付与コマンド: 特定のユーザーに一定期間ロールを付与します。
自動ロール削除: 設定した日にロールを自動で削除します。
データ保存: 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()
処理の流れ
現在の日付を取得してYYYY-MM-DD形式にフォーマット。
dataリストに保存された各エントリ(date:guild_id:member_id:role_id)をチェック。
日付が一致した個別に、該当するサーバー、メンバー、ロールを特定して削除。
削除後、エントリをから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()
コマンドの動作
引数の説明
member:ロールを付与するユーザー。
role: 付与するロール。
amount: ロールを保持する日。
動作フロー
入力されたamountが0以下の場合、エラーメッセージを返します。
ユーザーに指定されたロールを付与。
削除予定日を計算してメッセージを送信。
dataリストにロール付与情報を追加して保存します。
9. ボットの起動
bot.run("token")
"token" : ボットの場合をここに入力します。
このコードでボットが実際にDiscordサーバーに接続します。
おわりに
このコードを利用することで、特定の期間だけユーザーにロールを付与する機能を簡単に実現できます。Discordサーバーでの管理がさらにスムーズになるので、ぜひ導入してみてください!
また、この記事を参考に自分でコードをカスタマイズして、さらに便利な機能を追加してみるのもおすすめです!
全コード
ここから先は
¥ 300
この記事が気に入ったらチップで応援してみませんか?