Discordで使えるValorant用Botを作成してみた

## 作成の経緯

友達とValorantで遊んでいるときに、ランダムでエージェントを選ぶことが出来る機能があればもっと楽しくなると思い、だったら作っちゃえばよくね？ってなったからです。

## どんなことができるの？

このDiscordボットは、ボイスチャンネルに入っているユーザーに対して、Valorantのエージェントと武器をランダムに選択することができます。

## 使用ツール

Replitを今回は使用して、作成していこうと思います。
諸々の使い方などは使っていくうちに覚えていくと思うので、今回はスルーで。

Rplitの詳細はこちらから

[Replitとは？５０以上のプログラミングが利用できるブラウザ型IDE](https://www.naka-sys.okinawa/replit-used/)

## 必要なライブラリのインポート

main.py

```python
import discord
import rando
import os
from discord.ext import commands
from keep_alive import keep_alive
```

## **インテントの生成**

```jsx
intents = discord.Intents.default()
intents.message_content = True
```

## **ボットの作成**

```
bot = commands.Bot(command_prefix='/', intents=intents)
```

## **Valorantエージェントと武器のリスト**

```
valorant_agents = [
    "ジェット", "レイズ", "フェニックス", "レイナ", "ヨル", "ネオン", "セージ", "サイファー", "キルジョイ",
    "チェンバー", "デッドロック", "ブリーチ", "ソーヴァ", "スカイ", "KAY/O", "フェイド", "ゲッコー", "オーメン",
    "ブリムストーン", "ヴァイパー", "アストラ", "ハーバー"
]

valorant_handgun = ["クラシック", "ショーティ", "フレンジー", "ゴースト", "シェリフ"]

valorant_eco = [
    "クラシック", "ショーティ", "フレンジー", "ゴースト", "シェリフ", "スティンガー", "バッキー", "アレス",
    "マーシャル", "ジャッジ"
]

valorant_buy = [
    "スペクター", "ブルドッグ", "ガーディアン", "ヴァンダル", "ファントム", "オーディン", "オペレーター"
]
```

## **Discordコマンド**

### **ランダムエージェントを選択するコマンド**

```python
@bot.command(name='random_agent')
async def random_agent(ctx):
    # ランダムにValorantエージェントを選択
    random_agent = random.choice(valorant_agents)

    # コマンドを打ったチャンネルに結果を送信
    await ctx.send(f'{ctx.author.display_name} さんのランダムエージェントは {random_agent} です！')
```

### **ボイスチャンネルのユーザーにランダムエージェントを割り当てるコマンド**

```python
@bot.command(name='random_agents')
async def random_agents(ctx):
    # ボイスチャンネルに参加しているユーザーを取得
    if ctx.author.voice and ctx.author.voice.channel:
        voice_channel = ctx.author.voice.channel
        members = voice_channel.members

        # ボイスチャンネルのユーザー数に合わせてランダムエージェントを選択
        if members:
            random_agent_list = random.sample(valorant_agents, len(members))
            response = "ランダムエージェント\n"

            # メンバーごとに名前とランダムエージェントを組み合わせて表示
            for member, agent in zip(members, random_agent_list):
                response += f"{member.display_name}: {agent}\n"

            # 1つのメッセージにまとめて送信
            await ctx.send(response)
        else:
            await ctx.send('ボイスチャンネルに誰もいません。')
    else:
        await ctx.send('ボイスチャンネルに接続していません。')
```

### **ボイスチャンネルのユーザーにランダムな武器を割り当てるコマンド**

```python
@bot.command(name='random_weapons')
async def random_weapons(ctx):
    # ボイスチャンネルに参加しているユーザーを取得
    if ctx.author.voice and ctx.author.voice.channel:
        voice_channel = ctx.author.voice.channel
        members = voice_channel.members

        # ボイスチャンネルのユーザー数に合わせて武器結果を作成
        if members:
            response = f'ランダム武器:\n'

            for member in members:
                handgun = random.choice(valorant_handgun)
                eco = random.choice(valorant_eco)
                buy = random.choice(valorant_buy)

                response += f'{member.display_name} さん\n'
                response += f'ハンドガンラウンド: {handgun}\n'
                response += f'エコラウンド: {eco}\n'
                response += f'バイラウンド: {buy}\n\n'

            await ctx.send(response)
        else:
            await ctx.send('ボイスチャンネルに誰もいません。')
    else:
        await ctx.send('ボイスチャンネルに接続していません。')
```

## ボットを実行

```bash
# ボットをオンラインに保つためのWebサーバーを起動
keep_alive()

# ご利用の Discord ボットトークンを指定してクライアントを実行
my_secret = os.environ['KEY']
bot.run(my_secret)
```

## ボットをオンラインに保つための設定を行う

keep_alive.py

```python
from flask import Flask
from threading import Thread

# Flaskアプリケーションの作成
app = Flask('')

# ルートパスへのGETリクエストに対するルートハンドラーを定義
@app.route('/')
def home():
    return "I'm alive"  # ブラウザがアクセスすると "I'm alive" というテキストを返す

# Flaskアプリケーションを実行する関数を定義
def run():
    app.run(host='0.0.0.0', port=8080)  # すべてのホストからアクセス可能なポート8080でFlaskアプリケーションを実行

# ボットをオンラインに保つための関数を定義
def keep_alive():
    t = Thread(target=run)  # 新しいスレッドを作成し、run関数をそのターゲットに指定
    t.start()  # スレッドを開始し、Flaskアプリケーションをバックグラウンドで実行
```

Google Apps ScriptでPingを定期的に送信する設定を行う
下記のサイトが一番わかりやすかったので、そのまま貼らせていただきます。

[https://x.gd/JRIbD](https://x.gd/JRIbD)

設定が終わったら、RUNボタンを押下し起動を行います。
なにもエラー文が出てこなければ、正常に起動されています。

## まとめ

初めてボットを作ったので、至らない点などもあると思いますので、ご了承ください。
現在は自分のサーバー用にしか作っておりませんが、いずれはほかの人にも使ってもらえるようなBotにしていきたいです。

また、自分の好きなものを開発するのが一番楽しいと改めて気が付くことが出来ました。
みなさんも、自分でアイデアを出して開発する経験を積んでみましょう。