2. Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

3.0.1 (2026-06-30)

πŸ› Bug Fixes

  • encrypt classic Votifier packets with PKCS#1 v1.5 padding (ef4600b)

  • include the underlying reason and host when a connection can’t be opened (4aee88d), closes #4

  • support PHP 7.1 through 8.5 (95bd6dd)

  • time out and report when a server sends no response (27bbfb8), closes #5

πŸ“š Documentation

  • overhaul the Sphinx documentation (919905f)

3.0.0 (2020-10-26)

⚠ BREAKING CHANGES

  • Namespace changed from D3strukt0r\VotifierClient to D3strukt0r\Votifier\Client. Update every use statement.

  • Classes were moved and renamed:

    • ServerType\ClassicVotifier β†’ Server\Votifier

    • ServerType\NuVotifier β†’ Server\NuVotifier

    • ServerType\ServerTypeInterface β†’ Server\ServerInterface

    • VoteType\ClassicVote β†’ Vote\ClassicVote

    • VoteType\VoteInterface β†’ Vote\VoteInterface

    • ServerConnection β†’ Socket (internal), and the Messages class was removed.

  • Construction is now a fluent builder (no more positional constructors), and you send on the server object directly β€” the Vote wrapper class is gone. sendVote() is variadic, so several votes can be sent at once:

    // before (2.x)
    $serverType = new ClassicVotifier('127.0.0.1', null, $publicKey);
    $voteType = new ClassicVote($username, 'Your vote list', $ip);
    (new Vote($voteType, $serverType))->send();
    
    // after (3.0.0)
    use D3strukt0r\Votifier\Client\Server\Votifier;
    use D3strukt0r\Votifier\Client\Vote\ClassicVote;
    
    $server = (new Votifier())->setHost('127.0.0.1')->setPublicKey($publicKey); // ->setPort() optional, defaults to 8192
    $vote = (new ClassicVote())->setUsername($username)->setServiceName('Your vote list')->setAddress($ip);
    $server->sendVote($vote);
    

    For NuVotifier v2: (new NuVotifier())->setHost('127.0.0.1')->setProtocolV2(true)->setToken('...').

  • Failures now throw dedicated typed exceptions instead of a generic \Exception. Catch what you need: Exception\NotVotifierException; the NuVotifier family Exception\NuVotifierChallengeInvalidException, Exception\NuVotifierSignatureInvalidException, Exception\NuVotifierUnknownServiceException, Exception\NuVotifierUsernameTooLongException; and the transport-level Exception\Socket\NoConnectionException, Exception\Socket\PackageNotSentException, Exception\Socket\PackageNotReceivedException. A missing required field throws \InvalidArgumentException.

  • verifyConnection() is available on a server to check reachability before sending.

♻️ Refactoring

  • redesign Vote/Server API and rename to D3strukt0r\Votifier\Client (2978a21)

  • reorganize Server, Vote and Exception class layout (224a1e8)

  • adopt PSR-12 and add dedicated exception classes (9743475)

2.1.2 (2020-08-31)

🧹 Chores

  • migrate CI from Travis CI to GitHub Actions and fix coverage reporting (67165e1)

2.1.1 (2020-04-25)

πŸ› Bug Fixes

  • use correct NuVotifier server-error message and default language to null (dfdf118)

πŸ“š Documentation

  • migrate documentation from README to Sphinx (c04368e)

2.1.0 (2020-03-09)

πŸ› Bug Fixes

  • resolve socket connection bugs and add PHP_CodeSniffer (df15ece)

♻️ Refactoring

  • rename LICENSE.md to LICENSE.txt (0a47e31)

  • drop deprecated PHP versions and add type declarations (a33754a)

2.0.0 (2018-04-24)

⚠ BREAKING CHANGES

  • Namespace changed from Votifier\Client to D3strukt0r\VotifierClient (with ServerType\ and VoteType\ sub-namespaces). Update every use statement.

  • The single Vote class with a six-argument constructor was removed. You now compose a server type, a vote type and a Vote wrapper, then call send():

    // before (1.x)
    use Votifier\Client\Vote;
    (new Vote('127.0.0.1', 8192, $publicKey, $username, 'My list', $ip))->send();
    
    // after (2.0.0)
    use D3strukt0r\VotifierClient\ServerType\ClassicVotifier;
    use D3strukt0r\VotifierClient\VoteType\ClassicVote;
    use D3strukt0r\VotifierClient\Vote;
    
    $serverType = new ClassicVotifier('127.0.0.1', null, $publicKey); // null port defaults to 8192
    $voteType = new ClassicVote($username, 'My list', $ip);
    (new Vote($voteType, $serverType))->send();
    
  • NuVotifier is now supported via ServerType\NuVotifier($host, $port, $publicKey, $protocolV2 = false, $token = null) β€” pass true and a token for the v2 protocol.

  • Sending still throws a generic \Exception on failure (typed exceptions arrive in 3.0.0).

1.0.0 (2018-04-22)

🧹 Chores

  • refine the Composer configuration and project files (923994f)

  • rename the license to LICENSE.md and stop tracking IDE project files (90f3012)

0.0.1 (2016-03-13)

✨ Features

  • add Votifier client and convert to a Composer package (2c59024)

♻️ Refactoring

  • restructure namespace and class layout (8e28858)

  • relocate client classes into the Votifier\Client namespace (2d728e4)