mcserver-cli 4.2.0__tar.gz → 4.3.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 (80) hide show
  1. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/CHANGELOG.md +9 -2
  2. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/PKG-INFO +1 -1
  3. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/pyproject.toml +0 -5
  4. mcserver_cli-4.3.0/src/mcserver/__init__.py +1 -0
  5. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/cli.py +124 -110
  6. mcserver_cli-4.3.0/src/mcserver/commands/__init__.py +39 -0
  7. mcserver_cli-4.2.0/src/mcserver/commands/add.py → mcserver_cli-4.3.0/src/mcserver/commands/add_projects.py +18 -11
  8. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/import_setup.py +1 -1
  9. mcserver_cli-4.2.0/src/mcserver/commands/init.py → mcserver_cli-4.3.0/src/mcserver/commands/initialize_server.py +1 -1
  10. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/list_projects.py +1 -1
  11. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/op_grant.py +1 -1
  12. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/op_list.py +1 -1
  13. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/op_revoke.py +1 -1
  14. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/print_help.py +1 -1
  15. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/remove_projects.py +1 -1
  16. mcserver_cli-4.2.0/src/mcserver/commands/search.py → mcserver_cli-4.3.0/src/mcserver/commands/search_projects.py +6 -10
  17. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/server_status.py +1 -1
  18. mcserver_cli-4.2.0/src/mcserver/commands/show.py → mcserver_cli-4.3.0/src/mcserver/commands/show_projects.py +1 -1
  19. mcserver_cli-4.2.0/src/mcserver/commands/start.py → mcserver_cli-4.3.0/src/mcserver/commands/start_server.py +1 -1
  20. mcserver_cli-4.2.0/src/mcserver/commands/stop.py → mcserver_cli-4.3.0/src/mcserver/commands/stop_server.py +1 -1
  21. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/update_projects.py +1 -1
  22. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/whitelist_add.py +1 -1
  23. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/commands/whitelist_list.py +10 -9
  24. mcserver_cli-4.3.0/src/mcserver/commands/whitelist_remove.py +39 -0
  25. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/config.py +6 -0
  26. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/metadata.py +11 -3
  27. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/apis/get_project_informations.py +22 -15
  28. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/apis/get_project_versions.py +4 -1
  29. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/project_records.py +1 -0
  30. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/resolver.py +1 -3
  31. mcserver_cli-4.3.0/src/mcserver/server_files/paths.py +3 -0
  32. mcserver_cli-4.3.0/src/mcserver/server_files/whitelist.py +138 -0
  33. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/zip_app.py +1 -0
  34. mcserver_cli-4.2.0/src/mcserver/__init__.py +0 -1
  35. mcserver_cli-4.2.0/src/mcserver/commands/__init__.py +0 -39
  36. mcserver_cli-4.2.0/src/mcserver/commands/whitelist_remove.py +0 -33
  37. mcserver_cli-4.2.0/src/mcserver/server_files/whitelist.py +0 -184
  38. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/.gitignore +0 -0
  39. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/CONTRIBUTING.md +0 -0
  40. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/LICENSE +0 -0
  41. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/NOTES.txt +0 -0
  42. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/README.md +0 -0
  43. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/legacy/mcserver_v2.0.0.py +0 -0
  44. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/__main__.py +0 -0
  45. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/__main__.py +0 -0
  46. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/app.py +0 -0
  47. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/caching.py +0 -0
  48. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/constants.py +0 -0
  49. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/fabricmc/meta.py +0 -0
  50. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/legacy_fabric/meta.py +0 -0
  51. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/minecraft/api.py +0 -0
  52. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/minecraft/player_identity.py +0 -0
  53. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/apis/__init__.py +0 -0
  54. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/apis/search_projects.py +0 -0
  55. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/constants.py +0 -0
  56. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/modpack.py +0 -0
  57. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/paths.py +0 -0
  58. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/projects.py +0 -0
  59. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/shared.py +0 -0
  60. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/slug_index.py +0 -0
  61. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/typings/__init__.py +0 -0
  62. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/typings/project_information.py +0 -0
  63. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/typings/project_version.py +0 -0
  64. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/typings/search_projects.py +0 -0
  65. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/modrinth/typings/shared.py +0 -0
  66. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/mojang/eula.py +0 -0
  67. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/mojang/manifest.py +0 -0
  68. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/mysterious.py +0 -0
  69. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/networking.py +0 -0
  70. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/papermc/api.py +0 -0
  71. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/paths.py +0 -0
  72. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/purpurmc/api.py +0 -0
  73. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/quiltmc/meta.py +0 -0
  74. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/server_files/banned_ips.py +0 -0
  75. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/server_files/banned_players.py +0 -0
  76. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/server_files/ops.py +0 -0
  77. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/server_files/properties.py +0 -0
  78. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/server_files/usercaches.py +0 -0
  79. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/shared.py +0 -0
  80. {mcserver_cli-4.2.0 → mcserver_cli-4.3.0}/src/mcserver/state.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.3.0] - 2026-11-02
9
+
10
+ ### Added
11
+
12
+ - `whitelist remove` to remove players based on UUIDs or names
13
+
8
14
  ## [4.2.0] - 2026-11-02
9
15
 
10
16
  ### Changed
@@ -228,8 +234,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
228
234
  - Better mod conflict error
229
235
  - Faster mod resolving
230
236
 
231
- [unreleased]: https://github.com/Othecat35/MCServer/compare/v4.2.0...HEAD
232
- [4.2.0]: https://github.com/Othecat35/MCServer/compare/v4.0.0...v4.1.0
237
+ [unreleased]: https://github.com/Othecat35/MCServer/compare/v4.3.0...HEAD
238
+ [4.3.0]: https://github.com/Othecat35/MCServer/compare/v4.2.0...v4.3.0
239
+ [4.2.0]: https://github.com/Othecat35/MCServer/compare/v4.1.0...v4.2.0
233
240
  [4.1.0]: https://github.com/Othecat35/MCServer/compare/v4.0.0...v4.1.0
234
241
  [4.0.0]: https://github.com/Othecat35/MCServer/compare/v3.0.0...v4.0.0
235
242
  [3.0.0]: https://github.com/Othecat35/MCServer/compare/v2.0.0...v3.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mcserver-cli
3
- Version: 4.2.0
3
+ Version: 4.3.0
4
4
  Summary: A CLI tool to manage Minecraft: Java Edition servers.
5
5
  Project-URL: Homepage, https://github.com/Othecat35/MCServer
6
6
  Project-URL: Repository, https://github.com/Othecat35/MCServer.git
@@ -28,8 +28,3 @@ packages = ["src/mcserver"]
28
28
 
29
29
  [tool.hatch.version]
30
30
  path = "src/mcserver/__init__.py"
31
-
32
- [tool.ruff.lint]
33
- ignore = [
34
- "LOG015"
35
- ]
@@ -0,0 +1 @@
1
+ __version__ = "4.3.0"
@@ -1,115 +1,119 @@
1
- def main() -> int:
2
- import argparse
3
- import sys
4
- from types import FunctionType
5
-
6
- from . import __version__
7
- from .modrinth.shared import search_sort_index
8
- from .shared import loader_list
9
-
10
- def bound_int(min_integer: int, max_integer: int | None = None) -> FunctionType:
11
- def parse(cli_string: str) -> int:
12
- try:
13
- integer = int(cli_string)
14
- except ValueError:
15
- raise argparse.ArgumentTypeError(f"{cli_string} is not an integer")
16
-
17
- if integer < min_integer:
18
- raise argparse.ArgumentTypeError(
19
- f"{integer} must be higher than or equal to {min_integer}"
20
- )
21
- if max_integer is not None and integer > max_integer:
22
- raise argparse.ArgumentTypeError(
23
- f"{integer} must be between {min_integer} and {max_integer} (inclusive)"
24
- )
25
- return integer
26
-
27
- return parse
28
-
29
- def command_function(args: argparse.Namespace) -> int:
30
- command_name: str = args.command_name
31
-
32
- match command_name:
33
- case "add":
34
- from .commands import add
35
-
36
- return add(args)
37
- case "import":
38
- from .commands import import_setup
39
-
40
- return import_setup(args)
41
- case "help":
42
- from .commands import print_help
43
-
44
- return print_help(args)
45
- case "init":
46
- from .commands import init
47
-
48
- return init(args)
49
- case "list":
50
- from .commands import list_projects
51
-
52
- return list_projects(args)
53
- case "op_grant":
54
- from .commands import op_grant
55
-
56
- return op_grant(args)
57
- case "op_list":
58
- from .commands import op_list
59
-
60
- return op_list(args)
61
- case "op_revoke":
62
- from .commands import op_revoke
63
-
64
- return op_revoke(args)
65
- case "remove":
66
- from .commands import remove_projects
67
-
68
- return remove_projects(args)
69
- case "search":
70
- from .commands import search
71
-
72
- return search(args)
73
- case "show":
74
- from .commands import show
75
-
76
- return show(args)
77
- case "start":
78
- from .commands import start
79
-
80
- return start(args)
81
- case "status":
82
- from .commands import server_status
83
-
84
- return server_status(args)
85
- case "stop":
86
- from .commands import stop
87
-
88
- return stop(args)
89
- case "update":
90
- from .commands import update_projects
91
-
92
- return update_projects(args)
93
- case "whitelist_add":
94
- from .commands import whitelist_add
95
-
96
- return whitelist_add(args)
97
- case "whitelist_list":
98
- from .commands import whitelist_list
99
-
100
- return whitelist_list(args)
101
- case "whitelist_remove":
102
- from .commands import whitelist_remove
103
-
104
- return whitelist_remove(args)
105
- case _:
106
- import logging as log
107
-
108
- log.error(f"Unknown command: {command_name}")
109
- return 1
1
+ import argparse
2
+ import sys
3
+ from types import FunctionType
110
4
 
111
- # Parser Setup
5
+ from . import __version__
6
+ from .modrinth.shared import search_sort_index
7
+ from .shared import loader_list
8
+
9
+
10
+ def bound_int(min_integer: int, max_integer: int | None = None) -> FunctionType:
11
+ def parse(cli_string: str) -> int:
12
+ try:
13
+ integer = int(cli_string)
14
+ except ValueError:
15
+ raise argparse.ArgumentTypeError(f"{cli_string} is not an integer")
16
+
17
+ if integer < min_integer:
18
+ raise argparse.ArgumentTypeError(
19
+ f"{integer} must be higher than or equal to {min_integer}"
20
+ )
21
+ if max_integer is not None and integer > max_integer:
22
+ raise argparse.ArgumentTypeError(
23
+ f"{integer} must be between {min_integer} and {max_integer} (inclusive)"
24
+ )
25
+ return integer
26
+
27
+ return parse
28
+
29
+
30
+ def command_function(args: argparse.Namespace) -> int:
31
+ command_name: str = args.command_name
32
+
33
+ match command_name:
34
+ case "add":
35
+ from .commands import add_projects
36
+
37
+ return add_projects(args)
38
+ case "import":
39
+ from .commands import import_setup
40
+
41
+ return import_setup(args)
42
+ case "help":
43
+ from .commands import print_help
44
+
45
+ return print_help(args)
46
+ case "init":
47
+ from .commands import initialize_server
48
+
49
+ return initialize_server(args)
50
+ case "list":
51
+ from .commands import list_projects
52
+
53
+ return list_projects(args)
54
+ case "op_grant":
55
+ from .commands import op_grant
56
+
57
+ return op_grant(args)
58
+ case "op_list":
59
+ from .commands import op_list
60
+
61
+ return op_list(args)
62
+ case "op_revoke":
63
+ from .commands import op_revoke
64
+
65
+ return op_revoke(args)
66
+ case "remove":
67
+ from .commands import remove_projects
68
+
69
+ return remove_projects(args)
70
+ case "search":
71
+ from .commands import search_projects
112
72
 
73
+ return search_projects(args)
74
+ case "show":
75
+ from .commands import show_projects
76
+
77
+ return show_projects(args)
78
+ case "start":
79
+ from .commands import start_server
80
+
81
+ return start_server(args)
82
+ case "status":
83
+ from .commands import server_status
84
+
85
+ return server_status(args)
86
+ case "stop":
87
+ from .commands import stop_server
88
+
89
+ return stop_server(args)
90
+ case "update":
91
+ from .commands import update_projects
92
+
93
+ return update_projects(args)
94
+ case "whitelist_add":
95
+ from .commands import whitelist_add
96
+
97
+ return whitelist_add(args)
98
+ case "whitelist_list":
99
+ from .commands import whitelist_list
100
+
101
+ return whitelist_list(args)
102
+ case "whitelist_remove":
103
+ from .commands import whitelist_remove
104
+
105
+ return whitelist_remove(args)
106
+ case _:
107
+ import logging
108
+
109
+ logger = logging.getLogger(__name__)
110
+
111
+ logger.error(f"Unknown command: {command_name}")
112
+ return 1
113
+
114
+
115
+ def main() -> int:
116
+ # Parser Setup
113
117
  parser = argparse.ArgumentParser(
114
118
  prog="mcserver",
115
119
  description="A CLI tool for managing Minecraft: Java Edition servers.",
@@ -328,5 +332,15 @@ def main() -> int:
328
332
 
329
333
  whitelist_list_command.set_defaults(command_name="whitelist_list")
330
334
 
335
+ # 'whitelist remove'
336
+ whitelist_remove_command = whitelist_subcommands.add_parser(
337
+ "remove",
338
+ help="Remove players from the whitelist",
339
+ description="List all whitelisted players.",
340
+ )
341
+
342
+ whitelist_remove_command.set_defaults(command_name="whitelist_remove")
343
+ whitelist_remove_command.add_argument("players", nargs="+", type=str, help="List of player names or UUIDs")
344
+
331
345
  args = parser.parse_args()
332
346
  return args.func(args)
@@ -0,0 +1,39 @@
1
+ from .add_projects import run as add_projects
2
+ from .import_setup import run as import_setup
3
+ from .initialize_server import run as initialize_server
4
+ from .list_projects import run as list_projects
5
+ from .op_grant import run as op_grant
6
+ from .op_list import run as op_list
7
+ from .op_revoke import run as op_revoke
8
+ from .print_help import run as print_help
9
+ from .remove_projects import run as remove_projects
10
+ from .search_projects import run as search_projects
11
+ from .server_status import run as server_status
12
+ from .show_projects import run as show_projects
13
+ from .start_server import run as start_server
14
+ from .stop_server import run as stop_server
15
+ from .update_projects import run as update_projects
16
+ from .whitelist_add import run as whitelist_add
17
+ from .whitelist_list import run as whitelist_list
18
+ from .whitelist_remove import run as whitelist_remove
19
+
20
+ __all__ = [
21
+ "add_projects",
22
+ "import_setup",
23
+ "initialize_server",
24
+ "list_projects",
25
+ "op_grant",
26
+ "op_list",
27
+ "op_revoke",
28
+ "print_help",
29
+ "remove_projects",
30
+ "search_projects",
31
+ "server_status",
32
+ "show_projects",
33
+ "start_server",
34
+ "stop_server",
35
+ "update_projects",
36
+ "whitelist_add",
37
+ "whitelist_list",
38
+ "whitelist_remove",
39
+ ]
@@ -3,7 +3,7 @@ from argparse import Namespace
3
3
 
4
4
  from .. import config, paths, shared
5
5
  from ..modrinth import apis as modrinth_apis
6
- from ..modrinth import project_records, slug_index
6
+ from ..modrinth import project_records
7
7
  from ..resolver import (
8
8
  Dependency,
9
9
  human_to_resolver,
@@ -13,13 +13,18 @@ from ..resolver import (
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
- def add(args: Namespace) -> int:
16
+
17
+ def run(args: Namespace) -> int:
17
18
  projects: list[str] = args.projects
18
19
 
19
20
  if not (paths.configs_dir / "server.json").exists():
20
- logger.error("Configuration file for server does not exist, is server initialized?")
21
+ logger.error(
22
+ "Configuration file for server does not exist, is server initialized?"
23
+ )
21
24
 
22
- server_config = config.read_config("server", shared.default_configs["server"]["format_version"])
25
+ server_config = config.read_config(
26
+ "server", shared.default_configs["server"]["format_version"]
27
+ )
23
28
  game_version = server_config["game_version"]
24
29
  loader_name = server_config["loader"]["name"]
25
30
 
@@ -35,11 +40,12 @@ def add(args: Namespace) -> int:
35
40
  dependencies: list[Dependency] = []
36
41
  if project_records.record_exists(project_id):
37
42
  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
+ for dependency_id, dependency_type in project_record[
44
+ "dependencies"
45
+ ].items():
46
+ dependencies.append(
47
+ {"project_id": dependency_id, "dependency_type": dependency_type}
48
+ )
43
49
 
44
50
  else:
45
51
  project_version = modrinth_apis.get_project_versions(
@@ -64,7 +70,9 @@ def add(args: Namespace) -> int:
64
70
 
65
71
  return human_to_resolver(dependencies)
66
72
 
67
- resolved_dependencies = resolve_dependencies(projects, get_dependencies, required_only)
73
+ resolved_dependencies = resolve_dependencies(
74
+ projects, get_dependencies, required_only
75
+ )
68
76
  print(resolved_dependencies)
69
77
  return 0
70
78
 
@@ -154,7 +162,6 @@ def add(args: Namespace) -> int:
154
162
  # ]
155
163
  # return a
156
164
 
157
-
158
165
  # server_config = config.read_config(
159
166
  # "server", shared.default_configs["server"]["format_version"]
160
167
  # )
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  file: str = args.file
6
6
  import logging as log
7
7
 
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def init(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  from ..modrinth.shared import SearchSortIndex
6
6
 
7
7
  # CLI Arguments
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  log.error("Command is not implemented yet.")
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  players: list[str] = args.players
6
6
  import logging as log
7
7
 
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  from ..server_files import ops
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  players: list[str] = args.players
6
6
  import logging as log
7
7
 
@@ -1,7 +1,7 @@
1
1
  import argparse
2
2
 
3
3
 
4
- def main(args: argparse.Namespace) -> int:
4
+ def run(args: argparse.Namespace) -> int:
5
5
  parser: argparse.ArgumentParser = args.parser
6
6
  parser.print_help()
7
7
  return 0
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  log.error("Command is not implemented yet.")
@@ -18,7 +18,7 @@ from ..shared import (
18
18
  logger = logging.getLogger(__name__)
19
19
 
20
20
 
21
- def search(args: Namespace) -> int:
21
+ def run(args: Namespace) -> int:
22
22
  search_query: list[str] = args.search_query
23
23
  search_limit: int | None = args.search_limit
24
24
  page_number: int = args.page_number
@@ -112,7 +112,7 @@ def search(args: Namespace) -> int:
112
112
  search_facets.append([f"project_type:{project_label}"])
113
113
  search_facets.append([f"categories:{loader_name}"])
114
114
  else:
115
- search_facets.append(["project_type:mod","project_type:plugin"])
115
+ search_facets.append(["project_type:mod", "project_type:plugin"])
116
116
 
117
117
  search_info = f"Searching {pluralize(project_label, search_limit)}"
118
118
  if search_query:
@@ -165,17 +165,13 @@ def search(args: Namespace) -> int:
165
165
  for environment in environments:
166
166
  readable_environments.append(project_environment_name(environment))
167
167
 
168
+ print(f"{hit['project_name']} ({slug_or_id}) {project_author}")
168
169
  print(
169
- f"{hit['project_name']} ({slug_or_id}) {project_author}"
170
- )
171
- print(f"> Downloads: {format_number(hit['download_count'])} | Follows: {format_number(hit['follower_count'])}")
172
- print(
173
- f"> {', '.join(readable_environments)}"
170
+ f"> Downloads: {format_number(hit['download_count'])} | Follows: {format_number(hit['follower_count'])}"
174
171
  )
172
+ print(f"> {', '.join(readable_environments)}")
175
173
  print(f"> https://modrinth.com/{hit['all_project_types'][0]}/{slug_or_id}")
176
- print(
177
- f" {hit['short_description']}"
178
- )
174
+ print(f" {hit['short_description']}")
179
175
 
180
176
  if (count + 1) < len(search_hits):
181
177
  print() # Print newline for readability
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  log.error("Command is not implemented yet.")
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def show(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  projects: list[str] = args.projects
6
6
 
7
7
  import logging
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def start(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  from .. import state
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def stop(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
  import os
7
7
  from signal import SIGTERM
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  import logging as log
6
6
 
7
7
  log.error("Command is not implemented yet.")
@@ -1,7 +1,7 @@
1
1
  from argparse import Namespace
2
2
 
3
3
 
4
- def main(args: Namespace) -> int:
4
+ def run(args: Namespace) -> int:
5
5
  players: list[str] = args.players
6
6
  import logging as log
7
7
 
@@ -1,18 +1,19 @@
1
1
  import argparse
2
+ import logging
2
3
 
4
+ from ..server_files import whitelist
5
+ from ..shared import pluralize
3
6
 
4
- def main(args: argparse.Namespace) -> int:
5
- import logging as log
7
+ logger = logging.getLogger(__name__)
6
8
 
7
- from ..server_files import whitelist
8
- from ..shared import pluralize
9
9
 
10
- whitelist_file = whitelist.whitelist_file
10
+ def run(args: argparse.Namespace) -> int:
11
+ whitelist_file = whitelist.whitelist_file_path
11
12
  if not whitelist_file.exists():
12
- log.error(f"Whitelist file ({whitelist_file}) does not exist!")
13
+ logger.error(f"Whitelist file ({whitelist_file}) does not exist!")
13
14
  return 1
14
15
 
15
- whitelisted_players = whitelist.list_entries()
16
+ whitelisted_players = whitelist.list_players()
16
17
 
17
18
  player_list: list[str] = []
18
19
  for player in whitelisted_players:
@@ -20,10 +21,10 @@ def main(args: argparse.Namespace) -> int:
20
21
 
21
22
  player_count: int = len(player_list)
22
23
  if player_count == 0:
23
- log.info("There are no whitelisted players.")
24
+ logger.info("There are no whitelisted players.")
24
25
  return 0
25
26
  else:
26
- log.info(
27
+ logger.info(
27
28
  f"There {pluralize('is', player_count)} whitelisted {pluralize('player', player_count)}:"
28
29
  )
29
30
 
@@ -0,0 +1,39 @@
1
+ import argparse
2
+ import logging
3
+
4
+ from ..server_files import whitelist
5
+ from ..shared import pluralize
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ def run(args: argparse.Namespace) -> int:
10
+ player_identifiers: list[str] = args.players
11
+
12
+ player_uuids: list[str] = []
13
+ player_names: list[str] = []
14
+ for player in player_identifiers:
15
+ if len(player) > 16:
16
+ logger.debug(f"{player} is probably an UUID")
17
+ player_uuids.append(player)
18
+ else:
19
+ logger.debug(f"{player} is probably a name")
20
+ player_names.append(player)
21
+
22
+ removed_players = whitelist.remove_players(player_uuids, player_names)
23
+
24
+ player_count: int = len(removed_players)
25
+ if player_count == 0:
26
+ logger.info("No matching player found.")
27
+ return 0
28
+
29
+ player_list: list[str] = []
30
+ for player in removed_players:
31
+ player_list.append(f"{player['player_name']} ({player['player_uuid']})")
32
+
33
+ logger.info(
34
+ f"There {pluralize('is', player_count)} {player_count} {pluralize('player', player_count)} that {pluralize('is', player_count)} removed:"
35
+ )
36
+
37
+ player_list.sort()
38
+ print("\n".join(player_list))
39
+ return 0