Skip to content

Commit

Permalink
🔥 Remove complex network serializers, types and ConnectionStatus (#107
Browse files Browse the repository at this point in the history
)

`ConnectionStatus` was removed because different protocol versions have different sets of statuses
  • Loading branch information
DavisDmitry committed May 11, 2024
1 parent 5b0efcb commit 67b0944
Show file tree
Hide file tree
Showing 28 changed files with 274 additions and 1,224 deletions.
34 changes: 18 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@
</p>

---

<p align="center">
<a href="https://pycubes.dmitrydavis.xyz">Documentation</a> |
<a href="https://github.com/DavisDmitry/pyCubes/tree/master/examples">Examples</a> |
<a href="https://wiki.vg/Protocol">Protocol Specification</a>
</p>

---
pyCubes is a library for creating servers and clients for Minecraft Java Edition (1.14+).

pyCubes is a library for creating servers and clients for Minecraft Java Edition.

**❗ 0.x versions are not stable. The library API is subject to change.**

Expand All @@ -36,21 +38,21 @@ pip install pyCubes

## Features

* Serializers for [Data types](https://wiki.vg/Data_types) (missing Chat, use String instead)
* Connection
* Low level server
* NBT module (wrapper over the [nbtlib](https://github.com/vberlier/nbtlib))
* `generate_uuid` utility (generates UUID by player_name for using in offline mode)
* [AnyIO](https://github.com/agronholm/anyio) support (an asynchronous networking and concurrency library)
- Serializers for some [Data types](https://wiki.vg/Data_types)
- Connection
- Low level server
- NBT module (wrapper over the [nbtlib](https://github.com/vberlier/nbtlib))
- `generate_uuid` utility (generates UUID by player_name for using in offline mode)
- [AnyIO](https://github.com/agronholm/anyio) support (an asynchronous networking and concurrency library)

## TODO

* [x] Serializer for all packets Data types
* [ ] Packets descriptor
* [ ] Implement compression
* [ ] High level server application with event driven API
* [ ] High level client application with event driven API
* [ ] High level proxy application with event driven API
* [ ] Chat API (chat messages constructor)
* [ ] Commands API
* [ ] Add API Reference to docs
- [x] Serializers for Data types
- [ ] Network packets
- [ ] Implement compression
- [ ] High level server application with event driven API
- [ ] High level client application with event driven API
- [ ] High level proxy application with event driven API
- [ ] Chat API (chat messages constructor)
- [ ] Commands API
- [ ] Add API Reference to docs
3 changes: 2 additions & 1 deletion cubes/nbt.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
Examples:
>>> cubes.nbt.String('vberlier is cool!')
"""

# pylint: disable=W0611
from nbtlib import (
from nbtlib import ( # type: ignore
Byte,
ByteArray,
Compound,
Expand Down
2 changes: 1 addition & 1 deletion cubes/net/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
from cubes.net.connection import Connection, ConnectionStatus
from cubes.net.connection import Connection
from cubes.net.server import Server
34 changes: 12 additions & 22 deletions cubes/net/connection.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import enum
import io
from typing import cast

import anyio
import anyio.abc
Expand All @@ -12,38 +12,28 @@ class _LengthVarIntSerializer(serializers.VarIntSerializer):
_RANGE = (1, 2097151)


class ConnectionStatus(enum.IntEnum):
HANDSHAKE = 0
STATUS = 1
LOGIN = 2
PLAY = 3


class Connection:
__slots__ = ("_stream", "_remote_address", "_local_address", "_status")
__slots__ = ("_stream", "_remote_address", "_local_address", "_state")

def __init__(self, stream: anyio.abc.SocketStream):
self._stream = stream
self._remote_address = stream.extra(anyio.abc.SocketAttribute.remote_address)
self._local_address = stream.extra(anyio.abc.SocketAttribute.local_address)
self._status = ConnectionStatus.HANDSHAKE
self._remote_address = cast(
anyio.abc.IPSockAddrType,
stream.extra(anyio.abc.SocketAttribute.remote_address),
)
self._local_address = cast(
anyio.abc.IPSockAddrType,
stream.extra(anyio.abc.SocketAttribute.local_address),
)

@property
def status(self) -> ConnectionStatus:
return self._status

@property
def remote_address(self) -> tuple[str, int]:
def remote_address(self) -> anyio.abc.IPSockAddrType:
return self._remote_address

@property
def local_address(self) -> tuple[str, int]:
def local_address(self) -> anyio.abc.IPSockAddrType:
return self._local_address

@status.setter
def status(self, value: ConnectionStatus):
self._status = value

async def receive(self) -> io.BytesIO:
length = await _LengthVarIntSerializer.from_stream(self._stream)
return io.BytesIO(await self._stream.receive(length))
Expand Down
3 changes: 0 additions & 3 deletions cubes/net/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from cubes.net.serializers._abc import AbstractSerializer
from cubes.net.serializers._entity_metadata import EntityMetadataSerializer
from cubes.net.serializers._nbt import NBTSerializer
from cubes.net.serializers._particle import ParticleSerializer
from cubes.net.serializers._position import PositionSerializer
from cubes.net.serializers._simple import (
AngleSerializer,
Expand All @@ -15,7 +13,6 @@
UnsignedByteSerializer,
UnsignedShortSerializer,
)
from cubes.net.serializers._slot import SlotSerializer
from cubes.net.serializers._string import IdentifierSerializer, StringSerializer
from cubes.net.serializers._uuid import UUIDSerializer
from cubes.net.serializers._var_length import VarIntSerializer, VarLongSerializer
212 changes: 0 additions & 212 deletions cubes/net/serializers/_entity_metadata.py

This file was deleted.

4 changes: 2 additions & 2 deletions cubes/net/serializers/_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@


class StupidValidationMixin(_abc.AbstractSerializer[_abc.T]):
TYPE: _abc.T
_TYPE: type[_abc.T]

@classmethod
def validate(cls, value: _abc.T) -> None:
cls._TYPE(value)


class RangeValidationMixin(_abc.AbstractSerializer[_abc.T]):
TYPE: _abc.T
_TYPE: type[_abc.T]
_RANGE: tuple[_abc.T, _abc.T]

@classmethod
Expand Down
Loading

0 comments on commit 67b0944

Please sign in to comment.