The "Crunchy" release. This release includes all bug fixes from PyLink 1.0.4, along with the following:
### Changes from 1.1-alpha1
#### Feature changes
- Most plugins were ported to use the permissions API, meaning multiple accounts are actually useful now!
- Having a **PyLink login** with *new* style accounts **no longer implies access to everything** on the PyLink daemon. See the updated example conf regarding the new `permissions:` block.
- **Logins implying admin access** is limited to **old accounts ONLY** (i.e. logins defined via login:user/password)
- The `commands` plugin now has permissions checks for `echo`, `showuser`, `showchan`, and `status`. The latter three are granted to all users (`*!*@*`) by default, while `echo` is restricted.
- Clientbot now supports IRCv3 SASL (with optional reauth!) and multi-prefix. See the example conf for details on the former (the latter is enabled automatically when available).
- PID file checking is now **disabled** by default for better migration from 1.0.x. Run PyLink with `--check-pid` in order to turn it on.
- commands: add a new `logout` command (#370)
- The `list` command now supports optionally filtering commands by plugin.
#### Bug fixes
- The permission to use servermaps is now `servermaps.map` instead of `servermap.map`.
- networks: fix the `remote` command to work with permissions (i.e. override the correct account name)
- relay: add missing permissions check on the `linked` command
#### Internal fixes / improvements
- relay: rewrite host normalization to whitelist instead of blacklist characters. This should improve compatibility with IRCds as previously untested characters are introduced.
- relay_clientbot: faster colour hashing using built-in `hash()` instead of md5
- opercmds: removed the source argument from `kick` and `kill`; it's confusing and isn't very useful
#### Misc. changes
- Documentation updates: add a permissions reference, document advanced relay config, etc.
- **Clientbot now supports optional mode syncing** :tada: See the example conf for how to configure it (look for "modesync").
- PID file checking has been implemented and is turned on by default. :warning: **When upgrading from 1.0.x, remove `pylink.pid` before starting!**
- Revamped login configuration system, which now supports **multiple accounts and hashed passwords**
- :warning: `login:user` and `login:password` are now deprecated and may be removed in a future release. Consider migrating to the new `login:` block in the example config.
- Hashing new passwords can be done using the `mkpasswd` command via IRC, or the new command line utility `pylink-mkpasswd`.
- Services bots now support setting modes on themselves on join: see "joinmodes" in the example conf
- Added a contrib module downloader (`pylink-contribdl`)
- Relay now uses the PyLink permission system. The following permissions are now available:
- Granted to opers by default:
-`relay.create`
-`relay.destroy`
-`relay.claim`
-`relay.link`
-`relay.delink`
-`relay.linkacl.view`
-`relay.linkacl`
- Granted to all users by default:
-`relay.linked`
- And the following which is not explicitly granted:
-`relay.savedb`
- Relay: added a `purge` command to remove all relays involving a network
- Automode now supports remote channel manipulation in the form `netname#channel` (#352)
- protocols/ts6 now supports legacy UID introduction, for older servers / services
- Changehost gained a few new features (look for "changehost:" in the example conf):
- Optional (per network) vHost enforcement: now you can create spoofs like freenode without using their IRCd!
- Enforcement exceptions for the feature above
- Options to enable/disable matching users by IP and real host
- New protocol support for `ircd-ratbox`, based off `ts6`
- New servermaps plugin, displaying network `/map`'s from the PyLink server's perspective. Relay links can be expanded as well to make this more detailed!
- Oper status tracking is now a network-specific option, for better security. Look for "track_oper_statuses" in the example config.
- The PyLink launcher now sets the terminal title on launch (Windows & POSIX)
- relay: implement a complementary `showchan` command, showing a list of relay links
#### Bug fixes
- Relay is potentially less crashy when PyLink is split off while it tries to introduce users (#354).
- The `bots` plugin now allows JOIN/NICK/PART on all service bots
- Relay: skip channel TS check for Clientbot (some users had this as a sporadic issue)
- Irc: explicitly kill connect loop threads after an Irc object has been removed. This fixes various freezing issues caused by ghosted connections after a network splits (#351).
- Relay: don't error when removing a channel from a network that isn't connected. (AttributeError on `removeChannel()` if `irc.pseudoclient` isn't set)
#### Internal fixes / improvements
- Server ID and service client name (if applicable) are now stored inside `IrcUser` objects, removing the need for some expensive reverse lookups
- Relay and Automode now use a centralized DataStore (backwards compatible) in `structures` for their database implementation
- Docstring rewrapping is now supported for neater, wrappable docstrings! (#307)
-`Irc.error()` was added for easier error replies; it is a simple wrapper around `Irc.reply()`
- Relay now uses locks in DB read/writes, for thread safety
- Most camel case functions in Relay were renamed to lowercase with underscores (PEP 8)
#### Misc. changes
- exec: Drop `raw` text logging to DEBUG to prevent information leakage (e.g. passwords on Clientbot)
- Removed `update.sh` (my convenience script for locally building + running PyLink)
- Clientbot: Fixed nick collisions between virtual clients and real users (#327)
- Fix typo in example conf that caused `log::filerotation` to become an empty, `None`-valued block. This in turn caused the `log` module to crash.
#### Feature changes
- Clientbot now uses a more specific realname fallback ("PyLink Relay Mirror Client") instead of potentially misleading text such as "PyLink Service Client". In the future, this text may be made configurable.
#### Internal fixes / improvements
- setup.py: reworded warnings if `git describe --tags` fails / fallback version is used. Also, the internal VCS version for non-Git builds is now `-nogit` instead of `-dirty`.
- Clientbot now relays text sent from service bots.
- Fixed KeyErrors in Clientbot when receiving WHO replies for clients we don't know -- these are now ignored.
- Relay now skips mode type definitions when doing reverse mode lookup. This fixes channel mode `+l` mever being relayed UnrealIRCd, because `+l` happened to be the only supported type C mode.
- protocols/nefarious: fix UnboundLocalError when no modes are given on user introduction
- fantasy: don't error when bots are removed while processing a message (e.g. on shutdown)
#### Feature changes
- Automode now limits `listacc` to opers instead of all users (with default permissions settings).
The "Badgers" release. Note: This is an **beta** build and may not be completely stable!
### Changes from 0.10-alpha1
#### Bug fixes
- Fixes for the Clientbot protocol module:
- Fix `nick()` referring to the wrong variables (and thus not working at all)
- Fix crashes caused by forced nick changes on connect
- Clientbot now only sends `CHGHOST/CHGIDENT/CHGNAME` hooks the field has actually changed
- Automode now joins the Modebot client on `setacc`, if not already present
#### Feature changes
- Irc: implement basic message queueing (1 message sent per X seconds, where X defaults to 0.01 for servers) .
- This appears to also workaround sporadic SSL errors causing disconnects (https://github.com/GLolol/PyLink/issues/246)
- relay: CLAIM is now more resistant to things like `/OJOIN` abuse<sup><sup><sup>Seriously people, show some respect for your linked networks ;)</sup></sup></sup>.
- core: New permissions system, used exclusively by Automode at this time. See `example-permissions.yml` in the Git tree for configuration options.
- relay_clientbot now optionally supports PMs with users linked via Clientbot. This can be enabled via the `relay::allow_clientbot_pms` option, and provides the following behaviour:
- Private messages and notices *TO* Clientbot users are forwarded from the Relay bot as NOTICE.
- Private messages can be sent *FROM* Clientbot users using the `rpm` command in `relay_clientbot`
- The PyLink launcher now shows the full VCS version in `pylink -v`
- Revert "relay_clientbot: always lowercase network name (stylistic choice)"
#### Internal fixes / improvements
- protocols/unreal: use umode `+xt` instead of blind `/SETHOST` when spawning users
- protocols/clientbot: handle numerics 463 (ERR_NOPERMFORHOST), 464 (ERR_PASSWDMISMATCH), and 465 (ERR_YOUREBANNEDCREEP) as fatal errors
- protocols: various fields in hook payloads are renamed for consistency:
- The `chandata` field in SQUIT payloads is renamed to `channeldata`
- The `oldchan` field in MODE payloads is renamed to `channeldata`
-`Irc.msg()` should no longer send empty text strings (which are technically illegal) in things like help strings.
- Irc: make sending of loopback hooks in `msg()` optional
- relay_clientbot: switch to `irc.msg()` for relayed text
#### Misc. changes
- Various to documentation update and installation instruction improvements.
Tagged as **0.10-alpha1** by [GLolol](https://github.com/GLolol) on 2016-08-22T00:04:34Z
The "Balloons" release. Note: This is an **alpha** build and may not be completely stable! This version includes all fixes from PyLink 0.9.2, with the following additions:
### Changes from 0.9.2
#### Bug fixes
- Improved syncing between Automode and Relay on JOINs. In other words: fixed Automode sometimes setting modes on join before all of a target's relay clones have joined corresponding relay channels on remote networks.
- protocols/inspircd now tracks required modules for vHost updating (CHGHOST/IDENT/NAME), instead of potentially sending unknown commands to the IRCd and causing a netsplit.
- changehost now explicitly forbids `$host` from being used in expansion fields, preventing vHosts from potentially being set in a loop whenever `applyhosts` is called.
-`eval` now formats empty strings correctly, instead of having no visible reply. In other words, it now wraps all output with `repr()`.
- relay: fix reversed prefix mode order in bursts (e.g. `+@~UID` instead of `~@+UID`). Fortunately, this is minor detail; no noticeable adverse effects to IRCd linking was ever experienced.
#### Feature changes
- **WIP** Clientbot protocol module: allows PyLink to connect as a bot to servers, for purposes such as relay.
- Some features such as flood protection, services account tracking, and IRCv3 support are still missing.
- **For Clientbot relay support, remember to also load the `relay_clientbot` plugin!**
- Added the ability to rotate logs at certain sizes, keeping X backups for reference.
- REHASH now updates file logging settings.
- Relay now allows configuring a list of nick globs to always tag nicks (`forcetag_nicks:` block in `relay:`)
- networks: new `reloadproto` command, allowing in-place reloading of protocol modules without restart.
- Ctrl-C / KeyboardInterrupt now cleanly shuts down PyLink (in most cases).
- SSL cert file and key file are now optional.
- changehost: show more friendly errors when an expansion field is unavailable
- protocols/inspircd: add support for SAKICK, ALLTIME.
- protocols/ unreal: add support for TSCTL ALLTIME.
- Added support for `/time` requests.
#### Internal fixes / improvements
- Shutdown now cleanly quits the PyLink service bot instead of simply splitting off.
- PyLink now shows a better error if a protocol module chosen is missing.
- Config key validation is now protocol-specific.
- The `IrcUser.identified` attribute was renamed to `IrcUser.account`.
- exec: make `pylinkirc` and `importlib` accessible for easier debugging.
- SQUIT hooks get a few more arguments, such as `nicks` (affected nicks) and `serverdata` (old IrcServer object).
- Retrieving the hostname used by the current PyLink instance is now a shared function: `irc.hostname()`
- Better handling of empty lines in command help - these are now sent as a single space instead of passing invalid text like `:<UID> NOTICE <UID> :` to the IRCd (no text in the text parameter).
- protocols/ts6: handle incoming ETB (extended topic burst) and EOPMOD (partial support; op moderated +z messages are converted to forms like `@#channel`).
- protocols/unreal: explicitly declare support for ESVID, or account name arguments in service stamps. Realistically this doesn't seem to affect S2S traffic, but it is the correct thing to do.
#### Misc. changes
-`FakeIRC` and `FakeProto` are removed (unused and not updated for 0.10 internal APIs)
- Relay now treats `{}` as valid characters in nicks.
- Fixed services login tracking for older Anope services + UnrealIRCd. Previously, PyLink would incorrectly store login timestamps as the account name, instead of the user's nick.
- Relay now normalizes `/` to `.` in hostnames on IRCd-Hybrid.
- Cloaked hosts for UnrealIRCd 3.2 users are now applied instead of the real host being visible.
### *Important*, backwards incompatible changes for those upgrading from 0.8.x!
- The configuration file is now **pylink.yml** by default, instead of **config.yml**.
- PyLink now requires installing itself as a module, instead of simply running from source. Do this via `python3 setup.py install --user`.
- The `use_experimental_whois` option for InspIRCd servers and the `spawn_servers` option in Relay have been removed, as they are now implied.
### Changes from 0.9.0
#### Bug fixes
- Fixed various bugs in channel TS handling (this should reduce mode desyncs with relay).
- protocols/unreal: fixed services account support for older services (e.g. Anope <2.0)thatdon'texplicitlyuseaccountnamesforlogins(#296).
- Mode changes are no longer sorted alphabetically when relayed: sorting now only applies for displaying a list of modes, such as in WHOIS.
- Invalid autojoin channels are now ignored, instead of passing potentially invalid data to the IRCd.
#### Feature changes
-`setup.py` now explicitly forbids installing on Python 2 (#297).
- The `nefarious` protocol module now forwards MODE and KICK through servers if the sender isn't opped, preventing many mode bounces, kick failures, and HACK server notices.
#### Internal fixes / improvements
- protocols/hybrid,ts6,unreal: Casemapping-specific lowercasing is now consistently used for channel names
- Relay now catches errors on network removal and ignores them.
- Channels names are now case normalized when receiving `@#channel` messages.
### *Important*, backwards incompatible changes for those upgrading from 0.8.x
- The configuration file is now **pylink.yml** by default, instead of **config.yml**.
- PyLink now requires installing itself as a module, instead of simply running from source. Do this via `python3 setup.py install --user`.
----
### Changes from 0.9-alpha1
##### Added / changed / removed features
- The `use_experimental_whois` option for InspIRCd servers is removed, and is now implied.
- New config option `bot: whois_show_extensions_to_bots`, which optionally disables extended WHOIS replies for users marked as a bot (+B).
- This increases security when relay is enabled, for bots that look for services logins in WHOIS.
- Automode has new `clearacc` and `syncacc` commands, for clearing and syncing access lists respectively.
- Relay now allows nick tagging to be turned off by default, via the option `relay: tag_nicks` (#116)
- This is experimental, and nick tagging is still enabled by default.
- Any attempts to KILL or SVSNICK a relay client are treated to force tag a nick, so things like `/ns release`, `/ns ghost`, and `/ns regain` should work with network services.
- Automode now only sends one MODE command per sync, to prevent changes from flooding channels.
- Relay separators can now be configured globally (`relay: separator` option), with server-specific overriding that value if given.
##### Bug fixes
- corecommands: fix `unload` failing to remove hooks and commands (0.9.x regression).
- protocols/nefarious: only send EOB_ACK to the direct uplink, preventing stray "acknowledged end of net.burst" messages from showing up. Thanks to Speakz on Evilnet IRC for reporting.
- protocols/unreal: fix server name of the uplink server not being saved (#268)
- Channel prefixes are now sorted in WHOIS output (i.e. no more wrong `@~#channel`), and only the highest prefix shown
- Fixed issues in internal channel mode tracking (c1cd6f4 58d71b0)
- WHOIS requests to the PyLink server for clients that aren't PyLink bots now work (syntax: `/raw whois pylink.server somenick`). "No such nick" errors are also sent when the target is missing, instead of raising warnings.
- These WHOIS responses were previously sent from the wrong source (the server that the client was on, instead of the PyLink server), causing them to be ignored if they were going the wrong way.
- Automode now treat channels case insensitively in `delacc`.
-`ascii` and `rfc1459` case mappings now treat Unicode case sensitively, in the same way an IRCd would.
##### Internal improvements
- Removed inaccurate references to signon time in WHOIS and elsewhere.
- Changes to user timestamps are now tracked on NICK and SAVE commands
- Relay now creates relay clones with the current time as nick TS, instead of the origin user's TS.
- This has the effect of purposely losing nick collisions against local users, so that it's easier to reclaim nicks.
Tagged as **0.9-alpha1** by [GLolol](https://github.com/GLolol) on 2016-07-09T07:27:47Z
### Summary of changes from 0.8.x
##### Backwards incompatible changes
- Configuration file is now **pylink.yml** by default, instead of **config.yml**.
- PyLink now requires installing itself as a module, instead of simply running from source. Do this via `python3 setup.py install --user`.
##### Added / changed / removed features
- New **`ctcp`** plugin, handling CTCP VERSION and PING ~~(and perhaps an easter egg?!)~~
- New **`automode`** plugin, implementing basic channel ACL by assigning prefix modes like `+o` to hostmasks and exttargets.
- New exttarget support: see https://github.com/GLolol/PyLink/blob/0.9-alpha1/coremods/exttargets.py#L15 for a list of supported ones.
- Relay can now handle messages sent by users not in a target channel (e.g. for channels marked `-n`)
- Relay subserver spawning is now always on - the `spawn_servers` option is removed
- Relay can now optionally show netsplits from remote networks, using a `show_netsplits` option in the `relay:` block
- The `channels` configuration option in `server:` blocks is now optional, and defaults to no channels if not specified
- The `maxnicklen` configuration option is also now optional, with a default value of 30 characters.
-`--version`, `--no-pid`, and `--help` are now implemented by PyLink's command line script
- Test cases were dropped - they were broken and poorly maintained.
- CPUlimit wrapper scripts were removed.
- Service bots now allow plugins to define service descriptions and mark commands as featured when adding them.
- Command replies for services bots are now consolidated into core. In general, FANTASY commands now reply in channel as PRIVMSG, while all commands sent in PM reply as private notices.
- protocols/inspircd: new `use_experimental_whois` server option, which forces PyLink to handle WHOIS requests locally. This allows relay WHOIS extensions like account name and origin server name (`whois_show_*` options) to actually work on InspIRCd networks.
- PyLink can now optionally protect its services clients by setting servprotect modes (InspIRCd umode `+k`, `+S` elsewhere). The option for this is `protect_services` in the `bot:` block.
- The `networks` now deletes IRC objects when `disconnect` is used. To reconnect all disconnected networks, use the `rehash` command.
- Relay now hides disconnected leaf networks from LINKED output.
##### Bug fixes
- Services bots will now ignore unhandled CTCP requests, instead of responding with "Unknown command"
- The `sid` field for TS6 servers now accepts unquoted numeric SIDs (integers) by normalize the SID to a string
- The PyLink bot now rejoins relay channels when it is killed
- protocols/ts6: fix wrong args in TB handling
##### Internal improvements
-`coreplugin.py` is split into `coremods/`, with many different submodules for easier maintenance.
- Rewritten channel TS handling to be more concise and reusable
- protocols/unreal: warn about mode bounces instead of fighting with the uplink
- protocols/ts6, protocols/nefarious: use protocol-specific ban bursting instead of sending a regular MODE
-`Irc.parseModes()` now handles strings given as the mode list properly, instead of only accepting a list of modestring arguments
-`SQUIT` handlers now return an `uplink` field with the SID of the server that the target was split from
- protocols/ts6: send 12 users (SJOIN) and 10 modes (TMODE) per line, instead of 10 and 9 respectively
- Relay is now slightly more careful when normalizing nicks: they can't have invalid characters, start with a hyphen (-), etc.
- Modes are now sorted when joined. You'll now see things like `+Hiow` instead of `+wHoi`
- protocols/inspircd: services clients with mode +k now have the "Network Service" oper type, in WHOIS replies and elsewhere
- SQUIT and KILL handling are moved into a protocols/ircs2s.py module, as the handling is basically the same on both TS6 and P10.
- protocols/nefarious,ts6,unreal: KILL handling (inbound & outbound) now supports kill paths and formats kill reasons properly
- protocols: encapsulated (ENCAP) commands are now implicitly expanded, so protocol modules no longer need to bother with IF statement chains in a `handle_encap()`
cf15bed58dfd91ebb2ff2aa31ae19706f3f8abe5 classes: add services_account field in IrcUser (#25), default 'identified' attribute to empty string instead of None
584f95211383a3363be39c39a0409f65d1793de0 conf: check to make sure logging block exists in config
5877031203ceee2e60dc3d204691ddcb31393761 Merge branch 'master' into devel
21167e8fb3db21bf07bac890e2787a4fc535ffb1 example conf: use 1 "#" without trailing space for commented-out options
0d4655c381a1096920e16ce443ca688a7223755c core: support multiple channel loggers with DIFFERENT log levels & fix example conf (#83)
669e889e6fbc9a8405f4c8a751ccebe2c1990faa Support configurable SSL fingerprint hash types (Closes #157)
08fd50d3d8cbed4885791ec97f7c64f025664e08 Logging improvements, including support for custom file targets (#83)
de84a5b4376da3e9636bad6463d7b79af0faa0c2 log: default level should be INFO, not DEBUG
cf1de08457753bdfd13d340f2cfcb3e02998dd67 commands: support rehashing channel loggers
2503bd3ee5e512a5f6bfbd5ffe64edabcb64c278 commands: In rehash, use irc.disconnect() to disconnect networks removed from conf
14efb27fe8179cc199dab182e567c1ce4567ccdc Initial experimental support for logging to channels (#83)
4b939ea641284aa9bbb796adc58d273f080e59ee ts6: rewrite end-of-burst code (EOB is literally just a PING in ts6)
5a68dc1bc5f880d1117ca81e729f90fb5e1fce38 Irc: don't call initVars() on IRC object initialization
- Protocol specification is rewritten, with "Client" and "Server" dropped from the suffix of most outgoing commands: see acdd7dbb782765f581...2fd0a8ae741a663d.
- exec plugin: add `inject` and `raw` commands (4e7396b).
- exec plugin: support newline (and other) escapes in `exec` (375dbe8).
- protocols: allow changing remote users' hosts in updateClient (741fed9).
- Speed up and clean up shutdown sequence, fixing hangs due to sockets not shutting down cleanly (#152).
- protocols/unreal: Support cloaking with user mode `+x` (#136).
- Various bug fixes - see https://github.com/GLolol/PyLink/compare/0.5-dev...0.6.0-dev for a full diff.
cc171eb79a5d7500487ff3c0c0955d337d6b72a2 relay: abort connection when spawning a server fails
cf2ba4b492107a618c04108747dc33833e31409b pylink: use sys.path instead of imp library hacks
a903f9750787759e5294cc7d3ab5fd93f9782b3f Make world.plugins a dict instead of a list
a37d4b6f3c2c2dc13a16932a25cea73a8f1d8717 fantasy: only work when the main PyLink client is in the channel
7470efc461b8bce05a07c4d1f7fac24d44822bfa commands: add an echo command
7d919e643ad071c33afb0219ac44acc87a7a5fd7 relay: forward messages from the main PyLink client too
97a135a6f1dcef6bf7178a303aea2c3f87c3542e classes: add special PYLINK_SELF(PRIVMSG/NOTICE) hooks for command loopback
034731ab1e52cdafae436d122669e62872091485 core: log which plugin is being called when calling hooks
0378fcca1d8a00d566e2a68e9efd3573bd870644 fantasy: don't allow internal clients to trigger
8e444c5dbe173a477e31630861d04fad5726bec9 plugins: support FANTASY (where reasonable) by using irc.msg(irc.called_by, ...) instead of irc.msg(source, ...)
f55d227329169022ecc5e0d7aae343e8f330386d example conf: add fantasy.py to list and plugin descriptions
4509e0757d6d2bc3c5d7334be126fcadca42e57a FANTASY support plugin (Closes #111)
822544e3ccc3e73219638c5e78469589fe16c8f0 core: keep track of where last command was called & make command calling a shared function
708d94916477f53ddc79a90c4ff321f636c01348 relay: join remote users before sending ours
8d44830d5c5b12abd6764038d7e9983998acdfc6 relay.handle_kill: prevent yet another RuntimeError
6d6606900e2df60eb8055da0e4452a560c7510b5 relay: coerse "/" to "|" in nicks if "/" isn't present in the separator
c8e7b72065b2686c9691b276989ee948023ffe4d protocols: lowercase channel names in PRIVMSG handling
37eecd7d69cec794186024bf715a8ba55902d0e8 pr/inspircd: use OPERTYPE to oper up clients correctly, and handle the metadata accordingly 9f0f4cb1246c95335f42a24f7c5016175e6fba66 relay: burst the right set of modes
7620cd7433d9dc53dda1bdb06f6a9c673757f1f6 pr/inspircd: fix compatibility with channel mode +q (~)
3523f8f7663e618829dccfbec6eccfaf0ec87cc5 LINKACL support
Tagged as **0.2.3-dev** by [GLolol](https://github.com/GLolol) on 2015-07-26T06:11:20Z
The "prevent PyLink from wrecking my server's CPU" release.
Mostly bug fixes here, with a couple of scripts added (`start-cpulimit.sh` and `kill.sh`) added to assist running PyLink under the protection of [CPUlimit](https://github.com/opsengine/cpulimit). :)
#### New features
- relay: Block most duplicate modes from being relayed (#71)
- main: write a PID file to `pylink.pid` (f85fbd934bb2001122079da9e37e2fd1f9041a18)
- ts6: support `+AOS` charybdis extension modes, warning if the IRCd doesn't support them (146ab5e)
#### Fixes
- relay: quit users who aren't on any shared channels after KICK (71a3464)
- Use RFC1459 for case mapping on InspIRCd (01220b3)
- relay: Fix handling of local `SAVE` (e4da670) and `KILL` (a4da9b5) commands
- relay: fix nick collision loop on `SAVE` + when both tagged (i.e. _42XAAAAAA) and untagged (42XAAAAAA) versions of a UID nick exist (e354ada)
- relay: Fix command arguments of `DELINK` on home networks (c07cfb1)
- relay: `SJOIN` users once, and only once (#71, b681a67)
- main.Irc: catch `OSError` (bad file descriptor) errors and disconnect
- ts6: add QS as a required capability (69e16e5)
- ts6: fix `JOIN` handling and `parse_as` key handling in hooks (ddefd38)
- relay: only wait for `irc.connected` once per network (4d7d7ce)
Full diff: https://github.com/GLolol/PyLink/compare/0.2.2-dev...0.2.3-dev
Tagged as **0.2.0-dev** by [GLolol](https://github.com/GLolol) on 2015-07-23T04:44:17Z
Many changes in this development release, including:
- **New `ts6` protocol module, for charybdis 3.x.**
- relay: add nick collision handling via `SAVE` (#61).
- relay: trivial tasks like `TOPIC`, `MODE`, `KICK` and `PART` no longer spawn new clients for their senders, and are routed through the pseudoserver when applicable instead (e76d31d c0f8259).
- Irc: be safer against `UnicodeDecodeError` caused by `socket.recv()` cutoff, by decoding each individual line instead (06d17d5).
- relay: make the `nick/net` separator a per-network config option. (ad34f6c).
- relay: Use a whitelist when it comes to relaying modes (#54), and strip out bans that don't match `nick!user@host` syntax (#55).
- relay: Handle user mode changes (#64).
- Support different case mappings for nicknames (RFC1459 vs ASCII) (#75).