Releases: py-mine/mcproto
v0.5.0
Breaking Changes
-
#130: Renamed "shared_key" field to "shared_secret" in
LoginEncryptionPacket
, following the official terminology.- This is a breaking change,
LoginEncryptionPacket
's__init__
method now uses "shared_secret" keyword only argument, not "shared_key".
- This is a breaking change,
-
#130: The
LoginStart
packet now contains a (required) UUID field (which can be explicitly set toNone
).- For some reason, this field was not added when the login packets were introduced initially, and while the UUID field can indeed be omitted in some cases (it is an optional filed), in vast majority of cases, it will be present, and we should absolutely support it.
- As this is a new required field, the
__init__
function ofLoginStart
now also expects thisuuid
keyword argument to be present, making this a breaking change.
-
#159: Fix packet compression handling in the interaction methods.
This fixes a bug that didn't allow for specifying an exact compression threshold that the server specified in
LoginSetCompression
packet, and instead only allowing to toggle between compression on/off, which doesn't really work as server doesn't expect compression for packets below that threshold.sync_write_packet
,async_write_pakcet
,sync_read_packet
andasync_read_packet
functions now takecompression_threshold
instead ofcompressed
bool flag
-
#161:
LoginEncryptionRequest
now usescryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey
to hold the public key, instead of just purebytes
. Encoding and decoding of this key happens automatically during serialize/deserialize. This is a breaking change for anyone relying on thepublic_key
field from this packet beingbytes
, and for anyone initializing this packet directly with__init__
, which now expectsRSAPublicKey
instance instead.
Features
- #129: Added a system for handling Minecraft authentication
- Yggdrasil system for unmigrated i.e. non-Microsoft accounts (supportng Minecraft accounts, and the really old Mojang accounts)
- Microsoft OAuth2 system (Xbox live) for migrated i.e. Microsoft accounts
- #160: Re-export the packet classes (or any other objects) from the gamestate modules (
mcproto.packets.handshaking
/mcproto.packets.login
/...) directly. Allowing simpler imports (from mcproto.packets.login import LoginStart
instead offrom mcproto.packets.login.login import LoginStart
) - #161: Add support for encryption. Connection classes now have
enable_encryption
method, and some encryption related functions were added into a newmcproto.encryption
module. - #168: Add multiplayer related functionalities for requesting and checking joins for original (bought) minecraft accounts. This allows us to join online servers.
- #171: Add
Account.check
function, to verify that the access token in use is valid, and the data the Account instance has matches the data minecraft API has.
Bugfixes
- #130:
LoginEncryptionResponse
now includes theserver_id
field. This field was previously hard-coded to 20 spaces (blank value), which is what all minecraft clients on minecraft 1.7.x or higher do, however with older versions, this field is set to 20 random characters, which we should respect.- This is not a breaking change, as
server_id
will default toNone
inLoginEncryptionResponse
's__init__
, meaning any existing code utilizing this packet will still work. It is purely an additional option.
- This is not a breaking change, as
- #167: Fix packet reading/writing when compression is enabled (use zlib as expected, instead of gzip which we were using before)
- #170: Preserve the call parameters and overloads in the typing signature of
mcproto.packets.packet_map.generate_packet_map
function. (This wasn't the case before, sincefunctools.lru_cache
doesn't preserve this data). Note that this loses on the typing information about the cache itself, as now it will appear to be a regular uncached function to the type-checker. We deemed this approach better to the alternative of no typing info for call arguments or overloads, but preserving cache info.
Documentation Improvements
-
#129: Mention lack of synchronous alternatives for certain functions (see issue #128)
-
#139: Add a warning in version guarantees page, explaining pre-release guarantees (breaking changes in minor versions allowed)
-
#141: Move installation instructions from README to Installation docs page
-
#144: Add attributetable internal sphinx extension for showing all attributes and methods for specified classes.
- This adds
attributetable
sphinx directive, which can be used before autodoc directive. This will create the attribute table, which will get dynamically moved right below the class definition from autodoc (using javascript). - This extension was implemented by discord.py, this is just re-using that code, with some modifications to fit our code style and to fit the documentation design (furo theme).
- This adds
-
Updated contributing guidelines (restructure and rewrite some categories, to make it more readable)
Internal Changes
-
#133: Enable enforcement of some optional pyright rules
-
#153: Replace flake8 linter with ruff (mostly equivalent, but much faster and configurable from pyproject.toml)
-
#154: Enforce various new ruff linter rules:
- PGH: pygrep-hooks (replaces pre-commit version)
- PL: pylint (bunch of typing related linter rules)
- UP: pyupgrade (forces use of the newest possible standards, depending on target version)
- RET: flake8-return (various linter rules related to function returns)
- Q: flake8-quotes (always use double quotes)
- ASYNC: flake8-async (report blocking operations in async functions)
- INT: flake-gettext (gettext related linting rules)
- PTH: flake8-use-pathlib (always prefer pathlib alternatives to the os ones)
- RUF: ruff custom rules (various additional rules created by the ruff linter team)
v0.4.0
Breaking Changes
- #41: Rename
mcproto.packets.abc
tomcproto.packets.packet
- #116: Restructure the project, moving to a single protocol version model
- This change does NOT have a deprecation period, and will very likely break most existing code-bases. However this change is necessary, as multi-version support was unsustainable (see issue #45 for more details)
- Any packets and types will no longer be present in versioned folders (mcproto.packets.v757.xxx), but rather be directly in the parent directory (mcproto.packets.xxx).
- This change doesn't affect manual communication with the server, connection, and basic IO writers/readers remain the same.
v0.3.0
Features
- #14: Add
__slots__
to most classes in the project- All connection classes are now slotted
- Classes in
mcproto.utils.abc
are now slotted
- Separate packet interaction functions into
mcproto.packets.interactions
, (though they're reexported in
mcproto.packets
, so no breaking changes)
Bugfixes
- #14: Add missing
__slots__
toServerBoundPacket
andClientBoundPacket
subclasses, which inherited from slotted
Packet
, but didn't themselves define__slots__
, causing__dict__
to be needlessly created. - The error message produced by
RequiredParamsABCMixin
class when a required no MRO class variable isn't present now
includes a previously missing space, making it more readable.
Documentation Improvements
Internal Changes
- #6: Rework deprecation system
- Drop support for date-based deprecations, versions work better
- Provide
deprecation_warn
function, which emits warnings directly, no need for a decorator - Add a
SemanticVersion
class, supporting version comparisons - If the project's version is already higher than the specified deprecation removal version, raise a DeprecationWarning
as a full exception (rather than just a warning).
- #7: Add towncrier for managing changelog
- #14: Add slotscheck, ensuring
__slots__
are defined properly everywhere. - #14: Make
typing-extensions
a runtime dependency and use it directly, don't rely onif typing.TYPE_CHECKING
blocks. - #15: Add codespell tool, to automatically find spelling mistakes.
- Add README file into the
tests/
folder, explaining how we use unit-tests and some basics of testing. - Add
CustomMockMixin
internal class, inheriting fromUnpropagatingMockMixin
, but also allowing to usespec_set
as
class variable, as it will automatically pass it into__init__
of the mock class. - Add several new flake8 extensions, and rework flake8 config file
- Add support for specifying what child mock type to propagate in
UnpropagatingMockMixin
class (for unit-tests).
v0.2.0
Features
- #14: Add
__slots__
to most classes in the project
- All connection classes are now slotted
- Classes inmcproto.utils.abc
are now slotted - Separate packet interaction functions into
mcproto.packets.interactions
, (though they're reexported in
mcproto.packets
, so no breaking changes)
Bugfixes
- #14: Add missing
__slots__
toServerBoundPacket
andClientBoundPacket
subclasses, which inherited from slotted
Packet
, but didn't themselves define__slots__
, causing__dict__
to be needlessly created. - The error message produced by
RequiredParamsABCMixin
class when a required no MRO class variable isn't present now
includes a previously missing space, making it more readable.
Documentation Improvements
Internal Changes
- #6: Rework deprecation system
- Drop support for date-based deprecations, versions work better
- Provide
deprecation_warn
function, which emits warnings directly, no need for a decorator - Add a
SemanticVersion
class, supporting version comparisons - If the project's version is already higher than the specified deprecation removal version, raise a DeprecationWarning
as a full exception (rather than just a warning).
- #7: Add towncrier for managing changelog
- #14: Add slotscheck, ensuring
__slots__
are defined properly everywhere. - #14: Make
typing-extensions
a runtime dependency and use it directly, don't rely onif typing.TYPE_CHECKING
blocks. - #15: Add codespell tool, to automatically find spelling mistakes.
- Add README file into the
tests/
folder, explaining how we use unit-tests and some basics of testing. - Add
CustomMockMixin
internal class, inheriting fromUnpropagatingMockMixin
, but also allowing to usespec_set
as
class variable, as it will automatically pass it into__init__
of the mock class. - Add several new flake8 extensions, and rework flake8 config file
- Add support for specifying what child mock type to propagate in
UnpropagatingMockMixin
class (for unit-tests).
v0.1.2
- Fix
TypeError: Can't instantiate abstract Handshake class without defining '_REQUIRED_CLASS_VARS' classvar
occurring when trying to initialize anyPacket
class, due to a typo. - Fix
TypeError: Can't instantiate abstract Handshake class without defining '__slots__' classvar explicitly(__slots__ found in a subclass, but not explicitly in Handshake)
occuring when using theHandshake
packet, due to (requiried)__slots__
class variable not being defined.
v0.1.1
- Fixes
TypeError: 'type' object is not subscriptable
issue inmcproto/packets/map.py
- Some other minor changes, mostly to documentation (README/CONTRIBUTING/...)
v0.1.0
First full release of mcproto.
Note that the project is still very much work-in-progress, and is still missing support for a lot of packets, and other things. As the project is still in heavy development, it shouldn't be surprising that you may encounter some bugs, if you do, make sure to report them.