bye-bye QvitterAPI, I'll miss you and fun we had together

This commit is contained in:
Henry Jameson 2026-06-09 13:20:22 +03:00
commit 3443ddddbb

View file

@ -15,51 +15,15 @@ import { isStatusNotification } from '../notification_utils/notification_utils.j
* it would be reverted back to [] * it would be reverted back to []
*/ */
const qvitterStatusType = (status) => {
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'
}
export const parseUser = (data) => { export const parseUser = (data) => {
const output = {} const output = {}
const masto = Object.hasOwn(data, 'acct')
// case for users in "mentions" property for statuses in MastoAPI // case for users in "mentions" property for statuses in MastoAPI
const mastoShort = masto && !Object.hasOwn(data, 'avatar') const mastoShort = !Object.hasOwn(data, 'avatar')
output.inLists = null output.inLists = null
output.id = String(data.id) output.id = String(data.id)
output._original = data // used for server-side settings output._original = data // used for server-side settings
if (masto) {
output.screen_name = data.acct output.screen_name = data.acct
output.fqn = data.fqn output.fqn = data.fqn
output.statusnet_profile_url = data.url output.statusnet_profile_url = data.url
@ -194,54 +158,6 @@ export const parseUser = (data) => {
// TODO: handle is_local // TODO: handle is_local
output.is_local = !output.screen_name.includes('@') output.is_local = !output.screen_name.includes('@')
} 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
// output.bot = ??? missing
output.statusnet_profile_url = data.statusnet_profile_url
output.is_local = data.is_local
output.role = data.role
output.show_role = data.show_role
if (data.rights) {
output.rights = {
moderator: data.rights.delete_others_notice,
admin: data.rights.admin,
}
}
output.no_rich_text = data.no_rich_text
output.default_scope = data.default_scope
output.hide_follows = data.hide_follows
output.hide_followers = data.hide_followers
output.hide_follows_count = data.hide_follows_count
output.hide_followers_count = data.hide_followers_count
output.background_image = data.background_image
// Websocket token
output.token = data.token
// Convert relationsip data to expected format
output.relationship = {
muting: data.muted,
blocking: data.statusnet_blocking,
followed_by: data.follows_you,
following: data.following,
}
}
output.created_at = new Date(data.created_at) output.created_at = new Date(data.created_at)
output.locked = data.locked output.locked = data.locked
@ -289,17 +205,11 @@ export const parseUser = (data) => {
export const parseAttachment = (data) => { export const parseAttachment = (data) => {
const output = {} const output = {}
const masto = !Object.hasOwn(data, 'oembed')
if (masto) {
// Not exactly same... // Not exactly same...
output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type output.mimetype = data.pleroma ? data.pleroma.mime_type : data.type
output.meta = data.meta // not present in BE yet output.meta = data.meta // not present in BE yet
output.id = data.id output.id = data.id
} else {
output.mimetype = data.mimetype
// output.meta = ??? missing
}
if (data.type !== 'unknown') { if (data.type !== 'unknown') {
// treat gifv like it is "video" // treat gifv like it is "video"
@ -326,9 +236,7 @@ export const parseSource = (data) => {
export const parseStatus = (data) => { export const parseStatus = (data) => {
const output = {} const output = {}
const masto = Object.hasOwn(data, 'account')
if (masto) {
output.favorited = data.favourited output.favorited = data.favourited
output.fave_num = data.favourites_count output.fave_num = data.favourites_count
@ -397,44 +305,6 @@ export const parseStatus = (data) => {
} }
output.pinned = data.pinned output.pinned = data.pinned
output.muted = data.muted output.muted = data.muted
} 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
}
} else {
output.nsfw = data.nsfw
}
output.raw_html = data.statusnet_html
output.text = data.text
output.in_reply_to_status_id = data.in_reply_to_status_id
output.in_reply_to_user_id = data.in_reply_to_user_id
output.in_reply_to_screen_name = data.in_reply_to_screen_name
output.statusnet_conversation_id = data.statusnet_conversation_id
if (output.type === 'retweet') {
output.retweeted_status = parseStatus(data.retweeted_status)
}
output.summary = data.summary
output.summary_html = data.summary_html
output.external_url = data.external_url
output.is_local = data.is_local
}
output.id = String(data.id) output.id = String(data.id)
output.visibility = data.visibility output.visibility = data.visibility
@ -449,17 +319,13 @@ export const parseStatus = (data) => {
? String(output.in_reply_to_user_id) ? String(output.in_reply_to_user_id)
: null : null
output.user = parseUser(masto ? data.account : data.user) output.user = parseUser(data.account)
output.attentions = ((masto ? data.mentions : data.attentions) || []).map( output.attentions = (data.mentions || []).map(parseUser)
parseUser,
)
output.attachments = ( output.attachments = (data.media_attachments || []).map(parseAttachment)
(masto ? data.media_attachments : data.attachments) || []
).map(parseAttachment)
const retweetedStatus = masto ? data.reblog : data.retweeted_status const retweetedStatus = data.reblog
if (retweetedStatus) { if (retweetedStatus) {
output.retweeted_status = parseStatus(retweetedStatus) output.retweeted_status = parseStatus(retweetedStatus)
} }
@ -479,10 +345,8 @@ export const parseNotification = (data) => {
favourite: 'like', favourite: 'like',
reblog: 'repeat', reblog: 'repeat',
} }
const masto = !Object.hasOwn(data, 'ntype')
const output = {} const output = {}
if (masto) {
output.type = mastoDict[data.type] || data.type output.type = mastoDict[data.type] || data.type
output.seen = data.pleroma.is_seen output.seen = data.pleroma.is_seen
// TODO: null check should be a temporary fix, I guess. // TODO: null check should be a temporary fix, I guess.
@ -502,20 +366,6 @@ export const parseNotification = (data) => {
output.report.actor = parseUser(data.report.actor) output.report.actor = parseUser(data.report.actor)
output.report.statuses = data.report.statuses.map(parseStatus) output.report.statuses = data.report.statuses.map(parseStatus)
} }
} else {
const parsedNotice = parseStatus(data.notice)
output.type = data.ntype
output.seen = Boolean(data.is_seen)
output.status =
output.type === 'like'
? parseStatus(data.notice.favorited_status)
: parsedNotice
output.action = parsedNotice
output.from_profile =
output.type === 'pleroma:chat_mention'
? parseUser(data.account)
: parseUser(data.from_profile)
}
output.created_at = new Date(data.created_at) output.created_at = new Date(data.created_at)
output.id = parseInt(data.id) output.id = parseInt(data.id)
@ -523,14 +373,6 @@ export const parseNotification = (data) => {
return output return output
} }
const isNsfw = (status) => {
const nsfwRegex = /#nsfw/i
return (
(status.tags || []).includes('nsfw') ||
!!(status.text || '').match(nsfwRegex)
)
}
export const parseLinkHeaderPagination = (linkHeader, opts = {}) => { export const parseLinkHeaderPagination = (linkHeader, opts = {}) => {
const flakeId = opts.flakeId const flakeId = opts.flakeId
const parsedLinkHeader = parseLinkHeader(linkHeader) const parsedLinkHeader = parseLinkHeader(linkHeader)