diff --git a/.env.template b/.env.template index fa835c4..99830cd 100644 --- a/.env.template +++ b/.env.template @@ -707,3 +707,9 @@ MODULE_WOW_ELUNA_TS_MODULE=0 MODULE_WOW_SERVER_RELAY=0 MODULE_WOW_STATISTICS=0 MODULE_WRATH_OF_THE_VANILLA=0 +MODULE_MOD_BOTS_LOGIN_FIX=0 +MODULE_MOD_MATERIAL_BANK=0 +MODULE_MOD_PROGRESSION_BLIZZLIKE=0 +MODULE_MOD_PYTHON_ENGINE=0 +MODULE_WRATH_OF_THE_VANILLA_V2=0 +MODULE_AZEROTHMCP=0 diff --git a/config/module-manifest.json b/config/module-manifest.json index 2063dee..d274d6d 100644 --- a/config/module-manifest.json +++ b/config/module-manifest.json @@ -491,7 +491,7 @@ "block_reason": "Runtime error: SQL error: MODULE_mod-black-market_creature.sql references removed 'StatsCount' column", "order": 5000, "config_cleanup": [], - "notes": "Disabled due to runtime error: SQL error: MODULE_mod-black-market_creature.sql references removed 'StatsCount' column", + "notes": "Disabled due to runtime error: SQL error: MODULE_mod-black-market_creature.sql references removed 'StatsCount' column \nDiscovered via GitHub topic 'azerothcore-module'", "last_modified": "2025-06-26T14:23:47Z" }, { @@ -1490,7 +1490,7 @@ "description": "Module for WoW 3.3.5a (AzerothCore \u2013 Playerbots). Tested on Ubuntu.", "type": "cpp", "category": "database", - "notes": "Disabled due to runtime error: MODULE_mod-guild-village_001_creature_template.sql tries to insert duplicate creature ID 987400 (ERROR 1062)", + "notes": "Disabled due to runtime error: MODULE_mod-guild-village_001_creature_template.sql tries to insert duplicate creature ID 987400 (ERROR 1062) \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -1581,7 +1581,7 @@ "description": "Module for WoW 3.3.5a (AzerothCore \u2013 Playerbots). Tested on Ubuntu.", "type": "cpp", "category": "database", - "notes": "Disabled due to runtime error: MODULE_mod-instance-tools_Creature.sql tries to insert duplicate creature ID 987456-0 (ERROR 1062)", + "notes": "Disabled due to runtime error: MODULE_mod-instance-tools_Creature.sql tries to insert duplicate creature ID 987456-0 (ERROR 1062) \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -1809,7 +1809,7 @@ "description": "Hardcore trial mod for groups of 1-5", "type": "cpp", "category": "progression", - "notes": "DISABLED: no member named 'isEmpty' in 'MapRefMgr'", + "notes": "DISABLED: no member named 'isEmpty' in 'MapRefMgr' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2005,7 +2005,7 @@ "description": "AoE loot module for AzerothCore built from the ground up without loot loss. (No Loot Merging).", "type": "cpp", "category": "quality-of-life", - "notes": "DISABLED: Naming conflict with Item class", + "notes": "DISABLED: Naming conflict with Item class \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2142,7 +2142,7 @@ "description": "Adds Mist of Pandaria's Brawler's Guild to AzerothCore.", "type": "cpp", "category": "minigame", - "notes": "DISABLED: no matching member function for call to 'DelayEvents'", + "notes": "DISABLED: no matching member function for call to 'DelayEvents' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2188,7 +2188,7 @@ "description": "Mercado negro", "type": "cpp", "category": "database", - "notes": "DISABLED: SQL schema mismatch - StatsCount column doesn't exist", + "notes": "DISABLED: SQL schema mismatch - StatsCount column doesn't exist \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2835,7 +2835,7 @@ "description": "Prestige level system mod for Azerothcore", "type": "cpp", "category": "progression", - "notes": "DISABLED: 'OnLogin' marked 'override' but does not override", + "notes": "DISABLED: 'OnLogin' marked 'override' but does not override \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2851,7 +2851,7 @@ "description": "Adds extra difficulty modes, heavily inspired by mod-challenge-modes.", "type": "cpp", "category": "progression", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -2897,7 +2897,7 @@ "description": "This module aims to make mounts, companions and heirlooms shared across all characters of an account", "type": "cpp", "category": "account-wide", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3141,7 +3141,7 @@ "description": "An Azeroth Core module to allow the display of the Breaking News section on the character select screen.", "type": "cpp", "category": "social", - "notes": "DISABLED: no member named 'StringFormatFmt' in namespace 'Acore'", + "notes": "DISABLED: no member named 'StringFormatFmt' in namespace 'Acore' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3172,7 +3172,7 @@ "description": "This WoW-Azerothcore-Mod allows to change spawntimes based on a userdefined or dynamically calculated playerbased factor", "type": "cpp", "category": "progression", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3188,7 +3188,7 @@ "description": "This mod allows noclip with a command noclip. on / off", "type": "cpp", "category": "admin", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3249,7 +3249,7 @@ "description": "AzerothCore port (as a Module) of Rochet2's Objscale", "type": "cpp", "category": "progression", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3311,7 +3311,7 @@ "description": "An AzerothCore module that recycles unwanted items to the auction house.", "type": "cpp", "category": "economy", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3342,7 +3342,7 @@ "description": "AzerothCore module that adds a random attribute book.", "type": "cpp", "category": "admin", - "notes": "DISABLED: 'OnLogin' marked 'override' but does not override", + "notes": "DISABLED: 'OnLogin' marked 'override' but does not override \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3358,7 +3358,7 @@ "description": "AzerothCore module that allows prestige at max level.", "type": "cpp", "category": "progression", - "notes": "DISABLED: use of undeclared identifier 'sSpellMgr'", + "notes": "DISABLED: use of undeclared identifier 'sSpellMgr' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3405,7 +3405,7 @@ "description": "An Azeroth Core module that adds alternative XP gains.", "type": "cpp", "category": "progression", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3437,7 +3437,7 @@ "description": "Ensures all party members have matching faction before queueing into battleground.", "type": "cpp", "category": "pvp", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3484,7 +3484,7 @@ "description": "AzerothCore custom module which allows filtering traded items", "type": "cpp", "category": "economy", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3500,7 +3500,7 @@ "description": "This module allows you to search for quests by ID, which gives you greater precision in your search.", "type": "cpp", "category": "scripting", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3516,7 +3516,7 @@ "description": "PvPScript for Azerothcore", "type": "cpp", "category": "pvp", - "notes": "DISABLED: no member named 'SendNotification' in 'WorldSession'", + "notes": "DISABLED: no member named 'SendNotification' in 'WorldSession' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3532,7 +3532,7 @@ "description": "Broadcasts items with the ITEM_FLAG_REPORT_TO_GUILD_CHAT flag to guild chat.", "type": "cpp", "category": "scripting", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3548,7 +3548,7 @@ "description": "Fixes FFA for safe zones.", "type": "cpp", "category": "content", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3564,7 +3564,7 @@ "description": "AzerothCore Interconnect", "type": "cpp", "category": "tooling", - "notes": "DISABLED: no member named 'StringFormatFmt' in namespace 'Acore'", + "notes": "DISABLED: no member named 'StringFormatFmt' in namespace 'Acore' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3708,7 +3708,7 @@ "description": "Module for Azerothcore to teleport players to with a command", "type": "cpp", "category": "quality-of-life", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3739,7 +3739,7 @@ "description": "Adds a re-roll item for StatBooster bonus stat.", "type": "cpp", "category": "rewards", - "notes": "DISABLED: 'StatBoostMgr.h' file not found", + "notes": "DISABLED: 'StatBoostMgr.h' file not found \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3835,7 +3835,7 @@ "description": "All-In-One Solution module to easily enable features for new players", "type": "cpp", "category": "progression", - "notes": "DISABLED: no member named 'getLevel'; did you mean 'GetLevel'?", + "notes": "DISABLED: no member named 'getLevel'; did you mean 'GetLevel'? \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3851,7 +3851,7 @@ "description": "Custom scipts and modules for Azerothcore", "type": "cpp", "category": "scripting", - "notes": "DISABLED: no member named 'PQuery' / 'outString' in Log", + "notes": "DISABLED: no member named 'PQuery' / 'outString' in Log \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3899,7 +3899,7 @@ "description": "", "type": "cpp", "category": "content", - "notes": "DISABLED: Missing config identifier", + "notes": "DISABLED: Missing config identifier \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3915,7 +3915,7 @@ "description": "Pushes server and player events into an influxdb instance.", "type": "cpp", "category": "scripting", - "notes": "DISABLED: Build fails - requires CURL library (missing: CURL_LIBRARY CURL_INCLUDE_DIR)", + "notes": "DISABLED: Build fails - requires CURL library (missing: CURL_LIBRARY CURL_INCLUDE_DIR) \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "block_reason": "CMake Error: Could NOT find CURL", "order": 5000, @@ -3931,7 +3931,7 @@ "description": "Spell Regulator module for AzerothCore", "type": "cpp", "category": "scripting", - "notes": "DISABLED: redefinition of 'AddSpellRegulatorScripts'", + "notes": "DISABLED: redefinition of 'AddSpellRegulatorScripts' \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3947,7 +3947,7 @@ "description": "Module for Azerothcore", "type": "cpp", "category": "progression", - "notes": "DISABLED: 'ChatHandler' is an incomplete type", + "notes": "DISABLED: 'ChatHandler' is an incomplete type \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -3979,7 +3979,7 @@ "description": "WIP reward system for AC ingame shop", "type": "cpp", "category": "economy", - "notes": "DISABLED: API incompatibility - ConfigMgr missing GetIntDefault method", + "notes": "DISABLED: API incompatibility - ConfigMgr missing GetIntDefault method \nDiscovered via GitHub topic 'azerothcore-module'", "status": "blocked", "order": 5000, "requires": [], @@ -4149,7 +4149,7 @@ "description": "ACore CMS based on Wordpress", "type": "tool", "category": "tooling", - "notes": "Disabled due to runtime error: Table 'acore_auth.acore_cms_subscriptions' doesn't exist - causes server abort", + "notes": "Disabled due to runtime error: Table 'acore_auth.acore_cms_subscriptions' doesn't exist - causes server abort \nDiscovered via GitHub topic 'azerothcore-tools'", "status": "blocked", "block_reason": "Runtime error: Missing database table", "order": 5000, @@ -5065,7 +5065,7 @@ "description": "", "type": "lua", "category": "scripting", - "notes": "DISABLED: Git clone fails with 'unknown switch E' error - likely due to hyphen in repo name", + "notes": "DISABLED: Git clone fails with 'unknown switch E' error - likely due to hyphen in repo name \nDiscovered via GitHub topic 'azerothcore-lua'", "status": "blocked", "block_reason": "Git clone error: unknown switch 'E'", "order": 5000, @@ -5233,7 +5233,7 @@ "description": "This module adds thematically appropriate green and blue loot drops to ALL 450 Classic rares in Kalimdor and the Eastern Kingdoms.", "type": "sql", "category": "database", - "notes": "DISABLED: only virtual member functions can be marked 'override'", + "notes": "DISABLED: only virtual member functions can be marked 'override' \nDiscovered via GitHub topic 'azerothcore-sql'", "status": "blocked", "order": 5000, "requires": [], @@ -5391,6 +5391,90 @@ "post_install_hooks": [], "config_cleanup": [], "last_modified": "2020-12-16T18:26:39Z" + }, + { + "key": "MODULE_MOD_BOTS_LOGIN_FIX", + "name": "mod-bots-login-fix", + "repo": "https://github.com/BeardBear33/mod-bots-login-fix.git", + "description": "Oprava duplicitn\u00edho p\u0159ipojen\u00ed na AltBota pro modul Playerbots. // Fix for duplicate connections to an AltBot for the Playerbots module.", + "type": "cpp", + "category": "uncategorized", + "notes": "Discovered via GitHub topic 'azerothcore-module'", + "status": "active", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] + }, + { + "key": "MODULE_MOD_MATERIAL_BANK", + "name": "mod-material-bank", + "repo": "https://github.com/BeardBear33/mod-material-bank.git", + "description": "Module for WoW 3.3.5a (AzerothCore \u2013 Playerbots). Tested on Ubuntu.", + "type": "cpp", + "category": "uncategorized", + "notes": "Discovered via GitHub topic 'azerothcore-module'", + "status": "active", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] + }, + { + "key": "MODULE_MOD_PROGRESSION_BLIZZLIKE", + "name": "mod-progression-blizzlike", + "repo": "https://github.com/kambire/mod-progression-blizzlike.git", + "description": "Modular progression system for AzerothCore built around brackets (Vanilla/TBC/WotLK + Arena seasons). Each enabled bracket can load its own C++ scripts and SQL updates.", + "type": "cpp", + "category": "uncategorized", + "notes": "Discovered via GitHub topic 'azerothcore-module'", + "status": "active", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] + }, + { + "key": "MODULE_MOD_PYTHON_ENGINE", + "name": "mod-python-engine", + "repo": "https://github.com/privatecore/mod-python-engine.git", + "description": "A Python Scripting Engine module for AzerothCore", + "type": "cpp", + "category": "uncategorized", + "notes": "Discovered via GitHub topic 'azerothcore-module'", + "status": "active", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] + }, + { + "key": "MODULE_WRATH_OF_THE_VANILLA_V2", + "name": "wrath-of-the-vanilla-v2", + "repo": "https://github.com/Hextv/wrath-of-the-vanilla-v2.git", + "description": "Project that focuses on turning a server running AzerothCore into one limited to the original (vanilla) content.", + "type": "sql", + "category": "database", + "notes": "Discovered via GitHub topic 'azerothcore-module'", + "status": "active", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] + }, + { + "key": "MODULE_AZEROTHMCP", + "name": "azerothMCP", + "repo": "https://github.com/blinkysc/azerothMCP.git", + "description": "MCP server for AzerothCore", + "type": "tool", + "category": "tooling", + "notes": "Discovered via GitHub topic 'azerothcore-tools' Not directly related to runtime functionality of AzerothCore", + "status": "blocked", + "order": 5000, + "requires": [], + "post_install_hooks": [], + "config_cleanup": [] } ] } diff --git a/scripts/bash/manage-modules.sh b/scripts/bash/manage-modules.sh index 68b5af9..946e8f0 100755 --- a/scripts/bash/manage-modules.sh +++ b/scripts/bash/manage-modules.sh @@ -467,6 +467,7 @@ load_sql_helper(){ # Module SQL is now staged at runtime by stage-modules.sh which copies files to # /azerothcore/data/sql/updates/ (core directory) where they ARE scanned and processed. + track_module_state(){ echo 'Checking for module changes that require rebuild...' diff --git a/scripts/python/update_module_manifest.py b/scripts/python/update_module_manifest.py index 583c4d2..df646c4 100755 --- a/scripts/python/update_module_manifest.py +++ b/scripts/python/update_module_manifest.py @@ -18,6 +18,7 @@ import re import sys import time from dataclasses import dataclass +from pathlib import Path from typing import Dict, Iterable, List, Optional, Sequence from urllib import error, parse, request @@ -87,6 +88,16 @@ def parse_args(argv: Sequence[str]) -> argparse.Namespace: action="store_true", help="Print verbose progress information", ) + parser.add_argument( + "--update-template", + default=".env.template", + help="Update .env.template with missing module variables (default: %(default)s)", + ) + parser.add_argument( + "--skip-template", + action="store_true", + help="Skip updating .env.template", + ) return parser.parse_args(argv) @@ -273,6 +284,82 @@ def collect_repositories( return list(seen.values()) +def update_env_template(manifest_path: str, template_path: str) -> bool: + """Update .env.template with missing module variables. + + Args: + manifest_path: Path to the module manifest JSON file + template_path: Path to .env.template file + + Returns: + True if template was updated, False if no changes needed + """ + # Load manifest to get all module keys + manifest = load_manifest(manifest_path) + modules = manifest.get("modules", []) + if not modules: + return False + + # Extract all module keys + module_keys = set() + for module in modules: + key = module.get("key") + if key: + module_keys.add(key) + + if not module_keys: + return False + + # Check if template file exists + template_file = Path(template_path) + if not template_file.exists(): + print(f"Warning: .env.template not found at {template_path}") + return False + + # Read current template content + try: + current_content = template_file.read_text(encoding="utf-8") + current_lines = current_content.splitlines() + except Exception as exc: + print(f"Error reading .env.template: {exc}") + return False + + # Find which module variables are missing + existing_vars = set() + for line in current_lines: + line = line.strip() + if "=" in line and not line.startswith("#"): + var_name = line.split("=", 1)[0].strip() + existing_vars.add(var_name) + + missing_vars = module_keys - existing_vars + if not missing_vars: + print("✅ All module variables present in .env.template") + return False + + # Add missing variables to the end of the file + print(f"📝 Adding {len(missing_vars)} missing module variable(s) to .env.template:") + + # Sort missing vars for consistent output + sorted_missing = sorted(missing_vars) + + # Prepare new content + new_lines = current_lines[:] + for var in sorted_missing: + new_lines.append(f"{var}=0") + print(f" • {var}=0") + + # Write updated content + try: + new_content = "\n".join(new_lines) + "\n" + template_file.write_text(new_content, encoding="utf-8") + print("✅ .env.template updated successfully") + return True + except Exception as exc: + print(f"Error writing .env.template: {exc}") + return False + + def main(argv: Sequence[str]) -> int: args = parse_args(argv) topics = args.topics or DEFAULT_TOPICS @@ -291,6 +378,13 @@ def main(argv: Sequence[str]) -> int: handle.write("\n") print(f"Updated manifest {args.manifest}: added {added}, refreshed {updated}") + + # Update .env.template if requested and we have changes + if not args.skip_template and (added > 0 or updated > 0): + template_updated = update_env_template(args.manifest, args.update_template) + if template_updated: + print(f"Updated {args.update_template} with new module variables") + return 0