Tình trạng hiển thị thông điệp

Mỗi khách hàng nói chung phải có thể cho thấy những người đồng nghiệp đọc những tin nhắn nào và nhận biết có bao nhiêu tin nhắn chưa đọc.

Để làm điều này, con quỷ cung cấp một số API:

Đặt một tin nhắn hiển thị

Configuration manager cung cấp:

<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>

để đặt một tin nhắn như hiển thị. nên được thực hiện khi tương tác được hiển thị và cuộc trò chuyện được chọn.

Điều này gửi một tin nhắn SIP cho các đồng nghiệp kết nối với định dạng sau:

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>");
}

Sau đó, người đồng nghiệp sẽ biết điều này thông qua onMessageDisplayed và phát ra một tín hiệu cho khách hàng (libjami::ConfigurationSignal::AccountMessageStatusChanged với trạng thái 3 (libjami::Account::MessageStates::DISPLAYED))

Nhận tin nhắn chưa đọc

Bằng cách biết LastDisplayedMessage cho tài khoản của chúng tôi, chúng tôi có thể sử dụng thông tin này và ConfigrationManager::countInteractionsSince, tính tương tác từ thông điệp cuối cùng đến thông điệp nhất định (thường là tương tác cuối cùng được hiển thị)

Để có được thông điệp hiển thị cuối cùng cho một thành viên, trong Configuration::getConversationMembers mỗi thành viên sẽ có tương tác hiển thị cuối cùng có sẵn thông qua memberInfo["LastDisplayed"]

Cách lưu trữ thông tin này

Trong src/jamidht/conversation.cpp mỗi cuộc trò chuyện lưu trữ các tin nhắn cuối cùng được hiển thị trong một bản đồ<string, string> (uri, interactionId) và cấu trúc này được phân phối theo chuỗi trong fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed