mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-01-12 21:22:36 +01:00
ircmsgs: Document IrcMsg attributes.
This commit is contained in:
parent
2ceb60762e
commit
42d1bd3f39
@ -78,7 +78,7 @@ def _unescape_replacer(m):
|
|||||||
def unescape_server_tag_value(s):
|
def unescape_server_tag_value(s):
|
||||||
return _escape_sequence_pattern.sub(_unescape_replacer, s)
|
return _escape_sequence_pattern.sub(_unescape_replacer, s)
|
||||||
|
|
||||||
def parse_server_tags(s):
|
def _parse_server_tags(s):
|
||||||
server_tags = {}
|
server_tags = {}
|
||||||
for tag in s.split(';'):
|
for tag in s.split(';'):
|
||||||
if '=' not in tag:
|
if '=' not in tag:
|
||||||
@ -92,7 +92,7 @@ def parse_server_tags(s):
|
|||||||
value = None
|
value = None
|
||||||
server_tags[sys.intern(key)] = value
|
server_tags[sys.intern(key)] = value
|
||||||
return server_tags
|
return server_tags
|
||||||
def format_server_tags(server_tags):
|
def _format_server_tags(server_tags):
|
||||||
parts = []
|
parts = []
|
||||||
for (key, value) in server_tags.items():
|
for (key, value) in server_tags.items():
|
||||||
if value is None:
|
if value is None:
|
||||||
@ -131,6 +131,76 @@ class IrcMsg(object):
|
|||||||
it to a different source, they could do this:
|
it to a different source, they could do this:
|
||||||
|
|
||||||
IrcMsg(prefix='', args=(newSource, otherMsg.args[1]), msg=otherMsg)
|
IrcMsg(prefix='', args=(newSource, otherMsg.args[1]), msg=otherMsg)
|
||||||
|
|
||||||
|
.. attribute:: command
|
||||||
|
|
||||||
|
The IRC command of the message (eg. PRIVMSG, NOTICE, MODE, QUIT, ...).
|
||||||
|
In case of "split" commands (eg. CAP LS), this is only the first part,
|
||||||
|
and the other parts are in `args`.
|
||||||
|
|
||||||
|
.. attribute:: args
|
||||||
|
|
||||||
|
Arguments of the IRC command (including subcommands).
|
||||||
|
For example, for a PRIVMSG,
|
||||||
|
`args = ('#channel', 'content of the message')`.
|
||||||
|
|
||||||
|
.. attribute:: channel
|
||||||
|
|
||||||
|
The name of the channel this message was received on or will be sent
|
||||||
|
to; or None if this is not a channel message (PRIVMSG to a nick, QUIT,
|
||||||
|
etc.)
|
||||||
|
|
||||||
|
`msg.args[0]` was formerly used to get the channel, but it had several
|
||||||
|
pitfalls (such as needing server-specific channel vs nick detection,
|
||||||
|
and needing to strip statusmsg characters).
|
||||||
|
|
||||||
|
.. attribute:: prefix
|
||||||
|
|
||||||
|
`nick!user@host` of the author of the message, or None.
|
||||||
|
|
||||||
|
.. attribute:: nick
|
||||||
|
|
||||||
|
Nickname of the author of the message, or None.
|
||||||
|
|
||||||
|
.. attribute:: user
|
||||||
|
|
||||||
|
Username/ident of the author of the message, or None.
|
||||||
|
|
||||||
|
.. attribute:: host
|
||||||
|
|
||||||
|
Hostname of the author of the message, or None.
|
||||||
|
|
||||||
|
.. attribute:: time
|
||||||
|
|
||||||
|
Float timestamp of the moment the message was sent by the server.
|
||||||
|
If the server does not support `server-time`, this falls back to the
|
||||||
|
value of `time.time()` when the message was received.
|
||||||
|
|
||||||
|
.. attribute:: server_tags
|
||||||
|
|
||||||
|
Dictionary of IRCv3 message tags. `None` values indicate the tag is
|
||||||
|
present but has no value.
|
||||||
|
|
||||||
|
This includes client tags; the name is meant to disambiguate wrt the
|
||||||
|
`tags` attribute, which are tags used internally by Supybot/Limnoria.
|
||||||
|
|
||||||
|
.. attribute:: reply_env
|
||||||
|
|
||||||
|
(Mutable) dictionary of internal key:value pairs, all of which must be
|
||||||
|
strings.
|
||||||
|
|
||||||
|
Several plugins offer string templating, such as the 'echo' command in
|
||||||
|
the Misc plugin; which replace `$variable` with a value.
|
||||||
|
|
||||||
|
Adding values to this dictionary allows access to these values from
|
||||||
|
these commands; this is especially useful when nesting commands.
|
||||||
|
|
||||||
|
.. attribute:: tags
|
||||||
|
|
||||||
|
(Mutable) dictionary of internal key:value pairs on this message.
|
||||||
|
|
||||||
|
This is not to be confused with IRCv3 message tags; these are
|
||||||
|
stored as `server_tags` (including the client tags).
|
||||||
"""
|
"""
|
||||||
# It's too useful to be able to tag IrcMsg objects with extra, unforeseen
|
# It's too useful to be able to tag IrcMsg objects with extra, unforeseen
|
||||||
# data. Goodbye, __slots__.
|
# data. Goodbye, __slots__.
|
||||||
@ -138,6 +208,7 @@ class IrcMsg(object):
|
|||||||
__slots__ = ('args', 'command', 'host', 'nick', 'prefix', 'user',
|
__slots__ = ('args', 'command', 'host', 'nick', 'prefix', 'user',
|
||||||
'_hash', '_str', '_repr', '_len', 'tags', 'reply_env',
|
'_hash', '_str', '_repr', '_len', 'tags', 'reply_env',
|
||||||
'server_tags', 'time', 'channel')
|
'server_tags', 'time', 'channel')
|
||||||
|
|
||||||
def __init__(self, s='', command='', args=(), prefix='', server_tags=None, msg=None,
|
def __init__(self, s='', command='', args=(), prefix='', server_tags=None, msg=None,
|
||||||
reply_env=None):
|
reply_env=None):
|
||||||
assert not (msg and s), 'IrcMsg.__init__ cannot accept both s and msg'
|
assert not (msg and s), 'IrcMsg.__init__ cannot accept both s and msg'
|
||||||
@ -157,7 +228,7 @@ class IrcMsg(object):
|
|||||||
self._str = s
|
self._str = s
|
||||||
if s[0] == '@':
|
if s[0] == '@':
|
||||||
(server_tags, s) = s.split(' ', 1)
|
(server_tags, s) = s.split(' ', 1)
|
||||||
self.server_tags = parse_server_tags(server_tags[1:])
|
self.server_tags = _parse_server_tags(server_tags[1:])
|
||||||
else:
|
else:
|
||||||
self.server_tags = {}
|
self.server_tags = {}
|
||||||
if ' :' in s: # Note the space: IPV6 addresses are bad w/o it.
|
if ' :' in s: # Note the space: IPV6 addresses are bad w/o it.
|
||||||
@ -247,7 +318,7 @@ class IrcMsg(object):
|
|||||||
s = '%s\r\n' % self.command
|
s = '%s\r\n' % self.command
|
||||||
|
|
||||||
if self.server_tags:
|
if self.server_tags:
|
||||||
s = format_server_tags(self.server_tags) + ' ' + s
|
s = _format_server_tags(self.server_tags) + ' ' + s
|
||||||
|
|
||||||
self._str = s
|
self._str = s
|
||||||
|
|
||||||
@ -289,11 +360,14 @@ class IrcMsg(object):
|
|||||||
return (self.__class__, (str(self),))
|
return (self.__class__, (str(self),))
|
||||||
|
|
||||||
def tag(self, tag, value=True):
|
def tag(self, tag, value=True):
|
||||||
"""Affect a key:value pair to this message."""
|
"""Affect an internal key:value pair to this message.
|
||||||
|
|
||||||
|
This is not to be confused with IRCv3 message tags; these are
|
||||||
|
stored as `server_tags` (including the client tags)."""
|
||||||
self.tags[tag] = value
|
self.tags[tag] = value
|
||||||
|
|
||||||
def tagged(self, tag):
|
def tagged(self, tag):
|
||||||
"""Get the value affected to a tag."""
|
"""Get the value affected to a tag, or None if it is not set.."""
|
||||||
return self.tags.get(tag) # Returns None if it's not there.
|
return self.tags.get(tag) # Returns None if it's not there.
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
|
Loading…
Reference in New Issue
Block a user