Status van het bericht
Elke klant moet in het algemeen in staat zijn te laten zien welke e-mail door een collega wordt gelezen en te weten hoeveel ongelezen berichten er zijn.
Hiervoor biedt de daemon enkele API’s:
Een bericht laten zien
De Configuration manager geeft:
<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>
Dit moet gebeuren wanneer de interactie wordt getoond en het gesprek wordt geselecteerd.
Dit stuurt een SIP-berichten naar aangesloten collega’s met het volgende formaat:
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>");
}
Dan zal de peer dit via onMessageDisplayed
weten en een signaal naar de cliënt sturen (libjami::ConfigurationSignal::AccountMessageStatusChanged
met status 3 (libjami::Account::MessageStates::DISPLAYED
))
Ontvang ongelezen berichten
Door het laatsteDisplayedMessage voor ons account te kennen, kunnen we deze informatie en ConfigrationManager::countInteractionsSince
gebruiken, die interactie met elkaar tellen vanaf het laatste bericht tot aan een bepaald bericht (meestal de laatste interactie die wordt weergegeven)
Om het laatste weergegeven bericht voor een lid te krijgen, zal in Configuration::getConversationMembers
elk lid de laatste weergegeven interactie beschikbaar hebben via memberInfo["lastDisplayed"]
Hoe deze informatie wordt opgeslagen
In src/jamidht/conversation.cpp
wordt elk gesprek de laatste weergegeven berichten opslaan in een kaart<string, string> (uri, interactionId) en deze structuur wordt geserieerd in fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed