モンハン玄人向けのdiscord botを作ってみた

#はじめに
記録用です．モンスターハンターっていいゲームですよね．愛．
HRカンスト界隈ではとても需要がある機能に仕上がったと思います．

ただ，個人のお楽しみ目的での作成のためコードはあまりきれいではありません．当初の予定よりも機能を増やしてしまった結果、配列が見にくくなってしまいました．ご了承ください．

#目次
[1. 前提知識と作るきっかけ](#1-前提知識と作るきっかけ)
[2. botの機能](#2-botの機能)
[3. 実際の動作の様子](#3-実際の動作の様子)
[4. コード](#4-コード)
[5. 感想](#5-感想)

#1. 前提知識と作るきっかけ
**モンハン**とは簡潔に言うと狩りをするゲームである。今までゲームはあまりやってこなかったが、コロナ過で友達に誘われて狩りに手を出してしまった私はあっという間にHRをカンストした。

だが、ここで幸せな狩り生活を送っていた私にじわじわとある問題が迫ってくる。
恐らくどのゲームにも言えることだが、やり込みすぎるとゲーム内で**やることが無くなってくる**のである。

友人と遊んでも何を狩りに行こうか悩んだり、何の武器を使おうか悩んだり、、、、、

**ん、、、？**
**そうだ！！**

***ランダムで武器とかモンスターとかスタイル[^1]とか返してくれるbot作ればいいのでは！？***

そういうわけで本作品に登場する14種類の武器、93匹の大型モンスター、6種類のスタイルを特定のコマンドを入力するとランダムでひとつ返してくれる botを作成した。

#2. botの機能
当botには以下の機能を持たせた。

| 発言内容| ランダムで1つ返すものの内容|
|:-:|:-:|
|｢モンスター｣|全ての大型モンスターのうちの1匹|
|｢武器｣|全ての武器種のうちのひとつ|
|｢スタイル｣|全てのスタイルのうちのひとつ|
|｢武器とスタイル｣|武器とスタイルを同時に返す
|｢やばいクエスト｣|個人の主観で選んだ難しいクエストのうちのひとつ

| 発言内容| ランダムじゃない内容とその他|
|:-:|:-:|
|｢にゃーん｣|｢にゃーん｣
｢アプデ｣|最近更新した内容を記載
|文中に｢レポート｣|レポートお疲れ様☕️
|文中に｢したくない｣｢やりたくない｣|労いの言葉: ランダムで3つ用意|
|文中に｢つかれた｣|｢お疲れ様！！！｣|

#3. 実際の動作の様子

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935940/f0c566dc-2210-d3a0-1e48-c68ad3dc269c.jpeg)

**やったね！**
これであまり使ったことない武器やスタイルも堪能できるぞ～！！:relaxed:

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935940/854357e9-99ca-f51f-5272-4df20409da46.jpeg)

***ムリゲー***

#4. コード
作成したコードを以下に記載する。

```python:random_bot.py
# MHXX bot 作成
import discord
import random as rm

token = 'hogehoge-hogohogo-hogegegege'

client = discord.Client()

# 武器種配列
w = ['大剣', '片手剣', '双剣', '太刀', 'ハンマー', '狩猟笛', 'ランス',
     'ガンランス', 'スラッシュアックス', 'チャージアックス', '操虫棍',
     '弓', 'ライトボウガン', 'ヘビィボウガン']

# スタイル配列
s = ['ギルド', 'ストライカー', 'エリアル', 'ブシドー', 'ブレイブ', 'レンキン']

# モンスター配列
m = ['イャンガルルガ', '隻眼イャンガルルガ', 'イャンクック', 'ゲリョス', 'ドスイーオス',
     'ドスギアノス', 'ドスゲネポス', 'ドスマッカォ', 'ドスランポス', 'ホロロホルル',
     '朧隠ホロロホルル', 'アルバトリオン', 'アマツマガツチ', 'オオナズチ', 'オストガロア',
     'キリン', 'クシャルダオラ', 'シャガルマガラ', 'テオ・テスカトル', 'バルファルク',
     'ラオシャンロン', 'ミラバルカン', 'ミラボレアス', 'ミラルーツ', 'アカムトルム',

     'ウカムルバス', 'グラビモス', 'セルレギオス', 'ティガレックス', '荒鉤爪ティガレックス',
     'ナルガクルガ', '白疾風ナルガクルガ', 'バサルモス', 'フルフル', 'ベリオロス',
     'ライゼクス', '青電主ライゼクス', 'リオレイア', 'リオレイア希少種', '紫毒姫リオレイア',
     'リオレウス', 'リオレウス希少種', '黒炎王リオレウス', 'ディアブロス', '鏖魔ディアブロス',
     'アオアシラ', '紅兜アオアシラ', 'ウルクスス', '大雪主ウルクスス', 'ガムート',

     '銀嶺ガムート', 'ケチャワチャ', 'ドスファンゴ', 'ドドブランゴ', 'ババコンガ',
     'ラージャン', '激昂したラージャン', 'ラングロトラ', 'アトラル・カ', 'アルセルタス',
     'ゲネル・セルタス', 'ジンオウガ', '金雷公ジンオウガ', 'ネルスキュラ', 'ザボアザギル',
     'テツカブラ', '岩穿テツカブラ', 'ガララアジャラ', 'イビルジョー', '怒り喰らうイビルジョー',
     'ウラガンキン', '宝纏ウラガンキン', 'ディノバルド', '燼滅刃ディノバルド', 'ドボルベルク',

     'ブラキディオス', '猛り爆ぜるブラキディオス', 'ボルボロス', 'ショウグンギザミ', '鎧裂ショウグンギザミ',
     'ダイミョウザザミ', '矛砕ダイミョウザザミ', 'アグナコトル', 'タマミツネ', '天眼タマミツネ',
     'ハプルボッカ', 'ラギアクルス', 'ロアルドロス', 'ヴォルガノス', 'ガノトトス',
     'ドスガレオス', 'ゴア・マガラ', '混沌に呻くゴア・マガラ']

# クエスト配列
q = ['「MHヒストリーⅠ」 (イベントクエスト 6/7)', '「MHヒストリーⅡ」 (イベントクエスト 6/7)', '「ドリフターズ・孤島の漂流者 1/7」',
     '「牙狼・闇に堕ちし呀」 (イベントクエスト 2/7)', '「夜空照らすは偽りの月陽」 (イベントクエスト 3/7)', '「飢え渇き生態を蹂躙す」 (イベントクエスト 3/7)',
     '「哭き呻くもの」 (イベントクエスト 4/7)', '「モンハン部・熱血昇段試験」 (イベントクエスト 2/7)', '「絶望の淵の溶岩島」 (イベントクエスト 4/7)',
     '「怒髪天を貫き何処へ往く」 (イベントクエスト 4/7)', '「天彗龍より姉御が怖いぜぃ！」 (イベントクエスト 4/7)', '「千夜一夜の太古の閣」 (イベントクエスト 4/7)',
     '「心を照らす畏怖の光」 (イベントクエスト 4/7)', '「ナイショの霞龍」 (イベントクエスト 4/7)', '「地底火山の炎の王」 (イベントクエスト 4/7)',

     '「奈落からの招待状」 (イベントクエスト 5/7)', '「覇竜との聖戦さ…」 (イベントクエスト 5/7)', '「古の白き神」 (イベントクエスト 5/7)',
     '「老山龍、侵攻中！」 (イベントクエスト 5/7)', '「煌黒はとこしえに」 (イベントクエスト 5/7)', '「黒き伝説との対峙」 (イベントクエスト 5/7)',
     '「伝説との戦い」 (イベントクエスト 5/7)', '「滅びの伝説に挑みし者」 (イベントクエスト 5/7)', '「USJ・霊峰に吹き荒れる嵐」 (イベントクエスト 2/7)',
     '「金と銀がもたらす悲哀」 (G4 8/10)', '「絆の証！ 闘技大会の大決戦」 (G4 7/10)', '「狩人達の究道」 (G4 7/10)',
     '「絆の証？ 雪山の獰猛大決戦」 (G4 7/10)', '「風薫る密林」 (G4 7/10)', '「狩魂よ砂中に眠れ」 (G4 6/10)',

     '「戦慄の遺群嶺」 (G4 6/10)', '「炎戈竜は地底で吠える」 (G4 5/10)', '「感動の生まれる瞬間」 (G4 3/10)',
     '「戈と槌は相容れず」 (G4 3/7)', '「【特殊許可】鏖魔狩猟依頼G4」', '「【特殊許可】鏖魔狩猟依頼G5」',
     '「【超特殊許可】鏖魔狩猟依頼」', '「【特殊許可】紅兜狩猟依頼G5」', '「【特殊許可】大雪主狩猟依頼G5」',
     '「【特殊許可】紫毒姫狩猟依頼G5」', '「【特殊許可】白疾風狩猟依頼G5」', '「【特殊許可】宝纏狩猟依頼G5」',
     '「【特殊許可】隻眼狩猟依頼G5」', '「【特殊許可】黒炎王狩猟依頼G5」', '「【特殊許可】金雷公狩猟依頼G5」',

     '「【特殊許可】荒鉤爪猟依頼G5」', '「【特殊許可】燼滅刃狩猟依頼G5」', '「【特殊許可】朧隠狩猟依頼G5」',
     '「【特殊許可】鎧裂狩猟依頼G5」', '「【特殊許可】天眼狩猟依頼G5」', '「【特殊許可】静電主狩猟依頼G5」',
     '「【特殊許可】銀嶺狩猟依頼G5」', '「【超特殊許可】紅兜狩猟依頼」', '「【超特殊許可】大雪主狩猟依頼」',
     '「【超特殊許可】矛砕狩猟依頼」', '「【超特殊許可】紫毒姫狩猟依頼」', '「【超特殊許可】岩穿狩猟依頼」',
     '「【超特殊許可】白疾風狩猟依頼」', '「【超特殊許可】宝纏狩猟依頼」', '「【超特殊許可】隻眼狩猟依頼」',

     '「【超特殊許可】黒炎王狩猟依頼」', '「【超特殊許可】金雷公狩猟依頼」', '「【超特殊許可】荒鉤爪狩猟依頼」',
     '「【超特殊許可】矛砕狩猟依頼」', '「【超特殊許可】紫毒姫狩猟依頼」', '「【超特殊許可】岩穿狩猟依頼」',
     '「【超特殊許可】燼滅刃狩猟依頼」', '「【超特殊許可】朧隠狩猟依頼」', '「【超特殊許可】鎧裂狩猟依頼」',
     '「【超特殊許可】天眼狩猟依頼」', '「【超特殊許可】静電主狩猟依頼」', '「【超特殊許可】銀嶺狩猟依頼」', ]

# クエスト配列2
q2 = ['「MHヒストリーⅠ」 (イベントクエスト 6/7)', '「MHヒストリーⅡ」 (イベントクエスト 6/7)', '「ドリフターズ・孤島の漂流者 1/7」',
      '「牙狼・闇に堕ちし呀」 (イベントクエスト 2/7)', '「夜空照らすは偽りの月陽」 (イベントクエスト 3/7)', '「飢え渇き生態を蹂躙す」 (イベントクエスト 3/7)',
      '「哭き呻くもの」 (イベントクエスト 4/7)', '「モンハン部・熱血昇段試験」 (イベントクエスト 2/7)', '「絶望の淵の溶岩島」 (イベントクエスト 4/7)',
      '「怒髪天を貫き何処へ往く」 (イベントクエスト 4/7)', '「天彗龍より姉御が怖いぜぃ！」 (イベントクエスト 4/7)',
      '「心を照らす畏怖の光」 (イベントクエスト 4/7)', '「ナイショの霞龍」 (イベントクエスト 4/7)', '「地底火山の炎の王」 (イベントクエスト 4/7)',

      '「金と銀がもたらす悲哀」 (G4 8/10)', '「絆の証！ 闘技大会の大決戦」 (G4 7/10)', '「狩人達の究道」 (G4 7/10)',
      '「絆の証？ 雪山の獰猛大決戦」 (G4 7/10)', '「風薫る密林」 (G4 7/10)', '「狩魂よ砂中に眠れ」 (G4 6/10)',

      '「戦慄の遺群嶺」 (G4 6/10)', '「炎戈竜は地底で吠える」 (G4 5/10)', '「感動の生まれる瞬間」 (G4 3/10)',
      '「戈と槌は相容れず」 (G4 3/7)', '「【特殊許可】鏖魔狩猟依頼G4」', '「【特殊許可】鏖魔狩猟依頼G5」',
      '「【超特殊許可】鏖魔狩猟依頼」', '「【特殊許可】紅兜狩猟依頼G5」', '「【特殊許可】大雪主狩猟依頼G5」',
      '「【特殊許可】紫毒姫狩猟依頼G5」', '「【特殊許可】白疾風狩猟依頼G5」', '「【特殊許可】宝纏狩猟依頼G5」',
      '「【特殊許可】隻眼狩猟依頼G5」', '「【特殊許可】黒炎王狩猟依頼G5」', '「【特殊許可】金雷公狩猟依頼G5」',

      '「【特殊許可】荒鉤爪猟依頼G5」', '「【特殊許可】燼滅刃狩猟依頼G5」', '「【特殊許可】朧隠狩猟依頼G5」',
      '「【特殊許可】鎧裂狩猟依頼G5」', '「【特殊許可】天眼狩猟依頼G5」', '「【特殊許可】静電主狩猟依頼G5」',
      '「【特殊許可】銀嶺狩猟依頼G5」', '「【超特殊許可】紅兜狩猟依頼」', '「【超特殊許可】大雪主狩猟依頼」',
      '「【超特殊許可】矛砕狩猟依頼」', '「【超特殊許可】紫毒姫狩猟依頼」', '「【超特殊許可】岩穿狩猟依頼」',
      '「【超特殊許可】白疾風狩猟依頼」', '「【超特殊許可】宝纏狩猟依頼」', '「【超特殊許可】隻眼狩猟依頼」',

      '「【超特殊許可】黒炎王狩猟依頼」', '「【超特殊許可】金雷公狩猟依頼」', '「【超特殊許可】荒鉤爪狩猟依頼」',
      '「【超特殊許可】矛砕狩猟依頼」', '「【超特殊許可】紫毒姫狩猟依頼」', '「【超特殊許可】岩穿狩猟依頼」',
      '「【超特殊許可】燼滅刃狩猟依頼」', '「【超特殊許可】朧隠狩猟依頼」', '「【超特殊許可】鎧裂狩猟依頼」',
      '「【超特殊許可】天眼狩猟依頼」', '「【超特殊許可】静電主狩猟依頼」', '「【超特殊許可】銀嶺狩猟依頼」', ]

# フルフル
q3 = ['閃きへの1ピースを求めて(G2)', '洞窟に潜む影(G2)', '氷河竜・ベリオロス！(G3)', '氷海の素晴らしい氷(G3)', '氷河竜が大発明のカギ？(G3)',
      '氷海の恐怖体験(G3)', '絆の証？雪山の獰猛大決戦(G4)', 'フルフル討伐(闘技大会)']

@client.event
async def on_ready():
    print('ログインしました！')


@client.event
async def on_message(message):
    # 他のbotの発言は無視する
    if message.author.bot:
        return

    # "武器"と入力されたらランダムで 武器 を返す
    if message.content == '武器':
        await message.channel.send('__' + str(w[rm.randint(0, 13)]) + '__')

    # "スタイル"と入力されたらランダムで 武器 を返す
    if message.content == 'スタイル':
        await message.channel.send('__' + str(s[rm.randint(0, 5)]) + '__')

    # "モンスター"と入力されたらランダムで モンスター を返す
    if message.content == 'モンスター':
        await message.channel.send('__' + str(m[rm.randint(0, 92)]) + '__')

    # "やばいクエスト"と入力されたらランダムで クエスト名 を返す
    if message.content == 'やばいクエスト2':
        await message.channel.send('> ' + str(q[rm.randint(0, 71)]))

    # "やばいクエスト！"と入力されたらランダムで クエスト名(ボス級の古龍・禁忌モンス以外) を返す
    if message.content == 'やばいクエスト':
        await message.channel.send('> ' + str(q2[rm.randint(0, 61)]))

    # "武器とスタイル"と入力されたらランダムで 武器とスタイル を返す
    if message.content == '武器とスタイル':
        await message.channel.send('__' + str(s[rm.randint(0, 5)]) + ' ' + str(w[rm.randint(0, 13)]) + '__')

    # "にゃーん"と入力されたら にゃーん を返す
    if message.content == 'にゃーん':
        await message.channel.send('にゃーん')

    if 'やりたくない' in message.content or 'したくない' in message.content:
        msg = message.author.mention + 'ならできるよ！いつもえらいよ、がんばろ(;_;)/~~~'
        msg1 = message.author.mention + 'がいつも頑張ってるの知ってるよ！もう少しだけがんばろう(>_<)'
        msg2 = 'そんなにつらいのに頑張ってて偉いね！終わったらたくさん遊ぼう(*ﾉωﾉ)'

        msgall = [msg, msg1, msg2]

        await message.channel.send(str(msgall[rm.randint(0, 2)]))

    if message.content.startswith('レポート'):
        await message.channel.send('レポートお疲れ様☕')

    if 'つかれた' in message.content:
        await message.channel.send('お疲れ様！！！')

    # "隠し機能"と入力したら隠し機能を説明する．
    if message.content == '隠し機能':
        await message.channel.send('**--------------隠し機能--------------**\n'
                                   '「にゃーん」　　　　　：「にゃーん」\n'
                                   '文頭に「レポート」　　：「レポートお疲れ様☕」\n'
                                   '文中に「やりたくない」： なぐさめ(3パターン)\n'
                                   '文中に「つかれた」　　：「お疲れ様！！！」\n'
)

    # "説明"と入力したらbotの説明をする
    if message.content == '説明':
        await message.channel.send('こんにちは！**MHXX_RANDOM** botです！\n'
                                   '様々なものをランダムに返すbotです。\n'
                                   '\n'
                                   '「武器」　　　　　　：「武器」(No にゃんたー)、\n'
                                   '「スタイル」　　　　：「スタイル」、\n'
                                   '「モンスター」　　　：「モンスター」(No 小型モンスター)、\n'
                                   '「やばいクエスト2」　： やばそうなクエスト(ボス級古龍と禁忌モンスターあり)\n'
                                   '「やばいクエスト」： やばそうなクエスト(No ボス級古龍と禁忌モンスター)\n'
                                   '「武器とスタイル」　：「スタイル」&「武器」\n'
                                   '\n'
                                   '「アプデ」　　　　　：最近の更新情報\n')

    # "アプデ"と入力したら最近更新したbotの変更内容(アプデ)を表示する
    if message.content == 'アプデ':
        await message.channel.send('**--------------アップデート--------------**\n'
                                   '12/20\n'
                                   '・やばいクエストで禁忌ボスが出ないようにしました。出す場合はやばいクエスト2でさせます。'
                                   '12/14\n'
                                   '・細かい調整(**文字の太さ**と__アンダーライン__)'
                                   '・「隠し機能」を追加しました。\n'
                                   '・「やばいクエスト！」を追加しました。(詳細は説明を参照されたい)\n'
                                   '・「武器とスタイル」と入力すると武器とスタイルをまとめて返してくれるようになりました。\n'
                                   '\n'
                                   '12/08\n'
                                   '・アプデ内容を「アプデ」入力で表示できるようになりました。\n'
                                   '・G級の高難易度クエスト(個人の感想)を「やばいクエスト」入力でランダムで表示できるようになりました。\n')


client.run(token)



```

正直csvファイルとか使えばよかったんですが、最初は武器とスタイルしか入れない予定だったからコード上に書いて、そっから機能追加してったらこうなりました(開き直り)

Qiitaのためにかえるのがめんどくさかったです。動いてるのでOK、、、

ただ、if文はどうしたらもっとスタイリッシュにできるんだろう．もう少しスタイリッシュにしたい．

#5. 感想
友人とこれであそんだらめちゃくちゃ盛り上がりました:tada::confetti_ball:
pipのダウンロードとか初めてだったから少してこずったけど，わかりやすく解説してくださっている方がたくさんいて助かった。
好きなことをもっと便利に楽しくすることが簡単にできるなんていい時代だなぁ。

【追記3/22】
UptimeRobotとRepl.itを用いて24時間体制で動作するようにできました^^
身内内で共有したら複数のサーバーで活用していただけました！うれしい！

[^1]: Monster Hunter XX固有のゲーム要素、[ギルド・ストライカー・ブシドー・エリアル・ブレイブ・レンキン]があり、プレイヤーはひとつのスタイルを選択出来る。その名の通りそれぞれ戦いのスタイルが違って楽しい。詳しくは→[Monster Hunter XX公式サイト](https://www.capcom.co.jp/monsterhunter/XX/)