PyLink 2.0 comes with a ton of new features, refinements, and optimizations. Here is a summary of the most interesting changes - for detailed changelogs, consult the release notes for individual snapshots below.
This release does *not* preserve compatibility with third-party plugins written for PyLink 1.x!
#### New features
- **Added support for ngIRCd, ChatIRCd, and beware-ircd** (via protocol modules `ngircd`, `ts6`, and `p10` respectively)
- **Add support for extbans** on UnrealIRCd, Charybdis (and derivatives), InspIRCd, and Nefarious.
- **U-lined services servers can now be configured for use with Relay**:
-`CLAIM` restrictions are relaxed for service bots, which may now join with ops and set simple modes. This prevents mode floods when features such as `DEFCON` are enabled, and when a channel is accidentally registered on a network not on the CLAIM list.
-`DEFCON` modes set by services are ignored by Relay instead of bounced, and do not forward onto other networks unless the setting network is also in the channel's `CLAIM` list.
- To keep the spirit of `CLAIM`, opped services not in a channel's `CLAIM` list are still not allowed to kick remote users, set prefix modes (e.g. op) on others, or modify list modes such as bans.
- **New Antispam plugin, with the ability to kill / kick / block mass-highlight spam and configured "spam" strings.**
- **Added TLS certificate verification, which is enabled by default on Clientbot networks**. [issue#592](https://github.com/jlu5/PyLink/issues/592)
- This adds the options `ssl_validate_hostname` and `ssl_accept_invalid_certs` options which have defaults as follows:
- | Server type | `ssl_validate_hostname` | `ssl_accept_invalid_certs` |
| Full links (S2S) | false (implied by `ssl_accept_invalid_certs: true`) | true |
| Clientbot networks (C2S) | true | false |
-`ssl_validate_hostname` determines whether a network's TLS certificate will be checked for a matching hostname.
-`ssl_accept_invalid_certs` disables certificate checking entirely when enabled, and also turns off `ssl_validate_hostname`.
- The existing TLS certificate fingerprint options are unchanged and can be turned on and off regardless of these new options.
- New Relay features:
- LINKACL now supports whitelisting networks in addition to the original blacklist implementation (see `help LINKACL`). [issue#394](https://github.com/jlu5/PyLink/issues/394)
- Relay IP sharing now uses a pool-based configuration scheme (`relay::ip_share_pools`), deprecating the `relay::show_ips` and `relay_no_ips` options.
- IPs and real hosts are shared bidirectionally between all networks in an ipshare pool,and masked as `0.0.0.0` when sending to a network not in a pool and when receiving those networks' users.
- KILL handling received a major rework ([issue#520](https://github.com/jlu5/PyLink/issues/520):
- Instead of always bouncing, kills to a relay client can now be forwarded between networks in a killshare pool (`relay::kill_share_pools`).
- If the sender and target's networks are not in a killshare pool, the kill is forwarded as a kick to all shared channels that the sender
has CLAIM access on (e.g. when they are the home network, whitelisted in `CLAIM`, and/or an op).
-`relay_clientbot` now supports setting clientbot styles by network. [issue#455](https://github.com/jlu5/PyLink/issues/455)
- The defaults for CLAIM (on or off) and LINKACL (whitelist or blacklist mode) can now be pre-configured for new channels. [issue#581](https://github.com/jlu5/PyLink/issues/581)
- New `relay::allow_free_oper_links` option allows disabling oper access to `CREATE/LINK/DELINK/DESTROY/CLAIM` by default
- relay_clientbot: add support for showing prefix modes in relay text, via a new `$mode_prefix` expansion. [issue#540](https://github.com/jlu5/PyLink/issues/540)
- Clientbot is now more featureful:
- Added support for IRCv3 caps `account-notify`, `account-tag`, `away-notify`, `chghost`, `extended-join`, and `userhost-in-names`
- Clientbot now supports expansions such as `$nick` in autoperform.
- Configurable alternate / fallback nicks are now supported: look for the `pylink_altnicks` option in the example config.
- Added support for WHOX.
- Clientbot can now optionally sync ban lists when it joins a channel, allowing Relay modesync to unset bans properly. See the `fetch_ban_lists` option in the example config.
- Failed attempts to join channels are now logged to warning. [issue#533](https://github.com/jlu5/PyLink/issues/533)
- New commands for the opercmds plugin, including:
-`chghost`, `chgident`, and `chgname`, for IRCds that don't expose them as commands.
-`massban`, `masskill`, `massbanre`, and `masskillre`, which allow setting mass bans/kills/G/KLINEs on users matching a `nick!user@host` mask, exttarget, or regular expression. The hope is that these tools can help opers actively fight botnets as they are connected, similar to atheme's `clearchan` and Anope's `chankill` commands.
-`checkban` and `checkbanre`, which return the users matching a target
- Messages sent by most commands are now transparently word-wrapped to prevent cutoff. [issue#153](https://github.com/jlu5/PyLink/issues/153)
- PyLink accounts are now implicitly matched: i.e. `user1` is now equivalent to `$pylinkacc:user1`.
- PyLink now responds to remote `/STATS` requests (`/stats c`, `u`, and `o`) if the `stats` plugin is loaded.
- The PyLink service client no longer needs to be in channels to log to them.
#### Feature changes
- **The ratbox protocol module has been merged into ts6**, with a new `ircd: ratbox` option introduced to declare Ratbox as the target IRCd. [issue#543](https://github.com/jlu5/PyLink/issues/543)
- The `raw` command has been split into a new plugin (`plugins/raw.py`) with two permissions: `raw.raw` for Clientbot networks, and `raw.raw.unsupported_network` for other protocols. Using raw commands outside Clientbot is not supported. [issue#565](https://github.com/jlu5/PyLink/issues/565)
- Some options were deprecated and renamed:
- The `p10_ircd` option for P10 servers is now named `ircd`, though the old option will still be read from.
- The `use_elemental_modes` setting on ts6 networks has been deprecated and replaced with an `ircd` option targeting charybdis, elemental-ircd, or chatircd. Supported values for `ircd` include `charybdis`, `elemental`, and `chatircd`.
- The `fml` command in the `games` plugin was removed.
#### Bug fixes
- clientbot: fix errors when connecting to networks with mixed-case server names (e.g. AfterNET)
- Fix `irc.parse_modes()` incorrectly mangling modes changes like `+b-b *!*@test.host *!*@test.host` into `+b *!*@test.host`. [issue#573](https://github.com/jlu5/PyLink/issues/573)
- clientbot: fixed sending duplicate JOIN hooks and AWAY status updates. [issue#551](https://github.com/jlu5/PyLink/issues/551)
#### Internal improvements
- Reading from sockets now uses a select-based backend instead of one thread per network.
- This is done via a new `UserMapping` class in `pylinkirc.classes`, which stores User objects by UID and provides a `bynick` attribute mapping case-normalized nicks to lists of UIDs.
-`classes.User.nick` is now a property, where the setter implicitly updates the `bynick` index with a pre-computed case-normalized version of the nick (also stored to `User.lower_nick`)
- Service bot handling was completely redone to minimize desyncs when mixing Relay and services. [issue#265](https://github.com/jlu5/PyLink/issues/265)
- **Added TLS certificate verification, which is now enabled by default on Clientbot networks**. [issue#592](https://github.com/jlu5/PyLink/issues/592)
- **LINKACL now supports whitelisting networks in addition to the original blacklist implementation** (see `help LINKACL`). [issue#394](https://github.com/jlu5/PyLink/issues/394)
- relay: The defaults for CLAIM (on or off) and LINKACL (whitelist or blacklist mode) can now be pre-configured for new channels. [issue#581](https://github.com/jlu5/PyLink/issues/581)
- Added `block` as a punishment to only hide messages from other plugins like relay. [issue#616](https://github.com/jlu5/PyLink/issues/616)
- Antispam can now process PMs to PyLink clients for spam - this can be limited to service bots, enabled for all PyLink clients (including relay clones), or disabled entirely (the default).
- IRC formatting (bold, underline, colors, etc.) is now removed before processing text. [issue#615](https://github.com/jlu5/PyLink/issues/615)
- IPv4/IPv6 address selection is now automatic, detecting when an IPv6 address or bindhost is given. [issue#212](https://github.com/jlu5/PyLink/issues/212)
- IPs and real hosts are shared bidirectionally between all networks in an ipshare pool,and masked as `0.0.0.0` when sending to a network not in a pool and when receiving those networks' users.
- Fixed ping timeout handling (this was broken sometime during the port to select).
- relay: block networks not on the claim list from merging in modes when relinking (better support for modes set by e.g. services DEFCON).
- Reworked relay+clientbot op checks on to [be more consistent](https://github.com/jlu5/PyLink/compare/fee64ece045ad9dc49a07d1b438caa019c90a778~...d4bf407).
- Login handling was rewritten and moved entirely from `coremods.corecommands` to `coremods.login`. [issue#590](https://github.com/jlu5/PyLink/issues/590)
-`remove_range()` removes a range string of (one-indexed) items from the list, where range strings are indices or ranges of them joined together with a "," (e.g. "5", "2", "2-10", "1,3,5-8") - [issue#506](https://github.com/jlu5/PyLink/issues/506)
-`get_hostname_type()` takes in an IP or hostname and returns an int representing the detected address type: 0 (none detected), 1 (IPv4), 2 (IPv6) - [issue#212](https://github.com/jlu5/PyLink/issues/212)
-`parse_duration()` takes in a duration string (in the form `1w2d3h4m5s`, etc.) and returns the equiv. amount of seconds - [issue#504](https://github.com/jlu5/PyLink/issues/504)
- **Experimental daemonization support via `pylink -d`**. [issue#187](https://github.com/GLolol/PyLink/issues/187)
- New (alpha-quality) `antispam` plugin targeting mass-highlight spam: it supports any combination of kick, ban, quiet (mute), and kill as punishment. [issue#359](https://github.com/GLolol/PyLink/issues/359)
- Clientbot now supports expansions such as `$nick` in autoperform.
- Relay now translates STATUSMSG messages (e.g. `@#channel` messages) for target networks instead of passing them on as-is. [issue#570](https://github.com/GLolol/PyLink/issues/570)
- **Reverted the commit making SIGHUP shutdown the PyLink daemon**. Now, SIGUSR1 and SIGHUP both trigger a rehash, while SIGTERM triggers a shutdown.
- The `raw` command has been split into a new plugin (`plugins/raw.py`) with two permissions: `raw.raw` for Clientbot networks, and `raw.raw.unsupported_network` for other protocols. Using raw commands outside Clientbot is not supported. [issue#565](https://github.com/GLolol/PyLink/issues/565)
- Relay now relays service client messages as PRIVMSG and P10 WALL\* commands as NOTICE
- protocols/inspircd: fix supported modules list being corrupted when an indirectly linked server shuts down. [issue#567](https://github.com/GLolol/PyLink/issues/567)
- This new code uses the Python selectors module, which automatically chooses the fastest polling backend available ([`epoll|kqueue|devpoll > poll > select`](https://github.com/python/cpython/blob/v3.6.5/Lib/selectors.py#L599-L601)).
- **API Break: significantly reworked channel handling for service bots**. [issue#265](https://github.com/GLolol/PyLink/issues/265)
- The `ServiceBot.extra_channels` attribute in previous versions is replaced with `ServiceBot.dynamic_channels`, which is accessed indirectly via new functions `ServiceBot.add_persistent_channel()`, `ServiceBot.remove_persistent_channel()`, `ServiceBot.get_persistent_channels()`. This API also replaces `ServiceBot.join()` for most plugins, which now joins channels *non-persistently*.
- This API change provides plugins with a way of registering dynamic persistent channels, which are consistently rejoined on kick or kill.
- Persistent channels are also "dynamic" in the sense that PyLink service bots will now part channels marked persistent when they become empty, and rejoin when it is recreated.
- This new implementation is also plugin specific, as plugins must provide a namespace (usually the plugin name) when managing persistent channels using `ServiceBot.(add|remove)_persistent_channel()`.
- New abstraction: `ServiceBot.get_persistent_channels()` which fetches the list of all persistent channels on a network (i.e. *both* the config defined channels and what's registered in `dynamic_channels`).
- New abstraction: `ServiceBot.part()` sends a part request to channels and only succeeds if it is not marked persistent by any plugin. This effectively works around the long-standing issue of relay-services conflicts. [issue#265](https://github.com/GLolol/PyLink/issues/265)
- Major optimizations to `irc.nick_to_uid`: `PyLinkNetworkCore.users` and `classes.User` now transparently maintain an index mapping nicks to UIDs instead of doing reverse lookup on every call.
- This is done via a new `UserMapping` class in `pylinkirc.classes`, which stores User objects by UID and provides a `bynick` attribute mapping case-normalized nicks to lists of UIDs.
-`classes.User.nick` is now a property, where the setter implicitly updates the `bynick` index with a pre-computed case-normalized version of the nick (also stored to `User.lower_nick`)
- Various relay optimizations: reuse target SID when bursting joins, and only look up nick once in `normalize_nick`
- Rewritten CTCP plugin, now extending to all service bots. [issue#468](https://github.com/GLolol/PyLink/issues/468), [issue#407](https://github.com/GLolol/PyLink/issues/407)
- The `endburst_delay` option to `spawn_server()` was removed from the protocol spec, and replaced by a private API used by protocols/inspircd and relay.
- New API: hook handlers can now filter messages from lower-priority handlers by returning `False`. [issue#547](https://github.com/GLolol/PyLink/issues/547)
- New API: added `irc.get_server_option()` to fetch server-specific config variables and global settings as a fallback. [issue#574](https://github.com/GLolol/PyLink/issues/574)
- relay_clientbot: add support for showing prefix modes in relay text, via a new `$mode_prefix` expansion. [issue#540](https://github.com/GLolol/PyLink/issues/540)
- Added new modedelta feature to Relay:
- Modedelta allows specifying a list of (named) modes to only apply on leaf channels, which can be helpful to fight spam if leaf networks don't have adequate spam protection.
- relay: added new option `server::<networkname>:relay_forcetag_nicks`, a per-network list of nick globs to always tag when introducing users onto a network. [issue#564](https://github.com/GLolol/PyLink/issues/564)
- Added support for UnrealIRCd extban `~T` in Relay. [issue#557](https://github.com/GLolol/PyLink/issues/557)
- p10: added proper support for STATUSMSG notices (i.e. messages to `@#channel` and the like) via WALLCHOPS/WALLHOPS/WALLVOICES
- p10: added outgoing /knock support by sending it as a notice
- ts6: added incoming /knock handling
- relay: added support for relaying /knock
#### Backwards incompatible changes
- **The ratbox protocol module has been merged into ts6**, with a new `ircd: ratbox` option introduced to declare Ratbox as the target IRCd. [issue#543](https://github.com/GLolol/PyLink/issues/543)
#### Bug fixes
- Fix default permissions not applying on startup (2.0-alpha1 regression). [issue#542](https://github.com/GLolol/PyLink/issues/542)
- Fix rejoin-on-kill for the main PyLink bot not working (2.0-alpha1/[94e05a6](https://github.com/GLolol/PyLink/commit/94e05a623314e9b0607de4eb01fab28be2e0c7e1) regression).
- Clientbot fixes:
- Fix desyncs caused by incomplete nick collision checking when a user on a Clientbot link changes their nick to match an existing virtual client. [issue#535](https://github.com/GLolol/PyLink/issues/535)
- Fix desync involving ghost users when a person leaves a channel, changes their nick, and rejoins. [issue#536](https://github.com/GLolol/PyLink/issues/536)
- Treat 0 as "no account" when parsing WHOX responses; this fixes incorrect "X is logged in as 0" output on WHOIS.
- Fix long standing issues where relay would sometimes burst users multiple times on connect. [issue#529](https://github.com/GLolol/PyLink/issues/529)
- Also fix a regression from 2.0-alpha1 where users would not be joined if the hub link is down ([issue#548](https://github.com/GLolol/PyLink/issues/548))
- Fix `$a:account` extbans being dropped by relay (they were being confused with `$a`). [issue#560](https://github.com/GLolol/PyLink/issues/560)
- Fix corrupt arguments when mixing the `remote` and `mode` commands. [issue#538](https://github.com/GLolol/PyLink/issues/538)
- Fix lingering queue threads when networks disconnect. [issue#558](https://github.com/GLolol/PyLink/issues/558)
- The relay and global plugins now better handle empty / poorly formed config blocks.
-`Channel.sort_prefixes()` now consistently sorts modes from highest to lowest (i.e. from owner to voice). Also removed workaround code added to deal with the wonkiness of this function.
- ircs2s_common: add handling for `nick@servername` messages.
-`IRCNetwork` should no longer send multiple disconnect hooks for one disconnection.
- protocols/ts6 no longer requires `SAVE` support from the uplink. [issue#545](https://github.com/GLolol/PyLink/issues/545)
The "Eclectic" release. This release includes all changes from 1.2.1, plus the following:
#### New features
- **Login blocks can now be limited by network, user hostname, and IRCop status**: see the new "require_oper", "hosts", and "networks" options in the example config.
- **Added support for ngIRCd, ChatIRCd, and beware-ircd** (via protocol modules `ngircd`, `ts6`, `p10` respectively)
- **Add support for extbans in protocols and relay**: this is supported on UnrealIRCd, Charybdis (and derivatives), InspIRCd, and Nefarious P10.
- Yes, this means you can finally mute bothersome relay users.
- Clientbot is now more featureful:
- Added support for IRCv3 caps `account-notify`, `account-tag`, `away-notify`, `chghost`, `extended-join`, and `userhost-in-names`
- Configurable alternate / fallback nicks are now supported: look for the `pylink_altnicks` option in the example config.
- Added support for WHOX, to complement IRCv3 `account-notify` and `account-tag`.
- Relay_clientbot can now relay mode changes as text.
- Clientbot can now optionally sync ban lists when it joins a channel, allowing Relay modesync to unset bans properly. See the `fetch_ban_lists` option in the example config.
- PyLink received a new launcher, which now checks for stale PID files (when `psutil` is installed) and supports shutdown/restart/rehash via the command line.
- New commands for the opercmds plugin, including:
-`chghost`, `chgident`, and `chgname`, for IRCds that don't expose them as commands.
-`massban`, `masskill`, `massbanre`, and `masskillre` - these commands allow setting kickbans, kills, or glines on users matching a PyLink mask (`n!u@h` mask/exttarget) or regular expression. The hope is that these tools can help opers actively fight botnets as they are connected, similar to atheme's `clearchan` and Anope's `chankill` commands.
-`checkbanre` - a companion to `checkban`, using regex matching
- Better support for (pre-defined) U-lined services servers in relay:
-`CLAIM` restrictions are relaxed for service bots, which may now join with ops and set simple modes. This prevents mode floods when features such as `DEFCON` are enabled, and when a channel is accidentally registered on a network not on the CLAIM list.
-`DEFCON` modes set by services are ignored by Relay instead of bounced, and do not forward onto other networks unless the setting network is also in the channel's `CLAIM` list.
- To keep the spirit of `CLAIM` alive, opped services not in a channel's `CLAIM` list are still not allowed to kick remote users, set prefix modes (e.g. op) on others, or set list modes such as bans.
- Service bots' hostnames and real names are now fully configurable, globally and per network.
- Added per-network configuration of relay server suffixes.
- Added IRC `/STATS` support via the `stats` plugin (`/stats c`, `u`, and `o` are supported so far)
- PyLink's connection time is now displayed when WHOISing service bots. This info can be turned off using the `pylink:whois_show_startup_time` option.
- More specific permissions for the `remote` command, which now allows assigning permissions by target network, service bot, and command.
- New `$service` exttarget which matches service bots by name.
#### Backwards incompatible changes
- Signal handling on Unix was updated to use `SIGUSR1` for rehash and `SIGHUP` for shutdown - this changes PyLink to be more in line with foreground programs, which generally close with the owning terminal.
- Some options were deprecated and renamed:
- The `p10_ircd` option for P10 servers is now named `ircd`, though the old option will still be read from.
- The `use_elemental_modes` setting on ts6 networks has been deprecated and replaced with an `ircd` option targeting charybdis, elemental-ircd, or chatircd. Supported values for `ircd` include `charybdis`, `elemental`, and `chatircd`.
- PID file checking is now enabled by default, along with checks for stale PID files *only* when [`psutil`](https://pythonhosted.org/psutil/) is installed. Users upgrading from PyLink <1.1-devwithout`psutil`installedwillneedremovePyLink'sPIDfilesbeforestartingtheservice.
- The `fml` command in the `games` plugin was removed.
#### Bug fixes
- Relay should stop bursting channels multiple times on startup now. (`initialize_channel` now skips execution if another thread is currently initializing the same channel)
- Fixed a long standing bug where fantasy responses would relay before a user's original command if the `fantasy` plugin was loaded before `relay`. (Bug #123)
#### Internal changes
- **API Break**: The protocol module layer is completely rewritten, with the `Irc` and `Protocol`-derived classes combining into one. Porting **will** be needed for old protocol modules and plugins targetting 1.x; see the [new (WIP) protocol specification](https://github.com/GLolol/PyLink/blob/devel/docs/technical/pmodule-spec.md) for details.
- **API Break**: Channels are now stored in two linked dictionaries per IRC object: once in `irc._channels`, and again in `irc.channels`. The main difference is that `irc._channels` implicitly creates new channels when accessing them if they didn't previously exist (prefer this for protocol modules), while `irc.channels` does not raises and raises KeyError instead (prefer this for plugins).
- **API Break**: Most methods in `utils` and `classes` were renamed from camel case to snake case. `log`, `conf`, and others will be ported too before the final 2.0 release.
- **API Break**: IRC protocol modules' server introductions must now use **`post_connect()`** instead of **`connect()`** to prevent name collisions with the base connection handling code.
- Channels are now stored case insensitively internally, so protocol modules and new plugins no longer need to manually coerse names to lowercase.
- Plugins can now bind hooks as specific priorities via an optional `priority` option in `utils.add_hook`. Hooks with higher priorities will be called first; the default priority value us 500.
- Commands can now be properly marked as aliases, so that duplicates don't show in the `list` command.
- Added basic `GLINE/KLINE` support for most IRCds; work is ongoing to polish this off.
- PyLink accounts are now implicitly matched: i.e. `user1` is now equivalent to `$pylinkacc:user1`
- Added complete support for "Network Administrator" and "Network Service" as oper types on IRCds using user modes to denote them (e.g. UnrealIRCd, charybdis).
- User and server hop counts are now tracked properly instead of being hardcoded as 1.
- protocols/p10 now bursts IPv6 IPs to supported uplinks.
- Fixed compatibility with ircd-hybrid trunk after commit 981c61e (EX and IE are no longer sent in the capability list)
The 1.3 update focuses on backporting some commonly requested and useful features from the WIP 2.0 branch. This release includes all changes from 1.3-beta1, plus the following:
- Errors due to missing permissions now log to warning. [issue#593](https://github.com/GLolol/PyLink/issues/593)
- Documentation updates to advanced-relay-config.md and the FAQ
The 1.3 update focuses on backporting some commonly requested and useful features from the WIP 2.0 branch. This beta release includes all changes from 1.2.1, plus the following:
#### New features
- **Backported the launcher from 2.0-alpha2**:
- Added support for daemonization via the `--daemon/-d` option. [issue#187](https://github.com/GLolol/PyLink/issues/187)
- Added support for shutdown/restart/rehash via the command line. [issue#244](https://github.com/GLolol/PyLink/issues/244)
- The launcher now detects and removes stale PID files when `psutil` (an optional dependency) is installed, making restarting from crashes a more streamlined process. [issue#512](https://github.com/GLolol/PyLink/issues/512)
- PID file checking is now enabled by default, with the `--check-pid/-c` option retained as a no-op option for compatibility with PyLink <= 1.2
- Following 2.0 changes, sending SIGUSR1 to the PyLink daemon now triggers a rehash (along with SIGHUP).
- Service bot idents, hosts, and realnames can now be configured globally and on a per-network basis. [issue#281](https://github.com/GLolol/PyLink/issues/281)
- Relay server suffix is now configurable by network (`servers::<netname>::relay_server_suffix` option). [issue#462](https://github.com/GLolol/PyLink/issues/462)
- Login blocks can now be restricted to specific networks, opered users, and hostmasks. [issue#502](https://github.com/GLolol/PyLink/issues/502)
- Relay now supports relaying more channel modes, including inspircd blockhighlight +V and exemptchanops +X (the whitelist was synced with 2.0-alpha3)
#### Bug fixes
- automode: fix errors when managing channels with multiple #'s in its name
- protocols/p10: fix the `use_hashed_cloaks` option not working correctly (it mistakenly read the value of `use_account_cloaks` instead)
- relay_clientbot: fix `@#channel` messages being relayed to channels other than the target
- Fixed sporadic disconnect issues on `BlockingIOError`, `ssl.SSLWantReadError`, and `ssl.SSLWantWriteError`
- protocols/unreal: fix the wrong hook name being sent when receiving legacy (Unreal 3.2) user introductions
- Config loading now uses `yaml.safe_load()` instead of `yaml.load()` so that arbitrary code cannot be executed. [issue#589](https://github.com/GLolol/PyLink/issues/589)
- Significantly revised example-conf for wording and consistency.
- protocols/unreal: bumped protocol version to 4017 (no changes needed)
- clientbot: warn when an outgoing message is blocked (e.g. due to bans) (#497)
- ts6: fix setting real host of users to 'None' if it wasn't given
#### Misc changes
- Removed incorrect descriptions regarding P10 `extended_accounts`. Both X3 and atheme support extended accounts, and this needs to match your IRCd settings regardless.
- Updated definitions in `channel/user-modes.csv`.
#### Internal improvements
- Backported improvements from 2.0-dev:
- Fix support for Hybrid 8.x trunk
- Minor logging cleanup for relay and `Irc.matchHost()`.
- Make relay nick tagging configurable per-network; backported from 2.0-dev (#494)
#### Bug fixes
- Fix extraneous removal of PID files even when `-n/--no-check-pid` was set or if the PID file already existed on launch (PyLink would quit and delete the old PID file in these cases)
- servprotect: bump default threshold up to 10 hits/10 seconds, as the old limit was too prone to false positives
- Fix extraneous queue threads not being stopped when a network disconnects (0d5afd2)
- Fix relay errors on disconnect due to race conditions in network handling (a0a295f)
#### Misc changes
- Updated example config and FAQ.
For a summary of major changes since 1.1.x, see the changelog for 1.2.0-rc1.
- ts6: fix parsing of the `INVITE` command's `ts` argument
- automode: fix formatting and examples in `setacc` help text
- p10: fix rejoin-on-kick relaying by also acknowledging kicks sent from PyLink to its clients with a PART
### Major changes since 1.1.x
- Added support for snircd, ircu, and other (generic) P10 variants. The target IRCd can be chosen using the new server-specific `p10_ircd` option; see the example config for details (#330).
- **The `nefarious` protocol module was renamed to `p10`**, as it is no longer Nefarious-specific. You should update your configuration to use the new name!
- **Certain configuration options were renamed / deprecated:**
- The `bot:` configuration block was renamed to `pylink:`, with the old name now deprecated.
-`logging:stdout` is now `logging:console` (the previous name was a misnomer since text actually went to `stderr`).
- The `bot:prefix` option is deprecated: you should instead define the `prefixes` setting in a separate config block for each service you wish to customize (e.g. set `automode:prefix` and `games:prefix`)
- **Using new-style accounts exclusively (i.e. specifying things under `login:accounts`) now requires a `permissions:` block for PyLink to start** (#413).
- New `stats` (uptime info) and `global` (global announcement) plugins.
- Plugins and protocol modules can now be loaded from any directory, using the new `plugin_dirs` and `protocol_dirs` options. (#350)
- The `pylink-contribdl` utility was dropped as it is now it obsolete.
- Relay message formatting became more flexible, and messages from servers (e.g. spurious invite announcements) can now be dropped: look for the `relay_weird_senders` and `accept_weird_senders` options.
- Relay now forbids linking to channels where the home network is down, which previously caused errors due to unreliable target TS (#419). This, along with the regular TS check, can be overridden with a new `link --force` option.
- The `remote` command now routes replies back to the caller network, and supports service bots that aren't the main PyLink bot via a `--service` option.
- Service bot spawning can now be disabled via the global `spawn_services` and per-service `spawn_service` options; doing so will merge the relevant commands into the main PyLink bot.
- Added a `pylink::show_unknown_commands` option to optionally disable "unknown command" errors. This option can also be overridden per-server and per-service (#441).
- Added a `pylink::prefer_private_replies` option to default to private command replies (#409).
- Relay can now announce to leaf channels when the home network disconnects; see the `relay::disconnect_announcement` option (#421).
For a full list of changes since 1.1.x, consult the changelogs for the 1.2.x beta and alpha releases below.
The "Dynamo" release. This release includes all fixes from 1.1.2, plus the following:
#### Feature changes
- Added configurable encoding support via the `encoding` option in server config blocks ([#467](https://github.com/GLolol/PyLink/pull/467)).
- **Certain configuration options were renamed / deprecated:**
- The `bot:` configuration block was renamed to `pylink:`, with the old name now deprecated.
-`logging:stdout` is now `logging:console` (the previous name was a misnomer since text actually went to `stderr`).
- The `bot:prefix` option is deprecated: you should instead define the `prefixes` setting in a separate config block for each service you wish to customize (e.g. set `automode:prefix` and `games:prefix`)
- Added new `$and` and `$network` exttargets - see the new [exttargets documentation page](https://github.com/GLolol/PyLink/blob/1.2-beta1/docs/exttargets.md) for how to use them.
- Hostmasks can now be negated in ban matching: e.g. `!*!*@localhost` now works. Previously, this negation was limited to exttargets only.
-`relay_clientbot` no longer colours network names by default. It is still possible to restore the old behaviour by defining [custom clientbot styles](https://github.com/GLolol/PyLink/blob/1.2-beta1/docs/advanced-relay-config.md#custom-clientbot-styles).
-`relay_clientbot` no longer uses dark blue as a random colour choice, as it is difficult to read on clients with dark backgrounds.
#### Bug fixes
- Fix service respawn on KILL not working at all - this was likely broken for a while but never noticed...
- Fix kick-on-rejoin not working on P10 IRCds when `joinmodes` is set. (a.k.a. acknowledge incoming KICKs with a PART per [the P10 specification](https://github.com/evilnet/nefarious2/blob/ed12d64/doc/p10.txt#L611-L618))
- servprotect: only track kills and saves to PyLink clients, not all kills on a network!
- Fix `~#channel` prefix messages not working over relay on RFC1459-casemapping networks ([#464](https://github.com/GLolol/PyLink/issues/464)).
- Show errors when trying to use `showchan` on a secret channel in the same way as actually non-existent channels. Previously this error response forced replies as a private notice, potentially leaking the existence of secret/private channels.
- example-conf: fix reversed description for the password encryption setting.
#### Internal changes
- Portions of the IRC/relay stack were refactored to prevent various hangs on shutdown.
- Performance improvements for outgoing message queuing: the queue system now blocks when no messages are in the queue instead of polling it multiple times a minute.
- Logging fixes: startup warnings (e.g. from config deprecations) now log to files as well as the console.
The "Darkness" release. This release includes all fixes from 1.1.2, plus the following summary of changes:
#### Feature changes
- **Added support for snircd, ircu, and other (generic) P10 variants.** The target IRCd can be chosen using the new server-specific `p10_ircd` option; see the example config for details (#330).
- **The `nefarious` protocol module was renamed to `p10` - you should update your configuration to use the new name!**
- Plugins and protocol modules can now be loaded from any directory, making pylink-contrib 20% more useful! Look for the `plugin_dirs` and `protocol_dirs` options in the example config. (#350)
- The `pylink-contribdl` utility was dropped as this makes it obsolete.
- Relay now forbids linking to channels where the home network is down, which previously caused errors due to unreliable target TS (#419). This, along with the regular TS check, can be overridden with a new `link --force` option.
- SASL timeout for clientbot is now configurable, with the default raised to 15 seconds
- **New-style accounts (i.e. anything under `login:accounts`) now require a `permissions:` block for PyLink to start** (#413).
- New `stats` (uptime info) and `global` (global announcement) plugins
- Improvements to the `remote` command of the `networks` plugin:
- Plugin replies are now routed back to the sender's network.
- Added an optional `--service` option to call commands for service bots other than the main PyLink service.
-`servprotect` KILL/SAVE limits and expiry time are now configurable (#417)
- Added the `pylink::show_unknown_commands` option to optionally disable "unknown command" errors. This option can also be overridden per-server and per-service (#441).
- Added the `pylink::prefer_private_replies` option to default to private command replies (#409)
- Relay message formatting became more flexible, and messages from user-less senders can now be dropped (fa30d3c c03f2d7)
- Added global and per-service `spawn_service(s)` options to optionally disable service bot spawning
- The `bots` plugin now allows specifying channel prefixes (e.g. `@+`) in `join`
- exec: Added `iexec`, `ieval`, `peval`, `pieval`: `i`\* commands run code in an isolated, persistent local scope, while `p`\* commands evaluate expressions while pretty-printing the output
- Relay: implement optional network disconnect announcements (see the `relay::disconnect_announcement` option; #421)
#### Bug fixes
- Service bots no longer throw errors when attempting to call empty commands via fantasy.
- Protocol modules now send PONG immediately instead of queuing it, which should prevent ping timeouts at times of very high activity.
#### Internal improvements
- Protocols now verify that incoming messages originate from the right direction (#405)
-`Irc.matchHost` now supports matching CIDR ranges (#411)
- Added an `utils.IRCParser` class based off `argparse`, for flexible argument parsing (#6).
- Rewrote outgoing message queues to use `queue.Queue` (#430), and support a limit to the amount of queued lines (#442)
- Also, added a `clearqueue` command to force clear the queue on a network.
- PyLink protocol capabilities were introduced, reducing the amount of protocol name hardcoding in plugins (#337)
- Service bots no longer create stubs on Clientbot networks, and instead route replies through the main bot (#403)
- The default throttle time was halved from 0.01s to 0.005s.
- ServiceBot is now more flexible in help formatting, fixing indented lines and consecutive newlines not showing on IRC.
- Configuration validation no longer uses skippable asserts (#414)
- inspircd: better support for OPERTYPE on InspIRCd 3.x
- Clientbot now tracks channel modes and channel TS on join.
- Clientbot now generates PUIDs/PSIDs with the nick or server name as prefix, and checks to make sure incoming senders don't clash with one.
- commands: `showchan` now shows TS on connections without the `has-ts` protocol capability as well, even though this value may be unreliable
#### Misc changes
- The `bot:` config block is renamed to `pylink:`. Existing configurations will still work, as the `bot` and `pylink` blocks are always merged together (#343).
- Added better documentation for generic options available to all service bots (`nick`, `ident`, `prefix` for fantasy, etc.)
-`Irc.botdata`, `Irc.conf`, `Irc.checkAuthenticated()` have been deprecated: use `conf.conf['pylink']`, `conf.conf`, and the permissions API respectively instead!
- Multiple fixes for the `unreal` protocol module when using UnrealIRCd 3.2 links:
- fccec3a Fix crashes on processing SJOIN when a user behind a 3.2 server has a nick starting with a symbol
- 8465edd Fix kicks to Unreal 3.2 users (PUIDs) not updating the internal state - this would've caused odd prefix mode desyncs if a user was kicked and rejoined.
- df4acbf Fix prefix modes not being set on Unreal 3.2 users (affects Automode, etc.)
- Backported SASL fixes from 1.2-dev:
- b14ea4f Send CAP LS before NICK/USER so that we consistently get a SASL response before connect - this fixes SASL on networks like freenode, where connections can often complete before a SASL response from services is ever received.
- 84448e9 22ceb3f The above commit rewrites SASL to depend on a timely response from the server, so a configurable timeout for SASL/CAP is also introduced. (#424)
#### Feature changes
- 22ceb3f Added the `sasl_timeout` option for Clientbot networks (this defaults to 15 seconds if not set).
#### Internal improvements
- Backported stability improvements from 1.2-dev:
- d70ca9f Rewrite connection error handling to include `RuntimeError` and `SystemExit` (#438)
The "Calico" release. This is mostly a cleanup and documentation update from 1.1-beta2, with the following additional change:
- Made passlib an optional dependency (password hashing will be disabled if passlib isn't installed), simplifying the upgrade process.
For a full list of changes since 1.0.x, see the release notes for the 1.1 alpha & beta series. Summary of major changes since 1.0.x:
- :closed_lock_with_key: **Redone authentication configuration**, now supporting **multiple accounts**, hashed passwords, and fine-tuned permissions.
- Old configurations using `login:user` and `login:password` will still work, but are now deprecated. Consider migrating to the new `login:` block in the example config.
- This also adds a new optional dependency of passlib (https://passlib.readthedocs.io/en/stable/), which is required for the password hashing portion.
- Protocol modules now wrap long messages (SJOIN and MODE) to prevent cutoff shenanigans from happening.
- This fixes a particularly nasty bug that can corrupt the TS on UnrealIRCd channels if a MODE command sets more than 12 modes at once (#393).
- Added utilities to download contrib modules (`pylink-contribdl`) and hash passwords for the new accounts configuration (`pylink-mkpasswd`).
- Most plugins were ported to the permissions API.
- Clientbot now supports mode syncing, SASL (with optional reauth), and IRCv3 multi-prefix.
- Services bots now support setting modes on themselves on join: see "joinmodes" in the example conf
- Changehost gained a few new features, including optional (per network) vHost enforcement.
- Added a `bindhost` option in server blocks, for multi-homed hosts.
- PID file checking was implemented - Run PyLink with the `--check-pid` argument in order to turn it on.
- The `ts6` protocol module now supports `KICK` without arguments and legacy `UID` introduction (for older servers / services).
- Relay: added a `purge` command to remove all relays involving a network.
- Added support for ircd-ratbox (`ratbox` protocol module).
- Changing the console log level via REHASH now works.
- New `servermaps` plugin, displaying network `/map`'s from the PyLink server's perspective.
- Protocol modules now wrap longer messages (SJOIN and MODE) to prevent cutoff shenanigans from happening.
- This fixes a particularly nasty bug that can corrupt the TS on UnrealIRCd channels if a MODE command sets more than 12 modes at once (#393).
- Pong handling is a lot less strict now (it just makes sure the sender is the uplink). In other words, fix issues on UnrealIRCd where PONGs get ignored if the argument doesn't match the server name exactly (e.g. different case).
- Clientbot protocol fixes:
- Fix SASL PLAIN auth on Python 3.4 (TypeError with bytes formatting with `%b`).
- Don't repeat KICK hooks if the source is internal: this prevents KICK events from being relayed twice to Clientbot links, when the kicked user is also a Clientbot user.
- Clientbot now explicitly sends `/names` after join, to guarantee a response.
- Fix message recognition treating nick prefixes without `ident@host` as servers (this polluted the state)
- Fix prefix mode changes for unknown/missing users in `/who` causing KeyError crashes
- ts6: fix setting mode `-k *` not working due to wrongly ordered logic (1.1-dev regression)
- ts6: fix handling of KICK without a reason argument
- Automode: remove some repeated "Error:" text in error messages
-`IrcChannel` no longer assumes `+nt` on new channels, as this is not necessarily correct
#### Feature changes
- Changing the console log level via REHASH is now supported.
- Added a bind host option for multi-homed hosts.
#### Internal improvements
- updateTS now ignores any broken TS values lower than 750000, instead of propagating them (e.g. over relay) and making the problem worse.
- The UnrealIRCd protocol module was updated to actually use extended SJOIN (SJ3). This should make bursts/startup more efficient, as modes, users, and bans are now sent together.
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.
Tagged as **1.0.4** by [GLolol](https://github.com/GLolol)
The "Bonfire" release.
#### Bug fixes
- protocols: implement basic nick collision detection in UID handlers. This fixes users potentially going missing on UnrealIRCd networks, if the remote IRCd introduces a user of the same nick *after* PyLink does. Thanks to kevin for reporting!
- relay: strip underscores (`_`) from hosts on ts6 and ratbox, fixing possible invalid user@host errors
- Backported fixes from 1.1.x / devel:
- Demote "unknown user" warnings in mode handling to DEBUG, suppressing warnings when old services like Anope 1.8 set modes on users as they quit.
- Fix `irc.matchHost()` confusing the `realhost` boolean to be the same as `ip`.
- changehost: add missing permissions check to `applyhosts`; it now requires the `changehost.applyhost` permission.
#### Misc changes
- networks: update help for `disconnect` to reflect how it now always disables autoconnect.
- **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.
- 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.
- 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).