2024-01-10 14:19:57 -05:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
const db = require('../database');
|
|
|
|
|
const user = require('../user');
|
|
|
|
|
|
|
|
|
|
const activitypub = module.parent.exports;
|
|
|
|
|
const Mocks = module.exports;
|
|
|
|
|
|
|
|
|
|
Mocks.profile = async (actors, callerUid = 0) => {
|
|
|
|
|
// Accepts an array containing actor objects (the output of getActor()), or uris
|
|
|
|
|
let single = false;
|
|
|
|
|
if (!Array.isArray(actors)) {
|
|
|
|
|
single = true;
|
|
|
|
|
actors = [actors];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const profiles = (await Promise.all(actors.map(async (actor) => {
|
|
|
|
|
// convert uri to actor object
|
|
|
|
|
if (typeof actor === 'string' && activitypub.helpers.isUri(actor)) {
|
|
|
|
|
actor = await activitypub.getActor(callerUid, actor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!actor) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const uid = actor.id;
|
|
|
|
|
const { preferredUsername, published, icon, image, name, summary, hostname, followerCount, followingCount } = actor;
|
|
|
|
|
const isFollowing = await db.isSortedSetMember(`followingRemote:${callerUid}`, uid);
|
|
|
|
|
|
|
|
|
|
let picture;
|
|
|
|
|
if (icon) {
|
|
|
|
|
picture = typeof icon === 'string' ? icon : icon.url;
|
|
|
|
|
}
|
|
|
|
|
const iconBackgrounds = await user.getIconBackgrounds();
|
|
|
|
|
let bgColor = Array.prototype.reduce.call(preferredUsername, (cur, next) => cur + next.charCodeAt(), 0);
|
|
|
|
|
bgColor = iconBackgrounds[bgColor % iconBackgrounds.length];
|
|
|
|
|
|
|
|
|
|
const payload = {
|
|
|
|
|
uid,
|
|
|
|
|
username: `${preferredUsername}@${hostname}`,
|
|
|
|
|
userslug: `${preferredUsername}@${hostname}`,
|
|
|
|
|
displayname: name,
|
|
|
|
|
fullname: name,
|
|
|
|
|
joindate: new Date(published).getTime(),
|
|
|
|
|
picture,
|
2024-01-10 20:51:23 -05:00
|
|
|
status: 'offline',
|
2024-01-10 14:19:57 -05:00
|
|
|
'icon:text': (preferredUsername[0] || '').toUpperCase(),
|
|
|
|
|
'icon:bgColor': bgColor,
|
|
|
|
|
uploadedpicture: undefined,
|
|
|
|
|
'cover:url': !image || typeof image === 'string' ? image : image.url,
|
|
|
|
|
'cover:position': '50% 50%',
|
|
|
|
|
aboutme: summary,
|
|
|
|
|
aboutmeParsed: summary,
|
|
|
|
|
|
|
|
|
|
isFollowing,
|
|
|
|
|
counts: {
|
|
|
|
|
following: followingCount,
|
|
|
|
|
followers: followerCount,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return payload;
|
|
|
|
|
}))).filter(Boolean);
|
|
|
|
|
|
|
|
|
|
return single ? profiles.pop() : profiles;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Mocks.post = async (objects) => {
|
|
|
|
|
let single = false;
|
|
|
|
|
if (!Array.isArray(objects)) {
|
|
|
|
|
single = true;
|
|
|
|
|
objects = [objects];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const posts = (await Promise.all(objects.map(async (object) => {
|
|
|
|
|
if (object.type !== 'Note') {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
id: pid,
|
|
|
|
|
published,
|
|
|
|
|
updated,
|
|
|
|
|
attributedTo: uid,
|
|
|
|
|
// conversation,
|
|
|
|
|
content,
|
|
|
|
|
sourceContent,
|
|
|
|
|
inReplyTo: toPid,
|
|
|
|
|
} = object;
|
|
|
|
|
|
2024-01-10 20:51:23 -05:00
|
|
|
const timestamp = new Date(published).getTime();
|
2024-01-10 14:19:57 -05:00
|
|
|
let edited = new Date(updated);
|
2024-01-10 20:51:23 -05:00
|
|
|
edited = Number.isNaN(edited.valueOf()) ? undefined : edited;
|
2024-01-10 14:19:57 -05:00
|
|
|
|
|
|
|
|
const payload = {
|
|
|
|
|
uid,
|
|
|
|
|
pid,
|
2024-01-10 20:51:23 -05:00
|
|
|
// tid,
|
|
|
|
|
content,
|
|
|
|
|
sourceContent,
|
|
|
|
|
timestamp,
|
2024-01-10 14:19:57 -05:00
|
|
|
toPid,
|
|
|
|
|
|
|
|
|
|
edited,
|
|
|
|
|
editor: edited ? uid : undefined,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return payload;
|
|
|
|
|
}))).filter(Boolean);
|
|
|
|
|
|
|
|
|
|
return single ? posts.pop() : posts;
|
|
|
|
|
};
|