Newer
Older
#include <QMetaType>
#include <QSharedPointer>
Q_DECLARE_METATYPE(QSharedPointer<Room>);
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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() {
}
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) {
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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))
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)) {
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
} 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);
} 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());
}
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();
}
}