You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.0 KiB
JavaScript
54 lines
1.0 KiB
JavaScript
"use strict";
|
|
|
|
const matchValue = require("match-value");
|
|
|
|
let standardRegex = /^m\.([\s\S]+)$/u;
|
|
let userRegex = /^u\.([\s\S]+)$/u;
|
|
let clientRegex = /^((?:[^.]+\.){2,})([\s\S]+)$/u;
|
|
|
|
function parseTag(tag) {
|
|
let match;
|
|
|
|
if (match = standardRegex.exec(tag)) {
|
|
return {
|
|
type: "standard",
|
|
name: matchValue(match[1], {
|
|
lowpriority: "isLowPriority",
|
|
favourite: "isFavourite",
|
|
server_notice: "isServerNoticeRoom"
|
|
})
|
|
};
|
|
} else if (match = userRegex.exec(tag)) {
|
|
return {
|
|
type: "user",
|
|
name: match[1]
|
|
};
|
|
} else if (match = clientRegex.exec(tag)) {
|
|
return {
|
|
type: "client",
|
|
namespace: match[1],
|
|
name: match[2]
|
|
};
|
|
} else {
|
|
// Legacy, un-namespaced format
|
|
return {
|
|
type: "user",
|
|
name: tag
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = function mapTagEvent(event, _context) {
|
|
return {
|
|
type: "tagsChanged",
|
|
tags: Object.entries(event.content.tags).map(([ tagString, options ]) => {
|
|
return {
|
|
... parseTag(tagString),
|
|
tagString: tagString,
|
|
// TODO: Explicitly parse options?
|
|
options: options
|
|
};
|
|
})
|
|
};
|
|
};
|