110 lines
3.1 KiB
JavaScript
Raw Normal View History

2019-07-07 23:52:41 -04:00
// Copyright 2019 miruka
// This file is part of harmonyqml, licensed under LGPLv3.
"use strict"
2019-07-06 17:53:51 -04:00
Qt.include("../utils.js")
2019-07-06 17:29:32 -04:00
function typingTextFor(members, ourUserId) {
2019-07-18 05:18:13 -04:00
let profiles = []
let names = []
2019-07-18 05:18:13 -04:00
for (let member of members) {
if (member != ourUserId) { profiles.push(users.find(member)) }
2019-07-05 19:54:16 -04:00
}
profiles.sort((left, right) => {
2019-07-07 03:53:32 -04:00
if (left.displayName < right.displayName) { return -1 }
if (left.displayName > right.displayName) { return +1 }
return 0
})
2019-07-18 05:18:13 -04:00
for (let profile of profiles) {
2019-07-07 03:53:32 -04:00
names.push(coloredNameHtml(profile.displayName, profile.userId))
}
2019-07-05 19:54:16 -04:00
if (names.length == 0) { return "" }
if (names.length == 1) { return qsTr("%1 is typing...").arg(names[0]) }
2019-07-18 05:18:13 -04:00
let text = qsTr("%1 and %2 are typing...")
2019-07-05 19:54:16 -04:00
if (names.length == 2) { return text.arg(names[0]).arg(names[1]) }
return text.arg(names.slice(0, -1).join(", ")).arg(names.slice(-1)[0])
}
function onRoomUpdated(
userId, category, roomId, displayName, avatarUrl, topic,
members, typingMembers, inviterId
2019-07-05 19:54:16 -04:00
) {
roomCategories.upsert({userId, name: category}, {userId, name: category})
function find(category) {
2019-07-18 05:18:13 -04:00
let found = rooms.getIndices({userId, roomId, category}, 1)
return found.length > 0 ? found[0] : null
}
2019-07-18 05:18:13 -04:00
let replace = null
if (category == "Invites") { replace = find("Rooms") || find("Left") }
else if (category == "Rooms") { replace = find("Invites") || find("Left") }
else if (category == "Left") { replace = find("Invites") || find("Rooms")}
2019-07-18 05:18:13 -04:00
let item = {
typingText: typingTextFor(typingMembers, userId),
userId, category, roomId, displayName, avatarUrl, topic, members,
inviterId
}
if (replace === null) {
rooms.upsert({userId, roomId, category}, item)
} else {
rooms.set(replace, item)
}
}
function onRoomForgotten(userId, roomId) {
rooms.popWhere({userId, roomId})
}
function onTimelineEventReceived(
eventType, roomId, eventId, senderId, date, content,
contentType, isLocalEcho, showNameLine, translatable, targetUserId
) {
2019-07-18 05:18:13 -04:00
let item = {
eventType: py.getattr(eventType, "__name__"),
roomId, eventId, senderId, date, content, contentType, isLocalEcho,
showNameLine, translatable, targetUserId
2019-07-03 21:20:49 -04:00
}
if (isLocalEcho) {
timelines.append(item)
return
}
// Replace first matching local echo
2019-07-18 05:18:13 -04:00
let found = timelines.getIndices(
{roomId, senderId, content, "isLocalEcho": true}, 1, 250
)
2019-07-04 18:53:10 -04:00
2019-07-03 21:20:49 -04:00
if (found.length > 0) {
2019-07-04 16:01:44 -04:00
timelines.set(found[0], item)
}
// Multiple clients will emit duplicate events with the same eventId
else if (item.eventType == "OlmEvent" || item.eventType == "MegolmEvent") {
// Don't replace if an item with the same eventId is found in these
// cases, because it would be the ecrypted version of the event.
timelines.upsert({eventId}, item, false, 250)
}
else {
timelines.upsert({eventId}, item, true, 250)
2019-07-03 21:20:49 -04:00
}
}
2019-07-03 21:20:49 -04:00
var onTimelineMessageReceived = onTimelineEventReceived