mirror of
https://github.com/mat-1/azalea.git
synced 2025-08-02 14:26:04 +00:00
start adding migrate
This commit is contained in:
parent
0a314bca16
commit
fb3b002d94
7 changed files with 212 additions and 79 deletions
|
@ -1 +0,0 @@
|
|||
{"message": "Not Found", "documentation_url": "https://docs.github.com/rest/reference/repos#get-the-latest-release"}
|
|
@ -1,72 +1,10 @@
|
|||
from .utils import to_snake_case, to_camel_case
|
||||
from .mappings import Mappings
|
||||
from .utils import burger_type_to_rust_type, write_packet_file
|
||||
from ..utils import padded_hex, to_snake_case, to_camel_case
|
||||
from ..mappings import Mappings
|
||||
|
||||
|
||||
def burger_type_to_rust_type(burger_type):
|
||||
is_var = False
|
||||
uses = set()
|
||||
|
||||
if burger_type == 'byte':
|
||||
field_type_rs = 'i8'
|
||||
elif burger_type == 'short':
|
||||
field_type_rs = 'i16'
|
||||
elif burger_type == 'int':
|
||||
field_type_rs = 'i32'
|
||||
elif burger_type == 'long':
|
||||
field_type_rs = 'i64'
|
||||
elif burger_type == 'float':
|
||||
field_type_rs = 'f32'
|
||||
elif burger_type == 'double':
|
||||
field_type_rs = 'f64'
|
||||
|
||||
elif burger_type == 'varint':
|
||||
is_var = True
|
||||
field_type_rs = 'i32'
|
||||
elif burger_type == 'varlong':
|
||||
is_var = True
|
||||
field_type_rs = 'i64'
|
||||
|
||||
elif burger_type == 'boolean':
|
||||
field_type_rs = 'bool'
|
||||
elif burger_type == 'string':
|
||||
field_type_rs = 'String'
|
||||
|
||||
elif burger_type == 'chatcomponent':
|
||||
field_type_rs = 'Component'
|
||||
uses.add('azalea_chat::component::Component')
|
||||
elif burger_type == 'identifier':
|
||||
field_type_rs = 'ResourceLocation'
|
||||
uses.add('azalea_core::resource_location::ResourceLocation')
|
||||
elif burger_type == 'uuid':
|
||||
field_type_rs = 'Uuid'
|
||||
uses.add('uuid::Uuid')
|
||||
elif burger_type == 'position':
|
||||
field_type_rs = 'BlockPos'
|
||||
uses.add('azalea_core::BlockPos')
|
||||
elif burger_type == 'nbtcompound':
|
||||
field_type_rs = 'azalea_nbt::Tag'
|
||||
elif burger_type == 'itemstack':
|
||||
field_type_rs = 'Slot'
|
||||
uses.add('azalea_core::Slot')
|
||||
elif burger_type == 'metadata':
|
||||
field_type_rs = 'EntityMetadata'
|
||||
uses.add('crate::mc_buf::EntityMetadata')
|
||||
elif burger_type == 'enum':
|
||||
# enums are too complicated, leave those to the user
|
||||
field_type_rs = 'todo!()'
|
||||
elif burger_type.endswith('[]'):
|
||||
field_type_rs, is_var, uses = burger_type_to_rust_type(
|
||||
burger_type[:-2])
|
||||
field_type_rs = f'Vec<{field_type_rs}>'
|
||||
else:
|
||||
print('Unknown field type:', burger_type)
|
||||
exit()
|
||||
return field_type_rs, is_var, uses
|
||||
|
||||
|
||||
def write_packet_file(state, packet_name_snake_case, code):
|
||||
with open(f'../azalea-protocol/src/packets/{state}/{packet_name_snake_case}.rs', 'w') as f:
|
||||
f.write(code)
|
||||
def make_packet_mod_rs_line(packet_id: int, packet_class_name: str):
|
||||
return f' {padded_hex(packet_id)}: {to_snake_case(packet_class_name)}::{to_camel_case(packet_class_name)},'
|
||||
|
||||
|
||||
def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet_direction, target_packet_state):
|
||||
|
@ -138,7 +76,8 @@ def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet
|
|||
pub_mod_line = f'pub mod {to_snake_case(class_name)};'
|
||||
if pub_mod_line not in mod_rs:
|
||||
mod_rs.insert(0, pub_mod_line)
|
||||
packet_mod_rs_line = f' {hex(packet["id"])}: {to_snake_case(class_name)}::{to_camel_case(class_name)},'
|
||||
packet_mod_rs_line = make_packet_mod_rs_line(
|
||||
packet['id'], class_name)
|
||||
|
||||
in_serverbound = False
|
||||
in_clientbound = False
|
||||
|
@ -168,3 +107,42 @@ def generate(burger_packets, mappings: Mappings, target_packet_id, target_packet
|
|||
|
||||
with open(mod_rs_dir, 'w') as f:
|
||||
f.write('\n'.join(mod_rs))
|
||||
|
||||
|
||||
def set_packet_ids(packet_ids: list, packet_class_names: list, direction: str, state: str):
|
||||
assert len(packet_ids) == len(packet_class_names)
|
||||
|
||||
mod_rs_dir = f'../azalea-protocol/src/packets/{state}/mod.rs'
|
||||
with open(mod_rs_dir, 'r') as f:
|
||||
mod_rs = f.read().splitlines()
|
||||
new_mod_rs = []
|
||||
|
||||
ignore_lines = False
|
||||
|
||||
for line in mod_rs:
|
||||
if line.strip() == 'Serverbound => {':
|
||||
if direction == 'serverbound':
|
||||
ignore_lines = True
|
||||
for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
|
||||
new_mod_rs.append(
|
||||
make_packet_mod_rs_line(packet_id, packet_class_name)
|
||||
)
|
||||
else:
|
||||
ignore_lines = False
|
||||
elif line.strip() == 'Clientbound => {':
|
||||
if direction == 'serverbound':
|
||||
ignore_lines = True
|
||||
for packet_id, packet_class_name in zip(packet_ids, packet_class_names):
|
||||
new_mod_rs.append(
|
||||
make_packet_mod_rs_line(packet_id, packet_class_name)
|
||||
)
|
||||
else:
|
||||
ignore_lines = False
|
||||
elif line.strip() in ('}', '},'):
|
||||
ignore_lines = False
|
||||
|
||||
if not ignore_lines:
|
||||
new_mod_rs.append(line)
|
||||
|
||||
with open(mod_rs_dir, 'w') as f:
|
||||
f.write('\n'.join(new_mod_rs))
|
73
codegen/lib/code/utils.py
Normal file
73
codegen/lib/code/utils.py
Normal file
|
@ -0,0 +1,73 @@
|
|||
|
||||
import os
|
||||
|
||||
|
||||
def burger_type_to_rust_type(burger_type):
|
||||
is_var = False
|
||||
uses = set()
|
||||
|
||||
if burger_type == 'byte':
|
||||
field_type_rs = 'i8'
|
||||
elif burger_type == 'short':
|
||||
field_type_rs = 'i16'
|
||||
elif burger_type == 'int':
|
||||
field_type_rs = 'i32'
|
||||
elif burger_type == 'long':
|
||||
field_type_rs = 'i64'
|
||||
elif burger_type == 'float':
|
||||
field_type_rs = 'f32'
|
||||
elif burger_type == 'double':
|
||||
field_type_rs = 'f64'
|
||||
|
||||
elif burger_type == 'varint':
|
||||
is_var = True
|
||||
field_type_rs = 'i32'
|
||||
elif burger_type == 'varlong':
|
||||
is_var = True
|
||||
field_type_rs = 'i64'
|
||||
|
||||
elif burger_type == 'boolean':
|
||||
field_type_rs = 'bool'
|
||||
elif burger_type == 'string':
|
||||
field_type_rs = 'String'
|
||||
|
||||
elif burger_type == 'chatcomponent':
|
||||
field_type_rs = 'Component'
|
||||
uses.add('azalea_chat::component::Component')
|
||||
elif burger_type == 'identifier':
|
||||
field_type_rs = 'ResourceLocation'
|
||||
uses.add('azalea_core::resource_location::ResourceLocation')
|
||||
elif burger_type == 'uuid':
|
||||
field_type_rs = 'Uuid'
|
||||
uses.add('uuid::Uuid')
|
||||
elif burger_type == 'position':
|
||||
field_type_rs = 'BlockPos'
|
||||
uses.add('azalea_core::BlockPos')
|
||||
elif burger_type == 'nbtcompound':
|
||||
field_type_rs = 'azalea_nbt::Tag'
|
||||
elif burger_type == 'itemstack':
|
||||
field_type_rs = 'Slot'
|
||||
uses.add('azalea_core::Slot')
|
||||
elif burger_type == 'metadata':
|
||||
field_type_rs = 'EntityMetadata'
|
||||
uses.add('crate::mc_buf::EntityMetadata')
|
||||
elif burger_type == 'enum':
|
||||
# enums are too complicated, leave those to the user
|
||||
field_type_rs = 'todo!()'
|
||||
elif burger_type.endswith('[]'):
|
||||
field_type_rs, is_var, uses = burger_type_to_rust_type(
|
||||
burger_type[:-2])
|
||||
field_type_rs = f'Vec<{field_type_rs}>'
|
||||
else:
|
||||
print('Unknown field type:', burger_type)
|
||||
exit()
|
||||
return field_type_rs, is_var, uses
|
||||
|
||||
|
||||
def write_packet_file(state, packet_name_snake_case, code):
|
||||
with open(f'../azalea-protocol/src/packets/{state}/{packet_name_snake_case}.rs', 'w') as f:
|
||||
f.write(code)
|
||||
|
||||
|
||||
def fmt():
|
||||
os.system('cd .. && cargo fmt')
|
31
codegen/lib/code/version.py
Normal file
31
codegen/lib/code/version.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
import re
|
||||
|
||||
README_DIR = '../README.md'
|
||||
VERSION_REGEX = r'\*Currently supported Minecraft version: `(.*)`.\*'
|
||||
|
||||
|
||||
def get_version_id() -> str:
|
||||
with open(README_DIR, 'r') as f:
|
||||
readme_text = f.read()
|
||||
|
||||
version_line_match = re.search(VERSION_REGEX, readme_text)
|
||||
if version_line_match:
|
||||
version_id = version_line_match.group(1)
|
||||
return version_id
|
||||
else:
|
||||
raise Exception('Could not find version id in README.md')
|
||||
|
||||
|
||||
def set_version_id(version_id: str) -> None:
|
||||
with open(README_DIR, 'r') as f:
|
||||
readme_text = f.read()
|
||||
|
||||
version_line_match = re.search(VERSION_REGEX, readme_text)
|
||||
if version_line_match:
|
||||
readme_text = readme_text.replace(
|
||||
version_line_match.group(1), version_id)
|
||||
else:
|
||||
raise Exception('Could not find version id in README.md')
|
||||
|
||||
with open(README_DIR, 'w') as f:
|
||||
f.write(readme_text)
|
|
@ -1,15 +1,15 @@
|
|||
import urllib.request
|
||||
import gzip
|
||||
import json
|
||||
import re
|
||||
import io
|
||||
|
||||
|
||||
def to_snake_case(name):
|
||||
def to_snake_case(name: str):
|
||||
s = re.sub('([A-Z])', r'_\1', name)
|
||||
return s.lower().strip('_')
|
||||
|
||||
|
||||
def to_camel_case(name):
|
||||
def to_camel_case(name: str):
|
||||
s = re.sub('_([a-z])', lambda m: m.group(1).upper(), name)
|
||||
return s[0].upper() + s[1:]
|
||||
|
||||
|
||||
def padded_hex(n: int):
|
||||
return f'0x{n:02x}'
|
||||
|
|
52
codegen/migrate.py
Normal file
52
codegen/migrate.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
import lib.code.utils
|
||||
import lib.code.version
|
||||
import lib.download
|
||||
import sys
|
||||
import os
|
||||
|
||||
old_version_id = lib.code.version.get_version_id()
|
||||
old_mappings = lib.download.get_mappings_for_version(old_version_id)
|
||||
old_burger_data = lib.download.get_burger_data_for_version(old_version_id)
|
||||
old_packet_list = list(old_burger_data[0]['packets']['packet'].values())
|
||||
|
||||
new_version_id = sys.argv[1]
|
||||
new_mappings = lib.download.get_mappings_for_version(new_version_id)
|
||||
new_burger_data = lib.download.get_burger_data_for_version(new_version_id)
|
||||
new_packet_list = list(new_burger_data[0]['packets']['packet'].values())
|
||||
|
||||
old_packet_ids = {}
|
||||
new_packet_ids = {}
|
||||
|
||||
for packet in old_packet_list:
|
||||
assert packet['class'].endswith('.class')
|
||||
packet_name = old_mappings.get_class(packet['class'][:-6])
|
||||
old_packet_ids[packet_name] = packet['id']
|
||||
for packet in new_packet_list:
|
||||
assert packet['class'].endswith('.class')
|
||||
packet_name = new_mappings.get_class(packet['class'][:-6])
|
||||
new_packet_ids[packet_name] = packet['id']
|
||||
|
||||
# find packets that changed ids
|
||||
for packet_name in old_packet_ids:
|
||||
if packet_name in new_packet_ids:
|
||||
if old_packet_ids[packet_name] != new_packet_ids[packet_name]:
|
||||
print(packet_name, 'id changed from',
|
||||
old_packet_ids[packet_name], 'to', new_packet_ids[packet_name])
|
||||
|
||||
print()
|
||||
|
||||
# find removed packets
|
||||
for packet_name in old_packet_ids:
|
||||
if packet_name not in new_packet_ids:
|
||||
print(packet_name, 'removed')
|
||||
|
||||
print()
|
||||
|
||||
# find added packets
|
||||
for packet_name in new_packet_ids:
|
||||
if packet_name not in old_packet_ids:
|
||||
print(packet_name, 'added')
|
||||
|
||||
lib.code.utils.fmt()
|
||||
|
||||
print('Done!')
|
|
@ -1,4 +1,4 @@
|
|||
from lib import download, packetcodegen # type: ignore
|
||||
from lib import download, code # type: ignore
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
@ -9,9 +9,9 @@ burger_packets_data = burger_data[0]['packets']['packet']
|
|||
packet_id, direction, state = int(sys.argv[1]), sys.argv[2], sys.argv[3]
|
||||
print(
|
||||
f'Generating code for packet id: {packet_id} with direction {direction} and state {state}')
|
||||
packetcodegen.generate(burger_packets_data, mappings,
|
||||
packet_id, direction, state)
|
||||
code.packetcodegen.generate(burger_packets_data, mappings,
|
||||
packet_id, direction, state)
|
||||
|
||||
os.system('cd .. && cargo fmt')
|
||||
code.fmt()
|
||||
|
||||
print('Done!')
|
||||
|
|
Loading…
Add table
Reference in a new issue