aboutsummaryrefslogtreecommitdiff
path: root/geldschieberbot.py
diff options
context:
space:
mode:
Diffstat (limited to 'geldschieberbot.py')
-rw-r--r--geldschieberbot.py90
1 files changed, 2 insertions, 88 deletions
diff --git a/geldschieberbot.py b/geldschieberbot.py
index f876461..0b766c0 100644
--- a/geldschieberbot.py
+++ b/geldschieberbot.py
@@ -3,100 +3,14 @@
import argparse
from datetime import date, datetime, timedelta
-from dataclasses import dataclass, field
import json
import os
import subprocess
import sys
import typing as T
-
-@dataclass
-class MessageContext:
- """Class representing the context of a message passed to a command function"""
- sender_number: str
- sender: T.Optional[str]
- args: list[str]
- body: list[str]
- timestamp: str
-
-
-@dataclass
-class Modification:
- """Class representing a single modification to the balance
-
- Amount is transfered from donor to the recipient.
- """
- recipient: str
- donor: str
- amount: int
-
- def in_string(self) -> str:
- """Format the change using the recipient as initiator"""
- return f'{self.recipient} {"->" if self.amount < 0 else "<-"} {to_euro(abs(self.amount))} {self.donor}'
-
- def out_string(self) -> str:
- """Format the change using the donor as initiator"""
- return f'{self.donor} {"->" if self.amount < 0 else "<-"} {to_euro(abs(self.amount))} {self.recipient}'
-
-
-@dataclass
-class Change:
- """Class representing a change to the state caused by a single command"""
- cmd: list[str]
- modifications: list[Modification]
- timestamp: str
- rewind_cmds: list[list[str]] = field(default_factory=lambda: [])
-
-
-@dataclass
-class Quote:
- """Class representing a message to quote"""
- timestamp: str
- author: str
-
-
-class GeldschieberbotJSONEncoder(json.JSONEncoder):
- """Custom JSONEncoder supporting our dataclasses"""
-
- def default(self, o):
- if isinstance(o, (Modification, Change)):
- return o.__dict__
- return json.JSONEncoder.default(self, o)
-
-
-@dataclass
-class Reply:
- """Class representing a reply from the bot"""
- msg: str
- attachment: T.Optional[str] = None
-
-
-def to_cent(euro) -> int:
- """Parse string containing euros into a cent value"""
- if '.' in euro:
- euro = euro.split('.')
- else:
- euro = euro.split(',')
- if len(euro) > 2:
- raise TypeError
- euro[0] = int(euro[0])
- if len(euro) < 2:
- euro.append(0)
- else:
- if len(euro[1]) == 1:
- euro[1] = int(euro[1]) * 10
- else:
- euro[1] = int(euro[1])
- amount = euro[0] * 100 + euro[1]
- if amount < 0:
- raise ValueError
- return amount
-
-
-def to_euro(cents) -> str:
- """Format cents as euro"""
- return f"{cents/100:.2f}"
+from models import MessageContext, Modification, Change, Quote, GeldschieberbotJSONEncoder, Reply
+from utils import to_euro, to_cent
class Geldschieberbot: