Skip to content

Commit 7c3d3b8

Browse files
committed
Finished nonce checking
1 parent 62f7236 commit 7c3d3b8

File tree

7 files changed

+36
-12
lines changed

7 files changed

+36
-12
lines changed

src/chat/src/message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub trait Message: Clone {
44
fn get_author(&self) -> &impl MessageAuthor;
55
fn get_content(&self) -> impl Element;
66
fn get_identifier(&self) -> String;
7-
fn get_nonce(&self) -> Option<String>;
7+
fn get_nonce(&self) -> Option<&String>;
88
}
99

1010
pub trait MessageAuthor {

src/discord/src/channel/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,7 @@ impl Channel for DiscordChannel {
5252

5353
DiscordMessage {
5454
content: DiscordMessageContent { content, is_pending: true },
55-
author: DiscordMessageAuthor {
56-
display_name: DisplayName("Pending".to_owned()),
57-
icon: "".to_owned(),
58-
},
55+
author: self.client.user().clone(),
5956
id: Snowflake { content: 0 },
6057
nonce: Some(nonce),
6158
}

src/discord/src/client.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use crate::{
2626
pub struct DiscordClient {
2727
channel_message_event_handlers: RwLock<HashMap<Snowflake, Vec<broadcast::Sender<DiscordMessage>>>>,
2828
client: OnceLock<serenity::Client>,
29+
user: OnceLock<DiscordMessageAuthor>,
2930
}
3031

3132
impl DiscordClient {
@@ -51,6 +52,10 @@ impl DiscordClient {
5152
self.client.get().unwrap()
5253
}
5354

55+
pub fn user(&self) -> &DiscordMessageAuthor {
56+
self.user.get().unwrap()
57+
}
58+
5459
pub async fn add_channel_message_sender(&self, channel: Snowflake, sender: broadcast::Sender<DiscordMessage>) {
5560
self.channel_message_event_handlers.write().await.entry(channel).or_default().push(sender);
5661
}
@@ -72,7 +77,18 @@ struct RawClient(Arc<DiscordClient>);
7277
impl RawEventHandler for RawClient {
7378
async fn raw_event(&self, ctx: Context, ev: serenity::model::prelude::Event) {
7479
if let Event::Unknown(unk) = ev {
75-
// writeln!(&mut File::create(unk.kind).unwrap(), "{:#?}", unk.value);
80+
if unk.kind == "READY" {
81+
let user = unk.value.as_object().unwrap().get("user").unwrap().as_object().unwrap();
82+
83+
self.0.user.get_or_init(|| DiscordMessageAuthor {
84+
display_name: DisplayName(user.get("username").unwrap().as_str().unwrap().to_owned()),
85+
icon: format!(
86+
"https://cdn.discordapp.com/avatars/{}/{}",
87+
user.get("id").unwrap().as_str().unwrap(),
88+
user.get("avatar").unwrap().as_str().unwrap()
89+
),
90+
});
91+
}
7692
}
7793
}
7894
}

src/discord/src/message/content.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ pub struct DiscordMessageContent {
88

99
impl RenderOnce for DiscordMessageContent {
1010
fn render(self, _: &mut WindowContext) -> impl IntoElement {
11-
div().opacity(if self.is_pending { 0.5 } else { 1.0 }).child(self.content.clone())
11+
div().opacity(if self.is_pending { 0.25 } else { 1.0 }).child(self.content.clone())
1212
}
1313
}

src/discord/src/message/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ impl Message for DiscordMessage {
2929
self.id.to_string()
3030
}
3131

32-
fn get_nonce(&self) -> Option<String> {
33-
self.nonce.clone()
32+
fn get_nonce(&self) -> Option<&String> {
33+
self.nonce.as_ref()
3434
}
3535
}

src/ui/src/channel/message_list.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ impl<M: Message> MessageList<M> {
1919
}
2020

2121
pub fn add_external_message(&mut self, message: M) {
22+
if let Some((_, pending_index)) = self
23+
.pending_messages
24+
.iter()
25+
.zip(0..)
26+
.find(|(msg, _)| msg.get_nonce().map(|v1| message.get_nonce().map(|v2| v2 == v1).unwrap_or(false)).unwrap_or(false))
27+
{
28+
self.pending_messages.remove(pending_index);
29+
}
30+
2231
self.real_messages.push(message);
2332
}
2433

@@ -31,10 +40,10 @@ impl<M: Message> MessageList<M> {
3140
}
3241

3342
pub fn get(&self, index: usize) -> Option<&M> {
34-
if index >= self.pending_messages.len() {
35-
self.real_messages.get(index - self.pending_messages.len())
43+
if index >= self.real_messages.len() {
44+
self.pending_messages.get(index - self.real_messages.len())
3645
} else {
37-
self.pending_messages.get(index)
46+
self.real_messages.get(index)
3847
}
3948
}
4049

src/ui/src/channel/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ impl<M: Message + 'static> ChannelView<M> {
7575
channel_view.list_model.update(ctx, move |v, _| {
7676
v.add_pending_message(pending);
7777
});
78+
channel_view.list_state = channel_view.list_model.read(ctx).create_list_state();
79+
ctx.notify();
7880
}
7981
_ => {}
8082
})

0 commit comments

Comments
 (0)