6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

discord.pyで Kick, BAN, UnBAN を作る

Last updated at Posted at 2020-08-02

初めに

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)

こうすると

fd.png

こうなります。

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専門サーバー

6
7
9

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
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?