feat(MSC3440): implement threads for feed and notifications.
fix(sendHtmlNotice): possibly MSC1767 related.
This commit is contained in:
parent
3122361c6c
commit
5924009154
8 changed files with 56 additions and 10 deletions
26
commands/fediverse/unroll.js
Normal file
26
commands/fediverse/unroll.js
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
exports.runQuery = function (roomId, event, userInput) {
|
||||||
|
const instance = axios.create({
|
||||||
|
baseURL: config.fediverse.domain,
|
||||||
|
method: 'GET',
|
||||||
|
headers: { Authorization: `Bearer ${fediverse.auth.access_token}` },
|
||||||
|
});
|
||||||
|
instance.get(`/api/v1/statuses/${userInput}/context`)
|
||||||
|
.then(async (response) => {
|
||||||
|
let story = [];
|
||||||
|
const original = await instance.get(`/api/v1/statuses/${userInput}`);
|
||||||
|
const ancestors = response.data.ancestors;
|
||||||
|
const descendants = response.data.descendants;
|
||||||
|
story = [...story, ancestors, original.data, descendants];
|
||||||
|
const book = story.flat();
|
||||||
|
await fediverse.utils.thread(roomId, event, '<br><hr><h3>...Beginning thread...</h3><hr><br>');
|
||||||
|
for (const [i, entry] of book.entries()) {
|
||||||
|
entry.label = 'thread';
|
||||||
|
fediverse.utils.formatter(entry, roomId, event)
|
||||||
|
}
|
||||||
|
await fediverse.utils.thread(roomId, event, '<br><hr><h3>...Thread ended...</h3><hr><br>');
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
matrix.utils.addReact(event, '❌');
|
||||||
|
matrix.utils.sendError(event, roomId, e);
|
||||||
|
});
|
||||||
|
};
|
|
@ -8,6 +8,20 @@ const sendEventWithMeta = async (roomId, content, meta) => {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const thread = async (roomId, event, 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',
|
||||||
|
'm.relates_to': {
|
||||||
|
rel_type: 'm.thread',
|
||||||
|
event_id: event['event']['content']['m.relates_to']['event_id'],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
const hasAttachment = (res) => {
|
const hasAttachment = (res) => {
|
||||||
if (res.status) res = res.status;
|
if (res.status) res = res.status;
|
||||||
if (!res.media_attachments) return '<br>';
|
if (!res.media_attachments) return '<br>';
|
||||||
|
@ -69,7 +83,7 @@ const notifyFormatter = (res, roomId) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const isOriginal = (res, roomId) => {
|
const isOriginal = (res, roomId, event) => {
|
||||||
if (res.data) res = res.data;
|
if (res.data) res = res.data;
|
||||||
userDetails = `<b><a href="${config.fediverse.domain}/notice/${res.id}">
|
userDetails = `<b><a href="${config.fediverse.domain}/notice/${res.id}">
|
||||||
${res.account.acct}</a>`;
|
${res.account.acct}</a>`;
|
||||||
|
@ -80,7 +94,8 @@ const isOriginal = (res, roomId) => {
|
||||||
${hasAttachment(res)}
|
${hasAttachment(res)}
|
||||||
<br>(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)}
|
<br>(id: ${res.id}) ${registrar.post.visibilityEmoji(res.visibility)}
|
||||||
</blockquote>`;
|
</blockquote>`;
|
||||||
sendEventWithMeta(roomId, content, meta);
|
if (res.label == 'thread') thread(roomId, event, content, meta);
|
||||||
|
else sendEventWithMeta(roomId, content, meta);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isReblog = (res, roomId) => {
|
const isReblog = (res, roomId) => {
|
||||||
|
@ -101,11 +116,13 @@ const isReblog = (res, roomId) => {
|
||||||
|
|
||||||
module.exports.sendEventWithMeta = sendEventWithMeta;
|
module.exports.sendEventWithMeta = sendEventWithMeta;
|
||||||
|
|
||||||
module.exports.formatter = (res, roomId) => {
|
module.exports.thread = thread;
|
||||||
|
|
||||||
|
module.exports.formatter = (res, roomId, event) => {
|
||||||
const filtered = (res.label === 'notifications')
|
const filtered = (res.label === 'notifications')
|
||||||
? notifyFormatter(res, roomId)
|
? notifyFormatter(res, roomId)
|
||||||
: (res.reblog == null)
|
: (res.reblog == null)
|
||||||
? isOriginal(res, roomId)
|
? isOriginal(res, roomId, event)
|
||||||
: isReblog(res, roomId);
|
: isReblog(res, roomId);
|
||||||
return filtered;
|
return filtered;
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,5 +47,6 @@ module.exports = {
|
||||||
tip: require('./commands/fediverse/tip.js'),
|
tip: require('./commands/fediverse/tip.js'),
|
||||||
unfollow: require('./commands/fediverse/unfollow.js'),
|
unfollow: require('./commands/fediverse/unfollow.js'),
|
||||||
unpin: require('./commands/fediverse/unpin.js'),
|
unpin: require('./commands/fediverse/unpin.js'),
|
||||||
unreblog: require('./commands/fediverse/unreblog.js')
|
unreblog: require('./commands/fediverse/unreblog.js'),
|
||||||
|
unroll: require('./commands/fediverse/unroll.js')
|
||||||
};
|
};
|
||||||
|
|
2
utils.js
2
utils.js
|
@ -124,6 +124,7 @@ module.exports.handleReact = async (event) => {
|
||||||
if (reaction.key === '👏') command = 'clap';
|
if (reaction.key === '👏') command = 'clap';
|
||||||
if (reaction.key === '🗑️️') command = 'redact';
|
if (reaction.key === '🗑️️') command = 'redact';
|
||||||
if (reaction.key === '🌧️') command = 'makeitrain';
|
if (reaction.key === '🌧️') command = 'makeitrain';
|
||||||
|
if (reaction.key === '➕') command = 'unroll';
|
||||||
eventHandler(args, roomId, command, event);
|
eventHandler(args, roomId, command, event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -150,6 +151,7 @@ module.exports.selfReact = async (event) => {
|
||||||
const type = meta.split(' ')[0];
|
const type = meta.split(' ')[0];
|
||||||
if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️');
|
if (type === 'redact' || type === 'unreblog') addReact(event, '🗑️️');
|
||||||
if (type === 'status' || type === 'reblog' || type === 'mention') {
|
if (type === 'status' || type === 'reblog' || type === 'mention') {
|
||||||
|
addReact(event, '➕');
|
||||||
addReact(event, '🔁');
|
addReact(event, '🔁');
|
||||||
addReact(event, '👏');
|
addReact(event, '👏');
|
||||||
if (config.fediverse.tipping === true) addReact(event, '🌧️');
|
if (config.fediverse.tipping === true) addReact(event, '🌧️');
|
||||||
|
|
Loading…
Reference in a new issue