見出し画像

discord.pyでBotを作ったのでわかりやすく解説しようと思う。 [Part.3]

こんばんは、今日もお疲れさまです。

前回はボタン(buttons)を使用して関数を実行させたり、任意のWebサイトに遷移する方法を学びました。
今回は、discord Bot標準で備わっているhelp機能をオリジナルのものにしていきたいと思います。



完成形



仕組み

今回は'Embed'を使用しています。(埋め込みドキュメントとも言う)前回ボタンの上に出てたやつですね。
これは基本的にBotにしか使えません。
要素について詳しく言っていきましょう。

『ヘルプ機能』がタイトルとか『コマンドの説明…』が詳細というのは別にどうでも良くて大事なのは赤枠で囲ってあるものですね。

field

#inline=True
embed.add_field(name="!hello", value="こんにちは。と返事する。", inline=True)
#inline=False
embed.add_field(name="!Support", value="管理人にサポートメッセージを送る(DM)", inline=False)

重要なのは後半の'inline'の部分で、もし横に同じfield要素が入りそうなら入れるという事ができます(多分最大3つ)。上記だとField要素が3つ並べているので
『朝の天気/降水確率』,『昼の天気/降水確率』,『夜の天気/降水確率』みたいなことを並べたりすることも可能です。実用的かどうかはおいといて。
私はチャット内で普通に使うものはinline=Trueにして管理関係はinline=Falseにしました。あとはバランス。



image

fname="help.png" # アップロードするときのファイル名 自由に決めて良いですが、拡張子を忘れないように
file = discord.File(fp="img/help.png",filename=fname,spoiler=False) # ローカル画像からFileオブジェクトを作成
embed.set_image(url=f"attachment://{fname}") # embedに画像を埋め込むときのURLはattachment://ファイル名
await message.channel.send(file=file, embed=embed) # ファイルとembedを両方添えて送信する

基本こういうのってネットから拾ってきたものとかになるんですけど、レスポンス的に表示が遅れると気持ち悪いなって思ったのでローカル画像を使いました、感覚としてはhtmlのimg srcに近い。
色々調べた結果この形になった。1行目なくてもいいけど複数箇所で使うってなった時に1,2行目直せば良いのでいっかなって思ってる。あれでも1行目消したら見るところ変わらないか。
4行目のfile=fileで画像出力します。

それはそうなんですけど、ローカル画像ということはdiscord.pyと同じ階層に置かないと行けないわけで、part1のファイル階層にimgがあるはずなので真似してください。





コード全体像

@bot.command()
async def help(message):
    if message.author.bot: #botからのメッセージじゃないか?
        return
    else:
        embed=discord.Embed(title="ヘルプ機能", description="コマンドの説明。最初に『!』をつけてください。", color=0xff9300)
        embed.add_field(name="!hello", value="こんにちは。と返事する。", inline=True)
        embed.add_field(name="!site", value="『シャニマス公式』などへのリンクを表示する。", inline=True)
        embed.add_field(name="!mkch", value="同カテゴリにテキストチャンネルを作成する。", inline=True)
        embed.add_field(name="!Support", value="管理人にサポートメッセージを送る(DM)", inline=False)
        embed.add_field(name="!cleanup (※管理人のみ)", value="テキストチャンネルのメッセージをすべて消す", inline=False)
        fname="help.png" # アップロードするときのファイル名 自由に決めて良いですが、拡張子を忘れないように
        file = discord.File(fp="img/help.png",filename=fname,spoiler=False) # ローカル画像からFileオブジェクトを作成
        embed.set_image(url=f"attachment://{fname}") # embedに画像を埋め込むときのURLはattachment://ファイル名
        await message.channel.send(file=file, embed=embed) # ファイルとembedを両方添えて送信する



いかがでしたか?ローカル画像を表示する方法としても使えると思います。



#Support 出来なかったら?分からなかったら?

Twitter: あまみ / AMAMI
discord: あまみ / AMAMI#0398

に出来ないところとかをスクショしたりして送ってくれれば答えます。


もし満足いただけたらサポートの方、お願いします! いただいたサポートは今後の活動を支える重要な資産になります!