const sendEventWithMeta = async (roomId, content, meta) => {
await matrixClient.sendEvent(roomId, 'm.room.message', {
body: content.replace(/<[^<]+?>/g, ''),
msgtype: 'm.notice',
formatted_body: content,
meta: meta,
format: 'org.matrix.custom.html',
});
};
const hasAttachment = (res) => {
if (!res.media_attachments) return '
';
return res.media_attachments.map((media) => {
const mediaURL = new URL(media.remote_url);
media.name = new URLSearchParams(mediaURL.search).get('name') || 'Unknown file name.';
return `File attachment: ${media.name}
`;
}).join('
');
};
const notifyFormatter = (res, roomId) => {
userDetails = `
${res.account.acct}`;
switch (res.type) {
case 'follow':
fediverse.auth.me !== res.account.url ? res.meta = 'follow' : res.meta = 'redact';
meta = `${res.meta} ${res.account.id}`;
content = `${userDetails}
has followed you.
${res.account.note}`; sendEventWithMeta(roomId, content, meta); break; case 'favourite': fediverse.auth.me !== res.account.url ? res.meta = 'favourite' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has favorited your post:
${res.status.content}`; sendEventWithMeta(roomId, content, res.meta); break; case 'mention': fediverse.auth.me !== res.account.url ? res.meta = 'mention' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has mentioned you:
${res.status.content}`; sendEventWithMeta(roomId, content, meta); break; case 'reblog': fediverse.auth.me !== res.account.url ? res.meta = 'reblog' : res.meta = 'redact'; meta = `${res.meta} ${res.status.id}`; content = `${userDetails} has repeated your post:
(id: ${res.status.id}) ${registrar.post.visibilityEmoji(res.status.visibility)}
${res.status.content}`; sendEventWithMeta(roomId, content, meta); break; default: throw 'Unknown notification type.'; } }; const isOriginal = (res, roomId) => { if (res.data) res = res.data; userDetails = ` ${res.account.acct}`; fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'redact'; meta = `${res.meta} ${res.id}`; content = `${userDetails}
${res.content}`; sendEventWithMeta(roomId, content, meta); }; const isReblog = (res, roomId) => { if (res.data) res = res.data; userDetails = ` ${res.account.acct}`; fediverse.auth.me !== res.account.url ? res.meta = 'status' : res.meta = 'unreblog'; meta = `${res.meta} ${res.reblog.id}`; content = `${userDetails} has repeated ${res.reblog.account.acct}'s post:
${hasAttachment(res)}
(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)}
${res.content}`; sendEventWithMeta(roomId, content, meta); }; module.exports.sendEventWithMeta = sendEventWithMeta; module.exports.formatter = (res, roomId) => { const filtered = (res.label === 'notifications') ? notifyFormatter(res, roomId) : (res.reblog == null) ? isOriginal(res, roomId) : isReblog(res, roomId); return filtered; }; module.exports.follow = (roomId, account, event, original) => { axios({ method: 'POST', url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/follow`, headers: { Authorization: `Bearer ${fediverse.auth.access_token}` }, }) .then(() => { matrix.utils.addReact(event, '✅'); matrix.utils.editNoticeHTML(roomId, original, `
${hasAttachment(res)}
(id: ${res.reblog.id}) ${registrar.post.visibilityEmoji(res.visibility)}
Followed ${account[0].acct}.
`);
})
.catch((e) => {
matrix.utils.addReact(event, '❌');
matrix.utils.sendError(event, roomId, e);
});
};
module.exports.unfollow = (roomId, account, event, original) => {
axios({
method: 'POST',
url: `${config.fediverse.domain}/api/v1/accounts/${account[0].id}/unfollow`,
headers: { Authorization: `Bearer ${fediverse.auth.access_token}` },
})
.then(() => {
matrix.utils.addReact(event, '✅');
matrix.utils.editNoticeHTML(roomId, original, `Unfollowed ${account[0].acct}.
`);
})
.catch((e) => {
matrix.utils.addReact(event, '❌');
matrix.utils.sendError(event, roomId, e);
});
};