Handle CW/subject tags in render, fix schema for status create params

This commit is contained in:
Alex Gleason 2023-07-02 13:49:41 -05:00
parent 4edebaa105
commit 07b406c25c
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7
2 changed files with 16 additions and 12 deletions

View file

@ -7,20 +7,20 @@ import { toStatus } from '@/transmute.ts';
import { parseBody } from '@/utils.ts'; import { parseBody } from '@/utils.ts';
const createStatusSchema = z.object({ const createStatusSchema = z.object({
in_reply_to_id: z.string().regex(/[0-9a-f]{64}/).optional(), in_reply_to_id: z.string().regex(/[0-9a-f]{64}/).nullish(),
language: z.string().refine(ISO6391.validate).optional(), language: z.string().refine(ISO6391.validate).nullish(),
media_ids: z.string().array().optional(), media_ids: z.string().array().nullish(),
poll: z.object({ poll: z.object({
options: z.string().array(), options: z.string().array(),
expires_in: z.number(), expires_in: z.number(),
multiple: z.boolean().default(false), multiple: z.boolean().default(false),
hide_totals: z.boolean().default(false), hide_totals: z.boolean().default(false),
}).optional(), }).nullish(),
scheduled_at: z.string().datetime().optional(), scheduled_at: z.string().datetime().nullish(),
sensitive: z.boolean().optional(), sensitive: z.boolean().nullish(),
spoiler_text: z.string().optional(), spoiler_text: z.string().nullish(),
status: z.string().optional(), status: z.string().nullish(),
visibility: z.enum(['public', 'unlisted', 'private', 'direct']).optional(), visibility: z.enum(['public', 'unlisted', 'private', 'direct']).nullish(),
}).refine( }).refine(
(data) => Boolean(data.status || data.media_ids?.length), (data) => Boolean(data.status || data.media_ids?.length),
{ message: 'Status must contain text or media.' }, { message: 'Status must contain text or media.' },

View file

@ -7,6 +7,7 @@ import { getAuthor } from './client.ts';
import { verifyNip05Cached } from './nip05.ts'; import { verifyNip05Cached } from './nip05.ts';
import { getMediaLinks, type MediaLink, parseNoteContent } from './note.ts'; import { getMediaLinks, type MediaLink, parseNoteContent } from './note.ts';
import { type Nip05, parseNip05 } from './utils.ts'; import { type Nip05, parseNip05 } from './utils.ts';
import { isCWTag } from 'https://gitlab.com/soapbox-pub/mostr/-/raw/c67064aee5ade5e01597c6d23e22e53c628ef0e2/src/nostr/tags.ts';
const DEFAULT_AVATAR = 'https://gleasonator.com/images/avi.png'; const DEFAULT_AVATAR = 'https://gleasonator.com/images/avi.png';
const DEFAULT_BANNER = 'https://gleasonator.com/images/banner.png'; const DEFAULT_BANNER = 'https://gleasonator.com/images/banner.png';
@ -117,6 +118,9 @@ async function toStatus(event: Event<1>) {
const content = buildInlineRecipients(mentions) + html; const content = buildInlineRecipients(mentions) + html;
const cw = event.tags.find(isCWTag);
const subject = event.tags.find((tag) => tag[0] === 'subject');
return { return {
id: event.id, id: event.id,
account, account,
@ -125,10 +129,10 @@ async function toStatus(event: Event<1>) {
created_at: new Date(event.created_at * 1000).toISOString(), created_at: new Date(event.created_at * 1000).toISOString(),
in_reply_to_id: replyTag ? replyTag[1] : null, in_reply_to_id: replyTag ? replyTag[1] : null,
in_reply_to_account_id: null, in_reply_to_account_id: null,
sensitive: false, sensitive: !!cw,
spoiler_text: '', spoiler_text: (cw ? cw[1] : subject?.[1]) || null,
visibility: 'public', visibility: 'public',
language: 'en', language: event.tags.find((tag) => tag[0] === 'lang')?.[1] || null,
replies_count: 0, replies_count: 0,
reblogs_count: 0, reblogs_count: 0,
favourites_count: 0, favourites_count: 0,