Errbotで最初からWebserverを有効にする

# Webserverを有効にする方法

ErrbotにはWebserver Pluginが最初からcore pluginとして盛り込まれており、これを使うことによってBot側でWebserverを立ち上げることが可能になっています。

* [errbot.core_plugins.webserver module](http://errbot.io/en/latest/errbot.core_plugins.webserver.html)

これを使うと、例えばSlackでいう[Outgoing webhooks](https://api.slack.com/custom-integrations/outgoing-webhooks)のように、とあるサービスからhookを受けることができるようになります。

が、この機能はデフォルトでは有効化されていません。その状態は、 `!status` コマンドを実行することによって分かります。

<img width="673" alt="init_webserver_status.png" src="https://qiita-image-store.s3.amazonaws.com/0/16458/2c8106ad-a37a-fe3c-4a7e-782fd481b164.png">

上記の通り、`Needs to be configured` という状態になっており、この状態では有効になっていないことが分かります(有効な場合は`Activated`になります)。

ここからWebserverを有効にする場合は、`!plugin config Webserver`と入力すれば、「デフォルト設定は以下をコピペすればいいよ」と教えてくれます。
この通りに発行すれば、めでたくWebserver機能は有効になります。

```
!plugin config Webserver 
{'HOST': '0.0.0.0',
'PORT': 3141,
'SSL': {'certificate': '',
        'enabled': False,
        'host': '0.0.0.0',
        'key': '',
        'port': 3142}}
```

<img width="461" alt="webserver_config.png" src="https://qiita-image-store.s3.amazonaws.com/0/16458/df594dd3-d108-a007-92ea-c5d7062e9f2d.png">

以下の通り、plugin statusも`Activated`になっています。

<img width="647" alt="webserver_status.png" src="https://qiita-image-store.s3.amazonaws.com/0/16458/947e0eea-865f-8828-b0ae-d945ef48b2b2.png">

# Webserverを最初から有効にする

が、Webserver機能を有効化するために、わざわざSlack(などのチャットツール)を起動してコマンドを流し込むより、最初からWebserver機能を有効化したくなります。
[ソース](http://errbot.io/en/latest/_modules/errbot/core_plugins/webserver.html#Webserver.activate)を見ると、`self.config`に設定が入っていないために有効化されていないようです。

この`self.config`をどこから設定するのかで非常に悩みました。

## `Webserver`から継承した別pluginを作ってconfig設定を行う

一番最初に思いついたのが、Webserverを継承する方法です。結論としては、あまり良い方法ではないです。
いわば、以下の方法です(githubで適当に検索して出てきたものを紹介)。

* [tormich/yobabot](https://github.com/tormich/yobabot/blob/3461c7ab22e1a3a780608bca53acfcbeadd79781/plugins/web/web.py)
* [avengerpenguin/alfred](https://github.com/avengerpenguin/alfred/blob/91ba03b8a9329631f37c7339e4bee4ad98489cf2/plugins/web.py)

```python
from errbot.core_plugins.webserver import Webserver
# from errbot import BotPlugin <-普通はこちら

class Web(Webserver):
# class Web(BotPlugin): <-普通はこちら
```

`Web`という独自のpluginを作り、それは`BotPlugin`ではなく`Webserver`を継承します。pluginでは`activate`関数が有効化時に呼ばれるので、そこで`Webserver`を継承した`Web`にて`self.config`を設定します。

ただ、これだと動くことは動くのですが、`!help`が使えなくなるという罠があります。

```
type object 'Webserver' has no attribute '__errdoc__'
```

## Dependencyを定義する

悩みに悩んでいろいろ試行錯誤して、うまい方法が確立できました。

* [11. Plugin Dependencies](http://errbot.io/en/latest/user_guide/plugin_development/dependencies.html#plugin-dependencies)

以下にサンプルを用意しました。

https://github.com/tkit/errbot-plugin-webserverconfiguration

こちらは、明示的に`Webserver`pluginへの依存関係を指定しています。

```
# !status
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Status ┃ Name                   ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ *A*    │ Webserver              │
├────────┼────────────────────────┤
│ *A*    │ WebserverConfiguration │
└────────┴────────────────────────┘
*A* = Activated, *D* = Deactivated, *B* = Blacklisted, *C* = Needs to be configured
```

# 自動的にWebserver設定が有効にはなったものの

Webserver機能の有効化を、pluginの導入というErrbot自体に手を加えない方法で実現できたのですが、最大の問題として **plugin自体が自動で取り込まれない** という点が挙げられます。初回にチャットツールを起動したら、pluginを取り込む操作を行わなければなりません。つまり、 `!repos install ...`を入力するしかないのです。

開発時は以下のように `BOT_EXTRA_PLUGIN_DIR` を指定してローカルのプラグインを取り込めるのですが、可能であればBot初回起動時に自動でcloneしてくれないものだろうか…。

* [2. Development environment](http://errbot.io/en/latest/user_guide/plugin_development/development_environment.html)