95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
from typing import Match
|
||
|
||
from slackclient import SlackClient
|
||
|
||
import channel_util
|
||
import slack_util
|
||
import identifier
|
||
import re
|
||
import shelve
|
||
|
||
counted_data = ["flaked", "rolled", "replaced", "washed", "dried"]
|
||
lookup_format = "{}\s+(\d+)"
|
||
|
||
DB_NAME = "towels_rolled"
|
||
|
||
|
||
def fmt_work_dict(work_dict: dict) -> str:
|
||
return ",\n".join(["{} × {}".format(job, count) for job, count in sorted(work_dict.items())])
|
||
|
||
|
||
# noinspection PyUnusedLocal
|
||
def count_work_callback(slack: SlackClient, msg: dict, match: Match) -> None:
|
||
with shelve.open(DB_NAME) as db:
|
||
text = msg["text"].lower().strip()
|
||
|
||
# Couple things to work through.
|
||
# One: Who sent the message?
|
||
who_wrote = identifier.lookup_msg_brother(msg)
|
||
who_wrote_label = "{} [{}]".format(who_wrote["name"], who_wrote["scroll"])
|
||
|
||
# Two: What work did they do?
|
||
new_work = {}
|
||
for job in counted_data:
|
||
pattern = lookup_format.format(job)
|
||
match = re.search(pattern, text)
|
||
if match:
|
||
new_work[job] = int(match.group(1))
|
||
|
||
# Three: check if we found anything
|
||
if len(new_work) == 0:
|
||
if re.search(r'\s\d\s', text) is not None:
|
||
slack_util.reply(slack, msg,
|
||
"No work recognized. Use words {} or work will not be recorded".format(counted_data))
|
||
return
|
||
|
||
# Three: Add it to their total work. We key by user_id, to avoid annoying identity shit
|
||
db_key = msg["user"]
|
||
old_work = db.get(db_key) or {}
|
||
total_work = dict(old_work)
|
||
|
||
for job, count in new_work.items():
|
||
if job not in total_work:
|
||
total_work[job] = 0
|
||
total_work[job] += count
|
||
|
||
# Save
|
||
db[db_key] = total_work
|
||
|
||
# Four, congratulate them on their work
|
||
congrats = "{} recorded work:\n{}\nTotal work since last dump now\n{}".format(who_wrote_label,
|
||
fmt_work_dict(new_work),
|
||
fmt_work_dict(total_work))
|
||
slack_util.reply(slack, msg, congrats)
|
||
|
||
|
||
# noinspection PyUnusedLocal
|
||
def dump_work_callback(slack: SlackClient, msg: dict, match: Match) -> None:
|
||
with shelve.open(DB_NAME) as db:
|
||
# Dump out each user
|
||
keys = db.keys()
|
||
result = ["All work:"]
|
||
for user_id in keys:
|
||
# Get the work
|
||
work = db[user_id]
|
||
del db[user_id]
|
||
|
||
# Get the name
|
||
brother = identifier.lookup_slackid_brother(user_id)
|
||
if brother is None:
|
||
brother = user_id
|
||
else:
|
||
brother = brother.name
|
||
|
||
result.append("{} has done:\n{}".format(brother, fmt_work_dict(work)))
|
||
|
||
result.append("Database wiped. Next dump will show new work since the time of this message")
|
||
# Send it back
|
||
slack_util.reply(slack, msg, "\n".join(result))
|
||
|
||
|
||
# Make dem HOOKs
|
||
count_work_hook = slack_util.Hook(count_work_callback, channel_whitelist=[channel_util.SLAVES_TO_THE_MACHINE_ID])
|
||
dump_work_hook = slack_util.Hook(dump_work_callback, pattern="dump towel data",
|
||
channel_whitelist=[channel_util.COMMAND_CENTER_ID])
|