aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/admin.py14
-rw-r--r--modules/badges.py9
-rw-r--r--modules/karma.py3
-rw-r--r--modules/markov.py5
-rw-r--r--modules/rss.py3
-rw-r--r--modules/signals.py6
-rw-r--r--modules/stats.py3
-rw-r--r--modules/tweets/format.py6
-rw-r--r--modules/vote.py28
9 files changed, 44 insertions, 33 deletions
diff --git a/modules/admin.py b/modules/admin.py
index 2ca50843..1a732a7c 100644
--- a/modules/admin.py
+++ b/modules/admin.py
@@ -45,10 +45,13 @@ class Module(ModuleManager.BaseModule):
def _id_from_alias(self, alias):
return self.bot.database.servers.get_by_alias(alias)
def _server_from_alias(self, alias):
+ id, server = self._both_from_alias(alias)
+ return server
+ def _both_from_alias(self, alias):
id = self._id_from_alias(alias)
if id == None:
raise utils.EventError("Unknown server alias")
- return self.bot.get_server_by_id(id)
+ return id, self.bot.get_server_by_id(id)
@utils.hook("received.command.reconnect")
def reconnect(self, event):
@@ -95,10 +98,11 @@ class Module(ModuleManager.BaseModule):
:permission: disconnect
"""
server = event["server"]
+ id = -1
alias = str(event["server"])
if event["args"]:
alias = event["args_split"][0]
- server = self._server_from_alias(alias)
+ id, server = self._both_from_alias(alias)
if not server == None:
alias = str(server)
@@ -168,8 +172,8 @@ class Module(ModuleManager.BaseModule):
@utils.kwarg("permission", "editserver")
def edit_server(self, event):
alias = event["args_split"][0]
- server = self.bot.get_server_by_alias(alias)
- if server == None:
+ server_id = self._id_from_alias(alias)
+ if server_id == None:
raise utils.EventError("Unknown server '%s'" % alias)
option = event["args_split"][1].lower()
@@ -196,5 +200,5 @@ class Module(ModuleManager.BaseModule):
else:
raise utils.EventError("Unknown option '%s'" % option)
- self.bot.database.servers.edit(server.id, option, value_parsed)
+ self.bot.database.servers.edit(server_id, option, value_parsed)
event["stdout"].write("Set %s for %s" % (option, alias))
diff --git a/modules/badges.py b/modules/badges.py
index 854e6ff2..7370dab8 100644
--- a/modules/badges.py
+++ b/modules/badges.py
@@ -9,12 +9,9 @@ DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
DATE_FORMAT = "%Y-%m-%d"
class Module(ModuleManager.BaseModule):
- def _now(self):
- return datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
-
def _parse_date(self, dt: str):
if dt.lower() == "today":
- return self._now()
+ return utils.datetime_utcnow()
else:
match = RE_HUMAN_FORMAT.match(dt)
if not match:
@@ -57,7 +54,7 @@ class Module(ModuleManager.BaseModule):
badge_lower = badge.lower()
badges = self._get_badges(event["user"])
- now = self._round_up_day(self._now())
+ now = self._round_up_day(utils.datetime_utcnow())
found_badge = self._find_badge(badges, badge)
@@ -79,7 +76,7 @@ class Module(ModuleManager.BaseModule):
if event["args"]:
user = event["server"].get_user(event["args_split"][0])
- now = self._round_up_day(self._now())
+ now = self._round_up_day(utils.datetime_utcnow())
badges = []
for badge, date in self._get_badges(user).items():
days_since = self._days_since(now, utils.iso8601_parse(date))
diff --git a/modules/karma.py b/modules/karma.py
index d5b9ae9f..2634f8d6 100644
--- a/modules/karma.py
+++ b/modules/karma.py
@@ -21,7 +21,8 @@ class Module(ModuleManager.BaseModule):
return utils.irc.color(str(karma), utils.consts.RED)
elif karma > 0:
return utils.irc.color(str(karma), utils.consts.LIGHTGREEN)
- return str(karma)
+ else:
+ return utils.irc.color(str(karma), utils.consts.YELLOW)
@utils.hook("new.user")
def new_user(self, event):
diff --git a/modules/markov.py b/modules/markov.py
index 1508ad99..0075c1a5 100644
--- a/modules/markov.py
+++ b/modules/markov.py
@@ -46,7 +46,7 @@ class Module(ModuleManager.BaseModule):
event["stderr"].write("Failed to load log (%d)" % page.code)
def _load_loop(self, channel_id, data):
- for line in data.decode("utf8").split("\n"):
+ for line in data.decode("utf8", errors="ignore").split("\n"):
self.bot.trigger(self._create_factory(channel_id, line.strip()))
self._load_thread = None
def _create_factory(self, channel_id, line):
@@ -167,4 +167,7 @@ class Module(ModuleManager.BaseModule):
break
words.append(third_word)
+ if words == first_words:
+ return None
+
return " ".join(words)
diff --git a/modules/rss.py b/modules/rss.py
index e8e237da..e18ef18b 100644
--- a/modules/rss.py
+++ b/modules/rss.py
@@ -18,7 +18,8 @@ class Module(ModuleManager.BaseModule):
self.bot.get_setting("rss-interval", RSS_INTERVAL))
def _format_entry(self, server, feed_title, entry, shorten):
- title = entry["title"]
+ title = utils.parse.line_normalise(utils.http.strip_html(
+ entry["title"]))
author = entry.get("author", None)
author = " by %s" % author if author else ""
diff --git a/modules/signals.py b/modules/signals.py
index 336a83d3..286852d6 100644
--- a/modules/signals.py
+++ b/modules/signals.py
@@ -35,7 +35,11 @@ class Module(ModuleManager.BaseModule):
sys.exit()
def _make_hook(self, server):
- return lambda e: self.bot.disconnect(server)
+ return lambda e: self._disconnect_hook(server)
+ def _disconnect_hook(self, server):
+ self.bot.disconnect(server)
+ if not self.bot.servers:
+ sys.exit()
def SIGUSR1(self, signum, frame):
self.bot.trigger(self._reload_config)
diff --git a/modules/stats.py b/modules/stats.py
index 3c140855..ee92e7c8 100644
--- a/modules/stats.py
+++ b/modules/stats.py
@@ -73,8 +73,7 @@ class Module(ModuleManager.BaseModule):
"port": server.connection_params.port,
"tls": server.connection_params.tls,
"alias": server.connection_params.alias,
- "hostmask": "%s!%s@%s" % (
- server.nickname, server.username, server.hostname),
+ "hostmask": server.hostmask(),
"users": len(server.users),
"bytes-written": server.socket.bytes_written,
"bytes-read": server.socket.bytes_read,
diff --git a/modules/tweets/format.py b/modules/tweets/format.py
index 8b84cba3..4d64dffd 100644
--- a/modules/tweets/format.py
+++ b/modules/tweets/format.py
@@ -7,11 +7,7 @@ def _timestamp(dt):
return "%s %s ago" % (since, unit)
def _normalise(tweet):
- while " " in tweet:
- tweet = tweet.replace(" ", " ")
- lines = [line.strip() for line in tweet.split("\n")]
- lines = list(filter(None, lines))
- return html.unescape(" ".join(lines))
+ return html.unescape(utils.parse.line_normalise(tweet))
def _tweet(exports, server, tweet, from_url):
linked_id = tweet.id
diff --git a/modules/vote.py b/modules/vote.py
index 27216392..30043fe0 100644
--- a/modules/vote.py
+++ b/modules/vote.py
@@ -10,6 +10,7 @@ STR_NOVOTE = "Unknown vote '%s'"
class VoteCastResult(enum.Enum):
Cast = 1
Changed = 2
+ Unchanged = 3
@utils.export("channelset", utils.BoolSetting("votes-start-restricted",
"Whether starting a vote should be restricted to ops"))
@@ -46,25 +47,28 @@ class Module(ModuleManager.BaseModule):
def _format_options(self, vote):
return ", ".join("'%s'" % o for o in vote["options"])
- def _cast_vote(self, channel, vote_id, user, option):
+ def _cast_vote(self, channel, vote_id, user, chosen_option):
vote = self._get_vote(channel, vote_id)
- option = vote["options"][option]
+ option_nicks = vote["options"][chosen_option]
cast_type = VoteCastResult.Cast
- for nicks in vote["options"].values():
+ for option, nicks in vote["options"].items():
if user.name in nicks:
- nicks.remove(user.name)
- cast_type = VoteCastResult.Changed
- break
+ if option == chosen_option:
+ return VoteCastResult.Unchanged
+ else:
+ nicks.remove(user.name)
+ cast_type = VoteCastResult.Changed
+ break
- option.append(user.name)
+ option_nicks.append(user.name)
self._set_vote(channel, vote_id, vote)
return cast_type
def _open_votes(self, channel):
open = []
- for setting, vote in channel.find_setting(prefix="vote-"):
+ for setting, vote in channel.find_settings(prefix="vote-"):
if vote["open"]:
open.append(vote)
return open
@@ -132,11 +136,13 @@ class Module(ModuleManager.BaseModule):
cast_result = self._cast_vote(event["target"], vote_id,
event["user"], choice)
- cast_desc = "cast"
+ cast_desc = "has been cast"
if cast_result == VoteCastResult.Changed:
- cast_desc = "changed"
+ cast_desc = "has been changed"
+ elif cast_result == VoteCastResult.Unchanged:
+ cast_desc = "is unchanged"
- event["stdout"].write("%s: your vote has been %s." %
+ event["stdout"].write("%s: your vote %s." %
(event["user"].nickname, cast_desc))
@utils.hook("received.command.votes", channel_only=True)