Compare commits

..

72 Commits

Author SHA1 Message Date
timvisee
d058164aa6
Bump version to 0.2.11 2024-03-16 18:08:26 +01:00
timvisee
8ed68b1ddf
Bump MSRV to 1.74.0 2024-03-16 18:05:04 +01:00
timvisee
0eec1e0b55
Use 1.20.3 protocol version 2024-03-16 18:01:03 +01:00
timvisee
485941cf81
Update uuid dependency 2024-03-16 13:45:26 +01:00
timvisee
a1008ad2a7
Update nix dependency 2024-03-16 13:31:42 +01:00
timvisee
b22d32b951
Upgrade toml dependency 2024-03-16 13:31:38 +01:00
timvisee
18f26b00cb
Update dependencies around rcon 2024-03-16 13:31:35 +01:00
timvisee
86428f4501
Update dependencies 2024-03-16 12:54:48 +01:00
timvisee
c311313ecb
Improve error handling when reading server favicon 2024-03-16 12:50:32 +01:00
timvisee
6e6d098cf1
Resolve clippy warnings 2024-03-16 12:50:25 +01:00
timvisee
efb047114e
Update Cargo.lock 2024-03-16 12:43:03 +01:00
Tim Visée
37fdb9c12a
Merge pull request #54 from Spongecade/patch-1
Update Minecraft wiki links to new domain
2023-10-13 18:53:23 +02:00
Spongecade
e7a3db19aa
Update Minecraft wiki links to new domain 2023-10-05 15:26:24 -05:00
timvisee
ca4753673d
Run CI on shared GitLab runners 2023-08-20 17:33:32 +02:00
timvisee
0124aa723d
Merge branch 'Xeyler-master' into master
Refs: https://github.com/timvisee/lazymc/pull/50
2023-05-30 22:41:04 +02:00
Xeyler
afbc54758c
Update monitor.rs 2023-05-27 23:14:48 -06:00
timvisee
e54025f02f
Bump version to 0.2.10 2023-02-20 10:34:06 +01:00
timvisee
023e46fe64
Allow exit code 143 and 130
Fixes https://github.com/timvisee/lazymc/issues/26
2023-02-20 10:31:04 +01:00
timvisee
6622962d5d
Bump version to 0.2.9 2023-02-14 13:25:41 +01:00
timvisee
da60287e10
Update dependencies 2023-02-14 13:21:12 +01:00
timvisee
eb5ee7defd
Merge branch 'tW4r-patch-1' into master
See https://github.com/timvisee/lazymc/pull/44
2023-02-14 13:17:55 +01:00
tW4r
fdeb7594c2
Mixing up my booleans myself 2023-02-14 13:49:01 +02:00
tW4r
5c7e17b0ae
Only drop banned IPs when drop_banned_ip
Attempted fix of #43
2023-02-14 13:47:01 +02:00
timvisee
be74e053f4
Resolve clippy warnings 2023-02-10 11:11:05 +01:00
timvisee
eb2cf1219e
Set MSRV in clippy configuration 2023-02-10 11:08:41 +01:00
timvisee
72d58f051f
Bump version to 0.2.8 2023-01-30 19:07:40 +01:00
timvisee
6c3129a8b0
Enable all CI build jobs for tag releases, don't allow Windows failures 2023-01-30 19:07:05 +01:00
timvisee
cc2061ad7d
Fix build failure on Windows 2023-01-30 18:40:43 +01:00
timvisee
342a55471c
Bump Rust MSRV to 1.64.0 2023-01-30 18:38:57 +01:00
timvisee
982a604d34
Install proper Rust version on Windows CI jobs 2023-01-30 18:37:08 +01:00
timvisee
6b463ac8c8
Update dependencies 2023-01-30 18:23:58 +01:00
Tim Visée
c7caebe6a8 Merge branch 'github-pr-37' into 'master'
Implement server process freezing on Unix platforms

See merge request timvisee/lazymc!3
2023-01-30 17:22:12 +00:00
timvisee
aa1a74682e
Fix incorrect state after unfreezing process 2023-01-30 18:18:28 +01:00
timvisee
835ca62c06
Change default protocol version to 1.19.3 (761) 2023-01-30 18:08:23 +01:00
timvisee
b609f86bde
Require to build with rcon feature on Windows 2023-01-30 18:06:28 +01:00
timvisee
4b1857f48d
Don't disable process freeze in config on Windows, simply ignore setting 2023-01-30 17:57:49 +01:00
timvisee
bc7bd908f6
Fix process freezing not working when rcon is enabled 2023-01-30 17:54:20 +01:00
timvisee
a3fef88eac
Don't use deprecated base64 method 2023-01-30 17:42:02 +01:00
[object Object]
57117b29f3
Merge remote-tracking branch 'upstream/master' 2023-01-25 14:46:14 -08:00
[object Object]
5ef7c54ec6
Implement suggested changes 2023-01-25 14:45:15 -08:00
timvisee
5f13132c57
Run release jobs in CI for release tag only 2023-01-25 20:47:43 +01:00
timvisee
226215479c
Run many jobs on master branch only 2023-01-25 20:45:55 +01:00
timvisee
f4870c66fa
Fix scoop installation on Windows in GitLab CI 2023-01-25 20:45:45 +01:00
timvisee
c415420eae
Build Linux jobs CI jobs on custom runner by default 2023-01-25 20:45:21 +01:00
timvisee
c6db4d7c3f
Use Rust stable and MSRV in GitLab CI 2023-01-25 20:45:17 +01:00
timvisee
39feb0bdc2
Remove and disable some Windows CI jobs 2023-01-25 20:35:27 +01:00
timvisee
35fff7168b
Disable Rust build cache in CI 2023-01-25 20:33:25 +01:00
timvisee
e5e5947a16
Remove macOS builds from GitLab CI, instruct to compile in README 2023-01-25 20:31:22 +01:00
[object Object]
2e6551b009
Merge remote-tracking branch 'upstream/master' 2023-01-22 16:49:32 -08:00
timvisee
2c00dba5e8
Update dependencies 2023-01-11 12:46:34 +01:00
timvisee
0e4d18e9f6
Update clap dependency 2023-01-11 12:44:00 +01:00
timvisee
026aa58b5d
Fix broken documentation link
Mentioned in https://github.com/timvisee/lazymc/issues/39
2023-01-10 21:33:09 +01:00
[object Object]
0ac9a07c93
add a todo here because it isn't an ideal solution 2022-12-30 13:32:39 -08:00
[object Object]
540137b93e
disable freeze_process on windows 2022-12-30 13:32:11 -08:00
[object Object]
05dfd19d80
Implement config handling 2022-12-30 13:17:04 -08:00
[object Object]
f02217abd3
Update version number (should be 1 above current release)
Also update deps
2022-12-30 13:10:14 -08:00
[object Object]
3185ca855c
Add config option for process freezing 2022-12-30 13:09:07 -08:00
[object Object]
2c43446ed0
Error handling and logging 2022-12-28 14:37:08 -08:00
[object Object]
f7fe00aa50
Add nix crate, use it for signaling 2022-12-28 14:24:21 -08:00
[object Object]
f2087792b4
Update deps 2022-12-28 14:09:08 -08:00
[object Object]
d46f8375c7
Fix server infinitly stopping 2022-12-28 12:40:09 -08:00
[object Object]
2d8173aba8
Optimize release builds (and format toml file) 2022-12-28 12:33:05 -08:00
[object Object]
bd9f81f1f0
It would be a good idea to actually start the server 2022-12-28 12:29:17 -08:00
[object Object]
b561351a2a
Scuffed code, not tested yet 2022-12-28 12:18:43 -08:00
[object Object]
d3cb880dd0
cargo clippy is angry 2022-12-28 12:03:00 -08:00
[object Object]
716cd48eac
Add SIGSTOP and SIGCONT functions, fix some docs stuff 2022-12-28 12:00:32 -08:00
timvisee
c6f860f013
Update dependencies 2022-06-19 02:12:20 +02:00
dependabot[bot]
8d4ace60a6
Bump regex from 1.5.4 to 1.5.6
Bumps [regex](https://github.com/rust-lang/regex) from 1.5.4 to 1.5.6.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.5.4...1.5.6)

---
updated-dependencies:
- dependency-name: regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-06 22:00:45 +00:00
timvisee
09c6d1d996
Allow Windows CI to fail because it causes a lot of issues 2022-03-09 14:15:23 +01:00
timvisee
dca2f8eb5c
Install missing Rust target on Windows CI 2022-02-07 17:33:20 +01:00
timvisee
1f6665a90f
Update dependencies 2022-02-07 17:19:59 +01:00
timvisee
0c77a18d96
Install GCC on Windows CI 2022-02-07 16:52:03 +01:00
32 changed files with 1012 additions and 1025 deletions

View File

@ -9,18 +9,16 @@ stages:
# Variable defaults
variables:
RUST_VERSION: stable
TARGET: x86_64-unknown-linux-gnu
# Rust build cache configuration
.rust-build-cache: &rust-build-cache
key: "$CI_PIPELINE_ID"
paths:
- target/
# Install build dependencies
before_script:
- apt-get update
- apt-get install -y --no-install-recommends build-essential
- |
rustup install $RUST_VERSION
rustup default $RUST_VERSION
- |
rustc --version
cargo --version
@ -29,54 +27,39 @@ before_script:
.before_script-windows: &before_script-windows
before_script:
# Install scoop
- Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
- iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
# Install Rust
- scoop install rustup
- scoop install rustup gcc
- rustup install $RUST_VERSION
- rustup default $RUST_VERSION
- rustc --version
- cargo --version
# Install proper Rust target
- rustup target install x86_64-pc-windows-msvc
# Check on stable, beta and nightly
.check-base: &check-base
stage: check
cache:
<<: *rust-build-cache
script:
- cargo check --verbose
- cargo check --no-default-features --verbose
- cargo check --no-default-features --features rcon --verbose
- cargo check --no-default-features --features lobby --verbose
check:
check-stable:
<<: *check-base
check-macos:
tags:
- macos
check-msrv:
<<: *check-base
variables:
RUST_VERSION: 1.74.0
only:
- master
- /^v(\d+\.)*\d+$/
before_script:
- rustup default stable
- |
rustc --version
cargo --version
<<: *check-base
check-windows:
stage: check
tags:
- windows
cache: {}
<<: *before_script-windows
script:
- cargo check --locked --verbose
- cargo check --locked --no-default-features --features rcon --verbose
- cargo check --locked --no-default-features --features rcon,lobby --verbose
# Build using Rust stable on Linux
build-x86_64-linux-gnu:
stage: build
needs: []
cache:
<<: *rust-build-cache
script:
- cargo build --target=$TARGET --release --locked --verbose
- mv target/$TARGET/release/lazymc ./lazymc-$TARGET
@ -90,11 +73,12 @@ build-x86_64-linux-gnu:
# Build a static version
build-x86_64-linux-musl:
stage: build
only:
- master
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
needs: []
variables:
TARGET: x86_64-unknown-linux-musl
cache:
<<: *rust-build-cache
script:
- rustup target add $TARGET
- cargo build --target=$TARGET --release --locked --verbose
@ -113,11 +97,12 @@ build-x86_64-linux-musl:
build-armv7-linux-gnu:
stage: build
image: ubuntu
only:
- master
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
needs: []
variables:
TARGET: armv7-unknown-linux-gnueabihf
cache:
<<: *rust-build-cache
before_script:
- apt-get update
- apt-get install -y --no-install-recommends build-essential
@ -148,11 +133,12 @@ build-armv7-linux-gnu:
build-aarch64-linux-gnu:
stage: build
image: ubuntu
only:
- master
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
needs: []
variables:
TARGET: aarch64-unknown-linux-gnu
cache:
<<: *rust-build-cache
before_script:
- apt-get update
- apt-get install -y --no-install-recommends build-essential
@ -179,36 +165,14 @@ build-aarch64-linux-gnu:
- lazymc-$TARGET
expire_in: 1 month
# Build using Rust stable on macOS
build-macos:
stage: build
tags:
- macos
only:
- master
- /^v(\d+\.)*\d+$/
needs: []
variables:
TARGET: x86_64-apple-darwin
before_script:
- rustup default stable
- |
rustc --version
cargo --version
script:
- cargo build --target=$TARGET --release --locked --verbose
- mv target/$TARGET/release/lazymc ./lazymc-$TARGET
artifacts:
name: lazymc-x86_64-macos
paths:
- lazymc-$TARGET
expire_in: 1 month
# Build using Rust stable on Windows
build-x86_64-windows:
stage: build
tags:
- windows
only:
- master
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
needs: []
variables:
TARGET: x86_64-pc-windows-msvc
@ -225,29 +189,28 @@ build-x86_64-windows:
# Run the unit tests through Cargo on Linux
test-cargo-x86_64-linux-gnu:
stage: test
only:
- master
needs: []
dependencies: []
cache:
<<: *rust-build-cache
script:
- cargo test --locked --verbose
- cargo test --locked --no-default-features --verbose
- cargo test --locked --no-default-features --features rcon --verbose
- cargo test --locked --no-default-features --features lobby --verbose
# Run the unit tests through Cargo on Windows
test-cargo-x86_64-windows:
stage: test
tags:
- windows
needs: []
dependencies: []
cache: {}
<<: *before_script-windows
script:
- cargo test --locked --verbose
- cargo test --locked --no-default-features --features rcon --verbose
- cargo test --locked --no-default-features --features rcon,lobby --verbose
# # Run the unit tests through Cargo on Windows
# test-cargo-x86_64-windows:
# stage: test
# tags:
# - windows
# needs: []
# dependencies: []
# <<: *before_script-windows
# script:
# - cargo test --locked --verbose
# - cargo test --locked --no-default-features --features rcon --verbose
# - cargo test --locked --no-default-features --features rcon,lobby --verbose
# Release binaries on GitLab as generic package
release-gitlab-generic-package:
@ -258,16 +221,14 @@ release-gitlab-generic-package:
- build-x86_64-linux-musl
- build-armv7-linux-gnu
- build-aarch64-linux-gnu
- build-macos
- build-x86_64-windows
only:
- /^v(\d+\.)*\d+$/
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
variables:
LINUX_GNU_BIN: "lazymc-x86_64-unknown-linux-gnu"
LINUX_MUSL_BIN: "lazymc-x86_64-unknown-linux-musl"
LINUX_ARMV7_GNU_BIN: "lazymc-armv7-unknown-linux-gnueabihf"
LINUX_AARCH64_GNU_BIN: "lazymc-aarch64-unknown-linux-gnu"
MACOS_BIN: "lazymc-x86_64-apple-darwin"
WINDOWS_BIN: "lazymc-x86_64-pc-windows-msvc.exe"
before_script: []
script:
@ -284,8 +245,6 @@ release-gitlab-generic-package:
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${LINUX_ARMV7_GNU_BIN} ${PACKAGE_REGISTRY_URL}/${LINUX_ARMV7_GNU_BIN}
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${LINUX_AARCH64_GNU_BIN} ${PACKAGE_REGISTRY_URL}/${LINUX_AARCH64_GNU_BIN}
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${MACOS_BIN} ${PACKAGE_REGISTRY_URL}/${MACOS_BIN}
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${WINDOWS_BIN} ${PACKAGE_REGISTRY_URL}/${WINDOWS_BIN}
@ -294,13 +253,12 @@ release-gitlab-release:
image: registry.gitlab.com/gitlab-org/release-cli
stage: release
only:
- /^v(\d+\.)*\d+$/
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
variables:
LINUX_GNU_BIN: "lazymc-x86_64-unknown-linux-gnu"
LINUX_MUSL_BIN: "lazymc-x86_64-unknown-linux-musl"
LINUX_ARMV7_GNU_BIN: "lazymc-armv7-unknown-linux-gnueabihf"
LINUX_AARCH64_GNU_BIN: "lazymc-aarch64-unknown-linux-gnu"
MACOS_BIN: "lazymc-x86_64-apple-darwin"
WINDOWS_BIN: "lazymc-x86_64-pc-windows-msvc.exe"
before_script: []
script:
@ -315,20 +273,18 @@ release-gitlab-release:
--assets-link "{\"name\":\"${LINUX_MUSL_BIN}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${LINUX_MUSL_BIN}\"}" \
--assets-link "{\"name\":\"${LINUX_ARMV7_GNU_BIN}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${LINUX_ARMV7_GNU_BIN}\"}" \
--assets-link "{\"name\":\"${LINUX_AARCH64_GNU_BIN}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${LINUX_AARCH64_GNU_BIN}\"}" \
--assets-link "{\"name\":\"${MACOS_BIN}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${MACOS_BIN}\"}" \
--assets-link "{\"name\":\"${WINDOWS_BIN}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${WINDOWS_BIN}\"}"
# Publish GitHub release
release-github:
stage: release
only:
- /^v(\d+\.)*\d+$/
- /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/
dependencies:
- build-x86_64-linux-gnu
- build-x86_64-linux-musl
- build-armv7-linux-gnu
- build-aarch64-linux-gnu
- build-macos
- build-x86_64-windows
before_script: []
script:
@ -347,5 +303,4 @@ release-github:
- ./github-release upload --token "$GITHUB_TOKEN" --owner timvisee --repo lazymc --tag "$CI_COMMIT_REF_NAME" --file ./lazymc-x86_64-unknown-linux-musl --name lazymc-$CI_COMMIT_REF_NAME-linux-x64-static
- ./github-release upload --token "$GITHUB_TOKEN" --owner timvisee --repo lazymc --tag "$CI_COMMIT_REF_NAME" --file ./lazymc-armv7-unknown-linux-gnueabihf --name lazymc-$CI_COMMIT_REF_NAME-linux-armv7
- ./github-release upload --token "$GITHUB_TOKEN" --owner timvisee --repo lazymc --tag "$CI_COMMIT_REF_NAME" --file ./lazymc-aarch64-unknown-linux-gnu --name lazymc-$CI_COMMIT_REF_NAME-linux-aarch64
- ./github-release upload --token "$GITHUB_TOKEN" --owner timvisee --repo lazymc --tag "$CI_COMMIT_REF_NAME" --file ./lazymc-x86_64-apple-darwin --name lazymc-$CI_COMMIT_REF_NAME-macos
- ./github-release upload --token "$GITHUB_TOKEN" --owner timvisee --repo lazymc --tag "$CI_COMMIT_REF_NAME" --file ./lazymc-x86_64-pc-windows-msvc.exe --name lazymc-$CI_COMMIT_REF_NAME-windows.exe

View File

@ -1,5 +1,29 @@
# Changelog
## 0.2.11 (2024-03-16)
- Add support for Minecraft 1.20.3 and 1.20.4
- Improve error handling of parsing server favicon
- Fix typo in log message
- Update dependencies
## 0.2.10 (2023-02-20)
- Do not report an error when server exits with status code 143
## 0.2.9 (2023-02-14)
- Fix dropping all connections when `server.drop_banned_ips` was enabled
- Update dependencies
## 0.2.8 (2023-01-30)
- Add `freeze_process` feature on Unix platforms to freeze a sleeping server
rather than shutting it down.
- Update default Minecraft version to 1.19.3
- Remove macOS builds from releases, users can compile from source
- Update dependencies
## 0.2.7 (2021-12-13)
- Update default Minecraft version to 1.18.1

1439
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
[package]
name = "lazymc"
version = "0.2.6"
version = "0.2.11"
authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"]
license = "GPL-3.0"
readme = "README.md"
@ -8,15 +8,15 @@ homepage = "https://timvisee.com/projects/lazymc"
repository = "https://gitlab.com/timvisee/lazymc"
description = "Put your Minecraft server to rest when idle."
keywords = ["minecraft", "server", "idle", "cli"]
categories = [
"command-line-interface",
"games",
]
exclude = [
"/.github",
"/contrib",
]
categories = ["command-line-interface", "games"]
exclude = ["/.github", "/contrib"]
edition = "2021"
rust-version = "1.74.0"
[profile.release]
codegen-units = 1
lto = true
strip = true
[features]
default = ["rcon", "lobby"]
@ -24,7 +24,7 @@ default = ["rcon", "lobby"]
# RCON support
# Allow use of RCON to manage (stop) server.
# Required on Windows.
rcon = ["rust_rcon", "async-std"]
rcon = ["rust_rcon"]
# Lobby support
# Add lobby join method, keeps client in fake lobby world until server is ready.
@ -32,20 +32,30 @@ lobby = ["md-5", "uuid"]
[dependencies]
anyhow = "1.0"
base64 = "0.13"
base64 = "0.22"
bytes = "1.1"
chrono = "0.4"
clap = { version = "=3.0.0-rc.4", default-features = false, features = [ "std", "cargo", "color", "env", "suggestions", "unicode" ]}
clap = { version = "4.0.32", default-features = false, features = [
"std",
"help",
"suggestions",
"color",
"usage",
"cargo",
"env",
"unicode",
] }
colored = "2.0"
derive_builder = "0.10"
derive_builder = "0.20"
dotenv = "0.15"
flate2 = { version = "1.0", default-features = false, features = ["default"] }
futures = { version = "0.3", default-features = false, features = ["executor"] }
log = "0.4"
minecraft-protocol = { git = "https://github.com/timvisee/rust-minecraft-protocol", rev = "edfdf87" }
minecraft-protocol = { git = "https://github.com/timvisee/rust-minecraft-protocol", rev = "4f93bb3" }
named-binary-tag = "0.6"
nix = { version = "0.28", features = ["process", "signal"] }
notify = "4.0"
pretty_env_logger = "0.4"
pretty_env_logger = "0.5"
proxy-protocol = "0.5"
quartz_nbt = "0.2"
rand = "0.8"
@ -53,20 +63,35 @@ serde = "1.0"
serde_json = "1.0"
shlex = "1.1"
thiserror = "1.0"
tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "io-util", "net", "macros", "time", "process", "signal", "sync", "fs"] }
toml = "0.5"
version-compare = "0.1"
tokio = { version = "1", default-features = false, features = [
"rt-multi-thread",
"io-util",
"net",
"macros",
"time",
"process",
"signal",
"sync",
"fs",
] }
toml = "0.8"
version-compare = "0.2"
# Feature: rcon
rust_rcon = { package = "rcon", version = "0.5.2", optional = true }
async-std = { version = "1.9.0", default-features = false, optional = true }
rust_rcon = { package = "rcon", version = "0.6", default-features = false, features = ["rt-tokio"], optional = true }
# Feature: lobby
md-5 = { version = "0.10", optional = true }
uuid = { version = "0.7", optional = true, features = ["v3"] }
uuid = { version = "1.7", optional = true, features = ["v3"] }
[target.'cfg(unix)'.dependencies]
libc = "0.2"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winuser", "processthreadsapi", "handleapi", "ntdef", "minwindef"] }
winapi = { version = "0.3", features = [
"winuser",
"processthreadsapi",
"handleapi",
"ntdef",
"minwindef",
] }

View File

@ -35,7 +35,7 @@ https://user-images.githubusercontent.com/856222/141378688-882082be-9efa-4cfe-81
## Features
- Very efficient, lightweight & low-profile (~3KB RAM)
- Supports Minecraft Java Edition 1.7.2+, supports modded (e.g. Forge, FTB)
- Supports Minecraft Java Edition 1.20.3+
- Configure joining client occupation methods:
- Hold: hold clients when server starts, relay when ready, without them noticing
- Kick: kick clients when server starts, with a starting message
@ -55,6 +55,10 @@ https://user-images.githubusercontent.com/856222/141378688-882082be-9efa-4cfe-81
- Minecraft Java Edition 1.6+
- On Windows: RCON (automatically managed)
Build requirements:
- Rust 1.74 (MSRV)
_Note: You must have access to the system to run the `lazymc` binary. If you're
using a Minecraft shared hosting provider with a custom dashboard, you likely
won't be able to set this up._
@ -67,7 +71,8 @@ _Note: these instructions are for Linux & macOS, for Windows look
Make sure you meet all [requirements](#requirements).
Download the appropriate binary for your system from the [latest
release][latest-release] page.
release][latest-release] page. On macOS you must [compile from
source](#compile-from-source).
Place the binary in your Minecraft server directory, rename it if you like.
Open a terminal, go to the directory, and make sure you can invoke it:

7
build.rs Normal file
View File

@ -0,0 +1,7 @@
fn main() {
// rcon is required on Windows
#[cfg(all(windows, not(feature = "rcon")))]
{
compile_error!("required feature missing on Windows: rcon");
}
}

1
clippy.toml Normal file
View File

@ -0,0 +1 @@
msrv = "1.64.0"

View File

@ -21,8 +21,8 @@ In lazymc you may configure what protocol version to use:
# Server version & protocol hint.
# Sent to clients until actual server version is known.
# See: https://git.io/J1Fvx
version = "1.18.1"
protocol = 757
version = "1.19.3"
protocol = 761
# -- snip --
```

View File

@ -14,7 +14,7 @@ Open a terminal, go to the server directory, and make sure you can execute it:
.\lazymc --help
```
When lazymc is ready, set up the [configuration](./res/lazymc.toml) and start it
When lazymc is ready, set up the [configuration](../res/lazymc.toml) and start it
up:
```bash

View File

@ -18,8 +18,8 @@
# Server version & protocol hint.
# Sent to clients until actual server version is known.
# See: https://git.io/J1Fvx
#version = "1.18.1"
#protocol = 757
#version = "1.20.3"
#protocol = 765
[server]
# Server address. Internal IP and port of server started by lazymc to proxy to.
@ -33,6 +33,10 @@ directory = "."
# Warning: if using a bash script read: https://git.io/JMIKH
command = "java -Xmx1G -Xms1G -jar server.jar --nogui"
# Freeze the server process instead of restarting it when no players online, making it resume faster.
# Only works on Unix (Linux or MacOS), ignored on Windows
#freeze_process = true
# Immediately wake server when starting lazymc.
#wake_on_start = false
@ -183,4 +187,4 @@ command = "java -Xmx1G -Xms1G -jar server.jar --nogui"
[config]
# lazymc version this configuration is for.
# Don't change unless you know what you're doing.
version = "0.2.7"
version = "0.2.11"

View File

@ -9,7 +9,7 @@ use crate::util::error::{quit, quit_error, ErrorHintsBuilder};
/// Invoke config test command.
pub fn invoke(matches: &ArgMatches) {
// Get config path, attempt to canonicalize
let mut path = PathBuf::from(matches.value_of("config").unwrap());
let mut path = PathBuf::from(matches.get_one::<String>("config").unwrap());
if let Ok(p) = path.canonicalize() {
path = p;
}

View File

@ -8,7 +8,7 @@ use crate::util::error::{quit_error, quit_error_msg, ErrorHintsBuilder};
/// Invoke config test command.
pub fn invoke(matches: &ArgMatches) {
// Get config path, attempt to canonicalize
let mut path = PathBuf::from(matches.value_of("config").unwrap());
let mut path = PathBuf::from(matches.get_one::<String>("config").unwrap());
if let Ok(p) = path.canonicalize() {
path = p;
}

View File

@ -1,23 +1,28 @@
use clap::{App, AppSettings, Arg};
use clap::{Arg, Command};
/// The clap app for CLI argument parsing.
pub fn app() -> App<'static> {
App::new(crate_name!())
pub fn app() -> Command {
Command::new(crate_name!())
.version(crate_version!())
.author(crate_authors!())
.about(crate_description!())
.subcommand(
App::new("start")
Command::new("start")
.alias("run")
.about("Start lazymc and server (default)"),
)
.subcommand(
App::new("config")
Command::new("config")
.alias("cfg")
.about("Config actions")
.setting(AppSettings::SubcommandRequiredElseHelp)
.subcommand(App::new("generate").alias("gen").about("Generate config"))
.subcommand(App::new("test").about("Test config")),
.arg_required_else_help(true)
.subcommand_required(true)
.subcommand(
Command::new("generate")
.alias("gen")
.about("Generate config"),
)
.subcommand(Command::new("test").about("Test config")),
)
.arg(
Arg::new("config")
@ -28,6 +33,6 @@ pub fn app() -> App<'static> {
.value_name("FILE")
.default_value(crate::config::CONFIG_FILE)
.help("Use config file")
.takes_value(true),
.num_args(1),
)
}

View File

@ -15,14 +15,14 @@ use crate::util::serde::to_socket_addrs;
pub const CONFIG_FILE: &str = "lazymc.toml";
/// Configuration version user should be using, or warning will be shown.
const CONFIG_VERSION: &str = "0.2.6";
const CONFIG_VERSION: &str = "0.2.8";
/// Load config from file, based on CLI arguments.
///
/// Quits with an error message on failure.
pub fn load(matches: &ArgMatches) -> Config {
// Get config path, attempt to canonicalize
let mut path = PathBuf::from(matches.value_of("config").unwrap());
let mut path = PathBuf::from(matches.get_one::<String>("config").unwrap());
if let Ok(p) = path.canonicalize() {
path = p;
}
@ -108,8 +108,8 @@ pub struct Config {
impl Config {
/// Load configuration from file.
pub fn load(path: PathBuf) -> Result<Self, io::Error> {
let data = fs::read(&path)?;
let mut config: Config = toml::from_slice(&data)?;
let data = fs::read_to_string(&path)?;
let mut config: Config = toml::from_str(&data).map_err(io::Error::other)?;
// Show warning if config version is problematic
match &config.config.version {
@ -174,6 +174,11 @@ pub struct Server {
)]
pub address: SocketAddr,
/// Freeze the server process instead of restarting it when no players online, making it start up faster.
/// Only works on Unix (Linux or MacOS)
#[serde(default = "bool_true")]
pub freeze_process: bool,
/// Immediately wake server when starting lazymc.
#[serde(default)]
pub wake_on_start: bool,
@ -478,19 +483,13 @@ impl Default for Advanced {
}
/// Config configuration.
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Default)]
#[serde(default)]
pub struct ConfigConfig {
/// Configuration for lazymc version.
pub version: Option<String>,
}
impl Default for ConfigConfig {
fn default() -> Self {
Self { version: None }
}
}
fn option_pathbuf_dot() -> Option<PathBuf> {
Some(".".into())
}

View File

@ -42,7 +42,7 @@ const SERVER_JOIN_GAME_TIMEOUT: Duration = Duration::from_secs(20);
///
/// Notchian servers are slow, we must wait a little before sending play packets, because the
/// server needs time to transition the client into this state.
/// See warning at: https://wiki.vg/Protocol#Login_Success
/// See warning at: <https://wiki.vg/Protocol#Login_Success>
const SERVER_WARMUP: Duration = Duration::from_secs(1);
/// Serve lobby service for given client connection.
@ -652,7 +652,7 @@ async fn drain_stream(reader: &mut ReadHalf<'_>) -> Result<(), ()> {
let mut drain_buf = [0; 8 * 1024];
loop {
match reader.try_read(&mut drain_buf) {
Ok(read) if read == 0 => return Ok(()),
Ok(0) => return Ok(()),
Err(err) if err.kind() == ErrorKind::WouldBlock => return Ok(()),
Ok(_) => continue,
Err(err) => {

View File

@ -29,7 +29,7 @@ pub(crate) mod util;
use std::env;
use clap::App;
use clap::Command;
// Compile time feature compatability check.
#[cfg(all(windows, not(feature = "rcon")))]
@ -63,7 +63,7 @@ fn init_log() {
}
/// Invoke an action.
fn invoke_action(app: App) -> Result<(), ()> {
fn invoke_action(app: Command) -> Result<(), ()> {
let matches = app.get_matches();
// Config operations

View File

@ -1,3 +1,5 @@
use base64::Engine;
use crate::proto::client::ClientInfo;
/// Protocol version since when favicons are supported.
@ -12,7 +14,11 @@ pub fn default_favicon() -> String {
///
/// This assumes the favicon data to be a valid PNG image.
pub fn encode_favicon(data: &[u8]) -> String {
format!("{}{}", "data:image/png;base64,", base64::encode(data))
format!(
"{}{}",
"data:image/png;base64,",
base64::engine::general_purpose::STANDARD.encode(data)
)
}
/// Check whether the status response favicon is supported based on the given client info.

View File

@ -1,8 +1,8 @@
use std::time::Duration;
use async_std::net::TcpStream;
use async_std::prelude::*;
use rust_rcon::{Connection, Error as RconError};
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use tokio::time;
use crate::config::Config;
@ -17,7 +17,7 @@ const QUIRK_RCON_GRACE_TIME: Duration = Duration::from_millis(200);
/// An RCON client.
pub struct Rcon {
con: Connection,
con: Connection<TcpStream>,
}
impl Rcon {
@ -39,7 +39,7 @@ impl Rcon {
// Start connection
let con = Connection::builder()
.enable_minecraft_quirks(true)
.connect_stream(stream, pass)
.handshake(stream, pass)
.await?;
Ok(Self { con })

View File

@ -114,7 +114,7 @@ fn rewrite_contents(contents: String, mut changes: HashMap<&str, String>) -> Opt
}
// Try to split property
let (key, value) = match line.split_once("=") {
let (key, value) = match line.split_once('=') {
Some(result) => result,
None => return line,
};
@ -122,7 +122,7 @@ fn rewrite_contents(contents: String, mut changes: HashMap<&str, String>) -> Opt
// Take any new value, and update it
if let Some((_, new)) = changes.remove_entry(key.trim().to_lowercase().as_str()) {
if value != new {
line = format!("{}={}", key, new);
line = format!("{key}={new}");
changed = true;
}
}
@ -134,7 +134,7 @@ fn rewrite_contents(contents: String, mut changes: HashMap<&str, String>) -> Opt
// Append any missed changes
for (key, value) in changes {
new_contents += &format!("{}{}={}", EOL, key, value);
new_contents += &format!("{EOL}{key}={value}");
changed = true;
}

View File

@ -11,14 +11,14 @@ fn player_uuid(username: &str) -> Uuid {
/// Get UUID for given offline player username.
pub fn offline_player_uuid(username: &str) -> Uuid {
player_uuid(&format!("{}{}", OFFLINE_PLAYER_NAMESPACE, username))
player_uuid(&format!("{OFFLINE_PLAYER_NAMESPACE}{username}"))
}
/// Java's `UUID.nameUUIDFromBytes`
///
/// Static factory to retrieve a type 3 (name based) `Uuid` based on the specified byte array.
///
/// Ported from: https://git.io/J1b6A
/// Ported from: <https://git.io/J1b6A>
fn java_name_uuid_from_bytes(data: &[u8]) -> Uuid {
let mut hasher = Md5::new();
hasher.update(data);

View File

@ -3,11 +3,10 @@ use std::sync::Arc;
use std::time::Duration;
use bytes::BytesMut;
use minecraft_protocol::data::server_status::ServerStatus;
use minecraft_protocol::decoder::Decoder;
use minecraft_protocol::version::v1_14_4::handshake::Handshake;
use minecraft_protocol::version::v1_14_4::status::{
PingRequest, PingResponse, StatusRequest, StatusResponse,
use minecraft_protocol::version::v1_20_3::status::{
PingRequest, PingResponse, ServerStatus, StatusRequest, StatusResponse,
};
use rand::Rng;
use tokio::io::AsyncWriteExt;
@ -57,13 +56,13 @@ pub async fn monitor_server(config: Arc<Config>, server: Arc<Server>) {
// Sleep server when it's bedtime
if server.should_sleep(&config).await {
info!(target: "lazymc::montior", "Server has been idle, sleeping...");
info!(target: "lazymc::monitor", "Server has been idle, sleeping...");
server.stop(&config).await;
}
// Check whether we should force kill server
if server.should_kill().await {
error!(target: "lazymc::montior", "Force killing server, took too long to start or stop");
error!(target: "lazymc::monitor", "Force killing server, took too long to start or stop");
if !server.force_kill().await {
warn!(target: "lazymc", "Failed to force kill server");
}

View File

@ -1,17 +1,19 @@
#[cfg(unix)]
pub mod unix;
#[cfg(windows)]
pub mod windows;
#[cfg(unix)]
use nix::{
sys::signal::{self, Signal},
unistd::Pid,
};
/// Force kill process.
///
/// Results in undefined behavior if PID is invalid.
#[allow(unreachable_code)]
pub fn force_kill(pid: u32) -> bool {
#[cfg(unix)]
unsafe {
return unix::force_kill(pid);
}
return unix_signal(pid, Signal::SIGKILL);
#[cfg(windows)]
unsafe {
@ -22,20 +24,57 @@ pub fn force_kill(pid: u32) -> bool {
}
/// Gracefully kill process.
///
/// Results in undefined behavior if PID is invalid.
///
/// # Panics
///
/// Panics on platforms other than Unix.
#[allow(unreachable_code, dead_code, unused_variables)]
pub fn kill_gracefully(pid: u32) -> bool {
#[cfg(unix)]
unsafe {
return unix::kill_gracefully(pid);
}
return unix_signal(pid, Signal::SIGTERM);
unimplemented!(
"gracefully killing Minecraft server process not implemented on non-Unix platforms"
);
}
/// Freeze process.
/// Results in undefined behavior if PID is invaild.
///
/// # Panics
/// Panics on platforms other than Unix.
#[allow(unreachable_code)]
pub fn freeze(pid: u32) -> bool {
#[cfg(unix)]
return unix_signal(pid, Signal::SIGSTOP);
unimplemented!(
"freezing the Minecraft server process is not implemented on non-Unix platforms"
);
}
/// Unfreeze process.
/// Results in undefined behavior if PID is invaild.
///
/// # Panics
/// Panics on platforms other than Unix.
#[allow(unreachable_code)]
pub fn unfreeze(pid: u32) -> bool {
#[cfg(unix)]
return unix_signal(pid, Signal::SIGCONT);
unimplemented!(
"unfreezing the Minecraft server process is not implemented on non-Unix platforms"
);
}
#[cfg(unix)]
pub fn unix_signal(pid: u32, signal: Signal) -> bool {
match signal::kill(Pid::from_raw(pid as i32), signal) {
Ok(()) => true,
Err(err) => {
warn!(target: "lazymc", "Sending {signal} signal to server failed: {err}");
false
}
}
}

View File

@ -1,27 +0,0 @@
/// Force kill process on Unix by sending SIGKILL.
///
/// This is unsafe because the PID isn't checked.
pub unsafe fn force_kill(pid: u32) -> bool {
debug!(target: "lazymc", "Sending SIGKILL signal to {} to kill server", pid);
let result = libc::kill(pid as i32, libc::SIGKILL);
if result != 0 {
trace!(target: "lazymc", "SIGKILL failed: {}", result);
}
result == 0
}
/// Gracefully kill process on Unix by sending SIGTERM.
///
/// This is unsafe because the PID isn't checked.
pub unsafe fn kill_gracefully(pid: u32) -> bool {
debug!(target: "lazymc", "Sending SIGTERM signal to {} to kill server", pid);
let result = libc::kill(pid as i32, libc::SIGTERM);
if result != 0 {
warn!(target: "lazymc", "Sending SIGTERM signal to server failed: {}", result);
}
result == 0
}

View File

@ -157,11 +157,7 @@ async fn connect_to_server_no_timeout(
// Select server address to use, add magic if Forge
let server_addr = if config.server.forge {
format!(
"{}{}",
config.server.address.ip().to_string(),
forge::STATUS_MAGIC,
)
format!("{}{}", config.server.address.ip(), forge::STATUS_MAGIC)
} else {
config.server.address.ip().to_string()
};

View File

@ -9,7 +9,7 @@ pub mod packets;
/// in the configuration.
///
/// Should be kept up-to-date with latest supported Minecraft version by lazymc.
pub const PROTO_DEFAULT_VERSION: &str = "1.18.1";
pub const PROTO_DEFAULT_VERSION: &str = "1.20.3";
/// Default minecraft protocol version.
///
@ -17,7 +17,7 @@ pub const PROTO_DEFAULT_VERSION: &str = "1.18.1";
/// in the configuration.
///
/// Should be kept up-to-date with latest supported Minecraft version by lazymc.
pub const PROTO_DEFAULT_PROTOCOL: u32 = 757;
pub const PROTO_DEFAULT_PROTOCOL: u32 = 765;
/// Compression threshold to use.
// TODO: read this from server.properties instead

View File

@ -70,7 +70,7 @@ async fn send_v1_16_3(
packet::write_packet(
Title {
action: if title.is_empty() && subtitle.is_empty() {
// Defaults: https://minecraft.fandom.com/wiki/Commands/title#Detail
// Defaults: https://minecraft.wiki/w/Commands/title#Detail
TitleAction::SetTimesAndDisplay {
fade_in: 10,
stay: 70,
@ -121,7 +121,7 @@ async fn send_v1_17(
// Set title times
packet::write_packet(
if title.is_empty() && subtitle.is_empty() {
// Defaults: https://minecraft.fandom.com/wiki/Commands/title#Detail
// Defaults: https://minecraft.wiki/w/Commands/title#Detail
SetTitleTimes {
fade_in: 10,
stay: 70,

View File

@ -4,7 +4,7 @@ use std::sync::Arc;
use std::time::{Duration, Instant};
use futures::FutureExt;
use minecraft_protocol::data::server_status::ServerStatus;
use minecraft_protocol::version::v1_20_3::status::ServerStatus;
use tokio::process::Command;
use tokio::sync::watch;
#[cfg(feature = "rcon")]
@ -29,9 +29,11 @@ const SERVER_QUIT_COOLDOWN: Duration = Duration::from_millis(2500);
#[cfg(feature = "rcon")]
const RCON_COOLDOWN: Duration = Duration::from_secs(15);
/// Exit code when SIGTERM is received on Unix.
#[cfg(unix)]
const UNIX_EXIT_SIGTERM: i32 = 130;
/// Exit codes that are allowed.
///
/// - 143: https://github.com/timvisee/lazymc/issues/26#issuecomment-1435670029
/// - 130: https://unix.stackexchange.com/q/386836/61092
const ALLOWED_EXIT_CODES: [i32; 2] = [130, 143];
/// Shared server state.
#[derive(Debug)]
@ -217,9 +219,14 @@ impl Server {
None => info!(target: "lazymc", "Starting server..."),
}
// Unfreeze server if it is frozen
#[cfg(unix)]
if config.server.freeze_process && unfreeze_server_signal(&config, &server).await {
return true;
}
// Spawn server in new task
Self::spawn_server_task(config, server);
true
}
@ -235,6 +242,12 @@ impl Server {
/// This will attempt to stop the server with all available methods.
#[allow(unused_variables)]
pub async fn stop(&self, config: &Config) -> bool {
// Try to freeze through signal
#[cfg(unix)]
if config.server.freeze_process && freeze_server_signal(config, self).await {
return true;
}
// Try to stop through RCON if started
#[cfg(feature = "rcon")]
if self.state() == State::Started && stop_server_rcon(config, self).await {
@ -485,8 +498,12 @@ pub async fn invoke_server_cmd(
debug!(target: "lazymc", "Server process stopped successfully ({})", status);
false
}
#[cfg(unix)]
Ok(status) if status.code() == Some(UNIX_EXIT_SIGTERM) => {
Ok(status)
if status
.code()
.map(|ref code| ALLOWED_EXIT_CODES.contains(code))
.unwrap_or(false) =>
{
debug!(target: "lazymc", "Server process stopped successfully by SIGTERM ({})", status);
false
}
@ -586,13 +603,11 @@ async fn stop_server_signal(config: &Config, server: &Server) -> bool {
}
};
// Send kill signal
if !crate::os::kill_gracefully(pid) {
error!(target: "lazymc", "Failed to send stop signal to server process");
return false;
}
// Update from starting/started to stopping
server
.update_state_from(Some(State::Starting), State::Stopping, config)
.await;
@ -602,3 +617,59 @@ async fn stop_server_signal(config: &Config, server: &Server) -> bool {
true
}
/// Freeze server by sending SIGSTOP signal.
///
/// Only available on Unix.
#[cfg(unix)]
async fn freeze_server_signal(config: &Config, server: &Server) -> bool {
// Grab PID
let pid = match *server.pid.lock().await {
Some(pid) => pid,
None => {
debug!(target: "lazymc", "Could not send freeze signal to server process, PID unknown");
return false;
}
};
if !os::freeze(pid) {
error!(target: "lazymc", "Failed to send freeze signal to server process.");
}
server
.update_state_from(Some(State::Starting), State::Stopped, config)
.await;
server
.update_state_from(Some(State::Started), State::Stopped, config)
.await;
true
}
/// Unfreeze server by sending SIGCONT signal.
///
/// Only available on Unix.
#[cfg(unix)]
async fn unfreeze_server_signal(config: &Config, server: &Server) -> bool {
// Grab PID
let pid = match *server.pid.lock().await {
Some(pid) => pid,
None => {
debug!(target: "lazymc", "Could not send unfreeze signal to server process, PID unknown");
return false;
}
};
if !os::unfreeze(pid) {
error!(target: "lazymc", "Failed to send unfreeze signal to server process.");
}
server
.update_state_from(Some(State::Stopping), State::Starting, config)
.await;
server
.update_state_from(Some(State::Stopped), State::Starting, config)
.await;
true
}

View File

@ -25,7 +25,7 @@ pub fn service(config: Arc<Config>, server: Arc<Server>) {
};
// Keep watching
#[allow(clippy::blocks_in_if_conditions)]
#[allow(clippy::blocks_in_conditions)]
while {
// Update all files once
reload_bans(&config, &server, &dir.join(ban::FILE));
@ -151,8 +151,7 @@ fn reload_whitelist(config: &Config, server: &Server, dir: &Path) {
}
// Must be enabled in server.properties
let enabled =
server_properties::read_property(&dir.join(server_properties::FILE), "white-list")
let enabled = server_properties::read_property(dir.join(server_properties::FILE), "white-list")
.map(|v| v.trim() == "true")
.unwrap_or(false);
if !enabled {

View File

@ -84,7 +84,7 @@ fn route(inbound: TcpStream, config: Arc<Config>, server: Arc<Server>) {
// Check ban state, just drop connection if enabled
let banned = server.is_banned_ip_blocking(&peer.ip());
if config.server.drop_banned_ips {
if banned && config.server.drop_banned_ips {
info!(target: "lazymc", "Connection from banned IP {}, dropping", peer.ip());
return;
}

View File

@ -1,13 +1,12 @@
use std::sync::Arc;
use bytes::BytesMut;
use minecraft_protocol::data::chat::{Message, Payload};
use minecraft_protocol::data::server_status::*;
use minecraft_protocol::data::server_status::{OnlinePlayers, ServerVersion};
use minecraft_protocol::decoder::Decoder;
use minecraft_protocol::encoder::Encoder;
use minecraft_protocol::version::v1_14_4::handshake::Handshake;
use minecraft_protocol::version::v1_14_4::login::LoginStart;
use minecraft_protocol::version::v1_14_4::status::StatusResponse;
use minecraft_protocol::version::v1_20_3::status::{ServerStatus, StatusResponse};
use tokio::fs;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
@ -152,11 +151,7 @@ pub async fn serve(
info!(target: "lazymc", "Login from banned IP {}, disconnecting", client.peer.ip());
DEFAULT_BAN_REASON.to_string()
};
action::kick(
&client,
&format!("{}{}", BAN_MESSAGE_PREFIX, msg),
&mut writer,
)
action::kick(&client, &format!("{BAN_MESSAGE_PREFIX}{msg}"), &mut writer)
.await?;
break;
}
@ -236,11 +231,11 @@ async fn server_status(client_info: &ClientInfo, config: &Config, server: &Serve
if config.motd.from_server && status.is_some() {
status.as_ref().unwrap().description.clone()
} else {
Message::new(Payload::text(match server_state {
server::State::Stopped | server::State::Started => &config.motd.sleeping,
server::State::Starting => &config.motd.starting,
server::State::Stopping => &config.motd.stopping,
}))
match server_state {
server::State::Stopped | server::State::Started => config.motd.sleeping.clone(),
server::State::Starting => config.motd.starting.clone(),
server::State::Stopping => config.motd.stopping.clone(),
}
}
};
@ -285,15 +280,10 @@ async fn server_favicon(config: &Config) -> String {
}
// Read icon data
let data = match fs::read(path).await.map_err(|err| {
error!(target: "lazymc", "Failed to read favicon from {}: {}", SERVER_ICON_FILE, err);
}) {
Ok(data) => data,
Err(err) => {
error!(target: "lazymc::status", "Failed to load server icon from disk, using default: {:?}", err);
return favicon::default_favicon();
}
};
let data = fs::read(path).await.unwrap_or_else(|err| {
error!(target: "lazymc::status", "Failed to read favicon from {}, using default: {err}", SERVER_ICON_FILE);
favicon::default_favicon().into_bytes()
});
favicon::encode_favicon(&data)
}

View File

@ -10,7 +10,7 @@ use crate::util::error::{quit_error, ErrorHints};
/// excluding the `:` suffix.
pub fn prompt(msg: &str) -> String {
// Show the prompt
eprint!("{}: ", msg);
eprint!("{msg}: ");
let _ = stderr().flush();
// Get the input
@ -49,7 +49,7 @@ pub fn prompt_yes(msg: &str, def: Option<bool>) -> bool {
);
// Get the user input
let answer = prompt(&format!("{} {}", msg, options));
let answer = prompt(&format!("{msg} {options}"));
// Assume the default if the answer is empty
if answer.is_empty() {

View File

@ -16,7 +16,7 @@ pub fn print_error(err: anyhow::Error) {
// Report each printable error, count them
let count = err
.chain()
.map(|err| format!("{}", err))
.map(|err| err.to_string())
.filter(|err| !err.is_empty())
.enumerate()
.map(|(i, err)| {
@ -126,7 +126,7 @@ impl ErrorHints {
if self.config_generate {
eprintln!(
"Use '{}' to generate a new config file",
highlight(&format!("{} config generate", bin))
highlight(&format!("{bin} config generate"))
);
}
if self.config {
@ -138,7 +138,7 @@ impl ErrorHints {
if self.config_test {
eprintln!(
"Use '{}' to test a config file",
highlight(&format!("{} config test -c FILE", bin))
highlight(&format!("{bin} config test -c FILE"))
);
}
if self.verbose {