use std::sync::Mutex;
use std::time::SystemTime;
use serde::{Serialize, Deserialize};
use bincode;
use super::keychain::KeyChain;
use crate::peer::*;
#[cfg(feature = "regular_history")]
mod history_regular;
#[cfg(feature = "regular_history")]
pub use history_regular::*;
#[cfg(feature = "sync_safe_history")]
mod history_safe;
#[cfg(feature = "sync_safe_history")]
pub use history_safe::*;
#[derive(Debug, Clone, Copy)]
pub enum Chat {
OneToOne,
Group,
Channel,
}
#[derive(Debug, Clone)]
pub struct Message {
pub sender: Peer,
pub timestamp: u64,
pub key: [u8; 32],
pub is_encrypted: bool,
pub data: Vec<u8>
}
impl Message {
pub fn new(
sender: Peer,
data: impl AsRef<[u8]>,
key: [u8; 32]
) -> Message {
Message {
sender,
timestamp: SystemTime::now().elapsed().unwrap().as_secs(),
key: key,
is_encrypted: false,
data: data.as_ref().to_owned(),
}
}
pub fn new_encrypted(
sender: Peer,
data: &impl AsRef<[u8]>,
key: [u8; 32]
) -> Message {
Message {
sender,
timestamp: SystemTime::now().elapsed().unwrap().as_secs(),
key: key,
is_encrypted: true,
data: data.as_ref().to_owned(),
}
}
pub fn new_received(
sender: Peer,
data: &impl AsRef<[u8]>,
key: [u8; 32],
timestamp: u64
) -> Message {
Message {
sender,
timestamp: timestamp,
key: key,
is_encrypted: false,
data: data.as_ref().to_owned(),
}
}
pub fn new_received_encrypted(
sender: Peer,
data: &impl AsRef<[u8]>,
key: [u8; 32],
timestamp: u64,
) -> Message {
Message {
sender,
timestamp: timestamp,
key: key,
is_encrypted: true,
data: data.as_ref().to_owned(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
pub struct ChatSynchronizer {
pub chat_id: [u8; 32],
pub timestamp: u64
}
impl ChatSynchronizer {
pub fn new(
chat_id: [u8; 32],
timestamp: u64
) -> ChatSynchronizer {
ChatSynchronizer { chat_id, timestamp }
}
pub fn serialize(&self) -> Vec<u8> {
bincode::serialize(&self).unwrap()
}
#[track_caller]
pub fn deserialize(bytes: Vec<u8>) -> ChatSynchronizer {
match bincode::deserialize(&bytes) {
Ok(chat_sync) => chat_sync,
Err(_) => panic!("Wrong size of `ChatSynchronizer`"),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ChatSynchronizers {
chat_syncs: Vec<ChatSynchronizer>
}
impl ChatSynchronizers {
pub fn serialize(&self) -> Vec<u8> {
bincode::serialize(&self).unwrap()
}
#[track_caller]
pub fn deserialize(bytes: Vec<u8>) -> ChatSynchronizers {
match bincode::deserialize(&bytes) {
Ok(chat_syncs) => chat_syncs,
Err(_) => panic!("Wrong size of `ChatSynchronizers`"),
}
}
}