mcserver-cli 3.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcserver/__init__.py +1 -0
- mcserver/__main__.py +3 -0
- mcserver/app.py +24 -0
- mcserver/caching.py +0 -0
- mcserver/cli.py +326 -0
- mcserver/commands/__init__.py +39 -0
- mcserver/commands/add_projects.py +7 -0
- mcserver/commands/import_setup.py +6 -0
- mcserver/commands/initialize_server.py +119 -0
- mcserver/commands/list_projects.py +6 -0
- mcserver/commands/op_grant.py +7 -0
- mcserver/commands/op_list.py +32 -0
- mcserver/commands/op_revoke.py +7 -0
- mcserver/commands/print_help.py +7 -0
- mcserver/commands/remove_projects.py +6 -0
- mcserver/commands/search_projects.py +7 -0
- mcserver/commands/server_status.py +6 -0
- mcserver/commands/show_projects.py +26 -0
- mcserver/commands/start_server.py +150 -0
- mcserver/commands/stop_server.py +46 -0
- mcserver/commands/update_projects.py +6 -0
- mcserver/commands/whitelist_add.py +7 -0
- mcserver/commands/whitelist_list.py +31 -0
- mcserver/commands/whitelist_remove.py +31 -0
- mcserver/commandsa.py +1297 -0
- mcserver/config.py +37 -0
- mcserver/constants.py +14 -0
- mcserver/fabricmc/meta.py +41 -0
- mcserver/legacyfabric/meta.py +37 -0
- mcserver/metadata.py +33 -0
- mcserver/minecraft/api.py +94 -0
- mcserver/minecraft/player_identity.py +21 -0
- mcserver/modrinth/api.py +657 -0
- mcserver/modrinth/modpack.py +101 -0
- mcserver/modrinth/project_records/metadata.py +0 -0
- mcserver/modrinth/project_records/relationships.py +203 -0
- mcserver/modrinth/project_records/shared.py +9 -0
- mcserver/modrinth/projects.py +80 -0
- mcserver/modrinth/shared.py +13 -0
- mcserver/modrinth/slug_index.py +36 -0
- mcserver/mojang/eula.py +28 -0
- mcserver/mojang/manifest.py +69 -0
- mcserver/mysterious.py +5 -0
- mcserver/networking.py +152 -0
- mcserver/papermc/api.py +81 -0
- mcserver/purpurmc/api.py +81 -0
- mcserver/quiltmc/meta.py +54 -0
- mcserver/resolver.py +164 -0
- mcserver/server_files/banned_ips.py +120 -0
- mcserver/server_files/banned_players.py +166 -0
- mcserver/server_files/ops.py +143 -0
- mcserver/server_files/properties.py +41 -0
- mcserver/server_files/usercaches.py +0 -0
- mcserver/server_files/whitelist.py +163 -0
- mcserver/shared.py +198 -0
- mcserver/state.py +77 -0
- mcserver_cli-3.0.0.dist-info/METADATA +63 -0
- mcserver_cli-3.0.0.dist-info/RECORD +61 -0
- mcserver_cli-3.0.0.dist-info/WHEEL +4 -0
- mcserver_cli-3.0.0.dist-info/entry_points.txt +2 -0
- mcserver_cli-3.0.0.dist-info/licenses/LICENSE +9 -0
mcserver/shared.py
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Modules
|
|
2
|
+
# Standard
|
|
3
|
+
import sys
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
# MCServer
|
|
7
|
+
from .constants import iec_prefixes, si_prefixes
|
|
8
|
+
|
|
9
|
+
# Variables
|
|
10
|
+
mods_loader = ["fabric", "quilt"]
|
|
11
|
+
plugins_loader = ["paper", "purpur"]
|
|
12
|
+
loader_list = ["vanilla"] + mods_loader + plugins_loader
|
|
13
|
+
|
|
14
|
+
loader_context = {"project_directory": None, "project_label": "project"}
|
|
15
|
+
|
|
16
|
+
special_plural = {"is": "are", "this": "these"}
|
|
17
|
+
|
|
18
|
+
color_output_mode = "auto" # 'never', 'auto', 'always'
|
|
19
|
+
ansi_codes = {
|
|
20
|
+
"gray": "\033[90m",
|
|
21
|
+
"green": "\033[92m",
|
|
22
|
+
"red": "\033[91m",
|
|
23
|
+
"yellow": "\033[93m",
|
|
24
|
+
"bold": "\033[1m",
|
|
25
|
+
"reset": "\033[0m",
|
|
26
|
+
"clear_line": "\033[K",
|
|
27
|
+
"cursor_up": "\033[A",
|
|
28
|
+
"start_line": "\033[G",
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
isatty = sys.stdout.isatty() and sys.stderr.isatty()
|
|
32
|
+
last_status_message = ""
|
|
33
|
+
|
|
34
|
+
default_configs = {
|
|
35
|
+
"launcher": {
|
|
36
|
+
"ram": {"_comment": "Memory size in MebiByte (MiB)", "min": 512, "max": 2_048},
|
|
37
|
+
"jarfile": "Server.jar",
|
|
38
|
+
"is_nogui": True,
|
|
39
|
+
"force_stop": 5,
|
|
40
|
+
},
|
|
41
|
+
"modrinth": {"search_limit": 20, "sort_by": "relevance"},
|
|
42
|
+
"server": {
|
|
43
|
+
"game_version": "", # Auto-fetched the latest version when init without --mc-version
|
|
44
|
+
"loader": {"name": "vanilla", "version": None},
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Paths
|
|
49
|
+
current_dir: Path = Path.cwd()
|
|
50
|
+
mcserver_dir: Path = Path(".mcserver")
|
|
51
|
+
tempfiles_dir: Path = mcserver_dir / "tempfiles"
|
|
52
|
+
|
|
53
|
+
mods_dir: Path = Path("mods")
|
|
54
|
+
plugins_dir: Path = Path("plugins")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Functions
|
|
58
|
+
def pluralize(singular: str, count: int = 0, plural: str = ""):
|
|
59
|
+
if count != 1:
|
|
60
|
+
if plural:
|
|
61
|
+
return plural
|
|
62
|
+
|
|
63
|
+
if singular in special_plural:
|
|
64
|
+
return special_plural[singular]
|
|
65
|
+
|
|
66
|
+
if singular.endswith(("ch", "sh", "x", "s", "o")):
|
|
67
|
+
return f"{singular}es"
|
|
68
|
+
elif singular.endswith("y") and singular[-2] not in "aeiou":
|
|
69
|
+
return f"{singular[:-1]}ies"
|
|
70
|
+
else:
|
|
71
|
+
return f"{singular}s"
|
|
72
|
+
|
|
73
|
+
return singular
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def format_number(number: str | float, unit_type: str = "si"):
|
|
77
|
+
number = float(number)
|
|
78
|
+
unit_multiples = 0
|
|
79
|
+
prefixes = []
|
|
80
|
+
|
|
81
|
+
if unit_type == "si":
|
|
82
|
+
unit_multiples = 1_000
|
|
83
|
+
prefixes = si_prefixes
|
|
84
|
+
elif unit_type == "iec":
|
|
85
|
+
unit_multiples = 1_024
|
|
86
|
+
prefixes = iec_prefixes
|
|
87
|
+
else:
|
|
88
|
+
raise ValueError(f"'{unit_type}' is not a valid number unit type")
|
|
89
|
+
|
|
90
|
+
iteration = 0
|
|
91
|
+
while number >= unit_multiples:
|
|
92
|
+
if iteration >= len(prefixes) - 1:
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
number /= unit_multiples
|
|
96
|
+
iteration += 1
|
|
97
|
+
|
|
98
|
+
return f"{round(number, 2):g}{prefixes[iteration]}"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def remap_keys(source: dict, mapping: dict[str, str]) -> dict:
|
|
102
|
+
remapped_source = {}
|
|
103
|
+
for target_key, source_key in mapping.items():
|
|
104
|
+
if source_key in source:
|
|
105
|
+
remapped_source[target_key] = source[source_key]
|
|
106
|
+
|
|
107
|
+
return remapped_source
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def merge_dict(base: dict, update: dict) -> dict:
|
|
111
|
+
for key, value in update.items():
|
|
112
|
+
if key in base and isinstance(base[key], dict) and isinstance(value, dict):
|
|
113
|
+
merge_dict(base[key], value)
|
|
114
|
+
else:
|
|
115
|
+
base[key] = value
|
|
116
|
+
|
|
117
|
+
return base
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def confirmation_prompt(prompt: str, default_option: bool = False) -> bool:
|
|
121
|
+
accepted_value = "y/n"
|
|
122
|
+
if default_option:
|
|
123
|
+
accepted_value = "Y/n"
|
|
124
|
+
else:
|
|
125
|
+
accepted_value = "y/N"
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
answer = input(f"{prompt} [{accepted_value}]: ")
|
|
129
|
+
except KeyboardInterrupt:
|
|
130
|
+
print() # To avoid weird no newline when Ctrl+C
|
|
131
|
+
return False
|
|
132
|
+
|
|
133
|
+
match answer.lower():
|
|
134
|
+
case "y" | "yes":
|
|
135
|
+
return True
|
|
136
|
+
case "n" | "no":
|
|
137
|
+
return False
|
|
138
|
+
case "":
|
|
139
|
+
return default_option
|
|
140
|
+
case _:
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def set_loader_context(loader_name: str) -> None:
|
|
145
|
+
global loader_context
|
|
146
|
+
|
|
147
|
+
if loader_name in mods_loader:
|
|
148
|
+
loader_context = {"project_directory": mods_dir, "project_label": "mod"}
|
|
149
|
+
elif loader_name in plugins_loader:
|
|
150
|
+
loader_context = {"project_directory": plugins_dir, "project_label": "plugin"}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# ANSI
|
|
154
|
+
def ansi(name: str):
|
|
155
|
+
match color_output_mode:
|
|
156
|
+
case "always":
|
|
157
|
+
return ansi_codes.get(name, "")
|
|
158
|
+
case "never":
|
|
159
|
+
return ""
|
|
160
|
+
case "auto":
|
|
161
|
+
if isatty:
|
|
162
|
+
return ansi_codes.get(name, "")
|
|
163
|
+
|
|
164
|
+
return ""
|
|
165
|
+
case _:
|
|
166
|
+
raise ValueError(
|
|
167
|
+
f"Invalid string '{color_output_mode}' of variable color_output_mode"
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def wrap_ansi(string: str, ansi_name: str):
|
|
172
|
+
return f"{ansi(ansi_name)}{string}{ansi('reset')}"
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def mod_environment_color(environment: str, padding: int = 0):
|
|
176
|
+
if environment == "required":
|
|
177
|
+
return wrap_ansi(f"{'Required': <{padding}}", "green")
|
|
178
|
+
elif environment == "optional":
|
|
179
|
+
return wrap_ansi(f"{'Optional': <{padding}}", "yellow")
|
|
180
|
+
elif environment == "unsupported":
|
|
181
|
+
return wrap_ansi(f"{'Unsupported': <{padding}}", "red")
|
|
182
|
+
elif environment == "unknown":
|
|
183
|
+
return wrap_ansi(f"{'Unknown': <{padding}}", "gray")
|
|
184
|
+
return f"{environment: <{padding}}"
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def print_status(message: str, dynamic: str | None = None):
|
|
188
|
+
if dynamic is None:
|
|
189
|
+
dynamic = ""
|
|
190
|
+
global last_status_message
|
|
191
|
+
|
|
192
|
+
if dynamic and isatty:
|
|
193
|
+
print(f"{ansi('clear_line')} {dynamic}", end=ansi("start_line"), flush=True)
|
|
194
|
+
else:
|
|
195
|
+
if message != last_status_message:
|
|
196
|
+
print(message, flush=True)
|
|
197
|
+
|
|
198
|
+
last_status_message = message
|
mcserver/state.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Modules
|
|
2
|
+
# Standard
|
|
3
|
+
import json
|
|
4
|
+
import logging as log
|
|
5
|
+
import os
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import TypedDict
|
|
8
|
+
|
|
9
|
+
# MCServer
|
|
10
|
+
from .shared import mcserver_dir
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# TypedDict
|
|
14
|
+
class State(TypedDict):
|
|
15
|
+
process_id: int
|
|
16
|
+
start_time: int
|
|
17
|
+
action: str
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CurrentState(TypedDict):
|
|
21
|
+
is_active: bool
|
|
22
|
+
process_id: int
|
|
23
|
+
start_time: int
|
|
24
|
+
action: str
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Paths
|
|
28
|
+
proc_dir = Path("/proc")
|
|
29
|
+
state_file = mcserver_dir / "state.json"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Functions
|
|
33
|
+
def get_start_time(process_id: int | str) -> int:
|
|
34
|
+
process_id = str(process_id)
|
|
35
|
+
|
|
36
|
+
proc_pid = proc_dir / process_id
|
|
37
|
+
if not proc_pid.exists():
|
|
38
|
+
log.debug(f"Process ID ({process_id}) does not exist")
|
|
39
|
+
return 0
|
|
40
|
+
|
|
41
|
+
pid_stat = proc_pid / "stat"
|
|
42
|
+
pid_stat_data = pid_stat.read_text()
|
|
43
|
+
|
|
44
|
+
start_time: int = int(pid_stat_data.split()[21])
|
|
45
|
+
return start_time
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def set_state(action: str) -> None:
|
|
49
|
+
current_state: State = {
|
|
50
|
+
"process_id": os.getpid(),
|
|
51
|
+
"start_time": get_start_time("self"),
|
|
52
|
+
"action": action,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
state_data: str = json.dumps(current_state, indent=2)
|
|
56
|
+
state_file.write_text(state_data)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_state() -> CurrentState:
|
|
60
|
+
state_data: str = state_file.read_text()
|
|
61
|
+
file_state: State = json.loads(state_data) # I ran out of naming
|
|
62
|
+
|
|
63
|
+
current_state: CurrentState = {
|
|
64
|
+
"is_active": False,
|
|
65
|
+
"process_id": file_state["process_id"],
|
|
66
|
+
"start_time": file_state["start_time"],
|
|
67
|
+
"action": file_state["action"],
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if file_state["start_time"] == get_start_time(file_state["process_id"]):
|
|
71
|
+
current_state["is_active"] = True
|
|
72
|
+
|
|
73
|
+
return current_state
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def clear_state() -> None:
|
|
77
|
+
state_file.write_text(json.dumps({}))
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: mcserver-cli
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Summary: A CLI tool to manage Minecraft: Java Edition servers.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Othecat35/MCServer
|
|
6
|
+
Project-URL: Repository, https://github.com/Othecat35/MCServer.git
|
|
7
|
+
Project-URL: Changelog, https://github.com/Othecat35/MCServer/blob/main/CHANGELOG.md
|
|
8
|
+
Author-email: Othecat35 <othecat35@gmail.com>
|
|
9
|
+
Maintainer-email: Othecat35 <othecat35@gmail.com>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Python: >=3.14
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
|
|
15
|
+
# MCServer
|
|
16
|
+
## About
|
|
17
|
+
A CLI tool to manage Minecraft: Java Edition servers.
|
|
18
|
+
|
|
19
|
+
## Platform
|
|
20
|
+
Supported platforms:
|
|
21
|
+
- Linux
|
|
22
|
+
- and Termux.
|
|
23
|
+
|
|
24
|
+
## Requirements
|
|
25
|
+
- Python 3.14 or newer
|
|
26
|
+
- JRE (depends on Minecraft version)
|
|
27
|
+
|
|
28
|
+
## How to install
|
|
29
|
+
- System-wide (Requires root):
|
|
30
|
+
1. Download the `mcserver` script file from GitHub releases
|
|
31
|
+
2. Move the file to `/usr/local/bin`
|
|
32
|
+
3. Run `chmod +x mcserver`
|
|
33
|
+
|
|
34
|
+
- Per-user:
|
|
35
|
+
1. Create a directory "bin"
|
|
36
|
+
2. Download the script from GitHub releases onto that directory
|
|
37
|
+
3. Give it "executable" permission with `chmod +x mcserver`
|
|
38
|
+
4. Add the directory in the PATH environment:
|
|
39
|
+
- Run `export PATH=$HOME/bin:$PATH` if you're using shell that is POSIX-compliant like Bash, Zsh, or ash
|
|
40
|
+
- Run `fish_add_path ~/bin` if you're using FISH
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
- Add mods (and its dependencies): `mcserver add <mods>`
|
|
44
|
+
- Import a modpack: `mcserver import [file]`
|
|
45
|
+
- Initialize the server: `mcserver init [options]`
|
|
46
|
+
- Manage operator status: `mcserver op`
|
|
47
|
+
- Search mods from Modrinth: `mcserver search [<query>] [options]`
|
|
48
|
+
- Show mod information from Modrinth: `mcserver show <mods>`
|
|
49
|
+
- Start the server: `mcserver start`
|
|
50
|
+
- Stop the server: `mcserver stop`
|
|
51
|
+
- Manage the whitelist: `mcserver whitelist`
|
|
52
|
+
|
|
53
|
+
### Example
|
|
54
|
+
```bash
|
|
55
|
+
mcserver init --mc-version=1.20.1 --loader=fabric --loader-version=0.19.3
|
|
56
|
+
mcserver search --no-filter thdilos
|
|
57
|
+
mcserver show thdilos-fox-origin thdilos-fox-origin-expanded
|
|
58
|
+
mcserver add thdilos-fox-origin-expanded lithium tick-stasis ferrite-core krypton
|
|
59
|
+
mcserver start
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Note
|
|
63
|
+
This is a **Personal Project**, things may be unstable.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
mcserver/__init__.py,sha256=EPmgXOdWKks5S__ZMH7Nu6xpAeVrZpfxaFy4pykuyeI,22
|
|
2
|
+
mcserver/__main__.py,sha256=3-WYJCtLQ8TbzmLMYBiAsm9PC89DwjXc6s_J-izMEz8,30
|
|
3
|
+
mcserver/app.py,sha256=khFj3Op1Lnwa5mcgCGEr2nlnsrHDqAAqJDRqWrO9w44,691
|
|
4
|
+
mcserver/caching.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
mcserver/cli.py,sha256=_p2xWVdZLJofrDAkHywFECNy3ER86Oa286w-xYET8bc,9622
|
|
6
|
+
mcserver/commandsa.py,sha256=7a2glWGLax2SSN4jRGrE7nOGDbdETDSDE5WHIc2ymLc,45042
|
|
7
|
+
mcserver/config.py,sha256=UdthS6YI4SLWdNYkizR48pfEybVEbgFn2BcLMlNeBzI,1032
|
|
8
|
+
mcserver/constants.py,sha256=pGKNo_wiJ250iWbB_tpnYwibN4e3DLu4iexAKX7SYjA,508
|
|
9
|
+
mcserver/metadata.py,sha256=Uji_Q4gQutQkP8SyvSXrxvTW_d-FCgZuKijo939zTSk,686
|
|
10
|
+
mcserver/mysterious.py,sha256=95ktZ0XGNtbjpCTvZOxRvxrOZXMpg-Xw9A3nV6cENic,104
|
|
11
|
+
mcserver/networking.py,sha256=y0YmX1fb40ojCXgUPtjBIEBmNRn0B6LsiaxVpDjwqSQ,4419
|
|
12
|
+
mcserver/resolver.py,sha256=RHIIaFiWhGzUpt46St9QKizJtf-zd6dmJz6kcrcp3xo,5414
|
|
13
|
+
mcserver/shared.py,sha256=_Z8zDPJ8skBH3MagwgraDKAnfHxN-Px_zulbTCDCdQU,5408
|
|
14
|
+
mcserver/state.py,sha256=IzeXXej4Wh9kC7lQnBoTjRwOUuaPg-myn7AoXIPTiaM,1690
|
|
15
|
+
mcserver/commands/__init__.py,sha256=O8gWbBLk87zZMxF9py_codbRe9Gob8JbTWEAfsFJQCU,1248
|
|
16
|
+
mcserver/commands/add_projects.py,sha256=pxQ7iNKsIjtT524fz8q57zFpAjcV3r_D1TpEmRv1Ljo,130
|
|
17
|
+
mcserver/commands/import_setup.py,sha256=_Vs8tNb3YBKs5x8IlJTDVlPy1rbF6G2vnmxS7UWVECs,90
|
|
18
|
+
mcserver/commands/initialize_server.py,sha256=WZ7KrPGWGY5LQGDGmJpl3pePHfBA8D9HCOQs3_mktLE,4371
|
|
19
|
+
mcserver/commands/list_projects.py,sha256=_Vs8tNb3YBKs5x8IlJTDVlPy1rbF6G2vnmxS7UWVECs,90
|
|
20
|
+
mcserver/commands/op_grant.py,sha256=NyPL8eHQ7A4LYkS7vhuRW_r8yRQNpxVR_txeJT0d3XY,128
|
|
21
|
+
mcserver/commands/op_list.py,sha256=MdYui8q98IjyYLSyLwBaWk8EryaDQAFIXhY-1tDiUBQ,823
|
|
22
|
+
mcserver/commands/op_revoke.py,sha256=NyPL8eHQ7A4LYkS7vhuRW_r8yRQNpxVR_txeJT0d3XY,128
|
|
23
|
+
mcserver/commands/print_help.py,sha256=30nMXGL2epEGSOaavJWfspsc28iru-IGH43_NQiI8r8,148
|
|
24
|
+
mcserver/commands/remove_projects.py,sha256=_Vs8tNb3YBKs5x8IlJTDVlPy1rbF6G2vnmxS7UWVECs,90
|
|
25
|
+
mcserver/commands/search_projects.py,sha256=rYDSGDxyIpaGZB4UMi3rtO8lVf9xpwrvomi8kpW4RaA,124
|
|
26
|
+
mcserver/commands/server_status.py,sha256=_Vs8tNb3YBKs5x8IlJTDVlPy1rbF6G2vnmxS7UWVECs,90
|
|
27
|
+
mcserver/commands/show_projects.py,sha256=QikjJmU5psBMIOFFz42oAX4YaOriqgkTEvPGMqds7ko,876
|
|
28
|
+
mcserver/commands/start_server.py,sha256=3w3R3X65hpmwp9-QSWpHP7FseUM2lW0p1nRvGxrQTfs,4843
|
|
29
|
+
mcserver/commands/stop_server.py,sha256=UtQeq5xRrBwLWgKiqLRTnYwDVMpGs3v6nVNiqr5iBjA,1134
|
|
30
|
+
mcserver/commands/update_projects.py,sha256=_Vs8tNb3YBKs5x8IlJTDVlPy1rbF6G2vnmxS7UWVECs,90
|
|
31
|
+
mcserver/commands/whitelist_add.py,sha256=NyPL8eHQ7A4LYkS7vhuRW_r8yRQNpxVR_txeJT0d3XY,128
|
|
32
|
+
mcserver/commands/whitelist_list.py,sha256=oRZp4d3R5qoGTONB3FRYikfYhbtMkE8V7WZBmRSWxRc,850
|
|
33
|
+
mcserver/commands/whitelist_remove.py,sha256=bsKyTmAz4AaRfljvV9pVnk9VFyvu-M6bVVnhm973Eeo,818
|
|
34
|
+
mcserver/fabricmc/meta.py,sha256=k0AYn2oQVK6mC4V3HnNi1pbw_oHeKUNnks3w-5ZbF2w,1113
|
|
35
|
+
mcserver/legacyfabric/meta.py,sha256=FRrPm4QZq3uuH7zscjyHPs-zoFW7uREIz3iWaX_Tqxs,911
|
|
36
|
+
mcserver/minecraft/api.py,sha256=7twGWNv6UytlzJJ5kSCpVZzkXjBVDxTMY-t3VoKNAzA,2704
|
|
37
|
+
mcserver/minecraft/player_identity.py,sha256=LDvL5vFs5i-67nezUB4G12FrmQoZCT0ID94pQLnorzU,467
|
|
38
|
+
mcserver/modrinth/api.py,sha256=hFV5Gzv7oXuC6E0IwGCU97pelYp5xEGvhm72yAuoIWc,22188
|
|
39
|
+
mcserver/modrinth/modpack.py,sha256=uBx51G8sxQZEK127EMyXEZbyFMayps9pPGzTa49Vk6w,2957
|
|
40
|
+
mcserver/modrinth/projects.py,sha256=86EksO7F1sQZvIqMWVH9g4FmU2xIFUGcmvqgT6ZQP-E,2342
|
|
41
|
+
mcserver/modrinth/shared.py,sha256=eQZ1P8g7TUM2bYzBOsSQ9NZc76vD5fTDmyRL6egWBXk,294
|
|
42
|
+
mcserver/modrinth/slug_index.py,sha256=Twcm5769Sjn4GVaGKVE2nUFHjjgyBDA9hwCXXi_IzSk,727
|
|
43
|
+
mcserver/modrinth/project_records/metadata.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
mcserver/modrinth/project_records/relationships.py,sha256=URDu4-9KV_ozrpdaSNAd9rmfH4vRiBpvKfnLgtm1OQM,6912
|
|
45
|
+
mcserver/modrinth/project_records/shared.py,sha256=yzJqO-2I4pU2Asi-qIIUJ7dERU0522Iiq214Q4RNRO0,191
|
|
46
|
+
mcserver/mojang/eula.py,sha256=LHVet4Kq-m7O6yiyiFwBk6McUxZUvZHTM58vuIbd3z8,626
|
|
47
|
+
mcserver/mojang/manifest.py,sha256=P32hyNCg0s4YKjFLNsWYRojpnEU5PSvB-uOqF2Iuh8E,1976
|
|
48
|
+
mcserver/papermc/api.py,sha256=BVENtFgRkRNFix5RWzW1biu7QjMBKDjXcpAEJ4SfENk,2372
|
|
49
|
+
mcserver/purpurmc/api.py,sha256=aG3roAXMtCG2PMQMHGAM4zlV18Myd-LOW5EHVi8iUvU,2556
|
|
50
|
+
mcserver/quiltmc/meta.py,sha256=BVbvGCfQ1_ft9i1KJFSFDnuvFoSoDz2lcWF-nr4nMdI,1385
|
|
51
|
+
mcserver/server_files/banned_ips.py,sha256=3kfG9fck8JLvSnrfWl9eVj-ztClsld3Z9G4RxCyPtUw,3581
|
|
52
|
+
mcserver/server_files/banned_players.py,sha256=qMSuwRdn_PzMCUD9CEOyy3plbfCmf_StauwbrgU5RXI,5050
|
|
53
|
+
mcserver/server_files/ops.py,sha256=PFhR95aNTJ_sHorZct8hNQLV1OaSL9vOdxf6PqYaxKw,4032
|
|
54
|
+
mcserver/server_files/properties.py,sha256=Cv5DZzjrzJXUcAIazw6Y4LkwdpyknreLFaMsApduduw,1003
|
|
55
|
+
mcserver/server_files/usercaches.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
+
mcserver/server_files/whitelist.py,sha256=ACEuuRxkSokIdmbv9VXSViYUzAL5JJH6nCIhh_3y06g,4633
|
|
57
|
+
mcserver_cli-3.0.0.dist-info/METADATA,sha256=ylgHqc4cxmsWCYVj20eE0MUEIbjnkinCUZ2Ejdyq8E4,2098
|
|
58
|
+
mcserver_cli-3.0.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
59
|
+
mcserver_cli-3.0.0.dist-info/entry_points.txt,sha256=wi3Sd39CDMohnpL0nNTaVQ8tLj0pk2AFrYbQhNUizSo,47
|
|
60
|
+
mcserver_cli-3.0.0.dist-info/licenses/LICENSE,sha256=PXsLSnDlIrxje6E34tEo0s0rnxNvaiXRziyOXFDeuQU,1083
|
|
61
|
+
mcserver_cli-3.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright © 2026 Othecat35
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|