|
3 | 3 | Backported from async-irc (https://github.com/snoonetIRC/async-irc.git) |
4 | 4 | """ |
5 | 5 |
|
| 6 | +import datetime |
6 | 7 | import re |
7 | 8 | from abc import ABCMeta, abstractmethod |
8 | 9 | from collections.abc import Iterable, Iterator, Sequence |
|
65 | 66 | unescaped: escaped for escaped, unescaped in TAG_VALUE_ESCAPES.items() |
66 | 67 | } |
67 | 68 |
|
68 | | -SelfT = TypeVar("SelfT") |
| 69 | + |
| 70 | +def parse_server_time(value: Optional[str]) -> datetime.datetime: |
| 71 | + if value: |
| 72 | + ts = datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%fZ").replace( |
| 73 | + tzinfo=datetime.timezone.utc |
| 74 | + ) |
| 75 | + else: |
| 76 | + ts = datetime.datetime.now(datetime.timezone.utc) |
| 77 | + |
| 78 | + return ts |
69 | 79 |
|
70 | 80 |
|
71 | 81 | class Parseable(metaclass=ABCMeta): |
@@ -616,6 +626,30 @@ def __init__( |
616 | 626 | self._command = command |
617 | 627 | self._parameters = _parse_params(parameters) |
618 | 628 |
|
| 629 | + def has_tag(self, name: str) -> bool: |
| 630 | + if not self.tags: |
| 631 | + return False |
| 632 | + |
| 633 | + return name in self.tags |
| 634 | + |
| 635 | + def get_tag_value(self, name: str) -> Optional[str]: |
| 636 | + if self.tags and name in self.tags: |
| 637 | + return self.tags[name].value |
| 638 | + |
| 639 | + return None |
| 640 | + |
| 641 | + @property |
| 642 | + def time(self) -> datetime.datetime: |
| 643 | + return parse_server_time(self.get_tag_value("time")) |
| 644 | + |
| 645 | + @property |
| 646 | + def message_id(self) -> Optional[str]: |
| 647 | + return self.get_tag_value("msgid") |
| 648 | + |
| 649 | + @property |
| 650 | + def batch_id(self) -> Optional[str]: |
| 651 | + return self.get_tag_value("batch") |
| 652 | + |
619 | 653 | @property |
620 | 654 | def tags(self) -> MsgTagList: |
621 | 655 | """IRC tag list.""" |
|
0 commit comments