aboutsummaryrefslogtreecommitdiff
path: root/src/IRCLine.py
blob: 3651d9f73f9440dc5ed1c1bad8dbe473f05bf51e (about) (plain) (blame)
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
import datetime, typing
from src import IRCObject, IRCServer, utils

# this should be 510 (RFC1459, 512 with \r\n) but a server BitBot uses is broken
LINE_CUTOFF = 470

class Line(IRCObject.Object):
    def __init__(self, server: "IRCServer.Server", send_time: datetime.datetime,
            line: str):
        self.server = server
        self._line = line
        self.send_time = send_time

        data, truncated = utils.encode_truncate(line, "utf8",
            self._char_limit())

        self._data = data
        self._truncated = truncated

        self._on_send = [] # type: typing.List[typing.Callable[[], None]]

    def __repr__(self) -> str:
        return "IRCLine.Line(%s)" % self.__str__()
    def __str__(self) -> str:
        return self.decoded_data()

    def _char_limit(self) -> int:
        return LINE_CUTOFF-len(":%s " % self.server.hostmask())

    def data(self) -> bytes:
        return b"%s\r\n" % self._data
    def decoded_data(self) -> str:
        return self._data.decode("utf8")
    def truncated(self) -> str:
        return self._truncated

    def on_send(self, func: typing.Callable[[], None]):
        self._on_send.append(func)
    def sent(self):
        for func in self._on_send[:]:
            func()

    def end_replace(self, s: str):
        s_encoded = s.encode("utf8")
        s_len = len(s_encoded)

        removed = self._data[-s_len:].decode("utf8")
        self._truncated = removed+self._truncated
        self._data = self._data[:-s_len]+s_encoded