White Box技術部

WEB開発のあれこれ(と何か)

【Slackアプリ】Botkitのsimple_storageを拡張する

BotkitにはSlackアプリがJSONでユーザ、チャンネル、チームの情報を保持できる簡易DBのような仕組みがあります。

今回はこれを拡張し、保持できる単位を増やしてみました。

simple_storageの拡張

Botkitで利用されている簡易DBは、simple_storage.jsとして実装されているので、そのコードを参考にすることで拡張ができました。

まずは必要となるjfsパッケージをインストールします。

npm i jfs

そしてsimple_storage.jsのstorageに、追加したいDBを足して返す関数を作ります。

ここでは、勤怠情報を保持するスペースとしてkintaiを作っています。ファイル名はstorage.jsの想定です。

'use strict';

import simple_storage from 'botkit/lib/storage/simple_storage.js';
import Store from 'jfs';

export function kintai_storage(config) {

  if (!config) {
    config = {
      path: './',
    };
  }

  let storage = simple_storage(config);
  let kintai_db = new Store(config.path + '/kintai', {saveId: 'id'});

  let objectsToList = (cb) => {
    return (err, data) => {
      if (err) {
        cb(err, data);
      } else {
        cb(err, Object.keys(data).map((key) => data[key]));
      }
    };
  };

  storage.kintai = {
    get: (kintai_id, cb) => {
      kintai_db.get(kintai_id, cb);
    },
    save: (kintai_data, cb) => {
      kintai_db.save(kintai_data.id, kintai_data, cb);
    },
    delete: (kintai_id, cb) => {
      kintai_db.delete(kintai_id, cb);
    },
    all: (cb) => {
      kintai_db.all(objectsToList(cb));
    }
  };

  return storage;
}

そして、この新しいstorageを利用するには、slackbotのパラメータに、storageキーの値を先ほど作成した関数としたオブジェクトを渡してください。

import Botkit from 'botkit';
import { kintai_storage } from './storage';

const controller = Botkit.slackbot({
  storage: kintai_storage({path: './data/'}),
}).configureSlackApp(
...以下省略

このプログラムを起動すると以下のように、保持できるスペースとして新たにkintaiが追加されていることを確認できます。

data
├── channels
├── kintai
├── teams
└── users

本格的に管理するのであれば、Sqliteなどを利用した方がいいと思いますが、一つ増やしたいくらいであれば、このような方法もいいのではないでしょうか。