discord.pyでPython初心者がbotを作った話
自己紹介
こんにちはてぃあーと申します。
端的に述べますと私はPython初心者です。※学校の授業で少し触った程度
今回紹介するBOTは、いろんなサイトやDiscord.pyのドキュメントを参考にコードを書いたのとネットの友達に手伝ってもらったものです。
ほんと今の時代ググれば何でも出てきて便利ですね…
実行(運用)環境と使ってるソフト
Raspberry pi 3 model B
python 3.9.6(ラズパイ)
python 3.12.4(Windows)
たくさんのモジュール(何入れたかわかってない)
WinSCP(Winとラズパイ間のファイル共有)
コードについて
一部抜粋して紹介します。
全体のコードや質問あれば気軽にどうぞ。答えられる範囲で答えます。
身内鯖のためのBOT
BOTについて
BOTが導入されている鯖はれまたっぴ鯖(@rematapisabades)という鯖で、メンバーは15人前後。コマンドの一部は鯖メンバーのざこばな(@zakosandesita)に協力してもらいました。
最初は身内鯖で配信をするときの通知やゲーム時のサポートのために作成しました。今となってはジョークbotのようなものになってますが…
BOTの機能
今使われている主な機能としては、メンバーの名(謎)言を貼るコマンドや、メンバーの絵文字でスロットをするなどがあげられます。
メンバーの名(謎)言を貼るコマンド(meigen)
@bot.command(pass_context=True, name='meigen', help='ランダムに今日の名言を送信します')
async def meigen(ctx):
meigenall = glob.glob("[画像が格納されているディレクトリパス]/*")
meigenimg = random.choice(meigenall)
await ctx.reply('あなたの今日の名言は…',file=discord.File(meigenimg))
名言を貼ると言っても、開発初期に開発したものなのでコードは簡単なもの。
身内鯖は何か名(謎)言が出たら一時期Twitterで使われてたMake it a QuoteのDiscord版botで画像を生成して#名言というチャンネルに貼る文化(?)があります。
ということでチャンネルの画像を全てダウンロードして使うことにしました。
別のLINEグループにある鯖メンバーがアルバムを作ってまとめてくれていたのでそれを全てダウンロード。
WinSCPを使ってラズパイに新規ディレクトリを作成、画像を全て転送しました。
コマンドを認識したらこのディレクトリ内の画像がランダムで送信されるって寸法です。
メンバーの絵文字でスロット(okslot)
@bot.command(name='okslot', help='おかずの絵文字でスロットをします)
async def okslot(ctx):
okaemo = ['<emoji1>',
'<emoji2>',
'<emoji3>',
'<emoji4>',
'<emoji5>',
'<emoji6>',
'<emoji7>',
'<emoji8>']
#絵文字のリストから3つランダムに選ぶ(重複あり)
resemo = random.choices(okaemo, k=3)
#選んだ3つをjoinで連結する(結果に[]など入れないようにするため)
slotemo = ''.join(resemo)
#すべて同じ絵文字の場合
if all(val == resemo[0] for val in resemo):
result = '大当たり!'
#ノーマルプロマイドをフォルダ内からすべて取得
proall = glob.glob("[ノーマルプロマイドのディレクトリ]/*")
#取得したプロマイドからランダムに一つ選ぶ
proimg = random.choice(proall)
#10%の確率でシークレットを排出する
if random.random() < 0.1:
proimg = "[シークレットのディレクトリ]/ok_secret.jpg"
#DMに排出プロマイドを通知
promidename = proimg.replace('[プロマイドのディレクトリ]/', '')
target_user_ID = [ユーザーID] #ユーザーIDを指定
target_user = await bot.fetch_user(target_user_ID)
if target_user:
dm_channel = await target_user.create_dm() #DMを作成
await dm_channel.send(f'{promidename}が排出されました!') #排出されたファイル名をDMに送信
#コマンド送信者のDMにプロマイドとメッセージを送信
await ctx.author.send('おめでとう!', file=discord.File(proimg))
#すべて同じ絵文字ではない場合
else:
result = 'はずれ…'
await ctx.reply(f'{slotemo}\n{result}')#ランダムに選んだ絵文字3つとスロット結果を返信
おかず(@Ozuya0812)が提供してくれた絵文字のリストから3つランダムで重複有りで選んで送信してスロットっぽくしてます。
当たったときは同じくおかずから提供されたオリジナル画像を当てた人のDMに送信、合わせて何が排出されたか私にDMするようにしてます。
これを作る上で起きた問題としては、コマンド動作時に■,■,■(■は絵文字)と「,」が挟まれた状態で出力されてしまうことで、これはjoinを使って連結させることで解決しました(多分リストのまま出力したせいかも)。
自分の鯖のためのBOT
BOTについて
導入されている鯖は私のDiscord鯖です。
私は普段ロゴやサムネイルなどを作っているド底辺デザイナーで、依頼を受ける上で価格や注意点など見やすくしたいと考え、れまたっぴ鯖のBOTのコードを元にBOTを開発することに決めました。
私の鯖はメンバー募集中で、メンバーは現時点で10~20人程度。
主に私の依頼用ですが、ゲーム募集をすることも可能です。
サムネイルの素材なども無償で配布する予定ですので良ければご参加ください。
BOTの機能
Botだけにできる特別な機能のEmbedを使って、下の画像のように料金表の表示等が可能となっています。
なお、こういったコマンドはID指定で自分の本垢とサブ垢のみ使えるようにしているので、本当に専属という感じです。
Embedについて
やはりいろいろなことができて便利というのが感想です。
メッセージごとに左のバーの色を変えたり画像の指定やリンクに飛べる埋め込み等できることが数多く助かっています。
自分の場合embedを使用する場合ctxではなくmessageでコードを書くようにしています(いろんなサイト見てmessageに落ち着きました)。
最後に
私がBOT開発、運用を行えたのはやはりいろいろな情報がネット上にあったのが大きいと思います。開発に行き詰まったときは色んな情報に目を通すことが一番なのかなと感じます…
この記事がほんの少しでも多くの目に触れて誰か1人でも助けになればいいなと思います。
最後まで読んでくださりありがとうございました。