【CentOS7 VPS】 Discord Musicbotの導入と常時オンライン化

Discordのボイスチャンネルに任意の音楽を流せるMusicBotなるものを教えてもらったので導入してみたいと思います。

とはいえ、自分がプログラムを起動してる間（つまりPCをつけっぱなしにしてる間）しかオンラインになっていないのは嫌なので、ちょっと前に契約した[Time4VPS](https://www.time4vps.eu/)のVPSにぶち込んで遊んでみようと思います。

月額250円くらいでした。一年以上の契約ならもうちょっと安い
<font color="lightgray">サーバがリトアニアにあるらしく、めちゃめちゃ速度が遅い(ping230くらい)のであまりオススメはしません。</font>

>[Discord 音楽botの作り方 SexualRhinoceros/MusicBot](http://takeshi.kill.jp/post-2254/)

こちらの記事を参考にさせていただきました。


#まずはLinuxのバージョンを確認
僕が使っているVPSのOSは"CentOS 7.2"です

バージョンの確認方法は

```.sh
$ cat /etc/redhat-release
```

#Musicbotを落とそう
[開発者のGithub](https://github.com/Just-Some-Bots/MusicBot)からCloneします。


###必要なパッケージをインストールしましょう
[開発者のwiki](https://github.com/Just-Some-Bots/MusicBot/wiki)にはCentOS用のチュートリアルがなかったのでUbuntuの記事を参考に色々入れてみることにします。

```.sh
$ sudo yum -y install git gcc gcc-c++ kernel-devel libffi-devel 
```

###さらに
>CentOS7にyumでffmpegをインストール
http://vild.hatenablog.com/entry/2015/09/29/125940

を参考にffmpegをインストールします。

#### 17/05/31追記
以下に実行コマンドを記述します

>    $ sudo yum -y install epel-release

>    $ sudo vi /etc/yum.repos.d/epel.repo

epel.repoを以下のように変更する

```vim
[epel]
(省略)
enabled=0
priority=11

[epel-debuginfo]
(省略)
enabled=0
priority=11

[epel-source]
(省略)
enabled=0
priority=11
```

>    $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

>    $ sudo vi /etc/yum.repos.d/nux-dextop.repo

同様の手順でdextop.repoを
enabled=0
priority=13
に変更しておいてください。

>    $ sudo yum -y --enablerepo=epel,nux-dextop install ffmpeg

インストールできたか確認する。
>    $ ffmpeg -version

###あとは適当なユーザとディレクトリを作ってそこに落としてあげましょう

```.sh

$ sudo useradd -mG wheel musicbot
$ sudo passwd musicbot
#ここでパスワード入力を促されるので適当に決める

$ su - musicbot
#パスワードを入力する

$ mkdir github
$ cd github
$ git clone https://github.com/Just-Some-Bots/MusicBot
```

でとりあえずOK

###それから（重要）
Musicbotには**Python3.5以降が必要です。**<font color="lightgray">(CentOS7のデフォルトは2.x系列)</font>
>CentOS7にpython3系のインストール
http://daichan.club/python/916

こちらの記事がわかりやすいのでペペっといれておきましょう。
入れないと後でエラいことになります。

#### 17/05/31追記
rootユーザを使用時にpyenvでglobalに3.5系を設定するとyumが使えなくなったりヤバいことになるらしいです。
<font color="lightgray"> (もし困ったらpythonのシンボリックリンクがあるところをググって貼り直してあげるといいと思います。)</font>

musicbotディレクトリに移動して

    $ pyenv local 3.5.1
のようにそこのディレクトリでだけ使う設定にしてあげるといい感じになると思います。

以下に実行コマンドをコピペします。

必要なものを入れます。
>    $ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel

    $ cd ~/github
    $ pwd
でgithubディレクトリにいることを確認したら
>    $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

>    $ vim ~/.bash_profile

bash_profileに下記を追記

```shell-session
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

>    $ source ~/.bash_profile

>    $ pyenv install 3.5.1

    $ cd ~/github/MusicBot

>    $ pyenv local 3.5.1

>    $ pyenv rehash

    $ python --version
でバージョンが3.5.1になっていることを確認したらOKです。

#botを作成しよう
Webブラウザを開いて[開発者ページ](https://discordapp.com/developers/applications/me)に飛び
![](https://i.gyazo.com/8d29c2140a409ec32277fa0d0329c97d.png)
New Appをクリック

![](https://i.gyazo.com/40d77d8f9b97470ef85dc4ca81972754.png)
こんな感じで適当に設定しましょう
終わったらCreate Appをクリック

![](https://i.gyazo.com/75087f0ceb1b5970478295ad45ea1f96.png)
まずは青で囲ったところからCreate a Bot Userをクリック
追加する？と聞かれるのでYes,do it!と答えてあげましょう

![](https://i.gyazo.com/ebeb02ace13f48c5c98d86c91846bef9.png)
終わったらオレンジで囲ったTokenのclick to revealをクリックすると出てくる文字列をコピーしておきましょう
<font color="red">(上にあるClient Secretと間違えないように！)</font>

#ここからがちょっとめんどくさい
ターミナルに戻って<font color="lightgray">（殆どの人はmusicbotユーザでgithubディレクトリだよね？）</font>

```.sh
$ vim ./MusicBot/config/example_options.ini
```

で編集画面に入ります

>[Credentials]
; Put your token here.  Not "secret".  The secret is not the token.
Token = <font color="orange">bot_token</font>

という部分があるので<font color="orange">bot_token</font>の部分をオレンジで囲った部分からコピーした文字列に置き換えましょう。

```
/Token
2wdw
```
でbot_tokenを削除できます
(僕はTeratermを使ってssh接続していたのでaで挿入モードに入ってマウス右クリックでペーストしちゃいました)

次にDiscordを開いて
ユーザ設定->テーマと進み開発者モードにチェックを入れます。
![](https://i.gyazo.com/eaed78da199cd6f6c4a03fae294105ce.png)

完了を押してテキストチャンネルなどに表示されている自分のアイコンを右クリックすると"IDをコピー"ができます。
![](https://i.gyazo.com/1e515eda407c970820329920238e161b.png)

コピーしたIDを先程開いたexample_options.iniの
>[Permissions]
; This number should be your id.  It gives you full permissions.  You do not put the bot's id here.  That's silly.
; If you don't know how to get this, scroll up a bit and read the part that says "HOW TO GET VARIOUS IDS"
; If you can't do that for some reason, join the help server (invite in the readme) and type this in chat: !id
; If you still don't understand, watch this https://streamable.com/4w8e and may your respective deity have mercy on your soul.
; I don't want any more "how do I get the OwnerID" questions.
OwnerID = <font color="red">000000000000000000</font>

で<font color="red">000000000000000000</font>と表示されている部分と置き換えます

終わったら

```
:wq
```

で保存して終了


ブラウザで開いていた開発者ページに戻り、赤で塗りつぶしてある文字列<font color="red">(ClientID)</font>を選択してコピーします。
![](https://i.gyazo.com/75087f0ceb1b5970478295ad45ea1f96.png)

###認証
Webブラウザで新しいタブを開き
>https\://discordapp.com/oauth2/authorize?&client_id=<font color="red">123456789123456789</font>&scope=bot&permissions=0

のように<font color="red">コピーしたClientID</font>を加えたURLのページを開くと、
![](https://i.gyazo.com/93697dcc235e74901e2290f053ec6c9a.png)
このようなページが出てくるので、任意のサーバーを選択し"Botを追加します"にチェックを入れて認証をクリック

![](https://i.gyazo.com/6a4e691892ede3b466f84061c45bc749.png)
Discordでサーバーを確認するとちゃんと追加されていました。

#botを起動しよう
ターミナルに戻ります。<font color="lightgray">（musicbotユーザの状態として話を進めます。）</font>

MusicBotディレクトリ内にあるrun.pyを起動すると動いてくれるみたいです。

```.sh
$ python --version
```
でバージョンが3.5以降になっていることを確認したら

```.sh
$ cd ~/github/MusicBot
$ python run.py
```

ダーッと文字列が流れたあとに
>Ok lets hope it worked

となると思います。やったね

###さあ実行だ！
と思って

```.sh
$ python run.py
```

と打ったら怒られました。

>Connecting...
An error has occured:
  Problem:  Bot cannot login, bad credentials.
  Solution: Fix your Email or Password or Token in the options file.  Remember that each field should be on their own line.

だそうです。
そういえば編集してたのがexample_options.iniってことはoptions.iniじゃないとダメなんじゃないのか～～～～～？？？？？

```.sh
$ cd config
#MusicBot/configディレクトリに移動する

$ mv options.ini options_backup0104.ini
#一応バックアップを取る

$ cp example_options.ini options.ini

$ cd ..
#MusicBotディレクトリに戻る
```

###で、もっかい

```.sh
python run.py
```

![](https://i.gyazo.com/0c19bbac5ac14c7741b096aa950ac9cd.png)

オ！今度はうまくいきました

###screenで動かす
とはいえターミナルをずっと占拠されるのも困るのでscreen内で実行してもらいましょう

実行中のMusicbotの終わらせ方がわかんなかったのでCtrl-Cでコマンドを終了

```.sh
$ sudo yum -y install screen
$ screen -S musicbot
#musicbotという名前のスクリーンを作る

$ python run.py
```
で実行したらCtrl-A Dでscreenを抜けます。

MusicBotのスクリーンに戻るには

```.sh
$ screen -r musicbot
```

というわけで終了！
サーバーを再起動したときにpython3.5以降でrun.pyを実行するようなシェルスクリプトを書いておけばいい感じになると思います。

###使い方
MusicBotのいるサーバーのボイスチャンネルに入り、

```
!summon
```
とメッセージを送ると流してくれます！
ちなみに流す内容は/MusicBot/config内にある
autoplaylist.txtにURL記述で設定できます

記述が終わったら

```
!restart
```
で再起動


#ちなみに結果は
そこそこいい感じで流してくれました！と言いたいところですがときどき音声が途切れます。
こればっかりは通信の問題なのでちゃんと日本のVPSを借りて使いましょうネ。

#よく使うコマンド
###自分がいるボイスチャンネルにbotを召喚
```
!summon
```
###\<URL>の動画及び音声を再生
```
!play <URL>
```
###現在再生中の音声をスキップ
```
!skip
```
###youtubeかsoundcloudで、\<word>の文字列で\<num>件の結果を検索して表示
\<num>は省略可能 デフォルト値:3
\<word>は間にスペースが入ってもクォーテーション等で囲まなくてよい

```
!search <youtube or soundcloud> <num> <word>
```

\<URL>に招待コードを入力するとそのサーバに参加するリンクを送ってくる

```
!joinserver <URL>
```