calagoapi-version-changer 1.0.0__py3-none-any.whl
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.
- calagoapi_version_changer/__init__.py +14 -0
- calagoapi_version_changer/api.py +53 -0
- calagoapi_version_changer/extension.py +204 -0
- calagoapi_version_changer-1.0.0.dist-info/METADATA +91 -0
- calagoapi_version_changer-1.0.0.dist-info/RECORD +8 -0
- calagoapi_version_changer-1.0.0.dist-info/WHEEL +5 -0
- calagoapi_version_changer-1.0.0.dist-info/entry_points.txt +2 -0
- calagoapi_version_changer-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'''
|
|
2
|
+
calagoapi-version-changer: the Calagopus Minecraft Version Changer for CalagoAPI.
|
|
3
|
+
|
|
4
|
+
You do not need to import this package. Install it and enable it by id:
|
|
5
|
+
|
|
6
|
+
from calagoapi.extensions import enable
|
|
7
|
+
enable('version_changer')
|
|
8
|
+
'''
|
|
9
|
+
from importlib.metadata import version as _pkg_version, PackageNotFoundError
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
__version__ = _pkg_version('calagoapi-version-changer')
|
|
13
|
+
except PackageNotFoundError:
|
|
14
|
+
__version__ = '0.0.0'
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from calagoapi.api.client import segment
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# Calagopus Minecraft Version Changer panel extension (dev.0x7d8.minecraftversionchanger)
|
|
5
|
+
PANEL_EXTENSION = 'dev.0x7d8.minecraftversionchanger'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class VersionChangerAPI:
|
|
9
|
+
'''
|
|
10
|
+
HTTP calls of the Calagopus Minecraft Version Changer. Uses the panel's client,
|
|
11
|
+
so authentication, retries and errors behave like the rest of CalagoAPI.
|
|
12
|
+
'''
|
|
13
|
+
def __init__(self, client):
|
|
14
|
+
self.client = client
|
|
15
|
+
|
|
16
|
+
def _path(self, server_id, suffix=''):
|
|
17
|
+
return f'/api/client/servers/{server_id}/minecraft/versions{suffix}'
|
|
18
|
+
|
|
19
|
+
# client endpoints
|
|
20
|
+
def installed(self, server_id):
|
|
21
|
+
return self.client.get(self._path(server_id, '/installed'))['build']
|
|
22
|
+
|
|
23
|
+
def types(self, server_id):
|
|
24
|
+
return self.client.get(self._path(server_id, '/types'))['types']
|
|
25
|
+
|
|
26
|
+
def versions(self, server_id, type, search=None, page=None, per_page=None):
|
|
27
|
+
return self.client.list(self._path(server_id, f'/types/{segment(type)}'), 'versions', {'search': search}, page, per_page)
|
|
28
|
+
|
|
29
|
+
def builds(self, server_id, type, version, search=None, page=None, per_page=None):
|
|
30
|
+
return self.client.list(self._path(server_id, f'/types/{segment(type)}/{segment(version)}'), 'builds', {'search': search}, page, per_page)
|
|
31
|
+
|
|
32
|
+
def install(self, server_id, build_uuid, truncate_directory=False, accept_eula=True):
|
|
33
|
+
return self.client.post(self._path(server_id, '/install'), json={
|
|
34
|
+
'build_uuid': build_uuid,
|
|
35
|
+
'truncate_directory': truncate_directory,
|
|
36
|
+
'accept_eula': accept_eula,
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
# admin endpoints
|
|
40
|
+
def _admin(self, suffix, method='GET', json=None):
|
|
41
|
+
return self.client.request(method, f'/api/admin/extensions/{PANEL_EXTENSION}/{suffix}', json=json)
|
|
42
|
+
|
|
43
|
+
def settings(self):
|
|
44
|
+
return self._admin('settings')['settings']
|
|
45
|
+
|
|
46
|
+
def updateSettings(self, settings):
|
|
47
|
+
return self._admin('settings', 'PUT', json=settings)
|
|
48
|
+
|
|
49
|
+
def statistics(self):
|
|
50
|
+
return self._admin('statistics/total')
|
|
51
|
+
|
|
52
|
+
def defaultOrder(self):
|
|
53
|
+
return self._admin('default-order')['mcjars_type_order']
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
'''
|
|
2
|
+
The Calagopus Minecraft Version Changer as a CalagoAPI extension.
|
|
3
|
+
|
|
4
|
+
from calagoapi.extensions import enable
|
|
5
|
+
|
|
6
|
+
enable('version_changer')
|
|
7
|
+
build = server.getBuilds('PAPER', '1.21.11', page=1, per_page=1)[0]
|
|
8
|
+
server.installVersion(build)
|
|
9
|
+
print(server.installedVersion['name'])
|
|
10
|
+
'''
|
|
11
|
+
from calagoapi import MinecraftServer
|
|
12
|
+
from calagoapi.admin.admin import ExtensionManager
|
|
13
|
+
from calagoapi.extensions import (
|
|
14
|
+
ConfigurationError,
|
|
15
|
+
Extension,
|
|
16
|
+
ExtensionMetadata,
|
|
17
|
+
method,
|
|
18
|
+
property_extension,
|
|
19
|
+
)
|
|
20
|
+
from calagoapi.utils.exceptions import InvalidActionError
|
|
21
|
+
from calagoapi.utils.model import idOf
|
|
22
|
+
|
|
23
|
+
from calagoapi_version_changer import __version__
|
|
24
|
+
from calagoapi_version_changer.api import VersionChangerAPI
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _api(obj) -> VersionChangerAPI:
|
|
28
|
+
return VersionChangerAPI(obj.panel.client)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# MinecraftServer methods
|
|
32
|
+
@method(MinecraftServer)
|
|
33
|
+
def getInstalledVersion(self) -> dict:
|
|
34
|
+
'''
|
|
35
|
+
Returns what the Version Changer knows about the installed build:
|
|
36
|
+
`{'build': {...}, 'latest': {...}}`, or None if the server was not installed with it.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
info = server.getInstalledVersion()
|
|
40
|
+
if info:
|
|
41
|
+
print(info['build']['name'], 'latest:', info['latest']['name'])
|
|
42
|
+
'''
|
|
43
|
+
return _api(self).installed(self.server_id)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@property_extension(MinecraftServer)
|
|
47
|
+
def installedVersion(self) -> dict:
|
|
48
|
+
'''
|
|
49
|
+
The installed build (type, name, version_id, ...), or None. Makes a request each
|
|
50
|
+
time it is read; in async code prefer `await server.getInstalledVersion()`.
|
|
51
|
+
|
|
52
|
+
Example:
|
|
53
|
+
print(server.installedVersion['name'])
|
|
54
|
+
'''
|
|
55
|
+
installed = getInstalledVersion(self)
|
|
56
|
+
return installed.get('build') if installed else None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@method(MinecraftServer)
|
|
60
|
+
def isUpToDate(self) -> bool:
|
|
61
|
+
'''
|
|
62
|
+
Returns True if the installed build is the newest build of its version, None if unknown.
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
if server.isUpToDate() is False:
|
|
66
|
+
server.updateVersion()
|
|
67
|
+
'''
|
|
68
|
+
installed = getInstalledVersion(self)
|
|
69
|
+
if not installed or not installed.get('build') or not installed.get('latest'):
|
|
70
|
+
return None
|
|
71
|
+
return installed['build'].get('uuid') == installed['latest'].get('uuid')
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@method(MinecraftServer)
|
|
75
|
+
def getVersionTypes(self) -> dict:
|
|
76
|
+
'''Returns the available server types (PAPER, PURPUR, FABRIC, VANILLA, ...).'''
|
|
77
|
+
return _api(self).types(self.server_id)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@method(MinecraftServer)
|
|
81
|
+
def getVersions(self, type: str, search: str = None, page: int = None, per_page: int = None):
|
|
82
|
+
'''
|
|
83
|
+
Returns the Minecraft versions available for a server type.
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
server.getVersions('PAPER', page=1, per_page=10)
|
|
87
|
+
'''
|
|
88
|
+
return _api(self).versions(self.server_id, type, search, page, per_page)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@method(MinecraftServer)
|
|
92
|
+
def getBuilds(self, type: str, version: str, search: str = None, page: int = None, per_page: int = None):
|
|
93
|
+
'''
|
|
94
|
+
Returns the builds of a version, newest first.
|
|
95
|
+
|
|
96
|
+
Example:
|
|
97
|
+
latest = server.getBuilds('PAPER', '1.21.11', page=1, per_page=1)[0]
|
|
98
|
+
'''
|
|
99
|
+
return _api(self).builds(self.server_id, type, version, search, page, per_page)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@method(MinecraftServer)
|
|
103
|
+
def installVersion(self, build, truncate_directory: bool = False, accept_eula: bool = True) -> None:
|
|
104
|
+
'''
|
|
105
|
+
Installs a server build.
|
|
106
|
+
|
|
107
|
+
With `auto_backup` enabled in the extension config, a backup is made first and
|
|
108
|
+
the install only starts once it succeeded.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
build: Build dict from getBuilds() or build UUID.
|
|
112
|
+
truncate_directory: Delete every file first.
|
|
113
|
+
accept_eula: Accept the Minecraft EULA.
|
|
114
|
+
|
|
115
|
+
Example:
|
|
116
|
+
latest = server.getBuilds('PAPER', '1.21.11', page=1, per_page=1)[0]
|
|
117
|
+
server.installVersion(latest)
|
|
118
|
+
'''
|
|
119
|
+
config = VersionChangerExtension.get().config
|
|
120
|
+
build_id = build.get('uuid') if isinstance(build, dict) else idOf(build)
|
|
121
|
+
if config['auto_backup']:
|
|
122
|
+
backup = self.backups.createBackup(name=config['backup_name'])
|
|
123
|
+
backup.waitUntilComplete(timeout=config['backup_timeout'])
|
|
124
|
+
if not backup.isSuccessful():
|
|
125
|
+
raise InvalidActionError(f'The backup before installing {build_id} failed; nothing was installed.')
|
|
126
|
+
return _api(self).install(self.server_id, build_id, truncate_directory, accept_eula)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@method(MinecraftServer)
|
|
130
|
+
def updateVersion(self, truncate_directory: bool = False) -> bool:
|
|
131
|
+
'''
|
|
132
|
+
Installs the newest build of the installed version. Returns False if already up to date.
|
|
133
|
+
|
|
134
|
+
Example:
|
|
135
|
+
server.updateVersion()
|
|
136
|
+
'''
|
|
137
|
+
# sibling members are called directly so this works in direct and namespace mode
|
|
138
|
+
installed = getInstalledVersion(self)
|
|
139
|
+
if not installed or not installed.get('latest'):
|
|
140
|
+
raise InvalidActionError('The installed version is unknown, use installVersion() instead.')
|
|
141
|
+
if isUpToDate(self):
|
|
142
|
+
return False
|
|
143
|
+
installVersion(self, installed['latest'], truncate_directory=truncate_directory)
|
|
144
|
+
return True
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# panel.admin.extensions methods (admin API key required)
|
|
148
|
+
@method(ExtensionManager)
|
|
149
|
+
def getVersionChangerSettings(self) -> dict:
|
|
150
|
+
'''Returns the Minecraft Version Changer settings.'''
|
|
151
|
+
return _api(self).settings()
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@method(ExtensionManager)
|
|
155
|
+
def updateVersionChangerSettings(self, **settings) -> None:
|
|
156
|
+
'''Changes Version Changer settings (mcjars_url, mcjars_api_key, type_egg_assignments, ...).'''
|
|
157
|
+
return _api(self).updateSettings(settings)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@method(ExtensionManager)
|
|
161
|
+
def getVersionChangerStatistics(self) -> dict:
|
|
162
|
+
'''Returns install statistics by server type and version.'''
|
|
163
|
+
return _api(self).statistics()
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@method(ExtensionManager)
|
|
167
|
+
def getVersionChangerDefaultOrder(self) -> list:
|
|
168
|
+
'''Returns the default order of server types in the version picker.'''
|
|
169
|
+
return _api(self).defaultOrder()
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class VersionChangerExtension(Extension):
|
|
173
|
+
'''
|
|
174
|
+
Calagopus Minecraft Version Changer: list and install Paper, Purpur, Fabric,
|
|
175
|
+
Forge, ... builds on Minecraft servers.
|
|
176
|
+
|
|
177
|
+
Config:
|
|
178
|
+
auto_backup: Make a backup before every installVersion() (default False).
|
|
179
|
+
backup_name: Name of that backup.
|
|
180
|
+
backup_timeout: Seconds to wait for the backup.
|
|
181
|
+
'''
|
|
182
|
+
extension_id = 'version_changer'
|
|
183
|
+
aliases = ['minecraft_version_changer']
|
|
184
|
+
metadata = ExtensionMetadata(
|
|
185
|
+
author='iFamished',
|
|
186
|
+
version=__version__,
|
|
187
|
+
schema=1,
|
|
188
|
+
description='Calagopus Minecraft Version Changer for CalagoAPI',
|
|
189
|
+
package='calagoapi-version-changer',
|
|
190
|
+
homepage='https://github.com/HungerNet/CalagoAPI',
|
|
191
|
+
)
|
|
192
|
+
default_mode = 'direct'
|
|
193
|
+
default_config = {
|
|
194
|
+
'auto_backup': False,
|
|
195
|
+
'backup_name': 'Before version change',
|
|
196
|
+
'backup_timeout': 3600,
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
def validate_config(self, config):
|
|
200
|
+
if not isinstance(config['auto_backup'], bool):
|
|
201
|
+
raise ConfigurationError('version_changer: auto_backup must be True or False')
|
|
202
|
+
if not isinstance(config['backup_timeout'], (int, float)) or config['backup_timeout'] <= 0:
|
|
203
|
+
raise ConfigurationError('version_changer: backup_timeout must be a positive number of seconds')
|
|
204
|
+
return config
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: calagoapi-version-changer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: CalagoAPI extension for the Calagopus Minecraft Version Changer: list and install Paper, Purpur, Fabric, Forge, ... builds.
|
|
5
|
+
Author: iFamished
|
|
6
|
+
License: GPL-3.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/HungerNet/CalagoAPI
|
|
8
|
+
Project-URL: Documentation, https://github.com/HungerNet/CalagoAPI/tree/main/docs/learning/first_party_extensions.md
|
|
9
|
+
Project-URL: Source, https://github.com/HungerNet/CalagoAPI/tree/main/src/extensions/calagoapi-version-changer
|
|
10
|
+
Keywords: calagopus,calagoapi,minecraft,version-changer,paper,fabric,extension
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Topic :: Games/Entertainment
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: calagoapi>=1.0.dev2
|
|
20
|
+
|
|
21
|
+
# calagoapi-version-changer
|
|
22
|
+
|
|
23
|
+
A [CalagoAPI](https://github.com/HungerNet/CalagoAPI) extension for the Calagopus
|
|
24
|
+
**Minecraft Version Changer** panel extension: list server types, versions and
|
|
25
|
+
builds, and install any Paper, Purpur, Fabric, Forge, ... build.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install calagoapi calagoapi-version-changer
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
from calagoapi import Panel
|
|
33
|
+
from calagoapi.extensions import enable
|
|
34
|
+
|
|
35
|
+
enable('version_changer')
|
|
36
|
+
|
|
37
|
+
panel = Panel(url='https://panel.example.com', api_key='...')
|
|
38
|
+
server = panel.servers.getMinecraftServer('abc123')
|
|
39
|
+
|
|
40
|
+
print(server.installedVersion) # installed build, or None
|
|
41
|
+
builds = server.getBuilds('PAPER', '1.21.11', page=1, per_page=1)
|
|
42
|
+
server.installVersion(builds[0])
|
|
43
|
+
|
|
44
|
+
if server.isUpToDate() is False:
|
|
45
|
+
server.updateVersion() # newest build of the installed version
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
You never import this package yourself; `enable('version_changer')` finds it
|
|
49
|
+
through its entry point.
|
|
50
|
+
|
|
51
|
+
## What it adds
|
|
52
|
+
|
|
53
|
+
`MinecraftServer`:
|
|
54
|
+
|
|
55
|
+
| Member | Kind |
|
|
56
|
+
| --- | --- |
|
|
57
|
+
| `getInstalledVersion()` | method, `{'build': ..., 'latest': ...}` or None |
|
|
58
|
+
| `installedVersion` | property, the installed build or None |
|
|
59
|
+
| `isUpToDate()` | method |
|
|
60
|
+
| `getVersionTypes()` | method |
|
|
61
|
+
| `getVersions(type, search=None, page=None, per_page=None)` | method |
|
|
62
|
+
| `getBuilds(type, version, search=None, page=None, per_page=None)` | method |
|
|
63
|
+
| `installVersion(build, truncate_directory=False, accept_eula=True)` | method |
|
|
64
|
+
| `updateVersion(truncate_directory=False)` | method |
|
|
65
|
+
|
|
66
|
+
`panel.admin.extensions` (admin API key): `getVersionChangerSettings()`,
|
|
67
|
+
`updateVersionChangerSettings(**settings)`, `getVersionChangerStatistics()`,
|
|
68
|
+
`getVersionChangerDefaultOrder()`.
|
|
69
|
+
|
|
70
|
+
## Configuration
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
enable('version_changer', config={
|
|
74
|
+
'auto_backup': True, # back up before every installVersion()
|
|
75
|
+
'backup_name': 'Before version change',
|
|
76
|
+
'backup_timeout': 3600, # seconds to wait for that backup
|
|
77
|
+
})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Namespace mode
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
enable('version_changer', mode='namespace')
|
|
84
|
+
server.version_changer.installVersion(build)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Compatibility
|
|
88
|
+
|
|
89
|
+
Before this package existed, these methods were built into `MinecraftServer`.
|
|
90
|
+
The built-in versions still work but emit an `ExtensionDeprecationWarning`;
|
|
91
|
+
enabling the extension replaces them.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
calagoapi_version_changer/__init__.py,sha256=hT9KOyRT1i9HV221vENopECjhaRIispEo8ZnVfovC1w,436
|
|
2
|
+
calagoapi_version_changer/api.py,sha256=SfbUibNTV8JLvhPHfO9JJ8j_ImqJjG2O1kYiHoPxJZI,2101
|
|
3
|
+
calagoapi_version_changer/extension.py,sha256=Im-nPcjl6MQgVfFfI6OXQI3F-67txJrAnVF4xj3Oe4E,7059
|
|
4
|
+
calagoapi_version_changer-1.0.0.dist-info/METADATA,sha256=u1ZBakgDgL2oyOWTH0Pi9nBh3J-nHA6XiggsFxg-SYQ,3300
|
|
5
|
+
calagoapi_version_changer-1.0.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
|
|
6
|
+
calagoapi_version_changer-1.0.0.dist-info/entry_points.txt,sha256=Lur4j4mjFO-AyQp0e4N8yAQH9LeKv_tT9azOE5auvgM,90
|
|
7
|
+
calagoapi_version_changer-1.0.0.dist-info/top_level.txt,sha256=ftqgoqvZ1ieURPp7ckmLD6hRFc1BZFYzMQgZfZnQDRE,26
|
|
8
|
+
calagoapi_version_changer-1.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
calagoapi_version_changer
|