Skip to content

Commit 97f0cae

Browse files
fix: cleanup merge (-shown reactions)
1 parent d2cdcc5 commit 97f0cae

File tree

9 files changed

+42
-63
lines changed

9 files changed

+42
-63
lines changed

src/chat/src/channel.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
use std::{fmt::Debug, sync::Arc};
22

33
use tokio::sync::broadcast;
4-
4+
use tokio::sync::broadcast::Receiver;
55
use crate::reaction::ReactionEvent;
66
use crate::{async_list::AsyncList, message::Message};
77

8+
89
pub trait Channel: AsyncList<Content = Self::Message> + Send + Sync + Clone {
910
type Message: Message<Identifier = Self::Identifier>;
1011
type Identifier: Sized + Copy + Clone + Debug + Eq + PartialEq;
1112

1213
fn get_message_receiver(&self) -> broadcast::Receiver<Self::Message>;
13-
fn get_reaction_receiver(&self) -> broadcast::Receiver<ReactionEvent>;
14+
fn get_reaction_receiver(&self) -> broadcast::Receiver<ReactionEvent<Self::Identifier>>;
1415

1516
fn send_message(&self, content: String, nonce: String) -> Self::Message;
1617

@@ -25,8 +26,12 @@ impl<C: Channel> Channel for Arc<C> {
2526
(**self).get_identifier()
2627
}
2728

28-
fn get_receiver(&self) -> broadcast::Receiver<Self::Message> {
29-
(**self).get_receiver()
29+
fn get_message_receiver(&self) -> Receiver<Self::Message> {
30+
(**self).get_message_receiver()
31+
}
32+
33+
fn get_reaction_receiver(&self) -> Receiver<ReactionEvent<Self::Identifier>> {
34+
(**self).get_reaction_receiver()
3035
}
3136

3237
fn send_message(&self, content: String, nonce: String) -> Self::Message {

src/chat/src/reaction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::fmt::{Debug, Formatter};
22
use gpui::{IntoElement, Rgba};
33

4-
pub type ReactionEvent = (String, ReactionOperation);
4+
pub type ReactionEvent<T> = (T, ReactionOperation);
55

66
#[derive(Copy, Clone, Debug)]
77
pub enum MessageReactionType {

src/discord/src/channel/mod.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
use std::sync::{Arc, OnceLock};
22

3-
use crate::{
4-
client::DiscordClient,
5-
message::{content::DiscordMessageContent, DiscordMessage},
6-
snowflake::Snowflake,
7-
};
83
use chrono::Utc;
94
use scope_backend_cache::async_list::{refcacheslice::Exists, AsyncListCache};
105
use scope_chat::reaction::ReactionEvent;
@@ -24,7 +19,7 @@ use crate::{
2419
pub struct DiscordChannel {
2520
channel: Arc<serenity::model::channel::Channel>,
2621
message_receiver: broadcast::Receiver<DiscordMessage>,
27-
reaction_receiver: broadcast::Receiver<ReactionEvent>,
22+
reaction_receiver: broadcast::Receiver<ReactionEvent<Snowflake>>,
2823
client: Arc<DiscordClient>,
2924
cache: Arc<Mutex<AsyncListCache<DiscordMessage>>>,
3025
blocker: Semaphore,
@@ -58,7 +53,7 @@ impl Channel for DiscordChannel {
5853
self.message_receiver.resubscribe()
5954
}
6055

61-
fn get_reaction_receiver(&self) -> broadcast::Receiver<ReactionEvent> {
56+
fn get_reaction_receiver(&self) -> broadcast::Receiver<ReactionEvent<Snowflake>> {
6257
self.reaction_receiver.resubscribe()
6358
}
6459

@@ -82,7 +77,7 @@ impl Channel for DiscordChannel {
8277
list_item_id: Snowflake::random(),
8378
},
8479
content: OnceLock::new(),
85-
reactions: Default::default()
80+
reactions: Default::default(),
8681
}
8782
}
8883

src/discord/src/client.rs

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,11 @@ use std::{
33
sync::{Arc, OnceLock, Weak},
44
};
55

6-
use crate::{
7-
channel::DiscordChannel,
8-
message::{
9-
author::{DiscordMessageAuthor, DisplayName},
10-
DiscordMessage,
11-
},
12-
snowflake::Snowflake,
13-
};
14-
use scope_chat::reaction::{MessageReactionType, ReactionEvent, ReactionOperation};
15-
use serenity::all::Reaction;
16-
use serenity::{
17-
all::{Cache, ChannelId, Context, CreateMessage, EventHandler, GatewayIntents, GetMessages, Http, Message, MessageId, Ready},
18-
async_trait,
19-
};
20-
use tokio::sync::{broadcast, RwLock};
216
use crate::message::reaction::discord_reaction_to_emoji;
227
use atomic_refcell::AtomicRefCell;
238
use dashmap::DashMap;
9+
use scope_chat::reaction::{MessageReactionType, ReactionEvent, ReactionOperation};
10+
use serenity::all::Reaction;
2411
use serenity::{
2512
all::{
2613
Cache, CacheHttp, ChannelId, Context, CreateMessage, EventHandler, GatewayIntents, GetMessages, GuildId, Http, Member, Message, MessageId,
@@ -53,7 +40,7 @@ impl CacheHttp for SerenityClient {
5340
#[derive(Default)]
5441
pub struct DiscordClient {
5542
channel_message_event_handlers: RwLock<HashMap<ChannelId, Vec<broadcast::Sender<DiscordMessage>>>>,
56-
channel_reaction_event_handlers: RwLock<HashMap<Snowflake, Vec<broadcast::Sender<ReactionEvent>>>>,
43+
channel_reaction_event_handlers: RwLock<HashMap<ChannelId, Vec<broadcast::Sender<ReactionEvent<Snowflake>>>>>,
5744
client: OnceLock<SerenityClient>,
5845
user: OnceLock<Arc<User>>,
5946
channels: RwLock<HashMap<ChannelId, Arc<DiscordChannel>>>,
@@ -108,7 +95,7 @@ impl DiscordClient {
10895
self.channel_message_event_handlers.write().await.entry(channel).or_default().push(sender);
10996
}
11097

111-
pub async fn add_channel_reaction_sender(&self, channel: Snowflake, sender: broadcast::Sender<ReactionEvent>) {
98+
pub async fn add_channel_reaction_sender(&self, channel: ChannelId, sender: broadcast::Sender<ReactionEvent<Snowflake>>) {
11299
self.channel_reaction_event_handlers.write().await.entry(channel).or_default().push(sender);
113100
}
114101

@@ -152,10 +139,10 @@ impl DiscordClient {
152139
Some(channel_id.message(self.discord().http.clone(), message_id).await.unwrap())
153140
}
154141

155-
async fn send_reaction_operation(&self, channel_id: Snowflake, message_id: MessageId, operation: ReactionOperation) {
142+
async fn send_reaction_operation(&self, channel_id: ChannelId, message_id: MessageId, operation: ReactionOperation) {
156143
if let Some(vec) = self.channel_reaction_event_handlers.read().await.get(&channel_id) {
157144
for sender in vec {
158-
let _ = sender.send((message_id.to_string(), operation.clone()));
145+
let _ = sender.send((message_id.into(), operation.clone()));
159146
}
160147
}
161148
}
@@ -194,47 +181,43 @@ impl EventHandler for DiscordClient {
194181
}
195182

196183
async fn reaction_add(&self, _: Context, reaction: Reaction) {
197-
let channel_snowflake = reaction.channel_id.into();
198-
199184
let ty = if reaction.burst {
200185
MessageReactionType::Burst
201186
} else {
202187
MessageReactionType::Normal
203188
};
204189

205190
let emoji = discord_reaction_to_emoji(&reaction.emoji);
191+
let me_id = self.user.get().expect("User not ready").id;
206192

207-
let operation = if reaction.member.is_none_or(|member| member.user.id.get() == self.user().id.parse::<u64>().unwrap()) {
193+
let operation = if reaction.member.is_none_or(|member| member.user.id == me_id) {
208194
ReactionOperation::AddSelf(emoji, ty)
209195
} else {
210196
ReactionOperation::Add(emoji, ty)
211197
};
212198

213-
self.send_reaction_operation(channel_snowflake, reaction.message_id, operation).await;
199+
self.send_reaction_operation(reaction.channel_id, reaction.message_id, operation).await;
214200
}
215201

216202
async fn reaction_remove(&self, _: Context, reaction: Reaction) {
217-
let channel_snowflake = reaction.channel_id.into();
218-
219203
let emoji = discord_reaction_to_emoji(&reaction.emoji);
204+
let me_id = self.user.get().expect("User not ready").id;
220205

221-
let operation = if reaction.member.is_none_or(|member| member.user.id.get() == self.user().id.parse::<u64>().unwrap()) {
206+
let operation = if reaction.member.is_none_or(|member| member.user.id == me_id) {
222207
ReactionOperation::RemoveSelf(emoji)
223208
} else {
224209
ReactionOperation::Remove(emoji)
225210
};
226211

227-
self.send_reaction_operation(channel_snowflake, reaction.message_id, operation).await;
212+
self.send_reaction_operation(reaction.channel_id, reaction.message_id, operation).await;
228213
}
229214

230215
async fn reaction_remove_all(&self, _: Context, channel_id: ChannelId, removed_from_message_id: MessageId) {
231-
let channel_snowflake = channel_id.into();
232-
self.send_reaction_operation(channel_snowflake, removed_from_message_id, ReactionOperation::RemoveAll).await;
216+
self.send_reaction_operation(channel_id, removed_from_message_id, ReactionOperation::RemoveAll).await;
233217
}
234218

235219
async fn reaction_remove_emoji(&self, _: Context, removed_reactions: Reaction) {
236-
let channel_snowflake = removed_reactions.channel_id.into();
237220
let emoji = discord_reaction_to_emoji(&removed_reactions.emoji);
238-
self.send_reaction_operation(channel_snowflake, removed_reactions.message_id, ReactionOperation::RemoveEmoji(emoji)).await;
221+
self.send_reaction_operation(removed_reactions.channel_id, removed_reactions.message_id, ReactionOperation::RemoveEmoji(emoji)).await;
239222
}
240223
}

src/discord/src/message/mod.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
use std::sync::{Arc, OnceLock};
22

33
use crate::message::reaction_list::DiscordReactionList;
4-
use author::{DiscordMessageAuthor, DisplayName};
4+
use author::DiscordMessageAuthor;
55
use chrono::{DateTime, Utc};
66
use content::DiscordMessageContent;
77
use gpui::{View, VisualContext, WindowContext};
8-
use gpui::{div, Element, IntoElement, ParentElement};
9-
use scope_chat::message::MessageAuthor;
108
use scope_chat::reaction::ReactionList;
119
use scope_chat::{async_list::AsyncListItem, message::Message};
1210
use serenity::all::{ModelError, Nonce};
@@ -35,7 +33,7 @@ pub struct DiscordMessage {
3533
pub channel: Arc<serenity::model::channel::Channel>,
3634
pub data: DiscordMessageData,
3735
pub content: OnceLock<View<DiscordMessageContent>>,
38-
pub reactions: Option<DiscordReactionList>,
36+
pub reactions: DiscordReactionList,
3937
}
4038

4139
impl DiscordMessage {
@@ -48,16 +46,11 @@ impl DiscordMessage {
4846
}
4947
.unwrap();
5048

51-
let reactions = msg.reactions.iter().map(reaction::DiscordMessageReaction::from_message).collect::<Vec<_>>();
52-
if !reactions.is_empty() {
53-
println!("Reactions: {:?}", reactions);
54-
}
55-
5649
Self {
5750
client,
5851
channel,
52+
reactions: (&msg.reactions).into(),
5953
data: DiscordMessageData::Received(msg, member),
60-
6154
content: OnceLock::new(),
6255
}
6356
}
@@ -71,8 +64,8 @@ impl DiscordMessage {
7164
Self {
7265
client,
7366
channel,
67+
reactions: (&msg.reactions).into(),
7468
data: DiscordMessageData::Received(msg, member),
75-
7669
content: OnceLock::new(),
7770
}
7871
}

src/discord/src/message/reaction_list.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ impl DiscordReactionList {
1414
}
1515
}
1616

17+
impl From<&Vec<serenity::all::MessageReaction>> for DiscordReactionList {
18+
fn from(reactions: &Vec<serenity::all::MessageReaction>) -> Self {
19+
DiscordReactionList {
20+
reactions: reactions.iter().map(DiscordMessageReaction::from_message).collect(),
21+
}
22+
}
23+
}
24+
1725
impl ReactionList for DiscordReactionList {
1826
fn get_reactions(&self) -> &Vec<impl MessageReaction> {
1927
&self.reactions

src/discord/src/snowflake.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,3 @@ impl From<MessageId> for Snowflake {
4040
}
4141
}
4242

43-
impl <T> From<T> for Snowflake where T: Into<u64> {
44-
fn from(content: T) -> Self {
45-
Snowflake { content: content.into() }
46-
}
47-
}

src/ui/src/channel/message_list.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ where
116116
});
117117
}
118118

119-
pub fn update_reaction(&mut self, cx: &mut ViewContext<Self>, reaction: ReactionEvent) {
119+
pub fn update_reaction(&mut self, cx: &mut ViewContext<Self>, reaction: ReactionEvent<T::Identifier>) {
120120
self.cache.update(cx, |borrow: &mut Vec<Element<Option<T::Content>>>, cx| {
121121
for item in borrow.iter_mut() {
122122
if let Element::Resolved(Some(haystack)) = item {
123-
if haystack.get_identifier() == reaction.0 {
123+
if haystack.get_identifier() == Some(reaction.0) {
124124
let reactions = haystack.get_reactions();
125125
reactions.apply(reaction.1);
126126

src/ui/src/channel/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub struct ChannelView<C: Channel + 'static> {
1414
}
1515

1616
impl<C: Channel + 'static> ChannelView<C> {
17-
pub fn create(ctx: &mut gpui::ViewContext<'_, ChannelView<C>>, channel: Arc<C>) -> Self {
17+
pub fn create(ctx: &mut gpui::ViewContext<'_, ChannelView<C>>, channel: Arc<C>) -> Self where <C as Channel>::Identifier: Send {
1818
let channel_message_listener = channel.get_message_receiver();
1919
let channel_reaction_listener = channel.get_reaction_receiver();
2020

0 commit comments

Comments
 (0)