From dbd9d11d6749245947381c8b4d72a76347406bfb Mon Sep 17 00:00:00 2001 From: Soni L Date: Sat, 25 Feb 2023 23:14:07 -0300 Subject: [PATCH 001/125] Simplify search.vue (remove dead code) (#10088) * Simplify search.vue This is already handled by the code above it, no need to handle it twice * Remove unused imports --- packages/frontend/src/pages/search.vue | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/packages/frontend/src/pages/search.vue b/packages/frontend/src/pages/search.vue index d32bdcd78e..7e81cd2c0d 100644 --- a/packages/frontend/src/pages/search.vue +++ b/packages/frontend/src/pages/search.vue @@ -37,7 +37,6 @@ import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import * as os from '@/os'; import { useRouter, mainRouter } from '@/router'; -import { $i } from '@/account'; const router = useRouter(); @@ -116,24 +115,6 @@ const search = async () => { return; } - if ($i != null) { - if (query.startsWith('https://') || (query.startsWith('@') && !query.includes(' '))) { - const promise = os.api('ap/show', { - uri: query, - }); - - os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); - - const res = await promise; - - if (res.type === 'User') { - router.replace(`/@${res.object.username}@${res.object.host}`); - } else if (res.type === 'Note') { - router.replace(`/notes/${res.object.id}`); - } - } - } - window.history.replaceState('', '', `/search?q=${encodeURIComponent(query)}&type=${searchType}${searchType === 'user' ? `&origin=${searchOrigin}` : ''}`); }; From 991945ea264ec11669bf4ae037dc03dfebcdb4c5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 11:24:09 +0900 Subject: [PATCH 002/125] Update about-misskey.vue --- packages/frontend/src/pages/about-misskey.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index 782fe9fdb2..a49025c920 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -203,6 +203,7 @@ const patrons = [ 'ThatOneCalculator', 'pixeldesu', 'あめ玉', + '氷月氷華里', ]; let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure')); From 18dbcfa0b09715a234a4eca0288e17d5cbf7622c Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 26 Feb 2023 11:28:05 +0900 Subject: [PATCH 003/125] test(server): add validation test of api:notes/create (#10090) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(server): notes/createのバリデーションが効いていない Fix #10079 Co-Authored-By: mei23 * anyOf内にバリデーションを書いても最初の一つしかチェックされない * :v: * wip * wip * :v: * RequiredProp * Revert "RequiredProp" This reverts commit 74693900119a590263106fa3adefd008d69ce80c. * add api:notes/create * fix lint * text * :v: * improve readability --------- Co-authored-by: mei23 Co-authored-by: syuilo --- .vscode/settings.json | 5 +- CONTRIBUTING.md | 21 ++ packages/backend/.eslintrc.cjs | 2 +- packages/backend/jest.config.cjs | 3 +- packages/backend/src/misc/schema.ts | 17 +- .../api/endpoints/admin/drive/show-file.ts | 18 +- .../server/api/endpoints/drive/files/show.ts | 18 +- .../server/api/endpoints/notes/create.test.ts | 248 ++++++++++++++++++ .../src/server/api/endpoints/notes/create.ts | 111 ++++---- .../api/endpoints/notes/search-by-tag.ts | 41 ++- .../src/server/api/endpoints/pages/show.ts | 20 +- .../server/api/endpoints/users/followers.ts | 27 +- .../server/api/endpoints/users/following.ts | 27 +- .../users/search-by-username-and-host.ts | 17 +- .../src/server/api/endpoints/users/show.ts | 40 ++- .../backend/test/prelude/get-api-validator.ts | 11 + packages/backend/test/resources/misskey.svg | 7 + packages/backend/test/tsconfig.json | 3 +- packages/backend/tsconfig.json | 7 +- 19 files changed, 431 insertions(+), 212 deletions(-) create mode 100644 packages/backend/src/server/api/endpoints/notes/create.test.ts create mode 100644 packages/backend/test/prelude/get-api-validator.ts create mode 100644 packages/backend/test/resources/misskey.svg diff --git a/.vscode/settings.json b/.vscode/settings.json index c94a34194e..6a0497946d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,8 @@ "search.exclude": { "**/node_modules": true }, - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "files.associations": { + "*.test.ts": "typescript" + } } \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 668989f122..10d93cd9fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -299,6 +299,27 @@ pnpm dlx typeorm migration:generate -d ormconfig.js -o - 生成後、ファイルをmigration下に移してください - 作成されたスクリプトは不必要な変更を含むため除去してください +### JSON SchemaのobjectでanyOfを使うとき +JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。 +バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます) +https://github.com/misskey-dev/misskey/pull/10082 + +テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合: + +``` +export const paramDef = { + type: 'object', + properties: { + hoge: { type: 'string', minLength: 1 }, + fuga: { type: 'string', minLength: 1 }, + }, + anyOf: [ + { required: ['hoge'] }, + { required: ['fuga'] }, + ], +} as const; +``` + ### コネクションには`markRaw`せよ **Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。 diff --git a/packages/backend/.eslintrc.cjs b/packages/backend/.eslintrc.cjs index 5a06889dcd..f9fe4814e6 100644 --- a/packages/backend/.eslintrc.cjs +++ b/packages/backend/.eslintrc.cjs @@ -1,7 +1,7 @@ module.exports = { parserOptions: { tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], + project: ['./tsconfig.json', './test/tsconfig.json'], }, extends: [ '../shared/.eslintrc.js', diff --git a/packages/backend/jest.config.cjs b/packages/backend/jest.config.cjs index 2f11f6a3e9..8a11ad848c 100644 --- a/packages/backend/jest.config.cjs +++ b/packages/backend/jest.config.cjs @@ -20,7 +20,7 @@ module.exports = { // collectCoverage: false, // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: ['src/**/*.ts'], + collectCoverageFrom: ['src/**/*.ts', '!src/**/*.test.ts'], // The directory where Jest should output its coverage files coverageDirectory: "coverage", @@ -159,6 +159,7 @@ module.exports = { // The glob patterns Jest uses to detect test files testMatch: [ "/test/unit/**/*.ts", + "/src/**/*.test.ts", //"/test/e2e/**/*.ts" ], diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts index 7fc4a3e654..6a0802f8a4 100644 --- a/packages/backend/src/misc/schema.ts +++ b/packages/backend/src/misc/schema.ts @@ -116,10 +116,10 @@ export type Obj = Record; // https://github.com/misskey-dev/misskey/issues/8535 // To avoid excessive stack depth error, // deceive TypeScript with UnionToIntersection (or more precisely, `infer` expression within it). -export type ObjType = +export type ObjType> = UnionToIntersection< { -readonly [R in RequiredPropertyNames]-?: SchemaType } & - { -readonly [R in RequiredProps]-?: SchemaType } & + { -readonly [R in RequiredProps[number]]-?: SchemaType } & { -readonly [P in keyof s]?: SchemaType } >; @@ -136,18 +136,19 @@ type PartialIntersection = Partial>; // https://github.com/misskey-dev/misskey/pull/8144#discussion_r785287552 // To get union, we use `Foo extends any ? Hoge : never` type UnionSchemaType = X extends any ? SchemaType : never; -type UnionObjectSchemaType = X extends any ? ObjectSchemaType : never; +//type UnionObjectSchemaType = X extends any ? ObjectSchemaType : never; +type UnionObjType = a[number]> = X extends any ? ObjType : never; type ArrayUnion = T extends any ? Array : never; type ObjectSchemaTypeDef

= p['ref'] extends keyof typeof refs ? Packed : p['properties'] extends NonNullable ? - p['anyOf'] extends ReadonlyArray ? - ObjType[number]> & UnionObjectSchemaType & PartialIntersection> - : - ObjType[number]> + p['anyOf'] extends ReadonlyArray ? p['anyOf'][number]['required'] extends ReadonlyArray ? + UnionObjType> & ObjType> + : never + : ObjType> : - p['anyOf'] extends ReadonlyArray ? UnionObjectSchemaType & PartialIntersection> : + p['anyOf'] extends ReadonlyArray ? never : // see CONTRIBUTING.md p['allOf'] extends ReadonlyArray ? UnionToIntersection> : any diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts index 85b566aabe..1d27ac2137 100644 --- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts +++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts @@ -138,19 +138,13 @@ export const meta = { export const paramDef = { type: 'object', + properties: { + fileId: { type: 'string', format: 'misskey:id' }, + url: { type: 'string' }, + }, anyOf: [ - { - properties: { - fileId: { type: 'string', format: 'misskey:id' }, - }, - required: ['fileId'], - }, - { - properties: { - url: { type: 'string' }, - }, - required: ['url'], - }, + { required: ['fileId'] }, + { required: ['url'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/drive/files/show.ts b/packages/backend/src/server/api/endpoints/drive/files/show.ts index e0a07a3640..271b33ef4b 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/show.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/show.ts @@ -39,19 +39,13 @@ export const meta = { export const paramDef = { type: 'object', + properties: { + fileId: { type: 'string', format: 'misskey:id' }, + url: { type: 'string' }, + }, anyOf: [ - { - properties: { - fileId: { type: 'string', format: 'misskey:id' }, - }, - required: ['fileId'], - }, - { - properties: { - url: { type: 'string' }, - }, - required: ['url'], - }, + { required: ['fileId'] }, + { required: ['url'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/notes/create.test.ts b/packages/backend/src/server/api/endpoints/notes/create.test.ts new file mode 100644 index 0000000000..4e5ec361f9 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/notes/create.test.ts @@ -0,0 +1,248 @@ +process.env.NODE_ENV = 'test'; + +import { readFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; +import { describe, test, expect } from '@jest/globals'; +import { getValidator } from '../../../../../test/prelude/get-api-validator.js'; +import { paramDef } from './create.js'; + +const _filename = fileURLToPath(import.meta.url); +const _dirname = dirname(_filename); + +const VALID = true; +const INVALID = false; + +describe('api:notes/create', () => { + describe('validation', () => { + const v = getValidator(paramDef); + const tooLong = readFile(_dirname + '/../../../../../test/resources/misskey.svg', 'utf-8'); + + test('reject empty', () => { + const valid = v({ }); + expect(valid).toBe(INVALID); + }); + + describe('text', () => { + test('simple post', () => { + expect(v({ text: 'Hello, world!' })) + .toBe(VALID); + }); + + test('null post', () => { + expect(v({ text: null })) + .toBe(INVALID); + }); + + test('0 characters post', () => { + expect(v({ text: '' })) + .toBe(INVALID); + }); + + test('over 3000 characters post', async () => { + expect(v({ text: await tooLong })) + .toBe(INVALID); + }); + }); + + describe('cw', () => { + test('simple cw', () => { + expect(v({ text: 'Hello, world!', cw: 'Hello, world!' })) + .toBe(VALID); + }); + + test('null cw', () => { + expect(v({ text: 'Body', cw: null })) + .toBe(VALID); + }); + + test('0 characters cw', () => { + expect(v({ text: 'Body', cw: '' })) + .toBe(VALID); + }); + + test('reject only cw', () => { + expect(v({ cw: 'Hello, world!' })) + .toBe(INVALID); + }); + + test('over 100 characters cw', async () => { + expect(v({ text: 'Body', cw: await tooLong })) + .toBe(INVALID); + }); + }); + + describe('visibility', () => { + test('public', () => { + expect(v({ text: 'Hello, world!', visibility: 'public' })) + .toBe(VALID); + }); + + test('home', () => { + expect(v({ text: 'Hello, world!', visibility: 'home' })) + .toBe(VALID); + }); + + test('followers', () => { + expect(v({ text: 'Hello, world!', visibility: 'followers' })) + .toBe(VALID); + }); + + test('reject only visibility', () => { + expect(v({ visibility: 'public' })) + .toBe(INVALID); + }); + + test('reject invalid visibility', () => { + expect(v({ text: 'Hello, world!', visibility: 'invalid' })) + .toBe(INVALID); + }); + + test('reject null visibility', () => { + expect(v({ text: 'Hello, world!', visibility: null })) + .toBe(INVALID); + }); + + describe('visibility:specified', () => { + test('specified without visibleUserIds', () => { + expect(v({ text: 'Hello, world!', visibility: 'specified' })) + .toBe(VALID); + }); + + test('specified with empty visibleUserIds', () => { + expect(v({ text: 'Hello, world!', visibility: 'specified', visibleUserIds: [] })) + .toBe(VALID); + }); + + test('reject specified with non unique visibleUserIds', () => { + expect(v({ text: 'Hello, world!', visibility: 'specified', visibleUserIds: ['1', '1', '2'] })) + .toBe(INVALID); + }); + + test('reject specified with null visibleUserIds', () => { + expect(v({ text: 'Hello, world!', visibility: 'specified', visibleUserIds: null })) + .toBe(INVALID); + }); + }); + }); + + describe('fileIds', () => { + test('only fileIds', () => { + expect(v({ fileIds: ['1', '2', '3'] })) + .toBe(VALID); + }); + + test('text and fileIds', () => { + expect(v({ text: 'Hello, world!', fileIds: ['1', '2', '3'] })) + .toBe(VALID); + }); + + test('reject null fileIds', () => { + expect(v({ fileIds: null })) + .toBe(INVALID); + }); + + test('reject text and null fileIds (複合的なanyOfのバリデーションが正しく動作する)', () => { + expect(v({ text: 'Hello, world!', fileIds: null })) + .toBe(INVALID); + }); + + test('reject 0 files', () => { + expect(v({ fileIds: [] })) + .toBe(INVALID); + }); + + test('reject non unique', () => { + expect(v({ fileIds: ['1', '1', '2'] })) + .toBe(INVALID); + }); + + test('reject invalid id', () => { + expect(v({ fileIds: ['あ'] })) + .toBe(INVALID); + }); + + test('reject over 17 files', () => { + const valid = v({ text: 'Hello, world!', fileIds: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'] }); + expect(valid).toBe(INVALID); + }); + }); + + describe('poll', () => { + test('note with poll', () => { + expect(v({ text: 'Hello, world!', poll: { choices: ['a', 'b', 'c'] } })) + .toBe(VALID); + }); + + test('null poll', () => { + expect(v({ text: 'Hello, world!', poll: null })) + .toBe(VALID); + }); + + test('allow only poll', () => { + expect(v({ poll: { choices: ['a', 'b', 'c'] } })) + .toBe(VALID); + }); + + test('poll with expiresAt', async () => { + expect(v({ poll: { choices: ['a', 'b', 'c'], expiresAt: 1 } })) + .toBe(VALID); + }); + + test('poll with expiredAfter', async () => { + expect(v({ poll: { choices: ['a', 'b', 'c'], expiredAfter: 1 } })) + .toBe(VALID); + }); + + test('reject poll without choices', () => { + expect(v({ poll: { } })) + .toBe(INVALID); + }); + + test('reject poll with empty choices', () => { + expect(v({ poll: { choices: [] } })) + .toBe(INVALID); + }); + + test('reject poll with null choices', () => { + expect(v({ poll: { choices: null } })) + .toBe(INVALID); + }); + + test('reject poll with 1 choice', () => { + expect(v({ poll: { choices: ['a'] } })) + .toBe(INVALID); + }); + + test('reject poll with too long choice', async () => { + expect(v({ poll: { choices: [await tooLong, '2'] } })) + .toBe(INVALID); + }); + + test('reject poll with too many choices', () => { + expect(v({ poll: { choices: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'] } })) + .toBe(INVALID); + }); + + test('reject poll with non unique choices', () => { + expect(v({ poll: { choices: ['a', 'a', 'b', 'c'] } })) + .toBe(INVALID); + }); + + test('reject poll with expiredAfter 0', async () => { + expect(v({ poll: { choices: ['a', 'b', 'c'], expiredAfter: 0 } })) + .toBe(INVALID); + }); + }); + + test('text, fileIds and poll', () => { + expect(v({ text: 'Hello, world!', fileIds: ['1', '2', '3'], poll: { choices: ['a', 'b', 'c'] } })) + .toBe(VALID); + }); + + test('text, invalid fileIds and invalid poll', () => { + expect(v({ text: 'Hello, world!', fileIds: ['あ'], poll: { choices: ['a'] } })) + .toBe(INVALID); + }); + }); +}); diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index f4c5a84a4f..2848cd7df1 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -101,74 +101,55 @@ export const paramDef = { noExtractHashtags: { type: 'boolean', default: false }, noExtractEmojis: { type: 'boolean', default: false }, replyId: { type: 'string', format: 'misskey:id', nullable: true }, + renoteId: { type: 'string', format: 'misskey:id', nullable: true }, channelId: { type: 'string', format: 'misskey:id', nullable: true }, + + // anyOf内にバリデーションを書いても最初の一つしかチェックされない + // See https://github.com/misskey-dev/misskey/pull/10082 + text: { + type: 'string', + minLength: 1, + maxLength: MAX_NOTE_TEXT_LENGTH, + nullable: false + }, + fileIds: { + type: 'array', + uniqueItems: true, + minItems: 1, + maxItems: 16, + items: { type: 'string', format: 'misskey:id' }, + }, + mediaIds: { + type: 'array', + uniqueItems: true, + minItems: 1, + maxItems: 16, + items: { type: 'string', format: 'misskey:id' }, + }, + poll: { + type: 'object', + nullable: true, + properties: { + choices: { + type: 'array', + uniqueItems: true, + minItems: 2, + maxItems: 10, + items: { type: 'string', minLength: 1, maxLength: 50 }, + }, + multiple: { type: 'boolean' }, + expiresAt: { type: 'integer', nullable: true }, + expiredAfter: { type: 'integer', nullable: true, minimum: 1 }, + }, + required: ['choices'], + }, }, + // (re)note with text, files and poll are optional anyOf: [ - { - // (re)note with text, files and poll are optional - properties: { - text: { type: 'string', minLength: 1, maxLength: MAX_NOTE_TEXT_LENGTH, nullable: false }, - }, - required: ['text'], - }, - { - // (re)note with files, text and poll are optional - properties: { - fileIds: { - type: 'array', - uniqueItems: true, - minItems: 1, - maxItems: 16, - items: { type: 'string', format: 'misskey:id' }, - }, - }, - required: ['fileIds'], - }, - { - // (re)note with files, text and poll are optional - properties: { - mediaIds: { - deprecated: true, - description: 'Use `fileIds` instead. If both are specified, this property is discarded.', - type: 'array', - uniqueItems: true, - minItems: 1, - maxItems: 16, - items: { type: 'string', format: 'misskey:id' }, - }, - }, - required: ['mediaIds'], - }, - { - // (re)note with poll, text and files are optional - properties: { - poll: { - type: 'object', - nullable: true, - properties: { - choices: { - type: 'array', - uniqueItems: true, - minItems: 2, - maxItems: 10, - items: { type: 'string', minLength: 1, maxLength: 50 }, - }, - multiple: { type: 'boolean' }, - expiresAt: { type: 'integer', nullable: true }, - expiredAfter: { type: 'integer', nullable: true, minimum: 1 }, - }, - required: ['choices'], - }, - }, - required: ['poll'], - }, - { - // pure renote - properties: { - renoteId: { type: 'string', format: 'misskey:id', nullable: true }, - }, - required: ['renoteId'], - }, + { required: ['text'] }, + { required: ['fileIds'] }, + { required: ['mediaIds'] }, + { required: ['poll'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts index bcd793ac43..da1a4bcc46 100644 --- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts +++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts @@ -36,32 +36,25 @@ export const paramDef = { sinceId: { type: 'string', format: 'misskey:id' }, untilId: { type: 'string', format: 'misskey:id' }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, + + tag: { type: 'string', minLength: 1 }, + query: { + type: 'array', + description: 'The outer arrays are chained with OR, the inner arrays are chained with AND.', + items: { + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + minItems: 1, + }, + minItems: 1, + }, }, anyOf: [ - { - properties: { - tag: { type: 'string', minLength: 1 }, - }, - required: ['tag'], - }, - { - properties: { - query: { - type: 'array', - description: 'The outer arrays are chained with OR, the inner arrays are chained with AND.', - items: { - type: 'array', - items: { - type: 'string', - minLength: 1, - }, - minItems: 1, - }, - minItems: 1, - }, - }, - required: ['query'], - }, + { required: ['tag'] }, + { required: ['query'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/pages/show.ts b/packages/backend/src/server/api/endpoints/pages/show.ts index 651252afbb..bf2b2a431e 100644 --- a/packages/backend/src/server/api/endpoints/pages/show.ts +++ b/packages/backend/src/server/api/endpoints/pages/show.ts @@ -29,20 +29,14 @@ export const meta = { export const paramDef = { type: 'object', + properties: { + pageId: { type: 'string', format: 'misskey:id' }, + name: { type: 'string' }, + username: { type: 'string' }, + }, anyOf: [ - { - properties: { - pageId: { type: 'string', format: 'misskey:id' }, - }, - required: ['pageId'], - }, - { - properties: { - name: { type: 'string' }, - username: { type: 'string' }, - }, - required: ['name', 'username'], - }, + { required: ['pageId'] }, + { required: ['name', 'username'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts index 17ce920011..97f1310c36 100644 --- a/packages/backend/src/server/api/endpoints/users/followers.ts +++ b/packages/backend/src/server/api/endpoints/users/followers.ts @@ -46,25 +46,18 @@ export const paramDef = { sinceId: { type: 'string', format: 'misskey:id' }, untilId: { type: 'string', format: 'misskey:id' }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, + + userId: { type: 'string', format: 'misskey:id' }, + username: { type: 'string' }, + host: { + type: 'string', + nullable: true, + description: 'The local host is represented with `null`.', + }, }, anyOf: [ - { - properties: { - userId: { type: 'string', format: 'misskey:id' }, - }, - required: ['userId'], - }, - { - properties: { - username: { type: 'string' }, - host: { - type: 'string', - nullable: true, - description: 'The local host is represented with `null`.', - }, - }, - required: ['username', 'host'], - }, + { required: ['userId'] }, + { required: ['username', 'host'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts index 6dbda0d72f..d406594a2e 100644 --- a/packages/backend/src/server/api/endpoints/users/following.ts +++ b/packages/backend/src/server/api/endpoints/users/following.ts @@ -46,25 +46,18 @@ export const paramDef = { sinceId: { type: 'string', format: 'misskey:id' }, untilId: { type: 'string', format: 'misskey:id' }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, + + userId: { type: 'string', format: 'misskey:id' }, + username: { type: 'string' }, + host: { + type: 'string', + nullable: true, + description: 'The local host is represented with `null`.', + }, }, anyOf: [ - { - properties: { - userId: { type: 'string', format: 'misskey:id' }, - }, - required: ['userId'], - }, - { - properties: { - username: { type: 'string' }, - host: { - type: 'string', - nullable: true, - description: 'The local host is represented with `null`.', - }, - }, - required: ['username', 'host'], - }, + { required: ['userId'] }, + { required: ['username', 'host'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index 1cefcf2707..6c340d8fb2 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -31,20 +31,13 @@ export const paramDef = { properties: { limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 }, detail: { type: 'boolean', default: true }, + + username: { type: 'string', nullable: true }, + host: { type: 'string', nullable: true }, }, anyOf: [ - { - properties: { - username: { type: 'string', nullable: true }, - }, - required: ['username'], - }, - { - properties: { - host: { type: 'string', nullable: true }, - }, - required: ['host'], - }, + { required: ['username'] }, + { required: ['host'] }, ], } as const; diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts index 70258ef009..29f24b045a 100644 --- a/packages/backend/src/server/api/endpoints/users/show.ts +++ b/packages/backend/src/server/api/endpoints/users/show.ts @@ -54,32 +54,22 @@ export const meta = { export const paramDef = { type: 'object', + properties: { + userId: { type: 'string', format: 'misskey:id' }, + userIds: { type: 'array', uniqueItems: true, items: { + type: 'string', format: 'misskey:id', + } }, + username: { type: 'string' }, + host: { + type: 'string', + nullable: true, + description: 'The local host is represented with `null`.', + }, + }, anyOf: [ - { - properties: { - userId: { type: 'string', format: 'misskey:id' }, - }, - required: ['userId'], - }, - { - properties: { - userIds: { type: 'array', uniqueItems: true, items: { - type: 'string', format: 'misskey:id', - } }, - }, - required: ['userIds'], - }, - { - properties: { - username: { type: 'string' }, - host: { - type: 'string', - nullable: true, - description: 'The local host is represented with `null`.', - }, - }, - required: ['username'], - }, + { required: ['userId'] }, + { required: ['userIds'] }, + { required: ['username'] }, ], } as const; diff --git a/packages/backend/test/prelude/get-api-validator.ts b/packages/backend/test/prelude/get-api-validator.ts new file mode 100644 index 0000000000..1f4a2dbc95 --- /dev/null +++ b/packages/backend/test/prelude/get-api-validator.ts @@ -0,0 +1,11 @@ +import { Schema } from '@/misc/schema'; +import Ajv from 'ajv'; + +export const getValidator = (paramDef: Schema) => { + const ajv = new Ajv({ + useDefaults: true, + }); + ajv.addFormat('misskey:id', /^[a-zA-Z0-9]+$/); + + return ajv.compile(paramDef); +} diff --git a/packages/backend/test/resources/misskey.svg b/packages/backend/test/resources/misskey.svg new file mode 100644 index 0000000000..3fcb2d3ecb --- /dev/null +++ b/packages/backend/test/resources/misskey.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json index da82ddc4a1..8a024a678b 100644 --- a/packages/backend/test/tsconfig.json +++ b/packages/backend/test/tsconfig.json @@ -33,11 +33,12 @@ "lib": [ "esnext" ], - "types": ["jest"] + "types": ["jest", "node"] }, "compileOnSave": false, "include": [ "./**/*.ts", + "../src/**/*.test.ts", "../src/@types/**/*.ts", ] } diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 6f335a2442..faadbcdfc6 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -26,9 +26,7 @@ "rootDir": "./src", "baseUrl": "./", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "outDir": "./built", "types": [ @@ -46,4 +44,7 @@ "include": [ "./src/**/*.ts" ], + "exclude": [ + "./src/**/*.test.ts" + ] } From 16ac03322cb4c5746fd627dd1e29b06e76278a76 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 11:32:10 +0900 Subject: [PATCH 004/125] New Crowdin updates (#10059) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (Romanian) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Arabic) * New translations ja-JP.yml (Czech) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (Polish) * New translations ja-JP.yml (Russian) * New translations ja-JP.yml (Slovak) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Indonesian) * New translations ja-JP.yml (Bengali) * New translations ja-JP.yml (Thai) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (German) * New translations ja-JP.yml (English) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (Thai) * New translations ja-JP.yml (Thai) * New translations ja-JP.yml (Thai) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Spanish) --- locales/ar-SA.yml | 1 + locales/bn-BD.yml | 1 + locales/cs-CZ.yml | 1 + locales/de-DE.yml | 38 ++++++++++++++++++++++++-- locales/en-US.yml | 39 ++++++++++++++++++++++++--- locales/es-ES.yml | 48 +++++++++++++++++++++++++++++++++ locales/fr-FR.yml | 1 + locales/id-ID.yml | 1 + locales/it-IT.yml | 1 + locales/ja-KS.yml | 68 ++++++++++++++++++++++++++++++++++++++++++++--- locales/ko-KR.yml | 1 + locales/pl-PL.yml | 1 + locales/ro-RO.yml | 2 ++ locales/ru-RU.yml | 1 + locales/sk-SK.yml | 1 + locales/th-TH.yml | 34 ++++++++++++++++++++++++ locales/uk-UA.yml | 26 ++++++++++++++++++ locales/vi-VN.yml | 1 + locales/zh-CN.yml | 36 ++++++++++++++++++++++++- locales/zh-TW.yml | 46 +++++++++++++++++++++++++++----- 20 files changed, 333 insertions(+), 15 deletions(-) diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index fb06f77daf..3425b9c82f 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -971,6 +971,7 @@ _ago: weeksAgo: "منذ {n} أسابيع" monthsAgo: "منذ {n} أشهر" yearsAgo: "منذ {n} سنوات" + invalid: "لا يوجد شيء هنا" _time: second: "ثا" minute: "د" diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml index 18898bf4d6..da17fc48d3 100644 --- a/locales/bn-BD.yml +++ b/locales/bn-BD.yml @@ -1033,6 +1033,7 @@ _ago: weeksAgo: "{n} সপ্তাহ আগে" monthsAgo: "{n} মাস আগে" yearsAgo: "{n} বছর আগে" + invalid: "এখানে কিছুই নাই" _time: second: "সেকেন্ড" minute: "মিনিট" diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml index 32891ff9fd..7f665895b9 100644 --- a/locales/cs-CZ.yml +++ b/locales/cs-CZ.yml @@ -659,6 +659,7 @@ _sfx: _ago: future: "Budoucí" justNow: "Teď" + invalid: "Nic nebylo nalezeno" _time: second: "Sekund" minute: "Minut" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index e68207f902..e5f8e93278 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -393,13 +393,19 @@ about: "Über" aboutMisskey: "Über Misskey" administrator: "Administrator" token: "Token" +2fa: "Zwei-Faktor-Authentifizierung" +totp: "Authentifizierungs-App" +totpDescription: "Logge dich via Authentifizierungs-App mit Einmalpasswort ein" moderator: "Moderator" moderation: "Moderation" nUsersMentioned: "Von {n} Benutzern erwähnt" +securityKeyAndPasskey: "Security-Tokens und Passkeys" securityKey: "Sicherheitsschlüssel" lastUsed: "Zuletzt benutzt" +lastUsedAt: "Zuletzt verwendet: {t}" unregister: "Deaktivieren" passwordLessLogin: "Passwortloses Anmelden einrichten" +passwordLessLoginDescription: "Ermöglicht passwortfreies Einloggen, nur via Security-Token oder Passkey" resetPassword: "Passwort zurücksetzen" newPasswordIs: "Das neue Passwort ist „{password}“" reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren" @@ -773,6 +779,7 @@ popularPosts: "Beliebte Beiträge" shareWithNote: "Mit Notiz teilen" ads: "Werbung" expiration: "Frist" +startingperiod: "Start" memo: "Merkzettel" priority: "Priorität" high: "Hoch" @@ -805,6 +812,7 @@ lastCommunication: "Letzte Kommunikation" resolved: "Gelöst" unresolved: "Ungelöst" breakFollow: "Follower entfernen" +breakFollowConfirm: "Diesen Follower wirklich entfernen?" itsOn: "Eingeschaltet" itsOff: "Ausgeschaltet" emailRequiredForSignup: "Angabe einer Email-Adresse als benötigt markieren" @@ -939,6 +947,10 @@ collapseRenotes: "Bereits gesehene Renotes verkürzt anzeigen" internalServerError: "Serverinterner Fehler" internalServerErrorDescription: "Im Server ist ein unerwarteter Fehler aufgetreten." copyErrorInfo: "Fehlerdetails kopieren" +joinThisServer: "Bei dieser Instanz registrieren" +exploreOtherServers: "Eine andere Instanz finden" +letsLookAtTimeline: "Die Chronik durchstöbern" +disableFederationWarn: "Dies deaktiviert Föderation, aber alle Notizen bleiben, sofern nicht umgestellt, öffentlich. In den meisten Fällen wird diese Option nicht benötigt." _achievements: earnedAt: "Freigeschaltet am" _types: @@ -1452,6 +1464,7 @@ _ago: weeksAgo: "vor {n} Woche(n)" monthsAgo: "vor {n} Monat(en)" yearsAgo: "vor {n} Jahr(en)" + invalid: "Ungültig" _time: second: "Sekunde(n)" minute: "Minute(n)" @@ -1485,14 +1498,29 @@ _tutorial: step8_3: "Diese Einstellung kannst du jederzeit ändern." _2fa: alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung registriert." + registerTOTP: "Authentifizierungs-App registrieren" + passwordToTOTP: "Bitte Passwort eingeben" step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem Gerät." step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät." + step2Click: "Durch Klicken dieses QR-Codes kannst du Verifikation mit deinem Security-Token oder einer App registrieren." step2Url: "Nutzt du ein Desktopprogramm kannst du alternativ diese URL eingeben:" + step3Title: "Authentifizierungsscode eingeben" step3: "Gib zum Abschluss den Token ein, der von deiner App angezeigt wird." step4: "Alle folgenden Anmeldungsversuche werden ab sofort die Eingabe eines solchen Tokens benötigen." + securityKeyNotSupported: "Dein Browser unterstützt keine Security-Tokens." + registerTOTPBeforeKey: "Um einen Security-Token oder einen Passkey zu registrieren, musst du zuerst eine Authentifizierungs-App registrieren." securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten." - removeKeyConfirm: "Das Backup {name} löschen?" - renewTOTPCancel: "Nein, danke" + chromePasskeyNotSupported: "Chrome-Passkeys werden zur Zeit nicht unterstützt." + registerSecurityKey: "Security-Token oder Passkey registrieren" + securityKeyName: "Schlüsselname eingeben" + tapSecurityKey: "Bitten folge den Anweisungen deines Browsers zur Registrierung" + removeKey: "Sicherheitsschlüssel entfernen" + removeKeyConfirm: "Den Schlüssel {name} wirklich löschen?" + whyTOTPOnlyRenew: "Solange ein Sicherheitsschlüssel registriert ist, kann die Authentifizierungs-App nicht entfernt werden." + renewTOTP: "Authentifizierungs-App neu einrichten" + renewTOTPConfirm: "Codes der bisherigen App werden hierdurch nutzlos" + renewTOTPOk: "Neu einrichten" + renewTOTPCancel: "Abbrechen" _permissions: "read:account": "Deine Benutzerkontoinformationen lesen" "write:account": "Deine Benutzerkontoinformationen bearbeiten" @@ -1615,6 +1643,8 @@ _visibility: followersDescription: "Nur für Follower sichtbar" specified: "Direkt" specifiedDescription: "Nur für bestimmte Benutzer sichtbar" + disableFederation: "Deförderiert" + disableFederationDescription: "Nicht an andere Instanzen übertragen" _postForm: replyPlaceholder: "Dieser Notiz antworten …" quotePlaceholder: "Diese Notiz zitieren …" @@ -1770,6 +1800,7 @@ _notification: pollEnded: "Ende von Umfragen" receiveFollowRequest: "Erhaltene Follow-Anfragen" followRequestAccepted: "Akzeptierte Follow-Anfragen" + achievementEarned: "Errungenschaft freigeschaltet" app: "Benachrichtigungen von Apps" _actions: followBack: "folgt dir nun auch" @@ -1802,3 +1833,6 @@ _deck: channel: "Kanal" mentions: "Erwähnungen" direct: "Direktnachrichten" +_dialog: + charactersExceeded: "Maximallänge überschritten! Momentan {current} von {max}" + charactersBelow: "Minimallänge unterschritten! Momentan {current} von {min}" diff --git a/locales/en-US.yml b/locales/en-US.yml index 1ee5620916..f118ddba72 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -393,13 +393,19 @@ about: "About" aboutMisskey: "About Misskey" administrator: "Administrator" token: "Token" +2fa: "Two-factor authentication" +totp: "Authenticator App" +totpDescription: "Use an authenticator app to enter one-time passwords" moderator: "Moderator" moderation: "Moderation" nUsersMentioned: "Mentioned by {n} users" +securityKeyAndPasskey: "Security- and passkeys" securityKey: "Security key" lastUsed: "Last used" +lastUsedAt: "Last used: {t}" unregister: "Unregister" passwordLessLogin: "Password-less login" +passwordLessLoginDescription: "Allows password-less login using a security- or passkey only" resetPassword: "Reset password" newPasswordIs: "The new password is \"{password}\"" reduceUiAnimation: "Reduce UI animations" @@ -773,6 +779,7 @@ popularPosts: "Popular posts" shareWithNote: "Share with note" ads: "Advertisements" expiration: "Deadline" +startingperiod: "Start" memo: "Memo" priority: "Priority" high: "High" @@ -805,7 +812,7 @@ lastCommunication: "Last communication" resolved: "Resolved" unresolved: "Unresolved" breakFollow: "Remove follower" -breakFollowConfirm: "Are you sure want to remove follower?" +breakFollowConfirm: "Really remove this follower?" itsOn: "Enabled" itsOff: "Disabled" emailRequiredForSignup: "Require email address for sign-up" @@ -940,6 +947,10 @@ collapseRenotes: "Collapse renotes you've already seen" internalServerError: "Internal Server Error" internalServerErrorDescription: "The server has run into an unexpected error." copyErrorInfo: "Copy error details" +joinThisServer: "Sign up at this instance" +exploreOtherServers: "Look for another instance" +letsLookAtTimeline: "Have a look at the timeline" +disableFederationWarn: "This will disable federation, but posts will continue to be public unless set otherwise. You usually do not need to use this setting." _achievements: earnedAt: "Unlocked at" _types: @@ -1453,6 +1464,7 @@ _ago: weeksAgo: "{n}w ago" monthsAgo: "{n}mo ago" yearsAgo: "{n}y ago" + invalid: "None" _time: second: "Second(s)" minute: "Minute(s)" @@ -1486,14 +1498,29 @@ _tutorial: step8_3: "You can always change this setting later." _2fa: alreadyRegistered: "You have already registered a 2-factor authentication device." + registerTOTP: "Register authenticator app" + passwordToTOTP: "Enter your password" step1: "First, install an authentication app (such as {a} or {b}) on your device." step2: "Then, scan the QR code displayed on this screen." + step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app." step2Url: "You can also enter this URL if you're using a desktop program:" + step3Title: "Enter an authentication code" step3: "Enter the token provided by your app to finish setup." step4: "From now on, any future login attempts will ask for such a login token." + securityKeyNotSupported: "Your browser does not support security keys." + registerTOTPBeforeKey: "Please set up an authenticator app to register a security or pass key." securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account." - removeKeyConfirm: "Delete the {name} backup?" - renewTOTPCancel: "Not now" + chromePasskeyNotSupported: "Chrome passkeys are currently not supported." + registerSecurityKey: "Register a security or pass key" + securityKeyName: "Enter a key name" + tapSecurityKey: "Please follow your browser to register the security or pass key" + removeKey: "Remove security key" + removeKeyConfirm: "Really delete the {name} key?" + whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security key is registered." + renewTOTP: "Reconfigure authenticator app" + renewTOTPConfirm: "This will cause verification codes from your previous app to stop working" + renewTOTPOk: "Reconfigure" + renewTOTPCancel: "Cancel" _permissions: "read:account": "View your account information" "write:account": "Edit your account information" @@ -1616,6 +1643,8 @@ _visibility: followersDescription: "Make visible to your followers only" specified: "Direct" specifiedDescription: "Make visible for specified users only" + disableFederation: "Unfederated" + disableFederationDescription: "Don't transmit to other instances" _postForm: replyPlaceholder: "Reply to this note..." quotePlaceholder: "Quote this note..." @@ -1771,6 +1800,7 @@ _notification: pollEnded: "Polls ending" receiveFollowRequest: "Received follow requests" followRequestAccepted: "Accepted follow requests" + achievementEarned: "Achievement unlocked" app: "Notifications from linked apps" _actions: followBack: "followed you back" @@ -1803,3 +1833,6 @@ _deck: channel: "Channel" mentions: "Mentions" direct: "Direct notes" +_dialog: + charactersExceeded: "You've exceeded the maximum character limit! Currently at {current} of {max}." + charactersBelow: "You're below the minimum character limit! Currently at {current} of {min}." diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 6f638b3369..2acf47cb4b 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -103,6 +103,8 @@ renoted: "Renotado" cantRenote: "No se puede renotar este post" cantReRenote: "No se puede renotar una renota" quote: "Citar" +inChannelRenote: "Renota sólo del canal" +inChannelQuote: "Cita sólo del canal" pinnedNote: "Nota fijada" pinned: "Fijar al perfil" you: "Tú" @@ -391,13 +393,19 @@ about: "Información" aboutMisskey: "Sobre Misskey" administrator: "Administrador" token: "Token" +2fa: "Autenticación de doble factor" +totp: "Aplicación autentícadora" +totpDescription: "Ingresa una contaseña de un sólo uso usando la aplicación autenticadora" moderator: "Moderador" moderation: "Moderación" nUsersMentioned: "{n} usuarios mencionados" +securityKeyAndPasskey: "Clave de seguridad / clave de paso" securityKey: "Clave de seguridad" lastUsed: "Última vez usado" +lastUsedAt: "Último uso: {t}" unregister: "Cancelar registro" passwordLessLogin: "Iniciar sesión sin contraseña" +passwordLessLoginDescription: "Iniciar sesión con sólo una clave se seguridad / de paso sin usar una contraseña" resetPassword: "Resetear contraseña" newPasswordIs: "La nueva contraseña es \"{password}\"" reduceUiAnimation: "Reducir la animación de la UI" @@ -451,6 +459,8 @@ native: "Nativo" disableDrawer: "No mostrar los menús en cajones" noHistory: "No hay datos en el historial" signinHistory: "Historial de ingresos" +enableAdvancedMfm: "Habilitar MFM avanzado" +enableAnimatedMfm: "Habilitar MFM con movimiento" doing: "Voy en camino" category: "Categoría" tags: "Etiqueta" @@ -769,6 +779,7 @@ popularPosts: "Más vistos" shareWithNote: "Compartir con una nota" ads: "Anuncios" expiration: "Termina el" +startingperiod: "periodo de inicio" memo: "Notas" priority: "Prioridad" high: "Alta" @@ -801,6 +812,7 @@ lastCommunication: "Última comunicación" resolved: "Resuelto" unresolved: "Sin resolver" breakFollow: "Dejar de seguir" +breakFollowConfirm: "¿Quieres dejar de seguir?" itsOn: "¡Está encendido!" itsOff: "¡Está apagado!" emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro de la cuenta" @@ -845,6 +857,8 @@ failedToFetchAccountInformation: "No se pudo obtener información de la cuenta" rateLimitExceeded: "Se excedió el límite de peticiones" cropImage: "Recortar imágen" cropImageAsk: "¿Desea recortar la imagen?" +cropYes: "Recortar" +cropNo: "Usar como está" file: "Archivos" recentNHours: "Últimas {n} horas" recentNDays: "Últimos {n} días" @@ -925,6 +939,18 @@ selectFromPresets: "Escoger desde predefinidos" achievements: "Logros" gotInvalidResponseError: "Respuesta del servidor inválida" gotInvalidResponseErrorDescription: "Puede que el servidor esté caído o en mantenimiento. Favor de intentar más tarde" +thisPostMayBeAnnoying: "Ésta publicación puede resultar molesta." +thisPostMayBeAnnoyingHome: "Publicar en línea de tiempo 'Inicio'" +thisPostMayBeAnnoyingCancel: "detener" +thisPostMayBeAnnoyingIgnore: "Publicar de todos modos" +collapseRenotes: "Colapsar renotas que ya hayas visto" +internalServerError: "Error interno del servidor" +internalServerErrorDescription: "El servidor tuvo un error inesperado." +copyErrorInfo: "Copiar detalles del error" +joinThisServer: "Registrarse en esta instancia" +exploreOtherServers: "Buscar otra instancia" +letsLookAtTimeline: "Mirar la línea de tiempo local" +disableFederationWarn: "Esto desactivará la federación, pero las publicaciones segurán siendo públicas al menos que se configure diferente. Usualmente no necesitas usar esta configuración." _achievements: earnedAt: "Desbloqueado el" _types: @@ -1438,6 +1464,7 @@ _ago: weeksAgo: "Hace {n} semanas" monthsAgo: "Hace {n} meses" yearsAgo: "Hace {n} años" + invalid: "No hay nada que ver aqui" _time: second: "Segundos" minute: "Minutos" @@ -1471,13 +1498,28 @@ _tutorial: step8_3: "La configuración de las notificaciones puede modificarse posteriormente." _2fa: alreadyRegistered: "Ya has completado la configuración." + registerTOTP: "Registrar aplicación autenticadora" + passwordToTOTP: "Ingresa tu contraseña" step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o {b} u otra." step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla." + step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app.\nTocar este código QR te permitirá registrar la autenticación 2FA a tu llave de seguridad o aplicación autenticadora." step2Url: "En una aplicación de escritorio se puede ingresar la siguiente URL:" + step3Title: "Ingresa un código de autenticación" step3: "Para terminar, ingrese el token mostrado en la aplicación." step4: "Ahora cuando inicie sesión, ingrese el mismo token" + securityKeyNotSupported: "Tu navegador no soporta claves de autenticación." + registerTOTPBeforeKey: "Please set up an authenticator app to register a security or pass key.\npor favor. configura una aplicación de autenticación para registrar una llave de seguridad." securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad de hardware que soporte FIDO2 o con un certificado de huella digital o con un PIN" + chromePasskeyNotSupported: "Las llaves de seguridad de Chrome no son soportadas por el momento." + registerSecurityKey: "Registrar una llave de seguridad" + securityKeyName: "Ingresa un nombre para la clave" + tapSecurityKey: "Por favor, sigue tu navegador para registrar una llave de seguridad" + removeKey: "Quitar la llave de seguridad" removeKeyConfirm: "¿Borrar el respaldo \"{name}\"?" + whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security key is registered.\nLa aplicación autenticadora no puede ser eliminada mientras la llave de seguridad se encuentre registrada." + renewTOTP: "Reconfigurar la aplicación autenticadora" + renewTOTPConfirm: "This will cause verification codes from your previous app to stop working\nEsto hará que los códigos de verificación de la aplicación anterior dejen de funcionar" + renewTOTPOk: "Reconfigurar" renewTOTPCancel: "No gracias" _permissions: "read:account": "Ver información de la cuenta" @@ -1601,6 +1643,8 @@ _visibility: followersDescription: "Visible sólo para tus seguidores" specified: "Mensaje directo" specifiedDescription: "Visible sólo para los usuarios elegidos" + disableFederation: "No federado" + disableFederationDescription: "No enviar a otras instancias" _postForm: replyPlaceholder: "Responder a esta nota" quotePlaceholder: "Citar esta nota" @@ -1756,6 +1800,7 @@ _notification: pollEnded: "La encuesta terminó" receiveFollowRequest: "Recibió una solicitud de seguimiento" followRequestAccepted: "El seguimiento fue aceptado" + achievementEarned: "Logro desbloqueado" app: "Notificaciones desde aplicaciones" _actions: followBack: "Te sigue de vuelta" @@ -1788,3 +1833,6 @@ _deck: channel: "Canal" mentions: "Menciones" direct: "Mensaje directo" +_dialog: + charactersExceeded: "¡Has excedido el límite de caracteres! Actualmente {current} de {max}." + charactersBelow: "¡Estás por debajo del límite de caracteres! Actualmente {current} de {min}." diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index de6156e39d..1b40f99b4c 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -1121,6 +1121,7 @@ _ago: weeksAgo: "Il y a {n} semaines" monthsAgo: "Il y a {n} mois" yearsAgo: "Il y a {n} ans" + invalid: "Il n'y a rien à voir ici" _time: second: "s" minute: "min" diff --git a/locales/id-ID.yml b/locales/id-ID.yml index d3d1a16219..18941c5c3b 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -1452,6 +1452,7 @@ _ago: weeksAgo: "{n} minggu lalu" monthsAgo: "{n} bulan lalu" yearsAgo: "{n} tahun lalu" + invalid: "Tidak ada sama sekali disini" _time: second: "detik" minute: "menit" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 0ce65eea85..7b2addc6b9 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1452,6 +1452,7 @@ _ago: weeksAgo: "{n} sett. fa" monthsAgo: "{n} mesi fa" yearsAgo: "{n} anni fa" + invalid: "Niente da visualizzare" _time: second: "s" minute: "min" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 68664067c2..73f007e2ba 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -393,13 +393,19 @@ about: "情報" aboutMisskey: "Misskeyってなんや?" administrator: "管理者" token: "トークン" +2fa: "二要素認証" +totp: "認証アプリ" +totpDescription: "認証アプリ使てワンタイムパスワードを入れる" moderator: "モデレーター" moderation: "モデレーション" nUsersMentioned: "{n}人が投稿" +securityKeyAndPasskey: "セキュリティキー・パスキー" securityKey: "セキュリティキー" lastUsed: "最後につこうた日" +lastUsedAt: "最後に使たん: {t}" unregister: "登録やめる" passwordLessLogin: "パスワード無くてもログインできるようにする" +passwordLessLoginDescription: "パスワードやなくて、セキュリティキーとかパスキーだけでログインするわ" resetPassword: "パスワードをリセット" newPasswordIs: "今度のパスワードは「{password}」や" reduceUiAnimation: "UIの動きやアニメーションを減らす" @@ -575,7 +581,7 @@ generateAccessToken: "アクセストークンの発行" permission: "権限" enableAll: "全部使えるようにする" disableAll: "全部使えへんようにする" -tokenRequested: "アカウントへのアクセス許可" +tokenRequested: "アカウントへのアクセス許してやったらどうや" pluginTokenRequestedDescription: "このプラグインはここで設定した権限を使えるようになるで。" notificationType: "通知の種類" edit: "編集" @@ -773,6 +779,7 @@ popularPosts: "人気の投稿" shareWithNote: "ノートで共有" ads: "広告" expiration: "期限" +startingperiod: "始めた期間" memo: "メモ" priority: "優先度" high: "高い" @@ -805,6 +812,7 @@ lastCommunication: "直近の通信" resolved: "解決したで" unresolved: "まだ解決してないで" breakFollow: "フォロワーを解除するで" +breakFollowConfirm: "フォロワー解除してもええか?" itsOn: "オンになっとるよ" itsOff: "オフになってるで" emailRequiredForSignup: "アカウント登録にメールアドレスを必須にするで" @@ -939,6 +947,10 @@ collapseRenotes: "見たことあるRenoteは省略やで" internalServerError: "サーバー内部エラー" internalServerErrorDescription: "サーバー内部でよう分からんエラーやわ" copyErrorInfo: "エラー情報をコピー" +joinThisServer: "このサーバーに登録するわ" +exploreOtherServers: "他のサーバー見てみる" +letsLookAtTimeline: "タイムライン見てみーや" +disableFederationWarn: "連合が無効になっとるで。無効にしても投稿は非公開ってわけちゃうねん。大体の場合はこのオプションを有効にする必要は別にないで。" _achievements: earnedAt: "貰った日ぃ" _types: @@ -1051,21 +1063,42 @@ _achievements: _myNoteFavorited1: title: "星ぃ欲しい" description: "ワレのノートが他のひとにお気に入り登録されたで" + _profileFilled: + title: "準備万端や" + description: "プロフィールを設定した" + _markedAsCat: + title: "吾輩は猫やねん" + description: "アカウントがCatになってもうた" + flavor: "名前はまだないねん。" + _following1: + title: "はじめてのフォロー" + description: "初めてフォローした" _following10: + title: "ついてく、ついてく" description: "フォローが10人超えた" _following50: + title: "友達ぎょうさん" description: "フォローが50人超えた" _following100: + title: "友達100人" description: "フォローが100人超えた" _following300: + title: "いや友達多すぎやろ" description: "フォローが300人超えた" + _followers1: + title: "はじめてのフォロワー" + description: "初めてフォローされた" _followers10: + title: "フォローみぃ!" description: "フォロワーが10人超えた" _followers50: + title: "ぞろぞろ" description: "フォロワーが50人超えた" _followers100: + title: "人気もん" description: "フォロワーが100人超えた" _followers300: + title: "ほらそこ一列に並んで!" description: "フォロワーが300人超えた" _followers500: title: "基地局" @@ -1150,6 +1183,10 @@ _achievements: title: "クッキー叩くやつ" description: "クッキー叩いてもうた" flavor: "兄ちゃんソフト間違っとんで" + _brainDiver: + title: "Brain Diver" + description: "Brain Diverへのリンクを投稿したった" + flavor: "Misskey-Misskey La-Tu-Ma" _role: new: "ロールの作成" edit: "ロールの編集" @@ -1170,6 +1207,8 @@ _role: baseRole: "ベースロール" useBaseValue: "ベースロールの値を使用" chooseRoleToAssign: "アサインするロールを選択" + iconUrl: "アイコン画像のURL" + asBadge: "バッジとして見せる" descriptionOfAsBadge: "オンにすると、ユーザー名の横んとこにロールのアイコンが表示されるで。" canEditMembersByModerator: "モデレーターのメンバー編集を許可" descriptionOfCanEditMembersByModerator: "オンにすると、管理者に加えてモデレーターもこのロールへユーザーをアサイン/アサイン解除できるようになるで。オフにすると管理者のみが行えるで。" @@ -1425,6 +1464,7 @@ _ago: weeksAgo: "{n}週間前" monthsAgo: "{n}ヶ月前" yearsAgo: "{n}年前" + invalid: "あらへん" _time: second: "秒" minute: "分" @@ -1458,13 +1498,28 @@ _tutorial: step8_3: "通知の設定はあとから変更できるで" _2fa: alreadyRegistered: "もう設定終わっとるわ。" + registerTOTP: "認証アプリの設定はじめる" + passwordToTOTP: "パスワードを入れてーや" step1: "ほんなら、{a}や{b}とかの認証アプリを使っとるデバイスにインストールしてな。" step2: "次に、ここにあるQRコードをアプリでスキャンしてな~。" + step2Click: "QRコードをクリックすると、今使とる端末に入っとる認証アプリとかキーリングに登録できるで。" step2Url: "デスクトップアプリやったら次のURLを入力してや:" + step3Title: "確認コードを入れてーや" step3: "アプリに表示されているトークンを入力して終わりや。" step4: "これからログインするときも、同じようにトークンを入力するんやで" + securityKeyNotSupported: "今使とるブラウザはセキュリティキーに対応してへんのやってさ。" + registerTOTPBeforeKey: "セキュリティキー・パスキーを登録するんやったら、まず認証アプリを設定してーな。" securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキーか端末の指紋認証やPINを使ってログインするように設定できるで。" + chromePasskeyNotSupported: "Chromeのパスキーは今んとこ対応してないねん。" + registerSecurityKey: "セキュリティキー・パスキーを登録するわ" + securityKeyName: "キーの名前を入れてーや" + tapSecurityKey: "ブラウザが言うこと聞いて、セキュリティキーとかパスキー登録しといでや" + removeKey: "セキュリティキーをほかす" removeKeyConfirm: "{name}を消すん?" + whyTOTPOnlyRenew: "セキュリティキーが登録されとったら、認証アプリの設定は解除できへんで。" + renewTOTP: "認証アプリをもっかい設定" + renewTOTPConfirm: "今までの人称アプリの確認コードは使えんくなるけどええか?" + renewTOTPOk: "もっかい設定する" renewTOTPCancel: "やめとく" _permissions: "read:account": "アカウントの情報を見るで" @@ -1500,6 +1555,7 @@ _permissions: "read:gallery-likes": "ギャラリーのいいねを見るで" "write:gallery-likes": "ギャラリーのいいねを操作するで" _auth: + shareAccessTitle: "アプリへのアクセス許してやったらどうや" shareAccess: "「{name}」がアカウントにアクセスすることを許可してええか?" shareAccessAsk: "アカウントのアクセスを許可してもええか?" permission: "{name}に次の権限つけたってやって" @@ -1587,14 +1643,16 @@ _visibility: followersDescription: "自分のフォロワーのみに公開するで" specified: "ダイレクト" specifiedDescription: "選んだユーザーのみに公開するで" + disableFederation: "連合なし" + disableFederationDescription: "他インスタンスへは送らんとくわ" _postForm: replyPlaceholder: "このノートに返信..." quotePlaceholder: "このノートを引用..." channelPlaceholder: "チャンネルに投稿..." _placeholders: - a: "いまどうしとるん?" + a: "いまどないしとるん?" b: "何かあったん?" - c: "何を考えとるん?" + c: "何か考えとるん?" d: "何か言いたいことあるん?" e: "ここに書いてーなー" f: "あんたが書くの待っとるで" @@ -1742,6 +1800,7 @@ _notification: pollEnded: "アンケートが終了したで" receiveFollowRequest: "フォロー許可してほしいみたいやで" followRequestAccepted: "フォローが受理されたで" + achievementEarned: "実績の獲得" app: "連携アプリからの通知や" _actions: followBack: "フォローバック" @@ -1774,3 +1833,6 @@ _deck: channel: "チャンネル" mentions: "あんた宛て" direct: "ダイレクト" +_dialog: + charactersExceeded: "最大の文字数を上回っとるで!今は {current} / 最大でも {max}" + charactersBelow: "最小の文字数を下回っとるで!今は {current} / 最低でも {min}" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 1c5cf8517c..3e39980db1 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1452,6 +1452,7 @@ _ago: weeksAgo: "{n}주 전" monthsAgo: "{n}개월 전" yearsAgo: "{n}년 전" + invalid: "아무것도 없습니다" _time: second: "초" minute: "분" diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index 3003e93254..1c19c4f3e8 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -1061,6 +1061,7 @@ _ago: weeksAgo: "{n} tyg. temu" monthsAgo: "{n} mies. temu" yearsAgo: "{n} lat temu" + invalid: "Nie ma tu niczego" _time: second: "sekunda" minute: "minuta" diff --git a/locales/ro-RO.yml b/locales/ro-RO.yml index c3438172ca..10cb085f3f 100644 --- a/locales/ro-RO.yml +++ b/locales/ro-RO.yml @@ -648,6 +648,8 @@ _sfx: note: "Note" notification: "Notificări" chat: "Chat" +_ago: + invalid: "Nu e nimic de văzut aici" _widgets: profile: "Profil" instanceInfo: "Informații despre instanță" diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 70839694b4..86a60ee791 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -1452,6 +1452,7 @@ _ago: weeksAgo: "{n} нед. назад" monthsAgo: "{n} мес. назад" yearsAgo: "{n} г. назад" + invalid: "Ничего нет" _time: second: "с" minute: "мин" diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml index f55fdf9795..525eb9ca0e 100644 --- a/locales/sk-SK.yml +++ b/locales/sk-SK.yml @@ -1123,6 +1123,7 @@ _ago: weeksAgo: "pred {n} týždňami" monthsAgo: "pred {n} mesiacmi" yearsAgo: "pred {n} rokmi" + invalid: "Nič tu nie je" _time: second: "s" minute: "min" diff --git a/locales/th-TH.yml b/locales/th-TH.yml index 2c721e45e1..a56d7451b2 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -393,13 +393,19 @@ about: "เกี่ยวกับ" aboutMisskey: "เกี่ยวกับ Misskey" administrator: "ผู้ดูแลระบบ" token: "โทเค็น" +2fa: "การยืนยันตัวตนแบบสองชั้น" +totp: "แอป Authenticator" +totpDescription: "ใช้แอปยืนยันตัวตนเพื่อป้อนรหัสผ่านแบบใช้ครั้งเดียว" moderator: "ผู้ควบคุม" moderation: "การกลั่นกรอง" nUsersMentioned: "กล่าวถึงโดยผู้ใช้ {n} รายนี้" +securityKeyAndPasskey: "ความปลอดภัยและรหัสผ่าน" securityKey: "กุญแจความปลอดภัย" lastUsed: "ใช้ล่าสุด" +lastUsedAt: "ใช้งานครั้งล่าสุด: {t}" unregister: "เลิกติดตาม" passwordLessLogin: "เข้าสู่ระบบแบบไม่ใช้รหัสผ่าน" +passwordLessLoginDescription: "อนุญาตให้เข้าสู่ระบบโดยไม่ต้องใช้รหัสผ่านโดยใช้รหัสรักษาความปลอดภัยหรือรหัสผ่านเท่านั้น" resetPassword: "รีเซ็ตรหัสผ่าน" newPasswordIs: "รหัสผ่านใหม่คือ \"{password}\"" reduceUiAnimation: "ลดภาพเคลื่อนไหว UI" @@ -773,6 +779,7 @@ popularPosts: "โพสต์ติดอันดับ" shareWithNote: "แบ่งปันด้วยโน้ต" ads: "โฆษณา" expiration: "กำหนดเวลา" +startingperiod: "เริ่ม" memo: "ข้อควรจำ" priority: "ลำดับความสำคัญ" high: "สูง" @@ -805,6 +812,7 @@ lastCommunication: "การสื่อสารครั้งสุดท้ resolved: "คลี่คลายแล้ว" unresolved: "รอการเฉลย" breakFollow: "ลบผู้ติดตาม" +breakFollowConfirm: "ลบผู้ติดตามนี้ออกจริงหรอ?" itsOn: "เปิดใช้งาน" itsOff: "ปิดใช้งาน" emailRequiredForSignup: "จำเป็นต้องการใช้ที่อยู่อีเมลสำหรับการสมัคร" @@ -939,6 +947,10 @@ collapseRenotes: "ยุบ renotes ที่คุณได้เห็นแ internalServerError: "เซิร์ฟเวอร์ภายในเกิดข้อผิดพลาด" internalServerErrorDescription: "เซิร์ฟเวอร์รันค้นพบข้อผิดพลาดที่ไม่คาดคิด" copyErrorInfo: "คัดลอกรายละเอียดข้อผิดพลาด" +joinThisServer: "ลงชื่อสมัครใช้ในอินสแตนซ์นี้" +exploreOtherServers: "มองหาอินสแตนซ์อื่น" +letsLookAtTimeline: "ลองดูที่ไทม์ไลน์" +disableFederationWarn: "การดำเนินการนี้ถ้าหากจะปิดใช้งานการรวมศูนย์ แต่โพสต์ดังกล่าวนั้นจะยังคงเป็นสาธารณะต่อไป ยกเว้นแต่ว่าจะตั้งค่าเป็นอย่างอื่น โดยปกติคุณไม่จำเป็นต้องใช้การตั้งค่านี้นะ" _achievements: earnedAt: "ได้รับเมื่อ" _types: @@ -1452,6 +1464,7 @@ _ago: weeksAgo: "{n} สัปดาห์ที่แล้ว" monthsAgo: "{n} เดือนที่แล้ว" yearsAgo: "{n} ปีที่ผ่านมา" + invalid: "ไม่พบผลลัพธ์" _time: second: "วินาที" minute: "นาที" @@ -1485,13 +1498,28 @@ _tutorial: step8_3: "คุณสามารถเปลี่ยนการตั้งค่านี้ในภายหลังได้ตลอดเวลานะ" _2fa: alreadyRegistered: "คุณได้ลงทะเบียนอุปกรณ์ยืนยันตัวตนแบบ 2 ชั้นแล้ว" + registerTOTP: "ลงทะเบียนแอพตัวตรวจสอบสิทธิ์" + passwordToTOTP: "กรอกรหัสผ่าน" step1: "ขั้นตอนแรก ติดตั้งแอปยืนยันตัวตน (เช่น {a} หรือ {b}) บนอุปกรณ์ของคุณ" step2: "จากนั้นสแกนรหัส QR ที่แสดงบนหน้าจอนี้" + step2Click: "การคลิกที่รหัส QR นี้จะช่วยให้คุณนั้นสามารถลงทะเบียน 2FA กับคีย์ความปลอดภัยหรือแอปตรวจสอบความถูกต้องของโทรศัพท์ได้" step2Url: "คุณยังสามารถป้อนบน URL นี้หากคุณใช้โปรแกรมเดสก์ท็อป:" + step3Title: "ป้อนรหัสยืนยัน" step3: "ป้อนโทเค็นที่แอปของคุณให้มาเพื่อเสร็จสิ้นการตั้งค่า" step4: "นับจากนี้เป็นต้นไปการพยายามเข้าสู่ระบบในอนาคตนั้น อาจจะต้องขอโทเค็นในการเข้าสู่ระบบดังกล่าว" + securityKeyNotSupported: "เบราว์เซอร์ของคุณไม่รองรับคีย์ความปลอดภัยนะ" + registerTOTPBeforeKey: "กรุณาตั้งค่าแอปยืนยันตัวตนเพื่อลงทะเบียนรหัสความปลอดภัยหรือรหัสผ่าน" securityKeyInfo: "นอกจากนี้การตรวจสอบความถูกต้องด้วยลายนิ้วมือหรือ PIN แล้ว คุณยังสามารถตั้งค่าการตรวจสอบสิทธิ์ผ่านคีย์ความปลอดภัยของฮาร์ดแวร์ที่รองรับ FIDO2 เพื่อเพิ่มความปลอดภัยให้กับบัญชีของคุณ" + chromePasskeyNotSupported: "ขณะนี้ยังไม่รองรับรหัสผ่านของ Chrome" + registerSecurityKey: "ลงทะเบียนรหัสความปลอดภัยหรือรหัสผ่าน" + securityKeyName: "ป้อนชื่อคีย์" + tapSecurityKey: "กรุณาทำตามเบราว์เซอร์ของคุณเพื่อลงทะเบียนรหัสความปลอดภัยหรือรหัสผ่าน" + removeKey: "ลบคีย์ความปลอดภัยออก" removeKeyConfirm: "ลบข้อมูลสำรอง {name} มั้ย?" + whyTOTPOnlyRenew: "ไม่สามารถลบแอปตัวรับรองความถูกต้องได้ตราบใดที่มีการลงทะเบียนคีย์ความปลอดภัยไว้แล้ว" + renewTOTP: "กำหนดค่าแอพตัวตรวจสอบสิทธิ์ใหม่" + renewTOTPConfirm: "วิธีการแบบนี้จะทําให้รหัสยืนยันจากแอพก่อนหน้าของคุณหยุดทํางานเลยนะ" + renewTOTPOk: "ตั้งค่าคอนฟิกใหม่" renewTOTPCancel: "ไม่เป็นไร" _permissions: "read:account": "ดูข้อมูลบัญชีของคุณ" @@ -1615,6 +1643,8 @@ _visibility: followersDescription: "ทำให้ผู้ติดตามนั้นมองเห็นแค่คุณเท่านั้น" specified: "ไดเร็ค" specifiedDescription: "ทำให้มองเห็นได้เฉพาะผู้ใช้ที่ระบุเท่านั้น" + disableFederation: "ไม่มีสหภาพ" + disableFederationDescription: "อย่าส่งไปยังอินสแตนซ์อื่น" _postForm: replyPlaceholder: "ตอบกลับโน้ตนี้..." quotePlaceholder: "อ้างโน้ตนี้..." @@ -1770,6 +1800,7 @@ _notification: pollEnded: "โพลนี้สิ้นสุดลงแล้ว" receiveFollowRequest: "ได้รับคำขอติดตาม\n" followRequestAccepted: "ยอมรับคำขอติดตาม" + achievementEarned: "ปลดล็อกความสำเร็จแล้ว" app: "การแจ้งเตือนจากแอปที่มีลิงก์" _actions: followBack: "ติดตามกลับด้วย" @@ -1802,3 +1833,6 @@ _deck: channel: "แชนแนล" mentions: "พูดถึง" direct: "ไดเร็ค" +_dialog: + charactersExceeded: "คุณกำลังมีตัวอักขระเกินขีดจำกัดสูงสุดแล้วนะ! ปัจจุบันอยู่ที่ {current} จาก {max}" + charactersBelow: "คุณกำลังใช้อักขระต่ำกว่าขีดจำกัดขั้นต่ำเลยนะ! ปัจจุบันอยู่ที่ {current} จาก {min}" diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 79ec11f421..c47ad45397 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -49,6 +49,7 @@ deleteAndEdit: "Видалити й редагувати" deleteAndEditConfirm: "Ви впевнені, що хочете видалити цю нотатку та відредагувати її? Ви втратите всі реакції, поширення та відповіді на неї." addToList: "Додати до списку" sendMessage: "Надіслати повідомлення" +copyRSS: "Скопіювати RSS" copyUsername: "Скопіювати ім’я користувача" searchUser: "Пошук користувачів" reply: "Відповісти" @@ -128,6 +129,7 @@ unblockConfirm: "Ви впевнені, що хочете розблокуват suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?" unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?" selectList: "Виберіть список" +selectChannel: "Виберіть канал" selectAntenna: "Виберіть антену" selectWidget: "Виберіть віджет" editWidgets: "Редагувати віджети" @@ -255,6 +257,7 @@ noMoreHistory: "Подальшої історії немає" startMessaging: "Розпочати діалог" nUsersRead: "Прочитали {n}" agreeTo: "Я погоджуюсь з {0}" +agreeBelow: "Я погоджуюся з наведеним нижче" tos: "Умови використання" start: "Розпочати" home: "Домівка" @@ -387,6 +390,8 @@ about: "Інформація" aboutMisskey: "Про Misskey" administrator: "Адмін" token: "Токен" +2fa: "Двофакторна аутентифікація" +totp: "Програма аутентифікації" moderator: "Модератор" moderation: "Модерація" nUsersMentioned: "Згадали: {n}" @@ -445,6 +450,8 @@ aboutX: "Про {x}" disableDrawer: "Не використовувати висувні меню" noHistory: "Історія порожня" signinHistory: "Історія входів" +enableAdvancedMfm: "Увімкнути розширений MFM" +enableAnimatedMfm: "Увімкнути анімований MFM" doing: "Виконується" category: "Категорія" tags: "Теги" @@ -697,6 +704,7 @@ accentColor: "Акцент" textColor: "Текст" saveAs: "Зберегти як…" advanced: "Розширені" +advancedSettings: "Розширені налаштування" value: "Значення" createdAt: "Створено" updatedAt: "Останнє оновлення" @@ -761,6 +769,7 @@ popularPosts: "Популярні дописи" shareWithNote: "Поділитися нотаткою" ads: "Реклама" expiration: "Опитування закінчується" +startingperiod: "Початковий період" memo: "Примітка" priority: "Пріоритет" high: "Високий" @@ -879,8 +888,17 @@ like: "Вподобати" unlike: "Не вподобати" numberOfLikes: "Вподобання" show: "Відображення" +roles: "Ролі" +role: "Роль" +normalUser: "Звичайний користувач" +undefined: "Не визначено" +assign: "Призначити" +unassign: "Скасувати призначення" color: "Колір" achievements: "Досягнення" +joinThisServer: "Зареєструватися на цьому сервері" +exploreOtherServers: "Знайти інший сервер" +letsLookAtTimeline: "Перегляд історії" _achievements: earnedAt: "Відкрито" _types: @@ -1102,6 +1120,13 @@ _achievements: description: "Відправити посилання на \"Brain Diver\"" flavor: "Misskey-Misskey La-Tu-Ma" _role: + new: "Нова роль" + edit: "Змінити роль" + name: "Назва ролі" + description: "Опис ролі" + permission: "Права ролі" + assignTarget: "Призначити" + manual: "Вручну" priority: "Пріоритет" _priority: low: "Низький" @@ -1299,6 +1324,7 @@ _ago: weeksAgo: "{n} тиж. тому" monthsAgo: "{n} міс. тому" yearsAgo: "{n} р. тому" + invalid: "Тут нічого немає" _time: second: "с" minute: "х" diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml index 44aed8bc37..174b1ddf1b 100644 --- a/locales/vi-VN.yml +++ b/locales/vi-VN.yml @@ -1102,6 +1102,7 @@ _ago: weeksAgo: "{n} tuần trước" monthsAgo: "{n} tháng trước" yearsAgo: "{n} năm trước" + invalid: "Không có gì ở đây" _time: second: "s" minute: "phút" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 7ba8956394..acc69e72e5 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -393,13 +393,19 @@ about: "关于" aboutMisskey: "关于 Misskey" administrator: "管理员" token: "Token (令牌)" +2fa: "双因素认证" +totp: "身份验证应用" +totpDescription: "使用认证应用输入一次性密码。" moderator: "监察员" moderation: "管理" nUsersMentioned: "{n} 被提到" +securityKeyAndPasskey: "安全密钥/密码" securityKey: "安全密钥" lastUsed: "最后使用:" +lastUsedAt: "最后使用: {t}" unregister: "删除账户" passwordLessLogin: "无密码登录" +passwordLessLoginDescription: "不使用密码,仅使用安全密钥或Passkey登录" resetPassword: "重置密码" newPasswordIs: "新的密码是「{password}」" reduceUiAnimation: "减少UI动画" @@ -773,6 +779,7 @@ popularPosts: "热门投稿" shareWithNote: "在帖子中分享" ads: "广告" expiration: "截止时间" +startingperiod: "开始时间" memo: "便笺" priority: "优先级" high: "高" @@ -805,6 +812,7 @@ lastCommunication: "最近通信" resolved: "已解决" unresolved: "未解决" breakFollow: "移除关注者" +breakFollowConfirm: "你想取消关注吗?" itsOn: "已开启" itsOff: "已关闭" emailRequiredForSignup: "注册账户需要电子邮件地址" @@ -849,7 +857,7 @@ failedToFetchAccountInformation: "获取账户信息失败" rateLimitExceeded: "已超過速率限制" cropImage: "剪裁图像" cropImageAsk: "是否要裁剪图像?" -cropYes: "已裁剪" +cropYes: "去裁剪" cropNo: "就这样吧!" file: "文件" recentNHours: "最近{n}小时" @@ -939,6 +947,10 @@ collapseRenotes: "省略显示已经看过的转发内容" internalServerError: "内部服务器错误" internalServerErrorDescription: "内部服务器发生了预期外的错误" copyErrorInfo: "复制错误信息" +joinThisServer: "在本实例上注册" +exploreOtherServers: "探索其他实例" +letsLookAtTimeline: "时间线" +disableFederationWarn: "联合被禁用。 禁用它并不能使帖子变成私人的。 在大多数情况下,这个选项不需要被启用。" _achievements: earnedAt: "达成时间" _types: @@ -1452,6 +1464,7 @@ _ago: weeksAgo: "{n}周前" monthsAgo: "{n}月前" yearsAgo: "{n}年前" + invalid: "没有" _time: second: "秒" minute: "分" @@ -1485,13 +1498,28 @@ _tutorial: step8_3: "您也可以稍后再更改通知设置。" _2fa: alreadyRegistered: "此设备已被注册" + registerTOTP: "开始设置认证应用" + passwordToTOTP: "请输入您的密码" step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。" step2: "然后,扫描屏幕上显示的二维码。" + step2Click: "通过点击QR码,您可以使用设备上安装的身份验证器应用程序或密钥环进行注册" step2Url: "在桌面应用程序中输入以下URL:" + step3Title: "输入验证码" step3: "输入您的应用提供的动态口令以完成设置。" step4: "从现在开始,任何登录操作都将要求您提供动态口令。" + securityKeyNotSupported: "您的浏览器不支持安全密钥。" + registerTOTPBeforeKey: "要注册安全密钥或Passkey,请先设置验证器应用程序。" securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" + chromePasskeyNotSupported: "目前不支持 Chrome 的Passkey。" + registerSecurityKey: "注册安全密钥或Passkey" + securityKeyName: "输入密钥名称" + tapSecurityKey: "请按照浏览器说明操作来注册安全密钥或Passkey。" + removeKey: "删除安全密钥" removeKeyConfirm: "您确定要删除 {name} 吗?" + whyTOTPOnlyRenew: "如果注册了安全密钥,则无法取消验证器应用程序上的设置。" + renewTOTP: "重置验证器应用程序" + renewTOTPConfirm: "当前验证器应用程序的验证码将不再有效" + renewTOTPOk: "重新配置" renewTOTPCancel: "不用,谢谢" _permissions: "read:account": "查看账户信息" @@ -1615,6 +1643,8 @@ _visibility: followersDescription: "仅发送至关注者" specified: "指定用户" specifiedDescription: "仅发送至指定用户" + disableFederation: "不参与联合" + disableFederationDescription: "不发送到其他实例" _postForm: replyPlaceholder: "回复这个帖子..." quotePlaceholder: "引用这个帖子..." @@ -1770,6 +1800,7 @@ _notification: pollEnded: "问卷调查结束" receiveFollowRequest: "收到关注请求" followRequestAccepted: "关注请求已通过" + achievementEarned: "取得的成就" app: "关联应用的通知" _actions: followBack: "回关" @@ -1802,3 +1833,6 @@ _deck: channel: "频道" mentions: "提及" direct: "指定用户" +_dialog: + charactersExceeded: "已经超过了最大字符数! 当前字符数 {current} / 限制字符数 {max}" + charactersBelow: "低于最小字符数!当前字符数 {current} / 限制字符数 {min}" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 1dd2ae4cec..623e36d6ef 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -46,7 +46,7 @@ copyContent: "複製內容" copyLink: "複製連結" delete: "刪除" deleteAndEdit: "刪除並編輯" -deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。" +deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有反應、轉發和回覆也將會消失。" addToList: "加入至清單" sendMessage: "發送訊息" copyRSS: "複製RSS" @@ -112,7 +112,7 @@ clickToShow: "按一下以顯示" sensitive: "敏感內容" add: "新增" reaction: "反應" -reactions: "情感" +reactions: "反應" reactionSetting: "在選擇器中顯示反應" reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。" rememberNoteVisibility: "記住貼文可見性" @@ -213,7 +213,7 @@ default: "預設" defaultValueIs: "預設值:{value}" noCustomEmojis: "沒有自訂的表情符號" noJobs: "沒有任務" -federating: "整合搜索中" +federating: "聯邦運作中" blocked: "已封鎖" suspended: "已凍結" all: "全部" @@ -393,13 +393,19 @@ about: "關於" aboutMisskey: "關於 Misskey" administrator: "管理員" token: "權杖" +2fa: "雙因素驗證" +totp: "驗證應用程式" +totpDescription: "以驗證應用程式輸入一次性密碼" moderator: "審查員" moderation: "審查" nUsersMentioned: "提到了{n}" +securityKeyAndPasskey: "安全金鑰・Passkey" securityKey: "安全金鑰" lastUsed: "上次使用" +lastUsedAt: "最後使用:{t}" unregister: "註銷帳號" passwordLessLogin: "設置無密碼登入" +passwordLessLoginDescription: "不使用密碼,以安全金鑰或 Passkey 登入" resetPassword: "重置密碼" newPasswordIs: "新密碼為「{password}」" reduceUiAnimation: "減少介面的動態視覺" @@ -773,6 +779,7 @@ popularPosts: "熱門的貼文" shareWithNote: "在貼文中分享" ads: "廣告" expiration: "期限" +startingperiod: "開始期間" memo: "備忘錄" priority: "優先級" high: "高" @@ -805,6 +812,7 @@ lastCommunication: "最近的通信" resolved: "已解決" unresolved: "未解決" breakFollow: "移除追蹤者" +breakFollowConfirm: "確定要取消被追隨嗎?" itsOn: "已開啟" itsOff: "已關閉" emailRequiredForSignup: "註冊帳戶需要電子郵件地址" @@ -939,6 +947,10 @@ collapseRenotes: "省略顯示已看過的轉發貼文" internalServerError: "內部伺服器錯誤" internalServerErrorDescription: "內部伺服器發生了非預期的錯誤。" copyErrorInfo: "複製錯誤資訊" +joinThisServer: "在此伺服器上註冊" +exploreOtherServers: "探索其他伺服器" +letsLookAtTimeline: "看看時間軸" +disableFederationWarn: "聯邦被停用了。即使停用也不會讓您的貼文不公開,在大多數情況下,不需要啟用這個選項。" _achievements: earnedAt: "獲得日期" _types: @@ -1083,7 +1095,7 @@ _achievements: title: "成群結隊" description: "跟隨者超過50人了" _followers100: - title: "紅人" + title: "熱門人物" description: "跟隨者超過100人了" _followers300: title: "請排成一排" @@ -1141,7 +1153,7 @@ _achievements: description: "試圖遞迴套入雲端硬碟資料夾" _reactWithoutRead: title: "有好好讀過嗎?" - description: "對包含100字以上內容的貼文做出情感反應" + description: "對包含100字以上內容的貼文在3秒以內做出反應" _clickedClickHere: title: "點擊這裡" description: "已點擊這裡了" @@ -1452,6 +1464,7 @@ _ago: weeksAgo: "{n}周前" monthsAgo: "{n}個月前" yearsAgo: "{n}年前" + invalid: "未發現" _time: second: "秒" minute: "分鐘" @@ -1485,13 +1498,28 @@ _tutorial: step8_3: "通知的設定可以在之後變更。" _2fa: alreadyRegistered: "此設備已經被註冊過了" + registerTOTP: "開始設定驗證應用程式" + passwordToTOTP: "請輸入密碼" step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。" step2: "然後,掃描螢幕上的QR code。" + step2Click: "點擊QR code,可以使用設備上安裝的驗證應用程式或金鑰環進行註冊。" step2Url: "在桌面版應用中,請輸入以下的URL:" + step3Title: "輸入驗證碼" step3: "輸入您的App提供的權杖以完成設定。" step4: "從現在開始,任何登入操作都將要求您提供權杖。" + securityKeyNotSupported: "您的瀏覽器不支援安全金鑰。" + registerTOTPBeforeKey: "要註冊安全金鑰・Passkey,請先設定驗證應用程式。" securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。" + chromePasskeyNotSupported: "目前不支援Chrome的Passkey。" + registerSecurityKey: "註冊安全金鑰・Passkey" + securityKeyName: "輸入金鑰名稱" + tapSecurityKey: "按照瀏覽器的說明操作,註冊安全金鑰和Passkey。" + removeKey: "刪除安全金鑰" removeKeyConfirm: "要刪除{name}嗎?" + whyTOTPOnlyRenew: "如果註冊了安全金鑰,則無法解除驗證應用程式的設定。" + renewTOTP: "重設驗證應用程式" + renewTOTPConfirm: "目前驗證應用程式的驗證碼將無法使用。" + renewTOTPOk: "重設" renewTOTPCancel: "現在不要" _permissions: "read:account": "查看我的帳戶資訊" @@ -1564,7 +1592,7 @@ _widgets: photos: "照片" digitalClock: "電子時鐘" unixClock: "UNIX時間" - federation: "聯邦宇宙" + federation: "站台聯邦" instanceCloud: "實例雲" postForm: "發佈窗口" slideshow: "幻燈片" @@ -1615,6 +1643,8 @@ _visibility: followersDescription: "僅發送至關注者" specified: "指定使用者" specifiedDescription: "僅發送至指定使用者" + disableFederation: "停用聯邦" + disableFederationDescription: "不要傳遞給其他實例" _postForm: replyPlaceholder: "回覆此貼文..." quotePlaceholder: "引用此貼文..." @@ -1770,6 +1800,7 @@ _notification: pollEnded: "問卷調查結束" receiveFollowRequest: "已收到追隨請求" followRequestAccepted: "追隨請求已接受" + achievementEarned: "獲得成就" app: "應用程式通知" _actions: followBack: "回關" @@ -1802,3 +1833,6 @@ _deck: channel: "頻道" mentions: "提及" direct: "指定使用者" +_dialog: + charactersExceeded: "已超過最大字數!現在 {current} / 限制 {max}" + charactersBelow: "低於最少字數!現在 {current} / 限制 {max}" From 60342ed3fa40e52015a76c597c29fb4146137a03 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 11:57:37 +0900 Subject: [PATCH 005/125] enhance(client): improve user menu ux --- .../frontend/src/scripts/get-user-menu.ts | 74 ++++++++----------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index 69d0ed085d..6c6baf8266 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -12,29 +12,6 @@ import { Router } from '@/nirax'; export function getUserMenu(user: misskey.entities.UserDetailed, router: Router = mainRouter) { const meId = $i ? $i.id : null; - async function pushList() { - const t = i18n.ts.selectList; // なぜか後で参照すると null になるので最初にメモリに確保しておく - const lists = await os.api('users/lists/list'); - if (lists.length === 0) { - os.alert({ - type: 'error', - text: i18n.ts.youHaveNoLists, - }); - return; - } - const { canceled, result: listId } = await os.select({ - title: t, - items: lists.map(list => ({ - value: list.id, text: list.name, - })), - }); - if (canceled) return; - os.apiWithDialog('users/lists/push', { - listId: listId, - userId: user.id, - }); - } - async function toggleMute() { if (user.isMuted) { os.apiWithDialog('mute/delete', { @@ -137,12 +114,43 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router os.post({ specified: user }); }, }, null, { + type: 'parent', icon: 'ti ti-list', text: i18n.ts.addToList, - action: pushList, + children: async () => { + const lists = await os.api('users/lists/list'); + + return lists.map(list => ({ + text: list.name, + action: () => { + os.apiWithDialog('users/lists/push', { + listId: list.id, + userId: user.id, + }); + }, + })); + }, }] as any; if ($i && meId !== user.id) { + if (iAmModerator) { + menu = menu.concat([{ + type: 'parent', + icon: 'ti ti-badges', + text: i18n.ts.roles, + children: async () => { + const roles = await os.api('admin/roles/list'); + + return roles.filter(r => r.target === 'manual').map(r => ({ + text: r.name, + action: () => { + os.apiWithDialog('admin/roles/assign', { roleId: r.id, userId: user.id }); + }, + })); + }, + }]); + } + menu = menu.concat([null, { icon: user.isMuted ? 'ti ti-eye' : 'ti ti-eye-off', text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute, @@ -166,24 +174,6 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router text: i18n.ts.reportAbuse, action: reportAbuse, }]); - - if (iAmModerator) { - menu = menu.concat([null, { - icon: 'ti ti-badges', - text: i18n.ts.roles, - action: async () => { - const roles = await os.api('admin/roles/list'); - - const { canceled, result: roleId } = await os.select({ - title: i18n.ts._role.chooseRoleToAssign, - items: roles.map(r => ({ text: r.name, value: r.id })), - }); - if (canceled) return; - - await os.apiWithDialog('admin/roles/assign', { roleId, userId: user.id }); - }, - }]); - } } if ($i && meId === user.id) { From 72888b4814cc97ce9853832b976cefdcc0f7ad99 Mon Sep 17 00:00:00 2001 From: Khsmty Date: Sun, 26 Feb 2023 12:25:27 +0900 Subject: [PATCH 006/125] =?UTF-8?q?enhance(client):=20photoswipe=20?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E6=99=82=E3=81=AB=E6=88=BB=E3=82=8B=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E3=82=92=E3=81=97=E3=81=A6=E3=82=82=E5=89=8D=E3=81=AE?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AB=E6=88=BB=E3=82=89=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=20(#10098)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(client): photoswipe 表示時に戻る操作をしても前の画面に戻らないように * add: changelog --------- Co-authored-by: syuilo --- CHANGELOG.md | 1 + .../frontend/src/components/MkMediaList.vue | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 489fcff2cd..5ac696c28c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Improvements - feat: 検索画面の統合 (Khsmty) +- photoswipe 表示時に戻る操作をしても前の画面に戻らないように ### Bugfixes - diff --git a/packages/frontend/src/components/MkMediaList.vue b/packages/frontend/src/components/MkMediaList.vue index a12bb78e35..fafa0bd232 100644 --- a/packages/frontend/src/components/MkMediaList.vue +++ b/packages/frontend/src/components/MkMediaList.vue @@ -113,6 +113,23 @@ onMounted(() => { }); lightbox.init(); + + window.addEventListener('popstate', () => { + if (lightbox.pswp && lightbox.pswp.isOpen === true) { + lightbox.pswp.close(); + return; + } + }); + + lightbox.on('beforeOpen', () => { + history.pushState(null, '', '#pswp'); + }); + + lightbox.on('close', () => { + if (window.location.hash === '#pswp') { + history.back(); + } + }); }); const previewable = (file: misskey.entities.DriveFile): boolean => { From 2acdd933c099111c9f0787b4d1aedc95ea6b93a1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 12:50:34 +0900 Subject: [PATCH 007/125] =?UTF-8?q?enhance(client):=20=E3=83=A1=E3=83=8B?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=81=AE=E3=80=8C=E3=82=82=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E3=80=8D=E3=81=8B=E3=82=89=E3=82=A4=E3=83=B3=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E6=83=85=E5=A0=B1=E3=82=92=E8=A6=8B=E3=82=8C?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/navbar.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/frontend/src/navbar.ts b/packages/frontend/src/navbar.ts index 48bece05fa..efc0e8c920 100644 --- a/packages/frontend/src/navbar.ts +++ b/packages/frontend/src/navbar.ts @@ -1,6 +1,7 @@ import { computed, reactive } from 'vue'; import { $i } from './account'; import { miLocalStorage } from './local-storage'; +import { openInstanceMenu } from './ui/_common_/common'; import * as os from '@/os'; import { i18n } from '@/i18n'; import { ui } from '@/config'; @@ -121,6 +122,13 @@ export const navbarItemDef = reactive({ }], ev.currentTarget ?? ev.target); }, }, + about: { + title: i18n.ts.about, + icon: 'ti ti-info-circle', + action: (ev) => { + openInstanceMenu(ev); + }, + }, reload: { title: i18n.ts.reload, icon: 'ti ti-refresh', From 1bdde6bd5cd4683b7a6ed931a5b2cc5261c3da63 Mon Sep 17 00:00:00 2001 From: daima3629 <52790780+daima3629@users.noreply.github.com> Date: Sun, 26 Feb 2023 14:14:57 +0900 Subject: [PATCH 008/125] [Fix] fixed an typo in error message (#10102) --- packages/backend/src/server/api/endpoints/admin/emoji/add.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts index 8889f30269..04c58050ff 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts @@ -16,7 +16,7 @@ export const meta = { errors: { noSuchFile: { message: 'No such file.', - code: 'MO_SUCH_FILE', + code: 'NO_SUCH_FILE', id: 'fc46b5a4-6b92-4c33-ac66-b806659bb5cf', }, }, From 302af7099cea6f1eaeb513570dcb34d31753eb6f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 14:17:29 +0900 Subject: [PATCH 009/125] Update codecov.yml --- codecov.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/codecov.yml b/codecov.yml index 5d8d232b5e..410f064be2 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,6 +1,4 @@ coverage: status: - project: - default: - only_pulls: true - if_ci_failed: success + project: false + patch: false From cedfb85b603cafbd50870cf5e0dcb861dfe20ae9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 14:21:54 +0900 Subject: [PATCH 010/125] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ac696c28c..ebc776243c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,7 @@ ## 13.x.x (unreleased) ### Improvements -- feat: 検索画面の統合 (Khsmty) -- photoswipe 表示時に戻る操作をしても前の画面に戻らないように +- ### Bugfixes - @@ -21,6 +20,7 @@ You should also include the user name that made the change. - enhance(client): improve clip menu ux - 検索画面の統合 - enhance(client): ノートメニューからユーザーメニューを開けるように +- photoswipe 表示時に戻る操作をしても前の画面に戻らないように ### Bugfixes - Windows環境でswcを使うと正しくビルドできない問題の修正 From cc149e2f46024b081a2c6b695e64089eb57cfe6f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 17:12:15 +0900 Subject: [PATCH 011/125] =?UTF-8?q?fix(server):=20=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=82=B9=E3=81=AF=E8=BF=94=E3=81=95=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #10064 --- CHANGELOG.md | 1 + packages/backend/src/server/api/ApiCallService.ts | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebc776243c..a6a90b39f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ You should also include the user name that made the change. - fix(client): Android ChromeでPWAとしてインストールできない問題を修正 - 未知のユーザーが deleteActor されたら処理をスキップする - fix(server): notes/createで、fileIdsと見つかったファイルの数が異なる場合はエラーにする +- fix(server): エラーのスタックトレースは返さないように ## 13.7.5 (2023/02/24) diff --git a/packages/backend/src/server/api/ApiCallService.ts b/packages/backend/src/server/api/ApiCallService.ts index 347fa59d36..6d8540dd4f 100644 --- a/packages/backend/src/server/api/ApiCallService.ts +++ b/packages/backend/src/server/api/ApiCallService.ts @@ -2,6 +2,7 @@ import { pipeline } from 'node:stream'; import * as fs from 'node:fs'; import { promisify } from 'node:util'; import { Inject, Injectable } from '@nestjs/common'; +import { v4 as uuid } from 'uuid'; import { DI } from '@/di-symbols.js'; import { getIpHash } from '@/misc/get-ip-hash.js'; import type { LocalUser, User } from '@/models/entities/User.js'; @@ -320,6 +321,7 @@ export class ApiCallService implements OnApplicationShutdown { if (err instanceof ApiError) { throw err; } else { + const errId = uuid(); this.logger.error(`Internal error occurred in ${ep.name}: ${err.message}`, { ep: ep.name, ps: data, @@ -327,14 +329,15 @@ export class ApiCallService implements OnApplicationShutdown { message: err.message, code: err.name, stack: err.stack, + id: errId, }, }); - console.error(err); + console.error(err, errId); throw new ApiError(null, { e: { message: err.message, code: err.name, - stack: err.stack, + id: errId, }, }); } From 9234ffc927155ecc4f774dcb5d0e078b704035d3 Mon Sep 17 00:00:00 2001 From: Windymelt <1113940+windymelt@users.noreply.github.com> Date: Sun, 26 Feb 2023 18:18:23 +0900 Subject: [PATCH 012/125] =?UTF-8?q?[chore]Editorconfig:=20yml=E3=81=AB?= =?UTF-8?q?=E5=8A=A0=E3=81=88=E3=81=A6yaml=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=AB=E5=AF=BE=E3=81=97=E3=81=A6=E3=82=82=E5=90=8C?= =?UTF-8?q?=E3=81=98=E8=A6=8F=E7=B4=84=E3=82=92=E9=81=A9=E7=94=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#10081)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added yaml file in addition to yml file, in editorconfig * Applied editorconfig for pnpm-workspace.yaml --------- Co-authored-by: syuilo --- .editorconfig | 2 +- pnpm-workspace.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 6db1367645..a6f988f8d7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,5 +7,5 @@ charset = utf-8 insert_final_newline = true end_of_line = lf -[*.yml] +[*.{yml,yaml}] indent_style = space diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 949cfb3d40..334ff382e5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,4 @@ packages: - 'packages/backend' - 'packages/frontend' - - 'packages/sw' \ No newline at end of file + - 'packages/sw' From 76f3bdcdf95a8706d7572a22f9ca70e22afea5fd Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 18:51:45 +0900 Subject: [PATCH 013/125] update deps --- package.json | 8 +- packages/backend/package.json | 18 +- packages/frontend/package.json | 27 +- pnpm-lock.yaml | 659 ++++++++++++++++++++++++--------- 4 files changed, 503 insertions(+), 209 deletions(-) diff --git a/package.json b/package.json index 8d5334433b..f08272ea9e 100644 --- a/package.json +++ b/package.json @@ -55,11 +55,11 @@ "devDependencies": { "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@typescript-eslint/eslint-plugin": "5.53.0", + "@typescript-eslint/parser": "5.53.0", "cross-env": "7.0.3", - "cypress": "12.6.0", - "eslint": "8.34.0", + "cypress": "12.7.0", + "eslint": "8.35.0", "start-server-and-test": "1.15.4" }, "optionalDependencies": { diff --git a/packages/backend/package.json b/packages/backend/package.json index 4d1d37efff..9fa1e68a46 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -80,7 +80,7 @@ "fluent-ffmpeg": "2.1.2", "form-data": "4.0.0", "got": "12.5.3", - "happy-dom": "^8.7.0", + "happy-dom": "8.9.0", "hpagent": "1.2.0", "ioredis": "4.28.5", "ip-cidr": "3.1.0", @@ -88,7 +88,7 @@ "js-yaml": "4.1.0", "jsdom": "21.1.0", "json5": "2.2.3", - "jsonld": "8.1.0", + "jsonld": "8.1.1", "jsrsasign": "10.6.1", "mfm-js": "0.23.3", "mime-types": "2.1.35", @@ -127,7 +127,7 @@ "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", "summaly": "github:misskey-dev/summaly", - "systeminformation": "5.17.9", + "systeminformation": "5.17.10", "tinycolor2": "1.6.0", "tmp": "0.2.1", "tsc-alias": "1.8.2", @@ -156,7 +156,7 @@ "@types/color-convert": "2.0.0", "@types/content-disposition": "0.5.5", "@types/escape-regexp": "0.0.1", - "@types/fluent-ffmpeg": "2.1.20", + "@types/fluent-ffmpeg": "2.1.21", "@types/ioredis": "4.28.10", "@types/jest": "29.4.0", "@types/js-yaml": "4.0.5", @@ -164,7 +164,7 @@ "@types/jsonld": "1.5.8", "@types/jsrsasign": "10.5.5", "@types/mime-types": "2.1.1", - "@types/node": "18.14.0", + "@types/node": "18.14.1", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.7", "@types/oauth": "0.9.1", @@ -183,18 +183,18 @@ "@types/tinycolor2": "1.4.3", "@types/tmp": "0.2.3", "@types/unzipper": "0.10.5", - "@types/uuid": "9.0.0", + "@types/uuid": "9.0.1", "@types/vary": "1.1.0", "@types/web-push": "3.3.2", "@types/websocket": "1.0.5", "@types/ws": "8.5.4", "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@typescript-eslint/parser": "5.53.0", "cross-env": "7.0.3", - "eslint": "8.34.0", + "eslint": "8.35.0", "eslint-plugin-import": "2.27.5", "execa": "6.1.0", "jest": "29.4.3", "jest-mock": "29.4.3" } -} \ No newline at end of file +} diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 24f8d9b6a6..e4c04f5937 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -41,12 +41,12 @@ "matter-js": "0.19.0", "mfm-js": "0.23.3", "misskey-js": "0.0.15", - "photoswipe": "5.3.5", + "photoswipe": "5.3.6", "prismjs": "1.29.0", "punycode": "2.3.0", "querystring": "0.2.1", "rndstr": "1.0.0", - "rollup": "3.17.2", + "rollup": "3.17.3", "s-age": "1.1.2", "sanitize-html": "2.10.0", "sass": "1.58.3", @@ -54,7 +54,7 @@ "strict-event-emitter-types": "2.0.0", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", - "three": "0.149.0", + "three": "0.150.0", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tsc-alias": "1.8.2", @@ -63,7 +63,7 @@ "typescript": "4.9.5", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.1.2", + "vite": "4.1.4", "vue": "3.2.47", "vue-plyr": "7.0.0", "vue-prism-editor": "2.0.0-alpha.2", @@ -71,29 +71,28 @@ }, "devDependencies": { "@types/escape-regexp": "0.0.1", - "@types/glob": "8.0.1", "@types/gulp": "4.0.10", "@types/gulp-rename": "2.0.1", "@types/matter-js": "0.18.2", - "@types/node": "18.14.0", + "@types/node": "18.14.1", "@types/punycode": "2.1.0", "@types/sanitize-html": "2.8.0", - "@types/seedrandom": "3.0.4", + "@types/seedrandom": "3.0.5", "@types/throttle-debounce": "5.0.0", "@types/tinycolor2": "1.4.3", - "@types/uuid": "9.0.0", + "@types/uuid": "9.0.1", "@types/websocket": "1.0.5", "@types/ws": "8.5.4", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", + "@typescript-eslint/eslint-plugin": "5.53.0", + "@typescript-eslint/parser": "5.53.0", "@vue/runtime-core": "3.2.47", "cross-env": "7.0.3", - "cypress": "12.6.0", - "eslint": "8.34.0", + "cypress": "12.7.0", + "eslint": "8.35.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-vue": "9.9.0", "start-server-and-test": "1.15.4", "vue-eslint-parser": "9.1.0", - "vue-tsc": "1.1.4" + "vue-tsc": "1.2.0" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6273952eab..a6d65b2967 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,11 +11,11 @@ importers: '@tensorflow/tfjs-core': 4.2.0 '@types/gulp': 4.0.10 '@types/gulp-rename': 2.0.1 - '@typescript-eslint/eslint-plugin': 5.52.0 - '@typescript-eslint/parser': 5.52.0 + '@typescript-eslint/eslint-plugin': 5.53.0 + '@typescript-eslint/parser': 5.53.0 cross-env: 7.0.3 - cypress: 12.6.0 - eslint: 8.34.0 + cypress: 12.7.0 + eslint: 8.35.0 execa: 5.1.1 gulp: 4.0.2 gulp-cssnano: 2.1.3 @@ -39,11 +39,11 @@ importers: devDependencies: '@types/gulp': 4.0.10 '@types/gulp-rename': 2.0.1 - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.53.0_cjo54hduev4bqhpjw5znwiokqu + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu cross-env: 7.0.3 - cypress: 12.6.0 - eslint: 8.34.0 + cypress: 12.7.0 + eslint: 8.35.0 start-server-and-test: 1.15.4 packages/backend: @@ -90,7 +90,7 @@ importers: '@types/color-convert': 2.0.0 '@types/content-disposition': 0.5.5 '@types/escape-regexp': 0.0.1 - '@types/fluent-ffmpeg': 2.1.20 + '@types/fluent-ffmpeg': 2.1.21 '@types/ioredis': 4.28.10 '@types/jest': 29.4.0 '@types/js-yaml': 4.0.5 @@ -98,7 +98,7 @@ importers: '@types/jsonld': 1.5.8 '@types/jsrsasign': 10.5.5 '@types/mime-types': 2.1.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/node-fetch': 3.0.3 '@types/nodemailer': 6.4.7 '@types/oauth': 0.9.1 @@ -117,13 +117,13 @@ importers: '@types/tinycolor2': 1.4.3 '@types/tmp': 0.2.3 '@types/unzipper': 0.10.5 - '@types/uuid': 9.0.0 + '@types/uuid': 9.0.1 '@types/vary': 1.1.0 '@types/web-push': 3.3.2 '@types/websocket': 1.0.5 '@types/ws': 8.5.4 '@typescript-eslint/eslint-plugin': 5.52.0 - '@typescript-eslint/parser': 5.52.0 + '@typescript-eslint/parser': 5.53.0 accepts: 1.3.8 ajv: 8.12.0 archiver: 5.3.1 @@ -144,7 +144,7 @@ importers: date-fns: 2.29.3 deep-email-validator: 0.1.21 escape-regexp: 0.0.1 - eslint: 8.34.0 + eslint: 8.35.0 eslint-plugin-import: 2.27.5 execa: 6.1.0 fastify: 4.13.0 @@ -153,7 +153,7 @@ importers: fluent-ffmpeg: 2.1.2 form-data: 4.0.0 got: 12.5.3 - happy-dom: ^8.7.0 + happy-dom: 8.9.0 hpagent: 1.2.0 ioredis: 4.28.5 ip-cidr: 3.1.0 @@ -163,7 +163,7 @@ importers: js-yaml: 4.1.0 jsdom: 21.1.0 json5: 2.2.3 - jsonld: 8.1.0 + jsonld: 8.1.1 jsrsasign: 10.6.1 mfm-js: 0.23.3 mime-types: 2.1.35 @@ -202,7 +202,7 @@ importers: strict-event-emitter-types: 2.0.0 stringz: 2.1.0 summaly: github:misskey-dev/summaly - systeminformation: 5.17.9 + systeminformation: 5.17.10 tinycolor2: 1.6.0 tmp: 0.2.1 tsc-alias: 1.8.2 @@ -262,7 +262,7 @@ importers: fluent-ffmpeg: 2.1.2 form-data: 4.0.0 got: 12.5.3 - happy-dom: 8.7.0 + happy-dom: 8.9.0 hpagent: 1.2.0 ioredis: 4.28.5 ip-cidr: 3.1.0 @@ -270,7 +270,7 @@ importers: js-yaml: 4.1.0 jsdom: 21.1.0 json5: 2.2.3 - jsonld: 8.1.0 + jsonld: 8.1.1 jsrsasign: 10.6.1 mfm-js: 0.23.3 mime-types: 2.1.35 @@ -309,7 +309,7 @@ importers: strict-event-emitter-types: 2.0.0 stringz: 2.1.0 summaly: github.com/misskey-dev/summaly/51f3870e1ff5e0b22102e804112b10cb72f3c494 - systeminformation: 5.17.9 + systeminformation: 5.17.10 tinycolor2: 1.6.0 tmp: 0.2.1 tsc-alias: 1.8.2 @@ -351,7 +351,7 @@ importers: '@types/color-convert': 2.0.0 '@types/content-disposition': 0.5.5 '@types/escape-regexp': 0.0.1 - '@types/fluent-ffmpeg': 2.1.20 + '@types/fluent-ffmpeg': 2.1.21 '@types/ioredis': 4.28.10 '@types/jest': 29.4.0 '@types/js-yaml': 4.0.5 @@ -359,7 +359,7 @@ importers: '@types/jsonld': 1.5.8 '@types/jsrsasign': 10.5.5 '@types/mime-types': 2.1.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/node-fetch': 3.0.3 '@types/nodemailer': 6.4.7 '@types/oauth': 0.9.1 @@ -378,18 +378,18 @@ importers: '@types/tinycolor2': 1.4.3 '@types/tmp': 0.2.3 '@types/unzipper': 0.10.5 - '@types/uuid': 9.0.0 + '@types/uuid': 9.0.1 '@types/vary': 1.1.0 '@types/web-push': 3.3.2 '@types/websocket': 1.0.5 '@types/ws': 8.5.4 - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.52.0_cjo54hduev4bqhpjw5znwiokqu + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu cross-env: 7.0.3 - eslint: 8.34.0 - eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 + eslint: 8.35.0 + eslint-plugin-import: 2.27.5_nhka4er4oejxhxq3ecgtwxvdji execa: 6.1.0 - jest: 29.4.3_@types+node@18.14.0 + jest: 29.4.3_@types+node@18.14.1 jest-mock: 29.4.3 packages/frontend: @@ -401,21 +401,20 @@ importers: '@syuilo/aiscript': 0.12.4 '@tabler/icons-webfont': 2.2.0 '@types/escape-regexp': 0.0.1 - '@types/glob': 8.0.1 '@types/gulp': 4.0.10 '@types/gulp-rename': 2.0.1 '@types/matter-js': 0.18.2 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/punycode': 2.1.0 '@types/sanitize-html': 2.8.0 - '@types/seedrandom': 3.0.4 + '@types/seedrandom': 3.0.5 '@types/throttle-debounce': 5.0.0 '@types/tinycolor2': 1.4.3 - '@types/uuid': 9.0.0 + '@types/uuid': 9.0.1 '@types/websocket': 1.0.5 '@types/ws': 8.5.4 - '@typescript-eslint/eslint-plugin': 5.52.0 - '@typescript-eslint/parser': 5.52.0 + '@typescript-eslint/eslint-plugin': 5.53.0 + '@typescript-eslint/parser': 5.53.0 '@vitejs/plugin-vue': 4.0.0 '@vue/compiler-sfc': 3.2.47 '@vue/runtime-core': 3.2.47 @@ -433,10 +432,10 @@ importers: compare-versions: 5.0.1 cropperjs: 2.0.0-beta.2 cross-env: 7.0.3 - cypress: 12.6.0 + cypress: 12.7.0 date-fns: 2.29.3 escape-regexp: 0.0.1 - eslint: 8.34.0 + eslint: 8.35.0 eslint-plugin-import: 2.27.5 eslint-plugin-vue: 9.9.0 eventemitter3: 5.0.0 @@ -448,12 +447,12 @@ importers: matter-js: 0.19.0 mfm-js: 0.23.3 misskey-js: 0.0.15 - photoswipe: 5.3.5 + photoswipe: 5.3.6 prismjs: 1.29.0 punycode: 2.3.0 querystring: 0.2.1 rndstr: 1.0.0 - rollup: 3.17.2 + rollup: 3.17.3 s-age: 1.1.2 sanitize-html: 2.10.0 sass: 1.58.3 @@ -462,7 +461,7 @@ importers: strict-event-emitter-types: 2.0.0 syuilo-password-strength: 0.0.1 textarea-caret: 3.1.0 - three: 0.149.0 + three: 0.150.0 throttle-debounce: 5.0.0 tinycolor2: 1.6.0 tsc-alias: 1.8.2 @@ -471,21 +470,21 @@ importers: typescript: 4.9.5 uuid: 9.0.0 vanilla-tilt: 1.8.0 - vite: 4.1.2 + vite: 4.1.4 vue: 3.2.47 vue-eslint-parser: 9.1.0 vue-plyr: 7.0.0 vue-prism-editor: 2.0.0-alpha.2 - vue-tsc: 1.1.4 + vue-tsc: 1.2.0 vuedraggable: next dependencies: '@discordapp/twemoji': 14.0.2 - '@rollup/plugin-alias': 4.0.3_rollup@3.17.2 - '@rollup/plugin-json': 6.0.0_rollup@3.17.2 - '@rollup/pluginutils': 5.0.2_rollup@3.17.2 + '@rollup/plugin-alias': 4.0.3_rollup@3.17.3 + '@rollup/plugin-json': 6.0.0_rollup@3.17.3 + '@rollup/pluginutils': 5.0.2_rollup@3.17.3 '@syuilo/aiscript': 0.12.4 '@tabler/icons-webfont': 2.2.0 - '@vitejs/plugin-vue': 4.0.0_vite@4.1.2+vue@3.2.47 + '@vitejs/plugin-vue': 4.0.0_vite@4.1.4+vue@3.2.47 '@vue/compiler-sfc': 3.2.47 autobind-decorator: 2.4.0 autosize: 5.0.2 @@ -511,12 +510,12 @@ importers: matter-js: 0.19.0 mfm-js: 0.23.3 misskey-js: 0.0.15 - photoswipe: 5.3.5 + photoswipe: 5.3.6 prismjs: 1.29.0 punycode: 2.3.0 querystring: 0.2.1 rndstr: 1.0.0 - rollup: 3.17.2 + rollup: 3.17.3 s-age: 1.1.2 sanitize-html: 2.10.0 sass: 1.58.3 @@ -524,7 +523,7 @@ importers: strict-event-emitter-types: 2.0.0 syuilo-password-strength: 0.0.1 textarea-caret: 3.1.0 - three: 0.149.0 + three: 0.150.0 throttle-debounce: 5.0.0 tinycolor2: 1.6.0 tsc-alias: 1.8.2 @@ -533,37 +532,36 @@ importers: typescript: 4.9.5 uuid: 9.0.0 vanilla-tilt: 1.8.0 - vite: 4.1.2_hlkwzk2izwsolfmdrejei4vrty + vite: 4.1.4_435aevtanapkguv7m72cl6trbi vue: 3.2.47 vue-plyr: 7.0.0 vue-prism-editor: 2.0.0-alpha.2_vue@3.2.47 vuedraggable: 4.1.0_vue@3.2.47 devDependencies: '@types/escape-regexp': 0.0.1 - '@types/glob': 8.0.1 '@types/gulp': 4.0.10 '@types/gulp-rename': 2.0.1 '@types/matter-js': 0.18.2 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/punycode': 2.1.0 '@types/sanitize-html': 2.8.0 - '@types/seedrandom': 3.0.4 + '@types/seedrandom': 3.0.5 '@types/throttle-debounce': 5.0.0 '@types/tinycolor2': 1.4.3 - '@types/uuid': 9.0.0 + '@types/uuid': 9.0.1 '@types/websocket': 1.0.5 '@types/ws': 8.5.4 - '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/eslint-plugin': 5.53.0_cjo54hduev4bqhpjw5znwiokqu + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu '@vue/runtime-core': 3.2.47 cross-env: 7.0.3 - cypress: 12.6.0 - eslint: 8.34.0 - eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4 - eslint-plugin-vue: 9.9.0_eslint@8.34.0 + cypress: 12.7.0 + eslint: 8.35.0 + eslint-plugin-import: 2.27.5_nhka4er4oejxhxq3ecgtwxvdji + eslint-plugin-vue: 9.9.0_eslint@8.35.0 start-server-and-test: 1.15.4 - vue-eslint-parser: 9.1.0_eslint@8.34.0 - vue-tsc: 1.1.4_typescript@4.9.5 + vue-eslint-parser: 9.1.0_eslint@8.35.0 + vue-tsc: 1.2.0_typescript@4.9.5 packages/sw: specifiers: @@ -1319,6 +1317,28 @@ packages: - supports-color dev: true + /@eslint/eslintrc/2.0.0: + resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.19.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js/8.35.0: + resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@fastify/accept-negotiator/1.0.0: resolution: {integrity: sha512-4R/N2KfYeld7A5LGkai+iUFMahXcxxYbDp+XS2B1yuL3cdmZLJ9TlCnNzT3q5xFTqsYm0GPpinLUwfSwjcVjyA==} engines: {node: '>=14'} @@ -1496,7 +1516,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 jest-message-util: 29.4.3 jest-util: 29.4.3 @@ -1517,14 +1537,14 @@ packages: '@jest/test-result': 29.4.3 '@jest/transform': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.1 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.4.3 - jest-config: 29.4.3_@types+node@18.14.0 + jest-config: 29.4.3_@types+node@18.14.1 jest-haste-map: 29.4.3 jest-message-util: 29.4.3 jest-regex-util: 29.4.3 @@ -1558,7 +1578,7 @@ packages: dependencies: '@jest/fake-timers': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 jest-mock: 29.4.3 dev: true @@ -1592,7 +1612,7 @@ packages: dependencies: '@jest/types': 29.4.3 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.14.0 + '@types/node': 18.14.1 jest-message-util: 29.4.3 jest-mock: 29.4.3 jest-util: 29.4.3 @@ -1625,7 +1645,7 @@ packages: '@jest/transform': 29.4.3 '@jest/types': 29.4.3 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -1719,7 +1739,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -1731,7 +1751,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/yargs': 17.0.19 chalk: 4.1.2 dev: true @@ -2084,7 +2104,7 @@ packages: - encoding dev: true - /@rollup/plugin-alias/4.0.3_rollup@3.17.2: + /@rollup/plugin-alias/4.0.3_rollup@3.17.3: resolution: {integrity: sha512-ZuDWE1q4PQDhvm/zc5Prun8sBpLJy41DMptYrS6MhAy9s9kL/doN1613BWfEchGVfKxzliJ3BjbOPizXX38DbQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2093,11 +2113,11 @@ packages: rollup: optional: true dependencies: - rollup: 3.17.2 + rollup: 3.17.3 slash: 4.0.0 dev: false - /@rollup/plugin-json/6.0.0_rollup@3.17.2: + /@rollup/plugin-json/6.0.0_rollup@3.17.3: resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2106,11 +2126,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2_rollup@3.17.2 - rollup: 3.17.2 + '@rollup/pluginutils': 5.0.2_rollup@3.17.3 + rollup: 3.17.3 dev: false - /@rollup/pluginutils/5.0.2_rollup@3.17.2: + /@rollup/pluginutils/5.0.2_rollup@3.17.3: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2122,7 +2142,7 @@ packages: '@types/estree': 1.0.0 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.17.2 + rollup: 3.17.3 dev: false /@sideway/address/4.1.4: @@ -2468,7 +2488,7 @@ packages: /@types/accepts/1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/archiver/5.3.1: @@ -2523,7 +2543,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/responselike': 1.0.0 dev: false @@ -2562,37 +2582,37 @@ packages: /@types/expect/1.20.4: resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - /@types/fluent-ffmpeg/2.1.20: - resolution: {integrity: sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==} + /@types/fluent-ffmpeg/2.1.21: + resolution: {integrity: sha512-+n3dy/Tegt6n+YwGZUiGq6i8Jrnt8+MoyPiW1L6J5EWUl7GSt18a/VyReecfCsvTTNBXNMIKOMHDstiQM8nJLA==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/glob-stream/6.1.1: resolution: {integrity: sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==} dependencies: '@types/glob': 8.0.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/glob/8.0.0: resolution: {integrity: sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/glob/8.0.1: resolution: {integrity: sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/gulp-rename/2.0.1: @@ -2617,7 +2637,7 @@ packages: /@types/ioredis/4.28.10: resolution: {integrity: sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/istanbul-lib-coverage/2.0.4: @@ -2650,7 +2670,7 @@ packages: /@types/jsdom/21.1.0: resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -2674,7 +2694,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: false /@types/long/4.0.2: @@ -2696,7 +2716,7 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 form-data: 3.0.1 dev: false @@ -2713,19 +2733,19 @@ packages: /@types/node/18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} - /@types/node/18.14.0: - resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} + /@types/node/18.14.1: + resolution: {integrity: sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==} /@types/nodemailer/6.4.7: resolution: {integrity: sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/oauth/0.9.1: resolution: {integrity: sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/offscreencanvas/2019.3.0: @@ -2739,7 +2759,7 @@ packages: /@types/pg/8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 pg-protocol: 1.5.0 pg-types: 2.2.0 dev: true @@ -2759,7 +2779,7 @@ packages: /@types/qrcode/1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/random-seed/0.3.3: @@ -2783,7 +2803,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: false /@types/sanitize-html/2.8.0: @@ -2796,8 +2816,8 @@ packages: resolution: {integrity: sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==} dev: false - /@types/seedrandom/3.0.4: - resolution: {integrity: sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==} + /@types/seedrandom/3.0.5: + resolution: {integrity: sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==} dev: true /@types/semver/7.3.13: @@ -2811,7 +2831,7 @@ packages: /@types/sharp/0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/sinonjs__fake-timers/8.1.1: @@ -2853,7 +2873,7 @@ packages: /@types/undertaker/1.2.8: resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/undertaker-registry': 1.0.1 async-done: 1.3.2 dev: true @@ -2861,24 +2881,24 @@ packages: /@types/unzipper/0.10.5: resolution: {integrity: sha512-NrLJb29AdnBARpg9S/4ktfPEisbJ0AvaaAr3j7Q1tg8AgcEUsq2HqbNzvgLRoWyRtjzeLEv7vuL39u1mrNIyNA==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true - /@types/uuid/9.0.0: - resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} + /@types/uuid/9.0.1: + resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} dev: true /@types/vary/1.1.0: resolution: {integrity: sha512-LQWqrIa0dvEOOH37lGksMEXbypRLUFqu6Gx0pmX7zIUisD2I/qaVgEX/vJ/PSVSW0Hk6yz1BNkFpqg6dZm3Wug==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/vinyl-fs/2.4.12: resolution: {integrity: sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==} dependencies: '@types/glob-stream': 6.1.1 - '@types/node': 18.14.0 + '@types/node': 18.14.1 '@types/vinyl': 2.0.7 dev: true @@ -2886,12 +2906,12 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 18.14.0 + '@types/node': 18.14.1 /@types/web-push/3.3.2: resolution: {integrity: sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/webgl-ext/0.0.30: @@ -2901,13 +2921,13 @@ packages: /@types/websocket/1.0.5: resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true /@types/yargs-parser/21.0.0: @@ -2930,11 +2950,11 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 dev: true optional: true - /@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza: + /@typescript-eslint/eslint-plugin/5.52.0_cjo54hduev4bqhpjw5znwiokqu: resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2945,12 +2965,40 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu '@typescript-eslint/scope-manager': 5.52.0 - '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/type-utils': 5.52.0_ycpbpc6yetojsgtrx3mwntkhsu + '@typescript-eslint/utils': 5.52.0_ycpbpc6yetojsgtrx3mwntkhsu debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.35.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin/5.53.0_cjo54hduev4bqhpjw5znwiokqu: + resolution: {integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/type-utils': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + '@typescript-eslint/utils': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + debug: 4.3.4 + eslint: 8.35.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -2982,6 +3030,26 @@ packages: - supports-color dev: true + /@typescript-eslint/parser/5.53.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.35.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/5.52.0: resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2990,7 +3058,15 @@ packages: '@typescript-eslint/visitor-keys': 5.52.0 dev: true - /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/scope-manager/5.53.0: + resolution: {integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + dev: true + + /@typescript-eslint/type-utils/5.52.0_ycpbpc6yetojsgtrx3mwntkhsu: resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3001,9 +3077,29 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.52.0_ycpbpc6yetojsgtrx3mwntkhsu debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.35.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils/5.53.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.53.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + debug: 4.3.4 + eslint: 8.35.0 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -3015,6 +3111,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types/5.53.0: + resolution: {integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5: resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3036,7 +3137,28 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/typescript-estree/5.53.0_typescript@4.9.5: + resolution: {integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/visitor-keys': 5.53.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.52.0_ycpbpc6yetojsgtrx3mwntkhsu: resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3047,9 +3169,29 @@ packages: '@typescript-eslint/scope-manager': 5.52.0 '@typescript-eslint/types': 5.52.0 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5 - eslint: 8.34.0 + eslint: 8.35.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.35.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.53.0_ycpbpc6yetojsgtrx3mwntkhsu: + resolution: {integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.53.0 + '@typescript-eslint/types': 5.53.0 + '@typescript-eslint/typescript-estree': 5.53.0_typescript@4.9.5 + eslint: 8.35.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.35.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3064,40 +3206,48 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@vitejs/plugin-vue/4.0.0_vite@4.1.2+vue@3.2.47: + /@typescript-eslint/visitor-keys/5.53.0: + resolution: {integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.53.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vitejs/plugin-vue/4.0.0_vite@4.1.4+vue@3.2.47: resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.1.2_hlkwzk2izwsolfmdrejei4vrty + vite: 4.1.4_435aevtanapkguv7m72cl6trbi vue: 3.2.47 dev: false - /@volar/language-core/1.2.0-alpha.16: - resolution: {integrity: sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==} + /@volar/language-core/1.3.0-alpha.0: + resolution: {integrity: sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==} dependencies: - '@volar/source-map': 1.2.0-alpha.16 + '@volar/source-map': 1.3.0-alpha.0 dev: true - /@volar/source-map/1.2.0-alpha.16: - resolution: {integrity: sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==} + /@volar/source-map/1.3.0-alpha.0: + resolution: {integrity: sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==} dependencies: muggle-string: 0.2.2 dev: true - /@volar/typescript/1.2.0-alpha.16: - resolution: {integrity: sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==} + /@volar/typescript/1.3.0-alpha.0: + resolution: {integrity: sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==} dependencies: - '@volar/language-core': 1.2.0-alpha.16 + '@volar/language-core': 1.3.0-alpha.0 dev: true - /@volar/vue-language-core/1.1.4: - resolution: {integrity: sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==} + /@volar/vue-language-core/1.2.0: + resolution: {integrity: sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==} dependencies: - '@volar/language-core': 1.2.0-alpha.16 - '@volar/source-map': 1.2.0-alpha.16 + '@volar/language-core': 1.3.0-alpha.0 + '@volar/source-map': 1.3.0-alpha.0 '@vue/compiler-dom': 3.2.47 '@vue/compiler-sfc': 3.2.47 '@vue/reactivity': 3.2.47 @@ -3107,11 +3257,11 @@ packages: vue-template-compiler: 2.7.14 dev: true - /@volar/vue-typescript/1.1.4: - resolution: {integrity: sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==} + /@volar/vue-typescript/1.2.0: + resolution: {integrity: sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==} dependencies: - '@volar/typescript': 1.2.0-alpha.16 - '@volar/vue-language-core': 1.1.4 + '@volar/typescript': 1.3.0-alpha.0 + '@volar/vue-language-core': 1.2.0 dev: true /@vue/compiler-core/3.2.47: @@ -3251,11 +3401,13 @@ packages: /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} + hasBin: true dev: false /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} + hasBin: true /adm-zip/0.5.10: resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} @@ -4920,9 +5072,10 @@ packages: uniq: 1.0.1 dev: false - /cypress/12.6.0: - resolution: {integrity: sha512-WdHSVaS1lumSd5XpVTslZd8ui9GIGphrzvXq9+3DtVhqjRZC5M70gu5SW/Y/SLPq3D1wiXGZoHC6HJ7ESVE2lw==} + /cypress/12.7.0: + resolution: {integrity: sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==} engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} + hasBin: true requiresBuild: true dependencies: '@cypress/request': 2.88.11 @@ -5687,6 +5840,7 @@ packages: /esbuild/0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} + hasBin: true requiresBuild: true optionalDependencies: '@esbuild/android-arm': 0.16.17 @@ -5765,6 +5919,35 @@ packages: - supports-color dev: true + /eslint-module-utils/2.7.4_bchzgevzrq32s4jgdbchl2wqu4: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + debug: 3.2.7 + eslint: 8.35.0 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} @@ -5827,19 +6010,52 @@ packages: - supports-color dev: true - /eslint-plugin-vue/9.9.0_eslint@8.34.0: + /eslint-plugin-import/2.27.5_nhka4er4oejxhxq3ecgtwxvdji: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.53.0_ycpbpc6yetojsgtrx3mwntkhsu + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.35.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_bchzgevzrq32s4jgdbchl2wqu4 + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-vue/9.9.0_eslint@8.35.0: resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.34.0 - eslint-utils: 3.0.0_eslint@8.34.0 + eslint: 8.35.0 + eslint-utils: 3.0.0_eslint@8.35.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.3.8 - vue-eslint-parser: 9.1.0_eslint@8.34.0 + vue-eslint-parser: 9.1.0_eslint@8.35.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -5871,6 +6087,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils/3.0.0_eslint@8.35.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.35.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -5928,6 +6154,55 @@ packages: - supports-color dev: true + /eslint/8.35.0: + resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 2.0.0 + '@eslint/js': 8.35.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.35.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.2 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.19.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.2.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /espree/9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5953,6 +6228,13 @@ packages: estraverse: 5.3.0 dev: true + /esquery/1.4.2: + resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -6190,6 +6472,7 @@ packages: /extract-zip/2.0.1_supports-color@8.1.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} + hasBin: true dependencies: debug: 4.3.4_supports-color@8.1.1 get-stream: 5.2.0 @@ -7081,11 +7364,12 @@ packages: engines: {node: '>=0.8.0'} dev: false - /happy-dom/8.7.0: - resolution: {integrity: sha512-F/mH5l8aQwlfeByB0nU6Lg7a0FBax/nPCYNYg8tn/abdKCmiIJH+gU/5MVysf5XoM6KjJsvkbIaXAmS/8HxXLA==} + /happy-dom/8.9.0: + resolution: {integrity: sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==} dependencies: css.escape: 1.5.1 he: 1.2.0 + iconv-lite: 0.6.3 node-fetch: 2.6.7 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 @@ -7194,6 +7478,7 @@ packages: /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true /hexoid/1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} @@ -7618,6 +7903,7 @@ packages: /is-ci/3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true dependencies: ci-info: 3.7.1 dev: true @@ -8030,7 +8316,7 @@ packages: '@jest/expect': 29.4.3 '@jest/test-result': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -8049,7 +8335,7 @@ packages: - supports-color dev: true - /jest-cli/29.4.3_@types+node@18.14.0: + /jest-cli/29.4.3_@types+node@18.14.1: resolution: {integrity: sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -8066,7 +8352,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.10 import-local: 3.1.0 - jest-config: 29.4.3_@types+node@18.14.0 + jest-config: 29.4.3_@types+node@18.14.1 jest-util: 29.4.3 jest-validate: 29.4.3 prompts: 2.4.2 @@ -8077,7 +8363,7 @@ packages: - ts-node dev: true - /jest-config/29.4.3_@types+node@18.14.0: + /jest-config/29.4.3_@types+node@18.14.1: resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -8092,7 +8378,7 @@ packages: '@babel/core': 7.20.12 '@jest/test-sequencer': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 babel-jest: 29.4.3_@babel+core@7.20.12 chalk: 4.1.2 ci-info: 3.7.1 @@ -8161,7 +8447,7 @@ packages: '@jest/environment': 29.4.3 '@jest/fake-timers': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 jest-mock: 29.4.3 jest-util: 29.4.3 dev: true @@ -8187,7 +8473,7 @@ packages: dependencies: '@jest/types': 29.4.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.14.0 + '@types/node': 18.14.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -8263,7 +8549,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 jest-util: 29.4.3 dev: true @@ -8318,7 +8604,7 @@ packages: '@jest/test-result': 29.4.3 '@jest/transform': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -8349,7 +8635,7 @@ packages: '@jest/test-result': 29.4.3 '@jest/transform': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -8405,7 +8691,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.10 @@ -8417,7 +8703,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 chalk: 4.1.2 ci-info: 3.7.1 graceful-fs: 4.2.10 @@ -8442,7 +8728,7 @@ packages: dependencies: '@jest/test-result': 29.4.3 '@jest/types': 29.4.3 - '@types/node': 18.14.0 + '@types/node': 18.14.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -8454,13 +8740,13 @@ packages: resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 jest-util: 29.4.3 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/29.4.3_@types+node@18.14.0: + /jest/29.4.3_@types+node@18.14.1: resolution: {integrity: sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -8473,7 +8759,7 @@ packages: '@jest/core': 29.4.3 '@jest/types': 29.4.3 import-local: 3.1.0 - jest-cli: 29.4.3_@types+node@18.14.0 + jest-cli: 29.4.3_@types+node@18.14.1 transitivePeerDependencies: - '@types/node' - supports-color @@ -8526,6 +8812,7 @@ packages: /js-yaml/3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 @@ -8533,6 +8820,7 @@ packages: /js-yaml/3.7.0: resolution: {integrity: sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 2.7.3 @@ -8660,8 +8948,8 @@ packages: graceful-fs: 4.2.10 dev: true - /jsonld/8.1.0: - resolution: {integrity: sha512-6tYhiEVYO3rTcoYCGCArw8SqawuW0hf/cqmaE5WbX44CGb7d8N2UFvmUj9OYkJhChD98bfdPljUj7S39MrzsHg==} + /jsonld/8.1.1: + resolution: {integrity: sha512-TbtV1hlnoDYxbscazbxcS7seDGV+pc0yktxpMySh0OBFvnLw/TIth0jiQtP/9r+ywuCbtj10XjDNBIkRgiyeUg==} engines: {node: '>=14'} dependencies: '@digitalbazaar/http-client': 3.2.0 @@ -9394,6 +9682,7 @@ packages: /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} @@ -10186,8 +10475,8 @@ packages: split2: 4.1.0 dev: false - /photoswipe/5.3.5: - resolution: {integrity: sha512-90JeebKBhjz1co9goGJ4vjDK84YhGKbLO8J/aKcoWS/OGddVZB77ONIs7igUKa0IB1HozTs0BiS184wzZCghMw==} + /photoswipe/5.3.6: + resolution: {integrity: sha512-v7e8iMfaPUujTACYsK5HBCCtFoW9n2dMZmjIlbvFS2oSpTQmPrfc3PrWnGx8OGY3jNOKho8JC8L277+m+9ag9Q==} engines: {node: '>= 0.12.0'} dev: false @@ -11356,9 +11645,10 @@ packages: seedrandom: 2.4.2 dev: false - /rollup/3.17.2: - resolution: {integrity: sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==} + /rollup/3.17.3: + resolution: {integrity: sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true optionalDependencies: fsevents: 2.3.2 dev: false @@ -11491,6 +11781,7 @@ packages: /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true dev: false /semver/6.3.0: @@ -12110,10 +12401,11 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: false - /systeminformation/5.17.9: - resolution: {integrity: sha512-inxwRLI/4qpx4o85R54/zdhNagdBGBgs0la7Vl3qBorRVKRDk0nNsDTCGzG4lOITsw1gl7LRWeG4Zsp1pC8nfg==} + /systeminformation/5.17.10: + resolution: {integrity: sha512-FUm264baeDpruTw4P50BRRmYHD39D3jkOQ0VpNIkp8CdNejQbsp4Me18jacGBc/mWSVxKdQw4wSHmcL7ERxrNg==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true dev: false /syuilo-password-strength/0.0.1: @@ -12221,8 +12513,8 @@ packages: real-require: 0.2.0 dev: false - /three/0.149.0: - resolution: {integrity: sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ==} + /three/0.150.0: + resolution: {integrity: sha512-12oqqBZom9fb5HtX3rD8qPVnamojuiN5Os7r0x8s3HQ+WHRwnEyzl2XU3aEKocsDkG++rkE9+HWzx77O59NXtw==} dev: false /throttle-debounce/5.0.0: @@ -12796,6 +13088,8 @@ packages: /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true dev: false /uuid/8.0.0: @@ -12804,6 +13098,7 @@ packages: /uuid/8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true /uuid/9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} @@ -12912,8 +13207,8 @@ packages: replace-ext: 1.0.1 dev: false - /vite/4.1.2_hlkwzk2izwsolfmdrejei4vrty: - resolution: {integrity: sha512-MWDb9Rfy3DI8omDQySbMK93nQqStwbsQWejXRY2EBzEWKmLAXWb1mkI9Yw2IJrc+oCvPCI1Os5xSSIBYY6DEAw==} + /vite/4.1.4_435aevtanapkguv7m72cl6trbi: + resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -12937,11 +13232,11 @@ packages: terser: optional: true dependencies: - '@types/node': 18.14.0 + '@types/node': 18.14.1 esbuild: 0.16.17 postcss: 8.4.21 resolve: 1.22.1 - rollup: 3.17.2 + rollup: 3.17.3 sass: 1.58.3 optionalDependencies: fsevents: 2.3.2 @@ -12952,14 +13247,14 @@ packages: engines: {node: '>=0.10.0'} dev: false - /vue-eslint-parser/9.1.0_eslint@8.34.0: + /vue-eslint-parser/9.1.0_eslint@8.35.0: resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.35.0 eslint-scope: 7.1.1 eslint-visitor-keys: 3.3.0 espree: 9.4.1 @@ -12993,14 +13288,14 @@ packages: he: 1.2.0 dev: true - /vue-tsc/1.1.4_typescript@4.9.5: - resolution: {integrity: sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==} + /vue-tsc/1.2.0_typescript@4.9.5: + resolution: {integrity: sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/vue-language-core': 1.1.4 - '@volar/vue-typescript': 1.1.4 + '@volar/vue-language-core': 1.2.0 + '@volar/vue-typescript': 1.2.0 typescript: 4.9.5 dev: true From 67ca7ee4ec8121ec84fa652104749e394896d35e Mon Sep 17 00:00:00 2001 From: xianon Date: Sun, 26 Feb 2023 18:54:52 +0900 Subject: [PATCH 014/125] =?UTF-8?q?=E3=83=9B=E3=83=BC=E3=83=A0=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=A0=E3=83=A9=E3=82=A4=E3=83=B3=E3=81=AE=E8=AA=AD?= =?UTF-8?q?=E3=81=BF=E8=BE=BC=E3=81=BF=E3=81=A7=E3=82=AF=E3=82=A8=E3=83=AA?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6=E3=83=88=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#10106)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/api/endpoints/notes/timeline.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index d1c35e36e2..942c4cf51e 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -66,17 +66,9 @@ export default class extends Endpoint { })) !== 0; //#region Construct query - const followingQuery = this.followingsRepository.createQueryBuilder('following') - .select('following.followeeId') - .where('following.followerId = :followerId', { followerId: me.id }); - const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate) .andWhere('note.createdAt > :minDate', { minDate: new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)) }) // 30日前まで - .andWhere(new Brackets(qb => { qb - .where('note.userId = :meId', { meId: me.id }); - if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`); - })) .innerJoinAndSelect('note.user', 'user') .leftJoinAndSelect('user.avatar', 'avatar') .leftJoinAndSelect('user.banner', 'banner') @@ -87,8 +79,19 @@ export default class extends Endpoint { .leftJoinAndSelect('replyUser.banner', 'replyUserBanner') .leftJoinAndSelect('renote.user', 'renoteUser') .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar') - .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner') - .setParameters(followingQuery.getParameters()); + .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner'); + + if (hasFollowing) { + const followees = await this.followingsRepository.createQueryBuilder('following') + .select('following.followeeId') + .where('following.followerId = :followerId', { followerId: me.id }) + .getMany(); + const meOrFolloweeIds = [me.id, ...followees.map(f => f.followeeId)]; + + query.andWhere('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds }); + } else { + query.andWhere('note.userId = :meId', { meId: me.id }); + } this.queryService.generateChannelQuery(query, me); this.queryService.generateRepliesQuery(query, me); From a78a839841a5f668d420abdee358756e130fdb0a Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 18:57:24 +0900 Subject: [PATCH 015/125] refactor --- .../src/server/api/endpoints/notes/timeline.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index 942c4cf51e..e6de087c4a 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -58,12 +58,10 @@ export default class extends Endpoint { private activeUsersChart: ActiveUsersChart, ) { super(meta, paramDef, async (ps, me) => { - const hasFollowing = (await this.followingsRepository.count({ - where: { - followerId: me.id, - }, - take: 1, - })) !== 0; + const followees = await this.followingsRepository.createQueryBuilder('following') + .select('following.followeeId') + .where('following.followerId = :followerId', { followerId: me.id }) + .getMany(); //#region Construct query const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), @@ -81,11 +79,7 @@ export default class extends Endpoint { .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar') .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner'); - if (hasFollowing) { - const followees = await this.followingsRepository.createQueryBuilder('following') - .select('following.followeeId') - .where('following.followerId = :followerId', { followerId: me.id }) - .getMany(); + if (followees.length > 0) { const meOrFolloweeIds = [me.id, ...followees.map(f => f.followeeId)]; query.andWhere('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds }); From dc9ef87c443918c991d3964a6a8ac1d799f84048 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 19:02:06 +0900 Subject: [PATCH 016/125] New translations ja-JP.yml (French) (#10103) --- locales/fr-FR.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 1b40f99b4c..72fc0ff391 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -103,6 +103,8 @@ renoted: "Renoté !" cantRenote: "Ce message ne peut pas être renoté." cantReRenote: "Impossible de renoter une Renote." quote: "Citer" +inChannelRenote: "Renoter dans le canal" +inChannelQuote: "Citer dans le canal" pinnedNote: "Note épinglée" pinned: "Épingler sur le profil" you: "Vous" @@ -129,6 +131,7 @@ unblockConfirm: "Êtes-vous sûr·e de vouloir débloquer ce compte ?" suspendConfirm: "Êtes-vous sûr·e de vouloir suspendre ce compte ?" unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce compte ?" selectList: "Sélectionner une liste" +selectChannel: "Sélectionner un canal" selectAntenna: "Sélectionner une antenne" selectWidget: "Sélectionner un widget" editWidgets: "Modifier les widgets" @@ -898,6 +901,17 @@ show: "Affichage" neverShow: "Ne plus afficher" remindMeLater: "Peut-être plus tard" color: "Couleur" +_achievements: + _types: + _notes100000: + title: "ALL YOUR NOTE ARE BELONG TO US" + _login1000: + flavor: "Merci d'utiliser Misskey !" + _markedAsCat: + title: "Je suis un chat" + flavor: "Je n'ai pas encore de nom" + _following50: + title: "Beaucoup d'amis" _role: priority: "Priorité" _priority: From f78c519ae5ab73188a1a471a6a7fa90d1c4ef80e Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 19:02:35 +0900 Subject: [PATCH 017/125] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a90b39f1..53ff078cf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ You should also include the user name that made the change. ### Improvements - チャンネル内ハイライト +- ホームタイムラインのパフォーマンスを改善 - renoteした際の表示を改善 - バックグラウンドで一定時間経過したらページネーションのアイテム更新をしない - enhance(client): MkUrlPreviewの閉じるボタンを見やすく From a56898df9471779ca772bffc4b77d7f2ffe7aee2 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 19:03:22 +0900 Subject: [PATCH 018/125] 13.8.0 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53ff078cf0..c259bfbb67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ You should also include the user name that made the change. --> -## 13.x.x (unreleased) +## 13.8.0 (2023/02/26) ### Improvements - チャンネル内ハイライト diff --git a/package.json b/package.json index f08272ea9e..c91708de51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.7.5", + "version": "13.8.0", "codename": "nasubi", "repository": { "type": "git", From d019c1c440e3a155b2820361ca31a9f52c834570 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:07:45 +0900 Subject: [PATCH 019/125] Update packages/backend/check_connect.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Acid Chicken (硫酸鶏) --- packages/backend/check_connect.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/check_connect.js b/packages/backend/check_connect.js index 8bf134a105..627789580b 100644 --- a/packages/backend/check_connect.js +++ b/packages/backend/check_connect.js @@ -1,5 +1,5 @@ -import {loadConfig} from './built/config.js'; -import {createRedisConnection} from "./built/redis.js"; +import { loadConfig } from './built/config.js'; +import { createRedisConnection } from './built/redis.js'; const config = loadConfig(); const redis = createRedisConnection(config); From 9f8c9dd8819e855e2b49b9963d9fcc79e3f376c6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:07:52 +0900 Subject: [PATCH 020/125] Update packages/backend/check_connect.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Acid Chicken (硫酸鶏) --- packages/backend/check_connect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/check_connect.js b/packages/backend/check_connect.js index 627789580b..ed429c0254 100644 --- a/packages/backend/check_connect.js +++ b/packages/backend/check_connect.js @@ -6,5 +6,5 @@ const redis = createRedisConnection(config); redis.on('connect', () => redis.disconnect()); redis.on('error', (e) => { - throw e; + throw e; }); From 02d7ffd305013d3189c189ac585ca5d6e50c2db6 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 26 Feb 2023 11:10:24 +0000 Subject: [PATCH 021/125] =?UTF-8?q?fix(server):=20=E5=8D=98=E7=B4=94?= =?UTF-8?q?=E3=81=ABrenote=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84=E3=81=AE?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/server/api/endpoints/notes/create.test.ts | 15 +++++++++++++++ .../src/server/api/endpoints/notes/create.ts | 1 + 2 files changed, 16 insertions(+) diff --git a/packages/backend/src/server/api/endpoints/notes/create.test.ts b/packages/backend/src/server/api/endpoints/notes/create.test.ts index 4e5ec361f9..6bff7fc0c9 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.test.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.test.ts @@ -235,6 +235,21 @@ describe('api:notes/create', () => { }); }); + describe('renote', () => { + test('just a renote', () => { + expect(v({ renoteId: '1' })) + .toBe(VALID); + }); + test('just a quote', () => { + expect(v({ text: 'Hello, world!', renoteId: '1' })) + .toBe(VALID); + }); + test('reject invalid renoteId', () => { + expect(v({ renoteId: 'あ' })) + .toBe(INVALID); + }); + }); + test('text, fileIds and poll', () => { expect(v({ text: 'Hello, world!', fileIds: ['1', '2', '3'], poll: { choices: ['a', 'b', 'c'] } })) .toBe(VALID); diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index 2848cd7df1..786ad103b0 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -147,6 +147,7 @@ export const paramDef = { // (re)note with text, files and poll are optional anyOf: [ { required: ['text'] }, + { required: ['renoteId'] }, { required: ['fileIds'] }, { required: ['mediaIds'] }, { required: ['poll'] }, From b7e72cfb7e3273de701034c753e9a8a673cb677f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:29:53 +0900 Subject: [PATCH 022/125] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c259bfbb67..3734bbfd40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ You should also include the user name that made the change. - fix(client): Android ChromeでPWAとしてインストールできない問題を修正 - 未知のユーザーが deleteActor されたら処理をスキップする - fix(server): notes/createで、fileIdsと見つかったファイルの数が異なる場合はエラーにする +- fix(server): notes/createのバリデーションが機能していないのを修正 - fix(server): エラーのスタックトレースは返さないように ## 13.7.5 (2023/02/24) From 103dc32dcef30f62c23e68acc679a13c13ae1d93 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:30:03 +0900 Subject: [PATCH 023/125] Update 03_release.md --- .github/PULL_REQUEST_TEMPLATE/03_release.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/03_release.md b/.github/PULL_REQUEST_TEMPLATE/03_release.md index 0c71ea804d..46d4101388 100644 --- a/.github/PULL_REQUEST_TEMPLATE/03_release.md +++ b/.github/PULL_REQUEST_TEMPLATE/03_release.md @@ -1,10 +1,19 @@ -# Summary +## Summary This is a release PR. For more information on the release instructions, please see: https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md#release -# Checklist +## For reviewers +- CHANGELOGに抜け漏れは無いか +- バージョンの上げ方は適切か +- 他にこのリリースに含めなければならない変更は無いか +- 全体的な変更内容を俯瞰し問題は無いか +- レビューされていないコミットがある場合は、それが問題ないか + +などを確認し、リリースする準備が整っていると思われる場合は approve してください。 + +## Checklist - [ ] package.jsonのバージョンが正しく更新されている - [ ] CHANGELOGが過不足無く更新されている - [ ] CIが全て通っている From d8dcce807b4dc9b996611d7ea9ee93153bc0a0df Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:51:06 +0900 Subject: [PATCH 024/125] =?UTF-8?q?fix(client):=20=E3=83=A2=E3=83=90?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E7=92=B0=E5=A2=83=E3=81=A7=E3=83=9D=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=82=A2=E3=83=83=E3=83=97=E3=81=8C=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #10110 --- packages/frontend/src/components/MkModal.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkModal.vue b/packages/frontend/src/components/MkModal.vue index dbad02fb7e..4529d61c2f 100644 --- a/packages/frontend/src/components/MkModal.vue +++ b/packages/frontend/src/components/MkModal.vue @@ -125,7 +125,7 @@ function onBgClick() { } if (type === 'drawer') { - maxHeight = (window.innerHeight - SCROLLBAR_THICKNESS) / 1.5; + maxHeight = window.innerHeight / 1.5; } const keymap = { From 81e6a21fe06633adf50acd089f2005dfb10b95d4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 26 Feb 2023 20:52:00 +0900 Subject: [PATCH 025/125] 13.8.1 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3734bbfd40..eb9ad1c100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ You should also include the user name that made the change. --> + +## 13.8.1 (2023/02/26) + +### Bugfixes +- モバイルでドロワーメニューが表示されない問題を修正 + ## 13.8.0 (2023/02/26) ### Improvements diff --git a/package.json b/package.json index c91708de51..2dec3f31fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.8.0", + "version": "13.8.1", "codename": "nasubi", "repository": { "type": "git", From 647a0183626042f29834c3b4dd8dbba88a799c4c Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Mon, 27 Feb 2023 10:01:43 +0100 Subject: [PATCH 026/125] fix(backend): return HTTP 404 for any unknown api endpoint paths (#10130) * fix(backend): return HTTP 400 for any invalid api endpoint paths * 404 --- cypress/e2e/api.cy.js | 11 ++++++++++ .../src/server/api/ApiServerService.ts | 20 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 cypress/e2e/api.cy.js diff --git a/cypress/e2e/api.cy.js b/cypress/e2e/api.cy.js new file mode 100644 index 0000000000..00df987bfc --- /dev/null +++ b/cypress/e2e/api.cy.js @@ -0,0 +1,11 @@ +describe('API', () => { + it('returns HTTP 404 to unknown API endpoint paths', () => { + cy.request({ + url: '/api/foo', + failOnStatusCode: false, + }).then((response) => { + expect(response.status).to.eq(404); + expect(response.body.error.code).to.eq('UNKNOWN_API_ENDPOINT'); + }); + }); +}); diff --git a/packages/backend/src/server/api/ApiServerService.ts b/packages/backend/src/server/api/ApiServerService.ts index 2b99da01b6..501ce63877 100644 --- a/packages/backend/src/server/api/ApiServerService.ts +++ b/packages/backend/src/server/api/ApiServerService.ts @@ -79,7 +79,7 @@ export class ApiServerService { reply.send(); return; } - + this.apiCallService.handleMultipartRequest(ep, request, reply); }); } else { @@ -93,7 +93,7 @@ export class ApiServerService { reply.send(); return; } - + this.apiCallService.handleRequest(ep, request, reply); }); } @@ -160,6 +160,22 @@ export class ApiServerService { } }); + // Make sure any unknown path under /api returns HTTP 404 Not Found, + // because otherwise ClientServerService will return the base client HTML + // page with HTTP 200. + fastify.get('*', (request, reply) => { + reply.code(404); + // Mock ApiCallService.send's error handling + reply.send({ + error: { + message: 'Unknown API endpoint.', + code: 'UNKNOWN_API_ENDPOINT', + id: '2ca3b769-540a-4f08-9dd5-b5a825b6d0f1', + kind: 'client', + }, + }); + }); + done(); } } From 785c67ea8de9fdad06126887e9868056812be0c1 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 28 Feb 2023 15:27:54 +0900 Subject: [PATCH 027/125] :art: --- packages/frontend/src/components/MkMenu.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue index 09d530c4ea..9e3022896c 100644 --- a/packages/frontend/src/components/MkMenu.vue +++ b/packages/frontend/src/components/MkMenu.vue @@ -36,7 +36,7 @@ - - +

+
+ + + +
@@ -44,6 +38,8 @@ import * as os from '@/os'; import { mainRouter } from '@/router'; import { definePageMetadata } from '@/scripts/page-metadata'; import { i18n } from '@/i18n'; +import { userPage } from '@/filters/user'; +import MkUserCardMini from '@/components/MkUserCardMini.vue'; const props = defineProps<{ listId: string; @@ -76,13 +72,20 @@ function addUser() { }); } -function removeUser(user) { - os.api('users/lists/pull', { - listId: list.id, - userId: user.id, - }).then(() => { - users = users.filter(x => x.id !== user.id); - }); +async function removeUser(user, ev) { + os.popupMenu([{ + text: i18n.ts.remove, + icon: 'ti ti-x', + danger: true, + action: async () => { + os.api('users/lists/pull', { + listId: list.id, + userId: user.id, + }).then(() => { + users = users.filter(x => x.id !== user.id); + }); + }, + }], ev.currentTarget ?? ev.target); } async function renameList() { @@ -126,37 +129,24 @@ definePageMetadata(computed(() => list ? { } : null)); - From 44f041587cc3ef298242ffce710b51c1ac57327b Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 14:46:53 +0900 Subject: [PATCH 046/125] :art: --- packages/frontend/src/components/MkNote.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 1e78c69601..35d5ef77d1 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -453,12 +453,12 @@ function showReactions(): void { padding: 0 4px; margin-bottom: 0 !important; background: var(--popup); - border-radius: 6px; + border-radius: 8px; box-shadow: 0px 4px 32px var(--shadow); } .footerButton { - font-size: 80%; + font-size: 90%; &:not(:last-child) { margin-right: 0; From 78d66d3806fc78cac5964e00fe8cec72afea5052 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 14:54:02 +0900 Subject: [PATCH 047/125] :art: --- packages/frontend/src/components/MkNote.vue | 1 + packages/frontend/src/components/MkNoteHeader.vue | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 35d5ef77d1..7842566b88 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -32,6 +32,7 @@ +
diff --git a/packages/frontend/src/components/MkNoteHeader.vue b/packages/frontend/src/components/MkNoteHeader.vue index ffd9a20ef7..15d7ea2e14 100644 --- a/packages/frontend/src/components/MkNoteHeader.vue +++ b/packages/frontend/src/components/MkNoteHeader.vue @@ -18,6 +18,7 @@ +
From c34e7e6e08c66fb4ed539c4d4f967af3843dca7b Mon Sep 17 00:00:00 2001 From: Khsmty Date: Wed, 1 Mar 2023 14:55:57 +0900 Subject: [PATCH 048/125] =?UTF-8?q?enhance(client):=20Renote=20=E3=81=97?= =?UTF-8?q?=E3=81=9F=E6=99=82=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=82=92=E3=83=AA?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=83=AB=E3=82=A8=E3=83=95=E3=82=A7=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=81=A8=20toast=20=E3=81=AB=20(#10116)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(client): Renote した時の表示を toast に * fix: lint エラー * enhance(client): Renote した時の表示をリップルエフェクトに * toast も追加 * rippleeffect のタイミング変更 * toast の位置を header に被らないように --- packages/frontend/src/components/MkNote.vue | 25 +++++++++++++++++-- .../src/components/MkNoteDetailed.vue | 25 +++++++++++++++++-- packages/frontend/src/components/MkToast.vue | 2 +- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 7842566b88..b87d46ee94 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -157,6 +157,7 @@ import { useTooltip } from '@/scripts/use-tooltip'; import { claimAchievement } from '@/scripts/achievements'; import { getNoteSummary } from '@/scripts/get-note-summary'; import { MenuItem } from '@/types/menu'; +import MkRippleEffect from '@/components/MkRippleEffect.vue'; const props = defineProps<{ note: misskey.entities.Note; @@ -256,9 +257,19 @@ function renote(viaKeyboard = false) { text: i18n.ts.inChannelRenote, icon: 'ti ti-repeat', action: () => { - os.apiWithDialog('notes/create', { + const el = renoteButton.value as HTMLElement | null | undefined; + if (el) { + const rect = el.getBoundingClientRect(); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(MkRippleEffect, { x, y }, {}, 'end'); + } + + os.api('notes/create', { renoteId: appearNote.id, channelId: appearNote.channelId, + }).then(() => { + os.toast(i18n.ts.renoted); }); }, }, { @@ -277,8 +288,18 @@ function renote(viaKeyboard = false) { text: i18n.ts.renote, icon: 'ti ti-repeat', action: () => { - os.apiWithDialog('notes/create', { + const el = renoteButton.value as HTMLElement | null | undefined; + if (el) { + const rect = el.getBoundingClientRect(); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(MkRippleEffect, { x, y }, {}, 'end'); + } + + os.api('notes/create', { renoteId: appearNote.id, + }).then(() => { + os.toast(i18n.ts.renoted); }); }, }, { diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 2eebe999a5..f5f4a2afc1 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -161,6 +161,7 @@ import { deepClone } from '@/scripts/clone'; import { useTooltip } from '@/scripts/use-tooltip'; import { claimAchievement } from '@/scripts/achievements'; import { MenuItem } from '@/types/menu'; +import MkRippleEffect from '@/components/MkRippleEffect.vue'; const props = defineProps<{ note: misskey.entities.Note; @@ -250,9 +251,19 @@ function renote(viaKeyboard = false) { text: i18n.ts.inChannelRenote, icon: 'ti ti-repeat', action: () => { - os.apiWithDialog('notes/create', { + const el = renoteButton.value as HTMLElement | null | undefined; + if (el) { + const rect = el.getBoundingClientRect(); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(MkRippleEffect, { x, y }, {}, 'end'); + } + + os.api('notes/create', { renoteId: appearNote.id, channelId: appearNote.channelId, + }).then(() => { + os.toast(i18n.ts.renoted); }); }, }, { @@ -271,8 +282,18 @@ function renote(viaKeyboard = false) { text: i18n.ts.renote, icon: 'ti ti-repeat', action: () => { - os.apiWithDialog('notes/create', { + const el = renoteButton.value as HTMLElement | null | undefined; + if (el) { + const rect = el.getBoundingClientRect(); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(MkRippleEffect, { x, y }, {}, 'end'); + } + + os.api('notes/create', { renoteId: appearNote.id, + }).then(() => { + os.toast(i18n.ts.renoted); }); }, }, { diff --git a/packages/frontend/src/components/MkToast.vue b/packages/frontend/src/components/MkToast.vue index 1aa48f88e6..6d59702569 100644 --- a/packages/frontend/src/components/MkToast.vue +++ b/packages/frontend/src/components/MkToast.vue @@ -53,7 +53,7 @@ onMounted(() => { position: fixed; left: 0; right: 0; - top: 0; + top: 50px; margin: 0 auto; margin-top: 16px; min-width: 300px; From 830fabef12c6ef91eaaee3ad7bc73a5c110ff939 Mon Sep 17 00:00:00 2001 From: KokiSakano <61353435+KokiSakano@users.noreply.github.com> Date: Wed, 1 Mar 2023 15:19:20 +0900 Subject: [PATCH 049/125] =?UTF-8?q?refactor:=20plugin.ts=E3=81=AE=E5=9E=8B?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=99=E3=82=8B=20(#10027)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor:plugin内のすべての関数にreturn typeを設定 * fix:pluginContextsから取得できない場合は早期リターンする * fix:valueがstring以外の時は早期リターンする * fix:valueが取得できる時以外は早期リターンする * fix:pluginに型をつける * fix:絞り込みをassertStringに変更 * fix:修正漏れ * fix:valToJsからvalueを取得するように変更 --- packages/frontend/src/plugin.ts | 70 +++++++++++++++++++++++---------- packages/frontend/src/store.ts | 5 ++- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 17eb99be22..a1a36480fd 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -1,12 +1,12 @@ import { Interpreter, Parser, utils, values } from '@syuilo/aiscript'; import { createAiScriptEnv } from '@/scripts/aiscript/api'; import { inputText } from '@/os'; -import { noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@/store'; +import { Plugin, noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions } from '@/store'; const parser = new Parser(); const pluginContexts = new Map(); -export function install(plugin) { +export function install(plugin: Plugin): void { // 後方互換性のため if (plugin.src == null) return; console.info('Plugin installed:', plugin.name, 'v' + plugin.version); @@ -15,7 +15,7 @@ export function install(plugin) { plugin: plugin, storageKey: 'plugins:' + plugin.id, }), { - in: (q) => { + in: (q): Promise => { return new Promise(ok => { inputText({ title: q, @@ -28,10 +28,10 @@ export function install(plugin) { }); }); }, - out: (value) => { + out: (value): void => { console.log(value); }, - log: (type, params) => { + log: (): void => { }, }); @@ -40,9 +40,9 @@ export function install(plugin) { aiscript.exec(parser.parse(plugin.src)); } -function createPluginEnv(opts) { - const config = new Map(); - for (const [k, v] of Object.entries(opts.plugin.config || {})) { +function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record { + const config = new Map(); + for (const [k, v] of Object.entries(opts.plugin.config ?? {})) { config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default)); } @@ -50,22 +50,28 @@ function createPluginEnv(opts) { ...createAiScriptEnv({ ...opts, token: opts.plugin.token }), //#region Deprecated 'Mk:register_post_form_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerPostFormAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), 'Mk:register_user_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerUserAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), 'Mk:register_note_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerNoteAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), //#endregion 'Plugin:register_post_form_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerPostFormAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), 'Plugin:register_user_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerUserAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), 'Plugin:register_note_action': values.FN_NATIVE(([title, handler]) => { + utils.assertString(title); registerNoteAction({ pluginId: opts.plugin.id, title: title.value, handler }); }), 'Plugin:register_note_view_interruptor': values.FN_NATIVE(([handler]) => { @@ -75,54 +81,78 @@ function createPluginEnv(opts) { registerNotePostInterruptor({ pluginId: opts.plugin.id, handler }); }), 'Plugin:open_url': values.FN_NATIVE(([url]) => { + utils.assertString(url); window.open(url.value, '_blank'); }), 'Plugin:config': values.OBJ(config), }; } -function initPlugin({ plugin, aiscript }) { +function initPlugin({ plugin, aiscript }): void { pluginContexts.set(plugin.id, aiscript); } -function registerPostFormAction({ pluginId, title, handler }) { +function registerPostFormAction({ pluginId, title, handler }): void { postFormActions.push({ title, handler: (form, update) => { - pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(form), values.FN_NATIVE(([key, value]) => { - update(key.value, value.value); + const pluginContext = pluginContexts.get(pluginId); + if (!pluginContext) { + return; + } + pluginContext.execFn(handler, [utils.jsToVal(form), values.FN_NATIVE(([key, value]) => { + if (!key || !value) { + return; + } + update(utils.valToJs(key), utils.valToJs(value)); })]); }, }); } -function registerUserAction({ pluginId, title, handler }) { +function registerUserAction({ pluginId, title, handler }): void { userActions.push({ title, handler: (user) => { - pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(user)]); + const pluginContext = pluginContexts.get(pluginId); + if (!pluginContext) { + return; + } + pluginContext.execFn(handler, [utils.jsToVal(user)]); }, }); } -function registerNoteAction({ pluginId, title, handler }) { +function registerNoteAction({ pluginId, title, handler }): void { noteActions.push({ title, handler: (note) => { - pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]); + const pluginContext = pluginContexts.get(pluginId); + if (!pluginContext) { + return; + } + pluginContext.execFn(handler, [utils.jsToVal(note)]); }, }); } -function registerNoteViewInterruptor({ pluginId, handler }) { +function registerNoteViewInterruptor({ pluginId, handler }): void { noteViewInterruptors.push({ handler: async (note) => { - return utils.valToJs(await pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)])); + const pluginContext = pluginContexts.get(pluginId); + if (!pluginContext) { + return; + } + return utils.valToJs(await pluginContext.execFn(handler, [utils.jsToVal(note)])); }, }); } -function registerNotePostInterruptor({ pluginId, handler }) { +function registerNotePostInterruptor({ pluginId, handler }): void { notePostInterruptors.push({ handler: async (note) => { - return utils.valToJs(await pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)])); + const pluginContext = pluginContexts.get(pluginId); + if (!pluginContext) { + return; + } + return utils.valToJs(await pluginContext.execFn(handler, [utils.jsToVal(note)])); }, }); } diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index fd2f2523c9..14226468eb 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -287,12 +287,15 @@ export const defaultStore = markRaw(new Storage('base', { const PREFIX = 'miux:' as const; -type Plugin = { +export type Plugin = { id: string; name: string; active: boolean; + config?: Record; configData: Record; token: string; + src: string | null; + version: string; ast: any[]; }; From 6d82371449cc97f1ee8a7425b17ec536a3095640 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Wed, 1 Mar 2023 07:24:09 +0100 Subject: [PATCH 050/125] fix(frontend): read KeyboardEvent.key instead of which/code (#10083) --- cypress/e2e/basic.cy.js | 17 +++++++++++++++-- packages/frontend/src/components/MkPostForm.vue | 10 +++++----- packages/frontend/src/scripts/hotkey.ts | 6 +++--- packages/frontend/src/scripts/keycode.ts | 15 --------------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index eb5195c4b2..fc3e6f35bc 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -17,7 +17,7 @@ describe('Before setup instance', () => { cy.visit('/'); cy.intercept('POST', '/api/admin/accounts/create').as('signup'); - + cy.get('[data-cy-admin-username] input').type('admin'); cy.get('[data-cy-admin-password] input').type('admin1234'); cy.get('[data-cy-admin-ok]').click(); @@ -112,7 +112,7 @@ describe('After user signup', () => { }); }); -describe('After user singed in', () => { +describe('After user signed in', () => { beforeEach(() => { cy.resetState(); @@ -141,6 +141,19 @@ describe('After user singed in', () => { cy.get('[data-cy-open-post-form-submit]').click(); cy.contains('Hello, Misskey!'); + }); + + it('open note form with hotkey', () => { + // Wait until the page loads + cy.get('[data-cy-open-post-form]').should('be.visible'); + // Use trigger() to give different `code` to test if hotkeys also work on non-QWERTY keyboards. + cy.document().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "n", code: "KeyL" }); + // See if the form is opened + cy.get('[data-cy-post-form-text]').should('be.visible'); + // Close it + cy.focused().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "Escape", code: "Escape" }); + // See if the form is closed + cy.get('[data-cy-post-form-text]').should('not.be.visible'); }); }); diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index f73eab5b86..2b3e2c8646 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -437,8 +437,8 @@ function clear() { } function onKeydown(ev: KeyboardEvent) { - if ((ev.which === 10 || ev.which === 13) && (ev.ctrlKey || ev.metaKey) && canPost) post(); - if (ev.which === 27) emit('esc'); + if (ev.key === 'Enter' && (ev.ctrlKey || ev.metaKey) && canPost) post(); + if (ev.key === 'Escape') emit('esc'); } function onCompositionUpdate(ev: CompositionEvent) { @@ -489,9 +489,9 @@ function onDragover(ev) { switch (ev.dataTransfer.effectAllowed) { case 'all': case 'uninitialized': - case 'copy': - case 'copyLink': - case 'copyMove': + case 'copy': + case 'copyLink': + case 'copyMove': ev.dataTransfer.dropEffect = 'copy'; break; case 'linkMove': diff --git a/packages/frontend/src/scripts/hotkey.ts b/packages/frontend/src/scripts/hotkey.ts index 4a0ded637d..b7238016c6 100644 --- a/packages/frontend/src/scripts/hotkey.ts +++ b/packages/frontend/src/scripts/hotkey.ts @@ -53,10 +53,10 @@ const parseKeymap = (keymap: Keymap) => Object.entries(keymap).map(([patterns, c return result; }); -const ignoreElemens = ['input', 'textarea']; +const ignoreElements = ['input', 'textarea']; function match(ev: KeyboardEvent, patterns: Action['patterns']): boolean { - const key = ev.code.toLowerCase(); + const key = ev.key.toLowerCase(); return patterns.some(pattern => pattern.which.includes(key) && pattern.ctrl === ev.ctrlKey && pattern.shift === ev.shiftKey && @@ -70,7 +70,7 @@ export const makeHotkey = (keymap: Keymap) => { return (ev: KeyboardEvent) => { if (document.activeElement) { - if (ignoreElemens.some(el => document.activeElement!.matches(el))) return; + if (ignoreElements.some(el => document.activeElement!.matches(el))) return; if (document.activeElement.attributes['contenteditable']) return; } diff --git a/packages/frontend/src/scripts/keycode.ts b/packages/frontend/src/scripts/keycode.ts index 69f6a82803..35813edbd5 100644 --- a/packages/frontend/src/scripts/keycode.ts +++ b/packages/frontend/src/scripts/keycode.ts @@ -16,18 +16,3 @@ export const aliases = { 'right': 'ArrowRight', 'plus': ['NumpadAdd', 'Semicolon'], }; - -/*! -* Programmatically add the following -*/ - -// lower case chars -for (let i = 97; i < 123; i++) { - const char = String.fromCharCode(i); - aliases[char] = `Key${char.toUpperCase()}`; -} - -// numbers -for (let i = 0; i < 10; i++) { - aliases[i] = [`Numpad${i}`, `Digit${i}`]; -} From 44058f8b855ddffb1451241f0c28fb0cf3d9845c Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Wed, 1 Mar 2023 07:32:53 +0100 Subject: [PATCH 051/125] enhance(e2e): more resilient version of `visit('/')` (#10128) --- cypress/e2e/basic.cy.js | 14 +++++++------- cypress/support/commands.js | 7 ++++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index fc3e6f35bc..b1b856119c 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -10,11 +10,11 @@ describe('Before setup instance', () => { }); it('successfully loads', () => { - cy.visit('/'); + cy.visitHome(); }); it('setup instance', () => { - cy.visit('/'); + cy.visitHome(); cy.intercept('POST', '/api/admin/accounts/create').as('signup'); @@ -43,11 +43,11 @@ describe('After setup instance', () => { }); it('successfully loads', () => { - cy.visit('/'); + cy.visitHome(); }); it('signup', () => { - cy.visit('/'); + cy.visitHome(); cy.intercept('POST', '/api/signup').as('signup'); @@ -79,11 +79,11 @@ describe('After user signup', () => { }); it('successfully loads', () => { - cy.visit('/'); + cy.visitHome(); }); it('signin', () => { - cy.visit('/'); + cy.visitHome(); cy.intercept('POST', '/api/signin').as('signin'); @@ -101,7 +101,7 @@ describe('After user signup', () => { userId: this.alice.id, }); - cy.visit('/'); + cy.visitHome(); cy.get('[data-cy-signin]').click(); cy.get('[data-cy-signin-username] input').type('alice'); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 04a6d98b01..91a4d7abe6 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,6 +24,11 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +Cypress.Commands.add('visitHome', () => { + cy.visit('/'); + cy.get('button', { timeout: 30000 }).should('be.visible'); +}) + Cypress.Commands.add('resetState', () => { cy.window(win => { win.indexedDB.deleteDatabase('keyval-store'); @@ -43,7 +48,7 @@ Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => { }); Cypress.Commands.add('login', (username, password) => { - cy.visit('/'); + cy.visitHome(); cy.intercept('POST', '/api/signin').as('signin'); From 47b1b09b21d09d8cdc07265b9eb0a83dbd38e5b5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 17:22:17 +0900 Subject: [PATCH 052/125] enhance(client): add new sounds --- .../assets/sounds/syuilo/new-aec-oct.mp3 | Bin 0 -> 27943 bytes .../frontend/assets/sounds/syuilo/new-aec.mp3 | Bin 0 -> 27943 bytes .../assets/sounds/syuilo/new-cea-oct.mp3 | Bin 0 -> 27943 bytes .../frontend/assets/sounds/syuilo/new-cea.mp3 | Bin 0 -> 27943 bytes .../assets/sounds/syuilo/new-eca-oct.mp3 | Bin 0 -> 27943 bytes .../frontend/assets/sounds/syuilo/new-eca.mp3 | Bin 0 -> 27943 bytes packages/frontend/src/scripts/sound.ts | 6 ++++++ 7 files changed, 6 insertions(+) create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca.mp3 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d66406a95429e31f0ed34f0de5a1ade242b88ea5 GIT binary patch literal 27943 zcmeZtF=k-^f!L6UhzJG-1|9|m=91Lhf_w%`V?6@~s3;c$19MVAE>z4Zz?Xr6fsKKI z8KNdQ*p-2SfuDha*(b3q&D28A+)U5VzyM?{6#xJI1j@oqdFG|%LyTdNVPMEPz#u3n zC?zE&rL3&1qobo^Vq#)zYisM~=H~D3?;jBn5s{dfn3($dn~+uJ*B z+O%o&=FMBaeEISX8#e6RxpU{CLx)bEK7IP~<;$1v+`04g>C>n0-o5+&{rmU-|Nnzr zGlU@&P02g}_($CN&cb@{l-8tgEUVNY{oV3$a6NJ?bvaZ@vwoAIY8 zX~Rs7fa9%)EhLz_gOC0`_ib}uUUttcBj2T6=W^$qbFJ}hb~-bW-A6^Br&QjjQ}Il- zq>n%U8B^{vnw&oJY-hw-&hRsy;bG!oW9(sJXmDVx5V^R{d1CuN^Zfr-b*E&u*Tv5( z`M9(8#GUs?bnK<3MS??fN}^j!Pt=12j9K@Vvhkd7a^t&@upoe&hw%WjT)_&4HZB8`V@g&m z&scZpJmXzqqQws(tv&c3XTVR@R#;v>&=E;ud=^oU%>dO~y= zj{|?3OoMeBqXFl`1`P?{hFsI~jDyk)R}Q2yJUMWVF-3@BhXTV^hW?Z9B$yXy&frxr zl3;9LpTVXeD#5%!M3jNmYkFbpvBGB&KN}brI~bUm8MZJjW>8_+%pk$2^e#$=f#Jx; zsm>AVCF;Bd9*mnAI2arnm;!c0Fa({M9u>~!we0cL)&K2xJ-f1G@5(JRb5x^+WuNan zQyLzgR`Be@pAVOe^u+hZ>^Z%2${ruiO?$b%%dC1I{eP!(U;O|7Zx6o8&RMAC#lWAd z5FRCPJ^sb{r+Y)gR?W1CS@AJQs4xUH zHq@~)NC+jUGd1u_@)_QWS8*!{I{Kw^@+nW{wxgf8LX(#Uvv{cnFI!@f+M*+7!p2a* zsCa6kSh9Lx#nnmAWj$Uj&ReqAZ{6?zD|MAVGV!QLe`HfSwzj_h|NqynVumsk_9=D6 z>a{etuDy_P*m9$zTZQh73Kj+S2^>BQk_HN_vuC9Ec(L<|%usMj3<)qUOX6jfOSso+ zlklBoUg8F}v}DD;J?Wc^X4QshiKRYfU6a(t-L|Ndzul)79e=|EYS1e0CrpCs#3M+tT39PcCg2Oxn zAo=%8U$9a0{?!ve^)CYhqtHa3eSCH69H9Bv&?v!Jrj%cdvHmhC|dJ7?yK?fk0I&e{D(O0ZRrTeIl{+XU&S zMr_Nh8K-bNBnL)FXb4Em*`f33W6hQD-e+nW67$vyFAWyeO4oW(hXhp_y7O@eM=_)|NsC0KWEpL*K>@I&fv*n|444YHVw88*z}V{T?TpxM;J?Ofj;7#Ky^RD5*;OSXZ)JQdXH-%c4na0t)vV zQi?dwu%)rzbtwJpbcrpwBj!NDZRSmEY!AX24kR=jsA2@=UwsBP^I+{(X#Kl@fl)0> zndRnhc>DPQ51RsSlY zLVq*Ui*xR-u`~P+ot!E8Xx=Ony9@J76+IYsupE706y@5?%;2EmV3K`t2D3ziXj1JQ z9!Uk^hJy^u96W3b*clGWar5wqI#?Yz5X$tGt?P#bJA(jovO>Z-MjbZB2@DJgj*QG7 zm>7DbB}6oe9wo3bTQD&s@HRNGv20*vNB|8lFf*|3Z!;I3kyNDCSi{u7&BVaNz`@{{ z&%nd5qp1Gu1@(LWGgyD|O)yxHRCtQ}jq>@=PKE1Q8NM7*l|5u5ad4f*(f$AL*Df}w z5M*GGuGq;TC@8r}&a3|465o?wjq@imo?-jkb;Hj^V7AiIO&mdn>YyUx|JVBe|MjQv zi*jxi?L73eS~WulO!D% zZB*ClTa#w&-S_I#maN!0%Otmk8B0$4G)t;}%~N0B`>VY*x9%yt7FqsZ|DMICt!7rI zb$0ja>O~)y%i3zXx>sXYz}I!4$~^W@;rqvZ_G>mh+jM8?LA^KDl3P@*|2J*gbbN>Q z|L=u@O>PSsCbk_s#n#y-&%n^U%$!GZ#j^CHk&DyZqHfIKT9_`u%ye{y-*HzNrae!k z|11BI=wMWxp^)%QBKgqs8C47!5>5|-Bt#uFW^gPJlwdx<)=R#x>8;jw z>D45UU9rLi42$?OUd*-W_VHeOH9D*Q61ZOf|4MVB(5m?V|9_okvQmuk{{I_Z$&130 z*=YWSg~W)YA^G>~semoa^A|b5+RrPUPVv>Pg7tqbH<%nwU2HO`-PMhiZyLh^rUp^3 zWRt|*KF9bb@GcYH!T(I&K0+$|kOHDp0DLrFB(qeT(mkpC#FSASvx$1Ui@{7%ybH&P|Gp@V}-T&>kwz zHeP!C_W%FC=h@C!9{9oi{})fxXG6^!TtWsCJVzZbOYj|Gcr3_uW>SdJuYlvHHwT^T z;c=+*5uWg+NBPiMpOSSm&uw4C6s{*2zm<2_a%;u$`j3NWcu;3-jL=51!+ zP*OZBrJ+=EWlO;fRGv2p+Z zzy1HOU>B&U*c38t;{ShMEk{JI1RFgTW@e>If*Z}hR0+nxX^3U$HbaZ01~1gTesXYF z2{a}$o=9NR5|-f8pYb3{Lj1v^8KC?t$p1wt(2#k5*8yn$RkwY%MHD=RW75>Xz@q1< zC6STzbCz#R+)TEXTQi~<7fIM2cqoyQU@=3(;m!<&1{DeJ1xyVMHew9DT;kR26)Nsm zmh`Ebn%N}YP0{TqKMbCN>?=kq~InY{{^mq2Jiq zpdmIxu%W_%b%oXBvWbR{3L-CjI7Gk4yge6gaD;o`>N6Y%EG>l>{+P1+{q3DPy*u-M zZ+9=7C(+}r6WexoN8Q!RKOd%eD+_j}N2t+x_Q5 zrcBejeEF&N^5y44Ri{j|z7bZn($h29He|_?jr;$6KL6Fz)AMZJy!g5$O_Pon96E09 z@9(d(K?Y+|F`-5BV@_OBUvS__HSruC z!A=LmeL4*XErgj_7Wn9Ykn&V$NNQkhoFkaU#^}Kzq0h~b&?C{XK!D+aglvI<5AT6P zH;UO=0}Mo14+sb~HY9K{JMgeIR4m}!q{qg{JVD|iQ$qrSFk@%J9yU$~1qmf)1qPM_ z2M(~aEnv`@`fY~+XSYC4q?q3x|IBc+Z$x}M| z|AfL%I-8$?J)Z2`TTMnTyVzz(>suJPeK&;0Q9R`YIY?pwdzd3XK)|3CNtzY@csxVirSFYW_OruF~l zo|=&%BEi5hnQiq`J)hd5UTf*IK8(KcroHn09IUJcANZEpDP_Gep6dR`U_NsxbNY{l zgBK?lKFZ)ZBEz_B0*{QtgoJus&qWdQ}n*)>-5t4 zCCmPQ`@bGEP-LYieE`^AO@ERq^*EDll) z4N3X>?d(L%S_BFZg7xp~_Y~}y2JpcdyYcT%* z@2@9pwiP};MBCz%a?|1YmvWpwh}G zq~*Bt#S;gadki?|%n&e;P+T+Z%)b0hLPDDuU0rmWuE|b6E|J_3&%p3uAMf!`4@`8_ z*;<=7>P8-zu;7hH$D4D;%^cI`xs=tXww#(dS!~kz2P$$-X_cI_wz0Hwp1EUf-1Fez z<;~yy&c7+B4CL9?raJjT3)3NqX=~nihfVOfyiw06($1JEdC8{Q&XnI0az<(Oj5>dt zK>4?@?}u)J(d^&J0nq%b@A_f~|7Sf|{yo)p=6=FCGZq(@jdDf~eIFGzoS5dHabRAH zhmBv_ng@rBn-YIqoBeUeoG#CnDGn1SowNDa(Z=D~aYE;0SA)D|O9EG7$2Vigju(oZ z?K*;r)0}1{?&20oTqWfCv7=2jvBQn)V6zFoWb*~Vn-_eKMP$x-RhGM`a&nm4%@iq< zfMn&9OD3gxa!E97N_%WMp&?CPMKWcEM3ljSJ13YgboIFVo$_2@l4hMC=X0jyUaaYv zrDt0LE}RUws%dy8`OJaqGdm)ua9uDs!78)q45Kq+q#8r&#b^fsft4xKTs>B;%nW_C zT3oYU)3YL~sc6CLw4fzj)mOI~#2z&ah$!@#a?5O)_A-WuFm9QMw7D#6w7b6QT@Pc5 zyGH>Pg*=ZQLJgY3^zrRcTEse>4 ztEB4JA2xXFktMg2*L&Szqnj(Ts&a$&7LsxCt8M^doR?f@Ja__XKrmME>SqkRnTst}p@~?%LP7FzLQ5o?L4sY^fA{bB0mruLY-{ zPBAg#Iy`f7bk3QbQ?{|!p3OcdeC&_SIqxIC5A+*v;cI1H;K9S*#^f-8%RpVI$w`RO zVuqH9n~s#g9MM@k9o;j8xx58ut14MF{L~aIJ2P2SBj==G=y_p*Ic^m*gVsnnMV9d@ zhPqE$!h@P`8^-o8Dz|dGDO!x#5ep+F^~Uf!hML7S9UR+_^NU`DUbr?bHRg zL4r|HIVP)uOD?LjZ`xFlyEJI_tWec&Mt)MKu5IpJGEpUJS?>kSNoO`x#`m&H&h(w7 zR>Nx(49dUr7=DUYu3-M-T?Ea)W+!h2_J8*Tt)B#~zfw3W`tVWDs|$a8_A&(aWNi>W z;~Y@M`{IJnkNbSZ3;p^6doLQF`Q*nlGskCLevh6D54-hIKW1L*cT{ z3Ljd;V`R+rLRUtYhvC4{>5M$Cg#l~~Cz}%#iZsqh%s4cena9(VkAY}FeIp?}Q1#as*FFiXZ=iTZlFZK#{zLHqH=3Io(ffbul z_05ZFkGTe9C^BrE#H_-icrkGKz7wBBImG0&0#X*VL>7qNez85jEO@ENvFU+&^n^PBb2MZcjI7k6P9(lRGPO~OOLp>4=W8wY3e%H&R%OjA zs&jg8tuI`fzMdsN=z673Ag5;7ZH=<0Q)8E&ns-ub@@j^2_d9D=E?FaVJ1?Jw4W568 zON(&SAEbl;DE~6>e_&w9WME+6faYHY2F4`}3=9ekkoA+JNraRTrL)@6$f0w94=(FQ z^Y7q_50YIontw?Svf-p*H2)6q*c{EjLp%a0bN*=lr7ZjgT=!`H9q=d^NC%AO-+>H$ zD%d@mf2k0NL)VDW{5y2x4(#&L{0k0-kxGo_-yt6JqxpA;M<8X+AI-m%h2Mbd9?ic4 z9t8vGfYJOrkfBcnyGQdc6#{YS8ZnxGhi=?~T|SzB!ND+6iP8K!#AALm{|@m8q|EuF z`IoZr8*tsD`FFshU?3eZntul}^r>L?X#S-_AP!w4M)U8`jXSW*NAoW@7)B~Fntz9Q e%#Y^ZAs&I0Ie#?&QWky#u6s294tNv{qyqrdlJXw_ literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..054883e08f007d163b41e33fe2ac337fdce3f26e GIT binary patch literal 27943 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 TzXKWiRIqzA|570khprI-O-*YT literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..24ccdf4486ee31504c02ba021f5185ff1d95ca38 GIT binary patch literal 27943 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bd3c7d551bc1cdc5aba65a670eb108e8e5ba73ba GIT binary patch literal 27943 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..17c71cb98e4ad3760c8669cb130e09a54be43dd7 GIT binary patch literal 27943 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 9d1f603235..0c100440a2 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -4,6 +4,12 @@ const cache = new Map(); export const soundsTypes = [ null, + 'syuilo/new-eca', + 'syuilo/new-cea', + 'syuilo/new-aec', + 'syuilo/new-eca-oct', + 'syuilo/new-cea-oct', + 'syuilo/new-aec-oct', 'syuilo/up', 'syuilo/down', 'syuilo/pope1', From afa9c1f6f074f2ff1e64b1203e18446700103010 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 17:22:32 +0900 Subject: [PATCH 053/125] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee941d479f..f0887dcced 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ You should also include the user name that made the change. - プッシュ通知でカスタム絵文字リアクションを表示できるように - アンテナでCWも検索対象にするように - ノートの操作部をホバー時のみ表示するオプションを追加 +- サウンドを追加 ### Bugfixes - 外部メディアプロキシ使用時にアバタークロップができない問題を修正 From 39e41d74249616ee878425cf43c0b22117303c84 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 17:30:23 +0900 Subject: [PATCH 054/125] :art: --- packages/frontend/src/components/MkWindow.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkWindow.vue b/packages/frontend/src/components/MkWindow.vue index 7e53507f2e..f7565ca59f 100644 --- a/packages/frontend/src/components/MkWindow.vue +++ b/packages/frontend/src/components/MkWindow.vue @@ -465,7 +465,7 @@ defineExpose({ -webkit-backdrop-filter: var(--blur, blur(15px)); backdrop-filter: var(--blur, blur(15px)); //border-bottom: solid 1px var(--divider); - font-size: 95%; + font-size: 90%; font-weight: bold; } From b39256416581373d7b0b7c6902a4a8d871a813ca Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 08:36:06 +0900 Subject: [PATCH 055/125] Update about-misskey.vue --- packages/frontend/src/pages/about-misskey.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index a49025c920..a72e5bb4c9 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -121,6 +121,9 @@ const patronsWithIcon = [{ }, { name: 'ひとぅ', icon: 'https://misskey-hub.net/patrons/8cc0d0a0a6d84c88bca1aedabf6ed5ab.jpg', +}, { + name: 'ぱーこ', + icon: 'https://misskey-hub.net/patrons/79c6602ffade489e8df2fcf2c2bc5d9d.jpg', }]; const patrons = [ From ea1cff499a5a40d24a671e0352d47234e318b64e Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 08:36:15 +0900 Subject: [PATCH 056/125] update sounds --- .../assets/sounds/syuilo/new-aec-4va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-aec-4vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-aec-8va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-aec-8vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-aec-oct.mp3 | Bin 27943 -> 0 bytes .../frontend/assets/sounds/syuilo/new-aec.mp3 | Bin 27943 -> 26880 bytes .../assets/sounds/syuilo/new-cea-4va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-cea-4vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-cea-8va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-cea-8vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-cea-oct.mp3 | Bin 27943 -> 0 bytes .../frontend/assets/sounds/syuilo/new-cea.mp3 | Bin 27943 -> 26880 bytes .../assets/sounds/syuilo/new-eca-4va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-eca-4vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-eca-8va.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-eca-8vb.mp3 | Bin 0 -> 26880 bytes .../assets/sounds/syuilo/new-eca-oct.mp3 | Bin 27943 -> 0 bytes .../frontend/assets/sounds/syuilo/new-eca.mp3 | Bin 27943 -> 26880 bytes packages/frontend/src/scripts/sound.ts | 19 +++++++++++++----- 19 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0c5a4fb15b79db04e4134a7bcf9fd3bbb6ac9afa GIT binary patch literal 26880 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0842fe004b9046fae5d4b216be0b4e65a2e370b0 GIT binary patch literal 26880 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Ψ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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9f2ed857d774e126fdc3fee0e33fc567d88e0639 GIT binary patch literal 26880 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 K4IKr;BLo0F+~-jM literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..59a355f563d84af009b34f9f0889dcf28a8f8b2b GIT binary patch literal 26880 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 P(7-^?Fmx0Q=@0+_2Zdx1 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 deleted file mode 100644 index d66406a95429e31f0ed34f0de5a1ade242b88ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27943 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 diff --git a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 index 054883e08f007d163b41e33fe2ac337fdce3f26e..cd4b7a50acf208d8444ad7c427c1c58e702e7020 100644 GIT binary patch literal 26880 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 TzXKWiRIqzA|570khprI-O-*YT diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6e9fbacfeb1af58f913c3edcfc798ce9189eccdf GIT binary patch literal 26880 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 E01jN>^#A|> literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6fc6652809179e4a2db886768d6c9d96eb4df4dd GIT binary patch literal 26880 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 MdWNB+VEBaq03qCiqyPW_ literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..2df97a1a884a9c55dbc801be4ea1498cfcb0c63b GIT binary patch literal 26880 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 diff --git a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 index bd3c7d551bc1cdc5aba65a670eb108e8e5ba73ba..16581990ea3b9657c924a51994266255dede5db4 100644 GIT binary patch literal 26880 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 YuyQn$st+_*qHelHY`-044ebyB03D2hEdT%j literal 27943 zcmeZtF=k-^f!L6UhzJG-1|9|m=91Lhf_w%`V?6@~s3;c$19MVAE>z4Zz?Xr6fsKKI z8KNdQ*p-2SfuDha*(b3q&D28A+)U5VzyM?{6#xJI1j@oqdFG|%LyTdNVPMEPz#u3n zC?zE&rL3&1qobo^Vq#)zYisM~=H~D3?;jBn5s{dfn3($dn~+uJ*B z+O%o&=FMBaeEISX8#e6RxpU{CLx)bEK7IP~<;$1v+`04g>C>n0-o5+&{rmU-|Nnzr zPRybsF z)AzDM#skhny}1)3&NOuJgfe|Nn83}$-N{y%OK9twJ(21@a1nyRaMm_(&yE#^psd~ zSGD)~ltmKLV(V3BoZ@A%bedYfhyx~1J{~k2BC~!4K+$1*sW;@Gn&}j zX?dURzk%ohep4})asz3G9s|PzYYe;@_Zli5P&JTf$TGNpz=Vats>(mD`c2l6wG0Zj z$1Ke!3)-4CKEJYE*XW$ANzjEO8$`6qR_8G8+QFti)8b+q%M1_2_HNzj*AgEt{e6Ew zH&;hfi^9PG0|lcQ*+r{A2d&wC{`j%R(+j3+T$!i((EHWLmtn=B+wcGT|69?0s$7Iw z)nPH&-#hpJ+7Y|D{rmr~%NkDJPMh`J@1IsfYG|KFW4Wty@~=gDM&yEdET=TC5bzQoA> zZ+6CxYuo?7@Nx8YH3n4&p`&2HLI9k9IX=e=yXMzE0O#Ka42(Rw24DEUJO}091_lOD zGr%Y}_XkIUD8sLW5JtNM1BQx(Ni7o+Z*+Z030cUJY|<~4*v%xAVAS{~!Ji>5!ML#_ zp`+nTf@8yi1epdKE`}_z2RjveGy@lIy0&9$@yhJ>%kPb4l}cG>R^B-N{_C>6@xlN8 z|IPb!{{NMP5JtX)_J*E>D-4Gcy&FrC`q+)q7MyaZf4^Z(YI-|c{Z^jbkP}(8MPy9|HU1ae+?oX z?ir{Z{A!TQbjx7f(PqOmZVi(ox3ldd|0EbB@oYEv!MexbP17tx#{+AP*jVEYZZ*tf zWWJ`t`e4q3boS{?lXO$;WoIqk*V39CqO$Sj@qW!J8PCT{e0EM*D;wFDxBq>LbH@LF z|NmdzTmS!pj?w)Wb|$6!{k;EwP2bndoWsq`G=syK`3u)#)*S+yxkI!L%XtO`KiP3$ zLr@@lY`!IV>Pl9~RVnI=rG7Y*MW`D<|4WxByc=gEe55A_)wceFPUIuOgj zbmo8rgQR_H0|&F%vE1~t+(&*sX7RmflknQ(D|46U@3nHL*6r)fT?)=#fB*mgZ*~9Y z;ridJ{_p>FfPsO5gNa81)SaJ|z|_c-sM4||iGz7Z!uqCJDR0*I1PB^gNyI;RKV!wi z1@q-5-;nN4aoTFb!x)gvBa|T8Q!U_phH*mXT?Q%60|^Hd7*}1AVDsg;&dhp1fJdB( zL4uhfp`xa-T_K2#(`mnC0UHC82b*n6fdnguL*fL}KWT?+#42MxFf(nKq0h{4AfkfB zq5V_Ne1-QB$p!D&&zP{h)82nM{c^yPP9_Gc(}#C-)i1a|;geRFI+x4Io%{c9x?FGI zGFN{Bqc^{5@e=F*|No1z_}=-sC}X}!0RR90|Nn_G$TKl7aCi{oFr#T!S6WO`Lc%KY z06hPar+rk{&<+7`{^j`E;dAslH2*$eVC21P^oRe$s{;%SCXn`X-s>kz9y2&FPi9Qu zC}ujq{h4V6>u1Im@no(ej*rFX^gRwWwR)`M5c-*WiTz`C9<63}5wT?EC!EQQHjEDw z7^a_KU^2ZRsAr(i_|w4aNR~lqzo|Kg&1%cFtlJG5 zIok~H9Vjr=Y`kyR{or1wvD-ABCAx+g1{q3|PF6E}NNYAUYZ}FL^KJE8wW{jb7t4$P z&)x@@H2?qq-?M1$|5pM%f*}4aSQbnih{712e+Rxm;jJrkYxWNpj*d36aQ_!*#}OGY{uEzRSIM?(*+Ull%W~|Gy4O z`Tzfa7iBsB|3gbOh<7a^tRXDHg`q6rM5B#_6l2RjhJ~Fhd@Cp3^K;z(^RMSWufCPj zwyok^t`K6`eooP`Sx1nwaUSQxhCghY$A6?P?&#rU;InDm8m>5XLfrB;$D+RFH@Djt z?K!F}^zwPRr%5F9o8?PWrfsu&9c1gb?N!vpvQ_I})z`278(sgeyYIoK|9^aa-2dnQ z|1+t6vj4Yb3dlbV5^Z$cp zi~c{j|9=H25C5CYS;EE4u!7x~!GrZN^Bz%Qh6Pg0Ocx}QWjDNhtdhMa`C*7NvlK&X zF!LT8VX+q7&CGWMf|>5HFJ@+7VP?o-EN0lkY9Ju+AUmN!w7@}vXJLX76T?w)2Ehf% zE{zIF*HjIUxt^FaL(h;wOXJMGyqSlce(vH>Xu2FFmAPzI=7QGC_1_#>)%NoLkCF$u zY_9jGh6(lm|17Wz5ctSE^~anWwT7&wB4>6SIdEvzpa7%!cThwF(T-qXU=Vhnv+;&h zf`9}M1BYZAbAjP9-XCJeI4s1MF&$7!<7rT36WO7WCT^kfEU9rh+d7ZZHs4b{><&&Z z(%2jX-B>e((xN|XcH>+jv`n!9lz-J5xS1M{ysJCF1gd`zFfa&Knv3rJ37J1?U| z!C;z%!@(Qk98MZ)EDk2DtPB+rY|M{!=5jA%Jg~+zLPDG|$&O(G12aR8?SvebaHr=k zuQX++y<2F*d7zv_!-ZX;fKSL`rio;xY3|M$JGd8{*$5aO^O>Nmr1Q+}sK~Z|j%QEo z+?AH*@-Svbq_Lq?>*uiO`uwS^CtM_UWX!bK^z+frojabd*z2jP8oU@(n7HhlIdjjx z7t$*({A^t0dc^+!$~1$BC1+>NX;NTdyVvQ~d zMa>Kenk}!Abf@rS&hMF!z|iy};Z5_Bgd*Sk7Fv+G9_=nxDE=m-Z!3&qeQU`G5WT|Ns8&|NsBL zG(BvR|Nmdh?jvS#h)zMH3Wre$fbuT`|Cfb+R?YP*4uJA60|TRguEj0Bx+SpwuaV&6 ziV#a<;d8SL5*+3lOks>M^gLi-^iWXLNW5jCk=D8S_Gd-HO%C=hGMr>)}vkDdn80o65&d<9chEqQT%*O^lB zDX$jwbzRJrwz|DiW%|7>VW;EP|NkHV|LZhnMxnH{{{Np>Omh*`n)m;|?a%lxGcF3H ze6Z~0X`84qyHcUt>SsFx-@=K9@-B8%v2E=3-zFpX=5 z#LNq9-tLY4JPyf?3apX`6CP}w6PR#gL#WS#bBzo)GV~fF(5?A^G?7 z0Y4Mw`k4;U{LA;y;uv3D3oQSdPTg$EXSi{*hk(fr;b%<-9S*+@g}Tlgyl*TwSm~K= zS1$e4Fqd6lf$PNqX4X9i1eha)STY+7m<~2LF;>W(V>uxr@hK{hPwB{|-m_j0vz67N zJg(J>1TNX;D<0&xCGXbsx1QPiUxTv9|NnnoB;Wr3w@K^%|Nk#+H%Od*ZV>R~nCfIh zq25)V26+uR28^fD3>lqx4EVX0*smyHGAuc!XQ0EBY9Msb$$*JrKQr?Mfs4!<4a_~v z6Wf`>Rk+*So?c?{Rj_B^Y|=^UJf6KcI((PkQmc?DlP1NxuiC!&|3C1c)NA$V|NjF` z{{R2~a%km9;J_qUfSDst z*5|4#o|RLBvI8ed8ysbwA);uokRIc<^cU^_xkj)&#GvIwo#l{+0X*nt$~~U+m-m?gh)gS;wX0-{^F` zw%q>a@SNMTZvWUcyYBkGK4lqshK?UES=gUduoNABpe)DUDELW!#~Jt8elI;FjwVf- z@#pZ#89NvgXE-N$OUzb0DdG2UorJ&A`k9HVWTpQbW=QRP>L$NlS;k3b&P9jWIWuQA zs7Q&elKfFHV}_EXU5aF#gM^**j1L|&S+r)f9FJdkp^Cw#@TE+NGsoE{#u*_c8`l=3 zvvy4~dByXBVWY7_jm#7+i!-x$ghWMBJ$boUxQ&9-ze@?OWP1i!|dPQ@!1i)2{ZMyVe^uv*+HF zWBFc-BTuDnRW-UjX=Uk+v$HPEHeGuC)#*yDrH5wCF4$TI;k1dH{=+cI?!kEk?Fm` z^^V&{zq*_a4I6)0Enzm@!EJm*!f1x9;T!=Wk$^V|0YV8D0t$>5X0#+ZaF$OBjlQ~2 zd(u~wYM!O?;ET52;fw0*n>H0>c`Y?JSruFpHb<(!4Yj6oOb_xnqy&k!WcSUAFj!UD zP>_;zW`SkXGJ_UYcIQwjZ-oGbK&E3IAp#pjb$0Q_t`}F~3Q(NL$7J28KciVO+K!1U zX$!*|{RQz3I?Eg#8#gd4NDyTdYA#@T!8zxIhC*qJQ-&ymOVU=ZGom>Rj%C-A+L}FB z%#0acH<>yzi=S;WzOchF#XUsP!OgQ+n0Jyx)|w{4iEM77toq{7mF!36ikBn7`ru}q>^Ebt-ciNN|@Nqe4Dd?0xQrbD;h?~Ge<>oGi1-V9Q zmnL83b8hV6YvxKjr<5lY(s4*erlCY4z%1hb9C-wH+e4JdXT*AloDO#)SjErTf z?3_(YXD->ERAtQTlAzwD?zubQbyR4mR9@emq@Wav}D?$P{9g+Ls-MvUg)p&NH#myhOOa4?KiVl@8_@t7aY zze79%DRcg4{-rGZ23+@O{vGfr7)S?<=HGz~eJa>Jnt!Pfh(p(i(fm7f;|}cd(fkVz zhLK8)=HDS6^P~B9h({o0&L7Rcl!f1b>mJR&10Dqf>44GvJCLDI1-nP{FBJlD=o&Ga ge}`_|fn7eDf5E{pQi;+0JH%stH2)6q2&ByU0IvMS+5i9m diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..99f9361a31e8bb0eb4b475caa8fb8556157fa50a GIT binary patch literal 26880 zcmezW`w0UB1Iu>`C#d@>p`>OQTPq(}7b9p7iEiYq|24|I9AeoI?QxJkz)gPG0Ef$!=M3 zXonDUgJYrOhMEQk5r*BZOLP`yFgWY(;$LC)K0U{_d`-!bkZ!>a)8mDIrWNy8{{R2K z{r`KL&*vshW^fSrP$R=rfAB-?zu5om=Q|F5fAD{WVe_+7Ow3~Z?LX`o7)@R_-!Pe> z*4Wu-AwR>mt+KP?#EdT!Jtw|onz5+0ajN42!giExJTLp!D9k8&&TkUUsY$Qx?eXd;C-9nMCpb z|Nr^_->ZB+S5=LnLGi&43yJ^D4}SmI{f~dXVDtNf{{xcQ&rV@s(~;-@P$R*n*uW&$ zpu$nioS^EU!QI9%!%QtLsHjc%Nq}36Eg@dqHK$hPd zH>RoGd(*ev2w{2bo*KI0cT`&5AJ^N{k39KsHtXY@jprlYZ}__+Z~o)j-I{N8b)(|% z?fm;|;@%+tJ4^Pbt&QKE9)15`&0)Kcjkis%Tr;?~@w(Zy)Lo}%{e9QO^{(RSKD(00 zY@Rp8+sto#uKtC;X7?JM$U{(bwM?>+DR&GR2mtN#xL_ikO={QpmB z_V&a7Pwm-}lE7mWlVHH(%)nyH;34pg?SNN9fH)7ML5|OvB~N*xPb}!=FrM6d>Xe7i zoaAQTjoVK1{79JW!{ZR)6PjS-2S6kx1b&-lgZp$rHmZUm42yK>@ zYhve63h9_9z@}mlAJCvSWx9-2KtLUBC0>!&z4! zTPDxjct7!Xz+L-ezsrJeMMZ7dzqk1JSLLcD^LKjIosHUGc5eIrKR?@QRwi%DT)8H3 zZSuO@HK$9boBqDbB6{cJ>6)4so32UTc%GBL@!9uJr+G}*Y&flZHsZWqwp`tZ`^LX- zzmvTuy+7UlxDGTl{{P>*b#40pAFr_dhn<-gYvIB=k(BugXVP&46oKpsJ*|yAjA0VkN!t(?*^Out^ZUr9eS82 zO=>$ibM2+biym!16a;fqFDvad+uWw1nX#bcqR+`?1^d1)csDCO)@(__7NJ=6D6Sx# z)vD1;x_bKNI|`@FPmj{8WDO2h+!W$_Q{C!R;6||}GcT(ysq|cMLMdVCvP)W7SxY5+ z!~;f(7@-zI6<6;*q_+m(4)SDLSJ>-W9vC6}#UZdGPoFzKb$g`kP4ky>|ELQ+b8am-fvZFRBu zgx0K?yptB?owU3b)Z4LD<=jkN4?EW)p*hLp2U%ZB>}c=JHtK%!`#=nJa!} z7;jc;a%1ngmN3b4w$Yg>TP_;TR9;l|?Bu4507F-gHIH0N^*XzHG7{Jr_`(<@5*U>o zctsep5|kTs62cfav2sNmGG)DS;I-(43ze2Pj;69_ygIwte{RnbXTyk&gAG&lvbA1b z-Cw*jdCiCQ$7J=EuP%G{S?-pE*78!t+-0}?RmGO9dAaq1$>dNO*V0ze_fy46!l!*x znX7SSdT^v8>)Y2tOE-76TsT^a>hB2kQ*n@)Z__D@ESc|&&I545q9R%MIjOAGn-kXnv9+&J##vx zxYfXJ+nlAL>paYgS~Cv680P-Fn##cTl=jB*fcywk|N6p~D}!WAdgM z|5;By?#Sq!QE+r=MAnYTYFna$k^h=DfnspEp;{G+FZRuXgaurt9+S_>AJiyQ3?zLIR>KtrolYcG8o0!Hu(}8iP!-s0!3`Yi~gebN) z)`#yBGkBMAGhfS7d9%#^U{S>*DdjX7!^|+Lbz*Vnowj?6E__w7DCvxf<_vw670gGE zez$Y|^Y^rC@M`t-iYwB%WVg+ly7;x}R{xXTIrCmmU#Qsec*=xZ>2qrSyt%i`SJQsK z*OgxhTaUkP?wNk|(Y1TFPuIV#JeW5xr#I+v0f7fV~) zy*e)0$v0*7Tb-yoxq6X0vZZS_#fRKJxxlJbD`=5tt%C~51 zUyF~+YtDUTG1t;&!<5-aPn)%^ta0s8Ug2?b;-z)R1dXOHW{yGzk-Cd5<)uX8Huhu84N{RyjxxKMmDOJDGZvE748Ikzb;qrkO%YbFBUARR z+&CQ92~(vacY-Y%*?M#p0Iqeu*tY)`qca+`<)#d zJFl(W88O3m!6(1Q!<#!;f}HgeLp-#_cpirf{AO74;=#1N2bSFGR(!s~%g;e;`hC3) z%PmUm4_8bJu~gBuS~2azhd-VV<0i3+R?qPa*}A^N!Jt4Tu|tT5(Rh73-dCINSH#T=-LpP{2e64DoC{Z-IxlR7fOf8c=GsRYhb5ESo z<*)74YxuD?@S4)DBVBwt``T7N(7d??lz$By*mJA)vX(Y5yj>r@VBH1=c`0T7nZFvC zAG;)ewhv(F+*+;1W~WuqGv}9*C*$Yl#A6@lB|H@u^~_DY=H~0YX8v+Rolcj#hI(Qr z*Y>w*C{Ol29`g8ehkNRIql!r{B^*Tcm^*G58tUt6$z^lCsjJwqWtvFg(l*f->8$-i zd`?BDx;CfY5Kr8ke8NS2AKyYLk^a*U6s9Ro;5*WOGJ&C_E>w_{#dzY6NpV4+?>zEa zy0*rNvAI#1$6-Q(SJDKz?6#&Pg-b~tVzaVWcE!wzIiI%a^5xQxGRrROCq8@hYHgzm z`|2w?9fzmPkumt6ax!q~lM`FLcEt27395_=$?Wfb)wfafno2-n>KD^^M!&O5d{^Hz zF#H(YlJfkbkO%)9X+HCw&+HmIR(WUhZ8FM=P5Eotnc}7Pva?{DZ%&P&qs**0tL5@@ zoUHXKCm)&aafo4MfsEV1&d$orfX@;B$)At5F4?fSSI1zzvxQE@gd*W-A)&MN4(#Tg zE$5_Y`=ONM!jigpMwX2{4P`2J-VDr(KdtESP@L0$WYVYU4J-@{I%2#U3=9l>4-%Ri zk0g9zI+38v@*?rZgc27!F(Y`jgnY->;kXV$q33 z;nDLJ?9wXt^yw1*Rw6Zt_2{y+1l?B-cYf&y&%DW%n<5x=a$BP22iV1Qo3Ys&F6PC}K$~H%G^<&+G-+Pz~6nZ!p2=rJOEbkF& zaK6Xjs9-2Cfv+i!Iq~32hX4;Y9#)0}0=!n2nN4IFG#9TqqT8s%wnTuj?_5Hn;N6`u zLCtHLryst~+N`jE!Mjzj>HD&mv+o*BblDcJCcXFGo24td#5q6J?DLS)-?uA!QMXcO zY+hB3J{7Hb$tt5s>q4rPSIQZY zxn|KblQR{#(%1bo(&C5I~(3Gziha`bhBXvlV(E-qh*5)!^?eaSEW3n zRN1Oe&x%^Ytig3Od(G3kbDu0T);n$KlX|i~)o@mJ;EF4m|9agPhisa0W}C5O&*@~N zm8B+Lrh2`uO9N+b*}m%1 zoIPv-`aHrD%6K#;T;g#q4Cu+YTGLlREPmuRvYY;ob z>LBRDtiXAO@d3N<2eTEIoGxk@-;23)RYB4rOglDR@6CHv!)VnU;WJH z-p}dP)1OX@?|(nP@B8_Cn@-36I=^=P|M&HL-*^4LdOTWq!3QzD-HWD0cc-qucI|xp z$q!v;7!tU9ST0EVa5Cuk@Co>x5o@UFQN3{ajA!D0UdB(K`r>XR@q{`a^+{q_#A7}| z=zIga1xLc=Mu9egi5Cth1gy}NRgesg_^80Do$yBM(wfx;S8`ImXRUgzFaN03Ogq%~ z)El8}9=pJ~w~e-XD#t7Io|H@C**^K@da0JLDU14|?ut5VCZ%4F4^^+O6OObrN|m0V zWoWX{>}J8#5_cgdrx|PA%`~&Pl!Ug`v^3_4srN^6mo2h9=A3cGdF>iWmj#XtoytkpTsgM5zEIXRDa%XIlZ({o?`T*T_8Hbw2Wp3u6EM;;!*qAQ*q z)pc}n3Ohexg6^RsA73lxU2(TKkt@|vy0uwjidd1k^7aWFr?-R$2o{AN)sA;N*(Cc_ zjY-ShL##{PW)X8+bC*@-mZm8Z3@n0{tqE)m4Za3^2Sf}c8v+f?9RmznIyRf`_9a4_9=xMJxVP?Bq%8?`D_jaGI>bvo*bDn-tDgI`tC3&S3 zlz%mOuZvgNP5zZM;n92dOZ7fMvQJ-qHM;P1Mc}|zB$|zCwjr< z?DeNVw{DraJn}^Jv3W7Sue-ec@%6=b9`G$KH0&SeNDE z!=Zk<|8m@`3nnl3M2iPDw|4S}t}}P;o^&nPJk;GdYw=h1=P}o|tcW;1Kk)EUxAcsh zyOU@5XB?bTux8`M)4pz}x5(woy}D|uzRvAsY~jhhVS5Z1IFyRH4)8KE%u0}L&`2<5 zSd@_0v>=gFFfF@Ck}vU1^R~o|OrH`u8guH_&;I7taI%*pCOmRNPIZ|{lfcIBc{4@6 z@7l+0dHRLN^EXK$#w%W(le7M{aL=sEH`^ulXfNoTz5ev)>`Y_7%@elw+U)$kuJiWC z*B5Wr80a^rEiW{?WF{c=`JK6T&f4nU+v0{XS2|`0_)nK#w)g6S%*z$q^cJ&o3(2jH z$!ix^U9&82RbSdw_gDPqcCO6~*w}BkxZSJg+=ZLF)eYudY}R-fnY?(~tlsGvHur3= zuFCR{>Ake;@#Lztl~&$stXMb{4$d~3$iwe+<*>xj-aEca4*sz03351b@C54_?gIiM zEQ$>*YjnRn4%z0YzQipxr7W>@cGjfdC2@0uGQwoaWLAFZ+44vC)^?wb+7~_@PW>yp zE-F)U)$3&~AA>&4(Lb`Vt!I+a<#TFV^7VZMeUE6VTSTwjy*ljb7e$^A7iZ7qJA0_N z@NkI2fhE)4zx-J{J!sl#SJgWYPgV*_Onc?Vb(~*HG@$3cDlhX(i>r>ow;U_>Obt4; zh;zY;%lw_`-6AHs9-RzxRy^wp^Rx!mFRZ1Y-(p zN^b0wJ2F@Gnk*BGK*HIX9&PLkvl4rfj=fX6l<-I9n5IHX!V{)vtPeQ2m;??mg^B$t zTotV_`I55HCToLTXSaIR?$Y;LX`;<%%@^{^EvioJZS=B;sV^!MH~s6ou4~eBwe+%6 z#mY)Q@karN-8>~Tp9@EsPhZxt?2)MO9NlYouddGeCD2xparRt$+C#S;4_65!1bLT# z`LplzO7GM~lin3P+0)VEU8>BQ+}_Kz!YzMNTjQ5GSqoOaRoD~fwK6e~&2c*vnW@*HBMO^JhdUCwB|3zItw|goS6P3IgTu^ z8w*l57zA8aGqKofEd9lTnVqw70~0sHtTT0wT30KsU;0uwFQ-6OZqwgovsqVa&$6Cc zATxhQMDLBirMD~N4-^%qww?;Udli&_Rr$ZGSJ^h#B`$dK-hD&<857x;ufB<1Z(!bQ z8+T~e2Zk3GWrsFDJ}mM)>e&3XwbND#-sSB+Yqxj1ke+6cs9NfuMUR75T3LI14|w|J zjJW&MqsmL$eciT9xsuLW{N#C4414n3lj_GN-u>aNt|xP}W#QM-%ffmoVON>f8QUcF zsH$GMa?M5P#2+tjr>7Hl`RGZwGz2*~9P1IE9x`|8^toNqF@6RnEwlFQag_IDKk3NY zHBWK=d~riBRi22dARB=zQ#U%CPDog|%qOF;D$V>w0UMt%a{`MPqv?#lN4dkC8wQ;t$(@UD-C9&blk`B%a?K5kO z&Pg!HNd{=kowS|A$i~93V zOA~JHxv=KG;H2-9OfD$xs`}Y^@8+Xp^?WiJYvp*(Gep-I8JlY5txfG%n-X1?ywQA#C~ppr&gB&$=XjqhH@aLqvS6;s z;@ef1Ch9HmU1YW@t=i+gf`Q_WP>T%<-;@RGs?Jls6B)`oO^GRv>$7&u<~9cQwh*r4 zoBUH692*&TXt;Z9d-5r6VXx`ti_hM!c=g)y%t7C)kEf+4UADcce7x;o_{^3Ek4?1A zkEHB<(rd!8Zr;A6@@*9x=O1pD(spk)mM&T+V`96}W8Xn8w=mUN<-zj3I)bwwsXpIb z8(N#XH0CMW?ISOj`}kg*UhE#Xs&VRXGyWGmWmRiE{2!X@$4l7XwmP-tL+~conl)E4 zGDWYXv1ar1ob{T$Ixo`5NNtlL)};7+r2GIyjKcm z^sbsY?~?Ti9*#UwKOK!~*(s+z(>uP4g*vBBo!TJ4u=48nnl-Eq3=9kj;u2yEGrN8? zO1SZNHoRby;A_0tu!E7C-Lm0=zl7Yp$i^EE64Jby25~d&n>vqz@~>P2yIbV(cU21* zUYxf0dp?9gdgDv(*k29IWwwgh`vVwswP&xJ!g=vItJKR04A;}_3=TrfjI0ia z94C5r*ffZ8Ezl8TVOntfzytvaAqG_rZiWK~8VojGV)}MXh55$<)&s8W49B`yPP{lZ zG5;CQ7RhHvPI~M~N{RcweAll@wfg^;<^NUj_WDx)KU;HeY|5#N>p_F|Hv=hOyFkbW?*FS;9(JE=45l#Q~1OXqSde=LV&ATp2@)> z!GmFnf(|n?6T_k79^AJhCh$LM5N8yTVV2SmR$i>-x_^ezh4k6Ns!AU_CszNP_xhFR zm;L`{?*B4TSNr1sziXC#EuF0Gwjbotv#MDY$h?>#Pc7W@b2?%Nyj{s^c#y^va`4rAhr_GPBUa zja?-(vx6=;nlGDWGG!K5mDQD#&oAvywG|J~61j3>vE!9R8FyB#HkugqKFG>cWm=a` zLA$g{&X-A!-jS1ZUhU0!y(~S*XUqJ%A%2lo7gtWZGV{%DT~YN=_O&^yHBGe^i!(5A zX{}H1aBIoWW5GqE|2pF!pq7lU7e(aZv#E)f=o#A)gsg5TBq{OqnemJTqoKvum8tW}uN_TBUbfZC&{6$PNB$cQPosgYvH$ z?{&?pea*L$Cp^^;zfkQ{By;o058cYH?%6i;S=So|?u|&CcXXS#%r$NwzB`Y4*RR#O zSDmtSi{Adyu9eYYJbr&;>|dDX$KFp*P6|CLzUSrFm0JpL?Frj*d%8u^e7?Ldk5WBy zc3lcz7sURAb?3oK?lF^ndMT-bbkKFd3taF!4;k=iSs zJULwZ?3x?u*X}e3D&JdUa6aj_YF{?%GWNVex9iuY=G$%xx+NaJ>uAW@)oki@>*T*k zZD03(^Tv%@kGk)b{JL_>;%%IERPO0HhW_p5RfR@N%wjXOFRagau%qrNXUS>P=}B+H zkFU>coiOKk>WL{=o_ws_ca-yEGY^069F1@OTrYVqZFOB6cuk_<I7(^I^5^Bz@JG&(B>uAs28dTH5$ zh!20f;;LR2WEdC-JyZJR+|rhwey6P|B}8`mY(1^1$1j`iShFePiKr5%p4gqQ+3nx@ zWcZzCZ+JfQ@1DB}Dk=*kj&>NepY>VHy5O+tH1Tc6u zem2@|HaY5`vFa!Y3k;oUzG%v$b4Z`qI@k=g1Wu-n_N<;V;>|TgEfhw{o8nU+2+QuxBne z_l=#3OS-R#^_}5gvZJ}`VrF2|*Q})6xc?**S%Z#dO<^E&@smV z0hL69q}2GB%8o1kdomYHFgB>>3#0(p66@s zY(8|TFzW~tw;Pk;tps;pPu~TCeCt%WMENt4n*zUVnb30Ld!feTPUYE7hBHq#CN|%l zYA}1=jQ-`E*BS%wCVh5F@pgaUB5!D~#?^57;mm?cJ>eJO2D1H)s~#Twv@oD0x=Zn^ zV8I+OPWRHQavSeO?|OXQkzv!)o~8u~9)}W+oZ7eJv*3#P6_*_qvga-_FY>hfQu4lS zeWcO6P3o`WK40aNKQ3cIy&BP_S=v*CZ-@FSKrd;|N)wa^BV?n})w>(LE<=QVUfB55#Q_wH> z>;312L}lgr)ir0?HMm5D+eIuaRCsb@#h$B@4?``(z4aEzELay2roJo7$Hpok!CX~V z(M_k~RI}-Wn~teYi*z@X>c~#I+~uX-hAm4KH2M|Dtww>ao4kc1ADnT@&!c`?k-r zSAs{G-Id>-6`uZLlg1fQ=Mejd=qRT|!;e1`H>|W~_@M8Xw;N}JUUvdAM#2y&CB|qh3+&8bso~kNhiOWIxSBw9fLFK;YHlL(p z{N@)5PWD7ReDaG|a^h(joB585jVu-Cs!R$zrf&M7FI8t@N^8*-L5EeRw2iLp<%btupaz&LBYf~S4zP+iV`2tv%OOFk|@>qum$x zrlfmTCLR*znX{p6%hTLRdQQQDJ=~$o#r2nDp9|Kpj;+YbHc4DI-TwWIa>r?46Kc`#4TR$w-HQ5@;a@X0;JHgX8{G4FY)Ye0rZi)>PZ!ng4t(tf2 z>cT_qx=#Z2do`CFHd%H|;lK@#t!tKbMp?}^)4r8|?B=YBdJf(~msFK4SiXGoa87=d z9BQF*y459jL%f)cyNZ&*;e?7Q0j*DOu_Ul|o%A?xFXbM`yqN(>uGdo?`MHI6_;Ctz zN-N7a-PBfDF0o+8j|LMzzZe%KmTp$(Ztg8JUM**v9P@@*KX)^Wa#sfTqR^0UW^4IG zEc2B*YchS+K>0VD_nK1xMD0AFw%@C*k?(hqCIt!<@G9EGe6BNG>%qWMezz zx;E9s>*AH08{;n5nVq?G`p80Ij>C&IP93~xm2KpH{_N`ImTprDU1fr7en~63b+*f9 z3hxnAR#VvQGC49=&A?ACvWO{S+C)vs1M15+IZ4Y4ORYSp7Nez{+w^1OBTGfWHfiP~ zi(2&cE+{kTgn7BKeOCM6^5s;sklt=Bj*5u6hYCDqc-)kDBz7`V)#51Y@gt0jii#d7 z3aCVA$wb61IUZ_ZGV6JQWOeQgMVa7$yhmz_a%Ouf9a5dA$9GHfZt%KIr#+rcIN0da zz&h#LD)zNo9Jgdna`91{5%EA#wyKqg!R%YS5#;%VhzY#vEzCq|dzu07r@Ft#sLLhi5y!t{Jp_Hb$f{Pj?NXc)h>B#=uGc!-quwf@_NmtOO{Iv5&{-5rfgl+ z_&Qf0S1M(qFy}Hc3$Ej9mERr`U{MG>KFQ*n#M~!arwQ&bR_oG>Y3bY{k|;dOV+)60 z;G^Cd>f(V@pJh5+POr=VJ-o47cOy2m*WEFP995*WW4n5 zWQ*xK9Qp2Zv0}+@mQS8zi&?MDTU^@Ez4*7@(p~C3 zS7d}{IO*!xmoY!hy*e$o+wtHfp{YB+iG4Z8nW28`i~-9evmUeFIqLrX>x<^d`F(Ng zDylwQ==Am3Ciat;oK~z%y&UiLbGrM&hu$eC7m8>}I%_5Ga(}k7bov^XlqC~)-7>h% zdc)(2+LzN41RmVU^XS`PH&d|4$yLmw!Ea+&N7r61rq7ZKt$1<;3yn)^%csv9vb_H^jE|I_3N9 zWaQ&L_N3!A^UI0iDk^~~9W1X!GdfmZSfFn>OL)Pti{irO?$;|TUv>VQ->LfD@3>0x z$J*{kL0*q)^42)%FEu{%^-wG%Zh8*UnKUFdYw=;~B;+`_b2!HqRg=){Q%=BP6hW~SJ_=5u?l>Jp_a zBHQTj*Qij@N+WuvJOx<||GKS|;wp-I`_kYiY33sb6w!$JUsy ze(l5Yc*fu46sxq3%!o7@fxp3iAu z)Nylo$y*ZgXHFYOX<_76jYX178w=LD?GIU%5*hD&;l|arueF(tGR5+1a@u{)tdF?;WtqvF z`7ukPCa-zz6=vSPcvk4d*3ZdOr(!|*_hD&xV9aiDmK%7;q+{kyah)(luUZ(DeJ8Ai)^xb z_-kdHCx7wYHJ2C4FVOhaCTQask-)=u;MLJ=&H%SQl^tbmnJLHYc3#aEt5rVq#Xvkb zI!xi{+KY*gB%Y*AU3_fCua0Xr(T$Uwmi8}PnW@m`>7h7RX1nycr;&2gS6X~M_FTh5 zoA2~1j&$YU7Z)sY?ESRSRpHl#M;CuJ`CihIf8xLBZYxa%ytG<%}j^tnntNsVICav@Qv za&56|Chlq$Qs}s3R?)L*rDYn&>-JYmD^+aIecSBUQrEEfm4wSj)x-t^Yv$FWYg8Sj zEG9j?CAoC6#INU}Ya+k&b6+?R>zfqTe_r4 zQdOa?r07n*_0*KAxFwITOV3%Tu*O<{h2ot4_ijy{Z04tqiZs7=?sk90Y3{M1exhCX z*Gz?Nt{GFCf7-Vn{<_lFdwD{~hZwy>o~1<-Utan0_|PLRfnTwyiw_>SF>7zorKILX z7iBih4t47haVu%~ap9L~#|())KaqvW+vIyL_N*{lxJB72p~cIqV$Dg*j1TJ>L*MQE zFk^4S-`#2}LX-X~HvKGH5q3_FHFHu2&AgqDXUsEU6v$W; z=VBGpqSCo$ZnwacB9ocUep2V8Lg$~#nttr^->7*L9$5-YIvxuaQ?7UuI6IwTqda@{ zO}`XHnH4(5$MRg4NZh`-VWDi=DY;X21$nE4xVCQHrm^zMWn;xNsmr~t&iIirQOY1t z@)Gl7=NH$M5)yY>1hw|vs55pmT5zlFLeI-4K~2p^n^m4JKD385eAn|sN#B^iy_vNz zwEIgN_tRSoqb({#mw9fSvHsJiPr{d$7Mm_nb=uUjWRaqsDOXR|;Rii8`&nMa+v`t? z;G4jEp&?*ijgx?s`clzJd|nGw8?+WIWazSdr7hNU#!S60sp0~Q- zcZy9&&UZW1QaW3sTI1)zT`N4au3fvaXnC;DnRdfzbG5^gA1-q8Fa+h_54_jQs%#i_ zYCpU?@7|!=zfb1nt4}H$|2ogLjdPi1zv7l%hAn55y5s4N*;fN@J`Ga8eCWi5z^gYM zJeP2^&5Uhn^EmRvSHeP2$dWfmh&6DM(!~1EC5mGAfE` zw=gx{crl|bSd(w*@t$kDsxC_S`Q&X0iqMgp%rbkI2b;$^kJiIWy02;WSnA72Zs=Xe zv1{c+<1_vYCui=Ma4K_F~`Eoj5eaa=Xgp-Mp3TxU9 z+^XbFtC`d_HDXS)Hs{Tnl%m9Vf0z~E%6xMm6=#kpj5VOjV&MzM}nTV8@1qfv_DJ~07RGegJDeT6_;?n0F z($W}`(y=7|Y9@#4_T$IIt&U1%Y|7YVWck`ZMa;)?>N#GYHziSuQ%*UrEPQObZr&C* z;mOi#MW%7HFFC08ZW7}p<4KAIFO|M_CG&Y7XUkE}aMD{<;qzJefKghWy6^(I1)rbr zPja}DAjV(Fyvil$>lqz^Ok1PtC!d=1&M=Ay^Uzk@U^dS=a=yx-jlc%*f@)o?A zQDCjju{va`S4RJN#~lk+=$UHwsVYyju@mxc`Q~ubVx6ajnw(Qbl)@$zmo0BT2E5vE z@dx9~`(mfLCy98dv!9+>7EKA3tUePQ0-t!oVkC&sWV@%Nw86_f2%Po$)ZpdUZyZvzviI;)WNqVsv&L zcw}v-w5!6=RN#n8@?Q6p#WSo!#Q4+k+nDlbfqZ7|1BVHb1+2&=dW*-o|k!6O8 zN=3E4kXYZr7fN=bE=(H(4|&KKTNv^4us_@(I;o+^T~=)BW5FXyoHn!C;`RACe6`dj z@MdgTaq&jPlp9}8&N$<>Ea8Qr5AS);#Xo(lguEBuc=teFnmNff(Xz9?!}aUc{+$ah zxjc|eQCc1NBQQf>gxT@&j@gr&{(MY4bojf}QhBe6o9X>G{VQVpW(plu_uJRB;Kz>x zS8kN)itz|b=-YaQ`<2;rzF!jHpJox#_v)6?go`~q5;<0C)4BCFSoEFmST|3=*Ts-i z;(g#vjb~A(rkqUu&Cyb#5V0#~$0o~TVOE8Vx|8}n`>%++aa7~vl#@Gsq;>IzDvtiv zK!!CT1(Vo$&ha!KX8e)InzBG<;&Iod6-Npsn*7xkPCtG4kg!+h66PpfEt4`aRWn<(eQCwJhJ#>q$#43iQ3*W5xPiQVuRhLRA_-YYW zd{tUr!$N-%op5l>cQ=59Z+(L*wa6KNC9B}C5uOe6KKIEOO#E4N)b-Tq)AMq+SZi9>OxqW> zEGE*WrNqqH+9$0^O?;uft%jU(Y)k7)#YN07?-~nrzUJE0v*!)FyPDS79os^UN?Qb3 z>_fI}*`FY1p}qO>t=|#~efi6LReqnEG^6X{#n1Yhu0oHMoH(bf)$rUH?molW>GitR z8C8ZM3`ZBfDUqKL?BeBTa^T^sf;G=qnb~R15}i9uFey9Zq_gI)E>Qk`(0lEEm93y! ziqh@(?u%5;w8T2T_{6gDKlch-IfrTX52qNa3wL##UgoiPS!0CCno>5l3yNZTH7-vs zSFMnc6@IaF)7e>S5oc!GC7$YZ-{2P@KI4){uYlB*j$Tnoov4!zVkLj^rOJT=Qd6%8oj-ZV@S;as zMwqzxgvQ-R9z{Ic;w&>su3vQHtAZ5|W|UO0A5Bwv_)*g}k>w*#;qUIV{OX=t*O=&%ys;vu zLkS)l!`-KfPIFpI{8q7DmevtFp)2N@UL+mR(yZvQtWotMZ=8l&;U?h^8f~qobw202 zNELE2EM__Q?{mitr;zt^1kU$}P3vKAT`g(X`mO(x;F-`l!rtl+Dm<@dEsVKDzCPhdHuZ9tZe3&}zx)Nn=SeL&&)=!_H+W$;??Tc?m z_D=(|eQHE|{h*&N}<{DBtF^LZMebugJ9CZE3xHFLjcbm~NNgmSgqW zVxdKk1Z~&G*W2!$X7lUG;`e$>JCokirP)cJK0lwYzguc`#oMz} zCocSSq`B*gwdi!&Nt{w&Pj$?Tn3=tyw9xwezJ@{>=gw2*=e-vGZsA%R(dX-#TJZ4I z^lL_^3ZGtl(6r;k8vFTTJyJT;BMg<-O*(1k-`Rcs!jZ;@OWU(VIoY^-`zFbYh;u&J z@IrPT@0ruijx`@9Bzc-8dT#pO{nR-5DtlT|fGNMj9oMCaJ6X=`SyIKe=1Okl-W?0C z<(yNBjkju^uzSOVUDancIUPE>(aCJa`KL*z*2OrfZ(aTV`Swl6=f_N`eR^f3<)W7d zZ+1;qZP$v5h^o?Cn-dpT^ZDub6V^!xcT#J-?0bhY5gl{)KWY=eFsi}bVEWg`$SDcb(|(Zy!hNw3*dN-ssK zpZsW8`AcGgjmd_$P74(d7H+)c{HW=njhHO+=7T$DW@PBk6XNkyJELh9_pxSKPSt`p zXS~=JzL4(Nvc_Ct=JYB34u--^lQv#a?7OEViMOKi21d6iBe*u#e@TMZhlfqd~_`Qioa#g-{4f$j*IJ}0<@f+ zlhr(qBwn2+C@FklLg!NR(2OnLD_`4#wSJZhUuULThlG{PDN~;6&9YtZO_8?WkF{FY zELwjmi<(RcnwPgNL|obD@HD4e&EXqmxt2!lwY1F9Dh4!6`9y*picAYzS z!Kduvn01p*wYIYgbII}^jG9yIeC^VyvK4DyTD)=Bn#P$Id*eyi+>cSAYYMqPxoKr; zEVa3tvqH~pX1h-7R<`v?R-#^8tBO|%u5u~(ALee<-S}>)Ejcb`~Sd^_KQoZF$$Es|zQ;U373#dIYS|Ra5 zDNvvw$@9a6#b=zDryTIP%iw;b@z2KyNqZso74JniZe|l)koEM(-YiYwWR<0FV z>TC1y;im;tGg*pl0}2{aimI$V9jAxiS$>k=(6GW&>q0^9)U4CYiRyYWF=mbiGW}<| zw|`pkFEXH@EXFKny}-%CtWVB*2%82U+VCrmjh{JnVN|^ar|aP_4i~&sdZ$YErS5PK zROi$2j6LES9Jwu2C^e$dTyd(yaYvz!=4K)PmR7kW0hwh?X)l=URQR8F9XR=8f~|YS z+TIxkz0BeIN8c~(?+noBsq@>g?b0u4(MytIVphGDuQNSY3fY|ay>#Ku#itd*(x2|0 z5WHY{$d<2sCd-d^_^hvE74^-Ss+IY?pMNULY7ga^ubNw!l_y`k<;AmW-%~q}%FgaX zo?*?+Ijh4Wq&Y2%9zEQ|+3=(;C3gQ*_fMyqn>Rh&oLbT5C!w#FP~UaGRLE&=*E6FQH&Y;xsiSNNkMC^F6cDElI*MOug5!`FrQ z_v$(13Ye%^26ZuX#_6ur5IgI+OjE%!rAt>fgyUH!=Yf(MKlT3fqaQCm{Mh0zddFZA z#{+fVg=^)zU;WJ6u&d^0!~*AY&PR*3N~%qA+?UX@#wlseGp>+7F|r}LChFK; zd2_z=*N!~rRR4uKfyWpa7KuAY#}%jMa<1FwFlD7k#NnK*^M@a8aX+nch*5JvU>0vt z_u?O4RQnWN7*=N7yzbYybo$zqS$8K0T-h^sv5+#S_kBJCi+yq`@_8#B9DICKXZnm) zFJjb$I^6>UMYwOPC=~|kOmseY!k&}GRdwP=#}{oYx;9+A`g*GHWA6#lF1(z4A&VN6 z!n?D*ST_e{c6sncDs{VuGFdKiDv*^I?tFanV@*j#O``D8avqf?3(mtC+3t^i?TcQc zH{UKyL*Vm-k1=cAJeN$!pP{HNFk`u8(^PwL_8@@>&!|EbZ~jti<41Mtq$k`Ae&H=r z7Ugs?#MT6qf8Y0BPpaB8QKzopjeqzg)&6s`oo_y|Z2Wn6qwPG0Y4#RsvTPGpO*+vr zRZx1ObZ5Z24MrXp58Cmbnb71`n(V*+GxH8^w|u9E5zp=?eVZjWC(Afx}Ypolyb4BN& zNmY!Qfwx3dT9gi4@lt73>zmAS*l6Y{8CT`Nm5VPfC@q;{BjA4Z$iX)&W?b>Hlj!Dj zZ&@BJ?B8*?bAg^4C*y9VCkAD6@_0B|uW-&aJ6iSSb;zmeFv*B(T~6~=f?N(xOZsvk zdTPtYVp&1SUlQe-JkuodPfs{xJ0sa@=Clc0Liv3;+Z~r^E!m``>f-jq?NNyK8lFie z1^&&&Dhd`lW@n9A&FgZA z^Yh_bkBc|$`d9Mh%ZGWPE?W+2A5mSA(IT|=xN_+ccfZr2dRa;ZOXf91g_N~&DspTv z73x&%a05mWpGby za>zTelSg*BbTgAUfZ3{D9G-3Hkk%LP|R2Y~%nir)sD*Rlzp|X70s*O&2PP*{>1UWssZ*I(z>09tTQQ*zL z2MK4Mym(M)t|wO{dw$KHmmGiF#Ma64ntOSlOR_BFw7Myz)b4#~5;u>iR9yR4MJuNO zyDuqW6P?O0NXRp%pFI3)(ZUbPk2fZG_$FPDQnza8)SQyMNMc&aQq7wN51MSG*Y-T* z<;-|wXQw5wCR*yuspUs5WjbzS;rmjz*UQ~^+VQ-z8tZS)o_uPHol(!<@VP79Re4He ziXWwS@+hv!c~NZ|-1bU!!tpdOnT&)>J>AhYSK1^vk9upx^Pc+F^76HE(_1;usEY;V zmI@3)F0#TZoa|?Pn@{gG4eb(r=A}@TG)dg-=gt|*UfJ!|9PR1fnc33S-I-7BEciU( zU2W=f5BE0)TMK?EnUL<8V>xB zw)2y}D$3s|FWb%Jlr7e9(eet5r_W+pfg_ujYWkgQXAyjGHz%DV!`of(8p#VD&lk4wNaRgUcfPr5 zj(MO?o3&BEV`sK0DN(ndEipLYrxgjxzfXCu=YsNY?T5GPLHT!|Y$d4w`_p+nxc{pW z^dm2Pi@JZLjCjT;uWQ}SJ18l3A(It%9pcI+4I20 zeeU<;w&wOn`juC0Q=Hh75Od1;&|bZoLtkHKZTTm3Qga=!i0#*;UjQq;wbr==FXW3OB1 zvbU@4T$_+7ld>THW7e3jGlkX#^Z!&_Ew^^@38mPGdo_j%dVX_mgnJ%I6F$}ISoh0a z-n}c*rf=?)`zuTJTrN8G&S;Wod$i`6x5mv0hi5JfUizg<;=xgoy~}w`Ie(O@%)TSh zeQxraQ%)Z08cDXo6IZJ(RuX!c%E~*(UP)Qd+h?(+i5g3>fJ zz3{4aYa9ErM+}oJdi=lG+Zx9N+sShsS5M=dFem0*?-&bHM zE5Ex?;lPe?w}lhels7DT=()J~tCCWL*H^oq7b}8wR{9@1C$maRFY&{TRkO^d3yiZ*V|8uY|^-6 zc_s5{lwqT>;it)Vkypd=+$}}TZLhd%ZJlxTSxqCJy}iwy6-r3D{_EomzmAyRL_bp`l`tRjQxWOD^vGHBnGUwQ9awNr>jOkmZll`9ej-4Su8-IbQs&yqROV49np|f*Usqu<)|rB1?AtHz1I_~Y#MdyF1^urpP<@* zD>C=RH)Yjn-nx6`j-+flS)6@DH)@76XXTnTPJSo2JDxr@y7u+NqZIGJkezX!mOE#3 zT<2hwDF|7!$@#_Skn_2&3+}u&c+tq$bXns@k)D>H=`PhGflbQK1oyhSwijNQHJxRJ z_w!fDc5CL^-Jh=$vs<#_qndf~+L)5!En1Q5E0-Sc`^)dIcUkJx;q!{erPvO=+Sbo$ z7Rejz!^Wd1wv#)4k-X>(^_Ys529u*6$0tAa@D34Q6tUvLk0mvcPBAg^m-JOsdb879 zey`Hk*O8FbSDJrmsg$lwSjmcY=9j%+{ZO_nn$f%*37pnwn)!SlNC_B5S1#;=X%uh*mjq7PGT-Khs;;3*znFu zIOxGt&YHhI=~pK&zy0}X_w;0aIhAAYN>}&wm9=`CzBk$N@&3Y>Pj4khMpQnrcf~_@32DRCp!$ zZI($-$Em{%TRjU-zUuOQw8+p>;?x_CiD^uemHAaZWpuT;q%Z`D`g8?rIcT~Vh?+R7 zwH=(s?<*uQNmEN+WKwUo&~iPIGm1SnT9b~cCIzlEbX-|*HoLX(PoaFvlnK+4Y_+x& zoy;>lrI7IBOG&uYD=W(%5P8Q<$USf3d)kckJ2`@Vxboo5bc0LOVONeOY zd7n_WE_SC)U6G*fP8Wf#JgnJO6VqNZKka!Ipyzun@lC{y^B+&iOy^q?^f0U|aDr1S zw|MJOu{4oS;?76?VuLeGgG^iF7DajqFS;%8SL5bv_v%GK&a3ifJb%?NOUk22OjiAr zPF26#WdSRG18c?9lM&Bko&We9e>i7VZmG*XEoI?}J?jp1iX~_o8GQ0r>saC9=D?~L za$>2`5~eB6jKMBO899;(UoI+gDotAW(Np8vMy;ZUK8GX@A6luC6s9UQSww0&&$S)l z^2Y^#czSZCDPLOct~2ei%px}azGJC;ilY5znHpw%`1xQ#rJ12Zf4Q@++-jlDG`<;A zm@Yh-b7NkrY8q=tz`1YiSx;|IKK@)$==Kyx?tlYf+gFO^ZLo_tm&)|yZkpWD-k$$5 z3r`lja@7;fSSrb)5wNi$CNM40U$Mj{?r0XuNS)WZCgD@&qMen` zPqybtnlr7we9vdiR*p$qYBi+z++7z1hMwBs8nkrQvZxHXLle6Ky^e*8$#gEa5}G>o z(79Kfyi0XgYfDd`FCW#Jc=Gjo?KQ58k{(@`?QhX((0;XR(mk6#t) zTKZ96Csf}orSIew=U1KX1!9Y1LQA(cNiJz-J{~%yFCct|n9KLAO_Q3Wq@*T2n8LFw zT+?T5=EsP)=}LCjx@{YrO(rB%yxKJJ6xU~_ z6Z5`p2nuj^b`FXWYMk!%RCDTDOTB<33)y9h8fBjph_xq3-0r@($8yJ7#k`}R9E_q= z*5x|z1TV}^RQ^*CYJ7Er(?d-~TP>4mHip`tJ~gIVIeqLBcHY?VW1H)ez%QOs3Yr=V zZb7*cfo<#hS852dCUT zRiV3cqpr;BCmoMGWwY}7vXj#no!nvdV9qBg1MXE%`7}k^XKk1-;$`YpbjsM~s@AmA znNN;YDogo)(KzBJ74CY(Y3g#pB;W0_YTib%5qYXY{M@cta@w69&zlUkdTm`ED}C|K zLiN_4d(H~%UwmPcZeH+`ozm^EX2z}8b6$Dk&P0tC0b$zbT$y0)eNfu4@06&K_Ro8#JPcBf>f&dJim9aB7PbVXNG ztW#B<$8qSY*0s4M`QZJ7Pgo<=s;xVFY6@A-rxzOb_eni`_3f}^>){yNxEsj^JBnK7 zi9h>n;`FcI>BQEZev_W$$*)SS+Ov~yxpI-qB7r{rQzpMpDNfP~Zu`91Vn$b>Zp}xl zFV3PVZ~Zd6JSR=bsm;h<@<4W4BZs%5@s`T;B`y=@HD(@sRm9CS)y4S9DQ?#H9^pq-dqtCHQF=Jo_>D3Bh|jP`t7`rhuLRs4f?X~*2xtj+e+LFtV+%v{_GlX zsOaR`k~RLGJh?OG&i|d-88VmQsMW$BFE5ARGV4F_w)Viog)=`L))1e+I`QbMQ`ds? zHRY7*Sktoku1-6xyJ7#Cl&4lj6K#vR&UqU?oXw#Xbz^vX>uMqcOU^2@Sy$T~O*rn% zlR17?EzskFW_pZ+&trw=q^6B5-W_XV<>I zmY5~R-y*u;+Mz&;JsInoVx}D_s=dtXKi8xt&|FQwbeCxVf-8%c`Eukudn}?lNZcb0!*chVV=%6C#e1@xUmd-je>#(ZO$(s_w=G^!)M|paS;e;a} zOWh`ErQ|3u^iFlV9JS$vTBG#j!!v#^Ii)GZs`I*ob54ptPC%GKXQ62K>W^QQ3XB|6 z1vw6EVonlbU!)|Wz%oNkxzl;Qla;z#K&#N(EPwVM$6!yr65lBj8x60hY05-JgcWXN z-0C5Aq(D^JRR3P%y>_{3ufWOFf?N6FizIc{Dfqs6$FlM35zf7_2d3HW zFp`+3x8jnkPmfVcMp#Ra&&(o`^dkuma$M9j+x%u~%w)(DuuCZ}aW^v2<2-le>!uY) zd<;EOLM^-=Yx-W?&X`i&upnp4jGfvkPCK3{nB17~>d|GD;3Xy&P7BluxD9569C*?o zHg|zl6%Xfg<`>e8Qh!Idcw%OfS*et&mW{NcA?U$XuQWlfJ0Ym7X(7$bIC-JfrkZ2oD1g*Q*} zkGZp!zHGF(^3!NXutN7qt(?#WA_gL?yH-#7GP7>Up^YIk{DrqaTco%%%ETk9(W8Qe zm&3<4ztl;+L5u*PL2XXTO(W!AT5 zIlj_M!Y(sK_y@--^H`;n>69KF}d2KVb;EV1XjB7P?ICrhfPq-dL`qJy@$di3XK zXVU(KuyZE%)eCP9*=wLKHD4{9D@CwU)wgR4QyWvm_RylZ$@*7jglSFYd{p-5ii^3n zTPJUTCO<>tLXYc=V(OY9Dr-&IIl)Z(LR!rrN^{Xv% zu067pmB;L3OJGQ+W46I-EjJe}-%ur+j%Nl>JQkmM&}8hiTFYmyu}Vjpk=52cyOgya zsZ0}Gc*tG&=fvaADj`w!+me26jIBKzAZII~78APjRnQlY>BqK4eVmwk^l6Kc*XQFq z_@_@X`n5?@)6$Zs*4ngk*8D>*S{&UMW%`t)LYf)xGzBTlbTH82q*k@R5dgbxA!P@E%D-xY>x~wQVhykDfq^bm!^oC{7BWXM3P#&%)_fCwh9GJdynJ=IS$7{s}1txWsilDHOQ0M1t>$&_tF~ zjExBeFRWV-x+tI%7Q(vI(Jl5W={|hIJo1Nm!Y$vwY}yGwv$O(Apy!Ql|d^6R~}Wi z*yZ|s=LJV;wLYy@6KzMKNt(>;lQ#vX$uv9^{L-Q3<DA-E9G=F^)H(IYByYR+bkAi|Z_N#ApCtNtZpG)qRBPd2%T01# z=1eum*0hwayw#m}r$_xnrjd+l&#_SD*`AY*gsfQL&hcq!fO2q`TVYA}`QimlX1+3^ zTp3|aswzQj{OT!-&R8-YQhq7mGo@96)@?o zhj&W&Pq>s~;Vs#-%H3=-6Cc~gykyxWC+1aI3oaBiYMB?vX4rU!yK0upzP6l*xxp9R zzTWKGIGNYzP|qAAg&6^>jCGwwG*&E_rMXDmsU|3tQ$4qRlAu$D_m0PkA7?9c_j>yX z1x>H+7w$S4Q2a=!%OKCZ+&Fz&!RP8ymsUQ>Jxjjq*ifBvV#Up0k0*WlY;3B;{V&8c zN$6G3%t)sz?&}X+^ks1`nb7mv=iC&vn7N!^qw3OZ7mBuWcl551=3~>itvmHrYmxBM zD?&n_H!8TQPwH+yb)>)ZSz7*bf&B7@=EgPAGmd8(sn6>>lHuaBP<@JHPeL)%y=4>i z7tR(_5BUUu3G2=k3HNEdjHH-dUWe zNjstRIOsCVl%@9`A9=JXMCM1!q8{nqyJv1bonv$FZlI!bTfU~Po{rp2BQ3MK9Z&Y` zIdj&d>Hk#Th?ZSbmW2gu6@2}{B-l~#u8OkNW#grs)7717!{*QI&u~q2dZe7icDS+2 z>~w0`!kCtqr7SIb-gpRlK3VkO(?;b-l{06*JR*JfSzzSsboQm7{Clx;T2a;B6(>_4 zobwOgDyg$a?(C~iZiYXbZ|;rrIA(9qa#VFMi<{ zGq2-Ioq|NG#u4F3MZ0FKG7<7(zICN0O}dAxBWHchid{lKOTAvrzQ{j`zr9Rn&RlU1 zExzs#Q>XQ1xW5jQ5jwJN?exB7E=v#YxbjC(G)(BoL`BC=kxl*%6$M(`)cKAbzbZ9d zbXMG)Y(;U6a>-kVZZGaC6uB|OJ7-nd=Odd6j(m+-sOGgPd7;Z1r#{c?0(@Jucs?0? z^I5d&YS*V@JBmEz^)D=*+1MnUdEm=~NvTY|tw#mrgpCsY=IfticZ-s_{s6ZyQ7mQFM7%9 zc(G1s)5WtKf3prZMNGZA>Eo3XQ+Ak3&2Lg#btqzziiV-mG|w0Oe5_$d9^Sa|YjMz{ z&EA)LQ_L7#DG!&r|v7FOgyc1E*XIxj8~U3j#OnSfqR?%}4X{)1L}2PFsihF+VM`i@83P zM`N$bVVk`HK!4 zAB(UnEzNd$+p?Tfz$;OSYthP#4e7!jUTc<0C3(M=wQDye(>{EJU6{3OFa&t{FQVN^`m!Q3|SV=bS;Dt^z(^~_jNaAC>{Co9d9ogY8l z2x?#58Kkg8>J%5d@iFnGYWtiNC$fJq`Wik<NHl@VP@ zTXw8%y3M2C%lTx@$L}V$CS448xKJ~or6hQ=@Z+Z&mhy)SEphZPog%`Q-lOm3ThrpK z#Qz}m)p`@nMS8P1l|N=mdOQtQpYST#Ovh62io8H)SNDPqR#r1sT6)#+^B;NSx%$?Y zEd^zu{Ck~IT)o<6qgt}UllSStI{hr$&QZ^^5b1qkLJo3R#?l99u zwY6dnoyVqj9BMG(6z&VTvLuj6Ac50m;tLg*1B)k_`9(^2NPOgGWs-4I-zwIrt;8l2 zsPxS1)+Tiou7rTrjh@aPMbQ~;K1|L^hn8MA(aNymrAEgOrI=Hi&+Z6{<<8f2I#*#RKDQR+32p4GiQ^*1j9#STr3tn z{#m+0VJi(Jo4-J0U(A#z|LchaP`2~W0N5ZM5D_YW&rcO1fnJV<++NFQnSbf%dShK4?xbnfvTJ6BD=f3kUmR>s&R&dg4>TTau zk5(Scc&2*q)Z?k$*TmX|8El;7JN5K7Yx&LSV?PtD9L=Qa1K%uY7&;1uUkCsIY)9~h literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..64cff5f2e76bd344ee37dc8f027e7906cde83861 GIT binary patch literal 26880 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 z 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˅i?u?ArP0dGC1i83a&Mb0SsZcXpKQZOZ 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 deleted file mode 100644 index 17c71cb98e4ad3760c8669cb130e09a54be43dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27943 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 PxdRtz4Zz?Xr6fsKKI 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 diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 0c100440a2..e48a08ae39 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -4,12 +4,21 @@ const cache = new Map(); export const soundsTypes = [ null, - 'syuilo/new-eca', - 'syuilo/new-cea', + 'syuilo/new-aec-4va', + 'syuilo/new-aec-4vb', + 'syuilo/new-aec-8va', + 'syuilo/new-aec-8vb', 'syuilo/new-aec', - 'syuilo/new-eca-oct', - 'syuilo/new-cea-oct', - 'syuilo/new-aec-oct', + 'syuilo/new-cea-4va', + 'syuilo/new-cea-4vb', + 'syuilo/new-cea-8va', + 'syuilo/new-cea-8vb', + 'syuilo/new-cea', + 'syuilo/new-eca-4va', + 'syuilo/new-eca-4vb', + 'syuilo/new-eca-8va', + 'syuilo/new-eca-8vb', + 'syuilo/new-eca', 'syuilo/up', 'syuilo/down', 'syuilo/pope1', From fdf760507492ffe40d822e1753545612bfcdb760 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 14:38:45 +0900 Subject: [PATCH 057/125] refactor(client): use css modules --- packages/frontend/src/pages/admin/users.vue | 115 +++++++++----------- 1 file changed, 51 insertions(+), 64 deletions(-) diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue index fc1c1c1dc5..819ced826d 100644 --- a/packages/frontend/src/pages/admin/users.vue +++ b/packages/frontend/src/pages/admin/users.vue @@ -3,48 +3,48 @@ -

-
-
- - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - -
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
- - + +
+ - -
+
+
@@ -138,33 +138,20 @@ definePageMetadata(computed(() => ({ }))); - From 896400a6c90500f8f9c02b578fecf50cbadf7621 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Thu, 2 Mar 2023 07:05:05 +0100 Subject: [PATCH 058/125] refactor(frontend): add explicit `Promise` return types in `os.ts` (#10156) --- packages/frontend/src/os.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/frontend/src/os.ts b/packages/frontend/src/os.ts index 7e38fe5f6d..f0af9f081b 100644 --- a/packages/frontend/src/os.ts +++ b/packages/frontend/src/os.ts @@ -362,7 +362,7 @@ export function select(props: { }); } -export function success() { +export function success(): Promise { return new Promise((resolve, reject) => { const showing = ref(true); window.setTimeout(() => { @@ -377,7 +377,7 @@ export function success() { }); } -export function waiting() { +export function waiting(): Promise { return new Promise((resolve, reject) => { const showing = ref(true); popup(MkWaitingDialog, { @@ -528,7 +528,7 @@ export function popupMenu(items: MenuItem[] | Ref, src?: HTMLElement width?: number; viaKeyboard?: boolean; onClosing?: () => void; -}) { +}): Promise { return new Promise((resolve, reject) => { let dispose; popup(MkPopupMenu, { @@ -551,7 +551,7 @@ export function popupMenu(items: MenuItem[] | Ref, src?: HTMLElement }); } -export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent) { +export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent): Promise { ev.preventDefault(); return new Promise((resolve, reject) => { let dispose; @@ -569,7 +569,7 @@ export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent) }); } -export function post(props: Record = {}) { +export function post(props: Record = {}): Promise { return new Promise((resolve, reject) => { // NOTE: MkPostFormDialogをdynamic importするとiOSでテキストエリアに自動フォーカスできない // NOTE: ただ、dynamic importしない場合、MkPostFormDialogインスタンスが使いまわされ、 From dad915e5221d99ceeb7b35b3ca1cbbf52a02f0f3 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 18:40:43 +0900 Subject: [PATCH 059/125] enhance(client): provide sticktyFooter --- packages/frontend/src/components/MkNote.vue | 16 +++++----- .../components/global/MkStickyContainer.vue | 32 +++++++++++++++---- packages/frontend/src/const.ts | 6 ++++ packages/frontend/src/ui/universal.vue | 25 ++++++++++++--- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index b87d46ee94..bb1269562d 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -289,12 +289,12 @@ function renote(viaKeyboard = false) { icon: 'ti ti-repeat', action: () => { const el = renoteButton.value as HTMLElement | null | undefined; - if (el) { - const rect = el.getBoundingClientRect(); - const x = rect.left + (el.offsetWidth / 2); - const y = rect.top + (el.offsetHeight / 2); - os.popup(MkRippleEffect, { x, y }, {}, 'end'); - } + if (el) { + const rect = el.getBoundingClientRect(); + const x = rect.left + (el.offsetWidth / 2); + const y = rect.top + (el.offsetHeight / 2); + os.popup(MkRippleEffect, { x, y }, {}, 'end'); + } os.api('notes/create', { renoteId: appearNote.id, @@ -622,9 +622,9 @@ function showReactions(): void { .showLess { width: 100%; - margin-top: 1em; + margin-top: 14px; position: sticky; - bottom: 1em; + bottom: calc(var(--stickyBottom, 0px) + 14px); } .showLessLabel { diff --git a/packages/frontend/src/components/global/MkStickyContainer.vue b/packages/frontend/src/components/global/MkStickyContainer.vue index a3fee91a36..3f9c1bc353 100644 --- a/packages/frontend/src/components/global/MkStickyContainer.vue +++ b/packages/frontend/src/components/global/MkStickyContainer.vue @@ -6,20 +6,19 @@
+
+ +
- - diff --git a/packages/frontend/src/pages/admin/object-storage.vue b/packages/frontend/src/pages/admin/object-storage.vue index bd7c203512..cbe38b2d81 100644 --- a/packages/frontend/src/pages/admin/object-storage.vue +++ b/packages/frontend/src/pages/admin/object-storage.vue @@ -1,6 +1,6 @@ @@ -79,6 +86,7 @@ import * as os from '@/os'; import { fetchInstance } from '@/instance'; import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; +import MkButton from '@/components/MkButton.vue'; let useObjectStorage: boolean = $ref(false); let objectStorageBaseUrl: string | null = $ref(null); @@ -131,13 +139,6 @@ function save() { }); } -const headerActions = $computed(() => [{ - asFullButton: true, - icon: 'ti ti-check', - text: i18n.ts.save, - handler: save, -}]); - const headerTabs = $computed(() => []); definePageMetadata({ @@ -145,3 +146,10 @@ definePageMetadata({ icon: 'ti ti-cloud', }); + + diff --git a/packages/frontend/src/pages/admin/roles.edit.vue b/packages/frontend/src/pages/admin/roles.edit.vue index ae884c0111..2a65a75187 100644 --- a/packages/frontend/src/pages/admin/roles.edit.vue +++ b/packages/frontend/src/pages/admin/roles.edit.vue @@ -1,22 +1,31 @@ diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue index 4eea827de7..2fb605f8c0 100644 --- a/packages/frontend/src/pages/admin/roles.editor.vue +++ b/packages/frontend/src/pages/admin/roles.editor.vue @@ -1,19 +1,19 @@ diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue index a6a3974d0c..037d00d8ff 100644 --- a/packages/frontend/src/pages/my-lists/list.vue +++ b/packages/frontend/src/pages/my-lists/list.vue @@ -1,33 +1,30 @@ @@ -130,6 +127,10 @@ definePageMetadata(computed(() => list ? { From cf8a7f93d5b67163272bb75064b090d82a6700e9 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 08:48:52 +0900 Subject: [PATCH 062/125] :art: --- packages/frontend/src/components/MkWindow.vue | 2 +- packages/frontend/src/directives/container.ts | 21 +++++++++++++++++++ packages/frontend/src/directives/index.ts | 2 ++ packages/frontend/src/pages/my-lists/list.vue | 2 +- packages/frontend/src/ui/deck/column.vue | 2 +- packages/frontend/src/ui/universal.vue | 2 +- 6 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 packages/frontend/src/directives/container.ts diff --git a/packages/frontend/src/components/MkWindow.vue b/packages/frontend/src/components/MkWindow.vue index f7565ca59f..e7ad2b9a43 100644 --- a/packages/frontend/src/components/MkWindow.vue +++ b/packages/frontend/src/components/MkWindow.vue @@ -23,7 +23,7 @@ -
+
diff --git a/packages/frontend/src/directives/container.ts b/packages/frontend/src/directives/container.ts new file mode 100644 index 0000000000..a8a93eb9be --- /dev/null +++ b/packages/frontend/src/directives/container.ts @@ -0,0 +1,21 @@ +import { Directive } from 'vue'; + +const map = new WeakMap(); + +export default { + mounted(el: HTMLElement, binding, vn) { + const ro = new ResizeObserver((entries, observer) => { + el.style.setProperty('--containerHeight', el.offsetHeight + 'px'); + }); + ro.observe(el); + map.set(el, ro); + }, + + unmounted(el, binding, vn) { + const ro = map.get(el); + if (ro) { + ro.disconnect(); + map.delete(el); + } + }, +} as Directive; diff --git a/packages/frontend/src/directives/index.ts b/packages/frontend/src/directives/index.ts index a690fd6c42..854f0a544e 100644 --- a/packages/frontend/src/directives/index.ts +++ b/packages/frontend/src/directives/index.ts @@ -11,6 +11,7 @@ import clickAnime from './click-anime'; import panel from './panel'; import adaptiveBorder from './adaptive-border'; import adaptiveBg from './adaptive-bg'; +import container from './container'; export default function(app: App) { app.directive('userPreview', userPreview); @@ -25,4 +26,5 @@ export default function(app: App) { app.directive('panel', panel); app.directive('adaptive-border', adaptiveBorder); app.directive('adaptive-bg', adaptiveBg); + app.directive('container', container); } diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue index 037d00d8ff..205434971d 100644 --- a/packages/frontend/src/pages/my-lists/list.vue +++ b/packages/frontend/src/pages/my-lists/list.vue @@ -128,7 +128,7 @@ definePageMetadata(computed(() => list ? { diff --git a/packages/frontend/src/components/MkUserPreview.vue b/packages/frontend/src/components/MkUserPreview.vue deleted file mode 100644 index 1086a2c651..0000000000 --- a/packages/frontend/src/components/MkUserPreview.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - - - diff --git a/packages/frontend/src/directives/user-preview.ts b/packages/frontend/src/directives/user-preview.ts index ed5f00ca65..2f5936de3d 100644 --- a/packages/frontend/src/directives/user-preview.ts +++ b/packages/frontend/src/directives/user-preview.ts @@ -24,7 +24,7 @@ export class UserPreview { const showing = ref(true); - popup(defineAsyncComponent(() => import('@/components/MkUserPreview.vue')), { + popup(defineAsyncComponent(() => import('@/components/MkUserPopup.vue')), { showing, q: this.user, source: this.el, From af24011eecbf327dc664971aaba126554383f9e5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 12:31:41 +0900 Subject: [PATCH 072/125] clean up --- packages/frontend/src/pages/about-misskey.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue index a72e5bb4c9..51c3de43fe 100644 --- a/packages/frontend/src/pages/about-misskey.vue +++ b/packages/frontend/src/pages/about-misskey.vue @@ -84,10 +84,6 @@

{{ i18n.ts._aboutMisskey.morePatrons }}

- - -

Misskeyで使われる画像の一部は、許可を得て「あの子がこっちを見てるメーカー」で作成したものが含まれます。

-
From 1b33653f1ba6963b08de56fdcfaa9d177abe7db4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 12:32:05 +0900 Subject: [PATCH 073/125] 13.9.0 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 199660542f..2bf0aed022 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ You should also include the user name that made the change. --> -## 13.x.x (unreleased) +## 13.9.0 (2023/03/03) ### Improvements - 時限ロール diff --git a/package.json b/package.json index 2dec3f31fd..b870d8507d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.8.1", + "version": "13.9.0", "codename": "nasubi", "repository": { "type": "git", From 5d46c1c9bbad06a56b180a072f4b9a998662b041 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 14:55:56 +0900 Subject: [PATCH 074/125] =?UTF-8?q?=EF=BC=88CSS=E5=AE=8C=E5=85=A8=E3=81=AB?= =?UTF-8?q?=EF=BC=89=E7=90=86=E8=A7=A3=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkUserPopup.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkUserPopup.vue b/packages/frontend/src/components/MkUserPopup.vue index 0720c8eea6..93e914f6dd 100644 --- a/packages/frontend/src/components/MkUserPopup.vue +++ b/packages/frontend/src/components/MkUserPopup.vue @@ -215,7 +215,7 @@ onMounted(() => { } .follow { - position: absolute; + position: absolute !important; top: 8px; right: 8px; } From da3fcf178e45ccaf7b2ca81fa03f029968777018 Mon Sep 17 00:00:00 2001 From: tamaina Date: Fri, 3 Mar 2023 06:12:34 +0000 Subject: [PATCH 075/125] fix CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bf0aed022..9a5e6da4f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,6 @@ You should also include the user name that made the change. ### Improvements - 時限ロール -- プッシュ通知でカスタム絵文字リアクションを表示できるように - アンテナでCWも検索対象にするように - ノートの操作部をホバー時のみ表示するオプションを追加 - サウンドを追加 @@ -24,6 +23,7 @@ You should also include the user name that made the change. - 外部メディアプロキシ使用時にアバタークロップができない問題を修正 - fix(server): メールアドレス更新時にバリデーションが正しく行われていないのを修正 - fix(server): チャンネルでミュートが正しく機能していないのを修正 +- プッシュ通知でカスタム絵文字リアクションを表示できなかった問題を修正 ## 13.8.1 (2023/02/26) From a7c82eeabcc732e76c5c358c98812cac8457d57f Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 20:26:44 +0900 Subject: [PATCH 076/125] Revert "fix(server): DriveFile related N+1 query when call note packMany (#10133)" This reverts commit 452a48e7f4782cf9bdf08b554264ab3cdcb12685. --- .../core/entities/DriveFileEntityService.ts | 24 +----- .../core/entities/GalleryPostEntityService.ts | 3 +- .../src/core/entities/NoteEntityService.ts | 8 +- .../entities/NotificationEntityService.ts | 84 ++++++++++++------- packages/backend/src/misc/is-not-null.ts | 5 -- 5 files changed, 58 insertions(+), 66 deletions(-) delete mode 100644 packages/backend/src/misc/is-not-null.ts diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts index f5b1f98153..158fafa9d5 100644 --- a/packages/backend/src/core/entities/DriveFileEntityService.ts +++ b/packages/backend/src/core/entities/DriveFileEntityService.ts @@ -1,5 +1,5 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common'; -import { DataSource, In } from 'typeorm'; +import { DataSource } from 'typeorm'; import { DI } from '@/di-symbols.js'; import type { NotesRepository, DriveFilesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; @@ -21,7 +21,6 @@ type PackOptions = { }; import { bindThis } from '@/decorators.js'; import { isMimeImage } from '@/misc/is-mime-image.js'; -import { isNotNull } from '@/misc/is-not-null.js'; @Injectable() export class DriveFileEntityService { @@ -256,29 +255,10 @@ export class DriveFileEntityService { @bindThis public async packMany( - files: DriveFile[], + files: (DriveFile['id'] | DriveFile)[], options?: PackOptions, ): Promise[]> { const items = await Promise.all(files.map(f => this.packNullable(f, options))); return items.filter((x): x is Packed<'DriveFile'> => x != null); } - - @bindThis - public async packManyByIdsMap( - fileIds: DriveFile['id'][], - options?: PackOptions, - ): Promise['id'], Packed<'DriveFile'>>> { - const files = await this.driveFilesRepository.findBy({ id: In(fileIds) }); - const packedFiles = await this.packMany(files, options); - return new Map(packedFiles.map(f => [f.id, f])); - } - - @bindThis - public async packManyByIds( - fileIds: DriveFile['id'][], - options?: PackOptions, - ): Promise[]> { - const filesMap = await this.packManyByIdsMap(fileIds, options); - return fileIds.map(id => filesMap.get(id)).filter(isNotNull); - } } diff --git a/packages/backend/src/core/entities/GalleryPostEntityService.ts b/packages/backend/src/core/entities/GalleryPostEntityService.ts index fb147ae181..ab29e7dba1 100644 --- a/packages/backend/src/core/entities/GalleryPostEntityService.ts +++ b/packages/backend/src/core/entities/GalleryPostEntityService.ts @@ -41,8 +41,7 @@ export class GalleryPostEntityService { title: post.title, description: post.description, fileIds: post.fileIds, - // TODO: packMany causes N+1 queries - files: this.driveFileEntityService.packManyByIds(post.fileIds), + files: this.driveFileEntityService.packMany(post.fileIds), tags: post.tags.length > 0 ? post.tags : undefined, isSensitive: post.isSensitive, likedCount: post.likedCount, diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index c732a98a11..2ffe5f1c21 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -11,7 +11,6 @@ import type { Note } from '@/models/entities/Note.js'; import type { NoteReaction } from '@/models/entities/NoteReaction.js'; import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository, DriveFilesRepository } from '@/models/index.js'; import { bindThis } from '@/decorators.js'; -import { isNotNull } from '@/misc/is-not-null.js'; import type { OnModuleInit } from '@nestjs/common'; import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { ReactionService } from '../ReactionService.js'; @@ -258,7 +257,6 @@ export class NoteEntityService implements OnModuleInit { skipHide?: boolean; _hint_?: { myReactions: Map; - packedFiles: Map>; }; }, ): Promise> { @@ -286,7 +284,6 @@ export class NoteEntityService implements OnModuleInit { const reactionEmojiNames = Object.keys(note.reactions) .filter(x => x.startsWith(':') && x.includes('@') && !x.includes('@.')) // リモートカスタム絵文字のみ .map(x => this.reactionService.decodeReaction(x).reaction.replaceAll(':', '')); - const packedFiles = options?._hint_?.packedFiles; const packed: Packed<'Note'> = await awaitAll({ id: note.id, @@ -307,7 +304,7 @@ export class NoteEntityService implements OnModuleInit { emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined, tags: note.tags.length > 0 ? note.tags : undefined, fileIds: note.fileIds, - files: packedFiles != null ? note.fileIds.map(fi => packedFiles.get(fi)).filter(isNotNull) : this.driveFileEntityService.packManyByIds(note.fileIds), + files: this.driveFileEntityService.packMany(note.fileIds), replyId: note.replyId, renoteId: note.renoteId, channelId: note.channelId ?? undefined, @@ -391,14 +388,11 @@ export class NoteEntityService implements OnModuleInit { } await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes)); - const fileIds = notes.flatMap(n => n.fileIds); - const packedFiles = await this.driveFileEntityService.packManyByIdsMap(fileIds); return await Promise.all(notes.map(n => this.pack(n, me, { ...options, _hint_: { myReactions: myReactionsMap, - packedFiles, }, }))); } diff --git a/packages/backend/src/core/entities/NotificationEntityService.ts b/packages/backend/src/core/entities/NotificationEntityService.ts index be88a213f4..33c76c6937 100644 --- a/packages/backend/src/core/entities/NotificationEntityService.ts +++ b/packages/backend/src/core/entities/NotificationEntityService.ts @@ -1,21 +1,19 @@ import { Inject, Injectable } from '@nestjs/common'; +import { In } from 'typeorm'; import { ModuleRef } from '@nestjs/core'; import { DI } from '@/di-symbols.js'; import type { AccessTokensRepository, NoteReactionsRepository, NotificationsRepository, User } from '@/models/index.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Notification } from '@/models/entities/Notification.js'; +import type { NoteReaction } from '@/models/entities/NoteReaction.js'; import type { Note } from '@/models/entities/Note.js'; import type { Packed } from '@/misc/schema.js'; import { bindThis } from '@/decorators.js'; -import { isNotNull } from '@/misc/is-not-null.js'; -import { notificationTypes } from '@/types.js'; import type { OnModuleInit } from '@nestjs/common'; import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { UserEntityService } from './UserEntityService.js'; import type { NoteEntityService } from './NoteEntityService.js'; -const NOTE_REQUIRED_NOTIFICATION_TYPES = new Set(['mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded'] as (typeof notificationTypes[number])[]); - @Injectable() export class NotificationEntityService implements OnModuleInit { private userEntityService: UserEntityService; @@ -50,20 +48,13 @@ export class NotificationEntityService implements OnModuleInit { public async pack( src: Notification['id'] | Notification, options: { - _hint_?: { - packedNotes: Map>; + _hintForEachNotes_?: { + myReactions: Map; }; }, ): Promise> { const notification = typeof src === 'object' ? src : await this.notificationsRepository.findOneByOrFail({ id: src }); const token = notification.appAccessTokenId ? await this.accessTokensRepository.findOneByOrFail({ id: notification.appAccessTokenId }) : null; - const noteIfNeed = NOTE_REQUIRED_NOTIFICATION_TYPES.has(notification.type) && notification.noteId != null ? ( - options._hint_?.packedNotes != null - ? options._hint_.packedNotes.get(notification.noteId) - : this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - }) - ) : undefined; return await awaitAll({ id: notification.id, @@ -72,10 +63,43 @@ export class NotificationEntityService implements OnModuleInit { isRead: notification.isRead, userId: notification.notifierId, user: notification.notifierId ? this.userEntityService.pack(notification.notifier ?? notification.notifierId) : null, - ...(noteIfNeed != null ? { note: noteIfNeed } : {}), + ...(notification.type === 'mention' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), + } : {}), + ...(notification.type === 'reply' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), + } : {}), + ...(notification.type === 'renote' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), + } : {}), + ...(notification.type === 'quote' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), + } : {}), ...(notification.type === 'reaction' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), reaction: notification.reaction, } : {}), + ...(notification.type === 'pollEnded' ? { + note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + _hint_: options._hintForEachNotes_, + }), + } : {}), ...(notification.type === 'achievementEarned' ? { achievement: notification.achievement, } : {}), @@ -87,32 +111,32 @@ export class NotificationEntityService implements OnModuleInit { }); } - /** - * @param notifications you should join "note" property when fetch from DB, and all notifieeId should be same as meId - */ @bindThis public async packMany( notifications: Notification[], meId: User['id'], ) { if (notifications.length === 0) return []; - - for (const notification of notifications) { - if (meId !== notification.notifieeId) { - // because we call note packMany with meId, all notifieeId should be same as meId - throw new Error('TRY_TO_PACK_ANOTHER_USER_NOTIFICATION'); - } + + const notes = notifications.filter(x => x.note != null).map(x => x.note!); + const noteIds = notes.map(n => n.id); + const myReactionsMap = new Map(); + const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!); + const targets = [...noteIds, ...renoteIds]; + const myReactions = await this.noteReactionsRepository.findBy({ + userId: meId, + noteId: In(targets), + }); + + for (const target of targets) { + myReactionsMap.set(target, myReactions.find(reaction => reaction.noteId === target) ?? null); } - const notes = notifications.map(x => x.note).filter(isNotNull); - const packedNotesArray = await this.noteEntityService.packMany(notes, { id: meId }, { - detail: true, - }); - const packedNotes = new Map(packedNotesArray.map(p => [p.id, p])); + await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes)); return await Promise.all(notifications.map(x => this.pack(x, { - _hint_: { - packedNotes, + _hintForEachNotes_: { + myReactions: myReactionsMap, }, }))); } diff --git a/packages/backend/src/misc/is-not-null.ts b/packages/backend/src/misc/is-not-null.ts deleted file mode 100644 index d89a1957be..0000000000 --- a/packages/backend/src/misc/is-not-null.ts +++ /dev/null @@ -1,5 +0,0 @@ -// we are using {} as "any non-nullish value" as expected -// eslint-disable-next-line @typescript-eslint/ban-types -export function isNotNull(input: T | undefined | null): input is T { - return input != null; -} From ad7ecbaf376d87f5f870572129aeee334e65443b Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 20:43:31 +0900 Subject: [PATCH 077/125] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E9=83=A8=E5=88=86?= =?UTF-8?q?=E3=81=AF=E6=AE=8B=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: rinsuki <428rinsuki+contact.github@gmail.com> --- .../entities/NotificationEntityService.ts | 84 +++++++------------ packages/backend/src/misc/is-not-null.ts | 5 ++ 2 files changed, 35 insertions(+), 54 deletions(-) create mode 100644 packages/backend/src/misc/is-not-null.ts diff --git a/packages/backend/src/core/entities/NotificationEntityService.ts b/packages/backend/src/core/entities/NotificationEntityService.ts index 33c76c6937..be88a213f4 100644 --- a/packages/backend/src/core/entities/NotificationEntityService.ts +++ b/packages/backend/src/core/entities/NotificationEntityService.ts @@ -1,19 +1,21 @@ import { Inject, Injectable } from '@nestjs/common'; -import { In } from 'typeorm'; import { ModuleRef } from '@nestjs/core'; import { DI } from '@/di-symbols.js'; import type { AccessTokensRepository, NoteReactionsRepository, NotificationsRepository, User } from '@/models/index.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Notification } from '@/models/entities/Notification.js'; -import type { NoteReaction } from '@/models/entities/NoteReaction.js'; import type { Note } from '@/models/entities/Note.js'; import type { Packed } from '@/misc/schema.js'; import { bindThis } from '@/decorators.js'; +import { isNotNull } from '@/misc/is-not-null.js'; +import { notificationTypes } from '@/types.js'; import type { OnModuleInit } from '@nestjs/common'; import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { UserEntityService } from './UserEntityService.js'; import type { NoteEntityService } from './NoteEntityService.js'; +const NOTE_REQUIRED_NOTIFICATION_TYPES = new Set(['mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded'] as (typeof notificationTypes[number])[]); + @Injectable() export class NotificationEntityService implements OnModuleInit { private userEntityService: UserEntityService; @@ -48,13 +50,20 @@ export class NotificationEntityService implements OnModuleInit { public async pack( src: Notification['id'] | Notification, options: { - _hintForEachNotes_?: { - myReactions: Map; + _hint_?: { + packedNotes: Map>; }; }, ): Promise> { const notification = typeof src === 'object' ? src : await this.notificationsRepository.findOneByOrFail({ id: src }); const token = notification.appAccessTokenId ? await this.accessTokensRepository.findOneByOrFail({ id: notification.appAccessTokenId }) : null; + const noteIfNeed = NOTE_REQUIRED_NOTIFICATION_TYPES.has(notification.type) && notification.noteId != null ? ( + options._hint_?.packedNotes != null + ? options._hint_.packedNotes.get(notification.noteId) + : this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { + detail: true, + }) + ) : undefined; return await awaitAll({ id: notification.id, @@ -63,43 +72,10 @@ export class NotificationEntityService implements OnModuleInit { isRead: notification.isRead, userId: notification.notifierId, user: notification.notifierId ? this.userEntityService.pack(notification.notifier ?? notification.notifierId) : null, - ...(notification.type === 'mention' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), - } : {}), - ...(notification.type === 'reply' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), - } : {}), - ...(notification.type === 'renote' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), - } : {}), - ...(notification.type === 'quote' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), - } : {}), + ...(noteIfNeed != null ? { note: noteIfNeed } : {}), ...(notification.type === 'reaction' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), reaction: notification.reaction, } : {}), - ...(notification.type === 'pollEnded' ? { - note: this.noteEntityService.pack(notification.note ?? notification.noteId!, { id: notification.notifieeId }, { - detail: true, - _hint_: options._hintForEachNotes_, - }), - } : {}), ...(notification.type === 'achievementEarned' ? { achievement: notification.achievement, } : {}), @@ -111,32 +87,32 @@ export class NotificationEntityService implements OnModuleInit { }); } + /** + * @param notifications you should join "note" property when fetch from DB, and all notifieeId should be same as meId + */ @bindThis public async packMany( notifications: Notification[], meId: User['id'], ) { if (notifications.length === 0) return []; - - const notes = notifications.filter(x => x.note != null).map(x => x.note!); - const noteIds = notes.map(n => n.id); - const myReactionsMap = new Map(); - const renoteIds = notes.filter(n => n.renoteId != null).map(n => n.renoteId!); - const targets = [...noteIds, ...renoteIds]; - const myReactions = await this.noteReactionsRepository.findBy({ - userId: meId, - noteId: In(targets), - }); - - for (const target of targets) { - myReactionsMap.set(target, myReactions.find(reaction => reaction.noteId === target) ?? null); + + for (const notification of notifications) { + if (meId !== notification.notifieeId) { + // because we call note packMany with meId, all notifieeId should be same as meId + throw new Error('TRY_TO_PACK_ANOTHER_USER_NOTIFICATION'); + } } - await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes)); + const notes = notifications.map(x => x.note).filter(isNotNull); + const packedNotesArray = await this.noteEntityService.packMany(notes, { id: meId }, { + detail: true, + }); + const packedNotes = new Map(packedNotesArray.map(p => [p.id, p])); return await Promise.all(notifications.map(x => this.pack(x, { - _hintForEachNotes_: { - myReactions: myReactionsMap, + _hint_: { + packedNotes, }, }))); } diff --git a/packages/backend/src/misc/is-not-null.ts b/packages/backend/src/misc/is-not-null.ts new file mode 100644 index 0000000000..d89a1957be --- /dev/null +++ b/packages/backend/src/misc/is-not-null.ts @@ -0,0 +1,5 @@ +// we are using {} as "any non-nullish value" as expected +// eslint-disable-next-line @typescript-eslint/ban-types +export function isNotNull(input: T | undefined | null): input is T { + return input != null; +} From 1fed0ff564954329b42171aa2da3d1cc00e39b52 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 20:44:43 +0900 Subject: [PATCH 078/125] New Crowdin updates (#10176) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Vietnamese) * New translations ja-JP.yml (Vietnamese) --- locales/en-US.yml | 2 +- locales/es-ES.yml | 1 + locales/fr-FR.yml | 2 +- locales/ko-KR.yml | 77 ++++++------ locales/vi-VN.yml | 307 +++++++++++++++++++++++++++++++++++++++++++--- locales/zh-TW.yml | 3 + 6 files changed, 335 insertions(+), 57 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 48cce35a44..638c470916 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1182,7 +1182,7 @@ _achievements: _loggedInOnNewYearsDay: title: "Happy New Year!" description: "Logged in on the first day of the year" - flavor: "To another great year on this instance" + flavor: "To another great year!" _cookieClicked: title: "A game in which you click cookies" description: "Clicked the cookie" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index b29ffc12df..3ad2c21ff7 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -854,6 +854,7 @@ tenMinutes: "10 minutos" oneHour: "1 hora" oneDay: "1 día" oneWeek: "1 semana" +oneMonth: "1 mes" reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios" failedToFetchAccountInformation: "No se pudo obtener información de la cuenta" rateLimitExceeded: "Se excedió el límite de peticiones" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 88f20dfc41..f9b8939e8b 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -527,7 +527,7 @@ updateRemoteUser: "Mettre à jour les informations de l’utilisateur·rice dist deleteAllFiles: "Supprimer tous les fichiers" deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?" removeAllFollowing: "Retenir tous les abonnements" -removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action uniquement si l’instance n’existe plus." +removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez lancer cette action dans les cas où l’instance n’existe plus, etc." userSuspended: "Cet·te utilisateur·rice a été suspendu·e." userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." yourAccountSuspendedTitle: "Ce compte est suspendu" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index b43e5e7abe..9115afe5a5 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -2,7 +2,7 @@ _lang_: "한국어" headlineMisskey: "노트로 연결되는 네트워크" introMisskey: "환영합니다! Misskey는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n'노트'를 작성해서 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n'리액션' 기능으로 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀" -poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼Misskey를 사용한 서비스(Misskey 인스턴스라고 불립니다) 중 하나입니다." +poweredByMisskeyDescription: "{name}은(는) 오픈소스 플랫폼Misskey를 사용한 서버 중 하나입니다." monthAndDay: "{month}월 {day}일" search: "검색" notifications: "알림" @@ -18,7 +18,7 @@ enterUsername: "유저명 입력" renotedBy: "{user}님의 리노트" noNotes: "노트가 없습니다" noNotifications: "표시할 알림이 없습니다" -instance: "인스턴스" +instance: "서버" settings: "설정" basicSettings: "기본 설정" otherSettings: "기타 설정" @@ -163,13 +163,13 @@ searchWith: "검색: {q}" youHaveNoLists: "리스트가 없습니다" followConfirm: "{name}님을 팔로우 하시겠습니까?" proxyAccount: "프록시 계정" -proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 인스턴스로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다." +proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다." host: "호스트" selectUser: "유저 선택" recipient: "수신인" annotation: "내용에 대한 주석" federation: "연합" -instances: "인스턴스" +instances: "서버" registeredAt: "등록 날짜" latestRequestReceivedAt: "마지막으로 요청을 받은 시간" latestStatus: "마지막 상태" @@ -178,7 +178,7 @@ charts: "차트" perHour: "1시간마다" perDay: "1일마다" stopActivityDelivery: "액티비티 보내지 않기" -blockThisInstance: "이 인스턴스를 차단" +blockThisInstance: "이 서버를 차단" operations: "작업" software: "소프트웨어" version: "버전" @@ -189,15 +189,15 @@ jobQueue: "작업 대기열" cpuAndMemory: "CPU와 메모리" network: "네트워크" disk: "디스크" -instanceInfo: "인스턴스 정보" +instanceInfo: "서버 정보" statistics: "통계" clearQueue: "대기열 비우기" clearQueueConfirmTitle: "대기열을 비우시겠습니까?" clearQueueConfirmText: "대기열에 남아 있는 노트는 더이상 연합되지 않습니다. 보통의 경우 이 작업은 필요하지 않습니다." clearCachedFiles: "캐시 비우기" clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제하시겠습니까?" -blockedInstances: "차단된 인스턴스" -blockedInstancesDescription: "차단하려는 인스턴스의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다." +blockedInstances: "차단된 서버" +blockedInstancesDescription: "차단하려는 서버의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다." muteAndBlock: "뮤트 및 차단" mutedUsers: "뮤트한 유저" blockedUsers: "차단한 유저" @@ -220,9 +220,9 @@ all: "전체" subscribing: "구독 중" publishing: "배포 중" notResponding: "응답 없음" -instanceFollowing: "인스턴스의 팔로잉" -instanceFollowers: "인스턴스의 팔로워" -instanceUsers: "인스턴스의 유저" +instanceFollowing: "서버의 팔로잉" +instanceFollowers: "서버의 팔로워" +instanceUsers: "서버의 유저" changePassword: "비밀번호 변경" security: "보안" retypedNotMatch: "입력이 일치하지 않습니다." @@ -314,8 +314,8 @@ unwatch: "지켜보기 해제" accept: "허가" reject: "거부" normal: "정상" -instanceName: "인스턴스 이름" -instanceDescription: "인스턴스 소개" +instanceName: "서버 이름" +instanceDescription: "서버 소개" maintainerName: "관리자 이름" maintainerEmail: "관리자 이메일" tosUrl: "이용약관 URL" @@ -345,7 +345,7 @@ basicInfo: "기본 정보" pinnedUsers: "고정된 유저" pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다." pinnedPages: "고정한 페이지" -pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다." +pinnedPagesDescription: "서버의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다." pinnedClipId: "고정할 클립의 ID" pinnedNotes: "고정해놓은 노트" hcaptcha: "hCaptcha" @@ -457,6 +457,7 @@ aboutX: "{x}에 대하여" emojiStyle: "이모지 스타일" native: "네이티브" disableDrawer: "드로어 메뉴를 사용하지 않기" +showNoteActionsOnlyHover: "노트 액션 버튼을 마우스를 올렸을 때에만 표시" noHistory: "기록이 없습니다" signinHistory: "로그인 기록" enableAdvancedMfm: "고급 MFM을 활성화" @@ -537,7 +538,7 @@ updateRemoteUser: "리모트 유저 정보 갱신" deleteAllFiles: "모든 파일 삭제" deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?" removeAllFollowing: "모든 팔로잉 해제" -removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." +removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 서버가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." userSuspended: "이 계정은 정지된 상태입니다." userSilenced: "이 계정은 사일런스된 상태입니다." yourAccountSuspendedTitle: "계정이 정지되었습니다" @@ -603,7 +604,7 @@ testEmail: "이메일 전송 테스트" wordMute: "단어 뮤트" regexpError: "정규 표현식 오류" regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오류가 발생했습니다:" -instanceMute: "인스턴스 뮤트" +instanceMute: "서버 뮤트" userSaysSomething: "{name}님이 무언가를 말했습니다" makeActive: "활성화" display: "표시" @@ -634,15 +635,15 @@ abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다." reporter: "신고자" reporteeOrigin: "피신고자" reporterOrigin: "신고자" -forwardReport: "리모트 인스턴스에도 신고 내용 보내기" -forwardReportIsAnonymous: "리모트 인스턴스에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다." +forwardReport: "리모트 서버에도 신고 내용 보내기" +forwardReportIsAnonymous: "리모트 서버에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다." send: "전송" abuseMarkAsResolved: "해결됨으로 표시" openInNewTab: "새 탭에서 열기" openInSideView: "사이드뷰로 열기" defaultNavigationBehaviour: "기본 탐색 동작" editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다." -instanceTicker: "노트의 인스턴스 정보" +instanceTicker: "노트의 서버 정보" waitingFor: "{x}을(를) 기다리고 있습니다" random: "랜덤" system: "시스템" @@ -731,7 +732,7 @@ capacity: "용량" inUse: "사용중" editCode: "코드 수정" apply: "적용" -receiveAnnouncementFromInstance: "이 인스턴스의 알림을 이메일로 수신할게요" +receiveAnnouncementFromInstance: "이 서버의 알림을 이메일로 수신할게요" emailNotification: "메일 알림" publish: "게시" inChannelSearch: "채널에서 검색" @@ -759,7 +760,7 @@ active: "최근에 활동함" offline: "오프라인" notRecommended: "추천하지 않음" botProtection: "Bot 방어" -instanceBlocking: "인스턴스 차단" +instanceBlocking: "서버 차단" selectAccount: "계정 선택" switchAccount: "계정 바꾸기" enabled: "활성화" @@ -843,8 +844,8 @@ themeColor: "테마 컬러" size: "크기" numberOfColumn: "한 줄에 보일 리액션의 수" searchByGoogle: "검색" -instanceDefaultLightTheme: "인스턴스 기본 라이트 테마" -instanceDefaultDarkTheme: "인스턴스 기본 다크 테마" +instanceDefaultLightTheme: "서버 기본 라이트 테마" +instanceDefaultDarkTheme: "서버 기본 다크 테마" instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요." mutePeriod: "뮤트할 기간" period: "투표 기한" @@ -897,7 +898,7 @@ cannotUploadBecauseInappropriate: "이 파일은 부적절한 내용을 포함 cannotUploadBecauseNoFreeSpace: "드라이브 용량이 부족하여 업로드할 수 없습니다." beta: "베타" enableAutoSensitive: "자동 NSFW 탐지" -enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 인스턴스 정책에 따라 자동으로 설정될 수 있습니다." +enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 서버 정책에 따라 자동으로 설정될 수 있습니다." activeEmailValidationDescription: "유저가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사합니다. 해제할 경우 이메일 형식에 대해서만 검사합니다." navbar: "내비게이션 바" shuffle: "셔플" @@ -907,7 +908,7 @@ pushNotification: "푸시 알림" subscribePushNotification: "푸시 알림 켜기" unsubscribePushNotification: "푸시 알림 끄기" pushNotificationAlreadySubscribed: "푸시 알림이 이미 켜져 있습니다" -pushNotificationNotSupported: "브라우저나 인스턴스에서 푸시 알림이 지원되지 않습니다" +pushNotificationNotSupported: "브라우저나 서버에서 푸시 알림이 지원되지 않습니다" sendPushNotificationReadMessage: "푸시 알림이나 메시지를 읽은 뒤 푸시 알림을 삭제" sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」이라는 알림이 잠깐 표시됩니다. 기기의 전력 소비량이 증가할 수 있습니다." windowMaximize: "최대화" @@ -953,7 +954,7 @@ joinThisServer: "이 서버에 가입" exploreOtherServers: "다른 서버 둘러보기" letsLookAtTimeline: "타임라인 구경하기" disableFederationWarn: "연합이 비활성화됩니다. 비활성화해도 게시물이 비공개가 되지는 않습니다. 대부분의 경우 이 옵션을 활성화할 필요가 없습니다." -invitationRequiredToRegister: "현재 이 서버는 비공개입니다. 회원가입을 하시려면 초대번호가 필요합니다." +invitationRequiredToRegister: "현재 이 서버는 비공개입니다. 회원가입을 하시려면 초대 코드가 필요합니다." _achievements: earnedAt: "달성 일시" _types: @@ -1144,7 +1145,7 @@ _achievements: description: "1분 사이에 홈 타임라인에 노트가 20개 넘게 생성되었습니다" _viewInstanceChart: title: "애널리스트" - description: "인스턴스의 차트를 열었습니다" + description: "서버의 차트를 열었습니다" _outputHelloWorldOnScratchpad: title: "Hello, world!" description: "스크래치패드에서 hello world를 출력했습니다" @@ -1181,7 +1182,7 @@ _achievements: _loggedInOnNewYearsDay: title: "새해 복 많이 받으세요" description: "새해 첫 날에 로그인했습니다" - flavor: "올해에도 저희 인스턴스에 관심을 가져 주셔서 감사합니다" + flavor: "올해에도 저희 서버에 관심을 가져 주셔서 감사합니다" _cookieClicked: title: "쿠키를 클릭하는 게임" description: "쿠키를 클릭했습니다" @@ -1196,7 +1197,7 @@ _role: name: "역할 이름" description: "역할 설명" permission: "역할 권한" - descriptionOfPermission: "모더레이터는 기본적인 중재와 관련된 작업을 수행할 수 있습니다.\n관리자는 인스턴스의 모든 설정을 변경할 수 있습니다." + descriptionOfPermission: "모더레이터는 기본적인 중재와 관련된 작업을 수행할 수 있습니다.\n관리자는 서버의 모든 설정을 변경할 수 있습니다." assignTarget: "할당 대상" descriptionOfAssignTarget: "수동을 선택하면 누가 이 역할에 포함되는지를 수동으로 관리할 수 있습니다.\n조건부를 선택하면 조건을 설정해 일치하는 사용자를 자동으로 포함되게 할 수 있습니다." manual: "수동" @@ -1224,7 +1225,7 @@ _role: gtlAvailable: "글로벌 타임라인 보이기" ltlAvailable: "로컬 타임라인 보이기" canPublicNote: "공개 노트 허용" - canInvite: "인스턴스 초대 코드 발행" + canInvite: "서버 초대 코드 발행" canManageCustomEmojis: "커스텀 이모지 관리" driveCapacity: "드라이브 용량" pinMax: "고정할 수 있는 노트 수" @@ -1286,7 +1287,7 @@ _ad: _forgotPassword: enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다." ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오." - contactAdmin: "이 인스턴스에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오." + contactAdmin: "이 서버에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오." _gallery: my: "내 갤러리" liked: "좋아요 한 갤러리" @@ -1371,10 +1372,10 @@ _wordMute: hard: "보다 높은 수준" mutedNotes: "뮤트된 노트" _instanceMute: - instanceMuteDescription: "뮤트한 인스턴스에서 오는 답글을 포함한 모든 노트와 Renote를 뮤트합니다." + instanceMuteDescription: "뮤트한 서버에서 오는 답글을 포함한 모든 노트와 Renote를 뮤트합니다." instanceMuteDescription2: "한 줄에 하나씩 입력해 주세요" - title: "지정한 인스턴스의 노트를 숨깁니다." - heading: "뮤트할 인스턴스" + title: "지정한 서버의 노트를 숨깁니다." + heading: "뮤트할 서버" _theme: explore: "테마 찾아보기" install: "테마 설치" @@ -1487,7 +1488,7 @@ _tutorial: step4_1: "노트 작성을 끝내셨나요?" step4_2: "당신의 노트가 타임라인에 표시되어 있다면 성공입니다." step5_1: "이제, 다른 사람을 팔로우하여 타임라인을 활기차게 만들어보도록 합시다." - step5_2: "{featured}에서 이 인스턴스의 인기 노트를 보실 수 있습니다. {explore}에서는 인기 사용자를 찾을 수 있구요. 마음에 드는 사람을 골라 팔로우해 보세요!" + step5_2: "{featured}에서 이 서버의 인기 노트를 보실 수 있습니다. {explore}에서는 인기 사용자를 찾을 수 있구요. 마음에 드는 사람을 골라 팔로우해 보세요!" step5_3: "다른 유저를 팔로우하려면 해당 유저의 아이콘을 클릭하여 프로필 페이지를 띄운 후, 팔로우 버튼을 눌러 주세요." step5_4: "사용자에 따라 팔로우가 승인될 때까지 시간이 걸릴 수 있습니다." step6_1: "타임라인에 다른 사용자의 노트가 나타난다면 성공입니다." @@ -1582,7 +1583,7 @@ _weekday: saturday: "토요일" _widgets: profile: "프로필" - instanceInfo: "인스턴스 정보" + instanceInfo: "서버 정보" memo: "스티커 메모" notifications: "알림" timeline: "타임라인" @@ -1596,7 +1597,7 @@ _widgets: digitalClock: "디지털 시계" unixClock: "UNIX 시계" federation: "연합" - instanceCloud: "인스턴스 구름" + instanceCloud: "서버 구름" postForm: "글 입력란" slideshow: "슬라이드 쇼" button: "버튼" @@ -1647,7 +1648,7 @@ _visibility: specified: "다이렉트" specifiedDescription: "지정한 유저에게만 공개" disableFederation: "연합에 보내지 않기" - disableFederationDescription: "다른 인스턴스로 보내지 않습니다" + disableFederationDescription: "다른 서버로 보내지 않습니다" _postForm: replyPlaceholder: "이 노트에 답글..." quotePlaceholder: "이 노트를 인용..." diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml index 89d94961d1..ce36de03db 100644 --- a/locales/vi-VN.yml +++ b/locales/vi-VN.yml @@ -2,6 +2,7 @@ _lang_: "Tiếng Việt" headlineMisskey: "Mạng xã hội liên hợp" introMisskey: "Xin chào! Misskey là một nền tảng tiểu blog phi tập trung mã nguồn mở.\nViết \"tút\" để chia sẻ những suy nghĩ của bạn 📡\nBằng \"biểu cảm\", bạn có thể bày tỏ nhanh chóng cảm xúc của bạn với các tút 👍\nHãy khám phá một thế giới mới! 🚀" +poweredByMisskeyDescription: "{name} là một trong những chủ máy của Misskey là nền tảng mã nguồn mở" monthAndDay: "{day} tháng {month}" search: "Tìm kiếm" notifications: "Thông báo" @@ -10,12 +11,13 @@ password: "Mật khẩu" forgotPassword: "Quên mật khẩu" fetchingAsApObject: "Đang nạp dữ liệu từ Fediverse..." ok: "Đồng ý" -gotIt: "Đã hiểu!" +gotIt: "Hiểu rồi!" cancel: "Hủy" +noThankYou: "Không, cảm ơn" enterUsername: "Nhập tên người dùng" renotedBy: "Chia sẻ bởi {user}" -noNotes: "Chưa có tút nào." -noNotifications: "Không có thông báo" +noNotes: "Chưa có bài viết nào." +noNotifications: "Chưa có thông báo" instance: "Máy chủ" settings: "Cài đặt" basicSettings: "Thiết lập chung" @@ -47,6 +49,7 @@ deleteAndEdit: "Sửa" deleteAndEditConfirm: "Bạn có chắc muốn sửa tút này? Những biểu cảm, lượt trả lời và đăng lại sẽ bị mất." addToList: "Thêm vào danh sách" sendMessage: "Gửi tin nhắn" +copyRSS: "Sao chép RSS" copyUsername: "Chép tên người dùng" searchUser: "Tìm kiếm người dùng" reply: "Trả lời" @@ -65,13 +68,13 @@ export: "Xuất dữ liệu" files: "Tập tin" download: "Tải xuống" driveFileDeleteConfirm: "Bạn có chắc muốn xóa tập tin \"{name}\"? Tút liên quan cũng sẽ bị xóa theo." -unfollowConfirm: "Bạn có chắc muốn ngưng theo dõi {name}?" +unfollowConfirm: "Bạn ngừng theo dõi {name}?" exportRequested: "Đang chuẩn bị xuất tập tin. Quá trình này có thể mất ít phút. Nó sẽ được tự động thêm vào Drive sau khi hoàn thành." importRequested: "Bạn vừa yêu cầu nhập dữ liệu. Quá trình này có thể mất ít phút." lists: "Danh sách" noLists: "Bạn chưa có danh sách nào" -note: "Tút" -notes: "Tút" +note: "Bài viết" +notes: "Bài Viết" following: "Đang theo dõi" followers: "Người theo dõi" followsYou: "Theo dõi bạn" @@ -88,7 +91,7 @@ enterListName: "Đặt tên cho danh sách" privacy: "Bảo mật" makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt" defaultNoteVisibility: "Kiểu tút mặc định" -follow: "Đang theo dõi" +follow: "Theo dõi" followRequest: "Gửi yêu cầu theo dõi" followRequests: "Yêu cầu theo dõi" unfollow: "Ngưng theo dõi" @@ -100,7 +103,9 @@ renoted: "Đã đăng lại." cantRenote: "Không thể đăng lại tút này." cantReRenote: "Không thể đăng lại một tút đăng lại." quote: "Trích dẫn" -pinnedNote: "Tút ghim" +inChannelRenote: "Chia sẻ trong kênh này" +inChannelQuote: "Trích dẫn trong kênh này" +pinnedNote: "Bài viết đã ghim" pinned: "Ghim" you: "Bạn" clickToShow: "Nhấn để xem" @@ -126,6 +131,7 @@ unblockConfirm: "Bạn có chắc muốn bỏ chặn người này?" suspendConfirm: "Bạn có chắc muốn vô hiệu hóa người này?" unsuspendConfirm: "Bạn có chắc muốn bỏ vô hiệu hóa người này?" selectList: "Chọn danh sách" +selectChannel: "Lựa chọn kênh" selectAntenna: "Chọn một antenna" selectWidget: "Chọn tiện ích" editWidgets: "Sửa tiện ích" @@ -141,8 +147,8 @@ cacheRemoteFiles: "Tập tin cache từ xa" cacheRemoteFilesDescription: "Khi tùy chọn này bị tắt, các tập tin từ xa sẽ được tải trực tiếp từ máy chủ khác. Điều này sẽ giúp giảm dung lượng lưu trữ nhưng lại tăng lưu lượng truy cập, vì hình thu nhỏ sẽ không được tạo." flagAsBot: "Đánh dấu đây là tài khoản bot" flagAsBotDescription: "Bật tùy chọn này nếu tài khoản này được kiểm soát bởi một chương trình. Nếu được bật, nó sẽ được đánh dấu để các nhà phát triển khác ngăn chặn chuỗi tương tác vô tận với các bot khác và điều chỉnh hệ thống nội bộ của Misskey để coi tài khoản này như một bot." -flagAsCat: "Tài khoản này là mèo" -flagAsCatDescription: "Bật tùy chọn này để đánh dấu tài khoản là một con mèo." +flagAsCat: "Chế độ Mèeeeeeeeeeo!!" +flagAsCatDescription: "Nếu mà em là một con mèo thì cứ bật nó kiu mèo mèo mèeeeeeeo!! " flagShowTimelineReplies: "Hiện lượt trả lời trong bảng tin" flagShowTimelineRepliesDescription: "Hiện lượt trả lời của người bạn theo dõi trên tút của những người khác." autoAcceptFollowed: "Tự động phê duyệt theo dõi từ những người mà bạn đang theo dõi" @@ -155,7 +161,7 @@ setWallpaper: "Đặt ảnh bìa" removeWallpaper: "Xóa ảnh bìa" searchWith: "Tìm kiếm: {q}" youHaveNoLists: "Bạn chưa có danh sách nào" -followConfirm: "Bạn có chắc muốn theo dõi {name}?" +followConfirm: "Bạn theo dõi {name}?" proxyAccount: "Tài khoản proxy" proxyAccountDescription: "Tài khoản proxy là tài khoản hoạt động như một người theo dõi từ xa cho người dùng trong những điều kiện nhất định. Ví dụ: khi người dùng thêm người dùng từ xa vào danh sách, hoạt động của người dùng từ xa sẽ không được chuyển đến phiên bản nếu không có người dùng cục bộ nào theo dõi người dùng đó, vì vậy tài khoản proxy sẽ theo dõi." host: "Host" @@ -198,7 +204,7 @@ blockedUsers: "Người đã chặn" noUsers: "Chưa có ai" editProfile: "Sửa hồ sơ" noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?" -pinLimitExceeded: "Bạn đã đạt giới hạn số lượng tút có thể ghim" +pinLimitExceeded: "Bạn không thể ghim bài viết nữa" intro: "Đã cài đặt Misskey! Xin hãy tạo tài khoản admin." done: "Xong" processing: "Đang xử lý" @@ -253,6 +259,8 @@ noMoreHistory: "Không còn gì để đọc" startMessaging: "Bắt đầu trò chuyện" nUsersRead: "đọc bởi {n}" agreeTo: "Tôi đồng ý {0}" +agreeBelow: "Đồng ý với nội dung dưới đây" +basicNotesBeforeCreateAccount: "Những điều cơ bản cần chú ý " tos: "Điều khoản dịch vụ" start: "Bắt đầu" home: "Trang chính" @@ -339,7 +347,7 @@ pinnedUsersDescription: "Liệt kê mỗi hàng một tên người dùng xuốn pinnedPages: "Trang đã ghim" pinnedPagesDescription: "Liệt kê các trang thú vị để ghim trên máy chủ." pinnedClipId: "ID của clip muốn ghim" -pinnedNotes: "Tút ghim" +pinnedNotes: "Bài viết đã ghim" hcaptcha: "hCaptcha" enableHcaptcha: "Bật hCaptcha" hcaptchaSiteKey: "Khóa của trang" @@ -348,6 +356,8 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "Bật reCAPTCHA" recaptchaSiteKey: "Khóa của trang" recaptchaSecretKey: "Khóa bí mật" +turnstile: "Turnstile" +enableTurnstile: "Áp dụng Turnstile" turnstileSiteKey: "Khóa của trang" turnstileSecretKey: "Khóa bí mật" avoidMultiCaptchaConfirm: "Dùng nhiều hệ thống Captcha có thể gây nhiễu giữa chúng. Bạn có muốn tắt các hệ thống Captcha khác hiện đang hoạt động không? Nếu bạn muốn chúng tiếp tục được bật, hãy nhấn hủy." @@ -383,13 +393,19 @@ about: "Giới thiệu" aboutMisskey: "Về Misskey" administrator: "Quản trị viên" token: "Token" +2fa: "Xác thực 2 yếu tố" +totp: "Ứng dụng xác thực" +totpDescription: "Nhắn mã OTP bằng ứng dụng xác thực" moderator: "Kiểm duyệt viên" moderation: "Kiểm duyệt" nUsersMentioned: "Dùng bởi {n} người" +securityKeyAndPasskey: "Mã bảo mật・Passkey" securityKey: "Khóa bảo mật" lastUsed: "Dùng lần cuối" +lastUsedAt: "Lần cuối sử dụng: {t}" unregister: "Hủy đăng ký" passwordLessLogin: "Đăng nhập không mật khẩu" +passwordLessLoginDescription: "Đăng nhập bằng chỉ mã bảo mật hoặc passkey, không sử dụng mật khẩu." resetPassword: "Đặt lại mật khẩu" newPasswordIs: "Mật khẩu mới là \"{password}\"" reduceUiAnimation: "Giảm chuyển động UI" @@ -423,7 +439,7 @@ invitations: "Mời" invitationCode: "Mã mời" checking: "Đang kiểm tra..." available: "Khả dụng" -unavailable: "Không khả dụng" +unavailable: "Không sử dụng được" usernameInvalidFormat: "Bạn có thể dùng viết hoa/viết thường, chữ số, và dấu gạch dưới." tooShort: "Quá ngắn" tooLong: "Quá dài" @@ -438,9 +454,13 @@ or: "Hoặc" language: "Ngôn ngữ" uiLanguage: "Ngôn ngữ giao diện" aboutX: "Giới thiệu {x}" +emojiStyle: "Kiểu cách Emoji" +native: "Bản xứ" disableDrawer: "Không dùng menu thanh bên" noHistory: "Không có dữ liệu" signinHistory: "Lịch sử đăng nhập" +enableAdvancedMfm: "Xem bài MFM chất lượng cao." +enableAnimatedMfm: "Xem bài MFM có chuyển động" doing: "Đang xử lý..." category: "Phân loại" tags: "Thẻ" @@ -628,7 +648,7 @@ random: "Ngẫu nhiên" system: "Hệ thống" switchUi: "Chuyển đổi giao diện người dùng" desktop: "Desktop" -clip: "Ghim" +clip: "Lưu bài viết" createNew: "Tạo mới" optional: "Không bắt buộc" createNewClip: "Tạo một ghim mới" @@ -667,7 +687,7 @@ pageLikesCount: "Số lượng trang đã thích" pageLikedCount: "Số lượng thích trang đã nhận" contact: "Liên hệ" useSystemFont: "Dùng phông chữ mặc định của hệ thống" -clips: "Ghim" +clips: "Lưu bài viết" experimentalFeatures: "Tính năng thử nghiệm" developer: "Nhà phát triển" makeExplorable: "Không hiện tôi trong \"Khám phá\"" @@ -693,6 +713,7 @@ accentColor: "Màu phụ" textColor: "Màu chữ" saveAs: "Lưu thành" advanced: "Nâng cao" +advancedSettings: "Cài đặt nâng cao" value: "Giá trị" createdAt: "Ngày tạo" updatedAt: "Cập nhật lúc" @@ -758,6 +779,7 @@ popularPosts: "Tút được xem nhiều nhất" shareWithNote: "Chia sẻ kèm với tút" ads: "Quảng cáo" expiration: "Thời hạn" +startingperiod: "Thời gian bắt đầu\n" memo: "Lưu ý" priority: "Ưu tiên" high: "Cao" @@ -790,6 +812,7 @@ lastCommunication: "Lần giao tiếp cuối" resolved: "Đã xử lý" unresolved: "Chờ xử lý" breakFollow: "Xóa người theo dõi" +breakFollowConfirm: "Bạn bỏ theo dõi tài khoản này không?" itsOn: "Đã bật" itsOff: "Đã tắt" emailRequiredForSignup: "Yêu cầu địa chỉ email khi đăng ký" @@ -830,11 +853,13 @@ tenMinutes: "10 phút" oneHour: "1 giờ" oneDay: "1 ngày" oneWeek: "1 tuần" +oneMonth: "1 tháng" reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng." failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản" rateLimitExceeded: "Giới hạn quá mức" cropImage: "Cắt hình ảnh" cropImageAsk: "Bạn có muốn cắt ảnh này?" +cropNo: "Để nguyên" file: "Tập tin" recentNHours: "{n}h trước" recentNDays: "{n} ngày trước" @@ -877,15 +902,231 @@ navbar: "Thanh điều hướng" shuffle: "Xáo trộn" account: "Tài khoản của bạn" move: "Di chuyển" +pushNotification: "Thông báo đẩy" +subscribePushNotification: "Bật thông báo đẩy" +unsubscribePushNotification: "Tắt thông báo đẩy" +pushNotificationAlreadySubscribed: "Đang bật thông báo đẩy" +sendPushNotificationReadMessage: "Xóa thông báo đẩy sau khi đọc thông báo hay tin nhắn" +sendPushNotificationReadMessageCaption: "Thông báo như {emptyPushNotificationMessage} sẽ hiển thị trong giây phút. Tiêu tốn pin của máy bạn có thể tăng lên hơn nữa." +windowMaximize: "Phóng to" +windowRestore: "Khôi phục" +caption: "Mô tả" +loggedInAsBot: "Đang đăng nhập bằng tài khoản Bot" +tools: "Công Cụ" +cannotLoad: "Không tải được" +numberOfProfileView: "Số lần mở hồ sơ" like: "Thích" +unlike: "Bỏ lượt thích" +numberOfLikes: "Lượt thích" show: "Hiển thị" +neverShow: "Không hiển thị nữa" +remindMeLater: "Để sau" +didYouLikeMisskey: "Bạn có ưa thích Mískey không?" +pleaseDonate: "Misskey là phần mềm miễn phí mà {host} đang sử dụng. Xin mong bạn quyên góp cho chúng tôi để chúng tôi có thể tiếp tục phát triển dịch vụ này. Xin cảm ơn!!" +roles: "Vai trò" +role: "Vai trò" +normalUser: "Người dùng bình thường" +undefined: "Chưa xác định" color: "Màu sắc" +manageCustomEmojis: "Quản lý CustomEmoji" +cannotPerformTemporary: "Tạm thời không sử dụng được" +cannotPerformTemporaryDescription: "Tạm thời không sử dụng được vì lần số điều kiện quá giới hạn. Thử lại sau mọt lát nữa." +achievements: "Thành tích" +gotInvalidResponseError: "Không nhận được trả lời chủ máy" +gotInvalidResponseErrorDescription: "Chủ máy có lẻ ngừng hoạt động hoặc bảo trí. Thử lại sau một lát nữa. " +thisPostMayBeAnnoying: "Bạn đăng bài này có thể làm phiền cho người ta." +thisPostMayBeAnnoyingHome: "Đăng trên trang chính" +thisPostMayBeAnnoyingCancel: "Từ chối" +thisPostMayBeAnnoyingIgnore: "Đăng bài để nguyên" +collapseRenotes: "Không hiển thị bài viết đã từng xem" +internalServerError: "Lỗi trong chủ máy" +internalServerErrorDescription: "Trong chủ máy lỗi bất ngờ xảy ra" +copyErrorInfo: "Sao chép thông tin lỗi" +joinThisServer: "Đăng ký trên chủ máy này" +exploreOtherServers: "Tìm chủ máy khác" +letsLookAtTimeline: "Thử xem Timeline" +_achievements: + earnedAt: "Ngày thu nhận" + _types: + _notes1: + title: "just setting up my msky" + description: "Lần đầu tiên đăng bài" + flavor: "Chúc bạn trên Miskey vui vẻ nha!!" + _notes10: + title: "Một số bài viết" + description: "Đăng bài 10 lần" + _notes100: + title: "Rất nhiều bài biết" + description: "Đăng bài 100 lần" + _notes500: + title: "Như đầy bài viết" + description: "Đăng bài 500 lần" + _notes1000: + title: "Ngọn núi bài viết" + description: "Đăng bài 1000 lần" + _notes5000: + title: "Bài viết chảy như suối" + description: "Đăng bài 5000 lần" + _notes10000: + title: "Bài Viết siu nhìu" + description: "Đăng bài 10000 lần" + _notes20000: + title: "Need more note" + description: "Đã đăng bài 20,000 lần rồi" + _notes30000: + title: "ĐĂNG VỚI BÀI" + description: "Đã đăng bài 30,000 lần rồi" + _notes40000: + title: "Nhà xưởng dăng bài" + description: "Đã đăng bài 40,000 lần rồi" + _notes50000: + title: "Hàng tinh đăng bài" + description: "Đã đăng bài 50,000 lần rồi" + _notes100000: + flavor: "Liệu viết bài gì tầm này vậy? " + _login3: + title: "Sơ cấp I" + description: "Tổng số ngày đăng nhập đạt 3 ngày" + flavor: "Từ nay các bạn cứ xem như mình là một Misskist đó" + _login7: + title: "Sơ cấp II" + description: "Tổng số ngày đăng nhập đạt 7 ngày" + flavor: "Bạn dần quen chưa? " + _login15: + title: "Sơ cấp III" + description: "Tổng số ngày đăng nhập đạt 7 ngày" + _login30: + title: "Misskist cấp I" + description: "Tổng số ngày đăng nhập đạt 30 ngày" + _login60: + title: "Misskist cấp II" + description: "Tổng số ngày đăng nhập đạt 60 ngày" + _login100: + title: "Misskist cấp III" + description: "Tổng số ngày đăng nhập đạt 100 ngày" + flavor: "Người dùng này, chính vì đó là một Misskist" + _login200: + title: "Khách hàng thường xuyên cấp I" + description: "Tổng số ngày đăng nhập đạt 200 ngày" + _login300: + title: "Khách hàng thường xuyên cấp II" + description: "Tổng số ngày đăng nhập đạt 300 ngày" + _login400: + title: "Khách hàng thường xuyên cấp III" + description: "Tổng số ngày đăng nhập đạt 400 ngày" + _markedAsCat: + title: "Tôi là một con mèo" + description: "Bật chế độ mèo" + flavor: "Mà tên chưa có" + _following1: + title: "Theo dõi đầu tiên" + description: "Lần đầu tiên theo dõi " + _following10: + title: "Cứ theo dõi và theo dõi" + description: "Vừa theo dõi hơn 10 người" + _following50: + title: "Bạn bè nhiều quá" + description: "Vừa theo dõi hơn 50 người" + _following100: + title: "Trăm bạn bè" + description: "Vừa theo dõi vượt lên 100 người" + _following300: + title: "Quá nhiều bạn bè" + description: "Vừa theo dõi vượt lên 300 người" + _followers1: + title: "Ai đầu tiên theo dõi bạn" + description: "Lần đầu tiên được theo dõi" + _followers10: + title: "FOLLOW ME!!" + description: "Người theo dõi bạn vượt lên 10 người" + _followers500: + title: "Trạm phát sóng" + _followers1000: + title: "Người có tầm ảnh hưởng" + description: "Người theo dõi bạn vượt lên 1000 người" + _collectAchievements30: + title: "Người sưu tập thành tích" + description: "Vừa lấy thành tích hơn 30 cái" + _viewAchievements3min: + title: "Yêu Thành tích" + description: "Ngắm danh sách thành tích đến tận hơn 3 phút" + _iLoveMisskey: + title: "Tôi Yêu Misskey" + description: "Đăng lời nói \"I ❤ #Misskey\"" + flavor: "Xin chân thành cảm ơn bạn đã sử dụng Misskey!! by Đội ngũ phát triển" + _foundTreasure: + title: "Tìm kiếm kho báu" + description: "Tìm thấy được những kho báu cất giấu" + _client30min: + title: "Giải lao xỉu" + _noteDeletedWithin1min: + title: "Xem như không có gì đâu nha" + _postedAtLateNight: + title: "Loài ăn đêm" + description: "Đăng bài trong đêm khuya " + _postedAt0min0sec: + title: "Tín hiệu báo giờ" + description: "Đăng bài vào 0 phút 0 giây" + flavor: "Piiiiiii ĐÂY LÀ TIẾNG NÓI VIỆT NAM" + _selfQuote: + title: "Nói đến bản thân" + description: "Trích dẫn bài viết của mình" + _htl20npm: + title: "Timeline trôi như con sông" + description: "Timeline trang chính tốc độ vượt lên 20npm" + _viewInstanceChart: + title: "Nhà phân tích" + description: "Xem biểu đồ của chủ máy" + _outputHelloWorldOnScratchpad: + title: "Chào thế giới!" + _open3windows: + title: "Nhiều cửa sổ" + description: "Mở cửa sổ hơn 3 cửa sổ" + _reactWithoutRead: + title: "Bài này bạn đọc kỹ chứ? " + description: "Phản hồi trong vọng 3 giây sau bài viết có hơn 100 ký tự mới được đăng lên" + _clickedClickHere: + title: "Bấm đây" + description: "Bấm chỗ này" + _justPlainLucky: + title: "Chỉ là một cuộc máy mắn" + description: "Mỗi 10 giây thu nhận được với tỷ lệ 0.005%" + _setNameToSyuilo: + title: "Ngưỡng mộ với vị thần" + description: "Đạt tên là syuilo" + _loggedInOnBirthday: + title: "Sinh nhật vủi vẻ" + description: "Đăng nhập vào ngày sinh" + _loggedInOnNewYearsDay: + title: "Chức mừng năm mới" + description: "Đăng nhập vào Tết Nguyên đàn dương lịch" + flavor: "Chúc bạn năm mới AN KHANG THỊNH VƯỢNG, VẠN SỰ NHƯ Ý!!" + _cookieClicked: + flavor: "Bạn nhầm phầm mềm chứ?" _role: priority: "Ưu tiên" _priority: low: "Thấp" middle: "Vừa" high: "Cao" + _options: + gtlAvailable: "Xem Timeline xã hội" + ltlAvailable: "Xem Timeline trong máy chủ này" + canPublicNote: "Cho phép đăng bài công khai" + canManageCustomEmojis: "Quản lý CustomEmoji" + driveCapacity: "Dữ liệu Drive" + pinMax: "Giới hạn ghim bài viết" + antennaMax: "Giới hạn tạo ăng ten" + canHideAds: "Tắt quảng cáo" + _condition: + createdMoreThan: "Trôi qua ~ sau khi lập tài khoản" + followersLessThanOrEq: "Người theo dõi ít hơn ~" + followersMoreThanOrEq: "Người theo dõi có ~ trở lên" + followingLessThanOrEq: "Theo dõi ít hơn ~" + followingMoreThanOrEq: "Theo dõi có ~ trở lên" + and: "~ mà ~" + or: "~ hay là ~" + not: "Không phải ~" _sensitiveMediaDetection: description: "Giảm nỗ lực kiểm duyệt máy chủ thông qua việc tự động nhận dạng media NSFW thông qua học máy. Điều này sẽ làm tăng một chút áp lực trên máy chủ." sensitivity: "Phát hiện nhạy cảm" @@ -1132,15 +1373,23 @@ _tutorial: step7_1: "Xin chúc mừng! Bây giờ bạn đã hoàn thành phần hướng dẫn cơ bản của Misskey." step7_2: "Nếu bạn muốn tìm hiểu thêm về Misskey, hãy thử phần {help}." step7_3: "Bây giờ, chúc may mắn và vui vẻ với Misskey! 🚀" + step8_1: "Cuối cùng, bạn hãy bật thông báo đẩy nha!" + step8_2: "Nhận thông báo đẩy bạn sẽ có thể thấy phản hồi, theo dõi, lượt nhắc được trong khi đóng Misskey" _2fa: alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước." + passwordToTOTP: "Nhắn mật mã" step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn." step2: "Sau đó, quét mã QR hiển thị trên màn hình này." step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:" step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập." step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó." securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình." + removeKey: "Xóa mã bảo mật" removeKeyConfirm: "Xóa bản sao lưu {name}?" + renewTOTP: "Cài đặt lại ứng dụng xác thực" + renewTOTPConfirm: "Mã xác nhận cũ của ứng dụng xác thực không thể sử dụng được nữa" + renewTOTPOk: "Cài đặt lại" + renewTOTPCancel: "Không, cảm ơn" _permissions: "read:account": "Xem thông tin tài khoản của bạn" "write:account": "Sửa thông tin tài khoản của bạn" @@ -1175,12 +1424,15 @@ _permissions: "read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi" "write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi" _auth: + shareAccessTitle: "Cho phép truy cập app" shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?" shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của mình không?" + permission: "{name} đang yêu cầu quyền hạn dưới đây" permissionAsk: "Ứng dụng này yêu cầu các quyền sau" pleaseGoBack: "Vui lòng quay lại ứng dụng" callback: "Quay lại ứng dụng" denied: "Truy cập bị từ chối" + pleaseLogin: "Bạn phải đăng nhập để cho ứng dụng phép truy cập" _antennaSources: all: "Toàn bộ tút" homeTimeline: "Tút từ những người đã theo dõi" @@ -1218,9 +1470,12 @@ _widgets: jobQueue: "Công việc chờ xử lý" serverMetric: "Thống kê máy chủ" aiscript: "AiScript console" + aiscriptApp: "AiScript App" aichan: "Ai" + userList: "Danh sách người dùng" _userList: chooseList: "Chọn danh sách" + clicker: "clicker" _cw: hide: "Ẩn" show: "Tải thêm" @@ -1257,6 +1512,8 @@ _visibility: followersDescription: "Dành riêng cho người theo dõi" specified: "Nhắn riêng" specifiedDescription: "Chỉ người được nhắc đến mới thấy" + disableFederation: "Không liên hợp" + disableFederationDescription: "Không đưa tin cho chủ máy khác" _postForm: replyPlaceholder: "Trả lời tút này" quotePlaceholder: "Trích dẫn tút này" @@ -1266,7 +1523,7 @@ _postForm: b: "Hôm nay bạn có gì vui?" c: "Bạn đang nghĩ gì?" d: "Bạn muốn nói gì?" - e: "Bắt đầu viết..." + e: "Cứ viết trên đây" f: "Đang chờ bạn viết..." _profile: name: "Tên" @@ -1282,6 +1539,7 @@ _profile: changeBanner: "Đổi ảnh bìa" _exportOrImport: allNotes: "Toàn bộ tút" + favoritedNotes: "Bài viết đã thích" followingList: "Đang theo dõi" muteList: "Ẩn" blockingList: "Chặn" @@ -1320,7 +1578,16 @@ _timelines: social: "Xã hội" global: "Liên hợp" _play: + new: "Tạo Play mới" + edit: "Edit play" + created: "Bạn vừa tạo play rồi" + updated: "Bạn vừa cập nhật play rồi" + deleted: "Bạn vừa xóa play rồi" + pageSetting: "Cài đặt play" + editThisPage: "Edit play này" viewSource: "Xem mã nguồn" + my: "Play của mình" + liked: "Play đã thích" featured: "Nổi tiếng" title: "Tựa đề" script: "Kịch bản" @@ -1388,7 +1655,9 @@ _notification: youReceivedFollowRequest: "Bạn vừa có một yêu cầu theo dõi" yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận" pollEnded: "Cuộc bình chọn đã kết thúc" + unreadAntennaNote: "Ăng ten" emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy" + achievementEarned: "Hoàn thành Achievement" _types: all: "Toàn bộ" follow: "Đang theo dõi" @@ -1400,6 +1669,7 @@ _notification: pollEnded: "Bình chọn kết thúc" receiveFollowRequest: "Yêu cầu theo dõi" followRequestAccepted: "Yêu cầu theo dõi được chấp nhận" + achievementEarned: "Hoàn thành Achievement" app: "Từ app liên kết" _actions: followBack: "đã theo dõi lại bạn" @@ -1432,3 +1702,6 @@ _deck: channel: "Kênh" mentions: "Lượt nhắc" direct: "Nhắn riêng" +_dialog: + charactersExceeded: "Bạn nhắn quá giới hạn ký tự!! Hiện nay {current} / giới hạn {max}" + charactersBelow: "Bạn nhắn quá ít tối thiểu ký tự!! Hiện nay {current} / Tối thiểu {min}" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 218df5d9f3..43ab334be7 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -457,6 +457,7 @@ aboutX: "關於{x}" emojiStyle: "表情符號的風格" native: "原生" disableDrawer: "不顯示下拉式選單" +showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項" noHistory: "沒有歷史紀錄" signinHistory: "登入歷史" enableAdvancedMfm: "啟用高級MFM" @@ -853,6 +854,7 @@ tenMinutes: "10分鐘" oneHour: "1小時" oneDay: "1天" oneWeek: "1週" +oneMonth: "1個月" reflectMayTakeTime: "可能需要一些時間才會出現效果。" failedToFetchAccountInformation: "取得帳戶資訊失敗" rateLimitExceeded: "已超過速率限制" @@ -952,6 +954,7 @@ joinThisServer: "在此伺服器上註冊" exploreOtherServers: "探索其他伺服器" letsLookAtTimeline: "看看時間軸" disableFederationWarn: "聯邦被停用了。即使停用也不會讓您的貼文不公開,在大多數情況下,不需要啟用這個選項。" +invitationRequiredToRegister: "目前這個伺服器為邀請制,必須擁有邀請碼才能註冊。" _achievements: earnedAt: "獲得日期" _types: From 7e8700514f18409874737cd5b439280bb03b829c Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 20:45:17 +0900 Subject: [PATCH 079/125] 13.9.1 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a5e6da4f2..37a5ab3e1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ You should also include the user name that made the change. --> +## 13.9.1 (2023/03/03) + +### Bugfixes +- ノートに添付したファイルが表示されない場合があるのを修正 + ## 13.9.0 (2023/03/03) ### Improvements diff --git a/package.json b/package.json index b870d8507d..a2d04030f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.9.0", + "version": "13.9.1", "codename": "nasubi", "repository": { "type": "git", From aee7ed992b40c31c0e0c4f2eff3f2403ecaecdd0 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Mar 2023 10:17:45 +0900 Subject: [PATCH 080/125] enhance(client): add share button to clip and channel page Resolve #10183 --- CHANGELOG.md | 8 ++++++++ packages/frontend/src/pages/channel.vue | 11 +++++++++++ packages/frontend/src/pages/clip.vue | 13 ++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37a5ab3e1f..67d1d5070d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,14 @@ You should also include the user name that made the change. --> +## 13.x.x (unreleased) + +### Improvements +- クリップ、チャンネルページに共有ボタンを追加 + +### Bugfixes +- + ## 13.9.1 (2023/03/03) ### Bugfixes diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue index 6b4fcb32f8..7e9cebbd4d 100644 --- a/packages/frontend/src/pages/channel.vue +++ b/packages/frontend/src/pages/channel.vue @@ -47,6 +47,7 @@ import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import { deviceKind } from '@/scripts/device-kind'; import MkNotes from '@/components/MkNotes.vue'; +import { url } from '@/config'; const router = useRouter(); @@ -77,6 +78,16 @@ function edit() { } const headerActions = $computed(() => channel && channel.userId ? [{ + icon: 'ti ti-share', + text: i18n.ts.share, + handler: async (): Promise => { + navigator.share({ + title: channel.name, + text: channel.description, + url: `${url}/channels/${channel.id}`, + }); + }, +}, { icon: 'ti ti-settings', text: i18n.ts.edit, handler: edit, diff --git a/packages/frontend/src/pages/clip.vue b/packages/frontend/src/pages/clip.vue index d4e8f27005..d66088d33a 100644 --- a/packages/frontend/src/pages/clip.vue +++ b/packages/frontend/src/pages/clip.vue @@ -26,6 +26,7 @@ import { $i } from '@/account'; import { i18n } from '@/i18n'; import * as os from '@/os'; import { definePageMetadata } from '@/scripts/page-metadata'; +import { url } from '@/config'; const props = defineProps<{ clipId: string, @@ -82,7 +83,17 @@ const headerActions = $computed(() => clip && isOwned ? [{ ...result, }); }, -}, { +}, ...(clip.isPublic ? [{ + icon: 'ti ti-share', + text: i18n.ts.share, + handler: async (): Promise => { + navigator.share({ + title: clip.name, + text: clip.description, + url: `${url}/clips/${clip.id}`, + }); + }, +}] : []), { icon: 'ti ti-trash', text: i18n.ts.delete, danger: true, From dcd4d808690f2ee9b9bea6bdfd164efa43296d52 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Mar 2023 10:34:54 +0900 Subject: [PATCH 081/125] enhance(client): improve channel ui --- locales/ja-JP.yml | 2 ++ packages/frontend/src/pages/channel.vue | 29 ++++++++++++++++++- .../frontend/src/pages/settings/general.vue | 2 ++ .../pages/settings/preferences-backups.vue | 1 + packages/frontend/src/store.ts | 4 +++ packages/frontend/src/style.scss | 6 ++++ .../frontend/src/ui/deck/channel-column.vue | 1 - 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8fee2726e8..ef70469935 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -506,6 +506,7 @@ objectStorageSetPublicRead: "アップロード時に'public-read'を設定す serverLogs: "サーバーログ" deleteAll: "全て削除" showFixedPostForm: "タイムライン上部に投稿フォームを表示する" +showFixedPostFormInChannel: "タイムライン上部に投稿フォームを表示する(チャンネル)" newNoteRecived: "新しいノートがあります" sounds: "サウンド" sound: "サウンド" @@ -955,6 +956,7 @@ exploreOtherServers: "他のサーバーを探す" letsLookAtTimeline: "タイムラインを見てみる" disableFederationWarn: "連合が無効になっています。無効にしても投稿が非公開にはなりません。ほとんどの場合、このオプションを有効にする必要はありません。" invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。" +postToTheChannel: "チャンネルに投稿" _achievements: earnedAt: "獲得日時" diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue index 7e9cebbd4d..81fc5ec877 100644 --- a/packages/frontend/src/pages/channel.vue +++ b/packages/frontend/src/pages/channel.vue @@ -24,7 +24,7 @@ - + @@ -32,6 +32,15 @@ + @@ -48,6 +57,8 @@ import { definePageMetadata } from '@/scripts/page-metadata'; import { deviceKind } from '@/scripts/device-kind'; import MkNotes from '@/components/MkNotes.vue'; import { url } from '@/config'; +import MkButton from '@/components/MkButton.vue'; +import { defaultStore } from '@/store'; const router = useRouter(); @@ -77,6 +88,14 @@ function edit() { router.push(`/channels/${channel.id}/edit`); } +function openPostForm() { + os.post({ + channel: { + id: channel.channelId, + }, + }); +} + const headerActions = $computed(() => channel && channel.userId ? [{ icon: 'ti ti-share', text: i18n.ts.share, @@ -109,6 +128,14 @@ definePageMetadata(computed(() => channel ? { } : null)); + + - From 49f0837729ab094d2f7646c77ff7ba16a39430c0 Mon Sep 17 00:00:00 2001 From: rinsuki <428rinsuki+git@gmail.com> Date: Sat, 4 Mar 2023 16:48:50 +0900 Subject: [PATCH 084/125] fix(server): DriveFile related N+1 query when call note packMany (again) (#10190) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Revert "fix(server): DriveFile related N+1 query when call note packMany (#10133)"" This reverts commit a7c82eeabcc732e76c5c358c98812cac8457d57f. * packManyByIdsMap: 存在チェックをしてなかったものは null を入れるように * Note.packMany で reply とか renote がもうあったらそのファイルも引く * テストを書く * fix test * fix test * fix test * fix test --- .../core/entities/DriveFileEntityService.ts | 28 ++++- .../core/entities/GalleryPostEntityService.ts | 3 +- .../src/core/entities/NoteEntityService.ts | 24 +++- packages/backend/test/e2e/note.ts | 118 +++++++++++++++++- 4 files changed, 168 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts index 158fafa9d5..f769ddd5e9 100644 --- a/packages/backend/src/core/entities/DriveFileEntityService.ts +++ b/packages/backend/src/core/entities/DriveFileEntityService.ts @@ -1,5 +1,5 @@ import { forwardRef, Inject, Injectable } from '@nestjs/common'; -import { DataSource } from 'typeorm'; +import { DataSource, In } from 'typeorm'; import { DI } from '@/di-symbols.js'; import type { NotesRepository, DriveFilesRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; @@ -21,6 +21,7 @@ type PackOptions = { }; import { bindThis } from '@/decorators.js'; import { isMimeImage } from '@/misc/is-mime-image.js'; +import { isNotNull } from '@/misc/is-not-null.js'; @Injectable() export class DriveFileEntityService { @@ -255,10 +256,33 @@ export class DriveFileEntityService { @bindThis public async packMany( - files: (DriveFile['id'] | DriveFile)[], + files: DriveFile[], options?: PackOptions, ): Promise[]> { const items = await Promise.all(files.map(f => this.packNullable(f, options))); return items.filter((x): x is Packed<'DriveFile'> => x != null); } + + @bindThis + public async packManyByIdsMap( + fileIds: DriveFile['id'][], + options?: PackOptions, + ): Promise['id'], Packed<'DriveFile'> | null>> { + const files = await this.driveFilesRepository.findBy({ id: In(fileIds) }); + const packedFiles = await this.packMany(files, options); + const map = new Map['id'], Packed<'DriveFile'> | null>(packedFiles.map(f => [f.id, f])); + for (const id of fileIds) { + if (!map.has(id)) map.set(id, null); + } + return map; + } + + @bindThis + public async packManyByIds( + fileIds: DriveFile['id'][], + options?: PackOptions, + ): Promise[]> { + const filesMap = await this.packManyByIdsMap(fileIds, options); + return fileIds.map(id => filesMap.get(id)).filter(isNotNull); + } } diff --git a/packages/backend/src/core/entities/GalleryPostEntityService.ts b/packages/backend/src/core/entities/GalleryPostEntityService.ts index ab29e7dba1..fb147ae181 100644 --- a/packages/backend/src/core/entities/GalleryPostEntityService.ts +++ b/packages/backend/src/core/entities/GalleryPostEntityService.ts @@ -41,7 +41,8 @@ export class GalleryPostEntityService { title: post.title, description: post.description, fileIds: post.fileIds, - files: this.driveFileEntityService.packMany(post.fileIds), + // TODO: packMany causes N+1 queries + files: this.driveFileEntityService.packManyByIds(post.fileIds), tags: post.tags.length > 0 ? post.tags : undefined, isSensitive: post.isSensitive, likedCount: post.likedCount, diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index 2ffe5f1c21..4ec10df9a6 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -11,6 +11,7 @@ import type { Note } from '@/models/entities/Note.js'; import type { NoteReaction } from '@/models/entities/NoteReaction.js'; import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository, DriveFilesRepository } from '@/models/index.js'; import { bindThis } from '@/decorators.js'; +import { isNotNull } from '@/misc/is-not-null.js'; import type { OnModuleInit } from '@nestjs/common'; import type { CustomEmojiService } from '../CustomEmojiService.js'; import type { ReactionService } from '../ReactionService.js'; @@ -248,6 +249,21 @@ export class NoteEntityService implements OnModuleInit { return true; } + @bindThis + public async packAttachedFiles(fileIds: Note['fileIds'], packedFiles: Map | null>): Promise[]> { + const missingIds = []; + for (const id of fileIds) { + if (!packedFiles.has(id)) missingIds.push(id); + } + if (missingIds.length) { + const additionalMap = await this.driveFileEntityService.packManyByIdsMap(missingIds); + for (const [k, v] of additionalMap) { + packedFiles.set(k, v); + } + } + return fileIds.map(id => packedFiles.get(id)).filter(isNotNull); + } + @bindThis public async pack( src: Note['id'] | Note, @@ -257,6 +273,7 @@ export class NoteEntityService implements OnModuleInit { skipHide?: boolean; _hint_?: { myReactions: Map; + packedFiles: Map | null>; }; }, ): Promise> { @@ -284,6 +301,7 @@ export class NoteEntityService implements OnModuleInit { const reactionEmojiNames = Object.keys(note.reactions) .filter(x => x.startsWith(':') && x.includes('@') && !x.includes('@.')) // リモートカスタム絵文字のみ .map(x => this.reactionService.decodeReaction(x).reaction.replaceAll(':', '')); + const packedFiles = options?._hint_?.packedFiles; const packed: Packed<'Note'> = await awaitAll({ id: note.id, @@ -304,7 +322,7 @@ export class NoteEntityService implements OnModuleInit { emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined, tags: note.tags.length > 0 ? note.tags : undefined, fileIds: note.fileIds, - files: this.driveFileEntityService.packMany(note.fileIds), + files: packedFiles != null ? this.packAttachedFiles(note.fileIds, packedFiles) : this.driveFileEntityService.packManyByIds(note.fileIds), replyId: note.replyId, renoteId: note.renoteId, channelId: note.channelId ?? undefined, @@ -388,11 +406,15 @@ export class NoteEntityService implements OnModuleInit { } await this.customEmojiService.prefetchEmojis(this.customEmojiService.aggregateNoteEmojis(notes)); + // TODO: 本当は renote とか reply がないのに renoteId とか replyId があったらここで解決しておく + const fileIds = notes.map(n => [n.fileIds, n.renote?.fileIds, n.reply?.fileIds]).flat(2).filter(isNotNull); + const packedFiles = await this.driveFileEntityService.packManyByIdsMap(fileIds); return await Promise.all(notes.map(n => this.pack(n, me, { ...options, _hint_: { myReactions: myReactionsMap, + packedFiles, }, }))); } diff --git a/packages/backend/test/e2e/note.ts b/packages/backend/test/e2e/note.ts index 98ee34d8d1..1b5f9580d5 100644 --- a/packages/backend/test/e2e/note.ts +++ b/packages/backend/test/e2e/note.ts @@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import { Note } from '@/models/entities/Note.js'; -import { signup, post, uploadUrl, startServer, initTestDb, api } from '../utils.js'; +import { signup, post, uploadUrl, startServer, initTestDb, api, uploadFile } from '../utils.js'; import type { INestApplicationContext } from '@nestjs/common'; describe('Note', () => { @@ -213,6 +213,122 @@ describe('Note', () => { assert.deepStrictEqual(noteDoc.mentions, [bob.id]); }); + describe('添付ファイル情報', () => { + test('ファイルを添付した場合、投稿成功時にファイル情報入りのレスポンスが帰ってくる', async () => { + const file = await uploadFile(alice); + const res = await api('/notes/create', { + fileIds: [file.body.id], + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.createdNote.files.length, 1); + assert.strictEqual(res.body.createdNote.files[0].id, file.body.id); + }); + + test('ファイルを添付した場合、タイムラインでファイル情報入りのレスポンスが帰ってくる', async () => { + const file = await uploadFile(alice); + const createdNote = await api('/notes/create', { + fileIds: [file.body.id], + }, alice); + + assert.strictEqual(createdNote.status, 200); + + const res = await api('/notes', { + withFiles: true, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + const myNote = res.body.find((note: { id: string; files: { id: string }[] }) => note.id === createdNote.body.createdNote.id); + assert.notEqual(myNote, null); + assert.strictEqual(myNote.files.length, 1); + assert.strictEqual(myNote.files[0].id, file.body.id); + }); + + test('ファイルが添付されたノートをリノートした場合、タイムラインでファイル情報入りのレスポンスが帰ってくる', async () => { + const file = await uploadFile(alice); + const createdNote = await api('/notes/create', { + fileIds: [file.body.id], + }, alice); + + assert.strictEqual(createdNote.status, 200); + + const renoted = await api('/notes/create', { + renoteId: createdNote.body.createdNote.id, + }, alice); + assert.strictEqual(renoted.status, 200); + + const res = await api('/notes', { + renote: true, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + const myNote = res.body.find((note: { id: string }) => note.id === renoted.body.createdNote.id); + assert.notEqual(myNote, null); + assert.strictEqual(myNote.renote.files.length, 1); + assert.strictEqual(myNote.renote.files[0].id, file.body.id); + }); + + test('ファイルが添付されたノートに返信した場合、タイムラインでファイル情報入りのレスポンスが帰ってくる', async () => { + const file = await uploadFile(alice); + const createdNote = await api('/notes/create', { + fileIds: [file.body.id], + }, alice); + + assert.strictEqual(createdNote.status, 200); + + const reply = await api('/notes/create', { + replyId: createdNote.body.createdNote.id, + text: 'this is reply', + }, alice); + assert.strictEqual(reply.status, 200); + + const res = await api('/notes', { + reply: true, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + const myNote = res.body.find((note: { id: string }) => note.id === reply.body.createdNote.id); + assert.notEqual(myNote, null); + assert.strictEqual(myNote.reply.files.length, 1); + assert.strictEqual(myNote.reply.files[0].id, file.body.id); + }); + + test('ファイルが添付されたノートへの返信をリノートした場合、タイムラインでファイル情報入りのレスポンスが帰ってくる', async () => { + const file = await uploadFile(alice); + const createdNote = await api('/notes/create', { + fileIds: [file.body.id], + }, alice); + + assert.strictEqual(createdNote.status, 200); + + const reply = await api('/notes/create', { + replyId: createdNote.body.createdNote.id, + text: 'this is reply', + }, alice); + assert.strictEqual(reply.status, 200); + + const renoted = await api('/notes/create', { + renoteId: reply.body.createdNote.id, + }, alice); + assert.strictEqual(renoted.status, 200); + + const res = await api('/notes', { + renote: true, + }, alice); + + assert.strictEqual(res.status, 200); + assert.strictEqual(Array.isArray(res.body), true); + const myNote = res.body.find((note: { id: string }) => note.id === renoted.body.createdNote.id); + assert.notEqual(myNote, null); + assert.strictEqual(myNote.renote.reply.files.length, 1); + assert.strictEqual(myNote.renote.reply.files[0].id, file.body.id); + }); + }); + describe('notes/create', () => { test('投票を添付できる', async () => { const res = await api('/notes/create', { From 2d551a8598de12210ddb7f708561e51867ce3f10 Mon Sep 17 00:00:00 2001 From: tamaina Date: Sat, 4 Mar 2023 16:51:07 +0900 Subject: [PATCH 085/125] =?UTF-8?q?enhance(server):=20downloadUrl=E3=81=A7?= =?UTF-8?q?Content-Disposition=E3=81=8B=E3=82=89=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E5=90=8D=E3=82=92=E5=8F=96=E5=BE=97=20(#1015?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(server): downloadUrlでContent-Dispositionからファイル名を取得 Resolve #10036 Resolve #4750 * untitled * オブジェクトストレージのContent-Dispositionのファイル名の拡張子をContent-Typeに添ったものにする * :v: * tiff * fix filename * add test * /files/でもContent-Disposition * comment * fix test --- packages/backend/src/core/DownloadService.ts | 20 +++++++- packages/backend/src/core/DriveService.ts | 44 +++++++++-------- packages/backend/src/misc/correct-filename.ts | 15 ++++++ .../backend/src/server/FileServerService.ts | 48 +++++++++++-------- packages/backend/test/e2e/endpoints.ts | 10 +++- packages/backend/test/unit/misc/others.ts | 39 +++++++++++++++ 6 files changed, 134 insertions(+), 42 deletions(-) create mode 100644 packages/backend/src/misc/correct-filename.ts create mode 100644 packages/backend/test/unit/misc/others.ts diff --git a/packages/backend/src/core/DownloadService.ts b/packages/backend/src/core/DownloadService.ts index 852c1f32e3..bd999c67da 100644 --- a/packages/backend/src/core/DownloadService.ts +++ b/packages/backend/src/core/DownloadService.ts @@ -6,6 +6,7 @@ import IPCIDR from 'ip-cidr'; import PrivateIp from 'private-ip'; import chalk from 'chalk'; import got, * as Got from 'got'; +import { parse } from 'content-disposition'; import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; import { HttpRequestService } from '@/core/HttpRequestService.js'; @@ -32,13 +33,18 @@ export class DownloadService { } @bindThis - public async downloadUrl(url: string, path: string): Promise { + public async downloadUrl(url: string, path: string): Promise<{ + filename: string; + }> { this.logger.info(`Downloading ${chalk.cyan(url)} to ${chalk.cyanBright(path)} ...`); const timeout = 30 * 1000; const operationTimeout = 60 * 1000; const maxSize = this.config.maxFileSize ?? 262144000; + const urlObj = new URL(url); + let filename = urlObj.pathname.split('/').pop() ?? 'untitled'; + const req = got.stream(url, { headers: { 'User-Agent': this.config.userAgent, @@ -77,6 +83,14 @@ export class DownloadService { req.destroy(); } } + + const contentDisposition = res.headers['content-disposition']; + if (contentDisposition != null) { + const parsed = parse(contentDisposition); + if (parsed.parameters.filename) { + filename = parsed.parameters.filename; + } + } }).on('downloadProgress', (progress: Got.Progress) => { if (progress.transferred > maxSize) { this.logger.warn(`maxSize exceeded (${progress.transferred} > ${maxSize}) on downloadProgress`); @@ -95,6 +109,10 @@ export class DownloadService { } this.logger.succ(`Download finished: ${chalk.cyan(url)}`); + + return { + filename, + }; } @bindThis diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index b15c967c85..f4a06faebb 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -34,6 +34,7 @@ import { FileInfoService } from '@/core/FileInfoService.js'; import { bindThis } from '@/decorators.js'; import { RoleService } from '@/core/RoleService.js'; import type S3 from 'aws-sdk/clients/s3.js'; +import { correctFilename } from '@/misc/correct-filename.js'; type AddFileArgs = { /** User who wish to add file */ @@ -168,7 +169,7 @@ export class DriveService { //#region Uploads this.registerLogger.info(`uploading original: ${key}`); const uploads = [ - this.upload(key, fs.createReadStream(path), type, name), + this.upload(key, fs.createReadStream(path), type, ext, name), ]; if (alts.webpublic) { @@ -176,7 +177,7 @@ export class DriveService { webpublicUrl = `${ baseUrl }/${ webpublicKey }`; this.registerLogger.info(`uploading webpublic: ${webpublicKey}`); - uploads.push(this.upload(webpublicKey, alts.webpublic.data, alts.webpublic.type, name)); + uploads.push(this.upload(webpublicKey, alts.webpublic.data, alts.webpublic.type, alts.webpublic.ext, name)); } if (alts.thumbnail) { @@ -184,7 +185,7 @@ export class DriveService { thumbnailUrl = `${ baseUrl }/${ thumbnailKey }`; this.registerLogger.info(`uploading thumbnail: ${thumbnailKey}`); - uploads.push(this.upload(thumbnailKey, alts.thumbnail.data, alts.thumbnail.type)); + uploads.push(this.upload(thumbnailKey, alts.thumbnail.data, alts.thumbnail.type, alts.thumbnail.ext)); } await Promise.all(uploads); @@ -360,7 +361,7 @@ export class DriveService { * Upload to ObjectStorage */ @bindThis - private async upload(key: string, stream: fs.ReadStream | Buffer, type: string, filename?: string) { + private async upload(key: string, stream: fs.ReadStream | Buffer, type: string, ext?: string | null, filename?: string) { if (type === 'image/apng') type = 'image/png'; if (!FILE_TYPE_BROWSERSAFE.includes(type)) type = 'application/octet-stream'; @@ -374,7 +375,12 @@ export class DriveService { CacheControl: 'max-age=31536000, immutable', } as S3.PutObjectRequest; - if (filename) params.ContentDisposition = contentDisposition('inline', filename); + if (filename) params.ContentDisposition = contentDisposition( + 'inline', + // 拡張子からContent-Typeを設定してそうな挙動を示すオブジェクトストレージ (upcloud?) も存在するので、 + // 許可されているファイル形式でしか拡張子をつけない + ext ? correctFilename(filename, ext) : filename, + ); if (meta.objectStorageSetPublicRead) params.ACL = 'public-read'; const s3 = this.s3Service.getS3(meta); @@ -466,7 +472,12 @@ export class DriveService { //} // detect name - const detectedName = name ?? (info.type.ext ? `untitled.${info.type.ext}` : 'untitled'); + const detectedName = correctFilename( + // DriveFile.nameは256文字, validateFileNameは200文字制限であるため、 + // extを付加してデータベースの文字数制限に当たることはまずない + (name && this.driveFileEntityService.validateFileName(name)) ? name : 'untitled', + info.type.ext + ); if (user && !force) { // Check if there is a file with the same hash @@ -736,24 +747,19 @@ export class DriveService { requestIp = null, requestHeaders = null, }: UploadFromUrlArgs): Promise { - let name = new URL(url).pathname.split('/').pop() ?? null; - if (name == null || !this.driveFileEntityService.validateFileName(name)) { - name = null; - } - - // If the comment is same as the name, skip comment - // (image.name is passed in when receiving attachment) - if (comment !== null && name === comment) { - comment = null; - } - // Create temp file const [path, cleanup] = await createTemp(); try { // write content at URL to temp file - await this.downloadService.downloadUrl(url, path); - + const { filename: name } = await this.downloadService.downloadUrl(url, path); + + // If the comment is same as the name, skip comment + // (image.name is passed in when receiving attachment) + if (comment !== null && name === comment) { + comment = null; + } + const driveFile = await this.addFile({ user, path, name, comment, folderId, force, isLink, url, uri, sensitive, requestIp, requestHeaders }); this.downloaderLogger.succ(`Got: ${driveFile.id}`); return driveFile!; diff --git a/packages/backend/src/misc/correct-filename.ts b/packages/backend/src/misc/correct-filename.ts new file mode 100644 index 0000000000..8dcce6df75 --- /dev/null +++ b/packages/backend/src/misc/correct-filename.ts @@ -0,0 +1,15 @@ +// 与えられた拡張子とファイル名が一致しているかどうかを確認し、 +// 一致していない場合は拡張子を付与して返す +export function correctFilename(filename: string, ext: string | null) { + const dotExt = ext ? `.${ext}` : '.unknown'; + if (filename.endsWith(dotExt)) { + return filename; + } + if (ext === 'jpg' && filename.endsWith('.jpeg')) { + return filename; + } + if (ext === 'tif' && filename.endsWith('.tiff')) { + return filename; + } + return `${filename}${dotExt}`; +} diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts index e5eefac1fa..8eeb76f7c7 100644 --- a/packages/backend/src/server/FileServerService.ts +++ b/packages/backend/src/server/FileServerService.ts @@ -22,6 +22,7 @@ import { bindThis } from '@/decorators.js'; import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify'; import { isMimeImage } from '@/misc/is-mime-image.js'; import sharp from 'sharp'; +import { correctFilename } from '@/misc/correct-filename.js'; const _filename = fileURLToPath(import.meta.url); const _dirname = dirname(_filename); @@ -51,15 +52,6 @@ export class FileServerService { //this.createServer = this.createServer.bind(this); } - @bindThis - public commonReadableHandlerGenerator(reply: FastifyReply) { - return (err: Error): void => { - this.logger.error(err); - reply.code(500); - reply.header('Cache-Control', 'max-age=300'); - }; - } - @bindThis public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) { fastify.addHook('onRequest', (request, reply, done) => { @@ -190,13 +182,19 @@ export class FileServerService { } reply.header('Content-Type', FILE_TYPE_BROWSERSAFE.includes(image.type) ? image.type : 'application/octet-stream'); + reply.header('Content-Disposition', + contentDisposition( + 'inline', + correctFilename(file.filename, image.ext) + ) + ); return image.data; } if (file.fileRole !== 'original') { - const filename = rename(file.file.name, { + const filename = rename(file.filename, { suffix: file.fileRole === 'thumbnail' ? '-thumb' : '-web', - extname: file.ext ? `.${file.ext}` : undefined, + extname: file.ext ? `.${file.ext}` : '.unknown', }).toString(); reply.header('Content-Type', FILE_TYPE_BROWSERSAFE.includes(file.mime) ? file.mime : 'application/octet-stream'); @@ -204,12 +202,10 @@ export class FileServerService { reply.header('Content-Disposition', contentDisposition('inline', filename)); return fs.createReadStream(file.path); } else { - const stream = fs.createReadStream(file.path); - stream.on('error', this.commonReadableHandlerGenerator(reply)); reply.header('Content-Type', FILE_TYPE_BROWSERSAFE.includes(file.file.type) ? file.file.type : 'application/octet-stream'); reply.header('Cache-Control', 'max-age=31536000, immutable'); - reply.header('Content-Disposition', contentDisposition('inline', file.file.name)); - return stream; + reply.header('Content-Disposition', contentDisposition('inline', file.filename)); + return fs.createReadStream(file.path); } } catch (e) { if ('cleanup' in file) file.cleanup(); @@ -360,6 +356,12 @@ export class FileServerService { reply.header('Content-Type', image.type); reply.header('Cache-Control', 'max-age=31536000, immutable'); + reply.header('Content-Disposition', + contentDisposition( + 'inline', + correctFilename(file.filename, image.ext) + ) + ); return image.data; } catch (e) { if ('cleanup' in file) file.cleanup(); @@ -369,8 +371,8 @@ export class FileServerService { @bindThis private async getStreamAndTypeFromUrl(url: string): Promise< - { state: 'remote'; fileRole?: 'thumbnail' | 'webpublic' | 'original'; file?: DriveFile; mime: string; ext: string | null; path: string; cleanup: () => void; } - | { state: 'stored_internal'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; mime: string; ext: string | null; path: string; } + { state: 'remote'; fileRole?: 'thumbnail' | 'webpublic' | 'original'; file?: DriveFile; mime: string; ext: string | null; path: string; cleanup: () => void; filename: string; } + | { state: 'stored_internal'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; filename: string; mime: string; ext: string | null; path: string; } | '404' | '204' > { @@ -386,11 +388,11 @@ export class FileServerService { @bindThis private async downloadAndDetectTypeFromUrl(url: string): Promise< - { state: 'remote' ; mime: string; ext: string | null; path: string; cleanup: () => void; } + { state: 'remote' ; mime: string; ext: string | null; path: string; cleanup: () => void; filename: string; } > { const [path, cleanup] = await createTemp(); try { - await this.downloadService.downloadUrl(url, path); + const { filename } = await this.downloadService.downloadUrl(url, path); const { mime, ext } = await this.fileInfoService.detectType(path); @@ -398,6 +400,7 @@ export class FileServerService { state: 'remote', mime, ext, path, cleanup, + filename, }; } catch (e) { cleanup(); @@ -407,8 +410,8 @@ export class FileServerService { @bindThis private async getFileFromKey(key: string): Promise< - { state: 'remote'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; url: string; mime: string; ext: string | null; path: string; cleanup: () => void; } - | { state: 'stored_internal'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; mime: string; ext: string | null; path: string; } + { state: 'remote'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; filename: string; url: string; mime: string; ext: string | null; path: string; cleanup: () => void; } + | { state: 'stored_internal'; fileRole: 'thumbnail' | 'webpublic' | 'original'; file: DriveFile; filename: string; mime: string; ext: string | null; path: string; } | '404' | '204' > { @@ -432,6 +435,7 @@ export class FileServerService { url: file.uri, fileRole: isThumbnail ? 'thumbnail' : isWebpublic ? 'webpublic' : 'original', file, + filename: file.name, }; } @@ -443,6 +447,7 @@ export class FileServerService { state: 'stored_internal', fileRole: isThumbnail ? 'thumbnail' : 'webpublic', file, + filename: file.name, mime, ext, path, }; @@ -452,6 +457,7 @@ export class FileServerService { state: 'stored_internal', fileRole: 'original', file, + filename: file.name, mime: file.type, ext: null, path, diff --git a/packages/backend/test/e2e/endpoints.ts b/packages/backend/test/e2e/endpoints.ts index e864eab6cb..42bdc5f24d 100644 --- a/packages/backend/test/e2e/endpoints.ts +++ b/packages/backend/test/e2e/endpoints.ts @@ -410,11 +410,19 @@ describe('Endpoints', () => { }); test('ファイルに名前を付けられる', async () => { + const res = await uploadFile(alice, { name: 'Belmond.jpg' }); + + assert.strictEqual(res.status, 200); + assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); + assert.strictEqual(res.body.name, 'Belmond.jpg'); + }); + + test('ファイルに名前を付けられるが、拡張子は正しいものになる', async () => { const res = await uploadFile(alice, { name: 'Belmond.png' }); assert.strictEqual(res.status, 200); assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true); - assert.strictEqual(res.body.name, 'Belmond.png'); + assert.strictEqual(res.body.name, 'Belmond.png.jpg'); }); test('ファイル無しで怒られる', async () => { diff --git a/packages/backend/test/unit/misc/others.ts b/packages/backend/test/unit/misc/others.ts new file mode 100644 index 0000000000..8241d3078d --- /dev/null +++ b/packages/backend/test/unit/misc/others.ts @@ -0,0 +1,39 @@ +import { describe, test, expect } from '@jest/globals'; +import { contentDisposition } from '@/misc/content-disposition.js'; +import { correctFilename } from '@/misc/correct-filename.js'; + +describe('misc:content-disposition', () => { + test('inline', () => { + expect(contentDisposition('inline', 'foo bar')).toBe('inline; filename=\"foo_bar\"; filename*=UTF-8\'\'foo%20bar'); + }); + test('attachment', () => { + expect(contentDisposition('attachment', 'foo bar')).toBe('attachment; filename=\"foo_bar\"; filename*=UTF-8\'\'foo%20bar'); + }); + test('non ascii', () => { + expect(contentDisposition('attachment', 'ファイル名')).toBe('attachment; filename=\"_____\"; filename*=UTF-8\'\'%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D'); + }); +}); + +describe('misc:correct-filename', () => { + test('simple', () => { + expect(correctFilename('filename', 'jpg')).toBe('filename.jpg'); + }); + test('with same ext', () => { + expect(correctFilename('filename.jpg', 'jpg')).toBe('filename.jpg'); + }); + test('with different ext', () => { + expect(correctFilename('filename.webp', 'jpg')).toBe('filename.webp.jpg'); + }); + test('non ascii with space', () => { + expect(correctFilename('ファイル 名前', 'jpg')).toBe('ファイル 名前.jpg'); + }); + test('jpeg', () => { + expect(correctFilename('filename.jpeg', 'jpg')).toBe('filename.jpeg'); + }); + test('tiff', () => { + expect(correctFilename('filename.tiff', 'tif')).toBe('filename.tiff'); + }); + test('null ext', () => { + expect(correctFilename('filename', null)).toBe('filename.unknown'); + }); +}); From 3f507241ca98148f274211cbdeeac7b227f287d8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Mar 2023 17:19:18 +0900 Subject: [PATCH 086/125] chore(client): tweak default value of numberOfPageCache --- packages/frontend/src/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 9378cd573c..2766b434fc 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -275,7 +275,7 @@ export const defaultStore = markRaw(new Storage('base', { }, numberOfPageCache: { where: 'device', - default: 5, + default: 3, }, showNoteActionsOnlyHover: { where: 'device', From 320c2bf7712f06f0498fefaf770fa2c361f8f5d4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Mar 2023 17:19:21 +0900 Subject: [PATCH 087/125] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67d1d5070d..0ce1c8aab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ You should also include the user name that made the change. ### Improvements - クリップ、チャンネルページに共有ボタンを追加 +- ドライブの「URLからアップロード」で、content-dispositionのfilenameがあればそれをファイル名に +- サーバーのパフォーマンスを改善 ### Bugfixes - From 1711ae7156ed2aa36c5f5e43facc66bfba41fe89 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 4 Mar 2023 17:36:11 +0900 Subject: [PATCH 088/125] :art: --- packages/frontend/src/pages/admin/roles.vue | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/pages/admin/roles.vue b/packages/frontend/src/pages/admin/roles.vue index d89f0d2a7d..25d8f3ad6e 100644 --- a/packages/frontend/src/pages/admin/roles.vue +++ b/packages/frontend/src/pages/admin/roles.vue @@ -4,7 +4,6 @@
- {{ i18n.ts._role.new }}
@@ -132,8 +131,20 @@ {{ i18n.ts.save }}
+ {{ i18n.ts._role.new }}
- + + +
+ +
+
+ + +
+ +
+
@@ -155,6 +166,7 @@ import { i18n } from '@/i18n'; import { definePageMetadata } from '@/scripts/page-metadata'; import { instance } from '@/instance'; import { useRouter } from '@/router'; +import MkFoldableSection from '@/components/MkFoldableSection.vue'; const ROLE_POLICIES = [ 'gtlAvailable', From 6dd9374b994e3c0cca75124cd174d328df4fb318 Mon Sep 17 00:00:00 2001 From: Ikumi Nakamura <28798279+johnmanjiro13@users.noreply.github.com> Date: Sat, 4 Mar 2023 17:42:03 +0900 Subject: [PATCH 089/125] chore: Replace tab with space (#10185) --- chart/templates/Deployment.yml | 6 +++--- chart/templates/Service.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/chart/templates/Deployment.yml b/chart/templates/Deployment.yml index d16aece915..d5dd14f59e 100644 --- a/chart/templates/Deployment.yml +++ b/chart/templates/Deployment.yml @@ -3,16 +3,16 @@ kind: Deployment metadata: name: {{ include "misskey.fullname" . }} labels: - {{- include "misskey.labels" . | nindent 4 }} + {{- include "misskey.labels" . | nindent 4 }} spec: selector: matchLabels: - {{- include "misskey.selectorLabels" . | nindent 6 }} + {{- include "misskey.selectorLabels" . | nindent 6 }} replicas: 1 template: metadata: labels: - {{- include "misskey.selectorLabels" . | nindent 8 }} + {{- include "misskey.selectorLabels" . | nindent 8 }} spec: containers: - name: misskey diff --git a/chart/templates/Service.yml b/chart/templates/Service.yml index 3209581298..afd851a9f1 100644 --- a/chart/templates/Service.yml +++ b/chart/templates/Service.yml @@ -11,4 +11,4 @@ spec: protocol: TCP name: http selector: - {{- include "misskey.selectorLabels" . | nindent 4 }} + {{- include "misskey.selectorLabels" . | nindent 4 }} From 72b315491bfc000a433f7cbd4cbcc6df7fedd5d4 Mon Sep 17 00:00:00 2001 From: nexryai <61890205+nexryai@users.noreply.github.com> Date: Sat, 4 Mar 2023 19:19:55 +0900 Subject: [PATCH 090/125] Fix: If mail delivery is disabled on the server, make the settings page indicate this (#10191) Co-authored-by: syuilo --- locales/ja-JP.yml | 1 + packages/frontend/src/pages/settings/email.vue | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index ef70469935..f94133c19f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -956,6 +956,7 @@ exploreOtherServers: "他のサーバーを探す" letsLookAtTimeline: "タイムラインを見てみる" disableFederationWarn: "連合が無効になっています。無効にしても投稿が非公開にはなりません。ほとんどの場合、このオプションを有効にする必要はありません。" invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。" +emailNotSupported: "このサーバーではメール配信はサポートされていません" postToTheChannel: "チャンネルに投稿" _achievements: diff --git a/packages/frontend/src/pages/settings/email.vue b/packages/frontend/src/pages/settings/email.vue index 1734dcfe42..b1e6f223b6 100644 --- a/packages/frontend/src/pages/settings/email.vue +++ b/packages/frontend/src/pages/settings/email.vue @@ -1,5 +1,5 @@ - From e844710ef27792f49d2ebdd568d377cd58c5efca Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 5 Mar 2023 20:32:02 +0900 Subject: [PATCH 112/125] 13.9.2 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f79acfb90e..128aee1245 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ You should also include the user name that made the change. --> -## 13.x.x (unreleased) +## 13.9.2 (2023/03/05) ### Improvements - クリップ、チャンネルページに共有ボタンを追加 diff --git a/package.json b/package.json index a2d04030f2..d3e34e7821 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "13.9.1", + "version": "13.9.2", "codename": "nasubi", "repository": { "type": "git", From 517a7f96c85e65432424f80abead47a3c1bc6727 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 5 Mar 2023 20:46:18 +0900 Subject: [PATCH 113/125] [ci skip] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 128aee1245..0f252eaaf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ You should also include the user name that made the change. - クリップ、チャンネルページに共有ボタンを追加 - ドライブの「URLからアップロード」で、content-dispositionのfilenameがあればそれをファイル名に - Identiconがローカルとリモートで同じになるように + - これまでのIdenticonは異なる画像になります - サーバーのパフォーマンスを改善 ### Bugfixes From 9f73c23b38b74c5307736e08978e3fb6531035ee Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 5 Mar 2023 20:48:46 +0900 Subject: [PATCH 114/125] [ci skip] fix(client): fix post button of channel --- packages/frontend/src/pages/channel.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue index d757e5b1a2..65edb97e83 100644 --- a/packages/frontend/src/pages/channel.vue +++ b/packages/frontend/src/pages/channel.vue @@ -85,7 +85,7 @@ function edit() { function openPostForm() { os.post({ channel: { - id: channel.channelId, + id: channel.id, }, }); } From 353b1cc682547275e8548abfe748e3c2acc89376 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 5 Mar 2023 20:52:26 +0900 Subject: [PATCH 115/125] [ci skip] :art: --- packages/frontend/src/components/MkPagination.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/components/MkPagination.vue b/packages/frontend/src/components/MkPagination.vue index 378d0ac020..a1a61a6fd6 100644 --- a/packages/frontend/src/components/MkPagination.vue +++ b/packages/frontend/src/components/MkPagination.vue @@ -21,14 +21,14 @@
- + {{ i18n.ts.loadMore }}
- + {{ i18n.ts.loadMore }} From 8c9c89a137ab24dd56f8bf3d51fa3d8e3c80a245 Mon Sep 17 00:00:00 2001 From: arrow2nd <44780846+arrow2nd@users.noreply.github.com> Date: Sun, 5 Mar 2023 21:59:41 +0900 Subject: [PATCH 116/125] =?UTF-8?q?fix(frontend):=20=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=AE=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=B8=E8=A1=A8=E7=A4=BA=E3=82=92=E9=81=A9=E5=88=87?= =?UTF-8?q?=E3=81=AB=E6=8A=98=E3=82=8A=E8=BF=94=E3=81=99=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=20(#10222)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(frontend): ユーザーページのバッジ表示を適切に折り返すように * Update CHANGELOG.md --- CHANGELOG.md | 2 +- packages/frontend/src/pages/user/home.vue | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f252eaaf7..57cdd41e48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ - ### Bugfixes -- +- ユーザーページのバッジ表示を適切に折り返すように @arrow2nd You should also include the user name that made the change. --> diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue index 441b19440c..02794175ae 100644 --- a/packages/frontend/src/pages/user/home.vue +++ b/packages/frontend/src/pages/user/home.vue @@ -352,6 +352,9 @@ onUnmounted(() => { > .roles { padding: 24px 24px 0 154px; font-size: 0.95em; + display: flex; + flex-wrap: wrap; + gap: 8px; > .role { border: solid 1px var(--color, var(--divider)); @@ -493,7 +496,7 @@ onUnmounted(() => { > .roles { padding: 16px 16px 0 16px; - text-align: center; + justify-content: center; } > .description { From b1c173ec4f77411f8a97c8680905f6d525d529ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?= Date: Sun, 5 Mar 2023 22:00:17 +0900 Subject: [PATCH 117/125] fix(docker): cannot build docker image on some environments (#10220) --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index eeff38e48b..fd0b5e1c9f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -65,8 +65,8 @@ RUN apt-get update \ && corepack enable \ && groupadd -g "${GID}" misskey \ && useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \ - && find / -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \ - && find / -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \ + && find / -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \ + && find / -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \ && apt-get clean \ && rm -rf /var/lib/apt/lists From 824398509d805a62bd656aaf3a5c2114b1d24cb4 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 5 Mar 2023 22:01:06 +0900 Subject: [PATCH 118/125] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57cdd41e48..e0db634aab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ - ### Bugfixes -- ユーザーページのバッジ表示を適切に折り返すように @arrow2nd +x You should also include the user name that made the change. --> @@ -21,6 +21,7 @@ You should also include the user name that made the change. ### Bugfixes - ロールの権限で「一般ユーザー」のロールがいきなり設定できない問題を修正 +- ユーザーページのバッジ表示を適切に折り返すように @arrow2nd ## 13.9.1 (2023/03/03) From 87d0f56dc75cdc5e29cef7a3cd41f41a998f9649 Mon Sep 17 00:00:00 2001 From: tamaina Date: Mon, 6 Mar 2023 01:17:13 +0000 Subject: [PATCH 119/125] =?UTF-8?q?fix=20correctFilename=20ext=E3=81=8C.?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=A7=8B=E3=81=BE=E3=82=8B=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=82=82=E8=80=83=E6=85=AE=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/src/misc/correct-filename.ts | 2 +- packages/backend/test/unit/misc/others.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/misc/correct-filename.ts b/packages/backend/src/misc/correct-filename.ts index 8dcce6df75..3357d8c1bd 100644 --- a/packages/backend/src/misc/correct-filename.ts +++ b/packages/backend/src/misc/correct-filename.ts @@ -1,7 +1,7 @@ // 与えられた拡張子とファイル名が一致しているかどうかを確認し、 // 一致していない場合は拡張子を付与して返す export function correctFilename(filename: string, ext: string | null) { - const dotExt = ext ? `.${ext}` : '.unknown'; + const dotExt = ext ? ext.startsWith('.') ? ext : `.${ext}` : '.unknown'; if (filename.endsWith(dotExt)) { return filename; } diff --git a/packages/backend/test/unit/misc/others.ts b/packages/backend/test/unit/misc/others.ts index 8241d3078d..c476aef33b 100644 --- a/packages/backend/test/unit/misc/others.ts +++ b/packages/backend/test/unit/misc/others.ts @@ -21,6 +21,9 @@ describe('misc:correct-filename', () => { test('with same ext', () => { expect(correctFilename('filename.jpg', 'jpg')).toBe('filename.jpg'); }); + test('.ext', () => { + expect(correctFilename('filename.jpg', '.jpg')).toBe('filename.jpg'); + }); test('with different ext', () => { expect(correctFilename('filename.webp', 'jpg')).toBe('filename.webp.jpg'); }); From 6bb11492fa3c8de2189085541eb36f9268587320 Mon Sep 17 00:00:00 2001 From: tamaina Date: Mon, 6 Mar 2023 01:31:44 +0000 Subject: [PATCH 120/125] update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0db634aab..543d1a8aa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,11 @@ x You should also include the user name that made the change. --> -## 13.9.2 (2023/03/05) +## 13.9.2 (2023/03/06) ### Improvements - クリップ、チャンネルページに共有ボタンを追加 +- チャンネルでタイムライン上部に投稿フォームを表示するかどうかのオプションを追加 - ドライブの「URLからアップロード」で、content-dispositionのfilenameがあればそれをファイル名に - Identiconがローカルとリモートで同じになるように - これまでのIdenticonは異なる画像になります From b719f6cd1c57dad42ccd13539d1f860f0db0be31 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 6 Mar 2023 10:32:36 +0900 Subject: [PATCH 121/125] New Crowdin updates (#10223) * New translations ja-JP.yml (Thai) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) --- locales/it-IT.yml | 3 +++ locales/th-TH.yml | 1 + locales/zh-CN.yml | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/locales/it-IT.yml b/locales/it-IT.yml index ca1702585b..d5638aeb62 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -506,6 +506,7 @@ objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di cari serverLogs: "Log del server" deleteAll: "Cancella cronologia" showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" +showFixedPostFormInChannel: "Per i canali, mostra il modulo di pubblicazione in cima alla timeline" newNoteRecived: "Vedi le nuove note" sounds: "Impostazioni suoni" sound: "Impostazioni suoni" @@ -955,7 +956,9 @@ exploreOtherServers: "Trova altre istanze" letsLookAtTimeline: "Sbircia la timeline" disableFederationWarn: "Disabilita la federazione. Questo cambiamento non rende le pubblicazioni private. Di solito non è necessario abilitare questa opzione." invitationRequiredToRegister: "L'accesso a questo nodo è solo ad invito. Devi inserire un codice d'invito valido. Puoi richiedere un codice all'amministratore." +emailNotSupported: "L'istanza non supporta l'invio di email" postToTheChannel: "Pubblica sul canale" +cannotBeChangedLater: "Non sarà più modificabile" _achievements: earnedAt: "Data di conseguimento" _types: diff --git a/locales/th-TH.yml b/locales/th-TH.yml index 4511f1a40f..cf33e6642b 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -958,6 +958,7 @@ disableFederationWarn: "การดำเนินการนี้ถ้า invitationRequiredToRegister: "อินสแตนซ์นี้เป็นแบบรับเชิญเท่านั้น คุณต้องป้อนรหัสเชิญที่ถูกต้องถึงจะลงทะเบียนได้นะค่ะ" emailNotSupported: "อินสแตนซ์นี้ไม่รองรับการส่งอีเมลนะค่ะ" postToTheChannel: "โพสต์ลงช่อง" +cannotBeChangedLater: "สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ในภายหลังนะ" _achievements: earnedAt: "ได้รับเมื่อ" _types: diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index c1dd2a5daa..7798582db8 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -506,6 +506,7 @@ objectStorageSetPublicRead: "上传时设置为public-read" serverLogs: "服务器日志" deleteAll: "全部删除" showFixedPostForm: "在时间线顶部显示发帖框" +showFixedPostFormInChannel: "在时间线顶部显示发帖对话框(频道)" newNoteRecived: "有新的帖子" sounds: "提示音" sound: "提示音" @@ -955,6 +956,9 @@ exploreOtherServers: "探索其他服务器" letsLookAtTimeline: "时间线" disableFederationWarn: "联合被禁用。 禁用它并不能使帖子变成私人的。 在大多数情况下,这个选项不需要被启用。" invitationRequiredToRegister: "此服务器目前只允许拥有邀请码的人注册。" +emailNotSupported: "此服务器不支持发送邮件" +postToTheChannel: "发布到频道" +cannotBeChangedLater: "之后不能再更改。" _achievements: earnedAt: "达成时间" _types: From 6778111891a2810be42f1b83a1b119ff00795a55 Mon Sep 17 00:00:00 2001 From: tamaina Date: Mon, 6 Mar 2023 02:04:53 +0000 Subject: [PATCH 122/125] update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 543d1a8aa9..424eeaf00f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ You should also include the user name that made the change. ### Improvements - クリップ、チャンネルページに共有ボタンを追加 - チャンネルでタイムライン上部に投稿フォームを表示するかどうかのオプションを追加 +- ブラウザでメディアプロキシ(/proxy)からファイルを保存した際に、なるべくオリジナルのファイル名を継承するように - ドライブの「URLからアップロード」で、content-dispositionのfilenameがあればそれをファイル名に - Identiconがローカルとリモートで同じになるように - これまでのIdenticonは異なる画像になります From 7852815fc3e6f617d947b40fa9ecc18e11f612ec Mon Sep 17 00:00:00 2001 From: tamaina Date: Mon, 6 Mar 2023 02:08:06 +0000 Subject: [PATCH 123/125] update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 424eeaf00f..30264e75e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ You should also include the user name that made the change. ### Bugfixes - ロールの権限で「一般ユーザー」のロールがいきなり設定できない問題を修正 - ユーザーページのバッジ表示を適切に折り返すように @arrow2nd +- macOSでDev Containerが動作しない問題を修正 @RyotaK ## 13.9.1 (2023/03/03) From f20abb4ee53b9f809969097918d7275009433251 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 6 Mar 2023 02:12:35 +0000 Subject: [PATCH 124/125] =?UTF-8?q?fix(client):=20=E3=81=BF=E3=81=A4?= =?UTF-8?q?=E3=81=91=E3=82=8B=E3=81=AE=E3=83=AD=E3=83=BC=E3=83=AB=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E3=81=A7=E3=82=B3=E3=83=B3=E3=83=87=E3=82=A3=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=8A=E3=83=AB=E3=83=AD=E3=83=BC=E3=83=AB=E3=81=8C?= =?UTF-8?q?=E5=90=AB=E3=81=BE=E3=82=8C=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/frontend/src/pages/explore.roles.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0db634aab..ad0ac15a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ You should also include the user name that made the change. ### Bugfixes - ロールの権限で「一般ユーザー」のロールがいきなり設定できない問題を修正 - ユーザーページのバッジ表示を適切に折り返すように @arrow2nd +- fix(client): みつけるのロール一覧でコンディショナルロールが含まれるのを修正 ## 13.9.1 (2023/03/03) diff --git a/packages/frontend/src/pages/explore.roles.vue b/packages/frontend/src/pages/explore.roles.vue index 8be11008c2..51177d079c 100644 --- a/packages/frontend/src/pages/explore.roles.vue +++ b/packages/frontend/src/pages/explore.roles.vue @@ -16,7 +16,7 @@ let roles = $ref(); os.api('roles/list', { limit: 30, }).then(res => { - roles = res; + roles = res.filter(x => x.target === 'manual'); }); From 31f9ea31b9bd5cf008c8c1d9fde7db5cb9522a01 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 6 Mar 2023 11:53:04 +0900 Subject: [PATCH 125/125] =?UTF-8?q?[ci=20skip]=20chore(client):=20showNote?= =?UTF-8?q?ActionsOnlyHover=E5=A4=89=E6=9B=B4=E6=99=82=E3=81=AB=E3=83=AA?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=89=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD?= =?UTF-8?q?=E3=82=B0=E3=82=92=E5=87=BA=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/pages/settings/general.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 8c8c9b9dbf..2e2c456c07 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -193,6 +193,7 @@ watch([ enableInfiniteScroll, squareAvatars, aiChanMode, + showNoteActionsOnlyHover, showGapBetweenNotesInTimeline, instanceTicker, overridedDeviceKind,