@@ -2,9 +2,12 @@ use enostr::FullKeypair;
2
2
use nostrdb:: { Note , NoteBuilder , NoteReply } ;
3
3
use std:: collections:: HashSet ;
4
4
5
+ use crate :: media_upload:: Nip94Event ;
6
+
5
7
pub struct NewPost {
6
8
pub content : String ,
7
9
pub account : FullKeypair ,
10
+ pub media : Vec < Nip94Event > ,
8
11
}
9
12
10
13
fn add_client_tag ( builder : NoteBuilder < ' _ > ) -> NoteBuilder < ' _ > {
@@ -15,26 +18,36 @@ fn add_client_tag(builder: NoteBuilder<'_>) -> NoteBuilder<'_> {
15
18
}
16
19
17
20
impl NewPost {
18
- pub fn new ( content : String , account : FullKeypair ) -> Self {
19
- NewPost { content, account }
21
+ pub fn new ( content : String , account : FullKeypair , media : Vec < Nip94Event > ) -> Self {
22
+ NewPost {
23
+ content,
24
+ account,
25
+ media,
26
+ }
20
27
}
21
28
22
29
pub fn to_note ( & self , seckey : & [ u8 ; 32 ] ) -> Note {
23
- let mut builder = add_client_tag ( NoteBuilder :: new ( ) )
24
- . kind ( 1 )
25
- . content ( & self . content ) ;
30
+ let mut content = self . content . clone ( ) ;
31
+ append_urls ( & mut content, & self . media ) ;
32
+
33
+ let mut builder = add_client_tag ( NoteBuilder :: new ( ) ) . kind ( 1 ) . content ( & content) ;
26
34
27
35
for hashtag in Self :: extract_hashtags ( & self . content ) {
28
36
builder = builder. start_tag ( ) . tag_str ( "t" ) . tag_str ( & hashtag) ;
29
37
}
30
38
39
+ if !self . media . is_empty ( ) {
40
+ builder = add_imeta_tags ( builder, & self . media ) ;
41
+ }
42
+
31
43
builder. sign ( seckey) . build ( ) . expect ( "note should be ok" )
32
44
}
33
45
34
46
pub fn to_reply ( & self , seckey : & [ u8 ; 32 ] , replying_to : & Note ) -> Note {
35
- let builder = add_client_tag ( NoteBuilder :: new ( ) )
36
- . kind ( 1 )
37
- . content ( & self . content ) ;
47
+ let mut content = self . content . clone ( ) ;
48
+ append_urls ( & mut content, & self . media ) ;
49
+
50
+ let builder = add_client_tag ( NoteBuilder :: new ( ) ) . kind ( 1 ) . content ( & content) ;
38
51
39
52
let nip10 = NoteReply :: new ( replying_to. tags ( ) ) ;
40
53
@@ -96,25 +109,35 @@ impl NewPost {
96
109
builder = builder. start_tag ( ) . tag_str ( "p" ) . tag_str ( & hex:: encode ( id) ) ;
97
110
}
98
111
112
+ if !self . media . is_empty ( ) {
113
+ builder = add_imeta_tags ( builder, & self . media ) ;
114
+ }
115
+
99
116
builder
100
117
. sign ( seckey)
101
118
. build ( )
102
119
. expect ( "expected build to work" )
103
120
}
104
121
105
122
pub fn to_quote ( & self , seckey : & [ u8 ; 32 ] , quoting : & Note ) -> Note {
106
- let new_content = format ! (
123
+ let mut new_content = format ! (
107
124
"{}\n nostr:{}" ,
108
125
self . content,
109
126
enostr:: NoteId :: new( * quoting. id( ) ) . to_bech( ) . unwrap( )
110
127
) ;
111
128
129
+ append_urls ( & mut new_content, & self . media ) ;
130
+
112
131
let mut builder = NoteBuilder :: new ( ) . kind ( 1 ) . content ( & new_content) ;
113
132
114
133
for hashtag in Self :: extract_hashtags ( & self . content ) {
115
134
builder = builder. start_tag ( ) . tag_str ( "t" ) . tag_str ( & hashtag) ;
116
135
}
117
136
137
+ if !self . media . is_empty ( ) {
138
+ builder = add_imeta_tags ( builder, & self . media ) ;
139
+ }
140
+
118
141
builder
119
142
. start_tag ( )
120
143
. tag_str ( "q" )
@@ -143,6 +166,43 @@ impl NewPost {
143
166
}
144
167
}
145
168
169
+ fn append_urls ( content : & mut String , media : & Vec < Nip94Event > ) {
170
+ for ev in media {
171
+ content. push ( ' ' ) ;
172
+ content. push_str ( & ev. url ) ;
173
+ }
174
+ }
175
+
176
+ fn add_imeta_tags < ' a > ( builder : NoteBuilder < ' a > , media : & Vec < Nip94Event > ) -> NoteBuilder < ' a > {
177
+ let mut builder = builder;
178
+ for item in media {
179
+ builder = builder
180
+ . start_tag ( )
181
+ . tag_str ( "imeta" )
182
+ . tag_str ( & format ! ( "url {}" , item. url) ) ;
183
+
184
+ if let Some ( ox) = & item. ox {
185
+ builder = builder. tag_str ( & format ! ( "ox {ox}" ) ) ;
186
+ } ;
187
+ if let Some ( x) = & item. x {
188
+ builder = builder. tag_str ( & format ! ( "x {x}" ) ) ;
189
+ }
190
+ if let Some ( media_type) = & item. media_type {
191
+ builder = builder. tag_str ( & format ! ( "m {media_type}" ) ) ;
192
+ }
193
+ if let Some ( dims) = & item. dimensions {
194
+ builder = builder. tag_str ( & format ! ( "dim {}x{}" , dims. 0 , dims. 1 ) ) ;
195
+ }
196
+ if let Some ( bh) = & item. blurhash {
197
+ builder = builder. tag_str ( & format ! ( "blurhash {bh}" ) ) ;
198
+ }
199
+ if let Some ( thumb) = & item. thumb {
200
+ builder = builder. tag_str ( & format ! ( "thumb {thumb}" ) ) ;
201
+ }
202
+ }
203
+ builder
204
+ }
205
+
146
206
#[ cfg( test) ]
147
207
mod tests {
148
208
use super :: * ;
0 commit comments