mcserver-cli 4.0.0.dev0__py3-none-any.whl → 4.2.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.
- mcserver/__init__.py +1 -1
- mcserver/cli.py +25 -65
- mcserver/commands/__init__.py +12 -12
- mcserver/commands/add.py +232 -0
- mcserver/commands/{initialize_server.py → init.py} +39 -15
- mcserver/commands/search.py +183 -0
- mcserver/commands/show.py +105 -0
- mcserver/commands/{start_server.py → start.py} +26 -14
- mcserver/commands/{stop_server.py → stop.py} +2 -10
- mcserver/config.py +8 -3
- mcserver/fabricmc/meta.py +1 -1
- mcserver/metadata.py +8 -6
- mcserver/modrinth/apis/__init__.py +5 -5
- mcserver/modrinth/apis/get_project_informations.py +33 -35
- mcserver/modrinth/apis/get_project_versions.py +82 -40
- mcserver/modrinth/apis/search_projects.py +64 -27
- mcserver/modrinth/project_records.py +39 -28
- mcserver/modrinth/shared.py +22 -20
- mcserver/modrinth/slug_index.py +3 -7
- mcserver/modrinth/typings/__init__.py +26 -14
- mcserver/modrinth/typings/{project_informations.py → project_information.py} +5 -3
- mcserver/modrinth/typings/project_version.py +90 -0
- mcserver/mysterious.py +1 -1
- mcserver/networking.py +3 -0
- mcserver/paths.py +2 -1
- mcserver/resolver.py +49 -30
- mcserver/shared.py +29 -7
- {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/METADATA +6 -5
- mcserver_cli-4.2.0.dist-info/RECORD +69 -0
- {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/WHEEL +1 -1
- mcserver/commands/add_projects.py +0 -148
- mcserver/commands/search_projects.py +0 -109
- mcserver/commands/show_projects.py +0 -29
- mcserver/mcserver_v2.0.0.py +0 -1119
- mcserver/modrinth/api.py +0 -768
- mcserver/modrinth/project_records/metadata.py +0 -0
- mcserver/modrinth/project_records/relationships.py +0 -205
- mcserver/modrinth/project_records/shared.py +0 -8
- mcserver_cli-4.0.0.dev0.dist-info/RECORD +0 -73
- /mcserver/{legacyfabric → legacy_fabric}/meta.py +0 -0
- {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/entry_points.txt +0 -0
- {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/licenses/LICENSE +0 -0
mcserver/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "4.
|
|
1
|
+
__version__ = "4.2.0"
|
mcserver/cli.py
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
def main() -> int:
|
|
2
2
|
import argparse
|
|
3
3
|
import sys
|
|
4
|
+
from types import FunctionType
|
|
4
5
|
|
|
5
6
|
from . import __version__
|
|
6
7
|
from .modrinth.shared import search_sort_index
|
|
7
8
|
from .shared import loader_list
|
|
8
9
|
|
|
9
|
-
def bound_int(min_integer: int, max_integer: int | None = None):
|
|
10
|
-
def parse(cli_string: str):
|
|
10
|
+
def bound_int(min_integer: int, max_integer: int | None = None) -> FunctionType:
|
|
11
|
+
def parse(cli_string: str) -> int:
|
|
11
12
|
try:
|
|
12
13
|
integer = int(cli_string)
|
|
13
|
-
except
|
|
14
|
+
except ValueError:
|
|
14
15
|
raise argparse.ArgumentTypeError(f"{cli_string} is not an integer")
|
|
15
16
|
|
|
16
|
-
if integer
|
|
17
|
+
if integer < min_integer:
|
|
17
18
|
raise argparse.ArgumentTypeError(
|
|
18
19
|
f"{integer} must be higher than or equal to {min_integer}"
|
|
19
20
|
)
|
|
20
|
-
if max_integer is not None and integer
|
|
21
|
+
if max_integer is not None and integer > max_integer:
|
|
21
22
|
raise argparse.ArgumentTypeError(
|
|
22
23
|
f"{integer} must be between {min_integer} and {max_integer} (inclusive)"
|
|
23
24
|
)
|
|
@@ -30,9 +31,9 @@ def main() -> int:
|
|
|
30
31
|
|
|
31
32
|
match command_name:
|
|
32
33
|
case "add":
|
|
33
|
-
from .commands import
|
|
34
|
+
from .commands import add
|
|
34
35
|
|
|
35
|
-
return
|
|
36
|
+
return add(args)
|
|
36
37
|
case "import":
|
|
37
38
|
from .commands import import_setup
|
|
38
39
|
|
|
@@ -42,9 +43,9 @@ def main() -> int:
|
|
|
42
43
|
|
|
43
44
|
return print_help(args)
|
|
44
45
|
case "init":
|
|
45
|
-
from .commands import
|
|
46
|
+
from .commands import init
|
|
46
47
|
|
|
47
|
-
return
|
|
48
|
+
return init(args)
|
|
48
49
|
case "list":
|
|
49
50
|
from .commands import list_projects
|
|
50
51
|
|
|
@@ -66,25 +67,25 @@ def main() -> int:
|
|
|
66
67
|
|
|
67
68
|
return remove_projects(args)
|
|
68
69
|
case "search":
|
|
69
|
-
from .commands import
|
|
70
|
+
from .commands import search
|
|
70
71
|
|
|
71
|
-
return
|
|
72
|
+
return search(args)
|
|
72
73
|
case "show":
|
|
73
|
-
from .commands import
|
|
74
|
+
from .commands import show
|
|
74
75
|
|
|
75
|
-
return
|
|
76
|
+
return show(args)
|
|
76
77
|
case "start":
|
|
77
|
-
from .commands import
|
|
78
|
+
from .commands import start
|
|
78
79
|
|
|
79
|
-
return
|
|
80
|
+
return start(args)
|
|
80
81
|
case "status":
|
|
81
82
|
from .commands import server_status
|
|
82
83
|
|
|
83
84
|
return server_status(args)
|
|
84
85
|
case "stop":
|
|
85
|
-
from .commands import
|
|
86
|
+
from .commands import stop
|
|
86
87
|
|
|
87
|
-
return
|
|
88
|
+
return stop(args)
|
|
88
89
|
case "update":
|
|
89
90
|
from .commands import update_projects
|
|
90
91
|
|
|
@@ -134,28 +135,6 @@ def main() -> int:
|
|
|
134
135
|
|
|
135
136
|
commands = parser.add_subparsers(title="Commands")
|
|
136
137
|
|
|
137
|
-
# 'add' command
|
|
138
|
-
add_command = commands.add_parser(
|
|
139
|
-
"add",
|
|
140
|
-
help="Add Modrinth projects to the server",
|
|
141
|
-
description="Add Modrinth mods/plugins to the server",
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
add_command.set_defaults(command_name="add")
|
|
145
|
-
add_command.add_argument(
|
|
146
|
-
"projects", nargs="+", type=str, help="Modrinth project slugs or IDs"
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
# 'import' command
|
|
150
|
-
import_command = commands.add_parser(
|
|
151
|
-
"import",
|
|
152
|
-
help="Import a Modrinth modpack",
|
|
153
|
-
description="Import a Modrinth modpack from a file.",
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
import_command.set_defaults(command_name="import")
|
|
157
|
-
import_command.add_argument("file", type=str, help="The Modrinth modpack file")
|
|
158
|
-
|
|
159
138
|
# 'init' command
|
|
160
139
|
init_command = commands.add_parser(
|
|
161
140
|
"init",
|
|
@@ -193,15 +172,15 @@ def main() -> int:
|
|
|
193
172
|
init_command.add_argument(
|
|
194
173
|
"--min-ram",
|
|
195
174
|
default=512,
|
|
196
|
-
type=bound_int(
|
|
197
|
-
help="Minimum RAM for the server (in MebiBytes) (minimum value:
|
|
175
|
+
type=bound_int(512),
|
|
176
|
+
help="Minimum RAM for the server (in MebiBytes) (minimum value: 512)",
|
|
198
177
|
metavar="Size",
|
|
199
178
|
)
|
|
200
179
|
|
|
201
180
|
init_command.add_argument(
|
|
202
181
|
"--max-ram",
|
|
203
|
-
default=
|
|
204
|
-
type=
|
|
182
|
+
default=1024,
|
|
183
|
+
type=bound_int(1024),
|
|
205
184
|
help="Maximum RAM for the server (in MebiBytes) (minimum value: 1024)",
|
|
206
185
|
metavar="Size",
|
|
207
186
|
)
|
|
@@ -222,16 +201,9 @@ def main() -> int:
|
|
|
222
201
|
choices=search_sort_index,
|
|
223
202
|
help="Default search sort index",
|
|
224
203
|
metavar="Index",
|
|
225
|
-
dest="
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
# 'list' command
|
|
229
|
-
list_command = commands.add_parser(
|
|
230
|
-
"list", help="List all added projects", description="List all added projects."
|
|
204
|
+
dest="sort_index",
|
|
231
205
|
)
|
|
232
206
|
|
|
233
|
-
list_command.set_defaults(command_name="list")
|
|
234
|
-
|
|
235
207
|
# 'op' command
|
|
236
208
|
op_command = commands.add_parser(
|
|
237
209
|
"op", help="Manage operator players", description="Manage the operator status."
|
|
@@ -248,16 +220,6 @@ def main() -> int:
|
|
|
248
220
|
|
|
249
221
|
op_list_command.set_defaults(command_name="op_list")
|
|
250
222
|
|
|
251
|
-
# 'remove' command
|
|
252
|
-
remove_command = commands.add_parser(
|
|
253
|
-
"remove", help="Remove projects", description="Remove projects"
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
remove_command.set_defaults(command_name="remove")
|
|
257
|
-
remove_command.add_argument(
|
|
258
|
-
"projects", nargs="+", type=str, help="Modrinth project slugs or IDs"
|
|
259
|
-
)
|
|
260
|
-
|
|
261
223
|
# 'search' command
|
|
262
224
|
search_command = commands.add_parser(
|
|
263
225
|
"search",
|
|
@@ -272,7 +234,6 @@ def main() -> int:
|
|
|
272
234
|
|
|
273
235
|
search_command.add_argument(
|
|
274
236
|
"--limit",
|
|
275
|
-
default=20,
|
|
276
237
|
type=bound_int(1, 100),
|
|
277
238
|
help="Search projects per page (value between (inclusive): 1-100)",
|
|
278
239
|
metavar="Number",
|
|
@@ -289,13 +250,11 @@ def main() -> int:
|
|
|
289
250
|
)
|
|
290
251
|
|
|
291
252
|
search_command.add_argument(
|
|
292
|
-
"--sort",
|
|
293
|
-
default="relevance",
|
|
253
|
+
"--sort-index",
|
|
294
254
|
type=str,
|
|
295
255
|
choices=search_sort_index,
|
|
296
256
|
help="Sort by index",
|
|
297
257
|
metavar="Index",
|
|
298
|
-
dest="sort_index",
|
|
299
258
|
)
|
|
300
259
|
|
|
301
260
|
search_command.add_argument(
|
|
@@ -348,6 +307,7 @@ def main() -> int:
|
|
|
348
307
|
|
|
349
308
|
stop_command.set_defaults(command_name="stop")
|
|
350
309
|
|
|
310
|
+
# update is not going to be implemented in this version
|
|
351
311
|
# 'whitelist' command
|
|
352
312
|
whitelist_command = commands.add_parser(
|
|
353
313
|
"whitelist",
|
mcserver/commands/__init__.py
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
from .
|
|
1
|
+
from .add import add
|
|
2
2
|
from .import_setup import main as import_setup
|
|
3
|
-
from .
|
|
3
|
+
from .init import init
|
|
4
4
|
from .list_projects import main as list_projects
|
|
5
5
|
from .op_grant import main as op_grant
|
|
6
6
|
from .op_list import main as op_list
|
|
7
7
|
from .op_revoke import main as op_revoke
|
|
8
8
|
from .print_help import main as print_help
|
|
9
9
|
from .remove_projects import main as remove_projects
|
|
10
|
-
from .
|
|
10
|
+
from .search import search
|
|
11
11
|
from .server_status import main as server_status
|
|
12
|
-
from .
|
|
13
|
-
from .
|
|
14
|
-
from .
|
|
12
|
+
from .show import show
|
|
13
|
+
from .start import start
|
|
14
|
+
from .stop import stop
|
|
15
15
|
from .update_projects import main as update_projects
|
|
16
16
|
from .whitelist_add import main as whitelist_add
|
|
17
17
|
from .whitelist_list import main as whitelist_list
|
|
18
18
|
from .whitelist_remove import main as whitelist_remove
|
|
19
19
|
|
|
20
20
|
__all__ = [
|
|
21
|
-
"
|
|
21
|
+
"add",
|
|
22
22
|
"import_setup",
|
|
23
|
-
"
|
|
23
|
+
"init",
|
|
24
24
|
"list_projects",
|
|
25
25
|
"op_grant",
|
|
26
26
|
"op_list",
|
|
27
27
|
"op_revoke",
|
|
28
28
|
"print_help",
|
|
29
29
|
"remove_projects",
|
|
30
|
-
"
|
|
30
|
+
"search",
|
|
31
31
|
"server_status",
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
32
|
+
"show",
|
|
33
|
+
"start",
|
|
34
|
+
"stop",
|
|
35
35
|
"update_projects",
|
|
36
36
|
"whitelist_add",
|
|
37
37
|
"whitelist_list",
|
mcserver/commands/add.py
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from argparse import Namespace
|
|
3
|
+
|
|
4
|
+
from .. import config, paths, shared
|
|
5
|
+
from ..modrinth import apis as modrinth_apis
|
|
6
|
+
from ..modrinth import project_records, slug_index
|
|
7
|
+
from ..resolver import (
|
|
8
|
+
Dependency,
|
|
9
|
+
human_to_resolver,
|
|
10
|
+
required_only,
|
|
11
|
+
resolve_dependencies,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
def add(args: Namespace) -> int:
|
|
17
|
+
projects: list[str] = args.projects
|
|
18
|
+
|
|
19
|
+
if not (paths.configs_dir / "server.json").exists():
|
|
20
|
+
logger.error("Configuration file for server does not exist, is server initialized?")
|
|
21
|
+
|
|
22
|
+
server_config = config.read_config("server", shared.default_configs["server"]["format_version"])
|
|
23
|
+
game_version = server_config["game_version"]
|
|
24
|
+
loader_name = server_config["loader"]["name"]
|
|
25
|
+
|
|
26
|
+
if loader_name == "vanilla":
|
|
27
|
+
logger.error("Vanilla does not support mod or plugin.")
|
|
28
|
+
return 1
|
|
29
|
+
|
|
30
|
+
project_ids: list[str] = []
|
|
31
|
+
for project in projects:
|
|
32
|
+
modrinth_apis.get_project_versions(project, loader_name, game_version)
|
|
33
|
+
|
|
34
|
+
def get_dependencies(project_id: str) -> dict[str, int]:
|
|
35
|
+
dependencies: list[Dependency] = []
|
|
36
|
+
if project_records.record_exists(project_id):
|
|
37
|
+
project_record = project_records.read_record(project_id)
|
|
38
|
+
for dependency_id, dependency_type in project_record["dependencies"].items():
|
|
39
|
+
dependencies.append({
|
|
40
|
+
"project_id": dependency_id,
|
|
41
|
+
"dependency_type": dependency_type
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
else:
|
|
45
|
+
project_version = modrinth_apis.get_project_versions(
|
|
46
|
+
project_id, loader_name, game_version, include_changelog=False
|
|
47
|
+
)[0]
|
|
48
|
+
|
|
49
|
+
if "dependencies" in project_version:
|
|
50
|
+
project_dependencies = project_version["dependencies"]
|
|
51
|
+
for dependency in project_dependencies:
|
|
52
|
+
if not "project_id" in dependency:
|
|
53
|
+
continue
|
|
54
|
+
|
|
55
|
+
if dependency["project_id"] is None:
|
|
56
|
+
continue
|
|
57
|
+
|
|
58
|
+
dependencies.append(
|
|
59
|
+
{
|
|
60
|
+
"project_id": dependency["project_id"],
|
|
61
|
+
"dependency_type": dependency["dependency_type"],
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return human_to_resolver(dependencies)
|
|
66
|
+
|
|
67
|
+
resolved_dependencies = resolve_dependencies(projects, get_dependencies, required_only)
|
|
68
|
+
print(resolved_dependencies)
|
|
69
|
+
return 0
|
|
70
|
+
|
|
71
|
+
# # from ..modrinth.apis import get_project_versions
|
|
72
|
+
|
|
73
|
+
# def get_project_versions(
|
|
74
|
+
# project_id, loader_names, game_versions, featured=None, include_changelog=True
|
|
75
|
+
# ):
|
|
76
|
+
# project_version = {
|
|
77
|
+
# "embeddium": {
|
|
78
|
+
# "dependencies": [
|
|
79
|
+
# {"project_id": "AANobbMI", "dependency_type": "incompatible"}
|
|
80
|
+
# ],
|
|
81
|
+
# "project_id": "sk9rgfiA",
|
|
82
|
+
# },
|
|
83
|
+
# "fabric-api": {"dependencies": [], "project_id": "P7dR8mSH"},
|
|
84
|
+
# "jade": {
|
|
85
|
+
# "dependencies": [
|
|
86
|
+
# {"project_id": "AANobbMI", "dependency_type": "required"},
|
|
87
|
+
# {"project_id": "u6dRKJwZ", "dependency_type": "optional"},
|
|
88
|
+
# ],
|
|
89
|
+
# "project_id": "nvQzSEkH",
|
|
90
|
+
# },
|
|
91
|
+
# "jei": {"dependencies": [], "project_id": "u6dRKJwZ"},
|
|
92
|
+
# "just-enough-resources-jer": {
|
|
93
|
+
# "dependencies": [
|
|
94
|
+
# {"project_id": "u6dRKJwZ", "dependency_type": "required"}
|
|
95
|
+
# ],
|
|
96
|
+
# "project_id": "uEfK2CXF",
|
|
97
|
+
# },
|
|
98
|
+
# "origins": {
|
|
99
|
+
# "dependencies": [
|
|
100
|
+
# {"project_id": "P7dR8mSH", "dependency_type": "required"}
|
|
101
|
+
# ],
|
|
102
|
+
# "project_id": "3BeIrqZR",
|
|
103
|
+
# },
|
|
104
|
+
# "pehkui": {
|
|
105
|
+
# "dependencies": [
|
|
106
|
+
# {"project_id": "P7dR8mSH", "dependency_type": "required"}
|
|
107
|
+
# ],
|
|
108
|
+
# "project_id": "t5W7Jfwy",
|
|
109
|
+
# },
|
|
110
|
+
# "podium": {
|
|
111
|
+
# "dependencies": [
|
|
112
|
+
# {"project_id": "AANobbMI", "dependency_type": "required"}
|
|
113
|
+
# ],
|
|
114
|
+
# "project_id": "fW8woQj4",
|
|
115
|
+
# },
|
|
116
|
+
# "sodium": {"dependencies": [], "project_id": "AANobbMI"},
|
|
117
|
+
# "thdilos-fox-origin-expanded": {
|
|
118
|
+
# "dependencies": [
|
|
119
|
+
# {"project_id": "9qGn08Dr", "dependency_type": "required"},
|
|
120
|
+
# {"project_id": "3BeIrqZR", "dependency_type": "required"},
|
|
121
|
+
# {"project_id": "t5W7Jfwy", "dependency_type": "required"},
|
|
122
|
+
# ],
|
|
123
|
+
# "project_id": "CbsRGXBx",
|
|
124
|
+
# },
|
|
125
|
+
# "thdilos-fox-origin": {
|
|
126
|
+
# "dependencies": [
|
|
127
|
+
# {"project_id": "3BeIrqZR", "dependency_type": "required"},
|
|
128
|
+
# {"project_id": "t5W7Jfwy", "dependency_type": "required"},
|
|
129
|
+
# ],
|
|
130
|
+
# "project_id": "9qGn08Dr",
|
|
131
|
+
# },
|
|
132
|
+
# }
|
|
133
|
+
|
|
134
|
+
# id_slug = {
|
|
135
|
+
# "3BeIrqZR": "origins",
|
|
136
|
+
# "9qGn08Dr": "thdilos-fox-origin",
|
|
137
|
+
# "AANobbMI": "sodium",
|
|
138
|
+
# "CbsRGXBx": "thdilos-fox-origin-expanded",
|
|
139
|
+
# "P7dR8mSH": "fabric-api",
|
|
140
|
+
# "fW8woQj4": "podium",
|
|
141
|
+
# "nvQzSEkH": "jade",
|
|
142
|
+
# "sk9rgfiA": "embeddium",
|
|
143
|
+
# "t5W7Jfwy": "pehkui",
|
|
144
|
+
# "u6dRKJwZ": "jei",
|
|
145
|
+
# "uEfK2CXF": "just-enough-resources-jer",
|
|
146
|
+
# }
|
|
147
|
+
|
|
148
|
+
# a = [
|
|
149
|
+
# (
|
|
150
|
+
# project_version[project_id]
|
|
151
|
+
# if project_id in project_version
|
|
152
|
+
# else project_version[id_slug[project_id]]
|
|
153
|
+
# )
|
|
154
|
+
# ]
|
|
155
|
+
# return a
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# server_config = config.read_config(
|
|
159
|
+
# "server", shared.default_configs["server"]["format_version"]
|
|
160
|
+
# )
|
|
161
|
+
# loader_name = server_config["loader"]["name"]
|
|
162
|
+
# game_version = server_config["game_version"]
|
|
163
|
+
|
|
164
|
+
# cached_project_versions = {}
|
|
165
|
+
# project_ids = []
|
|
166
|
+
|
|
167
|
+
# for project in projects:
|
|
168
|
+
# project_version = get_project_versions(
|
|
169
|
+
# project, loader_name, game_version, include_changelog=False
|
|
170
|
+
# )[0]
|
|
171
|
+
|
|
172
|
+
# cached_project_versions[project_version["project_id"]] = project_version
|
|
173
|
+
# project_ids.append(project_version["project_id"])
|
|
174
|
+
|
|
175
|
+
# id_to_slug: dict[str, str] = {}
|
|
176
|
+
|
|
177
|
+
# def get_dependencies(project_id: str) -> dict[str, int]:
|
|
178
|
+
# dependencies: list[Dependency] = []
|
|
179
|
+
|
|
180
|
+
# # Get the latest version
|
|
181
|
+
# project_version = get_project_versions(
|
|
182
|
+
# project_id, loader_name, game_version, include_changelog=False
|
|
183
|
+
# )[0]
|
|
184
|
+
# if "dependencies" in project_version:
|
|
185
|
+
# project_dependencies = project_version["dependencies"]
|
|
186
|
+
# for dependency in project_dependencies:
|
|
187
|
+
# if not "project_id" in dependency:
|
|
188
|
+
# continue
|
|
189
|
+
|
|
190
|
+
# if dependency["project_id"] is None:
|
|
191
|
+
# continue
|
|
192
|
+
|
|
193
|
+
# dependencies.append(
|
|
194
|
+
# {
|
|
195
|
+
# "project_id": dependency["project_id"],
|
|
196
|
+
# "dependency_type": dependency["dependency_type"],
|
|
197
|
+
# }
|
|
198
|
+
# )
|
|
199
|
+
|
|
200
|
+
# return human_to_resolver(dependencies)
|
|
201
|
+
|
|
202
|
+
# def required_only(dependency_type: int) -> bool:
|
|
203
|
+
# return dependency_type == 2
|
|
204
|
+
|
|
205
|
+
# resolved_projects = resolver_to_human(
|
|
206
|
+
# resolve_dependencies(project_ids, get_dependencies, required_only)
|
|
207
|
+
# )
|
|
208
|
+
|
|
209
|
+
# print(json.dumps(resolved_projects, indent=2))
|
|
210
|
+
|
|
211
|
+
# required_projects: set[str] = set()
|
|
212
|
+
# optional_projects: set[str] = set()
|
|
213
|
+
# incompatible_projects: set[str] = set()
|
|
214
|
+
|
|
215
|
+
# for project in resolved_projects:
|
|
216
|
+
# for dependent in project["dependents"]:
|
|
217
|
+
# match dependent["dependency_type"]:
|
|
218
|
+
# case "required":
|
|
219
|
+
# required_projects.add(project["project_id"])
|
|
220
|
+
# case "optional":
|
|
221
|
+
# optional_projects.add(project["project_id"])
|
|
222
|
+
# case "incompatible":
|
|
223
|
+
# incompatible_projects.add(project["project_id"])
|
|
224
|
+
|
|
225
|
+
# conflicting_projects: set[str] = required_projects & incompatible_projects
|
|
226
|
+
|
|
227
|
+
# if conflicting_projects:
|
|
228
|
+
# print(f"I think we have conflicting project -_-, like {conflicting_projects} are in required and incompatible")
|
|
229
|
+
|
|
230
|
+
# print(required_projects, optional_projects, incompatible_projects, conflicting_projects)
|
|
231
|
+
|
|
232
|
+
# return 0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from argparse import Namespace
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def
|
|
4
|
+
def init(args: Namespace) -> int:
|
|
5
5
|
from ..modrinth.shared import SearchSortIndex
|
|
6
6
|
|
|
7
7
|
# CLI Arguments
|
|
@@ -23,6 +23,19 @@ def main(args: Namespace) -> int:
|
|
|
23
23
|
from .. import __version__, config, shared, state
|
|
24
24
|
from ..metadata import metadata_file, set_metadata
|
|
25
25
|
|
|
26
|
+
if min_ram > max_ram:
|
|
27
|
+
log.error("Minimum RAM cannot be larger than maximum RAM")
|
|
28
|
+
return 1
|
|
29
|
+
|
|
30
|
+
# Is first initializing
|
|
31
|
+
is_first_initialize = not metadata_file.exists()
|
|
32
|
+
|
|
33
|
+
if not is_first_initialize:
|
|
34
|
+
log.info("Server is already initialized, exiting...")
|
|
35
|
+
return 1
|
|
36
|
+
|
|
37
|
+
shared.set_loader_context(loader_name)
|
|
38
|
+
|
|
26
39
|
# Special loader version
|
|
27
40
|
if loader_name == "vanilla":
|
|
28
41
|
loader_version = None
|
|
@@ -33,9 +46,11 @@ def main(args: Namespace) -> int:
|
|
|
33
46
|
|
|
34
47
|
match game_version:
|
|
35
48
|
case "latest" | "latest-release":
|
|
49
|
+
log.info("Fetching the latest release version for Minecraft...")
|
|
36
50
|
game_version = mojang_manifest.get_latest_release_version()
|
|
37
51
|
log.info(f"Latest Minecraft release version is: {game_version}")
|
|
38
52
|
case "latest-snapshot":
|
|
53
|
+
log.info("Fetching the latest snapshot version for Minecraft...")
|
|
39
54
|
game_version = mojang_manifest.get_latest_snapshot_version()
|
|
40
55
|
log.info(f"Latest Minecraft snapshot version is: {game_version}")
|
|
41
56
|
|
|
@@ -44,6 +59,7 @@ def main(args: Namespace) -> int:
|
|
|
44
59
|
match loader_name:
|
|
45
60
|
# Mod Loaders
|
|
46
61
|
case "fabric":
|
|
62
|
+
log.info("Fetching the latest version for Fabric Loader...")
|
|
47
63
|
from ..fabricmc import meta as fabricmc_meta
|
|
48
64
|
|
|
49
65
|
loader_versions = fabricmc_meta.get_loader_versions()
|
|
@@ -53,9 +69,10 @@ def main(args: Namespace) -> int:
|
|
|
53
69
|
break
|
|
54
70
|
|
|
55
71
|
log.info(f"Latest Fabric loader version is: {loader_version}")
|
|
56
|
-
case "
|
|
57
|
-
|
|
72
|
+
# case "legacy_fabric":
|
|
73
|
+
# pass
|
|
58
74
|
case "quilt":
|
|
75
|
+
log.info("Fetching the latest version for Quilt Loader...")
|
|
59
76
|
from ..quiltmc import meta as quiltmc_meta
|
|
60
77
|
|
|
61
78
|
loader_versions = quiltmc_meta.get_loader_versions()
|
|
@@ -64,6 +81,7 @@ def main(args: Namespace) -> int:
|
|
|
64
81
|
log.info(f"Latest Quilt loader version is: {loader_version}")
|
|
65
82
|
# Plugin Loader
|
|
66
83
|
case "paper":
|
|
84
|
+
log.info("Fetching the latest version for Paper...")
|
|
67
85
|
from ..papermc import api as papermc_api
|
|
68
86
|
|
|
69
87
|
latest_paper_version = papermc_api.get_latest_project_build(
|
|
@@ -72,6 +90,7 @@ def main(args: Namespace) -> int:
|
|
|
72
90
|
loader_version = str(latest_paper_version["build_id"])
|
|
73
91
|
log.info(f"Latest Paper build version is: {loader_version}")
|
|
74
92
|
case "purpur":
|
|
93
|
+
log.info("Fetching the latest version for Purpur...")
|
|
75
94
|
from ..purpurmc import api as purpurmc_api
|
|
76
95
|
|
|
77
96
|
latest_purpur_version = purpurmc_api.get_latest_project_build(
|
|
@@ -84,9 +103,9 @@ def main(args: Namespace) -> int:
|
|
|
84
103
|
log.error(f"Unknown loader: {loader_name}")
|
|
85
104
|
return 1
|
|
86
105
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
106
|
+
if loader_version == "latest":
|
|
107
|
+
log.error("No stable version found")
|
|
108
|
+
return 1
|
|
90
109
|
|
|
91
110
|
shared.mcserver_dir.mkdir(exist_ok=True)
|
|
92
111
|
state.set_state("initializing_server")
|
|
@@ -97,8 +116,9 @@ def main(args: Namespace) -> int:
|
|
|
97
116
|
shared.loader_context["project_directory"].mkdir(exist_ok=True)
|
|
98
117
|
|
|
99
118
|
# Write configuration to file
|
|
100
|
-
for config_name in shared.default_configs
|
|
101
|
-
|
|
119
|
+
for config_name in shared.default_configs:
|
|
120
|
+
configuration = shared.default_configs[config_name]
|
|
121
|
+
default_config = copy.deepcopy(configuration["config_data"])
|
|
102
122
|
|
|
103
123
|
config_override: dict = {}
|
|
104
124
|
match config_name:
|
|
@@ -119,14 +139,18 @@ def main(args: Namespace) -> int:
|
|
|
119
139
|
|
|
120
140
|
config_data = shared.merge_dict(default_config, config_override)
|
|
121
141
|
try:
|
|
122
|
-
config.
|
|
142
|
+
config.write_config(
|
|
143
|
+
config_name, configuration["format_version"], config_data
|
|
144
|
+
)
|
|
123
145
|
except FileExistsError:
|
|
124
|
-
|
|
146
|
+
if is_first_initialize:
|
|
147
|
+
log.debug(f"Configuration file {config_name} already exists")
|
|
148
|
+
else:
|
|
149
|
+
log.info(
|
|
150
|
+
f"Configuration for '{config_name}' already exist, skipping..."
|
|
151
|
+
)
|
|
125
152
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
log.info("Initialized server configurations.")
|
|
129
|
-
else:
|
|
130
|
-
log.info("Reinitialized server configurations.")
|
|
153
|
+
set_metadata(__version__)
|
|
154
|
+
log.info("Initialized server configurations.")
|
|
131
155
|
|
|
132
156
|
return 0
|