use grammers_session::types::{PeerId, PeerRef};
use grammers_tl_types as tl;
use super::{Peer, PeerMap};
use crate::Client;
use crate::message::Message;
use crate::utils::peer_from_message;
#[derive(Debug, Clone)]
pub struct Dialog {
pub raw: tl::enums::Dialog,
pub peer: Peer,
pub last_message: Option<Message>,
}
impl Dialog {
pub(crate) fn new(
client: &Client,
dialog: tl::enums::Dialog,
messages: &mut Vec<tl::enums::Message>,
peers: PeerMap,
) -> Self {
let peer_id = match dialog {
tl::enums::Dialog::Dialog(ref dialog) => dialog.peer.clone().into(),
tl::enums::Dialog::Folder(ref dialog) => dialog.peer.clone().into(),
};
let peer = peers
.get(peer_id)
.expect("dialogs use an unknown peer")
.clone();
let message = messages
.iter()
.position(|m| peer_from_message(m).is_some_and(|p| PeerId::from(p) == peer_id))
.map(|i| messages.swap_remove(i));
Self {
last_message: message.map(|m| {
Message::from_raw(
client,
m,
Some(PeerRef {
id: peer.id(),
auth: peer.auth().unwrap(),
}),
peers.handle(),
)
}),
peer,
raw: dialog,
}
}
pub fn peer_id(&self) -> PeerId {
self.peer.id()
}
pub fn peer_ref(&self) -> PeerRef {
PeerRef {
id: self.peer.id(),
auth: self.peer.auth().unwrap(),
}
}
pub fn peer(&self) -> &Peer {
&self.peer
}
}