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.
Files changed (42) hide show
  1. mcserver/__init__.py +1 -1
  2. mcserver/cli.py +25 -65
  3. mcserver/commands/__init__.py +12 -12
  4. mcserver/commands/add.py +232 -0
  5. mcserver/commands/{initialize_server.py → init.py} +39 -15
  6. mcserver/commands/search.py +183 -0
  7. mcserver/commands/show.py +105 -0
  8. mcserver/commands/{start_server.py → start.py} +26 -14
  9. mcserver/commands/{stop_server.py → stop.py} +2 -10
  10. mcserver/config.py +8 -3
  11. mcserver/fabricmc/meta.py +1 -1
  12. mcserver/metadata.py +8 -6
  13. mcserver/modrinth/apis/__init__.py +5 -5
  14. mcserver/modrinth/apis/get_project_informations.py +33 -35
  15. mcserver/modrinth/apis/get_project_versions.py +82 -40
  16. mcserver/modrinth/apis/search_projects.py +64 -27
  17. mcserver/modrinth/project_records.py +39 -28
  18. mcserver/modrinth/shared.py +22 -20
  19. mcserver/modrinth/slug_index.py +3 -7
  20. mcserver/modrinth/typings/__init__.py +26 -14
  21. mcserver/modrinth/typings/{project_informations.py → project_information.py} +5 -3
  22. mcserver/modrinth/typings/project_version.py +90 -0
  23. mcserver/mysterious.py +1 -1
  24. mcserver/networking.py +3 -0
  25. mcserver/paths.py +2 -1
  26. mcserver/resolver.py +49 -30
  27. mcserver/shared.py +29 -7
  28. {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/METADATA +6 -5
  29. mcserver_cli-4.2.0.dist-info/RECORD +69 -0
  30. {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/WHEEL +1 -1
  31. mcserver/commands/add_projects.py +0 -148
  32. mcserver/commands/search_projects.py +0 -109
  33. mcserver/commands/show_projects.py +0 -29
  34. mcserver/mcserver_v2.0.0.py +0 -1119
  35. mcserver/modrinth/api.py +0 -768
  36. mcserver/modrinth/project_records/metadata.py +0 -0
  37. mcserver/modrinth/project_records/relationships.py +0 -205
  38. mcserver/modrinth/project_records/shared.py +0 -8
  39. mcserver_cli-4.0.0.dev0.dist-info/RECORD +0 -73
  40. /mcserver/{legacyfabric → legacy_fabric}/meta.py +0 -0
  41. {mcserver_cli-4.0.0.dev0.dist-info → mcserver_cli-4.2.0.dist-info}/entry_points.txt +0 -0
  42. {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.0.0.dev0"
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 TypeError:
14
+ except ValueError:
14
15
  raise argparse.ArgumentTypeError(f"{cli_string} is not an integer")
15
16
 
16
- if integer <= min_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 >= max_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 add_projects
34
+ from .commands import add
34
35
 
35
- return add_projects(args)
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 initialize_server
46
+ from .commands import init
46
47
 
47
- return initialize_server(args)
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 search_projects
70
+ from .commands import search
70
71
 
71
- return search_projects(args)
72
+ return search(args)
72
73
  case "show":
73
- from .commands import show_projects
74
+ from .commands import show
74
75
 
75
- return show_projects(args)
76
+ return show(args)
76
77
  case "start":
77
- from .commands import start_server
78
+ from .commands import start
78
79
 
79
- return start_server(args)
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 stop_server
86
+ from .commands import stop
86
87
 
87
- return stop_server(args)
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(1024),
197
- help="Minimum RAM for the server (in MebiBytes) (minimum value: 1024)",
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=bound_int(1024),
204
- type=int,
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="search_limit",
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",
@@ -1,37 +1,37 @@
1
- from .add_projects import main as add_projects
1
+ from .add import add
2
2
  from .import_setup import main as import_setup
3
- from .initialize_server import main as initialize_server
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 .search_projects import main as search_projects
10
+ from .search import search
11
11
  from .server_status import main as server_status
12
- from .show_projects import main as show_projects
13
- from .start_server import main as start_server
14
- from .stop_server import main as stop_server
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
- "add_projects",
21
+ "add",
22
22
  "import_setup",
23
- "initialize_server",
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
- "search_projects",
30
+ "search",
31
31
  "server_status",
32
- "show_projects",
33
- "start_server",
34
- "stop_server",
32
+ "show",
33
+ "start",
34
+ "stop",
35
35
  "update_projects",
36
36
  "whitelist_add",
37
37
  "whitelist_list",
@@ -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 main(args: Namespace) -> int:
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 "legacyfabric":
57
- pass
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
- # Is first initializing
88
- is_first_initialize = not metadata_file.exists()
89
- shared.set_loader_context(loader_name)
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.keys():
101
- default_config = copy.deepcopy(shared.default_configs[config_name])
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.generate_config(config_name, config_data)
142
+ config.write_config(
143
+ config_name, configuration["format_version"], config_data
144
+ )
123
145
  except FileExistsError:
124
- log.debug(f"Configuration file {config_name} already exists")
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
- if is_first_initialize:
127
- set_metadata(__version__)
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