empire-core 0.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. empire_core-0.17.0/.github/workflows/ci.yml +48 -0
  2. empire_core-0.17.0/.github/workflows/publish.yml +79 -0
  3. empire_core-0.17.0/.gitignore +138 -0
  4. empire_core-0.17.0/.pre-commit-config.yaml +23 -0
  5. empire_core-0.17.0/CHANGELOG.md +354 -0
  6. empire_core-0.17.0/CONTRIBUTING.md +434 -0
  7. empire_core-0.17.0/PKG-INFO +197 -0
  8. empire_core-0.17.0/README.md +168 -0
  9. empire_core-0.17.0/accounts.json.template +6 -0
  10. empire_core-0.17.0/docs/ACTION_COMMANDS.md +301 -0
  11. empire_core-0.17.0/docs/FEATURE_COMPARISON.md +51 -0
  12. empire_core-0.17.0/docs/FEATURE_PARITY.md +126 -0
  13. empire_core-0.17.0/docs/GAME_MECHANICS.md +566 -0
  14. empire_core-0.17.0/docs/PYGGE_COMPARISON.md +185 -0
  15. empire_core-0.17.0/docs/design/action_commands.md +68 -0
  16. empire_core-0.17.0/docs/design/architecture.md +50 -0
  17. empire_core-0.17.0/docs/design/deep_dive_findings.md +166 -0
  18. empire_core-0.17.0/docs/design/events.md +61 -0
  19. empire_core-0.17.0/docs/design/game_bundle_analysis.md +70 -0
  20. empire_core-0.17.0/docs/design/protocol.md +62 -0
  21. empire_core-0.17.0/docs/design/response_validation.md +114 -0
  22. empire_core-0.17.0/docs/design/state_management.md +64 -0
  23. empire_core-0.17.0/examples/_archive/battle_report_analyzer.py +162 -0
  24. empire_core-0.17.0/examples/_archive/demo.py +95 -0
  25. empire_core-0.17.0/examples/_archive/detailed_state_demo.py +135 -0
  26. empire_core-0.17.0/examples/_archive/map_persistence_demo.py +96 -0
  27. empire_core-0.17.0/examples/_archive/movement_tracker.py +222 -0
  28. empire_core-0.17.0/examples/_archive/quest_monitor.py +135 -0
  29. empire_core-0.17.0/examples/_archive/resource_monitor_bot.py +103 -0
  30. empire_core-0.17.0/examples/_archive/simple_farm_bot.py +119 -0
  31. empire_core-0.17.0/examples/_archive/world_mapper.py +133 -0
  32. empire_core-0.17.0/examples/debug_packets.py +118 -0
  33. empire_core-0.17.0/examples/test_client.py +85 -0
  34. empire_core-0.17.0/pyproject.toml +101 -0
  35. empire_core-0.17.0/pytest.ini +6 -0
  36. empire_core-0.17.0/src/empire_core/__init__.py +36 -0
  37. empire_core-0.17.0/src/empire_core/_archive/actions.py +511 -0
  38. empire_core-0.17.0/src/empire_core/_archive/automation/__init__.py +24 -0
  39. empire_core-0.17.0/src/empire_core/_archive/automation/alliance_tools.py +266 -0
  40. empire_core-0.17.0/src/empire_core/_archive/automation/battle_reports.py +196 -0
  41. empire_core-0.17.0/src/empire_core/_archive/automation/building_queue.py +242 -0
  42. empire_core-0.17.0/src/empire_core/_archive/automation/defense_manager.py +124 -0
  43. empire_core-0.17.0/src/empire_core/_archive/automation/map_scanner.py +370 -0
  44. empire_core-0.17.0/src/empire_core/_archive/automation/multi_account.py +296 -0
  45. empire_core-0.17.0/src/empire_core/_archive/automation/quest_automation.py +94 -0
  46. empire_core-0.17.0/src/empire_core/_archive/automation/resource_manager.py +380 -0
  47. empire_core-0.17.0/src/empire_core/_archive/automation/target_finder.py +153 -0
  48. empire_core-0.17.0/src/empire_core/_archive/automation/tasks.py +224 -0
  49. empire_core-0.17.0/src/empire_core/_archive/automation/unit_production.py +719 -0
  50. empire_core-0.17.0/src/empire_core/_archive/cli.py +68 -0
  51. empire_core-0.17.0/src/empire_core/_archive/client_async.py +469 -0
  52. empire_core-0.17.0/src/empire_core/_archive/commands.py +201 -0
  53. empire_core-0.17.0/src/empire_core/_archive/connection_async.py +228 -0
  54. empire_core-0.17.0/src/empire_core/_archive/defense.py +156 -0
  55. empire_core-0.17.0/src/empire_core/_archive/events/__init__.py +35 -0
  56. empire_core-0.17.0/src/empire_core/_archive/events/base.py +153 -0
  57. empire_core-0.17.0/src/empire_core/_archive/events/manager.py +85 -0
  58. empire_core-0.17.0/src/empire_core/accounts.py +190 -0
  59. empire_core-0.17.0/src/empire_core/client/__init__.py +0 -0
  60. empire_core-0.17.0/src/empire_core/client/client.py +752 -0
  61. empire_core-0.17.0/src/empire_core/config.py +87 -0
  62. empire_core-0.17.0/src/empire_core/exceptions.py +42 -0
  63. empire_core-0.17.0/src/empire_core/network/__init__.py +0 -0
  64. empire_core-0.17.0/src/empire_core/network/connection.py +378 -0
  65. empire_core-0.17.0/src/empire_core/protocol/__init__.py +0 -0
  66. empire_core-0.17.0/src/empire_core/protocol/models/__init__.py +389 -0
  67. empire_core-0.17.0/src/empire_core/protocol/models/alliance.py +568 -0
  68. empire_core-0.17.0/src/empire_core/protocol/models/army.py +444 -0
  69. empire_core-0.17.0/src/empire_core/protocol/models/attack.py +229 -0
  70. empire_core-0.17.0/src/empire_core/protocol/models/auth.py +216 -0
  71. empire_core-0.17.0/src/empire_core/protocol/models/base.py +404 -0
  72. empire_core-0.17.0/src/empire_core/protocol/models/building.py +455 -0
  73. empire_core-0.17.0/src/empire_core/protocol/models/castle.py +317 -0
  74. empire_core-0.17.0/src/empire_core/protocol/models/chat.py +150 -0
  75. empire_core-0.17.0/src/empire_core/protocol/models/defense.py +300 -0
  76. empire_core-0.17.0/src/empire_core/protocol/models/map.py +409 -0
  77. empire_core-0.17.0/src/empire_core/protocol/models/player.py +219 -0
  78. empire_core-0.17.0/src/empire_core/protocol/models/search.py +96 -0
  79. empire_core-0.17.0/src/empire_core/protocol/packet.py +104 -0
  80. empire_core-0.17.0/src/empire_core/services/__init__.py +31 -0
  81. empire_core-0.17.0/src/empire_core/services/alliance.py +405 -0
  82. empire_core-0.17.0/src/empire_core/services/base.py +107 -0
  83. empire_core-0.17.0/src/empire_core/services/castle.py +221 -0
  84. empire_core-0.17.0/src/empire_core/state/__init__.py +0 -0
  85. empire_core-0.17.0/src/empire_core/state/manager.py +408 -0
  86. empire_core-0.17.0/src/empire_core/state/models.py +215 -0
  87. empire_core-0.17.0/src/empire_core/state/quest_models.py +60 -0
  88. empire_core-0.17.0/src/empire_core/state/report_models.py +115 -0
  89. empire_core-0.17.0/src/empire_core/state/unit_models.py +75 -0
  90. empire_core-0.17.0/src/empire_core/state/world_models.py +274 -0
  91. empire_core-0.17.0/src/empire_core/storage/__init__.py +1 -0
  92. empire_core-0.17.0/src/empire_core/storage/database.py +237 -0
  93. empire_core-0.17.0/src/empire_core/utils/__init__.py +0 -0
  94. empire_core-0.17.0/src/empire_core/utils/battle_sim.py +172 -0
  95. empire_core-0.17.0/src/empire_core/utils/calculations.py +170 -0
  96. empire_core-0.17.0/src/empire_core/utils/crypto.py +8 -0
  97. empire_core-0.17.0/src/empire_core/utils/decorators.py +69 -0
  98. empire_core-0.17.0/src/empire_core/utils/enums.py +111 -0
  99. empire_core-0.17.0/src/empire_core/utils/helpers.py +252 -0
  100. empire_core-0.17.0/src/empire_core/utils/response_awaiter.py +153 -0
  101. empire_core-0.17.0/src/empire_core/utils/troops.py +93 -0
  102. empire_core-0.17.0/tests/_archive/manual_network_test.py +114 -0
  103. empire_core-0.17.0/tests/_archive/manual_state_population_test.py +59 -0
  104. empire_core-0.17.0/tests/_archive/real_network_test.py +46 -0
  105. empire_core-0.17.0/tests/_archive/test_account_pool.py +59 -0
  106. empire_core-0.17.0/tests/_archive/test_actions.py +103 -0
  107. empire_core-0.17.0/tests/_archive/test_events.py +48 -0
  108. empire_core-0.17.0/tests/_archive/test_handshake.py +93 -0
  109. empire_core-0.17.0/tests/test_response_awaiter.py +146 -0
  110. empire_core-0.17.0/uv.lock +2053 -0
@@ -0,0 +1,48 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [master]
6
+
7
+ jobs:
8
+ lint:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+
13
+ - name: Install uv
14
+ uses: astral-sh/setup-uv@v4
15
+ with:
16
+ version: "latest"
17
+
18
+ - name: Set up Python
19
+ run: uv python install 3.12
20
+
21
+ - name: Install dependencies
22
+ run: uv sync --extra dev
23
+
24
+ - name: Run pre-commit
25
+ uses: pre-commit/action@v3.0.1
26
+
27
+ test:
28
+ runs-on: ubuntu-latest
29
+ strategy:
30
+ matrix:
31
+ python-version: ["3.10", "3.11", "3.12"]
32
+ name: test (${{ matrix.python-version }})
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+
36
+ - name: Install uv
37
+ uses: astral-sh/setup-uv@v4
38
+ with:
39
+ version: "latest"
40
+
41
+ - name: Set up Python ${{ matrix.python-version }}
42
+ run: uv python install ${{ matrix.python-version }}
43
+
44
+ - name: Install dependencies
45
+ run: uv sync --extra dev
46
+
47
+ - name: Run tests
48
+ run: uv run pytest -v
@@ -0,0 +1,79 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ release:
10
+ name: Semantic Release
11
+ runs-on: ubuntu-latest
12
+ concurrency: release
13
+ permissions:
14
+ contents: write
15
+ id-token: write
16
+ outputs:
17
+ released: ${{ steps.release.outputs.released }}
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ with:
21
+ fetch-depth: 0
22
+ token: ${{ secrets.RELEASE_TOKEN }}
23
+
24
+ - name: Configure Git
25
+ run: |
26
+ git config user.name "github-actions[bot]"
27
+ git config user.email "github-actions[bot]@users.noreply.github.com"
28
+
29
+ - name: Install uv
30
+ uses: astral-sh/setup-uv@v4
31
+ with:
32
+ version: "latest"
33
+
34
+ - name: Set up Python
35
+ run: uv python install 3.12
36
+
37
+ - name: Install dependencies
38
+ run: uv sync --extra dev
39
+
40
+ - name: Semantic Release
41
+ id: release
42
+ env:
43
+ GH_TOKEN: ${{ secrets.RELEASE_TOKEN }}
44
+ run: |
45
+ output=$(uv run semantic-release version 2>&1) || true
46
+ echo "$output"
47
+ if echo "$output" | grep -q "No release will be made"; then
48
+ echo "released=false" >> $GITHUB_OUTPUT
49
+ elif [ -d "dist" ] && [ "$(ls -A dist)" ]; then
50
+ echo "released=true" >> $GITHUB_OUTPUT
51
+ else
52
+ echo "released=false" >> $GITHUB_OUTPUT
53
+ fi
54
+
55
+ - name: Upload dist artifacts
56
+ if: steps.release.outputs.released == 'true'
57
+ uses: actions/upload-artifact@v4
58
+ with:
59
+ name: dist
60
+ path: dist/
61
+ retention-days: 1
62
+
63
+ publish:
64
+ name: Publish to PyPI
65
+ needs: release
66
+ if: needs.release.outputs.released == 'true'
67
+ runs-on: ubuntu-latest
68
+ environment: pypi
69
+ permissions:
70
+ id-token: write
71
+ steps:
72
+ - name: Download dist artifacts
73
+ uses: actions/download-artifact@v4
74
+ with:
75
+ name: dist
76
+ path: dist/
77
+
78
+ - name: Upload to PyPI
79
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,138 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+
27
+ # PyInstaller
28
+ # Usually these files are written by a python script from a template
29
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
30
+ *.manifest
31
+ *.spec
32
+
33
+ # Installer logs
34
+ pip-log.txt
35
+ pip-delete-this-directory.txt
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .nox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *.cover
47
+ *.py,cover
48
+ .hypothesis/
49
+ .pytest_cache/
50
+
51
+ # Translations
52
+ *.mo
53
+ *.pot
54
+
55
+ # Django stuff:
56
+ *.log
57
+ local_settings.py
58
+ db.sqlite3
59
+ db.sqlite3-journal
60
+
61
+ # Flask stuff:
62
+ instance/
63
+ .webassets-cache
64
+
65
+ # Scrapy stuff:
66
+ .scrapy
67
+
68
+ # Sphinx documentation
69
+ docs/_build/
70
+
71
+ # PyBuilder
72
+ target/
73
+
74
+ # Jupyter Notebook
75
+ .ipynb_checkpoints
76
+
77
+ # IPython
78
+ profile_default/
79
+ ipython_config.py
80
+
81
+ # pyenv
82
+ .python-version
83
+
84
+ # pipenv
85
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
86
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
87
+ # with no cross-platform support, pipenv may install dependencies that don't work, or not
88
+ # install all needed dependencies.
89
+ #Pipfile.lock
90
+
91
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
92
+ __pypackages__/
93
+
94
+ # Celery stuff
95
+ celerybeat-schedule
96
+ celerybeat.pid
97
+
98
+ # SageMath parsed files
99
+ *.sage.py
100
+
101
+ # Environments
102
+ .env
103
+ .venv
104
+ env/
105
+ venv/
106
+ ENV/
107
+ env.bak/
108
+ venv.bak/
109
+
110
+ # Spyder project settings
111
+ .spyderproject
112
+ .spyproject
113
+
114
+ # Rope project settings
115
+ .ropeproject
116
+
117
+ # mkdocs documentation
118
+ /site
119
+
120
+ # mypy
121
+ .mypy_cache/
122
+ .dmypy.json
123
+ dmypy.json
124
+
125
+ # Pyre type checker
126
+ .pyre/
127
+
128
+ # Editors
129
+ .vscode/
130
+ .idea/
131
+ *.swp
132
+ *.swo
133
+
134
+ # Config
135
+ accounts.json
136
+ *.db
137
+ *.db-shm
138
+ *.db-wal
@@ -0,0 +1,23 @@
1
+ # Pre-commit configuration for EmpireCore
2
+ repos:
3
+ - repo: https://github.com/astral-sh/ruff-pre-commit
4
+ rev: v0.1.14
5
+ hooks:
6
+ - id: ruff
7
+ args: [ --fix ]
8
+ - id: ruff-format
9
+
10
+ - repo: https://github.com/pre-commit/mirrors-mypy
11
+ rev: v1.8.0
12
+ hooks:
13
+ - id: mypy
14
+ additional_dependencies: [ pydantic, aiohttp, python-dotenv, typer, sqlmodel, aiosqlite, sqlalchemy, types-tabulate, types-requests, requests ]
15
+ args: [ --config-file=pyproject.toml ]
16
+ exclude: "_archive/"
17
+
18
+ - repo: https://github.com/compilerla/conventional-pre-commit
19
+ rev: v3.1.0
20
+ hooks:
21
+ - id: conventional-pre-commit
22
+ stages: [ commit-msg ]
23
+ args: []
@@ -0,0 +1,354 @@
1
+ # CHANGELOG
2
+
3
+ <!-- version list -->
4
+
5
+ ## v0.17.0 (2026-01-11)
6
+
7
+ ### Features
8
+
9
+ - Add alliance search (hgh command)
10
+ ([`9629811`](https://github.com/eschnitzler/EmpireCore/commit/9629811bf3a334d872dfafb83f045e3b9ed5967f))
11
+
12
+
13
+ ## v0.16.0 (2026-01-11)
14
+
15
+ ### Bug Fixes
16
+
17
+ - Revert version for semantic-release
18
+ ([`8e8e35f`](https://github.com/eschnitzler/EmpireCore/commit/8e8e35fa9e947d66d633c834f28b410d7fa2b70d))
19
+
20
+ - Rewrite scan_kingdom with sequential request/response
21
+ ([`37fc924`](https://github.com/eschnitzler/EmpireCore/commit/37fc924709b48a26ab8fce7fef624d619d76c291))
22
+
23
+ - Wait for gbd packet after login to populate player state
24
+ ([`3057b5e`](https://github.com/eschnitzler/EmpireCore/commit/3057b5ee6fa9b0315ab4d4fa76ed832691d65e25))
25
+
26
+ ### Features
27
+
28
+ - Add Kingdom enum and alliance tracking support
29
+ ([`0b6a4d4`](https://github.com/eschnitzler/EmpireCore/commit/0b6a4d49484df1f8072e7d2b1f202386ac712ac3))
30
+
31
+ - Add scan_kingdom with BFS wave expansion
32
+ ([`d14af84`](https://github.com/eschnitzler/EmpireCore/commit/d14af846b739cd99497f7840f06ca165ceda90a6))
33
+
34
+
35
+ ## v0.15.0 (2026-01-11)
36
+
37
+ ### Features
38
+
39
+ - Expose raw commander data in movements
40
+ ([`f461d49`](https://github.com/eschnitzler/EmpireCore/commit/f461d49790b9477a033c04bc89cf295c1464795a))
41
+
42
+
43
+ ## v0.14.0 (2026-01-10)
44
+
45
+ ### Features
46
+
47
+ - Dispatch on_incoming_attack callback for movement updates
48
+ ([`db39eda`](https://github.com/eschnitzler/EmpireCore/commit/db39eda257edda791d94b6102b098ab9544f7765))
49
+
50
+
51
+ ## v0.13.0 (2026-01-10)
52
+
53
+ ### Features
54
+
55
+ - Add activity_tier property to AllianceMember for tiered offline status
56
+ ([`cd67fae`](https://github.com/eschnitzler/EmpireCore/commit/cd67fae55bfa78bc81fc7b92a7202975b3fb071b))
57
+
58
+ ### Breaking Changes
59
+
60
+ - _online property replaced with _activity_tier
61
+
62
+
63
+ ## v0.11.0 (2026-01-08)
64
+
65
+ ### Features
66
+
67
+ - Add no_cache option to get_member() for fresh data
68
+ ([`ba26735`](https://github.com/eschnitzler/EmpireCore/commit/ba2673566585be33bc9134e6c526d9752704c6e5))
69
+
70
+
71
+ ## v0.10.1 (2026-01-08)
72
+
73
+ ### Refactoring
74
+
75
+ - Rename get_my_* to get_local_* for consistency
76
+ ([`75caebd`](https://github.com/eschnitzler/EmpireCore/commit/75caebdceeb62578ff97af013600d9959df72107))
77
+
78
+
79
+ ## v0.10.0 (2026-01-08)
80
+
81
+ ### Features
82
+
83
+ - Add convenience methods for local player's alliance data
84
+ ([`0de1e9a`](https://github.com/eschnitzler/EmpireCore/commit/0de1e9a25bbeb104ce1cbd4d6290c647ea297b46))
85
+
86
+
87
+ ## v0.9.0 (2026-01-08)
88
+
89
+ ### Features
90
+
91
+ - Add alliance info command (ain) with member online status
92
+ ([`fcc9977`](https://github.com/eschnitzler/EmpireCore/commit/fcc9977580d05144cd8ff8e4a818a3a8f8caf710))
93
+
94
+
95
+ ## v0.8.0 (2026-01-06)
96
+
97
+ ### Features
98
+
99
+ - Add on_movement_arrived callback and change recall/arrived to pass MID only
100
+ ([`6e8084d`](https://github.com/eschnitzler/EmpireCore/commit/6e8084dc949596a3813004179476635c6e4086c2))
101
+
102
+
103
+ ## v0.7.3 (2026-01-06)
104
+
105
+ ### Bug Fixes
106
+
107
+ - Don't remove movements in gam handler, wait for arrival/recall packets
108
+ ([`0b5d49f`](https://github.com/eschnitzler/EmpireCore/commit/0b5d49f5ba2cc52860544fe2e463475046dca88a))
109
+
110
+
111
+ ## v0.7.2 (2026-01-06)
112
+
113
+ ### Bug Fixes
114
+
115
+ - Use mrm packet for recall detection, not maa
116
+ ([`6c8c461`](https://github.com/eschnitzler/EmpireCore/commit/6c8c46101bb65fe995725b17da1b99568087f951))
117
+
118
+
119
+ ## v0.7.1 (2026-01-06)
120
+
121
+ ### Bug Fixes
122
+
123
+ - Detect recalls via maa packet instead of gam comparison
124
+ ([`82ed870`](https://github.com/eschnitzler/EmpireCore/commit/82ed8708b6aae0134e4c65ef2d62d4d1fea93e3e))
125
+
126
+
127
+ ## v0.7.0 (2026-01-06)
128
+
129
+ ### Features
130
+
131
+ - Add estimated_size field to Movement for non-visible armies
132
+ ([`23fed4d`](https://github.com/eschnitzler/EmpireCore/commit/23fed4d0a10c33bcb1ab1244327dba767f3d1647))
133
+
134
+
135
+ ## v0.6.6 (2026-01-06)
136
+
137
+ ### Bug Fixes
138
+
139
+ - Handle GS as int and SA as int in gam/gal packets
140
+ ([`51855ae`](https://github.com/eschnitzler/EmpireCore/commit/51855ae13f34bc8390e45f96889a73df4e9a2ca3))
141
+
142
+
143
+ ## v0.6.5 (2026-01-06)
144
+
145
+ ### Bug Fixes
146
+
147
+ - Coerce SA field to string in Alliance model
148
+ ([`b6b23aa`](https://github.com/eschnitzler/EmpireCore/commit/b6b23aa459ff2e0d0fb223a3dba5e4c5eb8a5b80))
149
+
150
+ ### Chores
151
+
152
+ - Add info-level logging for SDI debugging
153
+ ([`faf9564`](https://github.com/eschnitzler/EmpireCore/commit/faf95645810ef7be1d7673439e60669da00b18e3))
154
+
155
+
156
+ ## v0.6.4 (2026-01-06)
157
+
158
+ ### Bug Fixes
159
+
160
+ - Handle lli packet for alliance info + add debug logging
161
+ ([`7cdb545`](https://github.com/eschnitzler/EmpireCore/commit/7cdb545bfbf870a92c162c62ebe899481f1ef339))
162
+
163
+
164
+ ## v0.6.3 (2026-01-06)
165
+
166
+ ### Bug Fixes
167
+
168
+ - Dispatch callbacks in thread pool to avoid blocking receive loop
169
+ ([`a30562f`](https://github.com/eschnitzler/EmpireCore/commit/a30562f172d409bae74ba1cd645bbfa780bfa9d7))
170
+
171
+
172
+ ## v0.6.2 (2026-01-06)
173
+
174
+ ### Bug Fixes
175
+
176
+ - Get_max_defense returns yard_limit only (includes support capacity)
177
+ ([`22c9fdc`](https://github.com/eschnitzler/EmpireCore/commit/22c9fdc7788cf920b6cbab63355e43331a1ba774))
178
+
179
+
180
+ ## v0.6.1 (2026-01-06)
181
+
182
+ ### Bug Fixes
183
+
184
+ - Correct castle coordinate parsing from lli response
185
+ ([`db057d1`](https://github.com/eschnitzler/EmpireCore/commit/db057d10cbfd4a5692c5731b8963945c4245bbe6))
186
+
187
+
188
+ ## v0.6.0 (2026-01-05)
189
+
190
+ ### Features
191
+
192
+ - Add defense capacity limits (yard_limit, wall_limit) to SDI response
193
+ ([`ec886df`](https://github.com/eschnitzler/EmpireCore/commit/ec886dfbfd588a90dd4b9f82b653acfc38c05a47))
194
+
195
+
196
+ ## v0.5.0 (2026-01-05)
197
+
198
+ ### Features
199
+
200
+ - Add SDI (Support Defense Info) command for querying alliance castle defense
201
+ ([`abcc58d`](https://github.com/eschnitzler/EmpireCore/commit/abcc58d4855849991bbb923e98d9525216be487b))
202
+
203
+
204
+ ## v0.4.5 (2026-01-05)
205
+
206
+ ### Bug Fixes
207
+
208
+ - Extract GA units from wrapper level, not inside UM
209
+ ([`d645968`](https://github.com/eschnitzler/EmpireCore/commit/d6459687b1e1c43cc5c49156ec6ed06d914ca107))
210
+
211
+
212
+ ## v0.4.4 (2026-01-05)
213
+
214
+ ### Bug Fixes
215
+
216
+ - Parse GA (Garrison Army) units from movement wrapper
217
+ ([`83ff404`](https://github.com/eschnitzler/EmpireCore/commit/83ff40424ad583c324d8790616cac5e81de25eb4))
218
+
219
+ ### Chores
220
+
221
+ - Bump version to 0.4.4
222
+ ([`6f14f68`](https://github.com/eschnitzler/EmpireCore/commit/6f14f6867546550751cdad4df0073df3176d253b))
223
+
224
+
225
+ ## v0.4.2 (2026-01-05)
226
+
227
+ ### Bug Fixes
228
+
229
+ - Include T=0 as attack movement type
230
+ ([`1b4b219`](https://github.com/eschnitzler/EmpireCore/commit/1b4b219add109c7500a6124cbf9b7c828ea2ddce))
231
+
232
+
233
+ ## v0.4.1 (2026-01-05)
234
+
235
+ ### Bug Fixes
236
+
237
+ - Trigger attack callback for all attacks, not just incoming
238
+ ([`0592812`](https://github.com/eschnitzler/EmpireCore/commit/0592812aecd74fff39ddc37e152dc9fe60c39c68))
239
+
240
+
241
+ ## v0.4.0 (2026-01-04)
242
+
243
+ ### Bug Fixes
244
+
245
+ - Use dynamic version from package metadata
246
+ ([`c09a706`](https://github.com/eschnitzler/EmpireCore/commit/c09a70661bc1f110a260bf599aa22b781b2bc0d6))
247
+
248
+ ### Features
249
+
250
+ - Add troop filtering, alliance names, and recall detection
251
+ ([`803ac07`](https://github.com/eschnitzler/EmpireCore/commit/803ac079a682528dc6339e0efd8d2d8cf021c26c))
252
+
253
+
254
+ ## v0.3.1 (2026-01-04)
255
+
256
+ ### Bug Fixes
257
+
258
+ - Use dynamic version from package metadata ([#4](https://github.com/eschnitzler/EmpireCore/pull/4),
259
+ [`4efe3d5`](https://github.com/eschnitzler/EmpireCore/commit/4efe3d51cbc0d8fc0b2ae69190205ed3c9b3434f))
260
+
261
+
262
+ ## v0.3.0 (2026-01-04)
263
+
264
+ ### Bug Fixes
265
+
266
+ - **cd**: Pass built artifacts from release job to publish job
267
+ ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
268
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
269
+
270
+ - **cd**: Trigger release on push to master instead of CI workflow_run
271
+ ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
272
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
273
+
274
+ - **cd**: Use no-commit mode for semantic-release to work with branch protection
275
+ ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
276
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
277
+
278
+ - **cd**: Use RELEASE_TOKEN PAT for semantic-release
279
+ ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
280
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
281
+
282
+ - **ci**: Align job names with branch protection rules
283
+ ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
284
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
285
+
286
+ - **ci**: Only run CI on pull requests ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
287
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
288
+
289
+ - **ci**: Only run CI on pull requests, not on merge to master
290
+ ([#3](https://github.com/eschnitzler/EmpireCore/pull/3),
291
+ [`615483d`](https://github.com/eschnitzler/EmpireCore/commit/615483d71c6a879f6f06b8f7036ef58fbf3542d6))
292
+
293
+ ### Chores
294
+
295
+ - Remove stale documentation and empty test ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
296
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
297
+
298
+ ### Features
299
+
300
+ - Add protocol models and service layer ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
301
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
302
+
303
+ - Add service layer with auto-registration ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
304
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
305
+
306
+ - **protocol**: Add Pydantic models for GGE protocol commands
307
+ ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
308
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
309
+
310
+ ### Performance Improvements
311
+
312
+ - Optimize packet dispatch for high message volume
313
+ ([#2](https://github.com/eschnitzler/EmpireCore/pull/2),
314
+ [`0957f15`](https://github.com/eschnitzler/EmpireCore/commit/0957f15ed3580334f88d3019504b8dfcd11d8ad6))
315
+
316
+
317
+ ## v0.2.1 (2026-01-04)
318
+
319
+ ### Bug Fixes
320
+
321
+ - Ensure publish job gets latest version after semantic-release bump
322
+ ([`272e3c3`](https://github.com/eschnitzler/EmpireCore/commit/272e3c3f38694da164af65b39d30f75a7dc582b0))
323
+
324
+ - Exclude _archive from pytest collection
325
+ ([`2ba8b8c`](https://github.com/eschnitzler/EmpireCore/commit/2ba8b8cce5f51f8939831c2eb393c3ce56a19528))
326
+
327
+ - Require env vars for credentials in examples
328
+ ([`cf005e3`](https://github.com/eschnitzler/EmpireCore/commit/cf005e34c179455abce766130cfcb50f5ecea8c2))
329
+
330
+ - Resolve CI failures by archiving old async code and fixing type errors
331
+ ([`a514161`](https://github.com/eschnitzler/EmpireCore/commit/a51416187e9b59b87eead37f2a988d5b6fb369b9))
332
+
333
+ ### Code Style
334
+
335
+ - Auto-fix ruff lint errors
336
+ ([`3483e3e`](https://github.com/eschnitzler/EmpireCore/commit/3483e3e56e514ecb047ab8c1560658568c9fa7c7))
337
+
338
+ ### Refactoring
339
+
340
+ - Replace async architecture with sync + threading
341
+ ([`67315c6`](https://github.com/eschnitzler/EmpireCore/commit/67315c6699d580305cafe8cc5e165039ccb3cc4b))
342
+
343
+
344
+ ## v0.2.0 (2025-12-31)
345
+
346
+ ### Features
347
+
348
+ - Add send_support and get_bookmarks actions for troop birding
349
+ ([`5a14466`](https://github.com/eschnitzler/EmpireCore/commit/5a1446660d5d112aec7c1866f15a514551907451))
350
+
351
+
352
+ ## v0.1.0 (2025-12-29)
353
+
354
+ - Initial Release