Webserverを有効にする方法
ErrbotにはWebserver Pluginが最初からcore pluginとして盛り込まれており、これを使うことによってBot側でWebserverを立ち上げることが可能になっています。
これを使うと、例えばSlackでいうOutgoing webhooksのように、とあるサービスからhookを受けることができるようになります。
が、この機能はデフォルトでは有効化されていません。その状態は、 !status
コマンドを実行することによって分かります。

上記の通り、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}}

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

Webserverを最初から有効にする
が、Webserver機能を有効化するために、わざわざSlack(などのチャットツール)を起動してコマンドを流し込むより、最初からWebserver機能を有効化したくなります。
ソースを見ると、self.config
に設定が入っていないために有効化されていないようです。
このself.config
をどこから設定するのかで非常に悩みました。
Webserver
から継承した別pluginを作ってconfig設定を行う
一番最初に思いついたのが、Webserverを継承する方法です。結論としては、あまり良い方法ではないです。
いわば、以下の方法です(githubで適当に検索して出てきたものを紹介)。
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を定義する
悩みに悩んでいろいろ試行錯誤して、うまい方法が確立できました。
以下にサンプルを用意しました。
こちらは、明示的に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してくれないものだろうか…。