Changelog¶
v3.1.3¶
This adds a few search keywords to help with package discoverability, bumps various development dependencies, and fixes some incorrect roles in this changelog.
v3.1.2¶
This fixes some embarassing bugs related to ArmaClient
which I should have caught before v3.0.0 came out.
These bugs are not known to affect the generic RCONClient
class.
Fixed¶
AttributeErrorwhen attempting to accessBan.cacheThis bug was introduced in v3.0.0 and broke the Ban object’s
.clientproperty and.unban()method.ArmaClientnot assigning itself toArmaCache.clientThis bug was introduced in v3.0.0 and broke the
.admin_idand.playersproperties from being cached on login.ArmaClient.ban(),Player.ban_guid(), andPlayer.ban_ip()not actually including the GUID/IP of the player to be bannedThis is a long-standing bug and has existed since v2.0.0. Usually this resulted in a “0.0.0.0” ban that was harmless, but otherwise did not have the intended effect of banning the player.
v3.1.1¶
Changed¶
Downgrade the following I/O logs to DEBUG level:
could not send command after <N> attemptsattempting to connect to serverattempting to reconnect to serverfailed <N> login attempts
v3.1.0¶
Changed¶
Add expected messages to the
ArmaClientparser:Failed to receive from BE MasterMaster query timed out, no response from BE Master
Directly log unexpected messages in
ArmaClientas warnings, rather than raising ValueError exceptions to be logged by asyncio
v3.0.0¶
This is a large rewrite of the library to allow using BattlEye RCON by itself
without Arma 3-specific features, and will break the majority of existing
code for users. For the time being, this will be the only way to use berconpy with
Arma Reforger. If you have any code using this library that you cannot migrate to
the new version for, please pin your version to berconpy~=2.1. Sorry!
For contributors, nearly all abstract base classes have been removed, and the asynchronous implementation has been hoisted to the top-level package. Any alternative I/O implementations are now free to declare their own caching, events, and data models for bans/players.
No changes were made to the Sans-I/O protocol at berconpy.protocol,
and its hoisted classes like berconpy.RCONClientProtocol are preserved.
Renamed¶
berconpy.AsyncEventDispatchertoberconpy.ArmaDispatcherberconpy.AsyncRCONClienttoberconpy.ArmaClientberconpy.AsyncRCONClientCachetoberconpy.ArmaCacheberconpy.ext.arma.AsyncArmaRCONClienttoberconpy.ext.arma.ArmaClient
To improve backwards compatibility, aliases are defined for old names which will trigger a warning when used.
Removed¶
berconpy.asynciopackageberconpy.cachepackage andRCONClientCacheberconpy.RCONClient.cacheparameter and attributeberconpy.RCONClientabstract methods related to Arma, likefetch_players()berconpy.EventDispatcherevents related to Arma, likeon_player_messageberconpy.ConnectorConfig.players_intervalattribute, only defined forberconpy.ArmaConnectorConfig
Other Breaking Changes¶
Converted
berconpy.RCONClientto a concrete class, with implementations extracted fromAsyncRCONClientConverted
berconpy.EventDispatcherto a concrete class, with implementations extracted fromAsyncEventDispatcherAdded
berconpy.RCONClient.protocolparameter and attributeberconpy.AsyncClientConnectorno longer sends theplayerscommand for keep alives, and this behaviour is now reserved for the newberconpy.ArmaConnectorclassberconpy.Banandberconpy.Playernow work only with Arma-specific classes and cannot be used withberconpy.RCONClientSwitched build backend from
setuptoolstouv-buildThis should not have any visible changes for end users, only contributors that want to work on the project. This also means the package will no longer use
setuptools-scmfor Git-based dynamic versioning.Removed all dependency extras:
docs,tests,typesThese extras provided dependencies that were only useful for development, such as docs generation and running tests. Now, attempting to install these extras (for example,
pip install berconpy[docs]) may result in a warning or an error message depending on your package manager.For contributors, these dependencies were moved to Dependency Groups, and can be installed when working on the repository directly, for example,
pip install . --group devoruv sync --group dev.
Added¶
berconpy.LoginRefusedandberconpy.LoginTimeoutwhich subclassesberconpy.LoginFailureto allow distinguishing when a server does not respond to a login attempt versus the server actively refusing it.berconpy.LoginTimeoutadditionally inherits fromasyncio.TimeoutError(orTimeoutErrorin Python 3.11+).
v2.1.4¶
Bug Fixes¶
Fix possible (but minor) memory leak when using
AsyncRCONClient.wait_for()to wait on a non-predefined eventFix potential
InvalidStateErrorwhile sending a command ifAsyncRCONClientdisconnects before a response is receivedFix players potentially being fetched more than once during login if cache is already populated
Fix
Config entry:server messages causing superfluous errors
v2.1.3¶
Bug Fixes¶
Remove unnecessary
wheelbuild dependencyAdd missing
py.typedmarker to comply with PEP 561 distribution of type information
Documentation¶
Fix typo in
berconpy.BandocstringExplicitly document coroutine listener support in
EventDispatcher
v2.1.1¶
Bug Fixes¶
Fix
NonceChecknot raising ValueError whenmax_sizeexceeds 255Ignore more known server messages in
RCONClientBan check timed out, no response from BE Master
Disconnected from BE Master
Failed to resolve BE Master DNS name(s)
v2.1.0¶
New Features¶
Add type-safe decorators to
EventDispatcherfor existing eventsThis serves as an alternative interface to the existing
listen()andadd_listener()methods for those that want stronger type safety in their code (avoiding string typos and validating listener signatures).
Bug Fixes¶
Hide stderr clutter from
berconpy-keep-alivetasks failing to send commands
Documentation¶
Document
receive_datagram()for client/server protocols potentially raisingInvalidStateError
v2.0.0¶
This is a major rewrite of the library to increase the flexibility and re-usability of components. Many new abstractions have been introduced between the protocol, I/O layers, and the client.
Breaking Changes¶
Packetand its subclasses are now only available through the berconpy.protocol packagePacket.messageproperty now returns bytesPacket.from_bytes()no longer raisesIndexErrorServerCommandPacketnow raisesValueErrorwhentotalis 0 orindexis out of boundsAsyncRCONClient.client_idhas been renamed toadmin_idRCONClientDatagramProtocolis now replaced withAsyncClientConnectorThe
protocol_clsparameter forAsyncRCONClienthas been replaced withprotocoland must take anAsyncClientProtocolinstance
New Features¶
Add Sans-I/O client and server implementations of the RCON protocol:
Add Sans-I/O base classes, inherited by their original asyncio components:
BanPlayer
Allow customization of the client cache by using a subclass of
RCONClientCacheAllow customization of keep alive messages, reconnect parameters, and command handling for
AsyncClientConnectorusingConnectorConfigandAsyncCommanderAdd send/receive support for UTF-8 encoding
Despite the
BattlEye RCON protocolspecifying that payloads be encoded in ASCII, RCON servers are willing to send UTF-8 encoded text back. As such, this library will begin processing strings in UTF-8.Improve validation of server responses to commands
Indexes must be within range
Indexes must not be repeated
Total must be consistent across associated packets
Bug Fixes¶
Fix
Ban.indexnot actually being stored as an integer
Miscellaneous¶
Show full traceback for malformed data being received when using DEBUG logging level
Add this changelog to the documentation
v1.1.1¶
Bug Fixes¶
Fix
AttributeErrorwhen attempting to convert aBaninstance into a string
Miscellaneous¶
Rename the Getting Started page to Introduction
Add section about logging in the Introduction guide
Clean up table of contents
Fix docs/ Makefile building in the wrong directory
v1.1.0¶
Bug Fixes¶
Fix the user’s current task being cancelled when
AsyncRCONClient.close()is called
Documentation¶
Add Getting Started guide
Add various clarifications and examples throughout the API reference
v1.0.0.post1¶
This version comes with a new online documentation providing an
Event Reference and
API reference for the various classes and methods in the library.
v1.0.0¶
This is the first release to be published on PyPI!
Breaking Changes¶
Cancel the current task when the connection stops
This prevents the body of
async with client.connect():continuing to run, even if the client is no longer running.Remove the
nameparameter fromAsyncRCONClientThis attribute is probably no longer necessary for logging purposes.
Bug Fixes¶
Fix
AsyncRCONClient.wait_for()hanging when the predicate returnsFalseFix potential
InvalidStateErrorwhen a command times out and receives a response at the same timeFix protocol not resetting its own state when an error occurs
Fix BattlEye kicks for players without GUIDs not being parsed correctly
Miscellaneous¶
Tweak logging levels used during protocol’s lifetime
Wait for three seconds before applying exponential backoff during a connection (re)attempt
v0.2.1¶
New Features¶
Add facade methods to
AsyncRCONClient:is_running()is_connected()is_logged_in()
Miscellaneous¶
Minor docstring tweaks for
AsyncRCONClient
v0.2.0¶
Breaking Changes¶
Refactor the
Packetinto refinement types:These classes improve type inference, reduces their constructor signatures, and help self-document what kind of packets are expected to be sent around each internal method.
Packet.from_bytes()can now raiseIndexErrorPacketconstructor now raisesValueErrorwhen exceeding max packet size
New Features¶
Use sequence number from server messages to avoid re-triggering
on_messageevents in case of network instabilityAdd
berconpy.extnamespace package for third-party extension supportAdd berconpy.ext.arma extension containing an
ArmaClientsubclass with methods specific to the Arma game seriesAdd new events:
on_admin_login(admin_id, addr)on_player_connect(player)on_player_guid(player)on_player_verify_guid(player)on_player_disconnect(player_id, name)on_player_kick(player, reason)on_admin_message(admin_id, channel, message)on_admin_announcement(admin_id, message)on_admin_whisper(player, admin_id, message)on_player_message(player, channel, message)
Add
Playerclass and player cache to the client, accessed with theAsyncRCONClient.playersproperty and theget_player()methodAfter successfully connecting once,
AsyncRCONClientwill indefinitely attempt to reconnect when the connection is lostExponential backoff to reduce excessive connection attempts
New exceptions have been added to replace
ValueErrorandRuntimeErrorin various locations:Add
AsyncRCONClient.client_idpropertyAdd new methods to
AsyncRCONClient:ban()fetch_admins()fetch_bans()fetch_missions()fetch_players()kick()send()unban()whisper()
Add a
Bandataclass which is returned byAsyncRCONClient.fetch_bans()
Bug Fixes¶
Fix
RuntimeErrorwhen sending a command fails on the first attemptFix protocol hanging indefinitely when the server times out
Fix temporary listeners not being removed after they are invoked
Fix
AttributeErrorwhen protocol closes before having connectedFix potential
asyncio.CancelledErrorwhen callingAsyncRCONClient.send_command()Fix protocol parsing messages from addresses other than the connected server
Fix protocol not acknowledging messages when reconnecting
Fix
on_commandevent potentially being called more than once for multiple responses to the same command
Miscellaneous¶
Add logging configuration to repl.py
Add repr to
AsyncRCONClient
v0.1.0¶
New Features¶
Finish implementation for
AsyncRCONClient.wait_for()
Bug Fixes¶
Miscellaneous¶
Add repl.py example
v0.0.1¶
This is the first version of berconpy, providing the initial implementation
for the AsyncRCONClient, Packet,
and RCONClientDatagramProtocol classes.