aboutsummaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
author1992414357@qq.com <1992414357@qq.com>2025-04-21 06:25:54 +0800
committer1992414357@qq.com <1992414357@qq.com>2025-04-21 06:25:54 +0800
commit50ea9869616846e5a0448ead8272c397080f36d8 (patch)
tree5f2ec829ecf48441a6d33f4160909dc02ddf83bf /core/src
parentd72d700c84794ca420035ceb9c294563f3f9c048 (diff)
.
Diffstat (limited to 'core/src')
-rw-r--r--core/src/client/client.rs29
-rw-r--r--core/src/client/client_commands.rs (renamed from core/src/pads_player_commands.rs)3
-rw-r--r--core/src/client/client_event.rs26
-rw-r--r--core/src/client/mod.rs3
-rw-r--r--core/src/constants.rs9
-rw-r--r--core/src/lib.rs12
-rw-r--r--core/src/message_encoder.rs71
-rw-r--r--core/src/messages.rs78
-rw-r--r--core/src/player/mod.rs1
-rw-r--r--core/src/player/player_info.rs (renamed from core/src/pads_player.rs)58
-rw-r--r--core/src/server/mod.rs3
-rw-r--r--core/src/server/server.rs (renamed from core/src/pads_server.rs)49
-rw-r--r--core/src/server/server_commands.rs (renamed from core/src/pas_server_commands.rs)3
-rw-r--r--core/src/server/server_event.rs36
14 files changed, 272 insertions, 109 deletions
diff --git a/core/src/client/client.rs b/core/src/client/client.rs
new file mode 100644
index 0000000..c11bb61
--- /dev/null
+++ b/core/src/client/client.rs
@@ -0,0 +1,29 @@
+use crate::constants::DEFAULT_PORT;
+use crate::player::player_info::PlayerInfo;
+use std::net::SocketAddr;
+
+/// 玩家客户端
+pub struct PadClient {
+ player_info: PlayerInfo,
+ remote_addr: SocketAddr,
+ receive_skin_package : bool
+}
+
+impl Default for PadClient {
+
+ fn default() -> Self {
+ PadClient {
+ player_info: PlayerInfo::default(),
+ remote_addr: SocketAddr::from(([127, 0, 0, 1], DEFAULT_PORT)),
+ receive_skin_package: true
+ }
+ }
+}
+
+impl PadClient {
+
+ /// # 连接到服务器
+ pub fn connect_server(&self) {
+
+ }
+} \ No newline at end of file
diff --git a/core/src/pads_player_commands.rs b/core/src/client/client_commands.rs
index 276805f..f674f6c 100644
--- a/core/src/pads_player_commands.rs
+++ b/core/src/client/client_commands.rs
@@ -1,4 +1,5 @@
-use crate::pads_player::{PadClient, PlayerMessage};
+use crate::client::client::PadClient;
+use crate::messages::PlayerMessage;
impl PadClient {
diff --git a/core/src/client/client_event.rs b/core/src/client/client_event.rs
new file mode 100644
index 0000000..ac52e53
--- /dev/null
+++ b/core/src/client/client_event.rs
@@ -0,0 +1,26 @@
+use crate::messages::ServerMessage;
+
+/// 玩家客户端事件
+pub trait PadClientEvent {
+
+ /// 加入游戏
+ fn joined_game();
+
+ /// 加入游戏失败
+ fn joined_game_failed();
+
+ /// 退出游戏
+ fn left_game();
+
+ /// 被踢出游戏
+ fn kicked();
+
+ /// 被该游戏封禁(若游戏未保存名单,则游戏重启前无法进入)
+ fn banned();
+
+ /// 掉线
+ fn disconnected();
+
+ /// 接收到消息
+ fn msg_received(msg: ServerMessage);
+} \ No newline at end of file
diff --git a/core/src/client/mod.rs b/core/src/client/mod.rs
new file mode 100644
index 0000000..0cb7dd2
--- /dev/null
+++ b/core/src/client/mod.rs
@@ -0,0 +1,3 @@
+pub mod client_commands;
+pub mod client;
+pub mod client_event; \ No newline at end of file
diff --git a/core/src/constants.rs b/core/src/constants.rs
index a66f79f..6257c9d 100644
--- a/core/src/constants.rs
+++ b/core/src/constants.rs
@@ -1 +1,8 @@
-pub const SALT : &str = ":)"; \ No newline at end of file
+use bincode::config;
+use bincode::config::Configuration;
+
+pub const SALT : &str = ":)";
+
+pub const DEFAULT_PORT : u16 = 8916;
+
+pub const BINCODE_CONFIG : Configuration = config::standard(); \ No newline at end of file
diff --git a/core/src/lib.rs b/core/src/lib.rs
index 056b046..d8b1df8 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -1,5 +1,9 @@
-pub mod pads_server;
-pub mod pads_player;
+// Public
+pub mod client;
+pub mod player;
+pub mod server;
+pub mod messages;
+
+// Private
mod constants;
-mod pas_server_commands;
-mod pads_player_commands; \ No newline at end of file
+mod message_encoder;
diff --git a/core/src/message_encoder.rs b/core/src/message_encoder.rs
new file mode 100644
index 0000000..a8575d0
--- /dev/null
+++ b/core/src/message_encoder.rs
@@ -0,0 +1,71 @@
+use std::io::{Read, Write};
+use bincode::error::{DecodeError, EncodeError};
+use serde::de::DeserializeOwned;
+use serde::Serialize;
+use crate::messages::{ClientMessage, PlayerMessage, ServerCallbackMessage, ServerMessage};
+
+pub trait MessageEncoder: Serialize + DeserializeOwned {
+ fn encode(&self) -> Result<usize, EncodeError>;
+ fn decode(encode: usize) -> Result<Self, DecodeError>
+ where
+ Self: Sized;
+}
+
+impl MessageEncoder for PlayerMessage {
+ fn encode(&self) -> Result<usize, EncodeError> {
+ bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard())
+ }
+
+ fn decode(encode: &usize) -> Result<Self, DecodeError> {
+ bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard())
+ }
+}
+
+impl MessageEncoder for ServerMessage {
+ fn encode(&self) -> Result<usize, EncodeError> {
+ bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard())
+ }
+
+ fn decode(encode: usize) -> Result<Self, DecodeError> {
+ bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard())
+ }
+}
+
+impl MessageEncoder for ClientMessage {
+ fn encode(&self) -> Result<usize, EncodeError> {
+ bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard())
+ }
+
+ fn decode(encode: usize) -> Result<Self, DecodeError> {
+ bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard())
+ }
+}
+
+impl MessageEncoder for ServerCallbackMessage {
+ fn encode(&self) -> Result<usize, EncodeError> {
+ bincode::serde::encode_into_std_write(self, &mut std::io::sink(), bincode::config::standard())
+ }
+
+ fn decode(encode: usize) -> Result<Self, DecodeError> {
+ bincode::serde::decode_from_std_read(&mut &encode[..], bincode::config::standard())
+ }
+}
+
+#[cfg(test)]
+mod encoder_tests {
+ use crate::message_encoder::MessageEncoder;
+ use crate::messages::PlayerMessage;
+
+
+ #[test]
+ fn test_encode_decode() {
+
+ let msg: String = String::from("Hello, World!");
+
+ let msg_player = PlayerMessage::Message(msg);
+ let msg_player_encoded = (&msg_player).encode().expect("Encode failed");
+ let msg_player_decoded = PlayerMessage::decode(msg_player_encoded).expect("Decode failed");
+
+ assert!(msg_player == msg_player_decoded)
+ }
+} \ No newline at end of file
diff --git a/core/src/messages.rs b/core/src/messages.rs
new file mode 100644
index 0000000..2ae8328
--- /dev/null
+++ b/core/src/messages.rs
@@ -0,0 +1,78 @@
+use std::time::Duration;
+use serde::{Deserialize, Serialize};
+use crate::player::player_info::PlayerInfo;
+
+/// # 玩家消息
+/// 玩家 --> 服务器
+#[derive(Serialize, Deserialize, PartialEq)]
+pub enum PlayerMessage {
+ /// 消息:发送字符串,服务端无需回复
+ Message(String),
+
+ /// 命令:发送字符串,服务器必须回复
+ Command(String),
+
+ /// 按钮按下:发送 u8 作为按键代号
+ ButtonPressed(u8),
+
+ /// 按钮抬起:发送 u8 作为按键代号
+ ButtonReleased(u8),
+
+ /// 轴向:发送 u8 作为轴向代号,两个 f64 分别代表 x 和 y 方向的轴向
+ /// u8:轴向代号
+ /// f64:X 轴向值 (0 - 1)
+ /// f64:Y 轴向值 (0 - 1)
+ Axis(u8, (f64, f64))
+}
+
+/// # 服务器消息
+/// 服务器 --> 玩家
+#[derive(Serialize, Deserialize, PartialEq)]
+pub enum ServerMessage {
+
+ /// 命令:发送字符串,客户端处理
+ Command(String),
+
+ /// 动画:发送字符串,客户端触发对应名称动画
+ Animation(String),
+
+ /// 震动:发送 Duration 作为时长,f64 作为震动强度 (0 - 1)
+ Shock(Duration, f64),
+
+ /// 踢出:发送踢出指令,以便让客户端明白自己的掉线是因为被踢出
+ /// “杀人还要诛心!!!好可怕啊!”
+ Kick
+}
+
+/// # 客户端消息
+/// 客户端 --> 服务器
+#[derive(Serialize, Deserialize, PartialEq)]
+pub enum ClientMessage {
+
+ /// 连接请求,将和服务端建立连接,并通知服务器将要建立连接的玩家
+ ConnectRequest(PlayerInfo),
+
+ /// 下载布局请求
+ RequestLayout,
+
+ /// 下载皮肤请求
+ RequestSkin,
+
+ /// 客户端准备就绪
+ Ready
+}
+
+/// # 服务器回调消息
+/// 服务器 --> 客户端
+#[derive(Serialize, Deserialize, PartialEq)]
+pub enum ServerCallbackMessage {
+
+ /// 拒绝:发送消息已通知客户端请求被拒绝
+ Refuse,
+
+ /// 接收:发送消息已通知客户端请求被接受,以继续操作
+ Accept,
+
+ /// 欢迎:客户端准备完成后,服务端发送 Welcome 以允许客户端以玩家加入游戏
+ Welcome
+} \ No newline at end of file
diff --git a/core/src/player/mod.rs b/core/src/player/mod.rs
new file mode 100644
index 0000000..fcb7558
--- /dev/null
+++ b/core/src/player/mod.rs
@@ -0,0 +1 @@
+pub mod player_info; \ No newline at end of file
diff --git a/core/src/pads_player.rs b/core/src/player/player_info.rs
index eb9c661..6412b66 100644
--- a/core/src/pads_player.rs
+++ b/core/src/player/player_info.rs
@@ -1,54 +1,10 @@
-use std::net::SocketAddr;
use hex::encode;
use serde::{Deserialize, Serialize};
use sha1::{Digest, Sha1};
use crate::constants::SALT;
-use crate::pads_server::ServerMessage;
-
-/// 玩家客户端
-pub struct PadClient {
- player_info: PlayerInfo,
- remote_addr: SocketAddr,
- receive_skin_package : bool
-}
-
-impl Default for PadClient {
-
- fn default() -> Self {
- PadClient {
- player_info: PlayerInfo::default(),
- remote_addr: SocketAddr::from(([127, 0, 0, 1], 8916)),
- receive_skin_package: true
- }
- }
-}
-
-/// 玩家客户端事件
-pub trait PadClientEvent {
-
- /// 加入游戏
- fn joined_game();
-
- /// 加入游戏失败
- fn joined_game_failed();
-
- /// 退出游戏
- fn left_game();
-
- /// 被踢出游戏
- fn kicked();
-
- /// 被该游戏封禁(若游戏未保存名单,则游戏重启前无法进入)
- fn banned();
-
- /// 掉线
- fn disconnected();
-
- /// 接收到消息
- fn msg_received(msg: ServerMessage);
-}
/// 玩家信息
+#[derive(Serialize, Deserialize, PartialEq)]
pub struct PlayerInfo {
pub display_name: String,
pub name_hash: String,
@@ -56,7 +12,7 @@ pub struct PlayerInfo {
// 颜色 HSV
pub color_hue: i32, // 0 - 360
pub color_saturation: f64, // 0 - 1
- pub color_value: f64 // 0 - 1
+ pub color_value: f64, // 0 - 1
}
impl Default for PlayerInfo {
@@ -72,16 +28,6 @@ impl Default for PlayerInfo {
}
}
-/// 玩家消息
-#[derive(Serialize, Deserialize, PartialEq)]
-pub enum PlayerMessage {
- Message(String),
- Command(String),
- ButtonPressed(u8),
- ButtonReleased(u8),
- Axis(u8, (f64, f64))
-}
-
impl PlayerInfo {
/// # 配置玩家 ID 和 名称
diff --git a/core/src/server/mod.rs b/core/src/server/mod.rs
new file mode 100644
index 0000000..d7553a8
--- /dev/null
+++ b/core/src/server/mod.rs
@@ -0,0 +1,3 @@
+pub mod server;
+pub mod server_commands;
+pub mod server_event; \ No newline at end of file
diff --git a/core/src/pads_server.rs b/core/src/server/server.rs
index d10a88b..c71892c 100644
--- a/core/src/pads_server.rs
+++ b/core/src/server/server.rs
@@ -1,7 +1,6 @@
+use crate::constants::DEFAULT_PORT;
+use crate::server::server_event::PadServerEvent;
use std::net::{SocketAddr, UdpSocket};
-use std::time::Duration;
-use bincode::Encode;
-use crate::pads_player::{PlayerInfo, PlayerMessage};
/// # 监听服务器
/// 监听服务器用于连接玩家设备,并接收玩家的按键输入
@@ -17,7 +16,7 @@ impl Default for PadServer {
fn default() -> Self {
PadServer {
server_name: String::from("This Is No Pads"),
- port: 8916
+ port: DEFAULT_PORT
// TODO :: 补充布局文件
}
}
@@ -54,46 +53,4 @@ impl PadServer {
pub fn stop_listening(&self) {
}
-}
-
-/// # 监听服务器事件
-/// 服务器运行过程中的信息将会发送到该 Event Trait
-pub trait PadServerEvent {
-
- /// 服务器启动时
- fn server_start();
-
- /// 服务器关闭时
- fn server_shutdown();
-
- /// 玩家加入请求
- /// info : 玩家信息
- /// return -> 是否允许加入服务器
- fn join_request_received(info: PlayerInfo) -> bool;
-
- /// 玩家加入游戏
- /// info : 玩家信息
- fn player_joined(info: PlayerInfo);
-
- /// 玩家离开游戏
- /// info : 玩家信息
- fn player_left(info: PlayerInfo);
-
- /// 玩家断开连接
- /// info : 玩家信息
- fn player_disconnected(info: PlayerInfo);
-
- /// 接收到消息
- /// info : 玩家信息
- /// msg : 接受的消息
- fn msg_received(info: PlayerInfo, msg: PlayerMessage);
-}
-
-/// # 监听服务器消息
-/// 监听服务器用于向玩家发送指令
-pub enum ServerMessage {
- Command(String),
- Animation(String),
- Shock(Duration, f64),
- Kick
} \ No newline at end of file
diff --git a/core/src/pas_server_commands.rs b/core/src/server/server_commands.rs
index 8d15261..dcf40a3 100644
--- a/core/src/pas_server_commands.rs
+++ b/core/src/server/server_commands.rs
@@ -1,5 +1,6 @@
use std::time::Duration;
-use crate::pads_server::{PadServer, ServerMessage};
+use crate::messages::ServerMessage;
+use crate::server::server::PadServer;
impl PadServer {
diff --git a/core/src/server/server_event.rs b/core/src/server/server_event.rs
new file mode 100644
index 0000000..f63df5f
--- /dev/null
+++ b/core/src/server/server_event.rs
@@ -0,0 +1,36 @@
+use crate::messages::PlayerMessage;
+use crate::player::player_info::PlayerInfo;
+
+/// # 监听服务器事件
+/// 服务器运行过程中的信息将会发送到该 Event Trait
+pub trait PadServerEvent {
+
+ /// 服务器启动时
+ fn server_start();
+
+ /// 服务器关闭时
+ fn server_shutdown();
+
+ /// 玩家加入请求
+ /// info : 玩家信息
+ /// return -> 是否允许加入服务器
+ fn join_request_received(info: PlayerInfo) -> bool;
+
+ /// 玩家加入游戏
+ /// info : 玩家信息
+ fn player_joined(info: PlayerInfo);
+
+ /// 玩家离开游戏
+ /// info : 玩家信息
+ fn player_left(info: PlayerInfo);
+
+ /// 玩家断开连接
+ /// info : 玩家信息
+ fn player_disconnected(info: PlayerInfo);
+
+ /// 接收到消息
+ /// info : 玩家信息
+ /// msg : 接受的消息
+ fn msg_received(info: PlayerInfo, msg: PlayerMessage);
+}
+