1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*!
A fast, lightweight, stable, and feature-rich Minecraft Server Protocol client implemented in Rust.

<img src="https://flat.badgen.net/badge/license/MIT/blue" alt="license" />
<img src="https://flat.badgen.net/crates/v/msp" alt="version" />
<img src="https://flat.badgen.net/crates/d/msp" alt="download" />

Offering efficient type exporting and error feedback. It enables retrieving
server status using various protocols and returns strongly-typed JSON data.

### Applicable version
Supports Java Edition and Bedrock Edition servers. The applicable version range is as follows.

- **Java Edition:** Suitable for server versions 1.4 and above ([Protocol version number](https://wiki.vg/Protocol_version_numbers) >= 47).
- **Bedrock Edition:** Suitable for modern Bedrock servers (1.16.220 and above).

### Supported protocols

Server Information Query Protocol covering most versions, with certain protocols requiring the server to enable corresponding features.

- [Server List Ping](https://wiki.vg/Server_List_Ping) Suitable for most modern servers (1.7+).
- [Netty Server Ping](https://wiki.vg/Server_List_Ping#1.6) Suitable for servers 1.6 and later.
- [Legacy Server Ping](https://wiki.vg/Server_List_Ping#1.4_to_1.5) Suitable for older versions of servers (1.4 to 1.5).
- [Beta Legacy Server Ping](https://wiki.vg/Server_List_Ping#Beta_1.8_to_1.3) Suitable for ancient versions of servers (Beta 1.8 to 1.3).
- [Ping via LAN](https://wiki.vg/Server_List_Ping#Ping_via_LAN_.28Open_to_LAN_in_Singleplayer.29) LAN Server Discovery Protocol.
- [Raknet Protocol](https://wiki.vg/Raknet_Protocol) Applicable to modern Bedrock servers.
- [Query Protocol](https://wiki.vg/Query) Applicable to modern Java Edition servers (available from version 1.9pre4 onwards).

### Usage

1. To integrate it as a library into your own Rust project, run it in the root project directory.

```bash
cargo add msp
```

Or, add this dependency to your `Cargo.toml` file:

```toml
[dependencies]
msp = "0.1.0"
```

### Examples

Here are some basic examples showcased below.

1. Use [Conf::get_server_status] to retrieve server information, return [Server]. Note that older versions are not supported:

```no_run
use msp::{Conf, MspErr, Server};

fn main() -> Result<(), MspErr> {
    let server = Conf::create_with_port("www.example.com", 25565);
    let info: Server = server.get_server_status()?;

    println!("{}", info);

    Ok(())
}
```

2. Use [Conf::create_with_port] to create a connection configuration specifying the port:

```no_run
use msp::{Conf, MspErr, Server};

fn main() -> Result<(), MspErr> {
    let server = Conf::create_with_port("www.example.com", 25565);
    let info: Server = server.get_server_status()?;

    println!("{}", info);

    Ok(())
}
```

3. Use [get_lan_server_status] to retrieve LAN online hosts:

```no_run
use msp::{get_lan_server_status, MspErr, SocketConf};

fn main() -> Result<(), MspErr> {
    get_lan_server_status(&SocketConf::default())?;

    Ok(())
}
```

4. Use [Conf::query_full] to retrieve server information using the Query protocol:

```no_run
use msp::{Conf, MspErr};

fn main() -> Result<(), MspErr> {
    let server = Conf::create_with_port("www.example.com", 25565);

    println!("{}", server.query_full()?);

    Ok(())
}
```

**Note:** To use this protocol, you need to enable the `enable-query` option on the server side.
This option can be found in the `server.properties` file located in the root directory.
Set it as follows:

```toml
enable-query=true
query.port=25565 # Configure the port according to your specific situation
```

Make sure to save the changes and restart the server for the configuration to take effect.

### License

MIT.
*/

#![warn(missing_docs)]

mod conf;
mod error;
mod lan;
mod query;
mod server;
mod share;
mod varint;

pub use conf::{Conf, SocketConf};
pub use error::MspErr;
pub use lan::{get_lan_server_status, LanServer};
pub use query::{QueryBasic, QueryFull};
pub use server::{BedrockServer, LegacyBetaServer, LegacyServer, NettyServer, Server};