aboutsummaryrefslogtreecommitdiff
path: root/geldschieberbot.py
diff options
context:
space:
mode:
Diffstat (limited to 'geldschieberbot.py')
-rw-r--r--geldschieberbot.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/geldschieberbot.py b/geldschieberbot.py
index 51571c0..e6b0d75 100644
--- a/geldschieberbot.py
+++ b/geldschieberbot.py
@@ -19,11 +19,14 @@
from datetime import date, datetime, timedelta
import json
import os
+import subprocess
import typing as T
+from tempfile import NamedTemporaryFile
from models import MessageContext, Modification, Change, GeldschieberbotJSONEncoder, Reply
from utils import to_euro, to_cent
from minimize import minimize
+from plot import plot
class Geldschieberbot:
@@ -284,6 +287,7 @@ class Geldschieberbot:
list-changes [n] [first] - list the last n changes starting at first
export-state - send the state file
+ plot - generate a plotting of the balance graph
weekly name cmd - repeat cmd each week
monthly name cmd - repeat cmd each month
@@ -895,6 +899,24 @@ class Geldschieberbot:
out = f'State from {datetime.now().date().isoformat()}'
return {'msg': out, 'attachment': self.state_path}
+ def plot(self, msg: MessageContext) -> dict[str, str]:
+ """Send the balance graph plot as attachment"""
+ if not msg.sender:
+ return {'err': 'you must register first'}
+
+ dot = plot(self.balance)
+ # Create a temporary image file and keep it
+ with NamedTemporaryFile(delete=False) as image:
+ try:
+ subprocess.run(['dot', '-Tpng'],
+ input=dot.encode('utf-8'),
+ stdout=image,
+ check=True)
+ except subprocess.CalledProcessError as e:
+ return {'err': f'{e}'}
+
+ return {'msg': '', 'attachment': image.name}
+
def schedule(self, msg: MessageContext) -> dict[str, str]:
"""Schedule a command for periodic execution"""
if not msg.sender:
@@ -1064,6 +1086,7 @@ class Geldschieberbot:
'undo': self.fuck,
'list-changes': self.list_changes,
'export-state': self.export_state,
+ 'plot': self.plot,
'weekly': self.schedule,
'monthly': self.schedule,
'yearly': self.schedule,