Skip to content
Snippets Groups Projects
roommodel.cpp 8.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "roommodel.h"
    
    
    #include <QMetaType>
    #include <QSharedPointer>
    
    #include <QDebug>
    
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    // Q_DECLARE_METATYPE(Room);
    
    Q_DECLARE_METATYPE(QSharedPointer<Room>);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    using mtx::events::Event;
    
    template <class T>::EventType::Type toRoomEventType(const Event<T> &e) {
        using mtx::events::EventType;
        switch (e.type) {
        case EventType::RoomKeyRequest:
            return ::EventType::KeyRequest;
        case EventType::RoomAliases:
            return ::EventType::Aliases;
        case EventType::RoomAvatar:
            return ::EventType::Avatar;
        case EventType::RoomCanonicalAlias:
            return ::EventType::CanonicalAlias;
        case EventType::RoomCreate:
            return ::EventType::Create;
        case EventType::RoomEncrypted:
            return ::EventType::Encrypted;
        case EventType::RoomEncryption:
            return ::EventType::Encryption;
        case EventType::RoomGuestAccess:
            return ::EventType::GuestAccess;
        case EventType::RoomHistoryVisibility:
            return ::EventType::HistoryVisibility;
        case EventType::RoomJoinRules:
            return ::EventType::JoinRules;
        case EventType::RoomMember:
            return ::EventType::Member;
        case EventType::RoomMessage:
            return ::EventType::UnknownMessage;
        case EventType::RoomName:
            return ::EventType::Name;
        case EventType::RoomPowerLevels:
            return ::EventType::PowerLevels;
        case EventType::RoomTopic:
            return ::EventType::Topic;
        case EventType::RoomRedaction:
            return ::EventType::Redaction;
        case EventType::RoomPinnedEvents:
            return ::EventType::PinnedEvents;
        case EventType::Sticker:
            return ::EventType::Sticker;
        case EventType::Tag:
            return ::EventType::Tag;
        case EventType::Unsupported:
        default:
            return ::EventType::Unsupported;
        }
    }
    
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Audio> &e) { return ::EventType::AudioMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Emote> &e) { return ::EventType::EmoteMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::File> &e) { return ::EventType::FileMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Image> &e) { return ::EventType::ImageMessage; }
    // ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Location> &e) { return
    // ::EventType::LocationMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Notice> &e) { return ::EventType::NoticeMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Text> &e) { return ::EventType::TextMessage; }
    ::EventType::Type toRoomEventType(const Event<mtx::events::msg::Video> &e) { return ::EventType::VideoMessage; }
    
    std::string Room::name() {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        qDebug() << "called name";
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        if (!name_.empty()) {
            return name_;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        }
        if (!canonical_alias.empty()) {
            qDebug() << "return alias" << QString::fromStdString(canonical_alias);
            return canonical_alias;
        }
        std::string heroes;
        for (const auto &m : members) {
            if (!heroes.empty())
                heroes += ", ";
            std::string hero_name = memberInfos[m].display_name;
            heroes += hero_name.empty() ? m : hero_name;
        }
    
        qDebug() << "return heroes" << QString::fromStdString(heroes);
        return heroes;
    }
    
    
    void Room::applyEvents(const std::vector<mtx::events::collections::TimelineEvent> &events) {
        using namespace mtx::events;
        for (const mtx::events::collections::TimelineEvent &e : events) {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            if (const auto ev = boost::get<StateEvent<state::Aliases>>(&e.data)) {
                if (this->canonical_alias.empty() && !ev->content.aliases.empty())
                    this->canonical_alias = ev->content.aliases.front();
            } else if (const auto ev = boost::get<StateEvent<state::Avatar>>(&e.data)) {
                this->avatar_url = ev->content.url;
            } else if (const auto ev = boost::get<StateEvent<state::CanonicalAlias>>(&e.data)) {
                this->canonical_alias = ev->content.alias;
            } else if (const auto ev = boost::get<StateEvent<state::Create>>(&e.data)) {
                this->members.insert(ev->content.creator);
            } else if (const auto ev = boost::get<StateEvent<state::Encryption>>(&e.data)) {
            } else if (const auto ev = boost::get<StateEvent<state::GuestAccess>>(&e.data)) {
            } else if (const auto ev = boost::get<StateEvent<state::HistoryVisibility>>(&e.data)) {
            } else if (const auto ev = boost::get<StateEvent<state::JoinRules>>(&e.data)) {
                this->join_rule = ev->content.join_rule;
            } else if (const auto ev = boost::get<StateEvent<state::Member>>(&e.data)) {
                switch (ev->content.membership) {
                case state::Membership::Join:
                case state::Membership::Invite:
                    this->members.insert(ev->sender);
                    this->memberInfos[ev->sender] =
                        MemberInfo{ev->content.avatar_url, ev->content.display_name, ev->sender};
                    break;
                case state::Membership::Ban:
                case state::Membership::Leave:
                    this->members.erase(ev->sender);
                    this->memberInfos.erase(ev->sender);
                    break;
                }
            } else if (const auto ev = boost::get<StateEvent<state::Name>>(&e.data))
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                this->name_ = ev->content.name;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            else if (const auto ev = boost::get<StateEvent<state::PinnedEvents>>(&e.data)) {
            } else if (const auto ev = boost::get<StateEvent<state::PowerLevels>>(&e.data)) {
            } else if (const auto ev = boost::get<StateEvent<state::Topic>>(&e.data)) {
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                this->topic = ev->content.topic;
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            } else if (const auto ev = boost::get<EncryptedEvent<msg::Encrypted>>(&e.data)) {
            } else if (const auto ev = boost::get<RedactionEvent<msg::Redaction>>(&e.data)) {
            } else if (const auto ev = boost::get<Sticker>(&e.data)) {
            } else if (const auto ev = boost::get<RoomEvent<msg::Redacted>>(&e.data)) {
            } else if (const auto ev = boost::get<RoomEvent<msg::Audio>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
            } else if (const auto ev = boost::get<RoomEvent<msg::Emote>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
            } else if (const auto ev = boost::get<RoomEvent<msg::File>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
            } else if (const auto ev = boost::get<RoomEvent<msg::Image>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
            } else if (const auto ev = boost::get<RoomEvent<msg::Notice>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
            }
    
    
            else if (const auto ev = boost::get<RoomEvent<msg::Text>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            } else if (const auto ev = boost::get<RoomEvent<msg::Video>>(&e.data)) {
                this->msgInfo.body = QString::fromStdString(ev->content.body);
                this->lastMessage = ev->content.body;
                this->msgInfo.userid = QString::fromStdString(ev->sender);
    
            }
        }
        this->events.insert(this->events.end(), events.begin(), events.end());
    }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    
    QHash<int, QByteArray> Room::roleNames() const {
        QHash<int, QByteArray> roles;
        roles[Type] = "Type";
        roles[Body] = "Body";
        roles[UserId] = "UserId";
        roles[UserName] = "UserName";
        return roles;
    }
    
    int Room::rowCount(const QModelIndex &parent) const { return (int)events.size(); }
    
    QVariant Room::data(const QModelIndex &index, int role) const {
        if (index.row() > (int)events.size() || index.row() < 0)
            return QVariant();
    
        auto event = events.at(index.row());
        switch (role) {
    
        case Type:
            return boost::apply_visitor([](const auto &e) -> ::EventType::Type { return toRoomEventType(e); }, event.data);
        default:
            return QVariant();
        }
    }