Discord.pyの備忘録その2(1.3.2対応版)

その2です。
前回はBOTに喋らせる所をやったので
少しずつ応用的な何かをさせていこうかと?

前回のおさらいはこちら。

BOTを停止させる

Discord上からBOTを停止させるプログラムを仕込みたい場合はこれ。

await client.logout()

管理者が特定のワードを発言した時のみ
効力を発揮するようにしておくと安全です。

import discord
client = discord.Client()
@client.event
async def on_message(message):
    if "!stop" in message.content:
        if message.author.id == 管理者のユーザーID:
            await message.channel.send("ばいばーい!")
            await client.logout()
        else:
            await message.channel.send("管理者専用コマンドだよ!")

client.run("TOKEN")

ユーザーIDを取得するには、対象ユーザーを右クリックして
「IDをコピー」すればOKです。
※要開発者モード

指定した管理者が発言した場合はこんな感じになります。

そのほかの人が発言するとこんな感じ

認証してるユーザーIDを外してテストしてるので、
見た目がややこしいですが指定したID以外の人が発言すると
しっかり動いています。

実用性を考えると、IDで判別してからSTOPコマンドを
検知する方がコードを短く出来そう。
管理者以外がコマンドを送った場合は無視する感じで。

import discord
client = discord.Client()
@client.event
async def on_message(message):
    if message.author.id == 管理者のユーザーID:
        if "!stop" in message.content:
            await message.channel.send("ばいばーい!")
            await client.logout()


client.run("TOKEN")

ロール(権限)でBOT管理者を定める

前準備として、サーバー内に管理者専用のロールを作成しておきます。
名前は自分がわかりやすい感じでOK!

次のコードで各種ロールを取得することが出来ます。
※BOTの権限以下のものが取得可能。

#発言のあったサーバー内のロールを取得する
message.guild.roles

#発言者のロールを取得する
message.author.roles

これを組み合わせて、ロールでBOT管理者を決めることができます。

@client.event
async def on_message(message):
    if "BOT管理者" in [users_role.name for users_role in message.author.roles]:
        if "!stop" in message.content:
            await message.channel.send("ばいばーい!")
            await client.logout()
    else:
        await message.channel.send("管理者専用コマンドだよ!")

上が管理者権限無し、下が管理者権限有りの動作です。

また、ロールのIDで管理することも可能です。
コメント打っておかないと可読性が悪そうなので名前管理の方が楽です。

@client.event
async def on_message(message):
    if ロールID in [users_role.id for users_role in message.author.roles]:
        if "!stop" in message.content:
            await message.channel.send("ばいばーい!")
            await client.logout()
    else:
        await message.channel.send("管理者専用コマンドだよ!")

ロールのIDはサーバー設定を開いて、目的のロールを右クリックで取得可能です。
※要開発者モード


ランダムな単語を発言させる

話しかけた言葉に対して、1種類の返答だけだと寂しいので
いくつかバリエーションが欲しくなりますね?

シンプルに実装するならrandom.choiceが楽ちんでした。


word_list = ["単語A","単語B","単語C",・・・・]
await message.channel.send(random.choice(word_list))

random.choiceを使うにはrandomライブラリが
必要なのでインポートしておきます。

#randomライブラリをインポート
import random

random.choiceは配列の中からランダムで一つ選んで抜き出してくれます。
これを使えば、複数の単語からランダムで発言させる事が出来ます。

import discord
import random

client = discord.Client()

@client.event
async def on_message(message):
    if "!じゃんけん" in message.content:
        word_list = ["グー","チョキ","パー"]
        await message.channel.send(random.choice(word_list))

client.run("TOKEN")

疑似乱数による抽選なので完全ランダムとは行きませんが・・・

5000回の試行結果はこんな感じで
パーが微妙に多かったですが、おおよそ均等と言えるでしょう。

用途が用途なので、そこまで正確なものは求めませんしね・・・?

ということで、今日はここまで!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です