Der Status der angezeigten Nachricht
Jeder Kunde muss im Allgemeinen zeigen können, welches Peer welche Nachricht liest und wie viele ungeleste Nachrichten es gibt.
Dazu bietet der Daemon einige API:
Ein angezeigtes Nachrichten festlegen
Der Konfigurationsmanager stellt Folgendes fest:
<method name="setMessageDisplayed" tp:name-for-bindings="setMessageDisplayed">
<tp:added version="8.1.0"/>
<tp:docstring>
<p>Informs that a message have been read</p>
</tp:docstring>
<arg type="s" name="accountId" direction="in">
<tp:docstring>
The account ID
</tp:docstring>
</arg>
<arg type="s" name="conversationUri" direction="in">
<tp:docstring>
A conversation uri (swarm:xxxx or jami:xxxx)
</tp:docstring>
</arg>
<arg type="s" name="messageId" direction="in">
<tp:docstring>
The message ID
</tp:docstring>
</arg>
<arg type="i" name="status" direction="in">
<tp:docstring>
The message status, 3 for displayed
</tp:docstring>
</arg>
<arg type="b" name="success" direction="out">
<tp:docstring>
True if the message status was set, false if account, contact or message is unknown.
</tp:docstring>
</arg>
</method>
Es sollte geschehen, wenn die Interaktion angezeigt und das Gespräch ausgewählt wird.
Dies sendet SIP-Nachrichten an vernetzte Kollegen mit dem folgenden Format:
std::string
getDisplayed(const std::string& conversationId, const std::string& messageId)
{
// implementing https://tools.ietf.org/rfc/rfc5438.txt
return fmt::format(
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
"<imdn><message-id>{}</message-id>\n"
"{}"
"<display-notification><status><displayed/></status></display-notification>\n"
"</imdn>",
messageId,
conversationId.empty() ? "" : "<conversation>" + conversationId + "</conversation>");
}
Dann wird der Peer dies über onMessageDisplayed
wissen und dem Kunden ein Signal senden (libjami::ConfigurationSignal::AccountMessageStatusChanged
mit Status 3 (libjami::Account::MessageStates::DISPLAYED
))
Get unread messages
Durch das Wissen der letztenDisplayedMessage für unser Konto können wir diese Informationen und ConfigrationManager::countInteractionsSince
verwenden, die die Interaktion seit der letzten Nachricht bis zu einer bestimmten Nachricht (typischerweise die letzte angezeigte Interaktion) zählen.
Um die letzte angezeigte Nachricht für ein Mitglied zu erhalten, wird in Konfiguration::getConversationMembers
jedes Mitglied die letzte angezeigte Interaktion über `memberInfo[„lastDisplayed“]]] erhalten.
Wie diese Informationen gespeichert werden
In src/jamidht/conversation.cpp
speichert jede Konversation die letzten angezeigten Nachrichten in einer Karte<string, string> (uri, interactionId) und diese Struktur wird in fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed