Chunk loading

This commit is contained in:
2025-12-22 20:55:50 +01:00
parent 50a9699bb2
commit efeabe279f
6 changed files with 46 additions and 26 deletions
+1 -6
View File
@@ -1,9 +1,4 @@
use std::{
fs::{self, File},
path::PathBuf,
str::FromStr,
sync::Arc,
};
use std::{fs::File, path::PathBuf, str::FromStr, sync::Arc};
use rustyline::{DefaultEditor, error::ReadlineError};
use zip::ZipArchive;
+16
View File
@@ -0,0 +1,16 @@
use crate::{server::Server, types::message::ServerMessage, utils::client::Client};
use std::sync::Arc;
crate::logger!(LOGGER "Chunk Loader");
pub fn load_chunk(
server: &Arc<Server>,
client: &Client,
channel_id: &str,
chunk_id: usize,
) -> crate::Result<()> {
let mut chunk = server.db.get_chunk(channel_id, chunk_id)?;
chunk.reverse();
client.send(ServerMessage::Chunk(chunk))?;
Ok(())
}
+8
View File
@@ -1,3 +1,4 @@
pub mod chunk;
pub mod message;
use std::sync::Arc;
@@ -31,6 +32,13 @@ impl Server {
ClientMessage::DeleteMessage { message_id } => {
message::delete(self, client, *message_id)?
}
ClientMessage::LoadChunk {
chunk_id,
channel_id,
} => {
chunk::load_chunk(self, client, channel_id, *chunk_id)?;
}
},
WsMessage::Binary(b) => {
+1 -10
View File
@@ -1,6 +1,5 @@
use std::{
collections::HashSet,
fs::{self},
net::{TcpListener, TcpStream},
path::{Path, PathBuf},
sync::{
@@ -159,21 +158,13 @@ impl Server {
match self.wrap_err(&client, client.read_t::<types::handshake::ClientDetails>())? {
Some(types::message::WsMessage::Message(types::handshake::ClientDetails {
auth_token,
last_message,
..
})) => {
let auth_res = utils::auth::auth(self, &mut client, &auth_token);
let uuid = self.wrap_err(&client, auth_res)?;
self.wrap_err(
&client,
client.send(types::message::ServerMessage::Authenticated {
uuid,
messages: if let Some(i) = last_message {
self.wrap_err(&client, self.db.get_messages_after_id(i))?
} else {
self.wrap_err(&client, self.db.get_messages_after_id(0))?
},
}),
client.send(types::message::ServerMessage::Authenticated { uuid }),
)?;
}
Some(v) => {
+14 -4
View File
@@ -49,14 +49,16 @@ pub mod handshake {
pub struct ClientDetails {
pub version: String,
pub auth_token: String,
pub last_message: Option<i64>,
}
}
pub mod message {
use serde::{Deserialize, Serialize};
use crate::types::{Author, data};
use crate::types::{
Author,
data::{self, Message},
};
/// Messages sent *from the client* (user’s app) to the server
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -75,7 +77,14 @@ pub mod message {
},
/// Delete a message (if allowed)
DeleteMessage { message_id: i64 },
DeleteMessage {
message_id: i64,
},
LoadChunk {
channel_id: String,
chunk_id: usize,
},
}
/// Messages sent *from the server* to the client
@@ -85,7 +94,6 @@ pub mod message {
/// Successful authentication
Authenticated {
uuid: Author,
messages: Vec<data::Message>,
},
TempMessage {
@@ -121,6 +129,8 @@ pub mod message {
Shutdown {
message: String,
},
Chunk(Vec<Message>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
+6 -6
View File
@@ -103,16 +103,16 @@ impl Database {
Ok(None)
}
/// Get all messages with an ID greater than the given one
pub fn get_messages_after_id(&self, message_id: i64) -> Result<Vec<Message>> {
pub fn get_chunk(&self, channel_id: &str, chunk_id: usize) -> Result<Vec<Message>> {
let mut stmt = self.0.prepare(
"SELECT id, channel_id, user_id, contents, timestamp
FROM chat
WHERE id > ?1
ORDER BY id ASC",
FROM chat
WHERE channel_id = ?1
ORDER BY id DESC
LIMIT 16 OFFSET (?2 * 16)",
)?;
let rows = stmt.query_map(params![message_id], |row| {
let rows = stmt.query_map(params![channel_id, chunk_id], |row| {
Ok(Message {
id: row.get::<_, i64>(0)?,
channel_id: row.get::<_, String>(1)?,