enhance(credits): use instance meta instead of hard code

This commit is contained in:
オスカー、 2024-11-27 17:44:23 +09:00
parent 00729a9b8e
commit 06f160a2b4
No known key found for this signature in database
GPG key ID: 139D6573F92DA9F7
19 changed files with 219 additions and 11 deletions

View file

@ -1334,6 +1334,8 @@ useNormalization: "Show the Normalize menu"
alsoMuteNotification: "Also mute notifications from this user" alsoMuteNotification: "Also mute notifications from this user"
muteNotification: "Mute notifications" muteNotification: "Mute notifications"
unmuteNotification: "Unmute notifications" unmuteNotification: "Unmute notifications"
endingCreditMembers: "Users to display in the closing credits"
endingCreditMembersDescription: "IDs of users to display on the server information page, one per line."
_bubbleGame: _bubbleGame:
howToPlay: "How to play" howToPlay: "How to play"
hold: "Hold" hold: "Hold"

8
locales/index.d.ts vendored
View file

@ -5508,6 +5508,14 @@ export interface Locale extends ILocale {
* *
*/ */
"unmuteNotification": string; "unmuteNotification": string;
/**
*
*/
"endingCreditMembers": string;
/**
* IDを一行に一つずつ書きます
*/
"endingCreditMembersDescription": string;
"_bubbleGame": { "_bubbleGame": {
/** /**
* *

View file

@ -1370,6 +1370,8 @@ consentSelected: "選択した項目のみ許可"
alsoMuteNotification: "このユーザーが送信する通知も一緒にミュートする" alsoMuteNotification: "このユーザーが送信する通知も一緒にミュートする"
muteNotification: "通知をミュートする" muteNotification: "通知をミュートする"
unmuteNotification: "通知をミュート解除する" unmuteNotification: "通知をミュート解除する"
endingCreditMembers: "スタッフロールに表示するユーザー"
endingCreditMembersDescription: "サーバー情報ページに表示するユーザーのIDを一行に一つずつ書きます。"
_bubbleGame: _bubbleGame:
howToPlay: "遊び方" howToPlay: "遊び方"

View file

@ -385,7 +385,7 @@ pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의
pinnedClipId: "고정할 클립의 ID" pinnedClipId: "고정할 클립의 ID"
pinnedNotes: "고정된 노트" pinnedNotes: "고정된 노트"
featuredGameChannels: "Misskey Games에 고정할 채널" featuredGameChannels: "Misskey Games에 고정할 채널"
featuredGameChannelsDescription: "Misskey Games에 고정할 채널 한 줄에 하나씩 적습니다." featuredGameChannelsDescription: "Misskey Games에 고정할 채널의 ID를 한 줄에 하나씩 적습니다."
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha 활성화" enableHcaptcha: "hCaptcha 활성화"
hcaptchaSiteKey: "사이트 키" hcaptchaSiteKey: "사이트 키"
@ -1359,6 +1359,8 @@ consentSelected: "선택한 항목만 허용"
alsoMuteNotification: "이 유저가 보내는 알림도 같이 뮤트하기" alsoMuteNotification: "이 유저가 보내는 알림도 같이 뮤트하기"
muteNotification: "알림을 뮤트하기" muteNotification: "알림을 뮤트하기"
unmuteNotification: "알림 뮤트를 해제하기" unmuteNotification: "알림 뮤트를 해제하기"
endingCreditMembers: "엔딩 크레딧에 표시할 유저"
endingCreditMembersDescription: "서버 정보 페이지에 표시할 유저의 ID를 한 줄에 하나씩 적습니다."
_bubbleGame: _bubbleGame:
howToPlay: "설명" howToPlay: "설명"

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class EndingCreditMembers1732695214576 {
name = 'EndingCreditMembers1732695214576'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "endingCreditMembers" character varying(1024) array NOT NULL DEFAULT '{}'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "endingCreditMembers"`);
}
}

View file

@ -614,6 +614,11 @@ export class MiMeta {
}) })
public featuredGameChannels: string[]; public featuredGameChannels: string[];
@Column('varchar', {
length: 1024, array: true, default: '{}',
})
public endingCreditMembers: string[];
@Column('boolean', { @Column('boolean', {
default: true, default: true,
}) })

View file

@ -358,6 +358,7 @@ import * as ep___test from './endpoints/test.js';
import * as ep___username_available from './endpoints/username/available.js'; import * as ep___username_available from './endpoints/username/available.js';
import * as ep___users from './endpoints/users.js'; import * as ep___users from './endpoints/users.js';
import * as ep___users_clips from './endpoints/users/clips.js'; import * as ep___users_clips from './endpoints/users/clips.js';
import * as ep___users_credits from './endpoints/users/credits.js';
import * as ep___users_followers from './endpoints/users/followers.js'; import * as ep___users_followers from './endpoints/users/followers.js';
import * as ep___users_following from './endpoints/users/following.js'; import * as ep___users_following from './endpoints/users/following.js';
import * as ep___users_gallery_posts from './endpoints/users/gallery/posts.js'; import * as ep___users_gallery_posts from './endpoints/users/gallery/posts.js';
@ -758,6 +759,7 @@ const $test: Provider = { provide: 'ep:test', useClass: ep___test.default };
const $username_available: Provider = { provide: 'ep:username/available', useClass: ep___username_available.default }; const $username_available: Provider = { provide: 'ep:username/available', useClass: ep___username_available.default };
const $users: Provider = { provide: 'ep:users', useClass: ep___users.default }; const $users: Provider = { provide: 'ep:users', useClass: ep___users.default };
const $users_clips: Provider = { provide: 'ep:users/clips', useClass: ep___users_clips.default }; const $users_clips: Provider = { provide: 'ep:users/clips', useClass: ep___users_clips.default };
const $users_credits: Provider = { provide: 'ep:users/credits', useClass: ep___users_credits.default };
const $users_followers: Provider = { provide: 'ep:users/followers', useClass: ep___users_followers.default }; const $users_followers: Provider = { provide: 'ep:users/followers', useClass: ep___users_followers.default };
const $users_following: Provider = { provide: 'ep:users/following', useClass: ep___users_following.default }; const $users_following: Provider = { provide: 'ep:users/following', useClass: ep___users_following.default };
const $users_gallery_posts: Provider = { provide: 'ep:users/gallery/posts', useClass: ep___users_gallery_posts.default }; const $users_gallery_posts: Provider = { provide: 'ep:users/gallery/posts', useClass: ep___users_gallery_posts.default };
@ -1162,6 +1164,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$username_available, $username_available,
$users, $users,
$users_clips, $users_clips,
$users_credits,
$users_followers, $users_followers,
$users_following, $users_following,
$users_gallery_posts, $users_gallery_posts,
@ -1558,6 +1561,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$username_available, $username_available,
$users, $users,
$users_clips, $users_clips,
$users_credits,
$users_followers, $users_followers,
$users_following, $users_following,
$users_gallery_posts, $users_gallery_posts,

View file

@ -358,6 +358,7 @@ import * as ep___test from './endpoints/test.js';
import * as ep___username_available from './endpoints/username/available.js'; import * as ep___username_available from './endpoints/username/available.js';
import * as ep___users from './endpoints/users.js'; import * as ep___users from './endpoints/users.js';
import * as ep___users_clips from './endpoints/users/clips.js'; import * as ep___users_clips from './endpoints/users/clips.js';
import * as ep___users_credits from './endpoints/users/credits.js';
import * as ep___users_followers from './endpoints/users/followers.js'; import * as ep___users_followers from './endpoints/users/followers.js';
import * as ep___users_following from './endpoints/users/following.js'; import * as ep___users_following from './endpoints/users/following.js';
import * as ep___users_gallery_posts from './endpoints/users/gallery/posts.js'; import * as ep___users_gallery_posts from './endpoints/users/gallery/posts.js';
@ -756,6 +757,7 @@ const eps = [
['username/available', ep___username_available], ['username/available', ep___username_available],
['users', ep___users], ['users', ep___users],
['users/clips', ep___users_clips], ['users/clips', ep___users_clips],
['users/credits', ep___users_credits],
['users/followers', ep___users_followers], ['users/followers', ep___users_followers],
['users/following', ep___users_following], ['users/following', ep___users_following],
['users/gallery/posts', ep___users_gallery_posts], ['users/gallery/posts', ep___users_gallery_posts],

View file

@ -397,6 +397,13 @@ export const meta = {
optional: false, nullable: false, optional: false, nullable: false,
}, },
}, },
endingCreditMembers: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'string',
},
},
urlPreviewDenyList: { urlPreviewDenyList: {
type: 'array', type: 'array',
optional: false, nullable: false, optional: false, nullable: false,
@ -646,6 +653,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
perUserHomeTimelineCacheMax: instance.perUserHomeTimelineCacheMax, perUserHomeTimelineCacheMax: instance.perUserHomeTimelineCacheMax,
perUserListTimelineCacheMax: instance.perUserListTimelineCacheMax, perUserListTimelineCacheMax: instance.perUserListTimelineCacheMax,
wellKnownWebsites: instance.wellKnownWebsites, wellKnownWebsites: instance.wellKnownWebsites,
endingCreditMembers: instance.endingCreditMembers,
notesPerOneAd: instance.notesPerOneAd, notesPerOneAd: instance.notesPerOneAd,
urlPreviewDenyList: instance.urlPreviewDenyList, urlPreviewDenyList: instance.urlPreviewDenyList,
featuredGameChannels: instance.featuredGameChannels, featuredGameChannels: instance.featuredGameChannels,

View file

@ -161,6 +161,11 @@ export const paramDef = {
type: 'string', type: 'string',
}, },
}, },
endingCreditMembers: {
type: 'array', nullable: true, items: {
type: 'string',
},
},
urlPreviewDenyList: { urlPreviewDenyList: {
type: 'array', nullable: true, items: { type: 'array', nullable: true, items: {
type: 'string', type: 'string',
@ -240,6 +245,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.wellKnownWebsites = ps.wellKnownWebsites.filter(Boolean); set.wellKnownWebsites = ps.wellKnownWebsites.filter(Boolean);
} }
if (Array.isArray(ps.endingCreditMembers)) {
set.wellKnownWebsites = ps.endingCreditMembers.filter(Boolean);
}
if (Array.isArray(ps.urlPreviewDenyList)) { if (Array.isArray(ps.urlPreviewDenyList)) {
set.urlPreviewDenyList = ps.urlPreviewDenyList.filter(Boolean); set.urlPreviewDenyList = ps.urlPreviewDenyList.filter(Boolean);
} }

View file

@ -48,7 +48,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (meta.featuredGameChannels.length === 0) return []; if (meta.featuredGameChannels.length === 0) return [];
const channels = await this.channelsRepository.findBy({ const channels = await this.channelsRepository.findBy({
id: In(meta.featuredGameChannels) id: In(meta.featuredGameChannels),
}); });
return await this.channelEntityService.packMany(channels, me); return await this.channelEntityService.packMany(channels, me);

View file

@ -0,0 +1,66 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { In, IsNull } from 'typeorm';
import { Inject, Injectable } from '@nestjs/common';
import type { UsersRepository } from '@/models/_.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { DI } from '@/di-symbols.js';
import { MetaService } from '@/core/MetaService.js';
export const meta = {
tags: ['users'],
requireCredential: false,
description: 'List up the users of ending credits.',
res: {
optional: false, nullable: false,
oneOf: [
{
type: 'array',
items: {
type: 'object',
ref: 'UserLite',
},
},
],
},
errors: {},
} as const;
export const paramDef = {
type: 'object',
properties: {
},
required: [],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
private metaService: MetaService,
private userEntityService: UserEntityService,
) {
super(meta, paramDef, async (ps, me) => {
const meta = await this.metaService.fetch();
if (meta.endingCreditMembers.length === 0) return [];
const staffs = await this.usersRepository.findBy({
id: In(meta.endingCreditMembers),
host: IsNull(),
});
return await this.userEntityService.packMany(staffs, me);
});
}
}

View file

@ -133,15 +133,15 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label>{{ i18n.ts.credits }}</template> <template #label>{{ i18n.ts.credits }}</template>
<div :class="$style.contributors"> <div :class="$style.contributors">
<MkA v-for="user in staffs" :to="`/@${user.username}`" :class="$style.contributor"> <MkA v-for="user in staffs" :to="`/@${user.username}`" :class="$style.contributor">
<img :src="user.avatarUrl ?? '/static-assets/avatar.png'" :class="$style.contributorAvatar" :alt="`Profile image of @${user.username}@oscar.surf`"> <MkAvatar :user="user" :class="$style.contributorAvatar" :alt="`Profile image of @${user.username}@oscar.surf`"/>
<span :class="$style.contributorUsername">@{{ user.username }} <span :class="$style.contributorUsername">@{{ user.username }}
<span :class="$style.contributorClient"> <span :class="$style.contributorClient">
<span :class="$style.oscar">オスカー</span> <span :class="instanceColor">{{ instance.name }}</span>
</span> </span>
</span> </span>
</MkA> </MkA>
<MkA v-if="$i !== null" :to="`/@${$i.username}`" :class="$style.contributor"> <MkA v-if="$i !== null" :to="`/@${$i.username}`" :class="$style.contributor">
<img :src="$i.avatarUrl ?? '/static-assets/avatar.png'" :class="$style.contributorAvatar" :alt="`Profile image of @${$i.username}@oscar.surf`"> <MkAvatar :user="$i" :class="$style.contributorAvatar" :alt="`Profile image of @${$i.username}@oscar.surf`"/>
<span :class="$style.contributorUsername">{{ `@${$i.username}` }} <span :class="$style.contributorUsername">{{ `@${$i.username}` }}
<span :class="$style.contributorClient"> <span :class="$style.contributorClient">
<span :class="$style.thankYou">{{ i18n.ts.thankYou }}</span> <span :class="$style.thankYou">{{ i18n.ts.thankYou }}</span>
@ -191,6 +191,7 @@ import FormSection from '@/components/form/section.vue';
import FormSuspense from '@/components/form/suspense.vue'; import FormSuspense from '@/components/form/suspense.vue';
import FormSplit from '@/components/form/split.vue'; import FormSplit from '@/components/form/split.vue';
import MkA from '@/components/global/MkA.vue'; import MkA from '@/components/global/MkA.vue';
import MkAvatar from '@/components/global/MkAvatar.vue';
import MkFolder from '@/components/MkFolder.vue'; import MkFolder from '@/components/MkFolder.vue';
import MkKeyValue from '@/components/MkKeyValue.vue'; import MkKeyValue from '@/components/MkKeyValue.vue';
import MkInfo from '@/components/MkInfo.vue'; import MkInfo from '@/components/MkInfo.vue';
@ -214,9 +215,13 @@ const props = withDefaults(defineProps<{
const stats = ref<Misskey.entities.StatsResponse | null>(null); const stats = ref<Misskey.entities.StatsResponse | null>(null);
const tab = ref(props.initialTab); const tab = ref(props.initialTab);
const staffs = ref<Misskey.entities.User[]>([]); const staffs = ref<Misskey.entities.User[]>([]);
const staffIds = ['9ua5ndrtx7', '9urvwtlwo6']; const instanceColor = computed(() => {
return {
color: `${instance.themeColor}`,
};
});
staffs.value = await misskeyApi('users/show', { userIds: staffIds }); staffs.value = await misskeyApi('users/credits', {});
watch(tab, () => { watch(tab, () => {
if (tab.value === 'charts') { if (tab.value === 'charts') {
@ -361,10 +366,6 @@ definePageMetadata(() => ({
font-size: 11px; font-size: 11px;
font-weight: bold; font-weight: bold;
> .oscar {
color: #00ff63;
}
> .thankYou { > .thankYou {
color: #5a70ff; color: #5a70ff;
} }

View file

@ -50,6 +50,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #caption>{{ i18n.ts.featuredGameChannelsDescription }}</template> <template #caption>{{ i18n.ts.featuredGameChannelsDescription }}</template>
</MkTextarea> </MkTextarea>
<MkTextarea v-model="endingCreditMembers">
<template #label>{{ i18n.ts.endingCreditMembers }}</template>
<template #caption>{{ i18n.ts.endingCreditMembersDescription }}</template>
</MkTextarea>
<FormSection> <FormSection>
<template #label>{{ i18n.ts.files }}</template> <template #label>{{ i18n.ts.files }}</template>
@ -224,6 +229,7 @@ const maintainerEmail = ref<string | null>(null);
const impressumUrl = ref<string | null>(null); const impressumUrl = ref<string | null>(null);
const pinnedUsers = ref<string>(''); const pinnedUsers = ref<string>('');
const featuredGameChannels = ref<string>(''); const featuredGameChannels = ref<string>('');
const endingCreditMembers = ref<string>('');
const cacheRemoteFiles = ref<boolean>(false); const cacheRemoteFiles = ref<boolean>(false);
const cacheRemoteSensitiveFiles = ref<boolean>(false); const cacheRemoteSensitiveFiles = ref<boolean>(false);
const enableServiceWorker = ref<boolean>(false); const enableServiceWorker = ref<boolean>(false);
@ -253,6 +259,7 @@ async function init(): Promise<void> {
impressumUrl.value = meta.impressumUrl; impressumUrl.value = meta.impressumUrl;
pinnedUsers.value = meta.pinnedUsers.join('\n'); pinnedUsers.value = meta.pinnedUsers.join('\n');
featuredGameChannels.value = meta.featuredGameChannels.join('\n'); featuredGameChannels.value = meta.featuredGameChannels.join('\n');
endingCreditMembers.value = meta.endingCreditMembers.join('\n');
cacheRemoteFiles.value = meta.cacheRemoteFiles; cacheRemoteFiles.value = meta.cacheRemoteFiles;
cacheRemoteSensitiveFiles.value = meta.cacheRemoteSensitiveFiles; cacheRemoteSensitiveFiles.value = meta.cacheRemoteSensitiveFiles;
enableServiceWorker.value = meta.enableServiceWorker; enableServiceWorker.value = meta.enableServiceWorker;
@ -283,6 +290,7 @@ async function save() {
impressumUrl: impressumUrl.value, impressumUrl: impressumUrl.value,
pinnedUsers: pinnedUsers.value.split('\n'), pinnedUsers: pinnedUsers.value.split('\n'),
featuredGameChannels: featuredGameChannels.value.split('\n'), featuredGameChannels: featuredGameChannels.value.split('\n'),
endingCreditMembers: endingCreditMembers.value.split('\n'),
cacheRemoteFiles: cacheRemoteFiles.value, cacheRemoteFiles: cacheRemoteFiles.value,
cacheRemoteSensitiveFiles: cacheRemoteSensitiveFiles.value, cacheRemoteSensitiveFiles: cacheRemoteSensitiveFiles.value,
enableServiceWorker: enableServiceWorker.value, enableServiceWorker: enableServiceWorker.value,

View file

@ -1736,6 +1736,7 @@ declare namespace entities {
UsersResponse, UsersResponse,
UsersClipsRequest, UsersClipsRequest,
UsersClipsResponse, UsersClipsResponse,
UsersCreditsResponse,
UsersFollowersRequest, UsersFollowersRequest,
UsersFollowersResponse, UsersFollowersResponse,
UsersFollowingRequest, UsersFollowingRequest,
@ -3148,6 +3149,9 @@ type UsersClipsRequest = operations['users___clips']['requestBody']['content']['
// @public (undocumented) // @public (undocumented)
type UsersClipsResponse = operations['users___clips']['responses']['200']['content']['application/json']; type UsersClipsResponse = operations['users___clips']['responses']['200']['content']['application/json'];
// @public (undocumented)
type UsersCreditsResponse = operations['users___credits']['responses']['200']['content']['application/json'];
// @public (undocumented) // @public (undocumented)
type UsersFeaturedNotesRequest = operations['users___featured-notes']['requestBody']['content']['application/json']; type UsersFeaturedNotesRequest = operations['users___featured-notes']['requestBody']['content']['application/json'];

View file

@ -3918,6 +3918,17 @@ declare module '../api.js' {
credential?: string | null, credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>>; ): Promise<SwitchCaseResponseType<E, P>>;
/**
* List up the users of ending credits.
*
* **Credential required**: *No*
*/
request<E extends 'users/credits', P extends Endpoints[E]['req']>(
endpoint: E,
params: P,
credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>>;
/** /**
* Show everyone that follows this user. * Show everyone that follows this user.
* *

View file

@ -516,6 +516,7 @@ import type {
UsersResponse, UsersResponse,
UsersClipsRequest, UsersClipsRequest,
UsersClipsResponse, UsersClipsResponse,
UsersCreditsResponse,
UsersFollowersRequest, UsersFollowersRequest,
UsersFollowersResponse, UsersFollowersResponse,
UsersFollowingRequest, UsersFollowingRequest,
@ -946,6 +947,7 @@ export type Endpoints = {
'username/available': { req: UsernameAvailableRequest; res: UsernameAvailableResponse }; 'username/available': { req: UsernameAvailableRequest; res: UsernameAvailableResponse };
'users': { req: UsersRequest; res: UsersResponse }; 'users': { req: UsersRequest; res: UsersResponse };
'users/clips': { req: UsersClipsRequest; res: UsersClipsResponse }; 'users/clips': { req: UsersClipsRequest; res: UsersClipsResponse };
'users/credits': { req: EmptyRequest; res: UsersCreditsResponse };
'users/followers': { req: UsersFollowersRequest; res: UsersFollowersResponse }; 'users/followers': { req: UsersFollowersRequest; res: UsersFollowersResponse };
'users/following': { req: UsersFollowingRequest; res: UsersFollowingResponse }; 'users/following': { req: UsersFollowingRequest; res: UsersFollowingResponse };
'users/gallery/posts': { req: UsersGalleryPostsRequest; res: UsersGalleryPostsResponse }; 'users/gallery/posts': { req: UsersGalleryPostsRequest; res: UsersGalleryPostsResponse };

View file

@ -519,6 +519,7 @@ export type UsersRequest = operations['users']['requestBody']['content']['applic
export type UsersResponse = operations['users']['responses']['200']['content']['application/json']; export type UsersResponse = operations['users']['responses']['200']['content']['application/json'];
export type UsersClipsRequest = operations['users___clips']['requestBody']['content']['application/json']; export type UsersClipsRequest = operations['users___clips']['requestBody']['content']['application/json'];
export type UsersClipsResponse = operations['users___clips']['responses']['200']['content']['application/json']; export type UsersClipsResponse = operations['users___clips']['responses']['200']['content']['application/json'];
export type UsersCreditsResponse = operations['users___credits']['responses']['200']['content']['application/json'];
export type UsersFollowersRequest = operations['users___followers']['requestBody']['content']['application/json']; export type UsersFollowersRequest = operations['users___followers']['requestBody']['content']['application/json'];
export type UsersFollowersResponse = operations['users___followers']['responses']['200']['content']['application/json']; export type UsersFollowersResponse = operations['users___followers']['responses']['200']['content']['application/json'];
export type UsersFollowingRequest = operations['users___following']['requestBody']['content']['application/json']; export type UsersFollowingRequest = operations['users___following']['requestBody']['content']['application/json'];

View file

@ -3370,6 +3370,15 @@ export type paths = {
*/ */
post: operations['users___clips']; post: operations['users___clips'];
}; };
'/users/credits': {
/**
* users/credits
* @description List up the users of ending credits.
*
* **Credential required**: *No*
*/
post: operations['users___credits'];
};
'/users/followers': { '/users/followers': {
/** /**
* users/followers * users/followers
@ -5392,6 +5401,7 @@ export type operations = {
perUserListTimelineCacheMax: number; perUserListTimelineCacheMax: number;
notesPerOneAd: number; notesPerOneAd: number;
wellKnownWebsites: string[]; wellKnownWebsites: string[];
endingCreditMembers: string[];
urlPreviewDenyList: string[]; urlPreviewDenyList: string[];
featuredGameChannels: string[]; featuredGameChannels: string[];
backgroundImageUrl: string | null; backgroundImageUrl: string | null;
@ -10356,6 +10366,7 @@ export type operations = {
silencedHosts?: string[] | null; silencedHosts?: string[] | null;
sensitiveMediaHosts?: string[] | null; sensitiveMediaHosts?: string[] | null;
wellKnownWebsites?: string[] | null; wellKnownWebsites?: string[] | null;
endingCreditMembers?: string[] | null;
urlPreviewDenyList?: string[] | null; urlPreviewDenyList?: string[] | null;
featuredGameChannels?: string[] | null; featuredGameChannels?: string[] | null;
/** @description [Deprecated] Use "urlPreviewSummaryProxyUrl" instead. */ /** @description [Deprecated] Use "urlPreviewSummaryProxyUrl" instead. */
@ -27697,6 +27708,52 @@ export type operations = {
}; };
}; };
}; };
/**
* users/credits
* @description List up the users of ending credits.
*
* **Credential required**: *No*
*/
users___credits: {
responses: {
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['UserLite'][];
};
};
/** @description Client error */
400: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Authentication error */
401: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Forbidden error */
403: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description I'm Ai */
418: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Internal server error */
500: {
content: {
'application/json': components['schemas']['Error'];
};
};
};
};
/** /**
* users/followers * users/followers
* @description Show everyone that follows this user. * @description Show everyone that follows this user.