Skip to content

Commit 8e22e48

Browse files
committed
Ensure messages are unique
1 parent 3384136 commit 8e22e48

File tree

4 files changed

+23
-19
lines changed

4 files changed

+23
-19
lines changed

src/net.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl Display for EtherType {
6767

6868
#[derive(Clone, Debug, PartialEq, Eq)]
6969
pub enum Packet {
70-
Message(Id, String),
70+
Message(Id, Id, String),
7171
PresenceReq,
7272
Presence(Id, bool, String),
7373
Disconnect(Id),
@@ -76,7 +76,7 @@ pub enum Packet {
7676
impl Packet {
7777
fn tag(&self) -> u8 {
7878
match self {
79-
Packet::Message(_, _) => 0,
79+
Packet::Message(_, _, _) => 0,
8080
Packet::PresenceReq => 1,
8181
Packet::Presence(_, _, _) => 2,
8282
Packet::Disconnect(_) => 3,
@@ -86,10 +86,11 @@ impl Packet {
8686
fn deserialize(tag: u8, data: &[u8]) -> Option<Self> {
8787
match tag {
8888
0 => {
89-
let id: Id = data[..ID_SIZE].try_into().ok()?;
90-
let raw_str = smaz::decompress(&data[ID_SIZE..]).ok()?;
89+
let mid: Id = data[..ID_SIZE].try_into().ok()?;
90+
let id: Id = data[ID_SIZE..ID_SIZE * 2].try_into().ok()?;
91+
let raw_str = smaz::decompress(&data[ID_SIZE * 2..]).ok()?;
9192
let str = String::from_utf8(raw_str).ok()?;
92-
Some(Packet::Message(id, str))
93+
Some(Packet::Message(mid, id, str))
9394
}
9495
1 => Some(Packet::PresenceReq),
9596
2 => {
@@ -105,7 +106,9 @@ impl Packet {
105106

106107
fn serialize(&self) -> Vec<u8> {
107108
match self {
108-
Packet::Message(id, msg) => [id as &[u8], &smaz::compress(msg.as_bytes())].concat(),
109+
Packet::Message(mid, id, msg) => {
110+
[mid as &[u8], id, &smaz::compress(msg.as_bytes())].concat()
111+
}
109112
Packet::PresenceReq => vec![],
110113
Packet::Presence(id, is_join, str) => {
111114
[id as &[u8], &[*is_join as u8], str.as_bytes()].concat()

src/ui.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use std::thread;
1616

1717
use crossbeam_channel::unbounded;
1818
use cursive::backends::crossterm::crossterm::style::Stylize;
19-
use cursive::traits::Nameable;
20-
use cursive::views::{Dialog, LinearLayout, TextView};
19+
use cursive::views::{Dialog, LinearLayout};
2120

2221
use self::config::CONFIG;
2322
use self::dialog::interface::show_iface_dialog;
@@ -45,13 +44,13 @@ pub fn run() {
4544
while siv.is_running() {
4645
while let Ok(cmd) = ui_rx.try_recv() {
4746
match cmd {
48-
UICommand::NewMessage(username, id, msg) => {
49-
siv.call_on_name("chat_inner", |chat_inner: &mut LinearLayout| {
50-
chat_inner.add_child(
51-
TextView::new(format!("[{username}] {msg}"))
52-
.with_name(format!("{id:x?}_msg")),
53-
);
54-
});
47+
UICommand::NewMessage(mid, username, msg) => {
48+
update_or_append_txt(
49+
&mut siv,
50+
"chat_inner",
51+
&format!("{mid:x?}_msg"),
52+
format!("[{username}] {msg}"),
53+
);
5554
}
5655
UICommand::UpdateUsername(new_username) => {
5756
if new_username == username {

src/ui/net_thread.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ pub(super) fn start_net_thread(tx: Sender<UICommand>, rx: Receiver<NetCommand>)
5858
match rx.try_recv() {
5959
Ok(NetCommand::SetInterface(_)) => Err(ArpchatError::InterfaceAlreadySet)?,
6060
Ok(NetCommand::SetEtherType(ether_type)) => channel.set_ether_type(ether_type),
61-
Ok(NetCommand::SendMessage(msg)) => channel.send(Packet::Message(id, msg))?,
61+
Ok(NetCommand::SendMessage(msg)) => {
62+
channel.send(Packet::Message(rand::thread_rng().gen(), id, msg))?
63+
}
6264
Ok(NetCommand::UpdateUsername(new_username)) => {
6365
username = new_username;
6466
if state == NetThreadState::NeedsUsername {
@@ -75,12 +77,12 @@ pub(super) fn start_net_thread(tx: Sender<UICommand>, rx: Receiver<NetCommand>)
7577
}
7678

7779
match channel.try_recv()? {
78-
Some(Packet::Message(id, msg)) => {
80+
Some(Packet::Message(mid, id, msg)) => {
7981
let username = match online.get(&id) {
8082
Some((_, username)) => username.clone(),
8183
None => "unknown".to_string(),
8284
};
83-
tx.send(UICommand::NewMessage(username, id, msg)).unwrap()
85+
tx.send(UICommand::NewMessage(mid, username, msg)).unwrap()
8486
}
8587
Some(Packet::PresenceReq) => {
8688
if state == NetThreadState::NeedsInitialPresence {

src/ui/util.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub enum UICommand {
1717
SendMessage(String),
1818
SetInterface(String),
1919
SetEtherType(EtherType),
20-
NewMessage(String, Id, String),
20+
NewMessage(Id, String, String),
2121
PresenceUpdate(Id, String, bool, UpdatePresenceKind),
2222
RemovePresence(Id, String),
2323
Error(ArpchatError),

0 commit comments

Comments
 (0)