Releases: bitbot-irc/bitbot
Releases · bitbot-irc/bitbot
v1.14.0
Added:
- Add Travis config to run
mypy
!cmute
/!cunmute
to mute/unmute a channel (+m
) (admin.py
)- Support GitLab notes and confidential issues (
git_webhooks
) - Strip
"'<>()
from words in titles when checking difference between a<title>
and URL (title.py
) - Show when a youtube video was uploaded (
youtube.py
) - 15 second SASL handshake timeout (
ircv3_sasl
) - Ability to disable command suggestions (
command_suggestions.py
) - Format/print/log
CHGHOST
events - Show when a
!config
option has remained unchanged (config.py
) - Show GMT offset in
!time
output (user_time.py
)
Changed:
/me
lines are no longer added to markov chains!seen
last action (seen-info
) is now per-channel, not per-network (seen.py
)
Fixed:
- Rectified
src/utils/
circular dependency mess - Decode fediverse data as utf8
- A bunch of typehinting errors across
src/
- Switch to
lxml
for fediverse note parsing.html.parser
was buggy and unpredictable (fediverse
)
Removed:
!timezone
v1.13.0
Added:
setup.py
bitbotctl
- daemon control system through unix domain sockets- Basic GitLab webhook support in
git_webhooks
- Catch
m.youtube.com
URLs inauto-youtube
- Support UTF8 domains by punycode (idna) encoding
!
param in!fedi
to denote "show content-warned content"- Opt-in URL shortening for Gitea and GitLab
?channels=
GET param for git_webhooks to denote what channels should show activityvotes-cast-restricted
to restrict voting to voiced-or-above users
Changed:
start.py
->bitbotd
- Database and config are now expected in
~/.bitbot/
(unless--database
and--config
are specified) - Database backup files are now in
bot.db.{time}.back
format - Don't say a users vote was changed when it wasn't (
vote.py
) - Bot will not die when there's no connected servers
- Command output will be truncated/cut at "word bounaries" (currently only space)
!reloadallmodules
andSIGUSR1
will not try to reload but rollback to currently-loaded on errorIRCBot.panic()
now just callssys.exit(20)
instead of trying to kill event loop
Fixed:
- Any user was able to add an API KEY (missing
permission
kwarg) - Be able to
!disconnect
reconnection attempts (regression,admin.py
) - Strip only unknown tags from fedi
Note
activities - not the tag content too - Don't allow users to
!bef
/!trap
a triggered duck before it has quacked - Don't set
location
to just a string when we decide a!weather
arg is not a nickname - We were not pulling out account ID from
WHOX
(just account name) - Outdated
tornado
version inrequirements.txt
Removed:
cve.py
EVENTS.md
v1.12.0
Added:
- Basic lock file mechanics (
src/LockFile.py
) external_modules
- an arbitrary directory in which to look for moduleschannel_blacklist.py
- rewriteJOIN
s and send instantPART
s to avoid the bot being in certain channels- Ability to specify different
channel_op.py
ban-mask
for users with accounts !invite
inchannel_op.py
check_certificate.py
- warn when a client certificate is close to expiration (or already expired)- Support
$-
format for alias arg replacement - means "none or all args" - Support
!config <nickname>
,!config <#channel>
and!config *
- Support dice roll modifiers (e.g.
!roll 2d20+1-2
) indice.py
- Opt-out highlight prevention for
!friends
/!enemies
inducks.py
- Use a random delay after a duck is triggered before showing the duck (
ducks.py
) !friends
/!enemies
now defaults to the current channel (ducks.py
)!action
and!msg
inecho.py
git-show-private
channel setting to enable showing private github/gitea webhooks!ghcommit
and supportauto-github
for@commit
!which
- show what module provides a command!apropos
- show commands that contain a given string!tcpup
- check if a givenhost:port
can receive a TCP connectionmarkov.py
mumble.py
- show stats for a given mumble server!grab
as an alias of!quotegrab
!crate
inrust.py
- show information on a given crate name- Support sed
&
syntax - Support
"<nickname>: s/"
sed syntax (search only for messages by<nickname>
) !silence
now takes an optional duration parameter!unsilence
!stats
not takes an optional network parameter - to show stats only for a given server!channels
- list the bot's current channels on the current networkstrip_otr.py
- remove trail whitespace used for automated OTR handshakes- Support disabling
words.py
word tracking for a while channel utils.deadline_process
- like@utils.deadline
but uses a subprocess- Single-line normalisation of fediverse Notes by vaguely parsing HTML
- Single-line normalisation of RSS titles
- Single-line normalisation of tweets
Changed:
- REST API only listens on localhost now, for security reasons
!changenickname
->!nick
!reconnect
can take an<alias>
param to tell it which server to reconnect to!disconnect
can now cancel reconnectionsauto_mode.py
was replaced by!flags
inchannel_op.py
!mute
masks should also take in to consideration the configuredban-mask
- Obscure output of
!config server sasl
channel.get_user_status()
->channel.get_user_modes()
!gh
/!ghissue
/!ghpull
can now see private repos through API keys- Allow preventing user-specified nameservers with
!dns
- Update
ircv3_multiline.py
todraft/multiline
- Prevent invalid SASL mechanisms
sasl-hard-fail
now defaults to False- Multi-word karma now needs parentheses, along with a few other tweaks to prevent false positives
channel.topic_setter
is now aHostmask
object- Obscure output of
!config server nickserv-password
!quotegrab
can take a number of lines to grabrelay-extras
defaults toFalse
rest_api
responses now use aResponse
object for complex data and headers!apikey
now has the subcommandslist
,add
,remove
andinfo
eval_rust.py
->rust.py
!silence
now affects command usage errors and command suggestions- Only do
auto-title
if the<title>
and URL are significantly similar - Use
"#<number>"
to denote!ud
definition index - Don't use an API for
user_time.py
- usepytz
- Support showing
!time
and!weather
for a location, not just a user Cache.py
is now more of akey:value
store- Temporarily cache IRCChannel settings in memory
utils.http.request()
now supports a complex request objectutils.http.request()
now uses more factors to detect a HTML page's encodingutils.http.is_localhost()
->utils.http.host_permitted()
and reject more IP ranges!editserver
should work for currently-disconnected serversINFO
logging should go to a file - stdout should only beWARN
Fixed:
badges.py
now forces UTC!op
/!voice
inchannel_op.py
tried to usesend_mode()
without array arguments!cignore
was not working for non-bot-admin users!tw
should be asking fortweet_mode="extended"
- Fix
server.send_invite()
arg order masterlogin
should only allow you to bypasspermission
checks, not e.g.require_access
orrequire_mode
Removed:
books.py
botsnack.py
check_urls.py
mixed_unicode.py
shakespeare.py
slowvoice.py
strax.py
timer.py
moved tobitbot-modules
repo!qget
- functionality moved to!quote
v1.11.1
Added:
utils.IntRangeSetting
realname
was missing from!editserver
Changed:
- Added
"- "
to start of formatted kick lines - Use
"+0000"
instead of"Z"
for UTC timezone
Fixed:
- Put a deadline on sed matches to prevent DoS
- Duplicate
def op
inchannel_op.py
(due to copypaste) git-prevent-highlight
was failing to unhighlight organisations
v1.11.0
Added:
rss.py
- Show
weather.py
windspeed in MPh too git_webhooks/gitea.py
acronym.py
!editserver
inadmin.py
channel_keys.py
to centrally track/use channel keys!mute
and!unmute
inchannel_op.py
command_suggestions.py
- appendable command prefixes
@utils.kwarg
fediverse.py
- gitea webhooks (
git_webhooks/gitea.py
) - Show available
!hash
algorithms - per-channel-per-user ignores (
ignore.py
,!cignore
) ircv3.py
- to show ircv3 support statsisup.py
kick_rejoin.py
- Handle
ERR_UNAVAILRESOURCE
onionoo.py
(thanks @irl)ops.py
to highlight ops (opt-in)- Per-channel
perform.py
(!cperform
) proxy.py
- Configurable URL shorteners (
shorturl.py
) !unshorten
(shorturl.py
)slowvoice.py
throttle.py
!timezone
(user_time.py
)- Show
!weather
target nickname in command prefix - Parse youtube playlists (
youtube.py
) utils.http.url_sanitise()
utils.http.request_many()
./start.py --startup-disconnects
./start.py --remove-server <alias>
!remindme
as an alias of!in
(in.py
)!source
and!version
(info.py
)- Show TTL for DNS records (
ip_addresses.py
) !addpoint
/!rmpoint
as more explicit++
/--
for karma (karma.py
)
Changed:
- Move
_check()
call to event loop func - Split out github webhook functionality to
git_webhooks/github.py
- Refactored @utils.export settings to be object-oriented
- Warn when channel-only/private-only is not met
8ball.py
->eightball.py
(can't import things that start with a digit)github.py
->git_webhooks
- revamp
!dns
to take optional nameserver and record typ !quotedel
without quote removes most recent- Relays moved to relay "groups" that channels can "join" and "leave"
- Rewrote
EventManager
for efficiency and simplicity - Moved timers/cache/etc from read loop to event loop
- Better and more exhaustive channel move tracking
- Don't silently truncate
ParsedLine
at newline @utils.hook
/@utils.export
now use a single object that handles parsing!ban
/!kickban
/!mute
duration syntax changed (channel_op.py
)- Highlight spam protection logic moved to own module (
highlight_spam.py
) IRCBuffer.find()
returns the matched string- Positive and negative karma throttled seperately (
karma.py
) - REST API now listens in IPv6 (
rest_api.py
)
Fixed:
- Catch and rethrow not-found definitions in
define.py
ircv3_botignore.py
event priorityCAP DEL
crash whenDEL
ing something that was not advertisedParsedLine.format()
didn't prefixsource
with":"
_write_buffer
locking to avoid race conditionCapability().copy().depends_on
was mutable to the original copy
v1.10.0
Added:
- Outbound message filtering (
message_filter.py
) - Mid-callback command permission checks ('event"check_assert"')
connected-since
on stats endpoint- IRCv3: draft/event-playback
auto-github-cooldown
to prevent duplicateauto-github
s in quick successionvote.py
- IRCv3:
ircv3_botignore.py
to ignore users withinspircd.org/bot
- Catch and humanify
!loadmodule
"not found" exception - cross-channel/network relay (
relay.py
) - Option to allow anyone to
!startvote
- IRCv3: CAP dependency system
- IRCv3: labeled-response + echo-message to correlate echos to sends
deferred_read.py
Changed:
- Only strip 2 characters (
++
or--
) from the end of karma - Track CHANMODE type B, C and D (not just type D)
- 'x saved a duck' -> 'x befriended a duck'
- IRCv3: CAP REQ streamline for modules
- IRCv3: SASL failure defaults to being "hard" (disconnect/crash)
auto-title
,auto-youtube
,auto-imgur
etc now work in/me
- Move truncation logic from
SentLine
toParsedLine
- Move
!help
logic to it's own file and rework it to be more user friendly - Get
"city, state, country"
from geocoding inlocation.py
, use inweather.py
- Convert IRC glob to regex, instead of using fnmatch
EventManager
calls can only come from the main thread- IRCv3:
labeled-response
now depends onbatch
format_activity.py
now only shows highest channel access symbol
Fixed:
KeyError
when stsport
key not present- lxml wasn't in requirements.txt but it should have been
- Any CRITICAL in read/write thread now kills the main thread too
Database.ChannelSettings.find
invalid SQLbirthday.py
's year no longer .lstrip("0")ed- IRCv3: pay attention to our own msgids (
ircv3_msgid.py
) - catch and WARN when trying to remove a self-mode we didn't know we had
until_read_timeout
->until_read_timeout()
PROTOCTL NAMESX
should have been send_raw() not send()- IRCv3: handle
CAP ACK -<cap>
- IRCv3: handle
CAP ACK
in response toCAP REQ
that came from outsideircv3.py
Removed:
!set
/!channelset
/!serverset
/!botset
(replaced with!config
)bytes-read-per-second
andbytes-written-per-second
from stats endpointupc.py
v1.9.2
v1.9.1
v1.9.0
Added:
- IRCv3: Also look at CTCP events for msgids
- Sub-event system within all SentLines
- Show last action in
!seen
(e.g. 'seen 1m ago ( hi)') - WARN when labels are not responded to in a timely fashion
- IRCv3: send
+draft/typing
while processing commands - Display github
ready_for_review
better - Parse 221 (RPL_UMODEIS) numerics
Changed:
!np
against a known nickname will attempt to resolve to lastfm usernamePING
andPONG
now avoid write throttling!bang
->!trap
, 'shot' -> 'trapped' for ducks- Socket reads and socket writes have been moved on to seperate threads
- Use Deques for chat history (more performant!)
Fixed:
- Differentiate between send and received CTCP events
IRCSocket._send
will now only return lines that definitely hit the wire- GitHub
commit_comment
event formatting exception - Strip xref tags from
!define
output check_purge()
after removing contextual hooks from an EventHook- IRCv3: Escape message tag values
v1.8.0
Added:
- Module dependency system
- Enable TCP keepalives
- IRCv3:
draft/label
tracking on every sent line when CAPs permit - Enforce Python version 3.6.0 or later
- 'module-whitelist'/'module-blacklist' in
bot.conf
Changed:
- IRCv3: Use last
server-time
forRESUME
- not last .recv() time - IRCv3:
draft/labeled-response
->draft/labeled-response-0.2
- IRCv3: Prune already-seen messages in
chathistory
batches - Consolidate
PRIVMSG
,NOTICE
andTAGMSG
handlers in to one
Fixed
- GitHub highlight prevention - don't detect highlights mid-word
- Pass already-decoded data in to BeautifulSoup
- !enablemodule actually removes module from blacklist setting
- Only enact write throttling when immediate-write-buffer is empty
- Non-throttled lines no longer delay throttled lines