The fourth wave lands. Ten new commands, two new Partyline tools, and a handful of bugs quietly hexed into oblivion. Analytics, dice, coins, rankings, activity maps, and the long-awaited weather comparison — all production-ready and wired.
“Lumos Maxima! Even the darkest corners of the bot are now illuminated.” 🕯️✨
!karmatop [n] — Karma Leaderboard<teuk> m karmatop 5
<mediabotv3> Karma top 5 on #boulets:
<mediabotv3> 1. teuk +14
<mediabotv3> 2. Boole +7
<mediabotv3> 3. Poyan +3
Shows the top N karma scores on the current channel. Queries the KARMA
table sorted by score descending. Limit 1–10, default 5.
!roll [NdN] — Dice Roller<teuk> m roll 2d6
<mediabotv3> teuk rolled 2d6: [4, 3] = 7
<teuk> m roll d20
<mediabotv3> teuk rolled 1d20: 17
<teuk> m roll
<mediabotv3> teuk rolled 1d6: 4
Supports NdN format (e.g. 2d6, 3d8, 1d100). Bounds: 1–10 dice,
2–100 sides. Defaults to 1d6. Single dice shows value only; multiple
dice shows the breakdown.
!flip — Coin Flip<Boole> m flip
<mediabotv3> Boole flipped a coin: Heads!
50/50. No database. Pure rand().
!active [period] — Recently Active Nicks<teuk> m active 24h
<mediabotv3> Active in last 24h on #boulets: teuk, Boole, Poyan (3 nick(s))
<teuk> m active 7d
<mediabotv3> Active in last 7d on #boulets: teuk, Boole, Poyan, Menz, Gwen (5 nick(s))
Distinct nicks who posted in the last N hours or days. Supports Nh
(hours) and Nd (days). Default: 24h.
!when <nick> — First Appearance<teuk> m when Boole
<mediabotv3> Boole first seen on #boulets: 2024-01-15 09:12:01
MIN(ts) from CHANNEL_LOG. Complements !stats (which shows
MIN(ts) inline) with a dedicated single-nick lookup.
!quotecount [nick] — Quote Count by Author<teuk> m quotecount Boole
<mediabotv3> Boole: 14 quote(s) on #boulets
<teuk> m quotecount
<mediabotv3> #boulets: 312 quote(s) total
Without argument, shows the total for the channel. With a nick, filters
by author (prefix match via LIKE 'nick%').
Also wired as !quote count [nick] for consistency with the !quote
family.
!quote add <text> — Add Quote from IRC<teuk> m quote add <Boole> si Linux était une pizza, la croûte ce serait le kernel
<mediabotv3> -teuk- Quote added.
Alias for !qadd — routes through the existing mbQuoteAdd sub. Now
accessible as !quote add <text> for users who find !qadd opaque.
!weather compare <city1> <city2> — Side-by-Side Weather<teuk> m weather Sceaux
<teuk> m weather Lavaur
<teuk> m weather compare Sceaux Lavaur
<mediabotv3> sceaux: ☀️ +6°C (feels +6°C) | 93% | ↙4km/h | 0.0mm || lavaur: 🌧 +9°C (feels +9°C) | 98% | ↙4km/h | 0.0mm
Reads from the existing displayWeather_ctx in-memory cache (key:
lc($location)). No additional HTTP call — inherits the OVH IP
rate-limiting workaround automatically. Both cities must have been
fetched recently via !weather <city> first.
.seen <nick> — Last Seen from Partyline.seen Boole
Boole last seen 2026-05-12 18:44:02 on #boulets (QUIT) saying: "à demain"
Reads USER_SEEN table directly. Accessible from the Partyline without
needing to go through an IRC channel.
.purgereminders — Clean Up Old Reminders.purgereminders
Purged 14 reminder(s) older than 7 days.
Deletes rows from REMINDERS where delivered > 0 and
created_at < NOW() - 7 days. Keeps the table tidy without manual SQL.
| Bug | Fix |
|---|---|
!weather compare returned <!DOCTYPE html> |
wttr.in returns HTML for unencoded format params; switched to URI-escaped format string |
!weather compare showed “unavailable” after HTML fix |
wttr.in returns 403 for OVH IPs — rewritten to read displayWeather_ctx in-memory cache |
| Cache key mismatch in compare | displayWeather_ctx uses lc($location) as key; compare was using `lc(uri_escape($city).’ |
| File | Changes |
|---|---|
UserCommands.pm |
mbKarmaTop_ctx, mbRoll_ctx, mbFlip_ctx, mbActive_ctx, mbWhen_ctx, mbWeatherCompare_ctx |
Quotes.pm |
mbQuoteCount_ctx |
Partyline.pm |
_cmd_seen, _cmd_purgereminders + dispatch + help |
Mediabot.pm |
dispatch for all new commands + !quote add/count routing + !weather compare routing |
You must be logged in to reply.