|
| 1 | +from typing import Optional |
| 2 | + |
| 3 | +from discord import Embed |
| 4 | +from discord.ext.commands import Bot, Cog, Context, command |
| 5 | + |
| 6 | +from commanderbot_ext.ext.manifest.manifest import ( |
| 7 | + Manifest, |
| 8 | + ModuleType, |
| 9 | + PackType, |
| 10 | + add_dependency, |
| 11 | +) |
| 12 | + |
| 13 | + |
| 14 | +class ManifestCog(Cog, name="commanderbot_ext.ext.manifest"): |
| 15 | + def __init__(self, bot: Bot): |
| 16 | + self.bot: Bot = bot |
| 17 | + self.default_manifest_version = [1, 17, 0] |
| 18 | + |
| 19 | + def get_version(self, version_str: Optional[str]) -> list[int]: |
| 20 | + """ |
| 21 | + Parses 'version_str' and either returns it as a list of 3 ints or |
| 22 | + returns the default min engine version |
| 23 | + """ |
| 24 | + version: list[int] = self.default_manifest_version |
| 25 | + if version_str: |
| 26 | + found_version_numbers: list[int] = [] |
| 27 | + for i in version_str.split("."): |
| 28 | + if not i.isnumeric(): |
| 29 | + break |
| 30 | + found_version_numbers.append(int(i)) |
| 31 | + |
| 32 | + if len(found_version_numbers) == 3: |
| 33 | + version = found_version_numbers |
| 34 | + |
| 35 | + return version |
| 36 | + |
| 37 | + @command(name="manifest", brief="Generate a Bedrock manifest") |
| 38 | + async def cmd_manifest( |
| 39 | + self, |
| 40 | + ctx: Context, |
| 41 | + pack_type: str, |
| 42 | + name: Optional[str], |
| 43 | + description: Optional[str], |
| 44 | + min_engine_version: Optional[str], |
| 45 | + ): |
| 46 | + # Parse required pack type argument and create a list of modules from it |
| 47 | + modules: list[ModuleType] = [] |
| 48 | + pack_type = pack_type.strip().lower() |
| 49 | + if pack_type == PackType.ADDON.value: |
| 50 | + modules.append(ModuleType.DATA) |
| 51 | + modules.append(ModuleType.RESOURCE) |
| 52 | + elif pack_type == PackType.BEHAVIOR.value or pack_type == PackType.DATA.value: |
| 53 | + modules.append(ModuleType.DATA) |
| 54 | + elif pack_type == PackType.RESOURCE.value: |
| 55 | + modules.append(ModuleType.RESOURCE) |
| 56 | + elif pack_type == PackType.SKIN.value: |
| 57 | + modules.append(ModuleType.SKIN) |
| 58 | + else: |
| 59 | + available_pack_types = [f"`{i}`" for i in PackType.values()] |
| 60 | + await ctx.reply( |
| 61 | + f"**{pack_type}** is not a valid pack type\n" |
| 62 | + f"Available pack types: {' '.join(available_pack_types)}" |
| 63 | + ) |
| 64 | + return |
| 65 | + |
| 66 | + # Parse optional arguments |
| 67 | + pack_name = name if name else "pack.name" |
| 68 | + pack_description = description if description else "pack.description" |
| 69 | + engine_version = self.get_version(min_engine_version) |
| 70 | + |
| 71 | + # Create a list of manifests from modules |
| 72 | + manifests: list[Manifest] = [] |
| 73 | + for module in modules: |
| 74 | + manifests.append( |
| 75 | + Manifest(module, pack_name, pack_description, engine_version) |
| 76 | + ) |
| 77 | + |
| 78 | + # If we're generating a complete addon, make the behavior pack dependent |
| 79 | + # on the resource pack |
| 80 | + if len(manifests) == 2: |
| 81 | + add_dependency(manifests[0], manifests[1]) |
| 82 | + |
| 83 | + # Send embed |
| 84 | + manifest_embed = Embed(title="Generated manifest", color=0x00ACED) |
| 85 | + description_text = "" |
| 86 | + for manifest in manifests: |
| 87 | + # Get the common name for a manifest using each kind of module |
| 88 | + common_name: str = "" |
| 89 | + if manifest.module_type == ModuleType.DATA: |
| 90 | + common_name = "Behavior pack" |
| 91 | + elif manifest.module_type == ModuleType.RESOURCE: |
| 92 | + common_name = "Resource pack" |
| 93 | + elif manifest.module_type == ModuleType.SKIN: |
| 94 | + common_name = "Skin pack" |
| 95 | + |
| 96 | + formatted_manifest_json: str = f"```json\n{manifest.as_json()}\n```" |
| 97 | + description_text += f"**{common_name}**\n{formatted_manifest_json}\n" |
| 98 | + |
| 99 | + manifest_embed.description = description_text |
| 100 | + await ctx.send(embed=manifest_embed) |
0 commit comments