初めに
discord.py を使ったKick, BAN, UnBAN機能の作り方です。
できればコピペではなく参考程度に見てください。
本記事に書いてあることで分からない所があれば質問してください。答えられる範囲で回答します。
python 3.8.3
discord.py 1.3.4
本記事の基本
import discord
client = discord.Client()
# ここに記述
client.run("token")
本題
Kick
Kickでいろいろと分解して説明していきます。
ユーザーをキックするのは
await user.kick(reason=None)
でできます。リファレンスより
ただ、先に「user」を指定する必要があるのでそのコードを組みましょう。
@client.event
async def on_message(message):
if message.content.startswith("/kick"):
args = message.content.split()
今回ユーザーを指定する必要があるため
if message.content == "":
ではなく
if message.content.startswith(""):
を使用します。
これはメッセージの始まりが一致していたら処理を行うif文となっています。
次に
args = message.content.split()
ですがメッセージを空白で区切ったリスト(?)を定義するコードです。
argsを出力するようにして以下のように送信するとこう出力されます。
/kick Reply
>>> ["/kick", "Reply"]
これを使用してユーザー名を取得します。
指定したユーザー名からのユーザーの取得ですが、discord.utils.getを使います。
@client.event
async def on_message(message):
if message.content.startswith("/kick"):
args = message.content.split()
user = discord.utils.get(message.guild.members, name=args[1])
これでコマンドを実行してからユーザーを取得までできました。
最後にユーザーをキックするコードを加えて完了です。
@client.event
async def on_message(message):
if message.content.startswith("/kick"):
args = message.content.split()
user = discord.utils.get(message.guild.members, name=args[1])
await user.kick()
はい。完成しました。
これで一応動作しますが、分かりにくいので実行した後のメッセージやなどを装飾していきましょう。
@client.event
async def on_message(message):
if message.content.startswith("/kick"):
args = message.content.split()
user = discord.utils.get(message.guild.members, name=args[1])
await user.kick()
embed=discord.Embed(title="キックが正常に実行されました", color=0xff0000)
embed.set_thumbnail(url=user.avatar_url)
embed.add_field(name="対象", value=user, inline=False)
embed.add_field(name="実行", value=message.author, inline=False)
await message.channel.send(embed=embed)
こうすると
こうなります。
BAN
Kickでいろいろ説明したのでそれをもとにBANも組んでいます。
@client.event
async def on_message(message):
if message.content.startswith("/ban"):
args = message.content.split()
user = discord.utils.get(message.guild.members, name=args[1])
await user.ban()
embed=discord.Embed(title="BANが正常に実行されました", color=0xff0000)
embed.set_thumbnail(url=user.avatar_url)
embed.add_field(name="対象", value=user, inline=False)
embed.add_field(name="実行", value=message.author, inline=False)
await message.channel.send(embed=embed)
BANは
await user.kick()
を
await user.ban()
に変えるだけでBANになります。
UnBAN
UnBANはmessage.guild.members
で取得できないため
user = discord.utils.find(lambda banentry: args[1] == banentry.user.name, await message.guild.bans()).user
を使用します。
@client.event
async def on_message(message):
if message.content.startswith("/unban"):
args = message.content.split()
user = discord.utils.find(lambda banentry: args[1] == banentry.user.name, await message.guild.bans()).user
await user.unban()
embed=discord.Embed(title="BANを解除しました", color=0xff0000)
embed.set_thumbnail(url=user.avatar_url)
embed.add_field(name="対象", value=user, inline=False)
embed.add_field(name="実行", value=message.author, inline=False)
await message.channel.send(embed=embed)
これで、ユーザをUnBANできます。
最後に
embedですが私は語彙力がないのでこのような文章になりますが、必要に応じて変えてもらうと大丈夫です。
Discord BOT Portal JP BOTの開発者が集まるサーバー
discord.py discord.py公式サーバー
discord.py Unofficial JP discord.py非公式日本サーバー
pythonjp python専門サーバー