irctest/irctest/irc_utils/junkdrawer.py

67 lines
1.8 KiB
Python
Raw Normal View History

2020-02-28 04:00:37 +00:00
import datetime
2020-09-13 10:38:15 +00:00
import re
2020-10-21 15:08:14 +00:00
import secrets
2020-02-28 04:00:37 +00:00
from collections import namedtuple
2021-02-22 18:02:13 +00:00
HistoryMessage = namedtuple("HistoryMessage", ["time", "msgid", "target", "text"])
2020-02-28 04:00:37 +00:00
def to_history_message(msg):
2021-02-22 18:02:13 +00:00
return HistoryMessage(
time=msg.tags.get("time"),
msgid=msg.tags.get("msgid"),
target=msg.params[0],
text=msg.params[1],
)
2020-02-28 04:00:37 +00:00
# thanks jess!
IRCV3_FORMAT_STRFTIME = "%Y-%m-%dT%H:%M:%S.%f%z"
2021-02-22 18:02:13 +00:00
2020-02-28 04:00:37 +00:00
def ircv3_timestamp_to_unixtime(timestamp):
return datetime.datetime.strptime(timestamp, IRCV3_FORMAT_STRFTIME).timestamp()
2020-09-13 10:38:15 +00:00
2021-02-22 18:02:13 +00:00
2020-10-21 15:08:14 +00:00
def random_name(base):
2021-02-22 18:02:13 +00:00
return base + "-" + secrets.token_hex(8)
2020-10-21 15:08:14 +00:00
2020-09-13 10:38:15 +00:00
"""
Stolen from supybot:
"""
2021-02-22 18:02:13 +00:00
2020-09-13 10:38:15 +00:00
class MultipleReplacer:
"""Return a callable that replaces all dict keys by the associated
value. More efficient than multiple .replace()."""
# We use an object instead of a lambda function because it avoids the
# need for using the staticmethod() on the lambda function if assigning
# it to a class in Python 3.
def __init__(self, dict_):
self._dict = dict_
2021-02-22 18:02:13 +00:00
dict_ = dict([(re.escape(key), val) for key, val in dict_.items()])
self._matcher = re.compile("|".join(dict_.keys()))
2020-09-13 10:38:15 +00:00
def __call__(self, s):
return self._matcher.sub(lambda m: self._dict[m.group(0)], s)
2021-02-22 18:02:13 +00:00
2020-09-13 10:38:15 +00:00
def normalizeWhitespace(s, removeNewline=True):
r"""Normalizes the whitespace in a string; \s+ becomes one space."""
if not s:
2021-02-22 18:02:13 +00:00
return str(s) # not the same reference
starts_with_space = s[0] in " \n\t\r"
ends_with_space = s[-1] in " \n\t\r"
2020-09-13 10:38:15 +00:00
if removeNewline:
2021-02-22 18:02:13 +00:00
newline_re = re.compile("[\r\n]+")
s = " ".join(filter(bool, newline_re.split(s)))
s = " ".join(filter(bool, s.split("\t")))
s = " ".join(filter(bool, s.split(" ")))
2020-09-13 10:38:15 +00:00
if starts_with_space:
2021-02-22 18:02:13 +00:00
s = " " + s
2020-09-13 10:38:15 +00:00
if ends_with_space:
2021-02-22 18:02:13 +00:00
s += " "
2020-10-21 15:08:14 +00:00
return s