aboutsummaryrefslogtreecommitdiff
path: root/models.py
blob: 5cee04a3e665d308ccb8cd9b4e3d045c88999a0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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