2020-01-30 08:55:01 -08:00
|
|
|
import escape from 'escape-html'
|
2020-07-03 12:45:49 -07:00
|
|
|
import parseLinkHeader from 'parse-link-header'
|
2020-04-24 21:04:39 -07:00
|
|
|
import { isStatusNotification } from '../notification_utils/notification_utils.js'
|
2021-01-05 00:09:08 -08:00
|
|
|
import punycode from 'punycode.js'
|
2020-01-30 08:55:01 -08:00
|
|
|
|
2020-11-17 05:25:38 -08:00
|
|
|
/** NOTICE! **
|
|
|
|
* Do not initialize UI-generated data here.
|
|
|
|
* It will override existing data.
|
|
|
|
*
|
|
|
|
* i.e. user.pinnedStatusIds was set to [] here
|
|
|
|
* UI code would update it with data but upon next user fetch
|
|
|
|
* it would be reverted back to []
|
|
|
|
*/
|
|
|
|
|
2019-01-14 04:30:14 -08:00
|
|
|
const qvitterStatusType = (status) => {
|
2019-01-13 11:07:55 -08:00
|
|
|
if (status.is_post_verb) {
|
|
|
|
return 'status'
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status.retweeted_status) {
|
|
|
|
return 'retweet'
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((typeof status.uri === 'string' && status.uri.match(/(fave|objectType=Favourite)/)) ||
|
|
|
|
(typeof status.text === 'string' && status.text.match(/favorited/))) {
|
|
|
|
return 'favorite'
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status.text.match(/deleted notice {{tag/) || status.qvitter_delete_notice) {
|
|
|
|
return 'deletion'
|
|
|
|
}
|
|
|
|
|
|
|
|
if (status.text.match(/started following/) || status.activity_type === 'follow') {
|
|
|
|
return 'follow'
|
|
|
|
}
|
|
|
|
|
|
|
|
return 'unknown'
|
|
|
|
}
|
|
|
|
|
2019-01-14 04:30:14 -08:00
|
|
|
export const parseUser = (data) => {
|
|
|
|
const output = {}
|
|
|
|
const masto = data.hasOwnProperty('acct')
|
|
|
|
// case for users in "mentions" property for statuses in MastoAPI
|
|
|
|
const mastoShort = masto && !data.hasOwnProperty('avatar')
|
|
|
|
|
2019-01-17 08:23:14 -08:00
|
|
|
output.id = String(data.id)
|
2019-01-14 04:30:14 -08:00
|
|
|
|
|
|
|
if (masto) {
|
|
|
|
output.screen_name = data.acct
|
2019-05-22 20:47:20 -07:00
|
|
|
output.statusnet_profile_url = data.url
|
2019-01-14 04:30:14 -08:00
|
|
|
|
|
|
|
// There's nothing else to get
|
|
|
|
if (mastoShort) {
|
|
|
|
return output
|
|
|
|
}
|
|
|
|
|
2019-03-31 18:59:18 -07:00
|
|
|
output.name = data.display_name
|
2020-01-30 08:55:01 -08:00
|
|
|
output.name_html = addEmojis(escape(data.display_name), data.emojis)
|
2019-01-14 04:30:14 -08:00
|
|
|
|
2019-05-26 11:48:49 -07:00
|
|
|
output.description = data.note
|
2019-03-17 05:41:05 -07:00
|
|
|
output.description_html = addEmojis(data.note, data.emojis)
|
2019-01-14 04:30:14 -08:00
|
|
|
|
2019-11-19 06:15:41 -08:00
|
|
|
output.fields = data.fields
|
|
|
|
output.fields_html = data.fields.map(field => {
|
|
|
|
return {
|
2020-11-11 00:40:26 -08:00
|
|
|
name: addEmojis(escape(field.name), data.emojis),
|
2019-11-19 06:15:41 -08:00
|
|
|
value: addEmojis(field.value, data.emojis)
|
|
|
|
}
|
|
|
|
})
|
2020-02-19 03:57:58 -08:00
|
|
|
output.fields_text = data.fields.map(field => {
|
|
|
|
return {
|
2020-06-17 08:26:06 -07:00
|
|
|
name: unescape(field.name.replace(/<[^>]*>/g, '')),
|
|
|
|
value: unescape(field.value.replace(/<[^>]*>/g, ''))
|
2020-02-19 03:57:58 -08:00
|
|
|
}
|
|
|
|
})
|
2019-11-19 06:15:41 -08:00
|
|
|
|
2019-01-14 04:30:14 -08:00
|
|
|
// Utilize avatar_static for gif avatars?
|
|
|
|
output.profile_image_url = data.avatar
|
|
|
|
output.profile_image_url_original = data.avatar
|
|
|
|
|
|
|
|
// Same, utilize header_static?
|
|
|
|
output.cover_photo = data.header
|
|
|
|
|
|
|
|
output.friends_count = data.following_count
|
|
|
|
|
|
|
|
output.bot = data.bot
|
|
|
|
|
2019-01-18 17:10:16 -08:00
|
|
|
if (data.pleroma) {
|
2019-03-11 14:08:14 -07:00
|
|
|
const relationship = data.pleroma.relationship
|
|
|
|
|
2019-06-16 10:17:59 -07:00
|
|
|
output.background_image = data.pleroma.background_image
|
2020-03-01 00:47:21 -08:00
|
|
|
output.favicon = data.pleroma.favicon
|
2019-06-16 10:17:59 -07:00
|
|
|
output.token = data.pleroma.chat_token
|
|
|
|
|
2020-04-21 13:27:51 -07:00
|
|
|
if (relationship) {
|
|
|
|
output.relationship = relationship
|
|
|
|
}
|
2019-02-18 06:49:32 -08:00
|
|
|
|
2020-02-03 11:26:32 -08:00
|
|
|
output.allow_following_move = data.pleroma.allow_following_move
|
|
|
|
|
2019-07-07 03:20:55 -07:00
|
|
|
output.hide_follows = data.pleroma.hide_follows
|
|
|
|
output.hide_followers = data.pleroma.hide_followers
|
2019-09-13 06:15:19 -07:00
|
|
|
output.hide_follows_count = data.pleroma.hide_follows_count
|
|
|
|
output.hide_followers_count = data.pleroma.hide_followers_count
|
2019-07-07 03:20:55 -07:00
|
|
|
|
2019-02-18 06:49:32 -08:00
|
|
|
output.rights = {
|
|
|
|
moderator: data.pleroma.is_moderator,
|
|
|
|
admin: data.pleroma.is_admin
|
|
|
|
}
|
2019-05-21 13:35:40 -07:00
|
|
|
// TODO: Clean up in UI? This is duplication from what BE does for qvitterapi
|
|
|
|
if (output.rights.admin) {
|
|
|
|
output.role = 'admin'
|
|
|
|
} else if (output.rights.moderator) {
|
|
|
|
output.role = 'moderator'
|
|
|
|
} else {
|
|
|
|
output.role = 'member'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.source) {
|
|
|
|
output.description = data.source.note
|
|
|
|
output.default_scope = data.source.privacy
|
2019-11-19 06:15:41 -08:00
|
|
|
output.fields = data.source.fields
|
2019-05-21 13:35:40 -07:00
|
|
|
if (data.source.pleroma) {
|
|
|
|
output.no_rich_text = data.source.pleroma.no_rich_text
|
|
|
|
output.show_role = data.source.pleroma.show_role
|
2019-09-26 15:31:28 -07:00
|
|
|
output.discoverable = data.source.pleroma.discoverable
|
2019-05-21 13:35:40 -07:00
|
|
|
}
|
2019-01-18 17:10:16 -08:00
|
|
|
}
|
2019-01-17 12:53:05 -08:00
|
|
|
|
2019-03-13 11:08:03 -07:00
|
|
|
// TODO: handle is_local
|
2019-03-13 12:43:48 -07:00
|
|
|
output.is_local = !output.screen_name.includes('@')
|
2019-01-14 04:30:14 -08:00
|
|
|
} else {
|
|
|
|
output.screen_name = data.screen_name
|
|
|
|
|
|
|
|
output.name = data.name
|
|
|
|
output.name_html = data.name_html
|
|
|
|
|
|
|
|
output.description = data.description
|
|
|
|
output.description_html = data.description_html
|
|
|
|
|
|
|
|
output.profile_image_url = data.profile_image_url
|
|
|
|
output.profile_image_url_original = data.profile_image_url_original
|
|
|
|
|
|
|
|
output.cover_photo = data.cover_photo
|
|
|
|
|
|
|
|
output.friends_count = data.friends_count
|
|
|
|
|
2019-03-11 14:03:55 -07:00
|
|
|
// output.bot = ??? missing
|
2019-01-14 04:30:14 -08:00
|
|
|
|
|
|
|
output.statusnet_profile_url = data.statusnet_profile_url
|
2019-01-17 12:53:05 -08:00
|
|
|
|
2019-01-14 04:30:14 -08:00
|
|
|
output.is_local = data.is_local
|
2019-02-04 06:03:35 -08:00
|
|
|
output.role = data.role
|
|
|
|
output.show_role = data.show_role
|
2019-01-17 11:11:51 -08:00
|
|
|
|
2019-02-18 06:49:32 -08:00
|
|
|
if (data.rights) {
|
|
|
|
output.rights = {
|
|
|
|
moderator: data.rights.delete_others_notice,
|
|
|
|
admin: data.rights.admin
|
|
|
|
}
|
|
|
|
}
|
2019-01-17 11:11:51 -08:00
|
|
|
output.no_rich_text = data.no_rich_text
|
|
|
|
output.default_scope = data.default_scope
|
2019-02-06 03:21:13 -08:00
|
|
|
output.hide_follows = data.hide_follows
|
2019-01-29 14:11:40 -08:00
|
|
|
output.hide_followers = data.hide_followers
|
2019-09-13 06:15:19 -07:00
|
|
|
output.hide_follows_count = data.hide_follows_count
|
|
|
|
output.hide_followers_count = data.hide_followers_count
|
2019-01-17 11:11:51 -08:00
|
|
|
output.background_image = data.background_image
|
2019-01-27 12:38:33 -08:00
|
|
|
// Websocket token
|
|
|
|
output.token = data.token
|
2020-04-21 13:27:51 -07:00
|
|
|
|
|
|
|
// Convert relationsip data to expected format
|
|
|
|
output.relationship = {
|
|
|
|
muting: data.muted,
|
|
|
|
blocking: data.statusnet_blocking,
|
|
|
|
followed_by: data.follows_you,
|
|
|
|
following: data.following
|
|
|
|
}
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
2019-01-14 04:30:14 -08:00
|
|
|
|
|
|
|
output.created_at = new Date(data.created_at)
|
|
|
|
output.locked = data.locked
|
|
|
|
output.followers_count = data.followers_count
|
|
|
|
output.statuses_count = data.statuses_count
|
2019-04-30 05:20:19 -07:00
|
|
|
|
2019-02-11 01:41:17 -08:00
|
|
|
if (data.pleroma) {
|
|
|
|
output.follow_request_count = data.pleroma.follow_request_count
|
2019-01-14 04:30:14 -08:00
|
|
|
|
2019-02-18 06:49:32 -08:00
|
|
|
output.tags = data.pleroma.tags
|
2021-01-18 13:54:12 -08:00
|
|
|
// deactivated was changed to is_active in Pleroma 2.3.0
|
|
|
|
// backwards compatability kept for now
|
|
|
|
output.deactivated = data.pleroma.deactivated ? !data.pleroma.is_active : data.pleroma.deactivated
|
2019-02-18 06:49:32 -08:00
|
|
|
|
2019-05-25 00:01:02 -07:00
|
|
|
output.notification_settings = data.pleroma.notification_settings
|
2020-05-07 06:10:53 -07:00
|
|
|
output.unread_chat_count = data.pleroma.unread_chat_count
|
2019-02-18 06:49:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
output.tags = output.tags || []
|
2019-04-27 05:56:37 -07:00
|
|
|
output.rights = output.rights || {}
|
2019-05-25 00:01:02 -07:00
|
|
|
output.notification_settings = output.notification_settings || {}
|
2019-02-18 06:49:32 -08:00
|
|
|
|
2021-01-05 00:09:08 -08:00
|
|
|
// Convert punycode to unicode
|
|
|
|
if (output.screen_name.includes('@')) {
|
|
|
|
const parts = output.screen_name.split('@')
|
|
|
|
let unicodeDomain = punycode.toUnicode(parts[1])
|
|
|
|
if (unicodeDomain !== parts[1]) {
|
|
|
|
// Add some identifier so users can potentially spot spoofing attempts:
|
|
|
|
// lain.com and xn--lin-6cd.com would appear identical otherwise.
|
|
|
|
unicodeDomain = '🌏' + unicodeDomain
|
|
|
|
output.screen_name = [parts[0], unicodeDomain].join('@')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-14 04:30:14 -08:00
|
|
|
return output
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
|
|
|
|
2019-03-17 20:23:59 -07:00
|
|
|
export const parseAttachment = (data) => {
|
2019-01-21 05:28:36 -08:00
|
|
|
const output = {}
|
|
|
|
const masto = !data.hasOwnProperty('oembed')
|
|
|
|
|
|
|
|
if (masto) {
|
|
|
|
// Not exactly same...
|
2019-03-17 20:42:07 -07:00
|
|
|
output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type
|
2019-01-21 05:28:36 -08:00
|
|
|
output.meta = data.meta // not present in BE yet
|
2019-03-25 09:19:33 -07:00
|
|
|
output.id = data.id
|
2019-01-21 05:28:36 -08:00
|
|
|
} else {
|
|
|
|
output.mimetype = data.mimetype
|
2019-03-11 14:03:55 -07:00
|
|
|
// output.meta = ??? missing
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
2019-01-21 05:28:36 -08:00
|
|
|
|
|
|
|
output.url = data.url
|
2020-08-19 05:54:00 -07:00
|
|
|
output.large_thumb_url = data.preview_url
|
2019-01-21 05:28:36 -08:00
|
|
|
output.description = data.description
|
|
|
|
|
|
|
|
return output
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
2019-03-11 13:41:08 -07:00
|
|
|
export const addEmojis = (string, emojis) => {
|
2019-09-30 13:45:03 -07:00
|
|
|
const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g
|
2019-03-08 16:15:35 -08:00
|
|
|
return emojis.reduce((acc, emoji) => {
|
2019-09-30 13:45:03 -07:00
|
|
|
const regexSafeShortCode = emoji.shortcode.replace(matchOperatorsRegex, '\\$&')
|
2019-03-08 16:15:35 -08:00
|
|
|
return acc.replace(
|
2019-09-30 13:45:03 -07:00
|
|
|
new RegExp(`:${regexSafeShortCode}:`, 'g'),
|
2020-06-04 06:12:03 -07:00
|
|
|
`<img src='${emoji.url}' alt=':${emoji.shortcode}:' title=':${emoji.shortcode}:' class='emoji' />`
|
2019-03-08 16:15:35 -08:00
|
|
|
)
|
|
|
|
}, string)
|
|
|
|
}
|
2019-01-13 11:07:55 -08:00
|
|
|
|
|
|
|
export const parseStatus = (data) => {
|
|
|
|
const output = {}
|
2019-01-14 11:38:37 -08:00
|
|
|
const masto = data.hasOwnProperty('account')
|
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
if (masto) {
|
|
|
|
output.favorited = data.favourited
|
|
|
|
output.fave_num = data.favourites_count
|
|
|
|
|
|
|
|
output.repeated = data.reblogged
|
|
|
|
output.repeat_num = data.reblogs_count
|
|
|
|
|
2020-07-03 12:45:49 -07:00
|
|
|
output.bookmarked = data.bookmarked
|
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
output.type = data.reblog ? 'retweet' : 'status'
|
|
|
|
output.nsfw = data.sensitive
|
|
|
|
|
2019-03-08 16:15:35 -08:00
|
|
|
output.statusnet_html = addEmojis(data.content, data.emojis)
|
2019-01-14 11:58:23 -08:00
|
|
|
|
2019-05-19 21:03:50 -07:00
|
|
|
output.tags = data.tags
|
|
|
|
|
2019-04-09 12:25:44 -07:00
|
|
|
if (data.pleroma) {
|
|
|
|
const { pleroma } = data
|
|
|
|
output.text = pleroma.content ? data.pleroma.content['text/plain'] : data.content
|
|
|
|
output.summary = pleroma.spoiler_text ? data.pleroma.spoiler_text['text/plain'] : data.spoiler_text
|
|
|
|
output.statusnet_conversation_id = data.pleroma.conversation_id
|
2019-04-10 05:02:14 -07:00
|
|
|
output.is_local = pleroma.local
|
2019-04-26 21:52:11 -07:00
|
|
|
output.in_reply_to_screen_name = data.pleroma.in_reply_to_account_acct
|
2019-09-13 19:59:24 -07:00
|
|
|
output.thread_muted = pleroma.thread_muted
|
2020-01-28 07:09:25 -08:00
|
|
|
output.emoji_reactions = pleroma.emoji_reactions
|
2020-06-30 05:04:16 -07:00
|
|
|
output.parent_visible = pleroma.parent_visible === undefined ? true : pleroma.parent_visible
|
2019-04-09 12:25:44 -07:00
|
|
|
} else {
|
|
|
|
output.text = data.content
|
|
|
|
output.summary = data.spoiler_text
|
|
|
|
}
|
2019-01-13 11:07:55 -08:00
|
|
|
|
|
|
|
output.in_reply_to_status_id = data.in_reply_to_id
|
2019-01-17 12:22:51 -08:00
|
|
|
output.in_reply_to_user_id = data.in_reply_to_account_id
|
2019-03-28 00:46:41 -07:00
|
|
|
output.replies_count = data.replies_count
|
2019-01-21 10:41:17 -08:00
|
|
|
|
2019-01-17 09:44:37 -08:00
|
|
|
if (output.type === 'retweet') {
|
|
|
|
output.retweeted_status = parseStatus(data.reblog)
|
|
|
|
}
|
2019-01-17 12:22:51 -08:00
|
|
|
|
2020-01-30 08:55:01 -08:00
|
|
|
output.summary_html = addEmojis(escape(data.spoiler_text), data.emojis)
|
2019-01-17 12:44:31 -08:00
|
|
|
output.external_url = data.url
|
2019-06-18 13:28:31 -07:00
|
|
|
output.poll = data.poll
|
2020-06-14 04:16:08 -07:00
|
|
|
if (output.poll) {
|
2020-06-14 06:09:14 -07:00
|
|
|
output.poll.options = (output.poll.options || []).map(field => ({
|
|
|
|
...field,
|
2020-12-06 14:11:21 -08:00
|
|
|
title_html: addEmojis(escape(field.title), data.emojis)
|
2020-06-14 06:09:14 -07:00
|
|
|
}))
|
2020-06-14 04:16:08 -07:00
|
|
|
}
|
2019-04-04 09:47:25 -07:00
|
|
|
output.pinned = data.pinned
|
2019-07-07 13:02:09 -07:00
|
|
|
output.muted = data.muted
|
2019-01-13 11:07:55 -08:00
|
|
|
} else {
|
|
|
|
output.favorited = data.favorited
|
|
|
|
output.fave_num = data.fave_num
|
|
|
|
|
|
|
|
output.repeated = data.repeated
|
|
|
|
output.repeat_num = data.repeat_num
|
|
|
|
|
|
|
|
// catchall, temporary
|
|
|
|
// Object.assign(output, data)
|
|
|
|
|
|
|
|
output.type = qvitterStatusType(data)
|
|
|
|
|
|
|
|
if (data.nsfw === undefined) {
|
|
|
|
output.nsfw = isNsfw(data)
|
|
|
|
if (data.retweeted_status) {
|
|
|
|
output.nsfw = data.retweeted_status.nsfw
|
|
|
|
}
|
2019-01-15 07:39:24 -08:00
|
|
|
} else {
|
|
|
|
output.nsfw = data.nsfw
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
2019-01-15 07:39:24 -08:00
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
output.statusnet_html = data.statusnet_html
|
|
|
|
output.text = data.text
|
|
|
|
|
2019-01-17 12:22:51 -08:00
|
|
|
output.in_reply_to_status_id = data.in_reply_to_status_id
|
|
|
|
output.in_reply_to_user_id = data.in_reply_to_user_id
|
2019-01-21 10:41:17 -08:00
|
|
|
output.in_reply_to_screen_name = data.in_reply_to_screen_name
|
2019-01-14 11:58:23 -08:00
|
|
|
output.statusnet_conversation_id = data.statusnet_conversation_id
|
2019-01-17 09:44:37 -08:00
|
|
|
|
|
|
|
if (output.type === 'retweet') {
|
|
|
|
output.retweeted_status = parseStatus(data.retweeted_status)
|
|
|
|
}
|
2019-01-17 12:22:51 -08:00
|
|
|
|
|
|
|
output.summary = data.summary
|
2019-01-25 02:05:19 -08:00
|
|
|
output.summary_html = data.summary_html
|
2019-01-17 12:44:31 -08:00
|
|
|
output.external_url = data.external_url
|
|
|
|
output.is_local = data.is_local
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
|
|
|
|
2019-01-17 08:23:14 -08:00
|
|
|
output.id = String(data.id)
|
2019-01-13 11:07:55 -08:00
|
|
|
output.visibility = data.visibility
|
2019-01-27 04:56:07 -08:00
|
|
|
output.card = data.card
|
2019-01-13 11:07:55 -08:00
|
|
|
output.created_at = new Date(data.created_at)
|
|
|
|
|
2019-01-22 12:57:51 -08:00
|
|
|
// Converting to string, the right way.
|
|
|
|
output.in_reply_to_status_id = output.in_reply_to_status_id
|
|
|
|
? String(output.in_reply_to_status_id)
|
|
|
|
: null
|
|
|
|
output.in_reply_to_user_id = output.in_reply_to_user_id
|
|
|
|
? String(output.in_reply_to_user_id)
|
|
|
|
: null
|
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
output.user = parseUser(masto ? data.account : data.user)
|
|
|
|
|
2019-01-18 17:10:16 -08:00
|
|
|
output.attentions = ((masto ? data.mentions : data.attentions) || []).map(parseUser)
|
2019-01-13 11:07:55 -08:00
|
|
|
|
|
|
|
output.attachments = ((masto ? data.media_attachments : data.attachments) || [])
|
|
|
|
.map(parseAttachment)
|
|
|
|
|
|
|
|
const retweetedStatus = masto ? data.reblog : data.retweeted_status
|
|
|
|
if (retweetedStatus) {
|
|
|
|
output.retweeted_status = parseStatus(retweetedStatus)
|
|
|
|
}
|
|
|
|
|
2019-05-01 07:33:56 -07:00
|
|
|
output.favoritedBy = []
|
|
|
|
output.rebloggedBy = []
|
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
return output
|
|
|
|
}
|
|
|
|
|
2019-01-14 11:38:37 -08:00
|
|
|
export const parseNotification = (data) => {
|
|
|
|
const mastoDict = {
|
|
|
|
'favourite': 'like',
|
|
|
|
'reblog': 'repeat'
|
|
|
|
}
|
|
|
|
const masto = !data.hasOwnProperty('ntype')
|
|
|
|
const output = {}
|
2020-04-23 04:27:27 -07:00
|
|
|
|
2019-01-14 11:38:37 -08:00
|
|
|
if (masto) {
|
|
|
|
output.type = mastoDict[data.type] || data.type
|
2019-03-18 09:30:34 -07:00
|
|
|
output.seen = data.pleroma.is_seen
|
2020-04-24 21:04:39 -07:00
|
|
|
output.status = isStatusNotification(output.type) ? parseStatus(data.status) : null
|
2019-03-31 11:50:34 -07:00
|
|
|
output.action = output.status // TODO: Refactor, this is unneeded
|
2019-12-10 06:54:28 -08:00
|
|
|
output.target = output.type !== 'move'
|
|
|
|
? null
|
|
|
|
: parseUser(data.target)
|
2019-01-14 11:38:37 -08:00
|
|
|
output.from_profile = parseUser(data.account)
|
2020-02-11 04:24:51 -08:00
|
|
|
output.emoji = data.emoji
|
2019-01-14 11:38:37 -08:00
|
|
|
} else {
|
|
|
|
const parsedNotice = parseStatus(data.notice)
|
|
|
|
output.type = data.ntype
|
2019-01-17 09:44:37 -08:00
|
|
|
output.seen = Boolean(data.is_seen)
|
2019-01-14 11:38:37 -08:00
|
|
|
output.status = output.type === 'like'
|
|
|
|
? parseStatus(data.notice.favorited_status)
|
|
|
|
: parsedNotice
|
|
|
|
output.action = parsedNotice
|
2020-05-07 06:10:53 -07:00
|
|
|
output.from_profile = output.type === 'pleroma:chat_mention' ? parseUser(data.account) : parseUser(data.from_profile)
|
2019-01-14 11:38:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
output.created_at = new Date(data.created_at)
|
2019-05-03 12:56:21 -07:00
|
|
|
output.id = parseInt(data.id)
|
2019-01-14 11:38:37 -08:00
|
|
|
|
|
|
|
return output
|
|
|
|
}
|
|
|
|
|
2019-01-13 11:07:55 -08:00
|
|
|
const isNsfw = (status) => {
|
|
|
|
const nsfwRegex = /#nsfw/i
|
2019-03-22 10:15:11 -07:00
|
|
|
return (status.tags || []).includes('nsfw') || !!(status.text || '').match(nsfwRegex)
|
2019-01-13 11:07:55 -08:00
|
|
|
}
|
2020-07-03 12:45:49 -07:00
|
|
|
|
|
|
|
export const parseLinkHeaderPagination = (linkHeader, opts = {}) => {
|
|
|
|
const flakeId = opts.flakeId
|
|
|
|
const parsedLinkHeader = parseLinkHeader(linkHeader)
|
|
|
|
if (!parsedLinkHeader) return
|
|
|
|
const maxId = parsedLinkHeader.next.max_id
|
|
|
|
const minId = parsedLinkHeader.prev.min_id
|
|
|
|
|
|
|
|
return {
|
|
|
|
maxId: flakeId ? maxId : parseInt(maxId, 10),
|
|
|
|
minId: flakeId ? minId : parseInt(minId, 10)
|
|
|
|
}
|
|
|
|
}
|
2020-05-07 06:10:53 -07:00
|
|
|
|
|
|
|
export const parseChat = (chat) => {
|
|
|
|
const output = {}
|
|
|
|
output.id = chat.id
|
|
|
|
output.account = parseUser(chat.account)
|
|
|
|
output.unread = chat.unread
|
|
|
|
output.lastMessage = parseChatMessage(chat.last_message)
|
|
|
|
output.updated_at = new Date(chat.updated_at)
|
|
|
|
return output
|
|
|
|
}
|
|
|
|
|
|
|
|
export const parseChatMessage = (message) => {
|
|
|
|
if (!message) { return }
|
|
|
|
if (message.isNormalized) { return message }
|
|
|
|
const output = message
|
|
|
|
output.id = message.id
|
|
|
|
output.created_at = new Date(message.created_at)
|
|
|
|
output.chat_id = message.chat_id
|
|
|
|
if (message.content) {
|
|
|
|
output.content = addEmojis(message.content, message.emojis)
|
|
|
|
} else {
|
|
|
|
output.content = ''
|
|
|
|
}
|
|
|
|
if (message.attachment) {
|
|
|
|
output.attachments = [parseAttachment(message.attachment)]
|
|
|
|
} else {
|
|
|
|
output.attachments = []
|
|
|
|
}
|
2020-10-29 03:33:06 -07:00
|
|
|
output.pending = !!message.pending
|
|
|
|
output.error = false
|
|
|
|
output.idempotency_key = message.idempotency_key
|
2020-05-07 06:10:53 -07:00
|
|
|
output.isNormalized = true
|
|
|
|
return output
|
|
|
|
}
|