diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-08-11 14:07:32 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2023-08-11 14:07:32 +0200 |
| commit | b17559d8ede422a0b91bcc1a2a01e71cd9b905b3 (patch) | |
| tree | 426ef44932c343fae9a426ca6267342826b80ffc /models.py | |
| parent | a16f0be99ea25e9102c9863db6c32dd4cb96c0a7 (diff) | |
| download | geldschieberbot-b17559d8ede422a0b91bcc1a2a01e71cd9b905b3.tar.gz geldschieberbot-b17559d8ede422a0b91bcc1a2a01e71cd9b905b3.zip | |
extract the models and utility function into separate source files
Diffstat (limited to 'models.py')
| -rw-r--r-- | models.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/models.py b/models.py new file mode 100644 index 0000000..5cee04a --- /dev/null +++ b/models.py @@ -0,0 +1,71 @@ +"""Models used by geldschieberbot""" + +import json +import typing as T + +from dataclasses import dataclass, field + +from utils import to_euro + + +@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 "<-"}' + f' {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 "<-"}' + f' {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 |
