tangled
alpha
login
or
join now
ethanholz.com
/
streamplace-chat-overlay
1
fork
atom
A Rust project for overlaying your stream.place chat in OBS
1
fork
atom
overview
issues
pulls
pipelines
refactor: split into smaller files in lib
ethanholz.com
2 weeks ago
98e2c385
d31de52a
verified
This commit was signed with the committer's
known signature
.
ethanholz.com
SSH Key Fingerprint:
SHA256:+6MQcSZ4BvZD0GRuPWxz1Tj8TssCmDtrV1VWhmNeW8s=
+72
-68
4 changed files
expand all
collapse all
unified
split
src
lib
chat_message.rs
handle_resolver.rs
lib.rs
main.rs
+23
src/lib/chat_message.rs
···
1
1
+
use maud::{Markup, Render, html};
2
2
+
use serde::{Deserialize, Serialize};
3
3
+
4
4
+
#[derive(Debug, Deserialize, Serialize)]
5
5
+
pub struct ChatMessage {
6
6
+
handle: String,
7
7
+
text: String,
8
8
+
}
9
9
+
10
10
+
impl ChatMessage {
11
11
+
pub fn new(handle: String, text: String) -> Self {
12
12
+
Self { handle, text }
13
13
+
}
14
14
+
}
15
15
+
16
16
+
impl Render for ChatMessage {
17
17
+
fn render(&self) -> Markup {
18
18
+
html! {
19
19
+
div class="handle" { (self.handle) };
20
20
+
div class="message" { (self.text) };
21
21
+
}
22
22
+
}
23
23
+
}
+44
src/lib/handle_resolver.rs
···
1
1
+
use jacquard::{CowStr, prelude::IdentityResolver, types::did::Did};
2
2
+
use jacquard_identity::{
3
3
+
JacquardResolver,
4
4
+
resolver::{PlcSource, ResolverOptions},
5
5
+
};
6
6
+
7
7
+
pub struct JacquardHandleResolver {
8
8
+
resolver: JacquardResolver,
9
9
+
}
10
10
+
11
11
+
impl JacquardHandleResolver {
12
12
+
pub fn new() -> Self {
13
13
+
let opts = ResolverOptions {
14
14
+
plc_source: PlcSource::slingshot_default(),
15
15
+
public_fallback_for_handle: true,
16
16
+
validate_doc_id: true,
17
17
+
..Default::default()
18
18
+
};
19
19
+
Self {
20
20
+
resolver: JacquardResolver::new(reqwest::Client::new(), opts).with_system_dns(),
21
21
+
}
22
22
+
}
23
23
+
}
24
24
+
25
25
+
impl Default for JacquardHandleResolver {
26
26
+
fn default() -> Self {
27
27
+
Self::new()
28
28
+
}
29
29
+
}
30
30
+
31
31
+
#[async_trait::async_trait]
32
32
+
impl HandleResolver for JacquardHandleResolver {
33
33
+
async fn resolve(&self, did: &Did<'_>) -> miette::Result<CowStr<'static>> {
34
34
+
// DID Doc
35
35
+
let out = self.resolver.resolve_did_doc_owned(did).await?;
36
36
+
// Get first handle
37
37
+
Ok(out.also_known_as.unwrap()[0].clone())
38
38
+
}
39
39
+
}
40
40
+
41
41
+
#[async_trait::async_trait]
42
42
+
pub trait HandleResolver {
43
43
+
async fn resolve(&self, did: &Did<'_>) -> miette::Result<CowStr<'static>>;
44
44
+
}
+2
-44
src/lib/lib.rs
···
1
1
-
use jacquard::{CowStr, prelude::IdentityResolver, types::did::Did};
2
2
-
use jacquard_identity::{
3
3
-
JacquardResolver,
4
4
-
resolver::{PlcSource, ResolverOptions},
5
5
-
};
6
6
-
7
7
-
pub struct JacquardHandleResolver {
8
8
-
resolver: JacquardResolver,
9
9
-
}
10
10
-
11
11
-
impl JacquardHandleResolver {
12
12
-
pub fn new() -> Self {
13
13
-
let opts = ResolverOptions {
14
14
-
plc_source: PlcSource::slingshot_default(),
15
15
-
public_fallback_for_handle: true,
16
16
-
validate_doc_id: true,
17
17
-
..Default::default()
18
18
-
};
19
19
-
Self {
20
20
-
resolver: JacquardResolver::new(reqwest::Client::new(), opts).with_system_dns(),
21
21
-
}
22
22
-
}
23
23
-
}
24
24
-
25
25
-
impl Default for JacquardHandleResolver {
26
26
-
fn default() -> Self {
27
27
-
Self::new()
28
28
-
}
29
29
-
}
30
30
-
31
31
-
#[async_trait::async_trait]
32
32
-
impl HandleResolver for JacquardHandleResolver {
33
33
-
async fn resolve(&self, did: &Did<'_>) -> miette::Result<CowStr<'static>> {
34
34
-
// DID Doc
35
35
-
let out = self.resolver.resolve_did_doc_owned(did).await?;
36
36
-
// Get first handle
37
37
-
Ok(out.also_known_as.unwrap()[0].clone())
38
38
-
}
39
39
-
}
40
40
-
41
41
-
#[async_trait::async_trait]
42
42
-
pub trait HandleResolver {
43
43
-
async fn resolve(&self, did: &Did<'_>) -> miette::Result<CowStr<'static>>;
44
44
-
}
1
1
+
pub mod chat_message;
2
2
+
pub mod handle_resolver;
+3
-24
src/main.rs
···
5
5
};
6
6
use jacquard_api::place_stream::chat::message::{Message, MessageRecord};
7
7
use jacquard_common::xrpc::subscription::TungsteniteSubscriptionClient;
8
8
-
use maud::{Markup, Render, html};
8
8
+
use maud::Render;
9
9
use miette::IntoDiagnostic;
10
10
use n0_future::StreamExt;
11
11
-
use serde::{Deserialize, Serialize};
12
12
-
use streamplace_chat_lib::{HandleResolver, JacquardHandleResolver};
11
11
+
use streamplace_chat_lib::chat_message::ChatMessage;
12
12
+
use streamplace_chat_lib::handle_resolver::{HandleResolver, JacquardHandleResolver};
13
13
use url::Url;
14
14
-
15
15
-
#[derive(Debug, Deserialize, Serialize)]
16
16
-
struct ChatMessage {
17
17
-
handle: String,
18
18
-
text: String,
19
19
-
}
20
20
-
21
21
-
impl ChatMessage {
22
22
-
fn new(handle: String, text: String) -> Self {
23
23
-
Self { handle, text }
24
24
-
}
25
25
-
}
26
26
-
27
27
-
impl Render for ChatMessage {
28
28
-
fn render(&self) -> Markup {
29
29
-
html! {
30
30
-
div class="handle" { (self.handle) };
31
31
-
div class="message" { (self.text) };
32
32
-
}
33
33
-
}
34
34
-
}
35
14
36
15
async fn handle_message<R>(msg: &JetstreamMessage<'_>, resolver: &R) -> Option<String>
37
16
where