Chunk loading
This commit is contained in:
+1
-6
@@ -1,9 +1,4 @@
|
|||||||
use std::{
|
use std::{fs::File, path::PathBuf, str::FromStr, sync::Arc};
|
||||||
fs::{self, File},
|
|
||||||
path::PathBuf,
|
|
||||||
str::FromStr,
|
|
||||||
sync::Arc,
|
|
||||||
};
|
|
||||||
|
|
||||||
use rustyline::{DefaultEditor, error::ReadlineError};
|
use rustyline::{DefaultEditor, error::ReadlineError};
|
||||||
use zip::ZipArchive;
|
use zip::ZipArchive;
|
||||||
|
|||||||
@@ -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(())
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
pub mod chunk;
|
||||||
pub mod message;
|
pub mod message;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@@ -31,6 +32,13 @@ impl Server {
|
|||||||
ClientMessage::DeleteMessage { message_id } => {
|
ClientMessage::DeleteMessage { message_id } => {
|
||||||
message::delete(self, client, *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) => {
|
WsMessage::Binary(b) => {
|
||||||
|
|||||||
+1
-10
@@ -1,6 +1,5 @@
|
|||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
fs::{self},
|
|
||||||
net::{TcpListener, TcpStream},
|
net::{TcpListener, TcpStream},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::{
|
sync::{
|
||||||
@@ -159,21 +158,13 @@ impl Server {
|
|||||||
match self.wrap_err(&client, client.read_t::<types::handshake::ClientDetails>())? {
|
match self.wrap_err(&client, client.read_t::<types::handshake::ClientDetails>())? {
|
||||||
Some(types::message::WsMessage::Message(types::handshake::ClientDetails {
|
Some(types::message::WsMessage::Message(types::handshake::ClientDetails {
|
||||||
auth_token,
|
auth_token,
|
||||||
last_message,
|
|
||||||
..
|
..
|
||||||
})) => {
|
})) => {
|
||||||
let auth_res = utils::auth::auth(self, &mut client, &auth_token);
|
let auth_res = utils::auth::auth(self, &mut client, &auth_token);
|
||||||
let uuid = self.wrap_err(&client, auth_res)?;
|
let uuid = self.wrap_err(&client, auth_res)?;
|
||||||
self.wrap_err(
|
self.wrap_err(
|
||||||
&client,
|
&client,
|
||||||
client.send(types::message::ServerMessage::Authenticated {
|
client.send(types::message::ServerMessage::Authenticated { uuid }),
|
||||||
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))?
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
Some(v) => {
|
Some(v) => {
|
||||||
|
|||||||
+14
-4
@@ -49,14 +49,16 @@ pub mod handshake {
|
|||||||
pub struct ClientDetails {
|
pub struct ClientDetails {
|
||||||
pub version: String,
|
pub version: String,
|
||||||
pub auth_token: String,
|
pub auth_token: String,
|
||||||
pub last_message: Option<i64>,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod message {
|
pub mod message {
|
||||||
use serde::{Deserialize, Serialize};
|
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
|
/// Messages sent *from the client* (user’s app) to the server
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
@@ -75,7 +77,14 @@ pub mod message {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/// Delete a message (if allowed)
|
/// 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
|
/// Messages sent *from the server* to the client
|
||||||
@@ -85,7 +94,6 @@ pub mod message {
|
|||||||
/// Successful authentication
|
/// Successful authentication
|
||||||
Authenticated {
|
Authenticated {
|
||||||
uuid: Author,
|
uuid: Author,
|
||||||
messages: Vec<data::Message>,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
TempMessage {
|
TempMessage {
|
||||||
@@ -121,6 +129,8 @@ pub mod message {
|
|||||||
Shutdown {
|
Shutdown {
|
||||||
message: String,
|
message: String,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Chunk(Vec<Message>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
|||||||
@@ -103,16 +103,16 @@ impl Database {
|
|||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get all messages with an ID greater than the given one
|
pub fn get_chunk(&self, channel_id: &str, chunk_id: usize) -> Result<Vec<Message>> {
|
||||||
pub fn get_messages_after_id(&self, message_id: i64) -> Result<Vec<Message>> {
|
|
||||||
let mut stmt = self.0.prepare(
|
let mut stmt = self.0.prepare(
|
||||||
"SELECT id, channel_id, user_id, contents, timestamp
|
"SELECT id, channel_id, user_id, contents, timestamp
|
||||||
FROM chat
|
FROM chat
|
||||||
WHERE id > ?1
|
WHERE channel_id = ?1
|
||||||
ORDER BY id ASC",
|
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 {
|
Ok(Message {
|
||||||
id: row.get::<_, i64>(0)?,
|
id: row.get::<_, i64>(0)?,
|
||||||
channel_id: row.get::<_, String>(1)?,
|
channel_id: row.get::<_, String>(1)?,
|
||||||
|
|||||||
Reference in New Issue
Block a user