errbotを使ってKPT-BOTを作る

KPT-BOTを作る

errbot のUer Guideを一通り読み終わったのでサンプルで何か作りたい、何にしようかなーと考えていたところ、omoiyari.fmの#25で紹介されていたKPT-BOTが面白いなーと感じたのでerrbotで試してみる。

qiita.com

errbotでPluginを作成

Plugin作成には

  • Pluginファイル (KPT.py)
  • Plugin metataファイル (KPT.plug)

の2つが必要の模様。
pluginsフォルダ配下にKPTというフォルダを作成して、2ファイルを配置

├── config.py
├── data
└── plugins
    ├── KPT
    │   ├── kpt.plug
    │   ├── kpt.py
    └── err-example
        ├── example.plug
        └── example.py


User Guideを参考にmetadataファイルを以下のように作成

[Core]
Name = KPT
Module = kpt

[Python]
Version = 2+

[Documentation]
Description = Example "KPT: keep, problem, try" plugin

[Core]のModuleキーはその名の通りimportするモジュール名で、ファイル名と同一にするのが一般的とDocumentに記載があったのでその通りに。

続いてPluginファイルを作成する。
errbotでのデータ保持についてはPlugin Developmentの8. Persistenceを参考にした。
botコマンドとしては

  • !k msg: Keepに追加
  • !p msg: Problemに追加
  • !t msg: Tryに追加
  • !print_kpt: postした内容を表示
  • !erase_kpt: postした内容をリセット(全削除)

を前提に作成。
結果は以下。 もっと綺麗に書ける気がしますが、一旦これで動作確認。

from errbot import BotPlugin, botcmd

class KPT(BotPlugin):
    @botcmd
    def k(self, msg, args):
        try:
            self['KEEP']
        except KeyError:
            d = {}
        else:
            d = self['KEEP']

        key = len(d)
        d[str(key)] = args

        self['KEEP'] = d
        return "list keep append!"


    @botcmd
    def p(self, msg, args):
        try:
            self['PROBLEM']
        except KeyError:
            d = {}
        else:
            d = self['PROBLEM']

        key = len(d)
        d[str(key)] = args

        self['PROBLEM'] = d
        return "list problem append!"


    @botcmd
    def t(self, msg, args):
        try:
            self['TRY']
        except KeyError:
            d = {}
        else:
            d = self['TRY']

        key = len(d)
        d[str(key)] = args

        self['TRY'] = d
        return "list try append!"


    @botcmd
    def print_kpt(self, msg, args):
        yield "## KEEP"
        try:
            self['KEEP']
        except KeyError:
            yield "- Nothing!"
        else:
            if len(self['KEEP']) == 0:
                yield "- Nothing!"
            else:
                for key, item in self['KEEP'].items():
                    yield "- {}".format(str(item))

        yield "## PROBLEM"
        try:
            self['PROBLEM']
        except KeyError:
            yield "- Nothing!"
        else:
            if len(self['TRY']) == 0:
                yield "- Nothing!"
            else:
                for key, item in self['PROBLEM'].items():
                    yield "- {}".format(str(item))

        yield "## TRY"
        try:
            self['TRY']
        except KeyError:
            yield "- Nothing!"
        else:
            if len(self['TRY']) == 0:
                yield "- Nothing!"
            else:
                for key, item in self['TRY'].items():
                    yield "- {}".format(str(item))


    @botcmd
    def erase_kpt(self, msg, args):
        self['KEEP'] = {}
        self['PROBLEM'] = {}
        self['TRY'] = {}

errbotを起動して、slack上からbotコマンドを実行して動作確認。

f:id:yFujita:20180322230758p:plain

とりあえずは動いている模様です。 今後はコードの見直しと bot実行環境の検討をすすめる。