2019-10-10 12:36:55 +00:00
|
|
|
# 2019-10-10 - BitBot v1.12.0
|
2019-10-10 11:43:19 +00:00
|
|
|
|
|
|
|
Added:
|
|
|
|
- Basic lock file mechanics (`src/LockFile.py`)
|
2019-10-09 11:41:50 +00:00
|
|
|
- `external_modules` - an arbitrary directory in which to look for modules
|
|
|
|
- `channel_blacklist.py` - rewrite `JOIN`s and send instant `PART`s to avoid the bot being in certain channels
|
|
|
|
- Ability to specify different `channel_op.py` `ban-mask` for users with accounts
|
|
|
|
- `!invite` in `channel_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`) in `dice.py`
|
|
|
|
- Opt-out highlight prevention for `!friends`/`!enemies` in `ducks.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` in `echo.py`
|
|
|
|
- `git-show-private` channel setting to enable showing private github/gitea webhooks
|
|
|
|
- `!ghcommit` and support `auto-github` for `@commit`
|
|
|
|
- `!which` - show what module provides a command
|
|
|
|
- `!apropos` - show commands that contain a given string
|
|
|
|
- `!tcpup` - check if a given `host:port` can receive a TCP connection
|
|
|
|
- `markov.py`
|
|
|
|
- `mumble.py` - show stats for a given mumble server
|
|
|
|
- `!grab` as an alias of `!quotegrab`
|
|
|
|
- `!crate` in `rust.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 network
|
|
|
|
- `strip_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
|
2019-10-10 12:36:55 +00:00
|
|
|
- Single-line normalisation of fediverse Notes by vaguely parsing HTML
|
|
|
|
- Single-line normalisation of RSS titles
|
|
|
|
- Single-line normalisation of tweets
|
2019-10-09 11:41:50 +00:00
|
|
|
|
|
|
|
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 reconnections
|
|
|
|
- `auto_mode.py` was replaced by `!flags` in `channel_op.py`
|
|
|
|
- `!mute` masks should also take in to consideration the configured `ban-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` to `draft/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 a `Hostmask` object
|
|
|
|
- Obscure output of `!config server nickserv-password`
|
|
|
|
- `!quotegrab` can take a number of lines to grab
|
|
|
|
- `relay-extras` defaults to `False`
|
|
|
|
- `rest_api` responses now use a `Response` object for complex data and headers
|
|
|
|
- `!apikey` now has the subcommands `list`, `add`, `remove` and `info`
|
|
|
|
- `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` - use `pytz`
|
|
|
|
- Support showing `!time` and `!weather` for a location, not just a user
|
|
|
|
- `Cache.py` is now more of a `key:value` store
|
|
|
|
- Temporarily cache IRCChannel settings in memory
|
|
|
|
- `utils.http.request()` now supports a complex request object
|
|
|
|
- `utils.http.request()` now uses more factors to detect a HTML page's encoding
|
|
|
|
- `utils.http.is_localhost()` -> `utils.http.host_permitted()` and reject more IP ranges
|
2019-10-10 12:36:55 +00:00
|
|
|
- `!editserver` should work for currently-disconnected servers
|
|
|
|
- `INFO` logging should go to a file - stdout should only be `WARN`
|
2019-10-09 11:41:50 +00:00
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- `badges.py` now forces UTC
|
|
|
|
- `!op`/`!voice` in `channel_op.py` tried to use `send_mode()` without array arguments
|
|
|
|
- `!cignore` was not working for non-bot-admin users
|
|
|
|
- `!tw` should be asking for `tweet_mode="extended"`
|
|
|
|
- Fix `server.send_invite()` arg order
|
2019-10-10 12:36:55 +00:00
|
|
|
- `masterlogin` should only allow you to bypass `permission` checks, not e.g. `require_access` or `require_mode`
|
2019-10-09 11:41:50 +00:00
|
|
|
|
|
|
|
Removed:
|
|
|
|
- `books.py`
|
|
|
|
- `botsnack.py`
|
|
|
|
- `check_urls.py`
|
|
|
|
- `mixed_unicode.py`
|
|
|
|
- `!qget` - functionality moved to `!quote`
|
|
|
|
- `shakespeare.py`
|
|
|
|
- `slowvoice.py`
|
|
|
|
- `strax.py`
|
|
|
|
- `timer.py`
|
|
|
|
|
2019-08-30 18:10:17 +00:00
|
|
|
# 2019-08-30 - BitBot 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` in `channel_op.py` (due to copypaste)
|
|
|
|
- `git-prevent-highlight` was failing to unhighlight organisations
|
|
|
|
|
2019-08-15 12:45:54 +00:00
|
|
|
# 2019-08-15 - BitBot v1.11.0
|
2019-06-23 15:03:46 +00:00
|
|
|
|
|
|
|
Added:
|
|
|
|
- `rss.py`
|
2019-06-24 06:14:13 +00:00
|
|
|
- Show `weather.py` windspeed in MPh too
|
2019-06-24 17:22:49 +00:00
|
|
|
- `git_webhooks/gitea.py`
|
2019-08-09 14:00:33 +00:00
|
|
|
- `acronym.py`
|
|
|
|
- `!editserver` in `admin.py`
|
|
|
|
- `channel_keys.py` to centrally track/use channel keys
|
|
|
|
- `!mute` and `!unmute` in `channel_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 stats
|
|
|
|
- `isup.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>`
|
2019-08-14 14:17:01 +00:00
|
|
|
- `!remindme` as an alias of `!in` (`in.py`)
|
|
|
|
- `!source` and `!version` (`info.py`)
|
|
|
|
- Show TTL for DNS records (`ip_addresses.py`)
|
2019-08-15 12:42:53 +00:00
|
|
|
- `!addpoint`/`!rmpoint` as more explicit `++`/`--` for karma (`karma.py`)
|
2019-06-24 06:14:13 +00:00
|
|
|
|
|
|
|
Changed:
|
|
|
|
- Move `_check()` call to event loop func
|
2019-06-24 17:22:49 +00:00
|
|
|
- Split out github webhook functionality to `git_webhooks/github.py`
|
2019-08-09 14:00:33 +00:00
|
|
|
- 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
|
2019-08-14 14:17:01 +00:00
|
|
|
- `!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`)
|
2019-08-09 14:00:33 +00:00
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- Catch and rethrow not-found definitions in `define.py`
|
|
|
|
- `ircv3_botignore.py` event priority
|
|
|
|
- `CAP DEL` crash when `DEL`ing something that was not advertised
|
|
|
|
- `ParsedLine.format()` didn't prefix `source` with `":"`
|
|
|
|
- `_write_buffer` locking to avoid race condition
|
|
|
|
- `Capability().copy().depends_on` was mutable to the original copy
|
2019-06-23 15:03:46 +00:00
|
|
|
|
2019-06-23 13:44:24 +00:00
|
|
|
# 2019-06-23 - BitBot v1.10.0
|
2019-06-10 09:49:38 +00:00
|
|
|
|
|
|
|
Added:
|
|
|
|
- Outbound message filtering (`message_filter.py`)
|
2019-06-15 17:45:57 +00:00
|
|
|
- Mid-callback command permission checks ('event["check_assert"](utils.Check(...))')
|
2019-06-14 17:12:54 +00:00
|
|
|
- `connected-since` on stats endpoint
|
2019-06-14 23:51:48 +00:00
|
|
|
- IRCv3: draft/event-playback
|
2019-06-16 16:20:47 +00:00
|
|
|
- `auto-github-cooldown` to prevent duplicate `auto-github`s in quick succession
|
2019-06-17 22:23:36 +00:00
|
|
|
- `vote.py`
|
2019-06-19 22:19:10 +00:00
|
|
|
- IRCv3: `ircv3_botignore.py` to ignore users with `inspircd.org/bot`
|
|
|
|
- Catch and humanify `!loadmodule` "not found" exception
|
2019-06-21 09:53:25 +00:00
|
|
|
- cross-channel/network relay (`relay.py`)
|
|
|
|
- Option to allow anyone to `!startvote`
|
2019-06-22 21:33:04 +00:00
|
|
|
- IRCv3: CAP dependency system
|
|
|
|
- IRCv3: labeled-response + echo-message to correlate echos to sends
|
|
|
|
- `deferred_read.py`
|
2019-06-10 09:49:38 +00:00
|
|
|
|
2019-06-11 12:49:20 +00:00
|
|
|
Changed:
|
2019-06-13 10:57:01 +00:00
|
|
|
- Only strip 2 characters (`++` or `--`) from the end of karma
|
|
|
|
- Track CHANMODE type B, C and D (not just type D)
|
2019-06-14 17:12:54 +00:00
|
|
|
- 'x saved a duck' -> 'x befriended a duck'
|
2019-06-16 14:37:16 +00:00
|
|
|
- IRCv3: CAP REQ streamline for modules
|
2019-06-17 22:23:36 +00:00
|
|
|
- IRCv3: SASL failure defaults to being "hard" (disconnect/crash)
|
|
|
|
- `auto-title`, `auto-youtube`, `auto-imgur` etc now work in `/me`
|
2019-06-18 13:33:51 +00:00
|
|
|
- Move truncation logic from `SentLine` to `ParsedLine`
|
2019-06-18 20:43:05 +00:00
|
|
|
- Move `!help` logic to it's own file and rework it to be more user friendly
|
2019-06-19 21:18:43 +00:00
|
|
|
- Get `"city, state, country"` from geocoding in `location.py`, use in `weather.py`
|
2019-06-21 09:53:25 +00:00
|
|
|
- Convert IRC glob to regex, instead of using fnmatch
|
2019-06-22 21:33:04 +00:00
|
|
|
- `EventManager` calls can only come from the main thread
|
2019-06-23 08:45:27 +00:00
|
|
|
- IRCv3: `labeled-response` now depends on `batch`
|
2019-06-23 10:26:32 +00:00
|
|
|
- `format_activity.py` now only shows highest channel access symbol
|
2019-06-11 12:49:20 +00:00
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- `KeyError` when sts `port` key not present
|
2019-06-13 10:57:01 +00:00
|
|
|
- lxml wasn't in requirements.txt but it should have been
|
2019-06-13 16:13:10 +00:00
|
|
|
- Any CRITICAL in read/write thread now kills the main thread too
|
2019-06-17 22:23:36 +00:00
|
|
|
- `Database.ChannelSettings.find` invalid SQL
|
2019-06-19 21:18:43 +00:00
|
|
|
- `birthday.py`'s year no longer .lstrip("0")ed
|
2019-06-21 09:53:25 +00:00
|
|
|
- IRCv3: pay attention to our own msgids (`ircv3_msgid.py`)
|
2019-06-21 14:32:17 +00:00
|
|
|
- catch and WARN when trying to remove a self-mode we didn't know we had
|
2019-06-23 08:45:27 +00:00
|
|
|
- `until_read_timeout` -> `until_read_timeout()`
|
2019-06-23 10:26:32 +00:00
|
|
|
- `PROTOCTL NAMESX` should have been send_raw() not send()
|
|
|
|
- IRCv3: handle `CAP ACK -<cap>`
|
|
|
|
- IRCv3: handle `CAP ACK` in response to `CAP REQ` that came from outside `ircv3.py`
|
2019-06-11 12:49:20 +00:00
|
|
|
|
2019-06-14 17:12:54 +00:00
|
|
|
Removed:
|
|
|
|
- `!set`/`!channelset`/`!serverset`/`!botset` (replaced with `!config`)
|
|
|
|
- `bytes-read-per-second` and `bytes-written-per-second` from stats endpoint
|
2019-06-19 21:18:43 +00:00
|
|
|
- `upc.py`
|
2019-06-14 17:12:54 +00:00
|
|
|
|
2019-06-09 16:34:45 +00:00
|
|
|
# 2019-06-09 - BitBot v1.9.2
|
|
|
|
|
|
|
|
Added:
|
|
|
|
- Show seconds it took to !bef/!trap
|
|
|
|
|
|
|
|
Changed:
|
|
|
|
- IRCv3: `draft/resume-0.4` -> `draft/resume-0.5`
|
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- Fix scenario in which some-but-not-all threads die
|
|
|
|
- Daemonify tweet thread
|
|
|
|
- Don't add TAGMSGs to IRCBuffer objects
|
|
|
|
|
2019-06-08 10:03:18 +00:00
|
|
|
# 2019-06-08 - BitBot v1.9.1
|
2019-06-08 10:02:44 +00:00
|
|
|
|
2019-06-08 10:04:25 +00:00
|
|
|
Fixed:
|
2019-06-08 10:02:44 +00:00
|
|
|
- Fix ERROR on `CAP NEW` caused by STS typo
|
|
|
|
- Fix hanging on `CAP NEW` due to duplicate `REQ`
|
|
|
|
- STATUSMSG stripping should only be STATUSMSG symbols, not all PREFIX symbols
|
|
|
|
|
2019-06-07 16:13:53 +00:00
|
|
|
# 2019-06-07 - BitBot v1.9.0
|
2019-06-03 13:23:59 +00:00
|
|
|
|
|
|
|
Added:
|
|
|
|
- IRCv3: Also look at CTCP events for msgids
|
2019-06-04 17:01:31 +00:00
|
|
|
- Sub-event system within all SentLines
|
2019-06-07 16:11:34 +00:00
|
|
|
- Show last action in `!seen` (e.g. 'seen 1m ago (<jesopo> hi)')
|
2019-06-05 13:29:41 +00:00
|
|
|
- WARN when labels are not responded to in a timely fashion
|
2019-06-07 16:09:34 +00:00
|
|
|
- IRCv3: send `+draft/typing` while processing commands
|
|
|
|
- Display github `ready_for_review` better
|
|
|
|
- Parse 221 (RPL_UMODEIS) numerics
|
2019-06-03 13:23:59 +00:00
|
|
|
|
2019-06-04 13:34:11 +00:00
|
|
|
Changed:
|
|
|
|
- `!np` against a known nickname will attempt to resolve to lastfm username
|
2019-06-04 13:34:50 +00:00
|
|
|
- `PING` and `PONG` now avoid write throttling
|
2019-06-07 16:11:34 +00:00
|
|
|
- `!bang` -> `!trap`, 'shot' -> 'trapped' for ducks
|
2019-06-07 16:09:34 +00:00
|
|
|
- Socket reads and socket writes have been moved on to seperate threads
|
|
|
|
- Use Deques for chat history (more performant!)
|
2019-06-04 13:34:11 +00:00
|
|
|
|
2019-06-03 13:23:59 +00:00
|
|
|
Fixed:
|
|
|
|
- Differentiate between send and received CTCP events
|
2019-06-04 13:34:11 +00:00
|
|
|
- `IRCSocket._send` will now only return lines that definitely hit the wire
|
2019-06-05 10:45:35 +00:00
|
|
|
- GitHub `commit_comment` event formatting exception
|
2019-06-07 16:11:34 +00:00
|
|
|
- Strip xref tags from `!define` output
|
2019-06-05 15:57:01 +00:00
|
|
|
- `check_purge()` after removing contextual hooks from an EventHook
|
2019-06-07 16:09:34 +00:00
|
|
|
- IRCv3: Escape message tag values
|
2019-06-03 13:23:59 +00:00
|
|
|
|
2019-06-03 12:30:39 +00:00
|
|
|
# 2019-06-03 - BitBot v1.8.0
|
2019-05-26 15:26:32 +00:00
|
|
|
|
|
|
|
Added:
|
|
|
|
- Module dependency system
|
2019-05-28 09:47:31 +00:00
|
|
|
- Enable TCP keepalives
|
2019-06-02 14:22:37 +00:00
|
|
|
- IRCv3: `draft/label` tracking on every sent line when CAPs permit
|
2019-06-02 14:23:02 +00:00
|
|
|
- Enforce Python version 3.6.0 or later
|
2019-06-01 14:09:02 +00:00
|
|
|
- 'module-whitelist'/'module-blacklist' in `bot.conf`
|
2019-05-26 15:26:32 +00:00
|
|
|
|
2019-05-30 06:45:49 +00:00
|
|
|
Changed:
|
2019-06-02 14:22:37 +00:00
|
|
|
- IRCv3: Use last `server-time` for `RESUME` - not last .recv() time
|
2019-05-30 06:45:49 +00:00
|
|
|
- IRCv3: `draft/labeled-response` -> `draft/labeled-response-0.2`
|
2019-06-02 14:21:51 +00:00
|
|
|
- IRCv3: Prune already-seen messages in `chathistory` batches
|
2019-06-03 11:46:08 +00:00
|
|
|
- Consolidate `PRIVMSG`, `NOTICE` and `TAGMSG` handlers in to one
|
2019-05-30 06:45:49 +00:00
|
|
|
|
2019-05-26 15:26:32 +00:00
|
|
|
Fixed
|
2019-06-03 11:46:34 +00:00
|
|
|
- GitHub highlight prevention - don't detect highlights mid-word
|
2019-05-28 12:51:58 +00:00
|
|
|
- Pass already-decoded data in to BeautifulSoup
|
2019-05-28 09:47:31 +00:00
|
|
|
- !enablemodule actually removes module from blacklist setting
|
2019-05-31 17:00:13 +00:00
|
|
|
- Only enact write throttling when immediate-write-buffer is empty
|
2019-06-02 06:23:49 +00:00
|
|
|
- Non-throttled lines no longer delay throttled lines
|
2019-05-26 15:26:32 +00:00
|
|
|
|
2019-05-24 05:52:25 +00:00
|
|
|
# 2019-05-24 - BitBot v1.7.1
|
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- Fix crash caused by CAP NEW
|
|
|
|
|
2019-05-23 22:09:35 +00:00
|
|
|
# 2019-05-23 - BitBot v1.7.0
|
2019-05-23 22:05:23 +00:00
|
|
|
|
2019-05-23 22:09:35 +00:00
|
|
|
Added:
|
2019-05-23 22:05:23 +00:00
|
|
|
- Add !addserver
|
2019-05-23 22:09:35 +00:00
|
|
|
- Add !masterpassword
|
2019-05-23 22:05:23 +00:00
|
|
|
- Add auto-tweet setting
|
2019-05-23 22:09:35 +00:00
|
|
|
- Support triggering commands by regex
|
|
|
|
|
|
|
|
Changed:
|
|
|
|
- Show usage examples for user/channel/server/bot settings
|
|
|
|
- Strip common command prefixes from PM commands so "!help" works
|
2019-05-23 22:05:23 +00:00
|
|
|
- Change auto-github to work for github urls too
|
2019-05-23 22:09:35 +00:00
|
|
|
- IRCv3: draft/resume-0.3 -> draft/resume-0.4
|
2019-05-23 22:05:23 +00:00
|
|
|
- Remove `ipv4` server attribute - figure it out automatically
|
2019-05-23 22:09:35 +00:00
|
|
|
|
|
|
|
Fixed:
|
|
|
|
- Typos/bugs in BATCH and FAIL
|
2019-05-23 22:05:23 +00:00
|
|
|
- Fix crash caused by BitBot messaging himself
|