87 lines
2.0 KiB
Rust
87 lines
2.0 KiB
Rust
use crate::constants::IMAGE_SERVICE;
|
|
use nostr_sdk::prelude::*;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct NostrProfile {
|
|
public_key: PublicKey,
|
|
metadata: Metadata,
|
|
}
|
|
|
|
impl AsRef<PublicKey> for NostrProfile {
|
|
fn as_ref(&self) -> &PublicKey {
|
|
&self.public_key
|
|
}
|
|
}
|
|
|
|
impl AsRef<Metadata> for NostrProfile {
|
|
fn as_ref(&self) -> &Metadata {
|
|
&self.metadata
|
|
}
|
|
}
|
|
|
|
impl Eq for NostrProfile {}
|
|
|
|
impl PartialEq for NostrProfile {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
self.public_key() == other.public_key()
|
|
}
|
|
}
|
|
|
|
impl NostrProfile {
|
|
pub fn new(public_key: PublicKey, metadata: Metadata) -> Self {
|
|
Self {
|
|
public_key,
|
|
metadata,
|
|
}
|
|
}
|
|
|
|
/// Get contact's public key
|
|
pub fn public_key(&self) -> PublicKey {
|
|
self.public_key
|
|
}
|
|
|
|
/// Get contact's avatar
|
|
pub fn avatar(&self) -> String {
|
|
if let Some(picture) = &self.metadata.picture {
|
|
if picture.len() > 1 {
|
|
format!(
|
|
"{}/?url={}&w=100&h=100&fit=cover&mask=circle&n=-1",
|
|
IMAGE_SERVICE, picture
|
|
)
|
|
} else {
|
|
"brand/avatar.png".into()
|
|
}
|
|
} else {
|
|
"brand/avatar.png".into()
|
|
}
|
|
}
|
|
|
|
/// Get contact's name, fallback to public key as shorted format
|
|
pub fn name(&self) -> String {
|
|
if let Some(display_name) = &self.metadata.display_name {
|
|
if !display_name.is_empty() {
|
|
return display_name.to_owned();
|
|
}
|
|
}
|
|
|
|
if let Some(name) = &self.metadata.name {
|
|
if !name.is_empty() {
|
|
return name.to_owned();
|
|
}
|
|
}
|
|
|
|
let pubkey = self.public_key.to_string();
|
|
format!("{}:{}", &pubkey[0..4], &pubkey[pubkey.len() - 4..])
|
|
}
|
|
|
|
/// Get contact's metadata
|
|
pub fn metadata(&mut self) -> &Metadata {
|
|
&self.metadata
|
|
}
|
|
|
|
/// Set contact's metadata
|
|
pub fn set_metadata(&mut self, metadata: &Metadata) {
|
|
self.metadata = metadata.clone()
|
|
}
|
|
}
|