VCTを楽しく観戦するDiscordBotをつくった話

この記事は、[木更津高専 Advent Calender 2023](https://qiita.com/advent-calendar/2023/nit_kisarazu "") 6日目の記事です。

前→ [謎](https://lisa0.hatenablog.jp/draft/entry/npF5R4E_VGSi_GhDqsbvX3GH_l8 "") by @_LISA0 
次→ [研究開発でめっちゃ痛い目見た話](https://qiita.com/toreis/items/7bee7b2dbc0879d90565 "") by @toreis 

# 馴れ初め
あれは，夏も終わりに近づいているにもかかわらず，まだ暑い九月のことでした。
私はなんとなくPythonと付き合いはじめてみたはいいものの関係がうまくいかず，疎遠になりつつありました。
「やっぱり相性が良くないのかな」「もういっそのこと，きっぱりと別れを告げたほうがあの子も幸せなんじゃないか」などネガティブなことばかり考えていたその時，彼女が声をかけてきました。
### 「DiscordBot....作らない？」
唐突な彼女の提案に私は少し困惑しました。
しかし，せっかく勇気を出して提案してくれたのに，その気持ちを無下にするわけにはいかない。何より，愛しのPythonとまた開発ができるかもしれない。
そう思い私は，彼女の提案を受け入れたのです.......

# きっかけ
私はVCT(VALORANT競技シーン)を見るのが好きです。VALORANTをプレイするより何倍も観戦が好きです。特にPaperRex所属のf0rsakeN選手が大好きです。
しかしなんということでしょう。身の回りにVCT観戦が趣味のお友達がいないではありませんか！
リアルはもちろん，一緒にVALORANTをプレイしているネッ友にも全然いません。(一人NAVIガチ勢の友達がいますが...)
そして，「友達にいないなら仕方がない。観戦専門のDiscord鯖でも探そう」と思い立ちます。
しかしなんということでしょう。
### マジで一つもありません
X(旧Twitter)から公開コミュニティサーバー，普通のVAORANTサーバーの宣伝用チャンネルの隅から隅まで探しました。
A鯖「普段はランク回してますがたまにVCT見たりもしてます！」
→ 私が探しているのは観戦専用の鯖なのでこれはちょっと違う...
B鯖「VCT見てます！一緒に日本応援しましょう！」
→ 参加してみる → ただの身内ノリランク鯖やないかい！
そんなこんなで，マジのマジで一つも見つかりませんでした。
そうして最終的に，「しょうがない。ないなら作ろう。」と思い立ち今に至ります。

# 使ったもの
### ソフト
- Blender (チームロゴのモデリング用)
- AviUtl (画像生成の背景作成用)
### 言語
- Python 3.11
### ライブラリ
- discord.py
- python dotenv
- Pillow

# discord.py のおべんきょう
さぁ早速BOTを作りましょう。
...
......
### 何すればいいんだ？
BOTなんて作ったことないので何すればいいのか全く分かりません。
とりあえず「discordBot Python 作り方」なんて頭の悪そうな検索でヒットした記事を見てみます。

ふむふむなるほど...
よくわからんが **discord.py** っていうライブラリをもにゅもにゅすればいいんだな！
そしてこっからdiscord.pyの基礎の基礎を勉強し，基本的な仕組みを理解しました。

# 画像生成をしよう
## 背景をつくる
まず背景を作り，その上にロゴやテキストを重ねる感じで画像生成をしようと考えました。
まずは/add-matchと/vote-img用の背景をつくります。そこで白羽の矢が立ったのが
**＿人人人人人＿**
**＞　AviUtl　＜**
**￣Y^Y^Y^Y^￣**

いつもお世話になっております。
AviUtlでツェイってやっていい感じの背景を作ります。
![Match_back.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/e7c25627-5207-a034-fb68-dd117a742373.jpeg)

![vote_back_ascention.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/0b92fd33-c580-5707-89b6-87fe75a214f7.jpeg)
ひとまずこれでいいかな。

## ロゴのモデリング
さあ一番だるい作業です。
とりあえずフランチャイズチームの上位のチームと，日本の有名どころを作ります。
使用ソフトはBlender，私の二人目の彼女です
![fnc_logo_left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/abc5b561-4664-867a-35b5-b29567763fa1.png)
![zeta_logo_left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/4ce351b7-fc6c-7c00-c462-95a97fb528e4.png)
この作業，いまだに終わっていません()

## Pillow で合わせる
背景，ロゴ素材ができたのでいよいよ重ねていきます。
まずは背景素材，ロゴ素材を開きます。
```py
from PIL import Image, ImageDraw, ImageFont

img_back = Image.open('背景のパス')
img_team1 = Image.open('ロゴ素材のパス')
img_team2 = Image.open('ロゴ素材のパス')
```

**thumbnail**関数は比率をそのままに画像サイズを変える関数です。
しかしここで注意点が。
**thumbnail**関数を元の画像に使用すると，元のファイルのサイズまで変えてしまいます。
なのでしっかり**copy**関数でコピーした画像に使用しましょう。
```py
team1_cp = img_team1.copy()
team1_cp.thumbnail((800, 800))
team2_cp = img_team2.copy()
team2_cp.thumbnail((800, 800))
```
最後にサイズを調整した画像を背景の上に重ねます。
```py
img_back.paste(team1_cp, (100, 300), team1_cp)
img_back.paste(team2_cp, (1000, 300), team2_cp)
```
### 完成！！
![match_Image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/4059775c-8a85-8b71-5db9-a52f647d8245.jpeg)

# BOTの仕様
## 機能
- 大会名，行われる日時，対戦するチームの情報を記載した画像を生成し，送信する
- 行われる試合について，どちらが勝利するかリアクションで予想できるようにする
    - 投票数の割合をダッシュボードに表示する(未完成)
    - 割合からオッズを算出し，サーバー内ポイントを賭けた賭博をできるようにする(未完成) 
- 勝利したチームをお知らせする
- チームの現在のロスターを表示する
- 選手の移籍情報をお知らせする
## スラッシュコマンド
- ### /roaster [チーム名]
    - [チーム名]の現在のロスター(メンバー)をコマンドが実行されたチャンネルに表示する
- ### /add-match [大会名] [日時] [チーム名1] [チーム名2]
    - 大会名，日時，チーム名とロゴを記載した画像を生成し，コマンドが実行されたチャンネルに送信する![match_Image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/16562563-58b8-587b-6efa-d8d925db59a6.jpeg)

- ### /vote-img [色] [大会名] [チーム名1] [チーム名2]
    - 大会名，チーム名とロゴが記載された画像を生成し，埋め込みテキストに添付してコマンドが実行されたチャンネルに送信する。送信したのち，投票用のリアクションを2つ付ける。
![スクリーンショット 2023-12-04 114142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/ee782d8f-06a4-13ba-caa1-d90ded8bad9c.png)

- ### /winner [試合数] [マップ名] [チーム名]
    - 第[試合数]試合，[マップ名]　[チーム名]勝利！！と送信する。わざわざコマンドにしなくてもいいと思う。

- ### /transfer [チーム名1] [チーム名2] [選手名] [説明]
    - 選手の移籍情報を埋め込みテキストでお知らせする。
    ![スクリーンショット 2023-12-04 114751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152333/7aeea7e6-7235-db5f-7c90-6017b3a6012d.png)

# 今後の展望
- 鯖独自のポイントシステムを設け，勝利予想をもっと面白くしたい
- 未完成のダッシュボードを完成させたい
- /add-match と /vote-img の一体化，そして予約投稿できるようにしたい
- まだローカルで動かしてるのでサーバーにのっけたい

# おしまい
プログラミング・Python・BOT制作...何においてもド初心者の私が試行錯誤しながらBOTを作った体験談(？)でした。
頼れる友達にめっちゃ助けられました。頭があがらないです。
本記事を通じてVCTに興味を持った人はぜひこのサーバーに入って一緒に見ましょうね！！！！！！！！！！！！！
https://discord.gg/fwJ6q3QqsQ