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.
Files changed (61) hide show
  1. mcserver/__init__.py +1 -0
  2. mcserver/__main__.py +3 -0
  3. mcserver/app.py +24 -0
  4. mcserver/caching.py +0 -0
  5. mcserver/cli.py +326 -0
  6. mcserver/commands/__init__.py +39 -0
  7. mcserver/commands/add_projects.py +7 -0
  8. mcserver/commands/import_setup.py +6 -0
  9. mcserver/commands/initialize_server.py +119 -0
  10. mcserver/commands/list_projects.py +6 -0
  11. mcserver/commands/op_grant.py +7 -0
  12. mcserver/commands/op_list.py +32 -0
  13. mcserver/commands/op_revoke.py +7 -0
  14. mcserver/commands/print_help.py +7 -0
  15. mcserver/commands/remove_projects.py +6 -0
  16. mcserver/commands/search_projects.py +7 -0
  17. mcserver/commands/server_status.py +6 -0
  18. mcserver/commands/show_projects.py +26 -0
  19. mcserver/commands/start_server.py +150 -0
  20. mcserver/commands/stop_server.py +46 -0
  21. mcserver/commands/update_projects.py +6 -0
  22. mcserver/commands/whitelist_add.py +7 -0
  23. mcserver/commands/whitelist_list.py +31 -0
  24. mcserver/commands/whitelist_remove.py +31 -0
  25. mcserver/commandsa.py +1297 -0
  26. mcserver/config.py +37 -0
  27. mcserver/constants.py +14 -0
  28. mcserver/fabricmc/meta.py +41 -0
  29. mcserver/legacyfabric/meta.py +37 -0
  30. mcserver/metadata.py +33 -0
  31. mcserver/minecraft/api.py +94 -0
  32. mcserver/minecraft/player_identity.py +21 -0
  33. mcserver/modrinth/api.py +657 -0
  34. mcserver/modrinth/modpack.py +101 -0
  35. mcserver/modrinth/project_records/metadata.py +0 -0
  36. mcserver/modrinth/project_records/relationships.py +203 -0
  37. mcserver/modrinth/project_records/shared.py +9 -0
  38. mcserver/modrinth/projects.py +80 -0
  39. mcserver/modrinth/shared.py +13 -0
  40. mcserver/modrinth/slug_index.py +36 -0
  41. mcserver/mojang/eula.py +28 -0
  42. mcserver/mojang/manifest.py +69 -0
  43. mcserver/mysterious.py +5 -0
  44. mcserver/networking.py +152 -0
  45. mcserver/papermc/api.py +81 -0
  46. mcserver/purpurmc/api.py +81 -0
  47. mcserver/quiltmc/meta.py +54 -0
  48. mcserver/resolver.py +164 -0
  49. mcserver/server_files/banned_ips.py +120 -0
  50. mcserver/server_files/banned_players.py +166 -0
  51. mcserver/server_files/ops.py +143 -0
  52. mcserver/server_files/properties.py +41 -0
  53. mcserver/server_files/usercaches.py +0 -0
  54. mcserver/server_files/whitelist.py +163 -0
  55. mcserver/shared.py +198 -0
  56. mcserver/state.py +77 -0
  57. mcserver_cli-3.0.0.dist-info/METADATA +63 -0
  58. mcserver_cli-3.0.0.dist-info/RECORD +61 -0
  59. mcserver_cli-3.0.0.dist-info/WHEEL +4 -0
  60. mcserver_cli-3.0.0.dist-info/entry_points.txt +2 -0
  61. 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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ mcserver = mcserver:__main__
@@ -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.