summaryrefslogtreecommitdiff
path: root/shared/src
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src')
-rw-r--r--shared/src/helper.rs132
-rw-r--r--shared/src/lib.rs1
-rw-r--r--shared/src/packets.rs124
-rw-r--r--shared/src/resources.rs2
-rw-r--r--shared/src/store.rs2
5 files changed, 145 insertions, 116 deletions
diff --git a/shared/src/helper.rs b/shared/src/helper.rs
new file mode 100644
index 0000000..65918ad
--- /dev/null
+++ b/shared/src/helper.rs
@@ -0,0 +1,132 @@
+/*
+ wearechat - generic multiplayer game with voip
+ Copyright (C) 2025 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+use crate::packets::{Data, Object, Resource};
+use anyhow::Result;
+use std::{
+ io::{Read, Write},
+ marker::PhantomData,
+};
+
+pub trait ReadWrite: Sized {
+ fn write(&self, w: &mut dyn Write) -> Result<()>;
+ fn read(r: &mut dyn Read) -> Result<Self>;
+
+ fn write_alloc(&self) -> Vec<u8> {
+ let mut buf = Vec::new();
+ self.write(&mut buf).unwrap();
+ buf
+ }
+}
+
+impl ReadWrite for f32 {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.to_be_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = [0; 4];
+ r.read_exact(&mut buf)?;
+ Ok(f32::from_be_bytes(buf))
+ }
+}
+impl ReadWrite for u32 {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.to_be_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = [0; 4];
+ r.read_exact(&mut buf)?;
+ Ok(u32::from_be_bytes(buf))
+ }
+}
+impl ReadWrite for Vec<u8> {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self)?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = Vec::new();
+ r.read_to_end(&mut buf)?;
+ Ok(buf)
+ }
+}
+impl ReadWrite for String {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&(self.len() as u32).to_be_bytes())?;
+ w.write_all(self.as_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut size = [0; 4];
+ r.read_exact(&mut size)?;
+ let size = u32::from_be_bytes(size);
+ let mut buf = vec![0; size as usize];
+ r.read_exact(&mut buf)?;
+ Ok(String::from_utf8(buf)?)
+ }
+}
+
+impl ReadWrite for Data {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&(self.0.len() as u32).to_be_bytes())?;
+ w.write_all(&self.0)?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut size = [0; 4];
+ r.read_exact(&mut size)?;
+ let size = u32::from_be_bytes(size);
+ let mut buf = vec![0; size as usize];
+ r.read_exact(&mut buf)?;
+ Ok(Self(buf))
+ }
+}
+impl<T> ReadWrite for Resource<T> {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.0)?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut s = Self([0; 32], PhantomData);
+ r.read_exact(&mut s.0)?;
+ Ok(s)
+ }
+}
+impl ReadWrite for Object {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ w.write_all(&self.0.to_be_bytes())?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut s = [0; 16];
+ r.read_exact(&mut s)?;
+ Ok(Object(u128::from_be_bytes(s)))
+ }
+}
+impl<T: ReadWrite, const N: usize> ReadWrite for [T; N] {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ for e in self {
+ e.write(w)?;
+ }
+ Ok(())
+ }
+
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ [(); N].try_map(|()| T::read(r))
+ }
+}
diff --git a/shared/src/lib.rs b/shared/src/lib.rs
index d198283..951683c 100644
--- a/shared/src/lib.rs
+++ b/shared/src/lib.rs
@@ -20,5 +20,6 @@ pub mod packets;
pub mod resources;
pub mod store;
pub mod tree;
+pub mod helper;
pub use glam::{Affine3A, Mat3A, Vec3A, vec3a};
diff --git a/shared/src/packets.rs b/shared/src/packets.rs
index 66b0b55..a35b4e9 100644
--- a/shared/src/packets.rs
+++ b/shared/src/packets.rs
@@ -14,7 +14,10 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::resources::{Prefab, PrefabIndex};
+use crate::{
+ helper::ReadWrite,
+ resources::{Prefab, PrefabIndex},
+};
use anyhow::{Result, bail};
use glam::Vec3A;
use std::{
@@ -61,17 +64,6 @@ pub enum Packet {
PrefabName(Resource<Prefab>, String),
}
-pub trait ReadWrite: Sized {
- fn write(&self, w: &mut dyn Write) -> Result<()>;
- fn read(r: &mut dyn Read) -> Result<Self>;
-
- fn write_alloc(&self) -> Vec<u8> {
- let mut buf = Vec::new();
- self.write(&mut buf).unwrap();
- buf
- }
-}
-
impl Object {
pub fn new() -> Self {
Self(rand::random())
@@ -152,16 +144,16 @@ impl ReadWrite for Packet {
0x00 => Packet::Connect(read_u128(r)?),
0x01 => Packet::RequestResource(Resource::read(r)?),
0x02 => Packet::RespondResource(Data::read(r)?),
- 0x03 => Packet::Add(Object(read_u128(r)?), Resource::read(r)?),
- 0x04 => Packet::Remove(Object(read_u128(r)?)),
+ 0x03 => Packet::Add(Object::read(r)?, Resource::read(r)?),
+ 0x04 => Packet::Remove(Object::read(r)?),
0x05 => Packet::Position(
- Object(read_u128(r)?),
+ Object::read(r)?,
Vec3A::new(f32::read(r)?, f32::read(r)?, f32::read(r)?),
Vec3A::new(f32::read(r)?, f32::read(r)?, f32::read(r)?),
),
- 0x06 => Packet::Pose(Object(read_u128(r)?), read_params(r)?),
- 0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)),
- 0x08 => Packet::Sound(Object(read_u128(r)?), Data::read(r)?),
+ 0x06 => Packet::Pose(Object::read(r)?, read_params(r)?),
+ 0x07 => Packet::Parent(Object::read(r)?, Object::read(r)?),
+ 0x08 => Packet::Sound(Object::read(r)?, Data::read(r)?),
0x09 => Packet::PrefabIndex(Resource::read(r)?),
0x0a => Packet::PrefabName(Resource::read(r)?, String::read(r)?),
_ => {
@@ -179,68 +171,7 @@ fn read_u128(r: &mut dyn Read) -> Result<u128> {
r.read_exact(&mut buf)?;
Ok(u128::from_be_bytes(buf))
}
-impl<T> ReadWrite for Resource<T> {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.0)?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut s = Self([0; 32], PhantomData);
- r.read_exact(&mut s.0)?;
- Ok(s)
- }
-}
-impl ReadWrite for Object {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.0.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut s = [0; 16];
- r.read_exact(&mut s)?;
- Ok(Object(u128::from_be_bytes(s)))
- }
-}
-
-impl ReadWrite for Data {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- self.0.write(w)
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- Ok(Self(Vec::read(r)?))
- }
-}
-impl ReadWrite for Vec<u8> {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&(self.len() as u32).to_be_bytes())?;
- w.write_all(&self)?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size = [0; 4];
- r.read_exact(&mut size)?;
- let size = u32::from_be_bytes(size);
- let mut buf = vec![0; size as usize];
- r.read_exact(&mut buf)?;
- Ok(buf)
- }
-}
-impl ReadWrite for String {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&(self.len() as u32).to_be_bytes())?;
- w.write_all(self.as_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut size = [0; 4];
- r.read_exact(&mut size)?;
- let size = u32::from_be_bytes(size);
- let mut buf = vec![0; size as usize];
- r.read_exact(&mut buf)?;
- Ok(String::from_utf8(buf)?)
- }
-}
fn read_params(r: &mut dyn Read) -> Result<Vec<f32>> {
let mut size = [0; 2];
r.read_exact(&mut size)?;
@@ -252,29 +183,6 @@ fn read_params(r: &mut dyn Read) -> Result<Vec<f32>> {
Ok(v)
}
-impl ReadWrite for f32 {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut buf = [0; 4];
- r.read_exact(&mut buf)?;
- Ok(f32::from_be_bytes(buf))
- }
-}
-impl ReadWrite for u32 {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- w.write_all(&self.to_be_bytes())?;
- Ok(())
- }
- fn read(r: &mut dyn Read) -> Result<Self> {
- let mut buf = [0; 4];
- r.read_exact(&mut buf)?;
- Ok(u32::from_be_bytes(buf))
- }
-}
-
impl<T> Display for Resource<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
@@ -293,18 +201,6 @@ impl<T> Debug for Resource<T> {
}
}
-impl<T: ReadWrite, const N: usize> ReadWrite for [T; N] {
- fn write(&self, w: &mut dyn Write) -> Result<()> {
- for e in self {
- e.write(w)?;
- }
- Ok(())
- }
-
- fn read(r: &mut dyn Read) -> Result<Self> {
- [(); N].try_map(|()| T::read(r))
- }
-}
impl Debug for Data {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("Data").finish_non_exhaustive()
diff --git a/shared/src/resources.rs b/shared/src/resources.rs
index 95f42e4..44d6e40 100644
--- a/shared/src/resources.rs
+++ b/shared/src/resources.rs
@@ -14,7 +14,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::packets::{ReadWrite, Resource};
+use crate::{helper::ReadWrite, packets::Resource};
use anyhow::Result;
use glam::{Affine3A, Vec3A};
use log::warn;
diff --git a/shared/src/store.rs b/shared/src/store.rs
index f63ed6c..976960e 100644
--- a/shared/src/store.rs
+++ b/shared/src/store.rs
@@ -14,7 +14,7 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::packets::{ReadWrite, Resource};
+use crate::{helper::ReadWrite, packets::Resource};
use anyhow::Result;
use redb::{Database, TableDefinition};
use sha2::{Digest, Sha256};