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

# 初めに
discord.py を使ったKick, BAN, UnBAN機能の作り方です。
できればコピペではなく参考程度に見てください。

本記事に書いてあることで分からない所があれば質問してください。答えられる範囲で回答します。

python 3.8.3
discord.py 1.3.4

# 本記事の基本

```py
import discord

client = discord.Client()

# ここに記述

client.run("token")
```

# 本題
### Kick

Kickでいろいろと分解して説明していきます。

ユーザーをキックするのは

```py
await user.kick(reason=None)
```

でできます。[リファレンスより](https://discordpy.readthedocs.io/en/latest/api.html#discord.Member)
ただ、先に「user」を指定する必要があるのでそのコードを組みましょう。

```py
@client.event
async def on_message(message):
    if message.content.startswith("/kick"):
        args = message.content.split()
```

今回ユーザーを指定する必要があるため

```py
if message.content == "":
```

ではなく

```py
if message.content.startswith(""):
```

を使用します。
これはメッセージの始まりが一致していたら処理を行うif文となっています。

次に

```py
args = message.content.split()
```

ですがメッセージを空白で区切ったリスト(?)を定義するコードです。
argsを出力するようにして以下のように送信するとこう出力されます。

```py
/kick Reply

>>> ["/kick", "Reply"]
```

これを使用してユーザー名を取得します。

指定したユーザー名からのユーザーの取得ですが、[discord.utils.get](https://discordpy.readthedocs.io/en/latest/api.html#discord.utils.get)を使います。

```py
@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])
```

これでコマンドを実行してからユーザーを取得までできました。
最後にユーザーをキックするコードを加えて完了です。

```py
@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()
```

はい。完成しました。
これで一応動作しますが、分かりにくいので実行した後のメッセージやなどを装飾していきましょう。

```py
@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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487126/a8546cee-542a-a92a-e027-127f36a543d5.png)

こうなります。

### BAN
Kickでいろいろ説明したのでそれをもとにBANも組んでいます。

```py
@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は

```py
await user.kick()
```

を

```py
await user.ban()
```

に変えるだけでBANになります。

### UnBAN
UnBANは```message.guild.members```で取得できないため

```py
user = discord.utils.find(lambda banentry: args[1] == banentry.user.name, await message.guild.bans()).user
```

を使用します。

```py
@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](https://discord.gg/FWw6VqQ) BOTの開発者が集まるサーバー
[discord.py](https://discord.gg/nXzj3dg) discord.py公式サーバー
[discord.py Unofficial JP](https://discord.gg/KPp2Wsu) discord.py非公式日本サーバー
[pythonjp](https://discord.gg/z2rTA3u) python専門サーバー