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