Merge tag '2023.12.0' into merge-upstream

This commit is contained in:
riku6460
2023-12-23 20:22:38 +09:00
77 changed files with 2067 additions and 530 deletions

View File

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

View File

@@ -9,6 +9,7 @@ import { Inject, Injectable } from '@nestjs/common';
import { validate as validateEmail } from 'deep-email-validator';
import { SubOutputFormat } from 'deep-email-validator/dist/output/output.js';
import { MetaService } from '@/core/MetaService.js';
import { UtilityService } from '@/core/UtilityService.js';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type Logger from '@/logger.js';
@@ -30,6 +31,7 @@ export class EmailService {
private metaService: MetaService,
private loggerService: LoggerService,
private utilityService: UtilityService,
private httpRequestService: HttpRequestService,
) {
this.logger = this.loggerService.getLogger('email');
@@ -155,7 +157,7 @@ export class EmailService {
@bindThis
public async validateEmailForAccount(emailAddress: string): Promise<{
available: boolean;
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned';
}> {
const meta = await this.metaService.fetch();
@@ -164,32 +166,35 @@ export class EmailService {
email: emailAddress,
});
const verifymailApi = meta.enableVerifymailApi && meta.verifymailAuthKey != null;
let validated;
if (meta.enableActiveEmailValidation && meta.verifymailAuthKey) {
if (verifymailApi) {
if (meta.enableActiveEmailValidation) {
if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) {
validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey);
} else {
validated = meta.enableActiveEmailValidation ? await validateEmail({
validated = await validateEmail({
email: emailAddress,
validateRegex: true,
validateMx: true,
validateTypo: false, // TLDを見ているみたいだけどclubとか弾かれるので
validateDisposable: true, // 捨てアドかどうかチェック
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
}) : { valid: true, reason: null };
});
}
} else {
validated = { valid: true, reason: null };
}
const available = exist === 0 && validated.valid;
const emailDomain: string = emailAddress.split('@')[1];
const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain);
const available = exist === 0 && validated.valid && !isBanned;
return {
available,
reason: available ? null :
exist !== 0 ? 'used' :
isBanned ? 'banned' :
validated.reason === 'regex' ? 'format' :
validated.reason === 'disposable' ? 'disposable' :
validated.reason === 'mx' ? 'mx' :

View File

@@ -293,7 +293,7 @@ export class NoteCreateService implements OnApplicationShutdown {
}
// Check blocking
if (data.renote && this.isQuote(data)) {
if (data.renote && !this.isQuote(data)) {
if (data.renote.userHost === null) {
if (data.renote.userId !== user.id) {
const blocked = await this.userBlockingService.checkBlocked(data.renote.userId, user.id);
@@ -731,8 +731,9 @@ export class NoteCreateService implements OnApplicationShutdown {
}
@bindThis
private isQuote(note: Option): boolean {
return !!note.text || !!note.cw || !!note.files || !!note.poll;
private isQuote(note: Option): note is Option & { renote: MiNote } {
// sync with misc/is-quote.ts
return !!note.renote && (!!note.text || !!note.cw || (!!note.files && !!note.files.length) || !!note.poll);
}
@bindThis
@@ -801,7 +802,7 @@ export class NoteCreateService implements OnApplicationShutdown {
private async renderNoteOrRenoteActivity(data: Option, note: MiNote) {
if (data.localOnly) return null;
const content = data.renote && this.isQuote(data)
const content = data.renote && !this.isQuote(data)
? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.url}/notes/${data.renote.id}`, note)
: this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note);

View File

@@ -3,8 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
import { Inject, Injectable, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
import * as Redis from 'ioredis';
import { ModuleRef } from '@nestjs/core';
import type { UserListMembershipsRepository } from '@/models/_.js';
import type { MiUser } from '@/models/User.js';
import type { MiUserList } from '@/models/UserList.js';
@@ -21,12 +22,15 @@ import { RedisKVCache } from '@/misc/cache.js';
import { RoleService } from '@/core/RoleService.js';
@Injectable()
export class UserListService implements OnApplicationShutdown {
export class UserListService implements OnApplicationShutdown, OnModuleInit {
public static TooManyUsersError = class extends Error {};
public membersCache: RedisKVCache<Set<string>>;
private roleService: RoleService;
constructor(
private moduleRef: ModuleRef,
@Inject(DI.redis)
private redisClient: Redis.Redis,
@@ -38,7 +42,6 @@ export class UserListService implements OnApplicationShutdown {
private userEntityService: UserEntityService,
private idService: IdService,
private roleService: RoleService,
private globalEventService: GlobalEventService,
private proxyAccountService: ProxyAccountService,
private queueService: QueueService,
@@ -54,6 +57,10 @@ export class UserListService implements OnApplicationShutdown {
this.redisForSub.on('message', this.onMessage);
}
async onModuleInit() {
this.roleService = this.moduleRef.get(RoleService.name);
}
@bindThis
private async onMessage(_: string, data: string): Promise<void> {
const obj = JSON.parse(data);

View File

@@ -7,5 +7,6 @@ import type { MiNote } from '@/models/Note.js';
// eslint-disable-next-line import/no-default-export
export default function(note: MiNote): boolean {
// sync with NoteCreateService.isQuote
return note.renoteId != null && (note.text != null || note.hasPoll || (note.fileIds != null && note.fileIds.length > 0));
}

View File

@@ -40,6 +40,7 @@ import { packedUserListMembershipSchema, packedUserListSchema } from '@/models/j
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
import { packedSigninSchema } from '@/models/json-schema/signin.js';
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
import { packedAdSchema } from '@/models/json-schema/ad.js';
export const refs = {
UserLite: packedUserLiteSchema,
@@ -52,6 +53,7 @@ export const refs = {
UserList: packedUserListSchema,
UserListMembership: packedUserListMembershipSchema,
Ad: packedAdSchema,
Announcement: packedAnnouncementSchema,
App: packedAppSchema,
Note: packedNoteSchema,

View File

@@ -495,6 +495,13 @@ export class MiMeta {
})
public manifestJsonOverride: string;
@Column('varchar', {
length: 1024,
array: true,
default: '{}',
})
public bannedEmailDomains: string[];
@Column('varchar', {
length: 1024, array: true, default: '{ "admin", "administrator", "root", "system", "maintainer", "host", "mod", "moderator", "owner", "superuser", "staff", "auth", "i", "me", "everyone", "all", "mention", "mentions", "example", "user", "users", "account", "accounts", "official", "help", "helps", "support", "supports", "info", "information", "informations", "announce", "announces", "announcement", "announcements", "notice", "notification", "notifications", "dev", "developer", "developers", "tech", "misskey" }',
})

View File

@@ -0,0 +1,64 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export const packedAdSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false,
nullable: false,
format: 'id',
example: 'xxxxxxxxxx',
},
expiresAt: {
type: 'string',
optional: false,
nullable: false,
format: 'date-time',
},
startsAt: {
type: 'string',
optional: false,
nullable: false,
format: 'date-time',
},
place: {
type: 'string',
optional: false,
nullable: false,
},
priority: {
type: 'string',
optional: false,
nullable: false,
},
ratio: {
type: 'number',
optional: false,
nullable: false,
},
url: {
type: 'string',
optional: false,
nullable: false,
},
imageUrl: {
type: 'string',
optional: false,
nullable: false,
},
memo: {
type: 'string',
optional: false,
nullable: false,
},
dayOfWeek: {
type: 'integer',
optional: false,
nullable: false,
},
},
} as const;

View File

@@ -25,6 +25,11 @@ export const meta = {
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
},
},
res: {
type: 'object',
optional: false, nullable: false,
ref: 'User',
},
} as const;
export const paramDef = {

View File

@@ -17,6 +17,12 @@ export const meta = {
requireCredential: true,
requireModerator: true,
res: {
type: 'object',
optional: false,
nullable: false,
ref: 'Ad',
},
} as const;
export const paramDef = {
@@ -63,7 +69,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
ad: ad,
});
return ad;
return {
id: ad.id,
expiresAt: ad.expiresAt.toISOString(),
startsAt: ad.startsAt.toISOString(),
dayOfWeek: ad.dayOfWeek,
url: ad.url,
imageUrl: ad.imageUrl,
priority: ad.priority,
ratio: ad.ratio,
place: ad.place,
memo: ad.memo,
};
});
}
}

View File

@@ -16,6 +16,17 @@ export const meta = {
requireCredential: true,
requireModerator: true,
res: {
type: 'array',
optional: false,
nullable: false,
items: {
type: 'object',
optional: false,
nullable: false,
ref: 'Ad',
},
},
} as const;
export const paramDef = {
@@ -46,7 +57,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
}
const ads = await query.limit(ps.limit).getMany();
return ads;
return ads.map(ad => ({
id: ad.id,
expiresAt: ad.expiresAt.toISOString(),
startsAt: ad.startsAt.toISOString(),
dayOfWeek: ad.dayOfWeek,
url: ad.url,
imageUrl: ad.imageUrl,
memo: ad.memo,
place: ad.place,
priority: ad.priority,
ratio: ad.ratio,
}));
});
}
}

View File

@@ -31,6 +31,8 @@ export const meta = {
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
},
},
ref: 'EmojiDetailed',
} as const;
export const paramDef = {

View File

@@ -15,6 +15,16 @@ export const meta = {
kind: 'read:admin',
tags: ['admin'],
res: {
type: 'array',
items: {
type: 'object',
properties: {
tablename: { type: 'string' },
indexname: { type: 'string' },
},
},
},
} as const;
export const paramDef = {

View File

@@ -16,6 +16,25 @@ export const meta = {
requireCredential: true,
requireModerator: true,
res: {
type: 'array',
optional: false,
nullable: false,
items: {
type: 'object',
optional: false,
nullable: false,
properties: {
ip: { type: 'string' },
createdAt: {
type: 'string',
optional: false,
nullable: false,
format: 'date-time',
},
},
},
}
} as const;
export const paramDef = {

View File

@@ -145,6 +145,14 @@ export const meta = {
type: 'string',
},
},
bannedEmailDomains: {
type: 'array',
optional: true, nullable: false,
items: {
type: 'string',
optional: false, nullable: false,
},
},
preservedUsernames: {
type: 'array',
optional: false, nullable: false,
@@ -521,6 +529,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
enableChartsForFederatedInstances: instance.enableChartsForFederatedInstances,
enableServerMachineStats: instance.enableServerMachineStats,
enableIdenticonGeneration: instance.enableIdenticonGeneration,
bannedEmailDomains: instance.bannedEmailDomains,
policies: { ...DEFAULT_POLICIES, ...instance.policies },
manifestJsonOverride: instance.manifestJsonOverride,
enableFanoutTimeline: instance.enableFanoutTimeline,

View File

@@ -28,6 +28,20 @@ export const meta = {
id: '224eff5e-2488-4b18-b3e7-f50d94421648',
},
},
res: {
type: 'array',
items: {
type: 'object',
properties: {
id: { type: 'string', format: 'misskey:id' },
createdAt: { type: 'string', format: 'date-time' },
user: { ref: 'UserDetailed' },
expiresAt: { type: 'string', format: 'date-time', nullable: true },
},
required: ['id', 'createdAt', 'user'],
},
}
} as const;
export const paramDef = {
@@ -80,7 +94,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
id: assign.id,
createdAt: this.idService.parse(assign.id).date.toISOString(),
user: await this.userEntityService.pack(assign.user!, me, { detail: true }),
expiresAt: assign.expiresAt,
expiresAt: assign.expiresAt?.toISOString() ?? null,
})));
});
}

View File

@@ -122,6 +122,7 @@ export const paramDef = {
enableServerMachineStats: { type: 'boolean' },
enableIdenticonGeneration: { type: 'boolean' },
serverRules: { type: 'array', items: { type: 'string' } },
bannedEmailDomains: { type: 'array', items: { type: 'string' } },
preservedUsernames: { type: 'array', items: { type: 'string' } },
manifestJsonOverride: { type: 'string' },
enableFanoutTimeline: { type: 'boolean' },
@@ -534,6 +535,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.notesPerOneAd = ps.notesPerOneAd;
}
if (ps.bannedEmailDomains !== undefined) {
set.bannedEmailDomains = ps.bannedEmailDomains;
}
const before = await this.metaService.fetch(true);
await this.metaService.update(set);

View File

@@ -11,6 +11,23 @@ export const meta = {
requireCredential: false,
tags: ['meta'],
res: {
type: 'object',
nullable: true,
properties: {
params: {
type: 'array',
items: {
type: 'object',
properties: {
name: { type: 'string' },
type: { type: 'string' },
},
},
},
},
},
} as const;
export const paramDef = {

View File

@@ -18,6 +18,92 @@ export const meta = {
allowGet: true,
cacheSec: 60 * 60,
res: {
type: 'object',
optional: false,
nullable: false,
properties: {
topSubInstances: {
type: 'array',
optional: false,
nullable: false,
items: {
properties: {
id: { type: 'string' },
firstRetrievedAt: { type: 'string' },
host: { type: 'string' },
usersCount: { type: 'number' },
notesCount: { type: 'number' },
followingCount: { type: 'number' },
followersCount: { type: 'number' },
isNotResponding: { type: 'boolean' },
isSuspended: { type: 'boolean' },
isBlocked: { type: 'boolean' },
softwareName: { type: 'string' },
softwareVersion: { type: 'string' },
openRegistrations: { type: 'boolean' },
name: { type: 'string' },
description: { type: 'string' },
maintainerName: { type: 'string' },
maintainerEmail: { type: 'string' },
isSilenced: { type: 'boolean' },
iconUrl: { type: 'string' },
faviconUrl: { type: 'string' },
themeColor: { type: 'string' },
infoUpdatedAt: {
type: 'string',
nullable: true,
},
latestRequestReceivedAt: {
type: 'string',
nullable: true,
},
}
},
},
otherFollowersCount: { type: 'number' },
topPubInstances: {
type: 'array',
optional: false,
nullable: false,
items: {
properties: {
id: { type: 'string' },
firstRetrievedAt: { type: 'string' },
host: { type: 'string' },
usersCount: { type: 'number' },
notesCount: { type: 'number' },
followingCount: { type: 'number' },
followersCount: { type: 'number' },
isNotResponding: { type: 'boolean' },
isSuspended: { type: 'boolean' },
isBlocked: { type: 'boolean' },
softwareName: { type: 'string' },
softwareVersion: { type: 'string' },
openRegistrations: { type: 'boolean' },
name: { type: 'string' },
description: { type: 'string' },
maintainerName: { type: 'string' },
maintainerEmail: { type: 'string' },
isSilenced: { type: 'boolean' },
iconUrl: { type: 'string' },
faviconUrl: { type: 'string' },
themeColor: { type: 'string' },
infoUpdatedAt: {
type: 'string',
nullable: true,
},
latestRequestReceivedAt: {
type: 'string',
nullable: true,
},
}
},
},
otherFollowingCount: { type: 'number' },
},
}
} as const;
export const paramDef = {

View File

@@ -32,6 +32,18 @@ export const meta = {
id: '693ba8ba-b486-40df-a174-72f8279b56a4',
},
},
res: {
type: 'object',
properties: {
type: {
type: 'string',
},
data: {
type: 'string',
},
},
},
} as const;
export const paramDef = {

View File

@@ -16,6 +16,18 @@ export const meta = {
requireCredential: false,
allowGet: true,
cacheSec: 60 * 3,
res: {
type: 'object',
properties: {
items: {
type: 'array',
items: {
type: 'object',
},
}
}
},
} as const;
export const paramDef = {

View File

@@ -28,6 +28,12 @@ export const meta = {
errors: {
},
res: {
type: 'object',
optional: false, nullable: false,
ref: 'Flash',
},
} as const;
export const paramDef = {

View File

@@ -16,6 +16,16 @@ export const meta = {
requireCredential: false,
allowGet: true,
cacheSec: 60 * 1,
res: {
type: 'object',
optional: false, nullable: false,
properties: {
count: {
type: 'number',
nullable: false,
},
},
},
} as const;
export const paramDef = {

View File

@@ -38,6 +38,16 @@ export const meta = {
id: '798d6847-b1ed-4f9c-b1f9-163c42655995',
},
},
res: {
type: 'object',
nullable: false,
optional: false,
properties: {
id: { type: 'string' },
name: { type: 'string' },
},
},
} as const;
export const paramDef = {

View File

@@ -42,6 +42,140 @@ export const meta = {
id: 'bf32b864-449b-47b8-974e-f9a5468546f1',
},
},
res: {
type: 'object',
nullable: false,
optional: false,
properties: {
rp: {
type: 'object',
properties: {
id: {
type: 'string',
nullable: true,
},
},
},
user: {
type: 'object',
properties: {
id: {
type: 'string',
},
name: {
type: 'string',
},
displayName: {
type: 'string',
},
},
},
challenge: {
type: 'string',
},
pubKeyCredParams: {
type: 'array',
items: {
type: 'object',
properties: {
type: {
type: 'string',
},
alg: {
type: 'number',
},
},
},
},
timeout: {
type: 'number',
nullable: true,
},
excludeCredentials: {
type: 'array',
nullable: true,
items: {
type: 'object',
properties: {
id: {
type: 'string',
},
type: {
type: 'string',
},
transports: {
type: 'array',
items: {
type: 'string',
enum: [
"ble",
"cable",
"hybrid",
"internal",
"nfc",
"smart-card",
"usb",
],
},
},
},
},
},
authenticatorSelection: {
type: 'object',
nullable: true,
properties: {
authenticatorAttachment: {
type: 'string',
enum: [
"cross-platform",
"platform",
],
},
requireResidentKey: {
type: 'boolean',
},
userVerification: {
type: 'string',
enum: [
"discouraged",
"preferred",
"required",
],
},
},
},
attestation: {
type: 'string',
nullable: true,
enum: [
"direct",
"enterprise",
"indirect",
"none",
],
},
extensions: {
type: 'object',
nullable: true,
properties: {
appid: {
type: 'string',
nullable: true,
},
credProps: {
type: 'boolean',
nullable: true,
},
hmacCreateSecret: {
type: 'boolean',
nullable: true,
},
},
},
},
},
} as const;
export const paramDef = {

View File

@@ -32,6 +32,19 @@ export const meta = {
id: 'e428f177-c6ae-4e91-9c7e-334b1836f9aa',
},
},
res: {
type: 'object',
nullable: false,
optional: false,
properties: {
qr: { type: 'string' },
url: { type: 'string' },
secret: { type: 'string' },
label: { type: 'string' },
issuer: { type: 'string' },
},
},
} as const;
export const paramDef = {

View File

@@ -13,6 +13,37 @@ export const meta = {
requireCredential: true,
secure: true,
res: {
type: 'array',
items: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id',
},
name: {
type: 'string',
},
createdAt: {
type: 'string',
format: 'date-time',
},
lastUsedAt: {
type: 'string',
format: 'date-time',
},
permission: {
type: 'array',
uniqueItems: true,
items: {
type: 'string'
},
}
},
},
},
} as const;
export const paramDef = {
@@ -50,7 +81,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
id: token.id,
name: token.name ?? token.app?.name,
createdAt: this.idService.parse(token.id).date.toISOString(),
lastUsedAt: token.lastUsedAt,
lastUsedAt: token.lastUsedAt?.toISOString(),
permission: token.permission,
})));
});

View File

@@ -14,6 +14,36 @@ export const meta = {
requireCredential: true,
secure: true,
res: {
type: 'array',
items: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id',
},
name: {
type: 'string',
},
callbackUrl: {
type: 'string',
nullable: true,
},
permission: {
type: 'array',
uniqueItems: true,
items: {
type: 'string'
},
},
isAuthorized: {
type: 'boolean',
},
},
},
},
} as const;
export const paramDef = {

View File

@@ -67,6 +67,10 @@ export const meta = {
id: 'b234a14e-9ebe-4581-8000-074b3c215962',
},
},
res: {
type: 'object',
},
} as const;
export const paramDef = {

View File

@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
res: {
type: 'object',
},
} as const;
export const paramDef = {

View File

@@ -18,6 +18,10 @@ export const meta = {
id: '97a1e8e7-c0f7-47d2-957a-92e61256e01a',
},
},
res: {
type: 'object',
}
} as const;
export const paramDef = {

View File

@@ -18,6 +18,10 @@ export const meta = {
id: 'ac3ed68a-62f0-422b-a7bc-d5e09e8f6a6a',
},
},
res: {
type: 'object',
}
} as const;
export const paramDef = {

View File

@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
res: {
type: 'object',
},
} as const;
export const paramDef = {

View File

@@ -10,6 +10,28 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
export const meta = {
requireCredential: true,
secure: true,
res: {
type: 'array',
items: {
type: 'object',
properties: {
scopes: {
type: 'array',
items: {
type: 'array',
items: {
type: 'string',
}
}
},
domain: {
type: 'string',
nullable: true,
},
},
},
}
} as const;
export const paramDef = {

View File

@@ -47,6 +47,11 @@ export const meta = {
id: 'a2defefb-f220-8849-0af6-17f816099323',
},
},
res: {
type: 'object',
ref: 'UserDetailed',
},
} as const;
export const paramDef = {

View File

@@ -28,6 +28,33 @@ export const meta = {
id: '87a9bb19-111e-4e37-81d3-a3e7426453b0',
},
},
res: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id'
},
userId: {
type: 'string',
format: 'misskey:id',
},
name: { type: 'string' },
on: {
type: 'array',
items: {
type: 'string',
enum: webhookEventTypes,
}
},
url: { type: 'string' },
secret: { type: 'string' },
active: { type: 'boolean' },
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
latestStatus: { type: 'integer', nullable: true },
},
},
} as const;
export const paramDef = {
@@ -74,7 +101,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
this.globalEventService.publishInternalEvent('webhookCreated', webhook);
return webhook;
return {
id: webhook.id,
userId: webhook.userId,
name: webhook.name,
on: webhook.on,
url: webhook.url,
secret: webhook.secret,
active: webhook.active,
latestSentAt: webhook.latestSentAt?.toISOString(),
latestStatus: webhook.latestStatus,
};
});
}
}

View File

@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { webhookEventTypes } from '@/models/Webhook.js';
import type { WebhooksRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
@@ -14,6 +15,36 @@ export const meta = {
requireCredential: true,
kind: 'read:account',
res: {
type: 'array',
items: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id'
},
userId: {
type: 'string',
format: 'misskey:id',
},
name: { type: 'string' },
on: {
type: 'array',
items: {
type: 'string',
enum: webhookEventTypes,
}
},
url: { type: 'string' },
secret: { type: 'string' },
active: { type: 'boolean' },
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
latestStatus: { type: 'integer', nullable: true },
},
}
}
} as const;
export const paramDef = {
@@ -33,7 +64,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
userId: me.id,
});
return webhooks;
return webhooks.map(webhook => (
{
id: webhook.id,
userId: webhook.userId,
name: webhook.name,
on: webhook.on,
url: webhook.url,
secret: webhook.secret,
active: webhook.active,
latestSentAt: webhook.latestSentAt?.toISOString(),
latestStatus: webhook.latestStatus,
}
));
});
}
}

View File

@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { webhookEventTypes } from '@/models/Webhook.js';
import type { WebhooksRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
import { ApiError } from '../../../error.js';
@@ -23,6 +24,33 @@ export const meta = {
id: '50f614d9-3047-4f7e-90d8-ad6b2d5fb098',
},
},
res: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id'
},
userId: {
type: 'string',
format: 'misskey:id',
},
name: { type: 'string' },
on: {
type: 'array',
items: {
type: 'string',
enum: webhookEventTypes,
}
},
url: { type: 'string' },
secret: { type: 'string' },
active: { type: 'boolean' },
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
latestStatus: { type: 'integer', nullable: true },
},
},
} as const;
export const paramDef = {
@@ -49,7 +77,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.noSuchWebhook);
}
return webhook;
return {
id: webhook.id,
userId: webhook.userId,
name: webhook.name,
on: webhook.on,
url: webhook.url,
secret: webhook.secret,
active: webhook.active,
latestSentAt: webhook.latestSentAt?.toISOString(),
latestStatus: webhook.latestStatus,
};
});
}
}

View File

@@ -24,6 +24,25 @@ export const meta = {
id: '30aaaee3-4792-48dc-ab0d-cf501a575ac5',
},
},
res: {
type: 'array',
items: {
type: 'object',
nullable: false,
properties: {
id: {
type: 'string',
format: 'misskey:id'
},
user: {
type: 'object',
ref: 'User'
},
},
required: ['id', 'user'],
},
},
} as const;
export const paramDef = {

View File

@@ -15,6 +15,53 @@ export const meta = {
cacheSec: 60 * 1,
tags: ['meta'],
res: {
type: 'object',
optional: false, nullable: false,
properties: {
machine: {
type: 'string',
nullable: false,
},
cpu: {
type: 'object',
nullable: false,
properties: {
model: {
type: 'string',
nullable: false,
},
cores: {
type: 'number',
nullable: false,
},
},
},
mem: {
type: 'object',
properties: {
total: {
type: 'number',
nullable: false,
},
},
},
fs: {
type: 'object',
nullable: false,
properties: {
total: {
type: 'number',
nullable: false,
},
used: {
type: 'number',
nullable: false,
},
},
},
},
},
} as const;
export const paramDef = {

View File

@@ -12,6 +12,30 @@ export const meta = {
description: 'Endpoint for testing input validation.',
requireCredential: false,
res: {
type: 'object',
properties: {
id: {
type: 'string',
format: 'misskey:id'
},
required: {
type: 'boolean',
},
string: {
type: 'string',
},
default: {
type: 'string',
},
nullableDefault: {
type: 'string',
default: 'hello',
nullable: true,
},
}
}
} as const;
export const paramDef = {

View File

@@ -10,6 +10,21 @@ import { DI } from '@/di-symbols.js';
export const meta = {
requireCredential: true,
res: {
type: 'array',
items: {
type: 'object',
properties: {
name: {
type: 'string',
},
unlockedAt: {
type: 'number',
},
},
},
}
} as const;
export const paramDef = {

View File

@@ -25,6 +25,35 @@ export const meta = {
id: '7bc05c21-1d7a-41ae-88f1-66820f4dc686',
},
},
res: {
type: 'array',
items: {
type: 'object',
nullable: false,
properties: {
id: {
type: 'string',
format: 'misskey:id',
},
createdAt: {
type: 'string',
format: 'date-time',
},
userId: {
type: 'string',
format: 'misskey:id',
},
user: {
type: 'object',
ref: 'User',
},
withReplies: {
type: 'boolean',
},
},
},
},
} as const;
export const paramDef = {

View File

@@ -10,9 +10,8 @@ process.env.NODE_ENV = 'test';
process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING = 'true';
import * as assert from 'assert';
import { signup, api, post, react, startServer, waitFire, sleep, uploadUrl, randomString } from '../utils.js';
import { api, post, randomString, signup, sleep, startServer, uploadUrl } from '../utils.js';
import type { INestApplicationContext } from '@nestjs/common';
import type * as misskey from 'misskey-js';
function genHost() {
return randomString() + '.example.com';
@@ -366,8 +365,8 @@ describe('Timelines', () => {
await api('/following/create', { userId: bob.id }, alice);
await sleep(1000);
const [bobFile, carolFile] = await Promise.all([
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
]);
const bobNote1 = await post(bob, { text: 'hi' });
const bobNote2 = await post(bob, { fileIds: [bobFile.id] });
@@ -666,7 +665,7 @@ describe('Timelines', () => {
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
const [alice, bob] = await Promise.all([signup(), signup()]);
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
const bobNote1 = await post(bob, { text: 'hi' });
const bobNote2 = await post(bob, { fileIds: [file.id] });
@@ -804,7 +803,7 @@ describe('Timelines', () => {
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
const [alice, bob] = await Promise.all([signup(), signup()]);
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
const bobNote1 = await post(bob, { text: 'hi' });
const bobNote2 = await post(bob, { fileIds: [file.id] });
@@ -1000,7 +999,7 @@ describe('Timelines', () => {
const list = await api('/users/lists/create', { name: 'list' }, alice).then(res => res.body);
await api('/users/lists/push', { listId: list.id, userId: bob.id }, alice);
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
const bobNote1 = await post(bob, { text: 'hi' });
const bobNote2 = await post(bob, { fileIds: [file.id] });
@@ -1159,7 +1158,7 @@ describe('Timelines', () => {
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
const [alice, bob] = await Promise.all([signup(), signup()]);
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
const bobNote1 = await post(bob, { text: 'hi' });
const bobNote2 = await post(bob, { fileIds: [file.id] });

View File

@@ -73,13 +73,21 @@ describe('RoleService', () => {
CacheService,
IdService,
GlobalEventService,
{
provide: NotificationService,
useFactory: () => ({
createNotification: jest.fn(),
}),
},
{
provide: NotificationService.name,
useExisting: NotificationService,
},
],
})
.useMocker((token) => {
if (token === MetaService) {
return { fetch: jest.fn() };
} else if (token === NotificationService) {
return { createNotification: jest.fn() };
}
if (typeof token === 'function') {
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
@@ -98,6 +106,8 @@ describe('RoleService', () => {
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
notificationService = app.get<NotificationService>(NotificationService) as jest.Mocked<NotificationService>;
await roleService.onModuleInit();
});
afterEach(async () => {
@@ -284,10 +294,12 @@ describe('RoleService', () => {
const user = await createUser();
const role = await createRole({
isPublic: true,
name: 'a',
});
await roleService.assign(user.id, role.id);
clock.uninstall();
await sleep(100);
const assignments = await roleAssignmentsRepository.find({
@@ -301,7 +313,7 @@ describe('RoleService', () => {
expect(notificationService.createNotification).toHaveBeenCalled();
expect(notificationService.createNotification.mock.lastCall![0]).toBe(user.id);
expect(notificationService.createNotification.mock.lastCall![1]).toBe('roleAssigned');
expect(notificationService.createNotification.mock.lastCall![2]).toBe({
expect(notificationService.createNotification.mock.lastCall![2]).toEqual({
roleId: role.id,
});
});
@@ -310,10 +322,12 @@ describe('RoleService', () => {
const user = await createUser();
const role = await createRole({
isPublic: false,
name: 'a',
});
await roleService.assign(user.id, role.id);
clock.uninstall();
await sleep(100);
const assignments = await roleAssignmentsRepository.find({

View File

@@ -4,49 +4,70 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1">
<div class="banner" :style="bannerStyle">
<div class="fade"></div>
<div class="name"><i class="ti ti-device-tv"></i> {{ channel.name }}</div>
<div v-if="channel.isSensitive" class="sensitiveIndicator">{{ i18n.ts.sensitive }}</div>
<div class="status">
<div>
<i class="ti ti-users ti-fw"></i>
<I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.usersCount }}</b>
</template>
</I18n>
</div>
<div>
<i class="ti ti-pencil ti-fw"></i>
<I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.notesCount }}</b>
</template>
</I18n>
<div style="position: relative;">
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1" @click="updateLastReadedAt">
<div class="banner" :style="bannerStyle">
<div class="fade"></div>
<div class="name"><i class="ti ti-device-tv"></i> {{ channel.name }}</div>
<div v-if="channel.isSensitive" class="sensitiveIndicator">{{ i18n.ts.sensitive }}</div>
<div class="status">
<div>
<i class="ti ti-users ti-fw"></i>
<I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.usersCount }}</b>
</template>
</I18n>
</div>
<div>
<i class="ti ti-pencil ti-fw"></i>
<I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;">
<template #n>
<b>{{ channel.notesCount }}</b>
</template>
</I18n>
</div>
</div>
</div>
</div>
<article v-if="channel.description">
<p :title="channel.description">{{ channel.description.length > 85 ? channel.description.slice(0, 85) + '…' : channel.description }}</p>
</article>
<footer>
<span v-if="channel.lastNotedAt">
{{ i18n.ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
</span>
</footer>
</MkA>
<article v-if="channel.description">
<p :title="channel.description">{{ channel.description.length > 85 ? channel.description.slice(0, 85) + '…' : channel.description }}</p>
</article>
<footer>
<span v-if="channel.lastNotedAt">
{{ i18n.ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
</span>
</footer>
</MkA>
<div
v-if="channel.lastNotedAt && (channel.isFavorited || channel.isFollowing) && (!lastReadedAt || Date.parse(channel.lastNotedAt) > lastReadedAt)"
class="indicator"
></div>
</div>
</template>
<script lang="ts" setup>
import { computed } from 'vue';
import { computed, ref, watch } from 'vue';
import { i18n } from '@/i18n.js';
import { miLocalStorage } from '@/local-storage.js';
const props = defineProps<{
channel: Record<string, any>;
}>();
const getLastReadedAt = (): number | null => {
return miLocalStorage.getItemAsJson(`channelLastReadedAt:${props.channel.id}`) ?? null;
};
const lastReadedAt = ref(getLastReadedAt());
watch(() => props.channel.id, () => {
lastReadedAt.value = getLastReadedAt();
});
const updateLastReadedAt = () => {
lastReadedAt.value = props.channel.lastNotedAt ? Date.parse(props.channel.lastNotedAt) : Date.now();
};
const bannerStyle = computed(() => {
if (props.channel.bannerUrl) {
return { backgroundImage: `url(${props.channel.bannerUrl})` };
@@ -170,4 +191,17 @@ const bannerStyle = computed(() => {
}
}
.indicator {
position: absolute;
top: 0;
right: 0;
transform: translate(25%, -25%);
background-color: var(--accent);
border: solid var(--bg) 4px;
border-radius: 100%;
width: 1.5rem;
height: 1.5rem;
aspect-ratio: 1 / 1;
}
</style>

View File

@@ -23,7 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
</I18n>
<div style="margin-top: 0.2em;">
<MkLink target="_blank" url="https://misskey-hub.net/docs/donate.html">{{ i18n.ts.learnMore }}</MkLink>
<MkLink target="_blank" url="https://misskey-hub.net/docs/for-users/resources/donate/">{{ i18n.ts.learnMore }}</MkLink>
</div>
</div>
<div class="_buttons">

View File

@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template v-for="(item, i) in items2">
<div v-if="item.type === 'divider'" role="separator" :class="$style.divider"></div>
<span v-else-if="item.type === 'label'" role="menuitem" :class="[$style.label, $style.item]">
<span>{{ item.text }}</span>
<span style="opacity: 0.7;">{{ item.text }}</span>
</span>
<span v-else-if="item.type === 'pending'" role="menuitem" :tabindex="i" :class="[$style.pending, $style.item]">
<span><MkEllipsis/></span>
@@ -23,32 +23,44 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkA v-else-if="item.type === 'link'" role="menuitem" :to="item.to" :tabindex="i" class="_button" :class="$style.item" @click.passive="close(true)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
<MkAvatar v-if="item.avatar" :user="item.avatar" :class="$style.avatar"/>
<span>{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
<div :class="$style.item_content">
<span :class="$style.item_content_text">{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
</div>
</MkA>
<a v-else-if="item.type === 'a'" role="menuitem" :href="item.href" :target="item.target" :download="item.download" :tabindex="i" class="_button" :class="$style.item" @click="close(true)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
<span>{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
<div :class="$style.item_content">
<span :class="$style.item_content_text">{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
</div>
</a>
<button v-else-if="item.type === 'user'" role="menuitem" :tabindex="i" class="_button" :class="[$style.item, { [$style.active]: item.active }]" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<MkAvatar :user="item.user" :class="$style.avatar"/><MkUserName :user="item.user"/>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
<div v-if="item.indicate" :class="$style.item_content">
<span :class="$style.indicator"><i class="_indicatorCircle"></i></span>
</div>
</button>
<button v-else-if="item.type === 'switch'" role="menuitemcheckbox" :tabindex="i" class="_button" :class="[$style.item, $style.switch, { [$style.switchDisabled]: item.disabled } ]" @click="switchItem(item)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<MkSwitchButton :class="$style.switchButton" :checked="item.ref" :disabled="item.disabled" @toggle="switchItem(item)"/>
<span :class="$style.switchText">{{ item.text }}</span>
<div :class="$style.item_content">
<span :class="[$style.item_content_text, $style.switchText]">{{ item.text }}</span>
</div>
</button>
<button v-else-if="item.type === 'parent'" class="_button" role="menuitem" :tabindex="i" :class="[$style.item, $style.parent, { [$style.childShowing]: childShowingItem === item }]" @mouseenter="preferClick ? null : showChildren(item, $event)" @click="!preferClick ? null : showChildren(item, $event)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]" style="pointer-events: none;"></i>
<span style="pointer-events: none;">{{ item.text }}</span>
<span :class="$style.caret" style="pointer-events: none;"><i class="ti ti-chevron-right ti-fw"></i></span>
<div :class="$style.item_content">
<span :class="$style.item_content_text" style="pointer-events: none;">{{ item.text }}</span>
<span :class="$style.caret" style="pointer-events: none;"><i class="ti ti-chevron-right ti-fw"></i></span>
</div>
</button>
<button v-else :tabindex="i" class="_button" role="menuitem" :class="[$style.item, { [$style.danger]: item.danger, [$style.active]: item.active }]" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
<MkAvatar v-if="item.avatar" :user="item.avatar" :class="$style.avatar"/>
<span>{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
<div :class="$style.item_content">
<span :class="$style.item_content_text">{{ item.text }}</span>
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
</div>
</button>
</template>
<span v-if="items2.length === 0" :class="[$style.none, $style.item]">
@@ -228,6 +240,7 @@ onBeforeUnmount(() => {
.root {
padding: 8px 0;
box-sizing: border-box;
max-width: 100vw;
min-width: 200px;
overflow: auto;
overscroll-behavior: contain;
@@ -267,7 +280,8 @@ onBeforeUnmount(() => {
}
.item {
display: block;
display: flex;
align-items: center;
position: relative;
padding: 5px 16px;
width: 100%;
@@ -340,10 +354,6 @@ onBeforeUnmount(() => {
pointer-events: none;
font-size: 0.7em;
padding-bottom: 4px;
> span {
opacity: 0.7;
}
}
&.pending {
@@ -373,6 +383,22 @@ onBeforeUnmount(() => {
}
}
.item_content {
width: 100%;
max-width: 100vw;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
text-overflow: ellipsis;
}
.item_content_text {
max-width: calc(100vw - 4rem);
text-overflow: ellipsis;
overflow: hidden;
}
.switch {
position: relative;
display: flex;
@@ -406,6 +432,7 @@ onBeforeUnmount(() => {
.icon {
margin-right: 8px;
line-height: 1;
}
.caret {
@@ -419,9 +446,8 @@ onBeforeUnmount(() => {
}
.indicator {
position: absolute;
top: 5px;
left: 13px;
display: flex;
align-items: center;
color: var(--indicator);
font-size: 12px;
animation: blink 1s infinite;

View File

@@ -38,6 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<span v-else-if="emailState === 'unavailable:used'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.used }}</span>
<span v-else-if="emailState === 'unavailable:format'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.format }}</span>
<span v-else-if="emailState === 'unavailable:disposable'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.disposable }}</span>
<span v-else-if="emailState === 'unavailable:banned'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.banned }}</span>
<span v-else-if="emailState === 'unavailable:mx'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.mx }}</span>
<span v-else-if="emailState === 'unavailable:smtp'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.smtp }}</span>
<span v-else-if="emailState === 'unavailable'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.unavailable }}</span>
@@ -110,7 +111,7 @@ const retypedPassword = ref<string>('');
const invitationCode = ref<string>('');
const email = ref('');
const usernameState = ref<null | 'wait' | 'ok' | 'unavailable' | 'error' | 'invalid-format' | 'min-range' | 'max-range'>(null);
const emailState = ref<null | 'wait' | 'ok' | 'unavailable:used' | 'unavailable:format' | 'unavailable:disposable' | 'unavailable:mx' | 'unavailable:smtp' | 'unavailable' | 'error'>(null);
const emailState = ref<null | 'wait' | 'ok' | 'unavailable:used' | 'unavailable:format' | 'unavailable:disposable' | 'unavailable:banned' | 'unavailable:mx' | 'unavailable:smtp' | 'unavailable' | 'error'>(null);
const passwordStrength = ref<'' | 'low' | 'medium' | 'high'>('');
const passwordRetypeState = ref<null | 'match' | 'not-match'>(null);
const submitting = ref<boolean>(false);
@@ -209,6 +210,7 @@ function onChangeEmail(): void {
result.reason === 'used' ? 'unavailable:used' :
result.reason === 'format' ? 'unavailable:format' :
result.reason === 'disposable' ? 'unavailable:disposable' :
result.reason === 'banned' ? 'unavailable:banned' :
result.reason === 'mx' ? 'unavailable:mx' :
result.reason === 'smtp' ? 'unavailable:smtp' :
'unavailable';

View File

@@ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label>{{ i18n.ts.basicNotesBeforeCreateAccount }}</template>
<template #suffix><i v-if="agreeNote" class="ti ti-check" style="color: var(--success)"></i></template>
<a href="https://misskey-hub.net/docs/notes.html" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
<a href="https://misskey-hub.net/docs/for-users/onboarding/warning/" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
<MkSwitch :modelValue="agreeNote" style="margin-top: 16px;" data-cy-signup-rules-notes-agree @update:modelValue="updateAgreeNote">{{ i18n.ts.agree }}</MkSwitch>
</MkFolder>

View File

@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.divider"></div>
<I18n :src="i18n.ts._initialTutorial._timeline.description3" tag="div" style="padding: 0 16px;">
<template #link>
<a href="https://misskey-hub.net/docs/features/timeline.html" target="_blank" class="_link">{{ i18n.ts.help }}</a>
<a href="https://misskey-hub.net/docs/for-users/features/timeline/" target="_blank" class="_link">{{ i18n.ts.help }}</a>
</template>
</I18n>

View File

@@ -130,7 +130,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div style="font-size: 120%;">{{ i18n.ts._initialTutorial._done.title }}</div>
<I18n :src="i18n.ts._initialTutorial._done.description" tag="div" style="padding: 0 16px;">
<template #link>
<a href="https://misskey-hub.net/help.html" target="_blank" class="_link">{{ i18n.ts.help }}</a>
<a href="https://misskey-hub.net/docs/for-users/" target="_blank" class="_link">{{ i18n.ts.help }}</a>
</template>
</I18n>
<div>{{ i18n.t('_initialAccountSetting.haveFun', { name: instance.name ?? host }) }}</div>

View File

@@ -123,13 +123,13 @@ function showMenu(ev) {
text: i18n.ts.help,
icon: 'ti ti-help-circle',
action: () => {
window.open('https://misskey-hub.net/help.md', '_blank', 'noopener');
window.open('https://misskey-hub.net/docs/for-users/', '_blank', 'noopener');
},
}], ev.currentTarget ?? ev.target);
}
function exploreOtherServers() {
window.open('https://join.misskey.page/instances', '_blank', 'noopener');
window.open('https://misskey-hub.net/servers/', '_blank', 'noopener');
}
</script>

View File

@@ -53,7 +53,7 @@ import { PageHeaderItem } from '@/types/page-header.js';
const props = withDefaults(defineProps<{
tabs?: Tab[];
tab?: string;
actions?: PageHeaderItem[];
actions?: PageHeaderItem[] | null;
thin?: boolean;
displayMyAvatar?: boolean;
}>(), {

View File

@@ -35,7 +35,8 @@ type Keys =
`themes:${string}` |
`aiscript:${string}` |
'lastEmojisFetchedAt' | // DEPRECATED, stored in indexeddb (13.9.0~)
'emojis' // DEPRECATED, stored in indexeddb (13.9.0~);
'emojis' | // DEPRECATED, stored in indexeddb (13.9.0~);
`channelLastReadedAt:${string}`
export const miLocalStorage = {
getItem: (key: Keys): string | null => window.localStorage.getItem(key),

View File

@@ -22,7 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<button v-if="thereIsTreasure" class="_button treasure" @click="getTreasure"><img src="/fluent-emoji/1f3c6.png" class="treasureImg"></button>
</div>
<div style="text-align: center;">
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/about-misskey/" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
</div>
<div v-if="$i != null" style="text-align: center;">
<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton>
@@ -139,73 +139,73 @@ import { $i } from '@/account.js';
const patronsWithIcon = [{
name: 'カイヤン',
icon: 'https://misskey-hub.net/patrons/a2820716883e408cb87773e377ce7c8d.jpg',
icon: 'https://assets.misskey-hub.net/patrons/a2820716883e408cb87773e377ce7c8d.jpg',
}, {
name: 'だれかさん',
icon: 'https://misskey-hub.net/patrons/f7409b5e5a88477a9b9d740c408de125.jpg',
icon: 'https://assets.misskey-hub.net/patrons/f7409b5e5a88477a9b9d740c408de125.jpg',
}, {
name: 'narazaka',
icon: 'https://misskey-hub.net/patrons/e3affff31ffb4877b1196c7360abc3e5.jpg',
icon: 'https://assets.misskey-hub.net/patrons/e3affff31ffb4877b1196c7360abc3e5.jpg',
}, {
name: 'ひとぅ',
icon: 'https://misskey-hub.net/patrons/8cc0d0a0a6d84c88bca1aedabf6ed5ab.jpg',
icon: 'https://assets.misskey-hub.net/patrons/8cc0d0a0a6d84c88bca1aedabf6ed5ab.jpg',
}, {
name: 'ぱーこ',
icon: 'https://misskey-hub.net/patrons/79c6602ffade489e8df2fcf2c2bc5d9d.jpg',
icon: 'https://assets.misskey-hub.net/patrons/79c6602ffade489e8df2fcf2c2bc5d9d.jpg',
}, {
name: 'わっほー☆',
icon: 'https://misskey-hub.net/patrons/d31d5d13924443a082f3da7966318a0a.jpg',
icon: 'https://assets.misskey-hub.net/patrons/d31d5d13924443a082f3da7966318a0a.jpg',
}, {
name: 'mollinaca',
icon: 'https://misskey-hub.net/patrons/ceb36b8f66e549bdadb3b90d5da62314.jpg',
icon: 'https://assets.misskey-hub.net/patrons/ceb36b8f66e549bdadb3b90d5da62314.jpg',
}, {
name: '坂本龍',
icon: 'https://misskey-hub.net/patrons/a631cf8b490145cf8dbbe4e7508cfbc2.jpg',
icon: 'https://assets.misskey-hub.net/patrons/a631cf8b490145cf8dbbe4e7508cfbc2.jpg',
}, {
name: 'takke',
icon: 'https://misskey-hub.net/patrons/6c3327e626c046f2914fbcd9f7557935.jpg',
icon: 'https://assets.misskey-hub.net/patrons/6c3327e626c046f2914fbcd9f7557935.jpg',
}, {
name: 'ぺんぎん',
icon: 'https://misskey-hub.net/patrons/6a652e0534ff4cb1836e7ce4968d76a7.jpg',
icon: 'https://assets.misskey-hub.net/patrons/6a652e0534ff4cb1836e7ce4968d76a7.jpg',
}, {
name: 'かみらえっと',
icon: 'https://misskey-hub.net/patrons/be1326bda7d940a482f3758ffd9ffaf6.jpg',
icon: 'https://assets.misskey-hub.net/patrons/be1326bda7d940a482f3758ffd9ffaf6.jpg',
}, {
name: 'へてて',
icon: 'https://misskey-hub.net/patrons/0431eacd7c6843d09de8ea9984307e86.jpg',
icon: 'https://assets.misskey-hub.net/patrons/0431eacd7c6843d09de8ea9984307e86.jpg',
}, {
name: 'spinlock',
icon: 'https://misskey-hub.net/patrons/6a1cebc819d540a78bf20e9e3115baa8.jpg',
icon: 'https://assets.misskey-hub.net/patrons/6a1cebc819d540a78bf20e9e3115baa8.jpg',
}, {
name: 'じゅくま',
icon: 'https://misskey-hub.net/patrons/3e56bdac69dd42f7a06e0f12cf2fc895.jpg',
icon: 'https://assets.misskey-hub.net/patrons/3e56bdac69dd42f7a06e0f12cf2fc895.jpg',
}, {
name: '清遊あみ',
icon: 'https://misskey-hub.net/patrons/de25195b88e940a388388bea2e7637d8.jpg',
icon: 'https://assets.misskey-hub.net/patrons/de25195b88e940a388388bea2e7637d8.jpg',
}, {
name: 'Nagi8410',
icon: 'https://misskey-hub.net/patrons/31b102ab4fc540ed806b0461575d38be.jpg',
icon: 'https://assets.misskey-hub.net/patrons/31b102ab4fc540ed806b0461575d38be.jpg',
}, {
name: '山岡士郎',
icon: 'https://misskey-hub.net/patrons/84b9056341684266bb1eda3e680d094d.jpg',
icon: 'https://assets.misskey-hub.net/patrons/84b9056341684266bb1eda3e680d094d.jpg',
}, {
name: 'よもやまたろう',
icon: 'https://misskey-hub.net/patrons/4273c9cce50d445f8f7d0f16113d6d7f.jpg',
icon: 'https://assets.misskey-hub.net/patrons/4273c9cce50d445f8f7d0f16113d6d7f.jpg',
}, {
name: '花咲ももか',
icon: 'https://misskey-hub.net/patrons/8c9b2b9128cb4fee99f04bb4f86f2efa.jpg',
icon: 'https://assets.misskey-hub.net/patrons/8c9b2b9128cb4fee99f04bb4f86f2efa.jpg',
}, {
name: 'カガミ',
icon: 'https://misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg',
icon: 'https://assets.misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg',
}, {
name: 'フランギ・シュウ',
icon: 'https://misskey-hub.net/patrons/3016d37e35f3430b90420176c912d304.jpg',
icon: 'https://assets.misskey-hub.net/patrons/3016d37e35f3430b90420176c912d304.jpg',
}, {
name: '百日紅',
icon: 'https://misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg',
icon: 'https://assets.misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg',
}, {
name: 'taichan',
icon: 'https://misskey-hub.net/patrons/f981ab0159fb4e2c998e05f7263e1cd9.png',
icon: 'https://assets.misskey-hub.net/patrons/f981ab0159fb4e2c998e05f7263e1cd9.png',
}];
const patrons = [

View File

@@ -74,15 +74,26 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #label>Enable</template>
</MkSwitch>
<MkSwitch v-model="enableVerifymailApi" @update:modelValue="save">
<template #label>Use Verifymail API</template>
<template #label>Use Verifymail.io API</template>
</MkSwitch>
<MkInput v-model="verifymailAuthKey" @update:modelValue="save">
<template #prefix><i class="ti ti-key"></i></template>
<template #label>Verifymail API Auth Key</template>
<template #label>Verifymail.io API Auth Key</template>
</MkInput>
</div>
</MkFolder>
<MkFolder>
<template #label>Banned Email Domains</template>
<div class="_gaps_m">
<MkTextarea v-model="bannedEmailDomains">
<template #label>Banned Email Domains List</template>
</MkTextarea>
<MkButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
</div>
</MkFolder>
<MkFolder>
<template #label>Log IP address</template>
<template v-if="enableIpLogging" #suffix>Enabled</template>
@@ -124,6 +135,7 @@ import FormSuspense from '@/components/form/suspense.vue';
import MkRange from '@/components/MkRange.vue';
import MkInput from '@/components/MkInput.vue';
import MkButton from '@/components/MkButton.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import * as os from '@/os.js';
import { fetchInstance } from '@/instance.js';
import { i18n } from '@/i18n.js';
@@ -141,6 +153,7 @@ const enableIpLogging = ref<boolean>(false);
const enableActiveEmailValidation = ref<boolean>(false);
const enableVerifymailApi = ref<boolean>(false);
const verifymailAuthKey = ref<string | null>(null);
const bannedEmailDomains = ref<string>('');
async function init() {
const meta = await os.api('admin/meta');
@@ -161,6 +174,7 @@ async function init() {
enableActiveEmailValidation.value = meta.enableActiveEmailValidation;
enableVerifymailApi.value = meta.enableVerifymailApi;
verifymailAuthKey.value = meta.verifymailAuthKey;
bannedEmailDomains.value = meta.bannedEmailDomains.join('\n');
}
function save() {
@@ -180,6 +194,7 @@ function save() {
enableActiveEmailValidation: enableActiveEmailValidation.value,
enableVerifymailApi: enableVerifymailApi.value,
verifymailAuthKey: verifymailAuthKey.value,
bannedEmailDomains: bannedEmailDomains.value.split('\n'),
}).then(() => {
fetchInstance();
});

View File

@@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<XChannelFollowButton :channel="channel" :full="true" :class="$style.subscribe"/>
<MkButton v-if="favorited" v-tooltip="i18n.ts.unfavorite" asLike class="button" rounded primary :class="$style.favorite" @click="unfavorite()"><i class="ti ti-star"></i></MkButton>
<MkButton v-else v-tooltip="i18n.ts.favorite" asLike class="button" rounded :class="$style.favorite" @click="favorite()"><i class="ti ti-star"></i></MkButton>
<div :style="{ backgroundImage: channel.bannerUrl ? `url(${channel.bannerUrl})` : null }" :class="$style.banner">
<div :style="{ backgroundImage: channel.bannerUrl ? `url(${channel.bannerUrl})` : undefined }" :class="$style.banner">
<div :class="$style.bannerStatus">
<div><i class="ti ti-users ti-fw"></i><I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;"><template #n><b>{{ channel.usersCount }}</b></template></I18n></div>
<div><i class="ti ti-pencil ti-fw"></i><I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;"><template #n><b>{{ channel.notesCount }}</b></template></I18n></div>
@@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkFoldableSection>
<template #header><i class="ti ti-pin ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.pinnedNotes }}</template>
<div v-if="channel.pinnedNotes.length > 0" class="_gaps">
<div v-if="channel.pinnedNotes && channel.pinnedNotes.length > 0" class="_gaps">
<MkNote v-for="note in channel.pinnedNotes" :key="note.id" class="_panel" :note="note"/>
</div>
</MkFoldableSection>
@@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<!-- スマホタブレットの場合キーボードが表示されると投稿が見づらくなるのでデスクトップ場合のみ自動でフォーカスを当てる -->
<MkPostForm v-if="$i && defaultStore.reactiveState.showFixedPostFormInChannel.value" :channel="channel" class="post-form _panel" fixed :autofocus="deviceKind === 'desktop'"/>
<MkTimeline :key="channelId" src="channel" :channel="channelId" @before="before" @after="after"/>
<MkTimeline :key="channelId" src="channel" :channel="channelId" @before="before" @after="after" @note="miLocalStorage.setItemAsJson(`channelLastReadedAt:${channel.id}`, Date.now())"/>
</div>
<div v-else-if="tab === 'featured'">
<MkNotes :pagination="featuredPagination"/>
@@ -69,6 +69,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed, watch, ref } from 'vue';
import * as Misskey from 'misskey-js';
import MkPostForm from '@/components/MkPostForm.vue';
import MkTimeline from '@/components/MkTimeline.vue';
import XChannelFollowButton from '@/components/MkChannelFollowButton.vue';
@@ -89,6 +90,7 @@ import MkFoldableSection from '@/components/MkFoldableSection.vue';
import { PageHeaderItem } from '@/types/page-header.js';
import { isSupportShare } from '@/scripts/navigator.js';
import copyToClipboard from '@/scripts/copy-to-clipboard.js';
import { miLocalStorage } from '@/local-storage.js';
const router = useRouter();
@@ -97,7 +99,7 @@ const props = defineProps<{
}>();
const tab = ref('overview');
const channel = ref(null);
const channel = ref<Misskey.entities.Channel | null>(null);
const favorited = ref(false);
const searchQuery = ref('');
const searchPagination = ref();
@@ -114,14 +116,23 @@ watch(() => props.channelId, async () => {
channel.value = await os.api('channels/show', {
channelId: props.channelId,
});
favorited.value = channel.value.isFavorited;
favorited.value = channel.value.isFavorited ?? false;
if (favorited.value || channel.value.isFollowing) {
tab.value = 'timeline';
}
if ((favorited.value || channel.value.isFollowing) && channel.value.lastNotedAt) {
const lastReadedAt: number = miLocalStorage.getItemAsJson(`channelLastReadedAt:${channel.value.id}`) ?? 0;
const lastNotedAt = Date.parse(channel.value.lastNotedAt);
if (lastNotedAt > lastReadedAt) {
miLocalStorage.setItemAsJson(`channelLastReadedAt:${channel.value.id}`, lastNotedAt);
}
}
}, { immediate: true });
function edit() {
router.push(`/channels/${channel.value.id}/edit`);
router.push(`/channels/${channel.value?.id}/edit`);
}
function openPostForm() {
@@ -131,6 +142,8 @@ function openPostForm() {
}
function favorite() {
if (!channel.value) return;
os.apiWithDialog('channels/favorite', {
channelId: channel.value.id,
}).then(() => {
@@ -139,6 +152,8 @@ function favorite() {
}
async function unfavorite() {
if (!channel.value) return;
const confirm = await os.confirm({
type: 'warning',
text: i18n.ts.unfavoriteConfirm,
@@ -152,6 +167,8 @@ async function unfavorite() {
}
async function search() {
if (!channel.value) return;
const query = searchQuery.value.toString().trim();
if (query == null) return;
@@ -176,6 +193,10 @@ const headerActions = computed(() => {
icon: 'ti ti-link',
text: i18n.ts.copyUrl,
handler: async (): Promise<void> => {
if (!channel.value) {
console.warn('failed to copy channel URL. channel.value is null.');
return;
}
copyToClipboard(`${url}/channels/${channel.value.id}`);
os.success();
},
@@ -186,9 +207,14 @@ const headerActions = computed(() => {
icon: 'ti ti-share',
text: i18n.ts.share,
handler: async (): Promise<void> => {
if (!channel.value) {
console.warn('failed to share channel. channel.value is null.');
return;
}
navigator.share({
title: channel.value.name,
text: channel.value.description,
text: channel.value.description ?? undefined,
url: `${url}/channels/${channel.value.id}`,
});
},

View File

@@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
// SPECIFICATION: https://misskey-hub.net/docs/features/share-form.html
// SPECIFICATION: https://misskey-hub.net/docs/for-users/features/share-form/
import { ref, computed } from 'vue';
import * as Misskey from 'misskey-js';

View File

@@ -48,6 +48,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
import { antennasCache, userListsCache } from '@/cache.js';
import { deviceKind } from '@/scripts/device-kind.js';
import { MenuItem } from '@/types/menu.js';
import { miLocalStorage } from '@/local-storage.js';
provide('shouldOmitHeaderTitle', true);
@@ -125,12 +126,17 @@ async function chooseChannel(ev: MouseEvent): Promise<void> {
limit: 100,
});
const items: MenuItem[] = [
...channels.map(channel => ({
type: 'link' as const,
text: channel.name,
indicate: channel.hasUnreadNote,
to: `/channels/${channel.id}`,
})),
...channels.map(channel => {
const lastReadedAt = miLocalStorage.getItemAsJson(`channelLastReadedAt:${channel.id}`) ?? null;
const hasUnreadNote = (lastReadedAt && channel.lastNotedAt) ? Date.parse(channel.lastNotedAt) > lastReadedAt : !!(!lastReadedAt && channel.lastNotedAt);
return {
type: 'link' as const,
text: channel.name,
indicate: hasUnreadNote,
to: `/channels/${channel.id}`,
};
}),
(channels.length === 0 ? undefined : { type: 'divider' }),
{
type: 'link' as const,

View File

@@ -101,7 +101,7 @@ export function openInstanceMenu(ev: MouseEvent) {
text: i18n.ts.help,
icon: 'ti ti-help-circle',
action: () => {
window.open('https://misskey-hub.net/help.html', '_blank', 'noopener');
window.open('https://misskey-hub.net/docs/for-users/', '_blank', 'noopener');
},
}, ($i) ? {
text: i18n.ts._initialTutorial.launchTutorial,

View File

@@ -1,6 +1,6 @@
/*
* version: 2023.12.0-beta.5-io
* generatedAt: 2023-12-21T02:55:40.813Z
* version: 2023.12.0-io
* generatedAt: 2023-12-23T11:38:40.644Z
*/
import type { SwitchCaseResponseType } from '../api.js';
@@ -11,7 +11,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/meta', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -22,7 +22,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/abuse-user-reports', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -33,7 +33,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *No*
* **Credential required**: *No* / **Permission**: *write:admin*
*/
request<E extends 'admin/accounts/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -44,7 +44,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/accounts/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -55,7 +55,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/accounts/find-by-email', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -66,7 +66,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/ad/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -77,7 +77,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/ad/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -88,7 +88,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/ad/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -99,7 +99,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/ad/update', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -110,7 +110,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/announcements/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -121,7 +121,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/announcements/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -132,7 +132,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/announcements/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -143,7 +143,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/announcements/update', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -198,7 +198,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/avatar-decorations/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -209,7 +209,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/avatar-decorations/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -220,7 +220,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/avatar-decorations/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -231,7 +231,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/avatar-decorations/update', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -242,7 +242,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/delete-all-files-of-a-user', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -253,7 +253,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/unset-user-avatar', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -264,7 +264,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/unset-user-banner', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -275,7 +275,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/drive/clean-remote-files', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -286,7 +286,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/drive/cleanup', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -297,7 +297,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/drive/files', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -308,7 +308,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/drive/show-file', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -319,7 +319,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/add-aliases-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -330,7 +330,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/add', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -341,7 +341,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/copy', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -352,7 +352,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/delete-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -363,7 +363,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -374,8 +374,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Internal Endpoint**: This endpoint is an API for the misskey mainframe and is not intended for use by third parties.
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/import-zip', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -386,7 +385,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/emoji/list-remote', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -397,7 +396,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/emoji/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -408,7 +407,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/remove-aliases-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -419,7 +418,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/set-aliases-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -430,7 +429,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/set-category-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -441,7 +440,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/emoji/set-license-bulk', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -452,7 +451,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/emoji/update', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -463,7 +462,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/federation/delete-all-files', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -474,7 +473,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/federation/refresh-remote-instance-metadata', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -485,7 +484,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/federation/remove-all-following', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -496,7 +495,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/federation/update-instance', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -507,7 +506,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/get-index-stats', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -518,7 +517,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/get-table-stats', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -529,7 +528,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/get-user-ips', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -540,7 +539,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/invite/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -551,7 +550,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/invite/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -562,7 +561,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/promo/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -573,7 +572,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/queue/clear', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -584,7 +583,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/queue/deliver-delayed', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -595,7 +594,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/queue/inbox-delayed', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -606,7 +605,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/queue/promote', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -617,7 +616,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/queue/stats', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -628,7 +627,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/relays/add', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -639,7 +638,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/relays/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -650,7 +649,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/relays/remove', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -661,7 +660,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/reset-password', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -672,7 +671,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/resolve-abuse-user-report', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -683,7 +682,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/send-email', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -694,7 +693,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/server-info', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -705,7 +704,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/show-moderation-logs', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -716,7 +715,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/show-user', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -727,7 +726,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/show-users', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -738,7 +737,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/suspend-user', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -749,7 +748,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/unsuspend-user', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -760,7 +759,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/update-meta', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -771,7 +770,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/delete-account', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -782,7 +781,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/update-user-note', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -793,7 +792,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/create', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -804,7 +803,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/delete', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -815,7 +814,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/roles/list', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -826,7 +825,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *read:admin*
*/
request<E extends 'admin/roles/show', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -837,7 +836,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/update', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -848,7 +847,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/assign', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -859,7 +858,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/unassign', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -870,7 +869,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *Yes*
* **Credential required**: *Yes* / **Permission**: *write:admin*
*/
request<E extends 'admin/roles/update-default-policies', P extends Endpoints[E]['req']>(
endpoint: E,
@@ -881,7 +880,7 @@ declare module '../api.js' {
/**
* No description provided.
*
* **Credential required**: *No*
* **Credential required**: *No* / **Permission**: *read:admin*
*/
request<E extends 'admin/roles/users', P extends Endpoints[E]['req']>(
endpoint: E,

View File

@@ -1,6 +1,6 @@
/*
* version: 2023.12.0-beta.5-io
* generatedAt: 2023-12-21T02:55:40.808Z
* version: 2023.12.0-io
* generatedAt: 2023-12-23T11:38:40.635Z
*/
import type {
@@ -13,9 +13,12 @@ import type {
AdminAccountsCreateResponse,
AdminAccountsDeleteRequest,
AdminAccountsFindByEmailRequest,
AdminAccountsFindByEmailResponse,
AdminAdCreateRequest,
AdminAdCreateResponse,
AdminAdDeleteRequest,
AdminAdListRequest,
AdminAdListResponse,
AdminAdUpdateRequest,
AdminAnnouncementsCreateRequest,
AdminAnnouncementsCreateResponse,
@@ -61,8 +64,10 @@ import type {
AdminFederationRefreshRemoteInstanceMetadataRequest,
AdminFederationRemoveAllFollowingRequest,
AdminFederationUpdateInstanceRequest,
AdminGetIndexStatsResponse,
AdminGetTableStatsResponse,
AdminGetUserIpsRequest,
AdminGetUserIpsResponse,
AdminInviteCreateRequest,
AdminInviteCreateResponse,
AdminInviteListRequest,
@@ -104,6 +109,7 @@ import type {
AdminRolesUnassignRequest,
AdminRolesUpdateDefaultPoliciesRequest,
AdminRolesUsersRequest,
AdminRolesUsersResponse,
AnnouncementsRequest,
AnnouncementsResponse,
AntennasCreateRequest,
@@ -231,6 +237,7 @@ import type {
EmailAddressAvailableRequest,
EmailAddressAvailableResponse,
EndpointRequest,
EndpointResponse,
EndpointsResponse,
FederationFollowersRequest,
FederationFollowersResponse,
@@ -244,6 +251,7 @@ import type {
FederationUsersRequest,
FederationUsersResponse,
FederationStatsRequest,
FederationStatsResponse,
FollowingCreateRequest,
FollowingCreateResponse,
FollowingDeleteRequest,
@@ -273,6 +281,7 @@ import type {
GalleryPostsUnlikeRequest,
GalleryPostsUpdateRequest,
GalleryPostsUpdateResponse,
GetOnlineUsersCountResponse,
GetAvatarDecorationsResponse,
HashtagsListRequest,
HashtagsListResponse,
@@ -286,14 +295,19 @@ import type {
IResponse,
I2faDoneRequest,
I2faKeyDoneRequest,
I2faKeyDoneResponse,
I2faPasswordLessRequest,
I2faRegisterKeyRequest,
I2faRegisterKeyResponse,
I2faRegisterRequest,
I2faRegisterResponse,
I2faUpdateKeyRequest,
I2faRemoveKeyRequest,
I2faUnregisterRequest,
IAppsRequest,
IAppsResponse,
IAuthorizedAppsRequest,
IAuthorizedAppsResponse,
IClaimAchievementRequest,
IChangePasswordRequest,
IDeleteAccountRequest,
@@ -322,11 +336,16 @@ import type {
IReadAnnouncementRequest,
IRegenerateTokenRequest,
IRegistryGetAllRequest,
IRegistryGetAllResponse,
IRegistryGetDetailRequest,
IRegistryGetDetailResponse,
IRegistryGetRequest,
IRegistryGetResponse,
IRegistryKeysWithTypeRequest,
IRegistryKeysWithTypeResponse,
IRegistryKeysRequest,
IRegistryRemoveRequest,
IRegistryScopesWithDomainResponse,
IRegistrySetRequest,
IRevokeTokenRequest,
ISigninHistoryRequest,
@@ -334,11 +353,16 @@ import type {
IUnpinRequest,
IUnpinResponse,
IUpdateEmailRequest,
IUpdateEmailResponse,
IUpdateRequest,
IUpdateResponse,
IMoveRequest,
IMoveResponse,
IWebhooksCreateRequest,
IWebhooksCreateResponse,
IWebhooksListResponse,
IWebhooksShowRequest,
IWebhooksShowResponse,
IWebhooksUpdateRequest,
IWebhooksDeleteRequest,
InviteCreateResponse,
@@ -426,6 +450,7 @@ import type {
PagesUnlikeRequest,
PagesUpdateRequest,
FlashCreateRequest,
FlashCreateResponse,
FlashDeleteRequest,
FlashFeaturedResponse,
FlashLikeRequest,
@@ -444,10 +469,12 @@ import type {
RolesShowRequest,
RolesShowResponse,
RolesUsersRequest,
RolesUsersResponse,
RolesNotesRequest,
RolesNotesResponse,
RequestResetPasswordRequest,
ResetPasswordRequest,
ServerInfoResponse,
StatsResponse,
SwShowRegistrationRequest,
SwShowRegistrationResponse,
@@ -457,6 +484,7 @@ import type {
SwRegisterResponse,
SwUnregisterRequest,
TestRequest,
TestResponse,
UsernameAvailableRequest,
UsernameAvailableResponse,
UsersRequest,
@@ -490,6 +518,7 @@ import type {
UsersListsCreateFromPublicResponse,
UsersListsUpdateMembershipRequest,
UsersListsGetMembershipsRequest,
UsersListsGetMembershipsResponse,
UsersNotesRequest,
UsersNotesResponse,
UsersPagesRequest,
@@ -512,9 +541,12 @@ import type {
UsersStatsRequest,
UsersStatsResponse,
UsersAchievementsRequest,
UsersAchievementsResponse,
UsersUpdateMemoRequest,
FetchRssRequest,
FetchRssResponse,
FetchExternalResourcesRequest,
FetchExternalResourcesResponse,
RetentionResponse,
} from './entities.js';
@@ -523,10 +555,10 @@ export type Endpoints = {
'admin/abuse-user-reports': { req: AdminAbuseUserReportsRequest; res: AdminAbuseUserReportsResponse };
'admin/accounts/create': { req: AdminAccountsCreateRequest; res: AdminAccountsCreateResponse };
'admin/accounts/delete': { req: AdminAccountsDeleteRequest; res: EmptyResponse };
'admin/accounts/find-by-email': { req: AdminAccountsFindByEmailRequest; res: EmptyResponse };
'admin/ad/create': { req: AdminAdCreateRequest; res: EmptyResponse };
'admin/accounts/find-by-email': { req: AdminAccountsFindByEmailRequest; res: AdminAccountsFindByEmailResponse };
'admin/ad/create': { req: AdminAdCreateRequest; res: AdminAdCreateResponse };
'admin/ad/delete': { req: AdminAdDeleteRequest; res: EmptyResponse };
'admin/ad/list': { req: AdminAdListRequest; res: EmptyResponse };
'admin/ad/list': { req: AdminAdListRequest; res: AdminAdListResponse };
'admin/ad/update': { req: AdminAdUpdateRequest; res: EmptyResponse };
'admin/announcements/create': { req: AdminAnnouncementsCreateRequest; res: AdminAnnouncementsCreateResponse };
'admin/announcements/delete': { req: AdminAnnouncementsDeleteRequest; res: EmptyResponse };
@@ -564,9 +596,9 @@ export type Endpoints = {
'admin/federation/refresh-remote-instance-metadata': { req: AdminFederationRefreshRemoteInstanceMetadataRequest; res: EmptyResponse };
'admin/federation/remove-all-following': { req: AdminFederationRemoveAllFollowingRequest; res: EmptyResponse };
'admin/federation/update-instance': { req: AdminFederationUpdateInstanceRequest; res: EmptyResponse };
'admin/get-index-stats': { req: EmptyRequest; res: EmptyResponse };
'admin/get-index-stats': { req: EmptyRequest; res: AdminGetIndexStatsResponse };
'admin/get-table-stats': { req: EmptyRequest; res: AdminGetTableStatsResponse };
'admin/get-user-ips': { req: AdminGetUserIpsRequest; res: EmptyResponse };
'admin/get-user-ips': { req: AdminGetUserIpsRequest; res: AdminGetUserIpsResponse };
'admin/invite/create': { req: AdminInviteCreateRequest; res: AdminInviteCreateResponse };
'admin/invite/list': { req: AdminInviteListRequest; res: AdminInviteListResponse };
'admin/promo/create': { req: AdminPromoCreateRequest; res: EmptyResponse };
@@ -598,7 +630,7 @@ export type Endpoints = {
'admin/roles/assign': { req: AdminRolesAssignRequest; res: EmptyResponse };
'admin/roles/unassign': { req: AdminRolesUnassignRequest; res: EmptyResponse };
'admin/roles/update-default-policies': { req: AdminRolesUpdateDefaultPoliciesRequest; res: EmptyResponse };
'admin/roles/users': { req: AdminRolesUsersRequest; res: EmptyResponse };
'admin/roles/users': { req: AdminRolesUsersRequest; res: AdminRolesUsersResponse };
'announcements': { req: AnnouncementsRequest; res: AnnouncementsResponse };
'antennas/create': { req: AntennasCreateRequest; res: AntennasCreateResponse };
'antennas/delete': { req: AntennasDeleteRequest; res: EmptyResponse };
@@ -672,7 +704,7 @@ export type Endpoints = {
'drive/folders/update': { req: DriveFoldersUpdateRequest; res: DriveFoldersUpdateResponse };
'drive/stream': { req: DriveStreamRequest; res: DriveStreamResponse };
'email-address/available': { req: EmailAddressAvailableRequest; res: EmailAddressAvailableResponse };
'endpoint': { req: EndpointRequest; res: EmptyResponse };
'endpoint': { req: EndpointRequest; res: EndpointResponse };
'endpoints': { req: EmptyRequest; res: EndpointsResponse };
'export-custom-emojis': { req: EmptyRequest; res: EmptyResponse };
'federation/followers': { req: FederationFollowersRequest; res: FederationFollowersResponse };
@@ -681,7 +713,7 @@ export type Endpoints = {
'federation/show-instance': { req: FederationShowInstanceRequest; res: FederationShowInstanceResponse };
'federation/update-remote-user': { req: FederationUpdateRemoteUserRequest; res: EmptyResponse };
'federation/users': { req: FederationUsersRequest; res: FederationUsersResponse };
'federation/stats': { req: FederationStatsRequest; res: EmptyResponse };
'federation/stats': { req: FederationStatsRequest; res: FederationStatsResponse };
'following/create': { req: FollowingCreateRequest; res: FollowingCreateResponse };
'following/delete': { req: FollowingDeleteRequest; res: FollowingDeleteResponse };
'following/update': { req: FollowingUpdateRequest; res: FollowingUpdateResponse };
@@ -700,7 +732,7 @@ export type Endpoints = {
'gallery/posts/show': { req: GalleryPostsShowRequest; res: GalleryPostsShowResponse };
'gallery/posts/unlike': { req: GalleryPostsUnlikeRequest; res: EmptyResponse };
'gallery/posts/update': { req: GalleryPostsUpdateRequest; res: GalleryPostsUpdateResponse };
'get-online-users-count': { req: EmptyRequest; res: EmptyResponse };
'get-online-users-count': { req: EmptyRequest; res: GetOnlineUsersCountResponse };
'get-avatar-decorations': { req: EmptyRequest; res: GetAvatarDecorationsResponse };
'hashtags/list': { req: HashtagsListRequest; res: HashtagsListResponse };
'hashtags/search': { req: HashtagsSearchRequest; res: HashtagsSearchResponse };
@@ -709,15 +741,15 @@ export type Endpoints = {
'hashtags/users': { req: HashtagsUsersRequest; res: HashtagsUsersResponse };
'i': { req: EmptyRequest; res: IResponse };
'i/2fa/done': { req: I2faDoneRequest; res: EmptyResponse };
'i/2fa/key-done': { req: I2faKeyDoneRequest; res: EmptyResponse };
'i/2fa/key-done': { req: I2faKeyDoneRequest; res: I2faKeyDoneResponse };
'i/2fa/password-less': { req: I2faPasswordLessRequest; res: EmptyResponse };
'i/2fa/register-key': { req: I2faRegisterKeyRequest; res: EmptyResponse };
'i/2fa/register': { req: I2faRegisterRequest; res: EmptyResponse };
'i/2fa/register-key': { req: I2faRegisterKeyRequest; res: I2faRegisterKeyResponse };
'i/2fa/register': { req: I2faRegisterRequest; res: I2faRegisterResponse };
'i/2fa/update-key': { req: I2faUpdateKeyRequest; res: EmptyResponse };
'i/2fa/remove-key': { req: I2faRemoveKeyRequest; res: EmptyResponse };
'i/2fa/unregister': { req: I2faUnregisterRequest; res: EmptyResponse };
'i/apps': { req: IAppsRequest; res: EmptyResponse };
'i/authorized-apps': { req: IAuthorizedAppsRequest; res: EmptyResponse };
'i/apps': { req: IAppsRequest; res: IAppsResponse };
'i/authorized-apps': { req: IAuthorizedAppsRequest; res: IAuthorizedAppsResponse };
'i/claim-achievement': { req: IClaimAchievementRequest; res: EmptyResponse };
'i/change-password': { req: IChangePasswordRequest; res: EmptyResponse };
'i/delete-account': { req: IDeleteAccountRequest; res: EmptyResponse };
@@ -744,23 +776,23 @@ export type Endpoints = {
'i/read-all-unread-notes': { req: EmptyRequest; res: EmptyResponse };
'i/read-announcement': { req: IReadAnnouncementRequest; res: EmptyResponse };
'i/regenerate-token': { req: IRegenerateTokenRequest; res: EmptyResponse };
'i/registry/get-all': { req: IRegistryGetAllRequest; res: EmptyResponse };
'i/registry/get-detail': { req: IRegistryGetDetailRequest; res: EmptyResponse };
'i/registry/get': { req: IRegistryGetRequest; res: EmptyResponse };
'i/registry/keys-with-type': { req: IRegistryKeysWithTypeRequest; res: EmptyResponse };
'i/registry/get-all': { req: IRegistryGetAllRequest; res: IRegistryGetAllResponse };
'i/registry/get-detail': { req: IRegistryGetDetailRequest; res: IRegistryGetDetailResponse };
'i/registry/get': { req: IRegistryGetRequest; res: IRegistryGetResponse };
'i/registry/keys-with-type': { req: IRegistryKeysWithTypeRequest; res: IRegistryKeysWithTypeResponse };
'i/registry/keys': { req: IRegistryKeysRequest; res: EmptyResponse };
'i/registry/remove': { req: IRegistryRemoveRequest; res: EmptyResponse };
'i/registry/scopes-with-domain': { req: EmptyRequest; res: EmptyResponse };
'i/registry/scopes-with-domain': { req: EmptyRequest; res: IRegistryScopesWithDomainResponse };
'i/registry/set': { req: IRegistrySetRequest; res: EmptyResponse };
'i/revoke-token': { req: IRevokeTokenRequest; res: EmptyResponse };
'i/signin-history': { req: ISigninHistoryRequest; res: ISigninHistoryResponse };
'i/unpin': { req: IUnpinRequest; res: IUnpinResponse };
'i/update-email': { req: IUpdateEmailRequest; res: EmptyResponse };
'i/update-email': { req: IUpdateEmailRequest; res: IUpdateEmailResponse };
'i/update': { req: IUpdateRequest; res: IUpdateResponse };
'i/move': { req: IMoveRequest; res: EmptyResponse };
'i/webhooks/create': { req: IWebhooksCreateRequest; res: EmptyResponse };
'i/webhooks/list': { req: EmptyRequest; res: EmptyResponse };
'i/webhooks/show': { req: IWebhooksShowRequest; res: EmptyResponse };
'i/move': { req: IMoveRequest; res: IMoveResponse };
'i/webhooks/create': { req: IWebhooksCreateRequest; res: IWebhooksCreateResponse };
'i/webhooks/list': { req: EmptyRequest; res: IWebhooksListResponse };
'i/webhooks/show': { req: IWebhooksShowRequest; res: IWebhooksShowResponse };
'i/webhooks/update': { req: IWebhooksUpdateRequest; res: EmptyResponse };
'i/webhooks/delete': { req: IWebhooksDeleteRequest; res: EmptyResponse };
'invite/create': { req: EmptyRequest; res: InviteCreateResponse };
@@ -819,7 +851,7 @@ export type Endpoints = {
'pages/show': { req: PagesShowRequest; res: PagesShowResponse };
'pages/unlike': { req: PagesUnlikeRequest; res: EmptyResponse };
'pages/update': { req: PagesUpdateRequest; res: EmptyResponse };
'flash/create': { req: FlashCreateRequest; res: EmptyResponse };
'flash/create': { req: FlashCreateRequest; res: FlashCreateResponse };
'flash/delete': { req: FlashDeleteRequest; res: EmptyResponse };
'flash/featured': { req: EmptyRequest; res: FlashFeaturedResponse };
'flash/like': { req: FlashLikeRequest; res: EmptyResponse };
@@ -833,18 +865,18 @@ export type Endpoints = {
'promo/read': { req: PromoReadRequest; res: EmptyResponse };
'roles/list': { req: EmptyRequest; res: RolesListResponse };
'roles/show': { req: RolesShowRequest; res: RolesShowResponse };
'roles/users': { req: RolesUsersRequest; res: EmptyResponse };
'roles/users': { req: RolesUsersRequest; res: RolesUsersResponse };
'roles/notes': { req: RolesNotesRequest; res: RolesNotesResponse };
'request-reset-password': { req: RequestResetPasswordRequest; res: EmptyResponse };
'reset-db': { req: EmptyRequest; res: EmptyResponse };
'reset-password': { req: ResetPasswordRequest; res: EmptyResponse };
'server-info': { req: EmptyRequest; res: EmptyResponse };
'server-info': { req: EmptyRequest; res: ServerInfoResponse };
'stats': { req: EmptyRequest; res: StatsResponse };
'sw/show-registration': { req: SwShowRegistrationRequest; res: SwShowRegistrationResponse };
'sw/update-registration': { req: SwUpdateRegistrationRequest; res: SwUpdateRegistrationResponse };
'sw/register': { req: SwRegisterRequest; res: SwRegisterResponse };
'sw/unregister': { req: SwUnregisterRequest; res: EmptyResponse };
'test': { req: TestRequest; res: EmptyResponse };
'test': { req: TestRequest; res: TestResponse };
'username/available': { req: UsernameAvailableRequest; res: UsernameAvailableResponse };
'users': { req: UsersRequest; res: UsersResponse };
'users/clips': { req: UsersClipsRequest; res: UsersClipsResponse };
@@ -864,7 +896,7 @@ export type Endpoints = {
'users/lists/update': { req: UsersListsUpdateRequest; res: UsersListsUpdateResponse };
'users/lists/create-from-public': { req: UsersListsCreateFromPublicRequest; res: UsersListsCreateFromPublicResponse };
'users/lists/update-membership': { req: UsersListsUpdateMembershipRequest; res: EmptyResponse };
'users/lists/get-memberships': { req: UsersListsGetMembershipsRequest; res: EmptyResponse };
'users/lists/get-memberships': { req: UsersListsGetMembershipsRequest; res: UsersListsGetMembershipsResponse };
'users/notes': { req: UsersNotesRequest; res: UsersNotesResponse };
'users/pages': { req: UsersPagesRequest; res: UsersPagesResponse };
'users/flashs': { req: UsersFlashsRequest; res: UsersFlashsResponse };
@@ -876,9 +908,9 @@ export type Endpoints = {
'users/search': { req: UsersSearchRequest; res: UsersSearchResponse };
'users/show': { req: UsersShowRequest; res: UsersShowResponse };
'users/stats': { req: UsersStatsRequest; res: UsersStatsResponse };
'users/achievements': { req: UsersAchievementsRequest; res: EmptyResponse };
'users/achievements': { req: UsersAchievementsRequest; res: UsersAchievementsResponse };
'users/update-memo': { req: UsersUpdateMemoRequest; res: EmptyResponse };
'fetch-rss': { req: FetchRssRequest; res: EmptyResponse };
'fetch-external-resources': { req: FetchExternalResourcesRequest; res: EmptyResponse };
'fetch-rss': { req: FetchRssRequest; res: FetchRssResponse };
'fetch-external-resources': { req: FetchExternalResourcesRequest; res: FetchExternalResourcesResponse };
'retention': { req: EmptyRequest; res: RetentionResponse };
}

View File

@@ -1,6 +1,6 @@
/*
* version: 2023.12.0-beta.5-io
* generatedAt: 2023-12-21T02:55:40.804Z
* version: 2023.12.0-io
* generatedAt: 2023-12-23T11:38:40.630Z
*/
import { operations } from './types.js';
@@ -15,9 +15,12 @@ export type AdminAccountsCreateRequest = operations['admin/accounts/create']['re
export type AdminAccountsCreateResponse = operations['admin/accounts/create']['responses']['200']['content']['application/json'];
export type AdminAccountsDeleteRequest = operations['admin/accounts/delete']['requestBody']['content']['application/json'];
export type AdminAccountsFindByEmailRequest = operations['admin/accounts/find-by-email']['requestBody']['content']['application/json'];
export type AdminAccountsFindByEmailResponse = operations['admin/accounts/find-by-email']['responses']['200']['content']['application/json'];
export type AdminAdCreateRequest = operations['admin/ad/create']['requestBody']['content']['application/json'];
export type AdminAdCreateResponse = operations['admin/ad/create']['responses']['200']['content']['application/json'];
export type AdminAdDeleteRequest = operations['admin/ad/delete']['requestBody']['content']['application/json'];
export type AdminAdListRequest = operations['admin/ad/list']['requestBody']['content']['application/json'];
export type AdminAdListResponse = operations['admin/ad/list']['responses']['200']['content']['application/json'];
export type AdminAdUpdateRequest = operations['admin/ad/update']['requestBody']['content']['application/json'];
export type AdminAnnouncementsCreateRequest = operations['admin/announcements/create']['requestBody']['content']['application/json'];
export type AdminAnnouncementsCreateResponse = operations['admin/announcements/create']['responses']['200']['content']['application/json'];
@@ -63,8 +66,10 @@ export type AdminFederationDeleteAllFilesRequest = operations['admin/federation/
export type AdminFederationRefreshRemoteInstanceMetadataRequest = operations['admin/federation/refresh-remote-instance-metadata']['requestBody']['content']['application/json'];
export type AdminFederationRemoveAllFollowingRequest = operations['admin/federation/remove-all-following']['requestBody']['content']['application/json'];
export type AdminFederationUpdateInstanceRequest = operations['admin/federation/update-instance']['requestBody']['content']['application/json'];
export type AdminGetIndexStatsResponse = operations['admin/get-index-stats']['responses']['200']['content']['application/json'];
export type AdminGetTableStatsResponse = operations['admin/get-table-stats']['responses']['200']['content']['application/json'];
export type AdminGetUserIpsRequest = operations['admin/get-user-ips']['requestBody']['content']['application/json'];
export type AdminGetUserIpsResponse = operations['admin/get-user-ips']['responses']['200']['content']['application/json'];
export type AdminInviteCreateRequest = operations['admin/invite/create']['requestBody']['content']['application/json'];
export type AdminInviteCreateResponse = operations['admin/invite/create']['responses']['200']['content']['application/json'];
export type AdminInviteListRequest = operations['admin/invite/list']['requestBody']['content']['application/json'];
@@ -106,6 +111,7 @@ export type AdminRolesAssignRequest = operations['admin/roles/assign']['requestB
export type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
export type AdminRolesUpdateDefaultPoliciesRequest = operations['admin/roles/update-default-policies']['requestBody']['content']['application/json'];
export type AdminRolesUsersRequest = operations['admin/roles/users']['requestBody']['content']['application/json'];
export type AdminRolesUsersResponse = operations['admin/roles/users']['responses']['200']['content']['application/json'];
export type AnnouncementsRequest = operations['announcements']['requestBody']['content']['application/json'];
export type AnnouncementsResponse = operations['announcements']['responses']['200']['content']['application/json'];
export type AntennasCreateRequest = operations['antennas/create']['requestBody']['content']['application/json'];
@@ -233,6 +239,7 @@ export type DriveStreamResponse = operations['drive/stream']['responses']['200']
export type EmailAddressAvailableRequest = operations['email-address/available']['requestBody']['content']['application/json'];
export type EmailAddressAvailableResponse = operations['email-address/available']['responses']['200']['content']['application/json'];
export type EndpointRequest = operations['endpoint']['requestBody']['content']['application/json'];
export type EndpointResponse = operations['endpoint']['responses']['200']['content']['application/json'];
export type EndpointsResponse = operations['endpoints']['responses']['200']['content']['application/json'];
export type FederationFollowersRequest = operations['federation/followers']['requestBody']['content']['application/json'];
export type FederationFollowersResponse = operations['federation/followers']['responses']['200']['content']['application/json'];
@@ -246,6 +253,7 @@ export type FederationUpdateRemoteUserRequest = operations['federation/update-re
export type FederationUsersRequest = operations['federation/users']['requestBody']['content']['application/json'];
export type FederationUsersResponse = operations['federation/users']['responses']['200']['content']['application/json'];
export type FederationStatsRequest = operations['federation/stats']['requestBody']['content']['application/json'];
export type FederationStatsResponse = operations['federation/stats']['responses']['200']['content']['application/json'];
export type FollowingCreateRequest = operations['following/create']['requestBody']['content']['application/json'];
export type FollowingCreateResponse = operations['following/create']['responses']['200']['content']['application/json'];
export type FollowingDeleteRequest = operations['following/delete']['requestBody']['content']['application/json'];
@@ -275,6 +283,7 @@ export type GalleryPostsShowResponse = operations['gallery/posts/show']['respons
export type GalleryPostsUnlikeRequest = operations['gallery/posts/unlike']['requestBody']['content']['application/json'];
export type GalleryPostsUpdateRequest = operations['gallery/posts/update']['requestBody']['content']['application/json'];
export type GalleryPostsUpdateResponse = operations['gallery/posts/update']['responses']['200']['content']['application/json'];
export type GetOnlineUsersCountResponse = operations['get-online-users-count']['responses']['200']['content']['application/json'];
export type GetAvatarDecorationsResponse = operations['get-avatar-decorations']['responses']['200']['content']['application/json'];
export type HashtagsListRequest = operations['hashtags/list']['requestBody']['content']['application/json'];
export type HashtagsListResponse = operations['hashtags/list']['responses']['200']['content']['application/json'];
@@ -288,14 +297,19 @@ export type HashtagsUsersResponse = operations['hashtags/users']['responses']['2
export type IResponse = operations['i']['responses']['200']['content']['application/json'];
export type I2faDoneRequest = operations['i/2fa/done']['requestBody']['content']['application/json'];
export type I2faKeyDoneRequest = operations['i/2fa/key-done']['requestBody']['content']['application/json'];
export type I2faKeyDoneResponse = operations['i/2fa/key-done']['responses']['200']['content']['application/json'];
export type I2faPasswordLessRequest = operations['i/2fa/password-less']['requestBody']['content']['application/json'];
export type I2faRegisterKeyRequest = operations['i/2fa/register-key']['requestBody']['content']['application/json'];
export type I2faRegisterKeyResponse = operations['i/2fa/register-key']['responses']['200']['content']['application/json'];
export type I2faRegisterRequest = operations['i/2fa/register']['requestBody']['content']['application/json'];
export type I2faRegisterResponse = operations['i/2fa/register']['responses']['200']['content']['application/json'];
export type I2faUpdateKeyRequest = operations['i/2fa/update-key']['requestBody']['content']['application/json'];
export type I2faRemoveKeyRequest = operations['i/2fa/remove-key']['requestBody']['content']['application/json'];
export type I2faUnregisterRequest = operations['i/2fa/unregister']['requestBody']['content']['application/json'];
export type IAppsRequest = operations['i/apps']['requestBody']['content']['application/json'];
export type IAppsResponse = operations['i/apps']['responses']['200']['content']['application/json'];
export type IAuthorizedAppsRequest = operations['i/authorized-apps']['requestBody']['content']['application/json'];
export type IAuthorizedAppsResponse = operations['i/authorized-apps']['responses']['200']['content']['application/json'];
export type IClaimAchievementRequest = operations['i/claim-achievement']['requestBody']['content']['application/json'];
export type IChangePasswordRequest = operations['i/change-password']['requestBody']['content']['application/json'];
export type IDeleteAccountRequest = operations['i/delete-account']['requestBody']['content']['application/json'];
@@ -324,11 +338,16 @@ export type IPinResponse = operations['i/pin']['responses']['200']['content']['a
export type IReadAnnouncementRequest = operations['i/read-announcement']['requestBody']['content']['application/json'];
export type IRegenerateTokenRequest = operations['i/regenerate-token']['requestBody']['content']['application/json'];
export type IRegistryGetAllRequest = operations['i/registry/get-all']['requestBody']['content']['application/json'];
export type IRegistryGetAllResponse = operations['i/registry/get-all']['responses']['200']['content']['application/json'];
export type IRegistryGetDetailRequest = operations['i/registry/get-detail']['requestBody']['content']['application/json'];
export type IRegistryGetDetailResponse = operations['i/registry/get-detail']['responses']['200']['content']['application/json'];
export type IRegistryGetRequest = operations['i/registry/get']['requestBody']['content']['application/json'];
export type IRegistryGetResponse = operations['i/registry/get']['responses']['200']['content']['application/json'];
export type IRegistryKeysWithTypeRequest = operations['i/registry/keys-with-type']['requestBody']['content']['application/json'];
export type IRegistryKeysWithTypeResponse = operations['i/registry/keys-with-type']['responses']['200']['content']['application/json'];
export type IRegistryKeysRequest = operations['i/registry/keys']['requestBody']['content']['application/json'];
export type IRegistryRemoveRequest = operations['i/registry/remove']['requestBody']['content']['application/json'];
export type IRegistryScopesWithDomainResponse = operations['i/registry/scopes-with-domain']['responses']['200']['content']['application/json'];
export type IRegistrySetRequest = operations['i/registry/set']['requestBody']['content']['application/json'];
export type IRevokeTokenRequest = operations['i/revoke-token']['requestBody']['content']['application/json'];
export type ISigninHistoryRequest = operations['i/signin-history']['requestBody']['content']['application/json'];
@@ -336,11 +355,16 @@ export type ISigninHistoryResponse = operations['i/signin-history']['responses']
export type IUnpinRequest = operations['i/unpin']['requestBody']['content']['application/json'];
export type IUnpinResponse = operations['i/unpin']['responses']['200']['content']['application/json'];
export type IUpdateEmailRequest = operations['i/update-email']['requestBody']['content']['application/json'];
export type IUpdateEmailResponse = operations['i/update-email']['responses']['200']['content']['application/json'];
export type IUpdateRequest = operations['i/update']['requestBody']['content']['application/json'];
export type IUpdateResponse = operations['i/update']['responses']['200']['content']['application/json'];
export type IMoveRequest = operations['i/move']['requestBody']['content']['application/json'];
export type IMoveResponse = operations['i/move']['responses']['200']['content']['application/json'];
export type IWebhooksCreateRequest = operations['i/webhooks/create']['requestBody']['content']['application/json'];
export type IWebhooksCreateResponse = operations['i/webhooks/create']['responses']['200']['content']['application/json'];
export type IWebhooksListResponse = operations['i/webhooks/list']['responses']['200']['content']['application/json'];
export type IWebhooksShowRequest = operations['i/webhooks/show']['requestBody']['content']['application/json'];
export type IWebhooksShowResponse = operations['i/webhooks/show']['responses']['200']['content']['application/json'];
export type IWebhooksUpdateRequest = operations['i/webhooks/update']['requestBody']['content']['application/json'];
export type IWebhooksDeleteRequest = operations['i/webhooks/delete']['requestBody']['content']['application/json'];
export type InviteCreateResponse = operations['invite/create']['responses']['200']['content']['application/json'];
@@ -428,6 +452,7 @@ export type PagesShowResponse = operations['pages/show']['responses']['200']['co
export type PagesUnlikeRequest = operations['pages/unlike']['requestBody']['content']['application/json'];
export type PagesUpdateRequest = operations['pages/update']['requestBody']['content']['application/json'];
export type FlashCreateRequest = operations['flash/create']['requestBody']['content']['application/json'];
export type FlashCreateResponse = operations['flash/create']['responses']['200']['content']['application/json'];
export type FlashDeleteRequest = operations['flash/delete']['requestBody']['content']['application/json'];
export type FlashFeaturedResponse = operations['flash/featured']['responses']['200']['content']['application/json'];
export type FlashLikeRequest = operations['flash/like']['requestBody']['content']['application/json'];
@@ -446,10 +471,12 @@ export type RolesListResponse = operations['roles/list']['responses']['200']['co
export type RolesShowRequest = operations['roles/show']['requestBody']['content']['application/json'];
export type RolesShowResponse = operations['roles/show']['responses']['200']['content']['application/json'];
export type RolesUsersRequest = operations['roles/users']['requestBody']['content']['application/json'];
export type RolesUsersResponse = operations['roles/users']['responses']['200']['content']['application/json'];
export type RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
export type RolesNotesResponse = operations['roles/notes']['responses']['200']['content']['application/json'];
export type RequestResetPasswordRequest = operations['request-reset-password']['requestBody']['content']['application/json'];
export type ResetPasswordRequest = operations['reset-password']['requestBody']['content']['application/json'];
export type ServerInfoResponse = operations['server-info']['responses']['200']['content']['application/json'];
export type StatsResponse = operations['stats']['responses']['200']['content']['application/json'];
export type SwShowRegistrationRequest = operations['sw/show-registration']['requestBody']['content']['application/json'];
export type SwShowRegistrationResponse = operations['sw/show-registration']['responses']['200']['content']['application/json'];
@@ -459,6 +486,7 @@ export type SwRegisterRequest = operations['sw/register']['requestBody']['conten
export type SwRegisterResponse = operations['sw/register']['responses']['200']['content']['application/json'];
export type SwUnregisterRequest = operations['sw/unregister']['requestBody']['content']['application/json'];
export type TestRequest = operations['test']['requestBody']['content']['application/json'];
export type TestResponse = operations['test']['responses']['200']['content']['application/json'];
export type UsernameAvailableRequest = operations['username/available']['requestBody']['content']['application/json'];
export type UsernameAvailableResponse = operations['username/available']['responses']['200']['content']['application/json'];
export type UsersRequest = operations['users']['requestBody']['content']['application/json'];
@@ -492,6 +520,7 @@ export type UsersListsCreateFromPublicRequest = operations['users/lists/create-f
export type UsersListsCreateFromPublicResponse = operations['users/lists/create-from-public']['responses']['200']['content']['application/json'];
export type UsersListsUpdateMembershipRequest = operations['users/lists/update-membership']['requestBody']['content']['application/json'];
export type UsersListsGetMembershipsRequest = operations['users/lists/get-memberships']['requestBody']['content']['application/json'];
export type UsersListsGetMembershipsResponse = operations['users/lists/get-memberships']['responses']['200']['content']['application/json'];
export type UsersNotesRequest = operations['users/notes']['requestBody']['content']['application/json'];
export type UsersNotesResponse = operations['users/notes']['responses']['200']['content']['application/json'];
export type UsersPagesRequest = operations['users/pages']['requestBody']['content']['application/json'];
@@ -514,7 +543,10 @@ export type UsersShowResponse = operations['users/show']['responses']['200']['co
export type UsersStatsRequest = operations['users/stats']['requestBody']['content']['application/json'];
export type UsersStatsResponse = operations['users/stats']['responses']['200']['content']['application/json'];
export type UsersAchievementsRequest = operations['users/achievements']['requestBody']['content']['application/json'];
export type UsersAchievementsResponse = operations['users/achievements']['responses']['200']['content']['application/json'];
export type UsersUpdateMemoRequest = operations['users/update-memo']['requestBody']['content']['application/json'];
export type FetchRssRequest = operations['fetch-rss']['requestBody']['content']['application/json'];
export type FetchRssResponse = operations['fetch-rss']['responses']['200']['content']['application/json'];
export type FetchExternalResourcesRequest = operations['fetch-external-resources']['requestBody']['content']['application/json'];
export type FetchExternalResourcesResponse = operations['fetch-external-resources']['responses']['200']['content']['application/json'];
export type RetentionResponse = operations['retention']['responses']['200']['content']['application/json'];

View File

@@ -1,6 +1,6 @@
/*
* version: 2023.12.0-beta.5-io
* generatedAt: 2023-12-21T02:55:40.802Z
* version: 2023.12.0-io
* generatedAt: 2023-12-23T11:38:40.627Z
*/
import { components } from './types.js';
@@ -14,6 +14,7 @@ export type UserDetailed = components['schemas']['UserDetailed'];
export type User = components['schemas']['User'];
export type UserList = components['schemas']['UserList'];
export type UserListMembership = components['schemas']['UserListMembership'];
export type Ad = components['schemas']['Ad'];
export type Announcement = components['schemas']['Announcement'];
export type App = components['schemas']['App'];
export type Note = components['schemas']['Note'];

File diff suppressed because it is too large Load Diff