128 lines
3.1 KiB
JavaScript
128 lines
3.1 KiB
JavaScript
const {UngroupableEvent} = require("./event")
|
|
const {ejs} = require("../basic")
|
|
const {extractDisplayName, resolveMxc, extractLocalpart} = require("../functions")
|
|
|
|
class MembershipEvent extends UngroupableEvent {
|
|
constructor(data) {
|
|
super(data)
|
|
this.class("c-message-event")
|
|
this.senderName = extractDisplayName(data)
|
|
if (data.content.avatar_url) {
|
|
this.smallAvatar = ejs("img")
|
|
.attribute("width", "32")
|
|
.attribute("height", "32")
|
|
.attribute("src", resolveMxc(data.content.avatar_url, 32, "crop"))
|
|
.class("c-message-event__avatar")
|
|
} else {
|
|
this.smallAvatar = ""
|
|
}
|
|
this.render()
|
|
}
|
|
|
|
static canRender(eventData) {
|
|
return eventData.type === "m.room.member"
|
|
}
|
|
|
|
renderInner(iconURL, elements) {
|
|
this.clearChildren()
|
|
this.child(
|
|
ejs("div").class("c-message-event__inner").child(
|
|
iconURL ? ejs("img").class("c-message-event__icon").attribute("width", "20").attribute("height", "20").attribute("src", iconURL) : "",
|
|
...elements
|
|
)
|
|
)
|
|
super.render()
|
|
}
|
|
}
|
|
|
|
|
|
class JoinedEvent extends MembershipEvent {
|
|
static canRender(eventData) {
|
|
return super.canRender(eventData) && eventData.content.membership === "join"
|
|
}
|
|
|
|
render() {
|
|
const changes = []
|
|
const prev = this.data.unsigned.prev_content
|
|
if (prev && prev.membership === "join") {
|
|
if (prev.avatar_url !== this.data.content.avatar_url) {
|
|
changes.push("changed their avatar")
|
|
}
|
|
if (prev.displayname !== this.data.content.displayname) {
|
|
changes.push(`changed their display name (was ${this.data.unsigned.prev_content.displayname})`)
|
|
}
|
|
}
|
|
let message
|
|
let iconURL
|
|
if (changes.length) {
|
|
message = " " + changes.join(", ")
|
|
iconURL = "static/profile-event.svg"
|
|
} else {
|
|
message = " joined the room"
|
|
iconURL = "static/join-event.svg"
|
|
}
|
|
this.renderInner(iconURL, [
|
|
this.smallAvatar,
|
|
this.senderName,
|
|
message
|
|
])
|
|
}
|
|
}
|
|
|
|
class InvitedEvent extends MembershipEvent {
|
|
static canRender(eventData) {
|
|
return super.canRender(eventData) && eventData.content.membership === "invite"
|
|
}
|
|
|
|
render() {
|
|
this.renderInner("static/invite-event.svg", [
|
|
this.smallAvatar,
|
|
`${extractLocalpart(this.data.sender)} invited ${this.data.state_key}` // full mxid for clarity
|
|
])
|
|
}
|
|
}
|
|
|
|
class LeaveEvent extends MembershipEvent {
|
|
static canRender(eventData) {
|
|
return super.canRender(eventData) && eventData.content.membership === "leave"
|
|
}
|
|
|
|
render() {
|
|
this.renderInner("static/leave-event.svg", [
|
|
this.smallAvatar,
|
|
this.senderName,
|
|
" left the room"
|
|
])
|
|
}
|
|
}
|
|
|
|
class BanEvent extends MembershipEvent {
|
|
static canRender(eventData) {
|
|
return super.canRender(eventData) && eventData.content.membership === "ban"
|
|
}
|
|
|
|
render() {
|
|
let message =
|
|
` left (banned by ${this.data.sender}`
|
|
+ (this.data.content.reason ? `, reason: ${this.data.content.reason}` : "")
|
|
+ ")"
|
|
this.renderInner("static/leave-event.svg", [
|
|
this.smallAvatar,
|
|
this.senderName,
|
|
message
|
|
])
|
|
}
|
|
}
|
|
|
|
class UnknownMembership extends MembershipEvent {
|
|
render() {
|
|
this.renderInner("", [
|
|
this.smallAvatar,
|
|
this.senderName,
|
|
ejs("i").text(" unknown membership event")
|
|
])
|
|
}
|
|
}
|
|
|
|
module.exports = [JoinedEvent, InvitedEvent, LeaveEvent, BanEvent, UnknownMembership]
|