kikuの四苦Hack

ガジェットやプログラミングで遊ぶ

Slackbotで共同財布管理

相方さんとの連絡用に使っているSlackがいい感じにカスタマイズされてきています。最近追加したのは共同財布の管理機能。これが結構評判(相方さんの)がいいので、コードを公開しちゃいます(別に大した事をしてるわけではない)。

※共同財布とは。

会計でどっちが払うのかを探りあうのが面倒だったり、小銭のやりとり発生がめんどくさーい、という方(私含む)にはとても良いシステムなのですが、ひとつ問題なのは「物理的な財布が増える」という点です。

そこで提案するのが共同財布の仮想化(←言いたいだけ)。つまり、

  • 物理財布を増やさずに
  • Slackbotを使って
  • 共同財布の管理を簡易化する

ことを目指します。今回は、男性:女性が2:1で共同財布にお金を入れ、男性がすべて支払い行為を行うものと仮定します。仮想共同財布の管理法の例&Slackbotに必要な要件は以下のとおりです。※物理的に発生するお金のやりとりと、それに合わせて実行するbotのコマンドを併記しています。

1. 仮想共同財布へのお金の追加
(物理)女性が男性に4000円渡す=男性分含め合計12000円となる。
(仮想)addコマンドによりbotが仮想共同財布に12000円追加する。

2. 仮想共同財布からのお金の支払い
(物理)男性が7000円支払う=共同財布の中身は5000円となる。
(仮想)payコマンドによりbotが仮想共同財布を7000円減額する。

3. 仮想共同財布の中身の確認
(物理)物理的に男性財布との区別されていないので残額は不明。
(仮想)nowコマンドによりbotが現在の残高を教えてくれる。

なんとなく伝わりますか...?? この運用のいいところは、男性の財布に共同管理のお金が(男性のお金と区別されずに)入っていても、共同管理のお金の残高がすぐにわかる点です。またSlackを見ることにより女性にも残高がひと目でわかるので、なにも言わずとも「そろそろお金ないよね?」とお金を渡してくれるようになります。すばらしい。

実装後の運用例↓↓↓
f:id:kiku11:20170226182334p:plain
ちなみに、この運用例では示していませんが「pay 2000 昼食」と用途を書いてもきちんと金額部分が認識されて残高が計算されます(詳しくは下の実装を参照ください)。


というわけで実装です。本日の先人の知恵。
PythonでSlackbotを作る(1) – ビットログ
PythonでSlackbotを作る(2) – ビットログ
PythonでSlackbotを作る(3) – ビットログ

今回はPythonベースのSlackbotを使います(単純に自分がPython好きなだけ)。別に実装自体はなんでもかまわないです。上のリンク先に従って環境を整え、以下のコードをpluginsにおいてrun.pyを実行するだけでOKです。

# -*- coding: utf-8 -*- 
# shared_wallet.py
                                                    
import re
from slackbot.bot import listen_to

# initialization
remaining = 0

@listen_to('now')
def now(message):
    global remaining
    message.send(u'現在の残高は{:,d}円です!'.format(remaining))
 

@listen_to('set ([0-9]+)')
def set(message, amount):
    global remaining
    remaining = int(amount)
    message.send(u'残高を{:,d}円に設定しました!'.format(remaining))


@listen_to('pay ([0-9]+)')
def pay(message, amount):
    global remaining
    remaining -= int(amount)
    message.send(u'{:,d}円を支払いました!\n\
現在の残高は{:,d}円です!'.format(int(amount), remaining))

 
@listen_to('add ([0-9]+)')
def add(message, amount):
    global remaining
    remaining += int(amount)
    Asan       = int(int(amount)/3) # Aさんが1/3を負担
    Bsan       = int(amount) - Asan # Bさんが残りを負担
    message.send(u'{:,d}円をお財布に追加しました!\n\
内訳は、Aさん{:,d}円、Bさん{:,d}円で、\n\
現在の残高は{:,d}円です!'.format(int(amount), Asan, Bsan, remaining))


@listen_to('help')
def help(message):
    message.send(u'使えるコマンドは以下のとおりです!\n\
\n\n\
    now : 現在の残高を返します.\n\n\
    set xxxx : 残高をxxxx円に設定します.\n\n\
    pay xxxx : xxxx円を支払ったときに入力します.\n\n\
    add xxxx : xxxx円を財布に加えたときに入力します.')

setやhelpなど便利そうな機能を追加しています。add関数のメッセージ部分の「Aさん」「Bさん」は適宜使用者の名前に書き換えてください。あと、現状だとAさん:Bさんの負担比率が1:2になっているので、そのあたりも必要あれば書き換えてください(投げやり)。以下の部分です。

    Asan       = int(int(amount)/3) # Aさんが1/3を負担
    Bsan       = int(amount) - Asan # Bさんが残りを負担

運用例は上の写真のとおりです^^
お金の管理がかなり楽になりました!