mcserver-cli 4.2.0__tar.gz → 4.4.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.
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/CHANGELOG.md +23 -2
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/NOTES.txt +2 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/PKG-INFO +14 -7
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/README.md +13 -6
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/pyproject.toml +0 -5
- mcserver_cli-4.4.0/src/mcserver/__init__.py +1 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/cli.py +138 -110
- mcserver_cli-4.4.0/src/mcserver/commands/__init__.py +39 -0
- mcserver_cli-4.2.0/src/mcserver/commands/add.py → mcserver_cli-4.4.0/src/mcserver/commands/add_projects.py +18 -11
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/import_setup.py +1 -1
- mcserver_cli-4.2.0/src/mcserver/commands/init.py → mcserver_cli-4.4.0/src/mcserver/commands/initialize_server.py +1 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/list_projects.py +1 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/op_grant.py +1 -1
- mcserver_cli-4.4.0/src/mcserver/commands/op_list.py +35 -0
- mcserver_cli-4.4.0/src/mcserver/commands/op_revoke.py +43 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/print_help.py +1 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/remove_projects.py +1 -1
- mcserver_cli-4.2.0/src/mcserver/commands/search.py → mcserver_cli-4.4.0/src/mcserver/commands/search_projects.py +6 -10
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/server_status.py +1 -1
- mcserver_cli-4.2.0/src/mcserver/commands/show.py → mcserver_cli-4.4.0/src/mcserver/commands/show_projects.py +1 -1
- mcserver_cli-4.2.0/src/mcserver/commands/start.py → mcserver_cli-4.4.0/src/mcserver/commands/start_server.py +1 -1
- mcserver_cli-4.2.0/src/mcserver/commands/stop.py → mcserver_cli-4.4.0/src/mcserver/commands/stop_server.py +1 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/update_projects.py +1 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/commands/whitelist_add.py +1 -1
- mcserver_cli-4.4.0/src/mcserver/commands/whitelist_list.py +33 -0
- mcserver_cli-4.4.0/src/mcserver/commands/whitelist_remove.py +41 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/config.py +6 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/metadata.py +11 -3
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/apis/get_project_informations.py +22 -15
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/apis/get_project_versions.py +4 -1
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/project_records.py +1 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/resolver.py +1 -3
- mcserver_cli-4.4.0/src/mcserver/server_files/ops.py +114 -0
- mcserver_cli-4.4.0/src/mcserver/server_files/paths.py +4 -0
- mcserver_cli-4.4.0/src/mcserver/server_files/whitelist.py +102 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/zip_app.py +1 -0
- mcserver_cli-4.2.0/src/mcserver/__init__.py +0 -1
- mcserver_cli-4.2.0/src/mcserver/commands/__init__.py +0 -39
- mcserver_cli-4.2.0/src/mcserver/commands/op_list.py +0 -32
- mcserver_cli-4.2.0/src/mcserver/commands/op_revoke.py +0 -9
- mcserver_cli-4.2.0/src/mcserver/commands/whitelist_list.py +0 -32
- mcserver_cli-4.2.0/src/mcserver/commands/whitelist_remove.py +0 -33
- mcserver_cli-4.2.0/src/mcserver/server_files/ops.py +0 -143
- mcserver_cli-4.2.0/src/mcserver/server_files/whitelist.py +0 -184
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/.gitignore +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/CONTRIBUTING.md +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/LICENSE +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/legacy/mcserver_v2.0.0.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/__main__.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/__main__.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/app.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/caching.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/constants.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/fabricmc/meta.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/legacy_fabric/meta.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/minecraft/api.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/minecraft/player_identity.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/apis/__init__.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/apis/search_projects.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/constants.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/modpack.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/paths.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/projects.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/shared.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/slug_index.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/typings/__init__.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/typings/project_information.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/typings/project_version.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/typings/search_projects.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/modrinth/typings/shared.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/mojang/eula.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/mojang/manifest.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/mysterious.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/networking.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/papermc/api.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/paths.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/purpurmc/api.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/quiltmc/meta.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/server_files/banned_ips.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/server_files/banned_players.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/server_files/properties.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/server_files/usercaches.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/shared.py +0 -0
- {mcserver_cli-4.2.0 → mcserver_cli-4.4.0}/src/mcserver/state.py +0 -0
|
@@ -5,6 +5,25 @@ 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
|
+
|
|
9
|
+
## [4.4.0] - 2026-11-04
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `op remove` to remove players based on UUIDs or names
|
|
14
|
+
- Player count to `whitelist list`
|
|
15
|
+
|
|
16
|
+
### Fixes
|
|
17
|
+
|
|
18
|
+
- Wrong description for `whitelist remove`
|
|
19
|
+
- Fixing the wrong singular text in whitelist when no whitelisted player
|
|
20
|
+
|
|
21
|
+
## [4.3.0] - 2026-11-02
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- `whitelist remove` to remove players based on UUIDs or names
|
|
26
|
+
|
|
8
27
|
## [4.2.0] - 2026-11-02
|
|
9
28
|
|
|
10
29
|
### Changed
|
|
@@ -228,8 +247,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
228
247
|
- Better mod conflict error
|
|
229
248
|
- Faster mod resolving
|
|
230
249
|
|
|
231
|
-
[unreleased]: https://github.com/Othecat35/MCServer/compare/v4.
|
|
232
|
-
[4.
|
|
250
|
+
[unreleased]: https://github.com/Othecat35/MCServer/compare/v4.4.0...HEAD
|
|
251
|
+
[4.4.0]: https://github.com/Othecat35/MCServer/compare/v4.3.0...v4.4.0
|
|
252
|
+
[4.3.0]: https://github.com/Othecat35/MCServer/compare/v4.2.0...v4.3.0
|
|
253
|
+
[4.2.0]: https://github.com/Othecat35/MCServer/compare/v4.1.0...v4.2.0
|
|
233
254
|
[4.1.0]: https://github.com/Othecat35/MCServer/compare/v4.0.0...v4.1.0
|
|
234
255
|
[4.0.0]: https://github.com/Othecat35/MCServer/compare/v3.0.0...v4.0.0
|
|
235
256
|
[3.0.0]: https://github.com/Othecat35/MCServer/compare/v2.0.0...v3.0.0
|
|
@@ -390,4 +390,5 @@ it can be the default config of all your new Minecraft server derived from
|
|
|
390
390
|
and yea
|
|
391
391
|
|
|
392
392
|
|
|
393
|
-
|
|
393
|
+
Ah yes... rcon, and also swrver management protocol.
|
|
394
|
+
Don't forget to add a warning fof whitelist remove if the server is running to run whitelist remove
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mcserver-cli
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.4.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
|
|
@@ -25,8 +25,7 @@ Supported platforms:
|
|
|
25
25
|
- JRE (depends on Minecraft version)
|
|
26
26
|
|
|
27
27
|
## How to install
|
|
28
|
-
- Using pip:
|
|
29
|
-
1. Run `pip install mcserver-cli`
|
|
28
|
+
- Using pip: Run `pip install mcserver-cli`
|
|
30
29
|
|
|
31
30
|
- System-wide (Requires root):
|
|
32
31
|
1. Download the `mcserver` script file from GitHub releases
|
|
@@ -44,28 +43,36 @@ Supported platforms:
|
|
|
44
43
|
## Usage
|
|
45
44
|
- Initialize a server: `mcserver init [options]`
|
|
46
45
|
- List operator players: `mcserver op list`
|
|
46
|
+
- Revoke operator players: `mcserver op revoke <players>`
|
|
47
|
+
- Search projects: `mcserver search [query] [options]`
|
|
47
48
|
- Show information about projects: `mcserver show <projects>`
|
|
48
49
|
- Start the server: `mcserver start`
|
|
49
|
-
- Stop the server: `mcserver stop
|
|
50
|
+
- Stop the server: `mcserver stop`
|
|
50
51
|
- List whitelisted players: `mcserver whitelist list`
|
|
52
|
+
- Remove whitelisted players: `mcserver whitelist remove <players>`
|
|
51
53
|
|
|
52
|
-
###
|
|
54
|
+
### Examples
|
|
53
55
|
- Create and start a Fabric 1.20.1 server on current directory
|
|
54
56
|
```bash
|
|
55
57
|
mcserver init --game-version=1.20.1 --loader=fabric
|
|
56
58
|
mcserver start
|
|
57
59
|
```
|
|
58
60
|
|
|
61
|
+
- Search top 50 Fabric mods for Minecraft 1.20.1 in modrinth
|
|
62
|
+
```bash
|
|
63
|
+
mcserver search --loader=fabric --game-version=1.20.1 --limit=50
|
|
64
|
+
```
|
|
65
|
+
|
|
59
66
|
- List all operator and whitelisted players on current directory
|
|
60
67
|
```bash
|
|
61
68
|
mcserver op list
|
|
62
69
|
mcserver whitelist list
|
|
63
70
|
```
|
|
64
71
|
|
|
65
|
-
- Stop
|
|
72
|
+
- Stop a server on current directory with sigterm
|
|
66
73
|
```bash
|
|
67
74
|
mcserver stop
|
|
68
75
|
```
|
|
69
76
|
|
|
70
77
|
## Note
|
|
71
|
-
This is a **Personal Project
|
|
78
|
+
This is a **Personal Project** by Othecat35, so don't expect much from me :>
|
|
@@ -12,8 +12,7 @@ Supported platforms:
|
|
|
12
12
|
- JRE (depends on Minecraft version)
|
|
13
13
|
|
|
14
14
|
## How to install
|
|
15
|
-
- Using pip:
|
|
16
|
-
1. Run `pip install mcserver-cli`
|
|
15
|
+
- Using pip: Run `pip install mcserver-cli`
|
|
17
16
|
|
|
18
17
|
- System-wide (Requires root):
|
|
19
18
|
1. Download the `mcserver` script file from GitHub releases
|
|
@@ -31,28 +30,36 @@ Supported platforms:
|
|
|
31
30
|
## Usage
|
|
32
31
|
- Initialize a server: `mcserver init [options]`
|
|
33
32
|
- List operator players: `mcserver op list`
|
|
33
|
+
- Revoke operator players: `mcserver op revoke <players>`
|
|
34
|
+
- Search projects: `mcserver search [query] [options]`
|
|
34
35
|
- Show information about projects: `mcserver show <projects>`
|
|
35
36
|
- Start the server: `mcserver start`
|
|
36
|
-
- Stop the server: `mcserver stop
|
|
37
|
+
- Stop the server: `mcserver stop`
|
|
37
38
|
- List whitelisted players: `mcserver whitelist list`
|
|
39
|
+
- Remove whitelisted players: `mcserver whitelist remove <players>`
|
|
38
40
|
|
|
39
|
-
###
|
|
41
|
+
### Examples
|
|
40
42
|
- Create and start a Fabric 1.20.1 server on current directory
|
|
41
43
|
```bash
|
|
42
44
|
mcserver init --game-version=1.20.1 --loader=fabric
|
|
43
45
|
mcserver start
|
|
44
46
|
```
|
|
45
47
|
|
|
48
|
+
- Search top 50 Fabric mods for Minecraft 1.20.1 in modrinth
|
|
49
|
+
```bash
|
|
50
|
+
mcserver search --loader=fabric --game-version=1.20.1 --limit=50
|
|
51
|
+
```
|
|
52
|
+
|
|
46
53
|
- List all operator and whitelisted players on current directory
|
|
47
54
|
```bash
|
|
48
55
|
mcserver op list
|
|
49
56
|
mcserver whitelist list
|
|
50
57
|
```
|
|
51
58
|
|
|
52
|
-
- Stop
|
|
59
|
+
- Stop a server on current directory with sigterm
|
|
53
60
|
```bash
|
|
54
61
|
mcserver stop
|
|
55
62
|
```
|
|
56
63
|
|
|
57
64
|
## Note
|
|
58
|
-
This is a **Personal Project
|
|
65
|
+
This is a **Personal Project** by Othecat35, so don't expect much from me :>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "4.4.0"
|
|
@@ -1,115 +1,119 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
112
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.",
|
|
@@ -220,6 +224,18 @@ def main() -> int:
|
|
|
220
224
|
|
|
221
225
|
op_list_command.set_defaults(command_name="op_list")
|
|
222
226
|
|
|
227
|
+
# 'op revoke'
|
|
228
|
+
op_revoke_command = op_subcommands.add_parser(
|
|
229
|
+
"revoke",
|
|
230
|
+
help="Revoke operator players permission",
|
|
231
|
+
description="Revoke operator players permission.",
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
op_revoke_command.set_defaults(command_name="op_revoke")
|
|
235
|
+
op_revoke_command.add_argument(
|
|
236
|
+
"players", nargs="+", type=str, help="List of player names or UUIDs"
|
|
237
|
+
)
|
|
238
|
+
|
|
223
239
|
# 'search' command
|
|
224
240
|
search_command = commands.add_parser(
|
|
225
241
|
"search",
|
|
@@ -328,5 +344,17 @@ def main() -> int:
|
|
|
328
344
|
|
|
329
345
|
whitelist_list_command.set_defaults(command_name="whitelist_list")
|
|
330
346
|
|
|
347
|
+
# 'whitelist remove'
|
|
348
|
+
whitelist_remove_command = whitelist_subcommands.add_parser(
|
|
349
|
+
"remove",
|
|
350
|
+
help="Remove players from the whitelist",
|
|
351
|
+
description="Remove players from the whitelist.",
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
whitelist_remove_command.set_defaults(command_name="whitelist_remove")
|
|
355
|
+
whitelist_remove_command.add_argument(
|
|
356
|
+
"players", nargs="+", type=str, help="List of player names or UUIDs"
|
|
357
|
+
)
|
|
358
|
+
|
|
331
359
|
args = parser.parse_args()
|
|
332
360
|
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
|
|
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
|
-
|
|
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(
|
|
21
|
+
logger.error(
|
|
22
|
+
"Configuration file for server does not exist, is server initialized?"
|
|
23
|
+
)
|
|
21
24
|
|
|
22
|
-
server_config = config.read_config(
|
|
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[
|
|
39
|
-
dependencies
|
|
40
|
-
|
|
41
|
-
|
|
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(
|
|
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
|
# )
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from argparse import Namespace
|
|
3
|
+
|
|
4
|
+
from ..server_files import ops
|
|
5
|
+
from ..shared import pluralize
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def run(args: Namespace) -> int:
|
|
11
|
+
ops_file = ops.ops_file_path
|
|
12
|
+
if not ops_file.exists():
|
|
13
|
+
logger.error(f"Operator file '{ops.ops_file_path}' not found.")
|
|
14
|
+
return 1
|
|
15
|
+
|
|
16
|
+
operator_players = ops.list_players()
|
|
17
|
+
|
|
18
|
+
player_count = len(operator_players)
|
|
19
|
+
if player_count == 0:
|
|
20
|
+
logger.info("There's no operator player.")
|
|
21
|
+
return 0
|
|
22
|
+
|
|
23
|
+
player_list: list[str] = []
|
|
24
|
+
for player in operator_players:
|
|
25
|
+
player_list.append(
|
|
26
|
+
f"{player['player_name']} ({player['player_uuid']}) Level: {player['permission_level']}"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
logger.info(
|
|
30
|
+
f"There {pluralize('is', player_count)} {player_count} {pluralize('operator', player_count)}:"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
player_list.sort()
|
|
34
|
+
print("\n".join(player_list))
|
|
35
|
+
return 0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from argparse import Namespace
|
|
3
|
+
from uuid import UUID
|
|
4
|
+
|
|
5
|
+
from ..server_files import ops
|
|
6
|
+
from ..shared import pluralize
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def run(args: Namespace) -> int:
|
|
12
|
+
player_identifiers: list[str] = args.players
|
|
13
|
+
|
|
14
|
+
player_uuids: list[UUID] = []
|
|
15
|
+
player_names: list[str] = []
|
|
16
|
+
for player in player_identifiers:
|
|
17
|
+
if len(player) > 16:
|
|
18
|
+
logger.debug(f"{player} is probably an UUID")
|
|
19
|
+
player_uuids.append(UUID(player))
|
|
20
|
+
else:
|
|
21
|
+
logger.debug(f"{player} is probably a name")
|
|
22
|
+
player_names.append(player)
|
|
23
|
+
|
|
24
|
+
removed_players = ops.remove_players(player_uuids, player_names)
|
|
25
|
+
|
|
26
|
+
player_count: int = len(removed_players)
|
|
27
|
+
if player_count == 0:
|
|
28
|
+
logger.info("No matching player found.")
|
|
29
|
+
return 0
|
|
30
|
+
|
|
31
|
+
player_list: list[str] = []
|
|
32
|
+
for player in removed_players:
|
|
33
|
+
player_list.append(
|
|
34
|
+
f"{player['player_name']} ({player['player_uuid']}) Level: {player['permission_level']}"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
logger.info(
|
|
38
|
+
f"There {pluralize('is', player_count)} {player_count} operator {pluralize('player', player_count)} that {pluralize('is', player_count)} removed:"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
player_list.sort()
|
|
42
|
+
print("\n".join(player_list))
|
|
43
|
+
return 0
|