Merge remote-branch 'misskey/develop'

This commit is contained in:
NoriDev 2023-12-06 18:51:49 +09:00
commit 0c96848830
18 changed files with 439 additions and 83 deletions

View file

@ -35,6 +35,8 @@
- Enhance: ノートプレビューに「内容を隠す」が反映されるように
- Enhance: データセーバーの適用範囲を個別で設定できるように
- 従来のデータセーバーの設定はリセットされます
- Feat: センシティブと判断されたウェブサイトのサムネイルをぼかすように
- ウェブサイトをセンシティブと判断する仕組みが動いていないため、summalyProxyを使用しないと機能しません。
- fix: 「設定のバックアップ」で一部の項目がバックアップに含まれていなかった問題を修正
- Fix: ウィジェットのジョブキューにて音声の発音方法変更に追従できていなかったのを修正 #12367
- Enhance: 絵文字の詳細ページに記載される情報を追加

View file

@ -39,6 +39,7 @@ import { packedEmojiDetailedSchema, packedEmojiSimpleSchema } from '@/models/jso
import { packedFlashSchema } from '@/models/json-schema/flash.js';
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';
export const refs = {
UserLite: packedUserLiteSchema,
@ -77,6 +78,8 @@ export const refs = {
EmojiDetailed: packedEmojiDetailedSchema,
Flash: packedFlashSchema,
Signin: packedSigninSchema,
RoleLite: packedRoleLiteSchema,
Role: packedRoleSchema,
};
export type Packed<x extends keyof typeof refs> = SchemaType<typeof refs[x]>;

View file

@ -0,0 +1,157 @@
const rolePolicyValue = {
type: 'object',
properties: {
value: {
oneOf: [
{
type: 'integer',
optional: false, nullable: false,
},
{
type: 'boolean',
optional: false, nullable: false,
},
],
},
priority: {
type: 'integer',
optional: false, nullable: false,
},
useDefault: {
type: 'boolean',
optional: false, nullable: false,
},
},
} as const;
export const packedRoleLiteSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
example: 'xxxxxxxxxx',
},
name: {
type: 'string',
optional: false, nullable: false,
example: 'New Role',
},
color: {
type: 'string',
optional: false, nullable: true,
example: '#000000',
},
iconUrl: {
type: 'string',
optional: false, nullable: true,
},
description: {
type: 'string',
optional: false, nullable: false,
},
isModerator: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
isAdministrator: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
displayOrder: {
type: 'integer',
optional: false, nullable: false,
example: 0,
},
},
} as const;
export const packedRoleSchema = {
type: 'object',
allOf: [
{
type: 'object',
ref: 'RoleLite',
},
{
type: 'object',
properties: {
createdAt: {
type: 'string',
optional: false, nullable: false,
format: 'date-time',
},
updatedAt: {
type: 'string',
optional: false, nullable: false,
format: 'date-time',
},
target: {
type: 'string',
optional: false, nullable: false,
enum: ['manual', 'conditional'],
},
condFormula: {
type: 'object',
optional: false, nullable: false,
},
isPublic: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
isExplorable: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
asBadge: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
canEditMembersByModerator: {
type: 'boolean',
optional: false, nullable: false,
example: false,
},
policies: {
type: 'object',
optional: false, nullable: false,
properties: {
pinLimit: rolePolicyValue,
canInvite: rolePolicyValue,
clipLimit: rolePolicyValue,
canHideAds: rolePolicyValue,
inviteLimit: rolePolicyValue,
antennaLimit: rolePolicyValue,
gtlAvailable: rolePolicyValue,
ltlAvailable: rolePolicyValue,
webhookLimit: rolePolicyValue,
canPublicNote: rolePolicyValue,
userListLimit: rolePolicyValue,
wordMuteLimit: rolePolicyValue,
alwaysMarkNsfw: rolePolicyValue,
canSearchNotes: rolePolicyValue,
driveCapacityMb: rolePolicyValue,
rateLimitFactor: rolePolicyValue,
inviteLimitCycle: rolePolicyValue,
noteEachClipsLimit: rolePolicyValue,
inviteExpirationTime: rolePolicyValue,
canManageCustomEmojis: rolePolicyValue,
userEachUserListsLimit: rolePolicyValue,
canManageAvatarDecorations: rolePolicyValue,
canUseTranslator: rolePolicyValue,
},
},
usersCount: {
type: 'integer',
optional: false, nullable: false,
},
},
},
],
} as const;

View file

@ -345,41 +345,7 @@ export const packedUserDetailedNotMeOnlySchema = {
items: {
type: 'object',
nullable: false, optional: false,
properties: {
id: {
type: 'string',
nullable: false, optional: false,
format: 'id',
},
name: {
type: 'string',
nullable: false, optional: false,
},
color: {
type: 'string',
nullable: true, optional: false,
},
iconUrl: {
type: 'string',
nullable: true, optional: false,
},
description: {
type: 'string',
nullable: false, optional: false,
},
isModerator: {
type: 'boolean',
nullable: false, optional: false,
},
isAdministrator: {
type: 'boolean',
nullable: false, optional: false,
},
displayOrder: {
type: 'number',
nullable: false, optional: false,
},
},
ref: 'RoleLite',
},
},
memo: {

View file

@ -13,6 +13,12 @@ export const meta = {
requireCredential: true,
requireAdmin: true,
res: {
type: 'object',
optional: false, nullable: false,
ref: 'Role',
},
} as const;
export const paramDef = {

View file

@ -14,6 +14,16 @@ export const meta = {
requireCredential: true,
requireModerator: true,
res: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
ref: 'Role',
},
},
} as const;
export const paramDef = {

View file

@ -23,6 +23,12 @@ export const meta = {
id: '07dc7d34-c0d8-49b7-96c6-db3ce64ee0b3',
},
},
res: {
type: 'object',
optional: false, nullable: false,
ref: 'Role',
},
} as const;
export const paramDef = {

View file

@ -13,6 +13,16 @@ export const meta = {
tags: ['role'],
requireCredential: true,
res: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
ref: 'Role',
},
},
} as const;
export const paramDef = {

View file

@ -22,6 +22,12 @@ export const meta = {
id: 'de5502bf-009a-4639-86c1-fec349e46dcb',
},
},
res: {
type: 'object',
optional: false, nullable: false,
ref: 'Role',
},
} as const;
export const paramDef = {

View file

@ -254,12 +254,21 @@ type AdminRolesAssignRequest = operations['admin/roles/assign']['requestBody']['
// @public (undocumented)
type AdminRolesCreateRequest = operations['admin/roles/create']['requestBody']['content']['application/json'];
// @public (undocumented)
type AdminRolesCreateResponse = operations['admin/roles/create']['responses']['200']['content']['application/json'];
// @public (undocumented)
type AdminRolesDeleteRequest = operations['admin/roles/delete']['requestBody']['content']['application/json'];
// @public (undocumented)
type AdminRolesListResponse = operations['admin/roles/list']['responses']['200']['content']['application/json'];
// @public (undocumented)
type AdminRolesShowRequest = operations['admin/roles/show']['requestBody']['content']['application/json'];
// @public (undocumented)
type AdminRolesShowResponse = operations['admin/roles/show']['responses']['200']['content']['application/json'];
// @public (undocumented)
type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
@ -1160,8 +1169,11 @@ declare namespace entities {
AdminDeleteAccountResponse,
AdminUpdateUserNoteRequest,
AdminRolesCreateRequest,
AdminRolesCreateResponse,
AdminRolesDeleteRequest,
AdminRolesListResponse,
AdminRolesShowRequest,
AdminRolesShowResponse,
AdminRolesUpdateRequest,
AdminRolesAssignRequest,
AdminRolesUnassignRequest,
@ -1488,7 +1500,9 @@ declare namespace entities {
PingResponse,
PinnedUsersResponse,
PromoReadRequest,
RolesListResponse,
RolesShowRequest,
RolesShowResponse,
RolesUsersRequest,
RolesNotesRequest,
RolesNotesResponse,
@ -1615,7 +1629,9 @@ declare namespace entities {
EmojiSimple,
EmojiDetailed,
Flash,
Signin
Signin,
RoleLite,
Role
}
}
export { entities }
@ -2450,6 +2466,15 @@ type ResetPasswordRequest = operations['reset-password']['requestBody']['content
// @public (undocumented)
type RetentionResponse = operations['retention']['responses']['200']['content']['application/json'];
// @public (undocumented)
type Role = components['schemas']['Role'];
// @public (undocumented)
type RoleLite = components['schemas']['RoleLite'];
// @public (undocumented)
type RolesListResponse = operations['roles/list']['responses']['200']['content']['application/json'];
// @public (undocumented)
type RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
@ -2459,6 +2484,9 @@ type RolesNotesResponse = operations['roles/notes']['responses']['200']['content
// @public (undocumented)
type RolesShowRequest = operations['roles/show']['requestBody']['content']['application/json'];
// @public (undocumented)
type RolesShowResponse = operations['roles/show']['responses']['200']['content']['application/json'];
// @public (undocumented)
type RolesUsersRequest = operations['roles/users']['requestBody']['content']['application/json'];

View file

@ -1,6 +1,6 @@
/*
* version: 4.6.0-beta.1
* generatedAt: 2023-12-05T08:31:06.220Z
* version: 4.6.0-beta.2
* generatedAt: 2023-12-06T08:45:38.856Z
*/
import type {
@ -96,8 +96,11 @@ import type {
AdminDeleteAccountResponse,
AdminUpdateUserNoteRequest,
AdminRolesCreateRequest,
AdminRolesCreateResponse,
AdminRolesDeleteRequest,
AdminRolesListResponse,
AdminRolesShowRequest,
AdminRolesShowResponse,
AdminRolesUpdateRequest,
AdminRolesAssignRequest,
AdminRolesUnassignRequest,
@ -424,7 +427,9 @@ import type {
PingResponse,
PinnedUsersResponse,
PromoReadRequest,
RolesListResponse,
RolesShowRequest,
RolesShowResponse,
RolesUsersRequest,
RolesNotesRequest,
RolesNotesResponse,
@ -592,10 +597,10 @@ export type Endpoints = {
'admin/update-meta': { req: AdminUpdateMetaRequest; res: EmptyResponse };
'admin/delete-account': { req: AdminDeleteAccountRequest; res: AdminDeleteAccountResponse };
'admin/update-user-note': { req: AdminUpdateUserNoteRequest; res: EmptyResponse };
'admin/roles/create': { req: AdminRolesCreateRequest; res: EmptyResponse };
'admin/roles/create': { req: AdminRolesCreateRequest; res: AdminRolesCreateResponse };
'admin/roles/delete': { req: AdminRolesDeleteRequest; res: EmptyResponse };
'admin/roles/list': { req: EmptyRequest; res: EmptyResponse };
'admin/roles/show': { req: AdminRolesShowRequest; res: EmptyResponse };
'admin/roles/list': { req: EmptyRequest; res: AdminRolesListResponse };
'admin/roles/show': { req: AdminRolesShowRequest; res: AdminRolesShowResponse };
'admin/roles/update': { req: AdminRolesUpdateRequest; res: EmptyResponse };
'admin/roles/assign': { req: AdminRolesAssignRequest; res: EmptyResponse };
'admin/roles/unassign': { req: AdminRolesUnassignRequest; res: EmptyResponse };
@ -808,8 +813,8 @@ export type Endpoints = {
'ping': { req: EmptyRequest; res: PingResponse };
'pinned-users': { req: EmptyRequest; res: PinnedUsersResponse };
'promo/read': { req: PromoReadRequest; res: EmptyResponse };
'roles/list': { req: EmptyRequest; res: EmptyResponse };
'roles/show': { req: RolesShowRequest; res: EmptyResponse };
'roles/list': { req: EmptyRequest; res: RolesListResponse };
'roles/show': { req: RolesShowRequest; res: RolesShowResponse };
'roles/users': { req: RolesUsersRequest; res: EmptyResponse };
'roles/notes': { req: RolesNotesRequest; res: RolesNotesResponse };
'request-reset-password': { req: RequestResetPasswordRequest; res: EmptyResponse };

View file

@ -1,6 +1,6 @@
/*
* version: 4.6.0-beta.1
* generatedAt: 2023-12-05T08:31:06.218Z
* version: 4.6.0-beta.2
* generatedAt: 2023-12-06T08:45:38.854Z
*/
import { operations } from './types.js';
@ -98,8 +98,11 @@ export type AdminDeleteAccountRequest = operations['admin/delete-account']['requ
export type AdminDeleteAccountResponse = operations['admin/delete-account']['responses']['200']['content']['application/json'];
export type AdminUpdateUserNoteRequest = operations['admin/update-user-note']['requestBody']['content']['application/json'];
export type AdminRolesCreateRequest = operations['admin/roles/create']['requestBody']['content']['application/json'];
export type AdminRolesCreateResponse = operations['admin/roles/create']['responses']['200']['content']['application/json'];
export type AdminRolesDeleteRequest = operations['admin/roles/delete']['requestBody']['content']['application/json'];
export type AdminRolesListResponse = operations['admin/roles/list']['responses']['200']['content']['application/json'];
export type AdminRolesShowRequest = operations['admin/roles/show']['requestBody']['content']['application/json'];
export type AdminRolesShowResponse = operations['admin/roles/show']['responses']['200']['content']['application/json'];
export type AdminRolesUpdateRequest = operations['admin/roles/update']['requestBody']['content']['application/json'];
export type AdminRolesAssignRequest = operations['admin/roles/assign']['requestBody']['content']['application/json'];
export type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
@ -426,7 +429,9 @@ export type FlashMyLikesResponse = operations['flash/my-likes']['responses']['20
export type PingResponse = operations['ping']['responses']['200']['content']['application/json'];
export type PinnedUsersResponse = operations['pinned-users']['responses']['200']['content']['application/json'];
export type PromoReadRequest = operations['promo/read']['requestBody']['content']['application/json'];
export type RolesListResponse = operations['roles/list']['responses']['200']['content']['application/json'];
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 RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
export type RolesNotesResponse = operations['roles/notes']['responses']['200']['content']['application/json'];

View file

@ -1,6 +1,6 @@
/*
* version: 4.6.0-beta.1
* generatedAt: 2023-12-05T08:31:06.217Z
* version: 4.6.0-beta.2
* generatedAt: 2023-12-06T08:45:38.853Z
*/
import { components } from './types.js';
@ -40,3 +40,5 @@ export type EmojiSimple = components['schemas']['EmojiSimple'];
export type EmojiDetailed = components['schemas']['EmojiDetailed'];
export type Flash = components['schemas']['Flash'];
export type Signin = components['schemas']['Signin'];
export type RoleLite = components['schemas']['RoleLite'];
export type Role = components['schemas']['Role'];

View file

@ -2,8 +2,8 @@
/* eslint @typescript-eslint/no-explicit-any: 0 */
/*
* version: 4.6.0-beta.1
* generatedAt: 2023-12-05T08:31:06.141Z
* version: 4.6.0-beta.2
* generatedAt: 2023-12-06T08:45:38.779Z
*/
/**
@ -3471,17 +3471,7 @@ export type components = {
usePasswordLessLogin: boolean;
/** @default false */
securityKeys: boolean;
roles: ({
/** Format: id */
id: string;
name: string;
color: string | null;
iconUrl: string | null;
description: string;
isModerator: boolean;
isAdministrator: boolean;
displayOrder: number;
})[];
roles: components['schemas']['RoleLite'][];
memo: string | null;
moderationNote?: string;
isFollowing?: boolean;
@ -4173,6 +4163,160 @@ export type components = {
headers: Record<string, never>;
success: boolean;
};
RoleLite: {
/**
* Format: id
* @example xxxxxxxxxx
*/
id: string;
/** @example New Role */
name: string;
/** @example #000000 */
color: string | null;
iconUrl: string | null;
description: string;
/** @example false */
isModerator: boolean;
/** @example false */
isAdministrator: boolean;
/** @example 0 */
displayOrder: number;
};
Role: components['schemas']['RoleLite'] & ({
/** Format: date-time */
createdAt: string;
/** Format: date-time */
updatedAt: string;
/** @enum {string} */
target: 'manual' | 'conditional';
condFormula: Record<string, never>;
/** @example false */
isPublic: boolean;
/** @example false */
isExplorable: boolean;
/** @example false */
asBadge: boolean;
/** @example false */
canEditMembersByModerator: boolean;
policies: {
pinLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canInvite: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
clipLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canHideAds: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
antennaLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
gtlAvailable: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
ltlAvailable: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
webhookLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canPublicNote: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
userListLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
wordMuteLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
alwaysMarkNsfw: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canSearchNotes: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
driveCapacityMb: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
rateLimitFactor: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteLimitCycle: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
noteEachClipsLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
inviteExpirationTime: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canManageCustomEmojis: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
userEachUserListsLimit: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canManageAvatarDecorations: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
canUseTranslator: {
value: number | boolean;
priority: number;
useDefault: boolean;
};
};
usersCount: number;
});
};
responses: never;
parameters: never;
@ -8615,9 +8759,11 @@ export type operations = {
};
};
responses: {
/** @description OK (without any results) */
204: {
content: never;
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'];
};
};
/** @description Client error */
400: {
@ -8711,9 +8857,11 @@ export type operations = {
*/
'admin/roles/list': {
responses: {
/** @description OK (without any results) */
204: {
content: never;
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'][];
};
};
/** @description Client error */
400: {
@ -8763,9 +8911,11 @@ export type operations = {
};
};
responses: {
/** @description OK (without any results) */
204: {
content: never;
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'];
};
};
/** @description Client error */
400: {
@ -21193,9 +21343,11 @@ export type operations = {
*/
'roles/list': {
responses: {
/** @description OK (without any results) */
204: {
content: never;
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'][];
};
};
/** @description Client error */
400: {
@ -21245,9 +21397,11 @@ export type operations = {
};
};
responses: {
/** @description OK (without any results) */
204: {
content: never;
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'];
};
};
/** @description Client error */
400: {

View file

@ -203,7 +203,7 @@ function focusDown() {
}
function switchItem(item: MenuSwitch & { ref: any }) {
if (typeof item.disabled === 'boolean' ? item.disabled : item.disabled.value) return;
if (item.disabled !== undefined && (typeof item.disabled === 'boolean' ? item.disabled : item.disabled.value)) return;
item.ref = !item.ref;
}

View file

@ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<div v-else>
<component :is="self ? 'MkA' : 'a'" :class="[$style.link, { [$style.compact]: compact }]" :[attr]="self ? url.substring(local.length) : url" rel="nofollow noopener" :target="target" :title="url">
<div v-if="thumbnail" :class="$style.thumbnail" :style="defaultStore.state.dataSaver.urlPreview ? '' : `background-image: url('${thumbnail}')`">
<div v-if="thumbnail && !sensitive" :class="$style.thumbnail" :style="defaultStore.state.dataSaver.urlPreview ? '' : `background-image: url('${thumbnail}')`">
</div>
<article :class="$style.body">
<header :class="$style.header">
@ -118,6 +118,7 @@ let description = $ref<string | null>(null);
let thumbnail = $ref<string | null>(null);
let icon = $ref<string | null>(null);
let sitename = $ref<string | null>(null);
let sensitive = $ref<boolean>(false);
let player = $ref({
url: null,
width: null,
@ -170,6 +171,7 @@ window.fetch(`/url?url=${encodeURIComponent(requestUrl.href)}&lang=${versatileLa
icon = info.icon;
sitename = info.sitename;
player = info.player;
sensitive = info.sensitive ?? false;
});
function adjustTweetHeight(message: any) {

View file

@ -242,17 +242,14 @@ const headerActions = $computed(() => {
type: 'switch',
text: i18n.ts.friendlyEnableNotifications,
ref: $$(friendlyEnableNotifications),
disabled: false,
}, {
type: 'switch',
text: i18n.ts.friendlyEnableWidgets,
ref: $$(friendlyEnableWidgets),
disabled: false,
}, {
type: 'switch',
text: i18n.ts.showRenotes,
ref: $$(withRenotes),
disabled: false,
}, src === 'local' || src === 'social' ? {
type: 'switch',
text: i18n.ts.showRepliesToOthersInTimeline,
@ -267,7 +264,6 @@ const headerActions = $computed(() => {
type: 'switch',
text: i18n.ts.showCatOnly,
ref: $$(onlyCats),
disabled: false,
}], ev.currentTarget ?? ev.target);
},
},

View file

@ -124,7 +124,6 @@ const menu = [{
type: 'switch',
text: i18n.ts.showRenotes,
ref: $$(withRenotes),
disabled: false,
}, props.column.tl === 'local' || props.column.tl === 'social' ? {
type: 'switch',
text: i18n.ts.showRepliesToOthersInTimeline,
@ -139,7 +138,6 @@ const menu = [{
type: 'switch',
text: i18n.ts.showCatOnly,
ref: $$(onlyCats),
disabled: false,
}];
</script>