get_private_messages function for Chat history
This commit is contained in:
@@ -1,8 +1,14 @@
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use nostr_sdk::prelude::*;
|
use nostr_sdk::prelude::*;
|
||||||
use crate::nips::nip17;
|
// Importiere das Message Struct aus nip17!
|
||||||
|
use crate::nips::nip17::{self, Message};
|
||||||
|
|
||||||
pub async fn send_private_message(client: &Client, receiver_pubkey: &str, message: &str) -> Result<EventId> {
|
pub async fn send_private_message(client: &Client, receiver_pubkey: &str, message: &str) -> Result<EventId> {
|
||||||
let receiver = PublicKey::parse(receiver_pubkey)?;
|
let receiver = PublicKey::parse(receiver_pubkey)?;
|
||||||
nip17::send_dm(client, receiver, message).await
|
nip17::send_dm(client, receiver, message).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rückgabetyp ist Vec<Message>
|
||||||
|
pub async fn get_private_messages(client: &Client, contact_npub: &str) -> Result<Vec<Message>> {
|
||||||
|
nip17::get_dm_messages(client, contact_npub).await
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ use nostr_sdk::prelude::*;
|
|||||||
|
|
||||||
// Wir importieren die Funktionen, um Tipparbeit zu sparen
|
// Wir importieren die Funktionen, um Tipparbeit zu sparen
|
||||||
use crate::functions::{new, messages, relays, get_contacts, create_contact};
|
use crate::functions::{new, messages, relays, get_contacts, create_contact};
|
||||||
|
use crate::nips::nip17::Message;
|
||||||
|
|
||||||
pub struct EasyNostr {
|
pub struct EasyNostr {
|
||||||
client: Client,
|
client: Client,
|
||||||
@@ -24,6 +25,10 @@ impl EasyNostr {
|
|||||||
messages::send_private_message(&self.client, receiver_pubkey, message).await
|
messages::send_private_message(&self.client, receiver_pubkey, message).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_private_messages(&self, contact_npub: &str) -> Result<Vec<Message>> {
|
||||||
|
messages::get_private_messages(&self.client, contact_npub).await
|
||||||
|
}
|
||||||
|
|
||||||
/// Fügt Relays hinzu und verbindet
|
/// Fügt Relays hinzu und verbindet
|
||||||
pub async fn add_relays(&self, urls: Vec<&str>) -> Result<()> {
|
pub async fn add_relays(&self, urls: Vec<&str>) -> Result<()> {
|
||||||
relays::add_relays(&self.client, urls).await
|
relays::add_relays(&self.client, urls).await
|
||||||
|
|||||||
@@ -1,7 +1,95 @@
|
|||||||
use nostr_sdk::prelude::*;
|
use nostr_sdk::prelude::*;
|
||||||
use anyhow::Result; // <--- Hinzufügen
|
use anyhow::Result;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
/// UI Message Struktur
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct Message {
|
||||||
|
pub id: EventId,
|
||||||
|
pub sender: PublicKey,
|
||||||
|
pub content: String,
|
||||||
|
pub created_at: Timestamp,
|
||||||
|
pub is_incoming: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Direktnachricht senden
|
||||||
pub async fn send_dm(client: &Client, receiver: PublicKey, message: &str) -> Result<EventId> {
|
pub async fn send_dm(client: &Client, receiver: PublicKey, message: &str) -> Result<EventId> {
|
||||||
let output = client.send_private_msg(receiver, message, None).await?;
|
let output = client.send_private_msg(receiver, message, None).await?;
|
||||||
Ok(*output.id())
|
Ok(*output.id())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Direktnachrichten abrufen
|
||||||
|
pub async fn get_dm_messages(client: &Client, contact_npub: &str) -> Result<Vec<Message>> {
|
||||||
|
let signer = client.signer().await?;
|
||||||
|
let my_pubkey = signer.get_public_key().await?;
|
||||||
|
let contact_pubkey = PublicKey::parse(contact_npub)?;
|
||||||
|
|
||||||
|
// --- Einzelne Filter erstellen ---
|
||||||
|
let filter_in = Filter::new()
|
||||||
|
.kinds([Kind::GiftWrap, Kind::EncryptedDirectMessage])
|
||||||
|
.pubkey(my_pubkey)
|
||||||
|
.since(Timestamp::now() - Duration::from_secs(60 * 60 * 24 * 30))
|
||||||
|
.limit(500);
|
||||||
|
|
||||||
|
let filter_out = Filter::new()
|
||||||
|
.kind(Kind::EncryptedDirectMessage)
|
||||||
|
.author(my_pubkey)
|
||||||
|
.pubkey(contact_pubkey)
|
||||||
|
.limit(100);
|
||||||
|
|
||||||
|
// --- Abrufen: zwei einzelne fetches, dann Ergebnisse mergen ---
|
||||||
|
let mut events = client.fetch_events(filter_in, Duration::from_secs(10)).await?;
|
||||||
|
let more_events = client.fetch_events(filter_out, Duration::from_secs(10)).await?;
|
||||||
|
events.extend(more_events.into_iter());
|
||||||
|
|
||||||
|
let mut messages: Vec<Message> = Vec::new();
|
||||||
|
|
||||||
|
for event in events.iter() {
|
||||||
|
// === NIP-17 (Gift Wrap) Verarbeitung ===
|
||||||
|
if event.kind == Kind::GiftWrap {
|
||||||
|
if let Ok(unwrapped) = client.unwrap_gift_wrap(event).await {
|
||||||
|
let rumor = unwrapped.rumor;
|
||||||
|
if rumor.pubkey == contact_pubkey && rumor.kind == Kind::TextNote {
|
||||||
|
messages.push(Message {
|
||||||
|
id: event.id,
|
||||||
|
sender: rumor.pubkey,
|
||||||
|
content: rumor.content.clone(),
|
||||||
|
created_at: rumor.created_at,
|
||||||
|
is_incoming: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// === NIP-04 (Legacy) Verarbeitung ===
|
||||||
|
else if event.kind == Kind::EncryptedDirectMessage {
|
||||||
|
// TagStandard::PublicKey ist ein Struct-Variant: Felder mit Struct-Syntax matchen
|
||||||
|
let has_contact_tag = event.tags.iter().any(|t| {
|
||||||
|
match t.as_standardized() {
|
||||||
|
Some(TagStandard::PublicKey { public_key, .. }) => *public_key == contact_pubkey,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let is_incoming = event.pubkey == contact_pubkey;
|
||||||
|
let is_outgoing = event.pubkey == my_pubkey && has_contact_tag;
|
||||||
|
|
||||||
|
if is_incoming || is_outgoing {
|
||||||
|
let counterparty = if is_incoming { event.pubkey } else { contact_pubkey };
|
||||||
|
if let Ok(content) = signer.nip04_decrypt(&counterparty, &event.content).await {
|
||||||
|
messages.push(Message {
|
||||||
|
id: event.id,
|
||||||
|
sender: event.pubkey,
|
||||||
|
content,
|
||||||
|
created_at: event.created_at,
|
||||||
|
is_incoming,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nachrichten chronologisch sortieren
|
||||||
|
messages.sort_by(|a, b| a.created_at.cmp(&b.created_at));
|
||||||
|
|
||||||
|
Ok(messages)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user