LoginSignup
0
0

More than 5 years have passed since last update.

Errbotにおけるデータの永続化

Posted at

TL;DR

  • BotPluginのインスタンスは辞書アクセスすると永続データを持てる
  • ただし、保持させた値の部分更新はできない
  • マニュアル実装を読むのが一番

ErrBot

自作プラグインを作るときにはBotPluginクラスを継承するのですが、このクラスを追いかけていくとBotPluginBase < StoreMixin < MutableMapping という継承関係にあります。
で、このうちの、StoreMixinで実装されている部分になるのですが、__getitem__()__setitem__()をオーバーライドしていて、辞書的なアクセスをされた際にはerrbot起動時に参照しているストレージに対して永続データをやり取りできるようになっています。

example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd


class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        self[from_id] = args

    @botcmd
    def show_todo(self, msg, args):
        from_id = str(msg.frm)
        return self[from_id]

こんな感じで、書くと

tododemo.png

set_todo で投げた文字をtodoとして保持してくれ、show_todoと投げると、保持しているtodoを返してくれます。
別のユーザーから同じコマンドを投げられても、別のキーになるので別の値として保持され、ユーザーごとのtodoを持てるようになります。

永続データ管理の注意点

こう書いても動きません。

example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd

class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        todolist = self[from_id]
        todolist.append(args)

あくまで、BotPluginの実装として動くのみのため、取り出したものに対して何かやっても無意味になります。

example.py
# -*- coding:utf8 -*-
from errbot import BotPlugin, botcmd

class TodoPlugin(BotPlugin):
    @botcmd
    def set_todo(self, msg, args):
        from_id = str(msg.frm)
        todolist = self[from_id]
        todolist.append(args)

こんな感じで、一度値を丸ごと取り出して、編集した内容を丸ごとセットする必要があります。 1

使ってみた例


  1. コンテキストマネージャーはあって、もうちょっと楽な書き方はあるのですが、今回は割愛 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0