update sender info mapper

This commit is contained in:
Mojtaba Chenani
2026-08-26 18:23:18 +02:00
parent 016c024be9
commit 351f428e57
2 changed files with 35 additions and 31 deletions
+31 -29
View File
@@ -7,21 +7,12 @@ use arboard::Clipboard;
use crossbeam_channel::Receiver;
use logos_chat::{
AccountDirectory, ChatClient, ChatStore, ConversationClass, Event, GroupMetadata,
MessageSender, RegistrationService, Transport,
RegistrationService, Transport,
};
use serde::{Deserialize, Serialize};
use crate::utils::now;
/// Who a displayed message is attributed to. `Foreign` carries a short sender
/// label; `Own` is us (and, for now, system output). Leaves room to grow —
/// e.g. a `System` variant for membership/metadata notices.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MessageOrigin {
Own,
Foreign(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DisplayMessage {
pub from_self: bool,
@@ -30,32 +21,32 @@ pub struct DisplayMessage {
pub message_id: Option<String>,
#[serde(default)]
pub delivered_to: Vec<String>,
/// Who sent this message; attributes incoming group messages.
/// Who this message is attributed to: our own account vs. a peer (by account
/// address). The display name is resolved from the account at render time.
pub origin: MessageOrigin,
}
impl DisplayMessage {
fn new(from_self: bool, content: String) -> Self {
fn new(from_self: bool, content: String, origin: MessageOrigin) -> Self {
Self {
from_self,
content,
timestamp: now(),
message_id: None,
delivered_to: Vec::new(),
origin: MessageOrigin::Own,
origin,
}
}
}
/// Short display label for a message's sender: the account (or device) id,
/// truncated. Friendly naming (contacts/aliases) is a later phase.
fn sender_label(sender: &MessageSender) -> String {
let id = sender
.account
.as_ref()
.map(|a| a.as_str())
.unwrap_or_else(|| sender.local_identity.as_str());
id[..8.min(id.len())].to_string()
/// Attribution of a displayed message. `Own` is our own account (any of our
/// devices); `Foreign` carries the sender's resolved account address, which the
/// app maps to a display name. (Client resolves credential → account; the app
/// resolves account → name.)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MessageOrigin {
Own,
Foreign(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -241,13 +232,21 @@ where
sender,
} => {
let chat_id = convo_id.to_string();
let label = sender_label(&sender);
// The client resolved the credential to an account; classify by it.
let origin = match sender.account.as_ref().map(|a| a.as_str()) {
Some(account) if account == self.client.addr() => MessageOrigin::Own,
Some(account) => MessageOrigin::Foreign(account.to_string()),
// Unassociated device — no account claim; fall back to its signer id.
None => MessageOrigin::Foreign(sender.local_identity.as_str().to_string()),
};
let Some(session) = self.state.chats.get_mut(&chat_id) else {
return;
};
let mut message =
DisplayMessage::new(false, String::from_utf8_lossy(&content).into_owned());
message.origin = MessageOrigin::Foreign(label);
let message = DisplayMessage::new(
false,
String::from_utf8_lossy(&content).into_owned(),
origin,
);
session.messages.push(message);
}
Event::MessageAcked {
@@ -324,7 +323,7 @@ where
.map_err(|e| anyhow::anyhow!("{e:?}"))?;
if let Some(session) = self.state.chats.get_mut(&chat_id) {
let mut message = DisplayMessage::new(true, content.to_string());
let mut message = DisplayMessage::new(true, content.to_string(), MessageOrigin::Own);
// Kept so `MessageAcked` can find this message again.
message.message_id = Some(message_id);
session.messages.push(message);
@@ -335,8 +334,11 @@ where
}
fn add_system_message(&mut self, content: &str) {
self.command_output
.push(DisplayMessage::new(true, content.to_string()));
self.command_output.push(DisplayMessage::new(
true,
content.to_string(),
MessageOrigin::Own,
));
}
pub fn handle_command(&mut self, cmd: &str) -> Result<Option<String>> {
+4 -2
View File
@@ -115,9 +115,11 @@ where
let (prefix, style) = if msg.from_self {
("You".to_string(), Style::default().fg(Color::Green))
} else if is_group {
// App resolves a display name from the sender's account address —
// a truncation for now; a contacts/accounts lookup slots in here.
let label = match &msg.origin {
crate::app::MessageOrigin::Foreign(name) => name.as_str(),
crate::app::MessageOrigin::Own => remote_name,
crate::app::MessageOrigin::Own => "you",
crate::app::MessageOrigin::Foreign(account) => &account[..8.min(account.len())],
};
(label.to_string(), Style::default().fg(Color::Yellow))
} else {