Skip to content

Commit 7f5d44b

Browse files
committed
feat(parser): add tag access fields to Message objects
1 parent 9459b4c commit 7f5d44b

1 file changed

Lines changed: 35 additions & 1 deletion

File tree

irclib/parser.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Backported from async-irc (https://github.com/snoonetIRC/async-irc.git)
44
"""
55

6+
import datetime
67
import re
78
from abc import ABCMeta, abstractmethod
89
from collections.abc import Iterable, Iterator, Sequence
@@ -65,7 +66,16 @@
6566
unescaped: escaped for escaped, unescaped in TAG_VALUE_ESCAPES.items()
6667
}
6768

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
6979

7080

7181
class Parseable(metaclass=ABCMeta):
@@ -616,6 +626,30 @@ def __init__(
616626
self._command = command
617627
self._parameters = _parse_params(parameters)
618628

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+
619653
@property
620654
def tags(self) -> MsgTagList:
621655
"""IRC tag list."""

0 commit comments

Comments
 (0)