Skip to content

Commit 0a37c32

Browse files
committed
added basic message sending
1 parent e875436 commit 0a37c32

File tree

14 files changed

+2078
-163
lines changed

14 files changed

+2078
-163
lines changed

Cargo.lock

Lines changed: 1925 additions & 117 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/chat/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
gpui = { git = "https://github.com/zed-industries/zed.git", version = "0.1.0" }
7+
gpui = { git = "https://github.com/huacnlee/zed.git", branch = "export-platform-window", default-features = false, features = ["http_client", "font-kit"] }
88
tokio = "1.41.1"

src/chat/src/channel.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ use tokio::sync::broadcast;
22

33
use crate::message::Message;
44

5-
pub trait Channel {
5+
pub trait Channel: Clone {
66
type Message: Message;
77

88
fn get_receiver(&self) -> broadcast::Receiver<Self::Message>;
9+
10+
fn send_message(&self, content: String, nonce: String) -> impl std::future::Future<Output = ()>;
911
}

src/chat/src/message.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +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>;
78
}
89

910
pub trait MessageAuthor {

src/discord/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
gpui = { git = "https://github.com/zed-industries/zed.git", version = "0.1.0" }
7+
gpui = { git = "https://github.com/huacnlee/zed.git", branch = "export-platform-window", default-features = false, features = ["http_client", "font-kit"] }
88
scope-chat = { version = "0.1.0", path = "../chat" }
99
serenity = { git = "https://github.com/scopeclient/serenity", version = "0.13.0" }
1010
tokio = "1.41.1"

src/discord/src/channel/mod.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ use crate::{client::DiscordClient, message::DiscordMessage, snowflake::Snowflake
88
pub struct DiscordChannel {
99
channel_id: Snowflake,
1010
receiver: broadcast::Receiver<DiscordMessage>,
11+
client: Arc<RwLock<DiscordClient>>
1112
}
1213

1314
impl DiscordChannel {
14-
pub async fn new(client: &mut Arc<RwLock<DiscordClient>>, channel_id: Snowflake) -> Self {
15+
pub async fn new(client: Arc<RwLock<DiscordClient>>, channel_id: Snowflake) -> Self {
1516
let (sender, receiver) = broadcast::channel(10);
1617

1718
client.write().await.add_channel_message_sender(channel_id, sender).await;
1819

19-
DiscordChannel { channel_id, receiver }
20+
DiscordChannel { channel_id, receiver, client }
2021
}
2122
}
2223

@@ -26,4 +27,20 @@ impl Channel for DiscordChannel {
2627
fn get_receiver(&self) -> broadcast::Receiver<Self::Message> {
2728
self.receiver.resubscribe()
2829
}
30+
31+
async fn send_message(&self, content: String, nonce: String) {
32+
println!("Sending: {:?}", content);
33+
34+
self.client.write().await.send_message(self.channel_id, content, nonce).await;
35+
}
36+
}
37+
38+
impl Clone for DiscordChannel {
39+
fn clone(&self) -> Self {
40+
Self {
41+
channel_id: self.channel_id.clone(),
42+
receiver: self.receiver.resubscribe(),
43+
client: self.client.clone()
44+
}
45+
}
2946
}

src/discord/src/client.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,26 @@ use crate::{
1919
#[derive(Default)]
2020
pub struct DiscordClient {
2121
channel_message_event_handlers: HashMap<Snowflake, Vec<broadcast::Sender<DiscordMessage>>>,
22+
client: Option<serenity::Client>
2223
}
2324

2425
impl DiscordClient {
2526
pub fn new(token: String) -> Arc<RwLock<DiscordClient>> {
2627
let client = Arc::new(RwLock::new(DiscordClient::default()));
2728
let remote = RemoteDiscordClient(client.clone());
29+
let async_client = client.clone();
2830

29-
tokio::spawn(async {
30-
let mut client = serenity::Client::builder(token, GatewayIntents::all()).event_handler(remote).await.expect("Error creating client");
31+
tokio::spawn(async move {
32+
let mut client = serenity::Client::builder(token, GatewayIntents::all())
33+
.event_handler(remote)
34+
.await
35+
.expect("Error creating client");
3136

3237
if let Err(why) = client.start().await {
3338
panic!("Client error: {why:?}");
3439
}
40+
41+
async_client.write().await.client = Some(client);
3542
});
3643

3744
client
@@ -40,6 +47,11 @@ impl DiscordClient {
4047
pub async fn add_channel_message_sender(&mut self, channel: Snowflake, sender: broadcast::Sender<DiscordMessage>) {
4148
self.channel_message_event_handlers.entry(channel).or_default().push(sender);
4249
}
50+
51+
pub async fn send_message(&mut self, channel_id: Snowflake, content: String, nonce: String) {
52+
println!("All the way to discord~! {:?} {:?}", channel_id, content);
53+
ChannelId::new(channel_id.content).send_message(self.client.as_ref().unwrap().http.clone(), CreateMessage::new().content(content).enforce_nonce(true).nonce(serenity::all::Nonce::String(nonce))).await.unwrap();
54+
}
4355
}
4456

4557
struct RemoteDiscordClient(Arc<RwLock<DiscordClient>>);
@@ -68,8 +80,12 @@ impl EventHandler for RemoteDiscordClient {
6880
icon: msg.author.avatar_url().unwrap_or(msg.author.default_avatar_url()),
6981
},
7082
content: DiscordMessageContent {
71-
content: msg.content.clone(),
83+
content: msg.content.clone()
7284
},
85+
nonce: msg.nonce.clone().map(|n| match n {
86+
Nonce::Number(n) => n.to_string(),
87+
Nonce::String(s) => s,
88+
})
7389
});
7490
}
7591
}

src/discord/src/message/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub struct DiscordMessage {
1313
pub content: DiscordMessageContent,
1414
pub author: DiscordMessageAuthor,
1515
pub id: Snowflake,
16+
pub nonce: Option<String>,
1617
}
1718

1819
impl Message for DiscordMessage {
@@ -27,4 +28,8 @@ impl Message for DiscordMessage {
2728
fn get_identifier(&self) -> String {
2829
self.id.to_string()
2930
}
31+
32+
fn get_nonce(&self) -> Option<String> {
33+
self.nonce.clone()
34+
}
3035
}

src/discord/src/snowflake.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#[derive(Clone, Hash, PartialEq, Eq, Copy)]
1+
#[derive(Clone, Hash, PartialEq, Eq, Copy, Debug)]
22
pub struct Snowflake {
33
pub content: u64,
44
}

src/ui/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ scope-backend-discord = { version = "0.1.0", path = "../discord" }
2424
dotenv = "0.15.0"
2525
env_logger = "0.11.5"
2626
tokio = { version = "1.41.1", features = ["full"] }
27+
components = { package = "ui", git = "https://github.com/longbridgeapp/gpui-component", version = "0.1.0" }
28+
log = "0.4.22"
29+
random-string = "1.1.0"
2730

2831
[features]
2932
default = ["gpui/x11"]

0 commit comments

Comments
 (0)