From 58469c0a69d82cd365e3d440f981413ac35ad748 Mon Sep 17 00:00:00 2001 From: Camilla Ett Date: Wed, 3 Jan 2024 08:07:04 +0900 Subject: [PATCH 01/41] =?UTF-8?q?enhance(frontend):=20=E3=82=AB=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=A0=E7=B5=B5=E6=96=87=E5=AD=97=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E7=94=BB=E9=9D=A2=E3=81=AE=E3=80=8C=E3=82=BF=E3=82=B0=E3=80=8D?= =?UTF-8?q?=E3=81=AE=E8=AA=AC=E6=98=8E=E3=82=92=E8=BF=BD=E5=8A=A0=20(#1288?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/index.d.ts | 1 + locales/ja-JP.yml | 1 + packages/frontend/src/pages/emoji-edit-dialog.vue | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index 60e88a2192..3937784153 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -672,6 +672,7 @@ export interface Locale { "other": string; "regenerateLoginToken": string; "regenerateLoginTokenDescription": string; + "theKeywordWhenSearchingForCustomEmoji": string; "setMultipleBySeparatingWithSpace": string; "fileIdOrUrl": string; "behavior": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 3d31dcef49..77f9a9ec0f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -669,6 +669,7 @@ useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使 other: "その他" regenerateLoginToken: "ログイントークンを再生成" regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" +theKeywordWhenSearchingForCustomEmoji: "カスタム絵文字を検索する時のキーワードになります。" setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" fileIdOrUrl: "ファイルIDまたはURL" behavior: "動作" diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index 07b44a1051..474e63cb46 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -39,7 +39,10 @@ SPDX-License-Identifier: AGPL-3.0-only - + From a9127e3ecd0c5789ba01123b8c4bbfc22c4e70e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:35:40 +0900 Subject: [PATCH 02/41] =?UTF-8?q?enhance(frontend):=20=E3=83=81=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=83=8D=E3=83=AB=E3=83=8E=E3=83=BC=E3=83=88=E3=81=AE?= =?UTF-8?q?=E3=83=94=E3=83=B3=E7=95=99=E3=82=81=E3=82=92=E3=83=8E=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC=E3=81=8B=E3=82=89?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20(#1288?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): チャンネルノートのピン留めをノートメニューからできるように * Update Changelog --- CHANGELOG.md | 1 + .../src/core/entities/NoteEntityService.ts | 1 + .../backend/src/models/json-schema/note.ts | 4 +++ .../frontend/src/scripts/get-note-menu.ts | 36 +++++++++++++++++++ .../misskey-js/src/autogen/apiClientJSDoc.ts | 5 ++- packages/misskey-js/src/autogen/endpoint.ts | 4 +-- packages/misskey-js/src/autogen/entities.ts | 4 +-- packages/misskey-js/src/autogen/models.ts | 4 +-- packages/misskey-js/src/autogen/types.ts | 17 +++++---- 9 files changed, 61 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea34fa9ef7..efd98ba31a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ ### Client - Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように +- Enhance: チャンネルノートのピン留めをノートのメニューからできるように ## 2023.12.2 diff --git a/packages/backend/src/core/entities/NoteEntityService.ts b/packages/backend/src/core/entities/NoteEntityService.ts index c49dad8e79..1777e2cf54 100644 --- a/packages/backend/src/core/entities/NoteEntityService.ts +++ b/packages/backend/src/core/entities/NoteEntityService.ts @@ -351,6 +351,7 @@ export class NoteEntityService implements OnModuleInit { color: channel.color, isSensitive: channel.isSensitive, allowRenoteToExternal: channel.allowRenoteToExternal, + userId: channel.userId, } : undefined, mentions: note.mentions.length > 0 ? note.mentions : undefined, uri: note.uri ?? undefined, diff --git a/packages/backend/src/models/json-schema/note.ts b/packages/backend/src/models/json-schema/note.ts index aa749943f0..2b7722129b 100644 --- a/packages/backend/src/models/json-schema/note.ts +++ b/packages/backend/src/models/json-schema/note.ts @@ -148,6 +148,10 @@ export const packedNoteSchema = { type: 'boolean', optional: false, nullable: false, }, + userId: { + type: 'string', + optional: false, nullable: true, + }, }, }, localOnly: { diff --git a/packages/frontend/src/scripts/get-note-menu.ts b/packages/frontend/src/scripts/get-note-menu.ts index 7130e69279..b9224c5595 100644 --- a/packages/frontend/src/scripts/get-note-menu.ts +++ b/packages/frontend/src/scripts/get-note-menu.ts @@ -352,6 +352,42 @@ export function getNoteMenu(props: { ] : [] ), + ...(appearNote.channel && (appearNote.channel.userId === $i.id || $i.isModerator || $i.isAdmin) ? [ + { type: 'divider' }, + { + type: 'parent' as const, + icon: 'ti ti-device-tv', + text: i18n.ts.channel, + children: async () => { + const channelChildMenu = [] as MenuItem[]; + + const channel = await os.api('channels/show', { channelId: appearNote.channel!.id }); + + if (channel.pinnedNoteIds.includes(appearNote.id)) { + channelChildMenu.push({ + icon: 'ti ti-pinned-off', + text: i18n.ts.unpin, + action: () => os.apiWithDialog('channels/update', { + channelId: appearNote.channel!.id, + pinnedNoteIds: channel.pinnedNoteIds.filter(id => id !== appearNote.id), + }), + }); + } else { + channelChildMenu.push({ + icon: 'ti ti-pin', + text: i18n.ts.pin, + action: () => os.apiWithDialog('channels/update', { + channelId: appearNote.channel!.id, + pinnedNoteIds: [...channel.pinnedNoteIds, appearNote.id], + }), + }); + } + return channelChildMenu; + }, + }, + ] + : [] + ), ...(appearNote.userId === $i.id || $i.isModerator || $i.isAdmin ? [ { type: 'divider' }, appearNote.userId === $i.id ? { diff --git a/packages/misskey-js/src/autogen/apiClientJSDoc.ts b/packages/misskey-js/src/autogen/apiClientJSDoc.ts index 758beaf3a0..e8722cab3b 100644 --- a/packages/misskey-js/src/autogen/apiClientJSDoc.ts +++ b/packages/misskey-js/src/autogen/apiClientJSDoc.ts @@ -1,6 +1,6 @@ /* - * version: 2023.12.0 - * generatedAt: 2023-12-26T23:35:09.494Z + * version: 2023.12.2 + * generatedAt: 2024-01-02T08:53:57.449Z */ import type { SwitchCaseResponseType } from '../api.js'; @@ -33,7 +33,6 @@ declare module '../api.js' { /** * No description provided. * - * **Internal Endpoint**: This endpoint is an API for the misskey mainframe and is not intended for use by third parties. * **Credential required**: *No* */ request( diff --git a/packages/misskey-js/src/autogen/endpoint.ts b/packages/misskey-js/src/autogen/endpoint.ts index 2ed76a22f9..192a1a31e0 100644 --- a/packages/misskey-js/src/autogen/endpoint.ts +++ b/packages/misskey-js/src/autogen/endpoint.ts @@ -1,6 +1,6 @@ /* - * version: 2023.12.0 - * generatedAt: 2023-12-26T23:35:09.491Z + * version: 2023.12.2 + * generatedAt: 2024-01-02T08:53:57.445Z */ import type { diff --git a/packages/misskey-js/src/autogen/entities.ts b/packages/misskey-js/src/autogen/entities.ts index c857e8e370..fd4d7372cc 100644 --- a/packages/misskey-js/src/autogen/entities.ts +++ b/packages/misskey-js/src/autogen/entities.ts @@ -1,6 +1,6 @@ /* - * version: 2023.12.0 - * generatedAt: 2023-12-26T23:35:09.489Z + * version: 2023.12.2 + * generatedAt: 2024-01-02T08:53:57.443Z */ import { operations } from './types.js'; diff --git a/packages/misskey-js/src/autogen/models.ts b/packages/misskey-js/src/autogen/models.ts index c5b81a6b41..db0ada0f3b 100644 --- a/packages/misskey-js/src/autogen/models.ts +++ b/packages/misskey-js/src/autogen/models.ts @@ -1,6 +1,6 @@ /* - * version: 2023.12.0 - * generatedAt: 2023-12-26T23:35:09.485Z + * version: 2023.12.2 + * generatedAt: 2024-01-02T08:53:57.441Z */ import { components } from './types.js'; diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 94bb263980..37c8f58f58 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -2,8 +2,8 @@ /* eslint @typescript-eslint/no-explicit-any: 0 */ /* - * version: 2023.12.0 - * generatedAt: 2023-12-26T23:35:09.389Z + * version: 2023.12.2 + * generatedAt: 2024-01-02T08:53:56.447Z */ /** @@ -40,7 +40,6 @@ export type paths = { * admin/accounts/create * @description No description provided. * - * **Internal Endpoint**: This endpoint is an API for the misskey mainframe and is not intended for use by third parties. * **Credential required**: *No* */ post: operations['admin/accounts/create']; @@ -3788,13 +3787,14 @@ export type components = { * @example xxxxxxxxxx */ channelId?: string | null; - channel?: { + channel?: ({ id: string; name: string; color: string; isSensitive: boolean; allowRenoteToExternal: boolean; - } | null; + userId: string | null; + }) | null; localOnly?: boolean; reactionAcceptance: string | null; reactions: Record; @@ -4456,6 +4456,9 @@ export type operations = { enableActiveEmailValidation: boolean; enableVerifymailApi: boolean; verifymailAuthKey: string | null; + enableTruemailApi: boolean; + truemailInstance: string | null; + truemailAuthKey: string | null; enableChartsForRemoteUser: boolean; enableChartsForFederatedInstances: boolean; enableServerMachineStats: boolean; @@ -4620,7 +4623,6 @@ export type operations = { * admin/accounts/create * @description No description provided. * - * **Internal Endpoint**: This endpoint is an API for the misskey mainframe and is not intended for use by third parties. * **Credential required**: *No* */ 'admin/accounts/create': { @@ -8247,6 +8249,9 @@ export type operations = { enableActiveEmailValidation?: boolean; enableVerifymailApi?: boolean; verifymailAuthKey?: string | null; + enableTruemailApi?: boolean; + truemailInstance?: string | null; + truemailAuthKey?: string | null; enableChartsForRemoteUser?: boolean; enableChartsForFederatedInstances?: boolean; enableServerMachineStats?: boolean; From 30311aca18e50a179021b45c3beaf0ee29d3a423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E3=81=95=E3=82=80=E3=81=AE=E3=81=B2=E3=81=A8?= <46447427+samunohito@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:41:28 +0900 Subject: [PATCH 03/41] =?UTF-8?q?fix(misskey-js):=20/signup=E3=81=A8/signi?= =?UTF-8?q?n=E3=81=AE=E5=AE=9A=E7=BE=A9=E3=82=92=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=83=95=E3=83=AD=E3=83=B3=E3=83=88=E3=81=AE?= =?UTF-8?q?=E5=9E=8B=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92=E6=8A=91=E5=88=B6?= =?UTF-8?q?=E3=81=99=E3=82=8B=20(#12846)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(misskey-js): /signupと/signinの定義を復活してフロントの型エラーを抑制する * fix ci * fix ci * fix * fix --------- Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com> --- packages/backend/test/e2e/2fa.ts | 2 +- packages/backend/test/e2e/antennas.ts | 2 +- packages/backend/test/e2e/api-visibility.ts | 10 ++-- packages/backend/test/e2e/api.ts | 6 +-- packages/backend/test/e2e/block.ts | 6 +-- packages/backend/test/e2e/endpoints.ts | 8 +-- packages/backend/test/e2e/fetch-resource.ts | 4 +- packages/backend/test/e2e/ff-visibility.ts | 4 +- packages/backend/test/e2e/move.ts | 12 ++--- packages/backend/test/e2e/mute.ts | 6 +-- packages/backend/test/e2e/note.ts | 4 +- packages/backend/test/e2e/oauth.ts | 10 ++-- packages/backend/test/e2e/renote-mute.ts | 6 +-- packages/backend/test/e2e/streaming.ts | 14 ++--- packages/backend/test/e2e/thread-mute.ts | 6 +-- packages/backend/test/e2e/user-notes.ts | 2 +- packages/misskey-js/etc/misskey-js.api.md | 59 +++++++++++++++++++++ packages/misskey-js/src/api.types.ts | 25 ++++++++- packages/misskey-js/src/entities.ts | 37 ++++++++++++- 19 files changed, 170 insertions(+), 53 deletions(-) diff --git a/packages/backend/test/e2e/2fa.ts b/packages/backend/test/e2e/2fa.ts index ed967d2620..dfed8b2fce 100644 --- a/packages/backend/test/e2e/2fa.ts +++ b/packages/backend/test/e2e/2fa.ts @@ -24,7 +24,7 @@ import type * as misskey from 'misskey-js'; describe('2要素認証', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; const config = loadConfig(); const password = 'test'; diff --git a/packages/backend/test/e2e/antennas.ts b/packages/backend/test/e2e/antennas.ts index c0317f1435..9bac5122d4 100644 --- a/packages/backend/test/e2e/antennas.ts +++ b/packages/backend/test/e2e/antennas.ts @@ -37,7 +37,7 @@ describe('アンテナ', () => { // - srcのenumにgroupが残っている // - userGroupIdが残っている, isActiveがない type Antenna = misskey.entities.Antenna | Packed<'Antenna'>; - type User = misskey.entities.MeSignup; + type User = misskey.entities.SignupResponse; type Note = misskey.entities.Note; // アンテナを作成できる最小のパラメタ diff --git a/packages/backend/test/e2e/api-visibility.ts b/packages/backend/test/e2e/api-visibility.ts index 33c8d03fdb..afe4f9c05a 100644 --- a/packages/backend/test/e2e/api-visibility.ts +++ b/packages/backend/test/e2e/api-visibility.ts @@ -24,15 +24,15 @@ describe('API visibility', () => { describe('Note visibility', () => { //#region vars /** ヒロイン */ - let alice: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; /** フォロワー */ - let follower: misskey.entities.MeSignup; + let follower: misskey.entities.SignupResponse; /** 非フォロワー */ - let other: misskey.entities.MeSignup; + let other: misskey.entities.SignupResponse; /** 非フォロワーでもリプライやメンションをされた人 */ - let target: misskey.entities.MeSignup; + let target: misskey.entities.SignupResponse; /** specified mentionでmentionを飛ばされる人 */ - let target2: misskey.entities.MeSignup; + let target2: misskey.entities.SignupResponse; /** public-post */ let pub: any; diff --git a/packages/backend/test/e2e/api.ts b/packages/backend/test/e2e/api.ts index cf24228b83..ad351eebbb 100644 --- a/packages/backend/test/e2e/api.ts +++ b/packages/backend/test/e2e/api.ts @@ -13,9 +13,9 @@ import type * as misskey from 'misskey-js'; describe('API', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/block.ts b/packages/backend/test/e2e/block.ts index 4445d9036c..25ff9f11ac 100644 --- a/packages/backend/test/e2e/block.ts +++ b/packages/backend/test/e2e/block.ts @@ -14,9 +14,9 @@ describe('Block', () => { let app: INestApplicationContext; // alice blocks bob - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/endpoints.ts b/packages/backend/test/e2e/endpoints.ts index 2ef3434bca..bfd0b0272d 100644 --- a/packages/backend/test/e2e/endpoints.ts +++ b/packages/backend/test/e2e/endpoints.ts @@ -17,10 +17,10 @@ import type * as misskey from 'misskey-js'; describe('Endpoints', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; - let dave: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; + let dave: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/fetch-resource.ts b/packages/backend/test/e2e/fetch-resource.ts index 251d662760..28affe7768 100644 --- a/packages/backend/test/e2e/fetch-resource.ts +++ b/packages/backend/test/e2e/fetch-resource.ts @@ -25,7 +25,7 @@ const JSON_UTF8 = 'application/json; charset=utf-8'; describe('Webリソース', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; let aliceUploadedFile: any; let alicesPost: any; let alicePage: any; @@ -34,7 +34,7 @@ describe('Webリソース', () => { let aliceGalleryPost: any; let aliceChannel: any; - let bob: misskey.entities.MeSignup; + let bob: misskey.entities.SignupResponse; type Request = { path: string, diff --git a/packages/backend/test/e2e/ff-visibility.ts b/packages/backend/test/e2e/ff-visibility.ts index 1fbd45c741..4d323e14e7 100644 --- a/packages/backend/test/e2e/ff-visibility.ts +++ b/packages/backend/test/e2e/ff-visibility.ts @@ -13,8 +13,8 @@ import type * as misskey from 'misskey-js'; describe('FF visibility', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/move.ts b/packages/backend/test/e2e/move.ts index b009ef124a..f7da66a27c 100644 --- a/packages/backend/test/e2e/move.ts +++ b/packages/backend/test/e2e/move.ts @@ -20,12 +20,12 @@ describe('Account Move', () => { let url: URL; let root: any; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; - let dave: misskey.entities.MeSignup; - let eve: misskey.entities.MeSignup; - let frank: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; + let dave: misskey.entities.SignupResponse; + let eve: misskey.entities.SignupResponse; + let frank: misskey.entities.SignupResponse; let Users: UsersRepository; diff --git a/packages/backend/test/e2e/mute.ts b/packages/backend/test/e2e/mute.ts index a4b57a1eba..3b5542dfe0 100644 --- a/packages/backend/test/e2e/mute.ts +++ b/packages/backend/test/e2e/mute.ts @@ -14,9 +14,9 @@ describe('Mute', () => { let app: INestApplicationContext; // alice mutes carol - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/note.ts b/packages/backend/test/e2e/note.ts index 961df99cc2..8d33c63485 100644 --- a/packages/backend/test/e2e/note.ts +++ b/packages/backend/test/e2e/note.ts @@ -16,8 +16,8 @@ describe('Note', () => { let app: INestApplicationContext; let Notes: any; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/oauth.ts b/packages/backend/test/e2e/oauth.ts index 3a5e4ebdae..3ca1f8b542 100644 --- a/packages/backend/test/e2e/oauth.ts +++ b/packages/backend/test/e2e/oauth.ts @@ -75,7 +75,7 @@ function getMeta(html: string): { transactionId: string | undefined, clientName: }; } -function fetchDecision(transactionId: string, user: misskey.entities.MeSignup, { cancel }: { cancel?: boolean } = {}): Promise { +function fetchDecision(transactionId: string, user: misskey.entities.SignupResponse, { cancel }: { cancel?: boolean } = {}): Promise { return fetch(new URL('/oauth/decision', host), { method: 'post', body: new URLSearchParams({ @@ -90,14 +90,14 @@ function fetchDecision(transactionId: string, user: misskey.entities.MeSignup, { }); } -async function fetchDecisionFromResponse(response: Response, user: misskey.entities.MeSignup, { cancel }: { cancel?: boolean } = {}): Promise { +async function fetchDecisionFromResponse(response: Response, user: misskey.entities.SignupResponse, { cancel }: { cancel?: boolean } = {}): Promise { const { transactionId } = getMeta(await response.text()); assert.ok(transactionId); return await fetchDecision(transactionId, user, { cancel }); } -async function fetchAuthorizationCode(user: misskey.entities.MeSignup, scope: string, code_challenge: string): Promise<{ client: AuthorizationCode, code: string }> { +async function fetchAuthorizationCode(user: misskey.entities.SignupResponse, scope: string, code_challenge: string): Promise<{ client: AuthorizationCode, code: string }> { const client = new AuthorizationCode(clientConfig); const response = await fetch(client.authorizeURL({ @@ -150,8 +150,8 @@ describe('OAuth', () => { let app: INestApplicationContext; let fastify: FastifyInstance; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; let sender: (reply: FastifyReply) => void; diff --git a/packages/backend/test/e2e/renote-mute.ts b/packages/backend/test/e2e/renote-mute.ts index 7d57ba17b6..fededdff32 100644 --- a/packages/backend/test/e2e/renote-mute.ts +++ b/packages/backend/test/e2e/renote-mute.ts @@ -14,9 +14,9 @@ describe('Renote Mute', () => { let app: INestApplicationContext; // alice mutes carol - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/streaming.ts b/packages/backend/test/e2e/streaming.ts index 288c54bdbc..a447ba94ae 100644 --- a/packages/backend/test/e2e/streaming.ts +++ b/packages/backend/test/e2e/streaming.ts @@ -32,15 +32,15 @@ describe('Streaming', () => { describe('Streaming', () => { // Local users - let ayano: misskey.entities.MeSignup; - let kyoko: misskey.entities.MeSignup; - let chitose: misskey.entities.MeSignup; - let kanako: misskey.entities.MeSignup; + let ayano: misskey.entities.SignupResponse; + let kyoko: misskey.entities.SignupResponse; + let chitose: misskey.entities.SignupResponse; + let kanako: misskey.entities.SignupResponse; // Remote users - let akari: misskey.entities.MeSignup; - let chinatsu: misskey.entities.MeSignup; - let takumi: misskey.entities.MeSignup; + let akari: misskey.entities.SignupResponse; + let chinatsu: misskey.entities.SignupResponse; + let takumi: misskey.entities.SignupResponse; let kyokoNote: any; let kanakoNote: any; diff --git a/packages/backend/test/e2e/thread-mute.ts b/packages/backend/test/e2e/thread-mute.ts index 0e487976dc..5c68e2b150 100644 --- a/packages/backend/test/e2e/thread-mute.ts +++ b/packages/backend/test/e2e/thread-mute.ts @@ -13,9 +13,9 @@ import type * as misskey from 'misskey-js'; describe('Note thread mute', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; - let bob: misskey.entities.MeSignup; - let carol: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + let carol: misskey.entities.SignupResponse; beforeAll(async () => { app = await startServer(); diff --git a/packages/backend/test/e2e/user-notes.ts b/packages/backend/test/e2e/user-notes.ts index b5f00a6327..4f2e7c4cf3 100644 --- a/packages/backend/test/e2e/user-notes.ts +++ b/packages/backend/test/e2e/user-notes.ts @@ -13,7 +13,7 @@ import type * as misskey from 'misskey-js'; describe('users/notes', () => { let app: INestApplicationContext; - let alice: misskey.entities.MeSignup; + let alice: misskey.entities.SignupResponse; let jpgNote: any; let pngNote: any; let jpgPngNote: any; diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index d4c43f207c..ddd69ce248 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -1034,6 +1034,18 @@ export type Endpoints = Overwrite; // @public (undocumented) @@ -1053,6 +1065,12 @@ declare namespace entities { EmojiUpdated, EmojiDeleted, AnnouncementCreated, + SignupRequest, + SignupResponse, + SignupPendingRequest, + SignupPendingResponse, + SigninRequest, + SigninResponse, EmptyRequest, EmptyResponse, AdminMetaResponse, @@ -2615,6 +2633,47 @@ type ServerStatsLog = string[]; // @public (undocumented) type Signin = components['schemas']['Signin']; +// @public (undocumented) +type SigninRequest = { + username: string; + password: string; + token?: string; +}; + +// @public (undocumented) +type SigninResponse = { + id: User['id']; + i: string; +}; + +// @public (undocumented) +type SignupPendingRequest = { + code: string; +}; + +// @public (undocumented) +type SignupPendingResponse = { + id: User['id']; + i: string; +}; + +// @public (undocumented) +type SignupRequest = { + username: string; + password: string; + host?: string; + invitationCode?: string; + emailAddress?: string; + 'hcaptcha-response'?: string | null; + 'g-recaptcha-response'?: string | null; + 'turnstile-response'?: string | null; +}; + +// @public (undocumented) +type SignupResponse = MeDetailed & { + token: string; +}; + // @public (undocumented) type StatsResponse = operations['stats']['responses']['200']['content']['application/json']; diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts index d97646b7cc..75ab7d91b1 100644 --- a/packages/misskey-js/src/api.types.ts +++ b/packages/misskey-js/src/api.types.ts @@ -1,6 +1,14 @@ import { Endpoints as Gen } from './autogen/endpoint'; import { UserDetailed } from './autogen/models'; import { UsersShowRequest } from './autogen/entities'; +import { + SigninRequest, + SigninResponse, + SignupPendingRequest, + SignupPendingResponse, + SignupRequest, + SignupResponse, +} from './entities'; type Overwrite = Omit< T, @@ -55,6 +63,21 @@ export type Endpoints = Overwrite< $default: UserDetailed; }; }; - } + }, + // api.jsonには載せないものなのでここで定義 + 'signup': { + req: SignupRequest; + res: SignupResponse; + }, + // api.jsonには載せないものなのでここで定義 + 'signup-pending': { + req: SignupPendingRequest; + res: SignupPendingResponse; + }, + // api.jsonには載せないものなのでここで定義 + 'signin': { + req: SigninRequest; + res: SigninResponse; + }, } > diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts index 99f433cc02..6314c88e0b 100644 --- a/packages/misskey-js/src/entities.ts +++ b/packages/misskey-js/src/entities.ts @@ -1,5 +1,5 @@ import { ModerationLogPayloads } from './consts.js'; -import { Announcement, EmojiDetailed, Page, User, UserDetailed } from './autogen/models'; +import { Announcement, EmojiDetailed, MeDetailed, MeDetailedOnly, Page, User, UserDetailed } from './autogen/models'; export * from './autogen/entities'; export * from './autogen/models'; @@ -183,3 +183,38 @@ export type EmojiDeleted = { export type AnnouncementCreated = { announcement: Announcement; }; + +export type SignupRequest = { + username: string; + password: string; + host?: string; + invitationCode?: string; + emailAddress?: string; + 'hcaptcha-response'?: string | null; + 'g-recaptcha-response'?: string | null; + 'turnstile-response'?: string | null; +} + +export type SignupResponse = MeDetailed & { + token: string; +} + +export type SignupPendingRequest = { + code: string; +}; + +export type SignupPendingResponse = { + id: User['id'], + i: string, +}; + +export type SigninRequest = { + username: string; + password: string; + token?: string; +}; + +export type SigninResponse = { + id: User['id'], + i: string, +}; From 30c3f6a22240a0329ab6afaccdd953c934fd2036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:42:09 +0900 Subject: [PATCH 04/41] =?UTF-8?q?(fix)=20MkFormDialog=E3=81=AB=E3=81=9B?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=81=84=E3=81=A7=E3=81=8D=E3=82=8B=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=E3=81=8C=E3=81=AA=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AF?= =?UTF-8?q?=E3=81=9D=E3=81=AE=E6=97=A8=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20(#12837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkFormDialog.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue index 6f882cfab7..2095a1dcea 100644 --- a/packages/frontend/src/components/MkFormDialog.vue +++ b/packages/frontend/src/components/MkFormDialog.vue @@ -20,7 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only -
+
+
+ +
{{ i18n.ts.nothing }}
+
@@ -70,6 +74,7 @@ import MkButton from './MkButton.vue'; import MkRadios from './MkRadios.vue'; import MkModalWindow from '@/components/MkModalWindow.vue'; import { i18n } from '@/i18n.js'; +import { infoImageUrl } from '@/instance.js'; const props = defineProps<{ title: string; From b46f431a2e13aad82b06249d08730e50192a767e Mon Sep 17 00:00:00 2001 From: Camilla Ett Date: Wed, 3 Jan 2024 16:41:38 +0900 Subject: [PATCH 05/41] =?UTF-8?q?fix(frontend):=20=E3=83=A2=E3=83=87?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=82=BF=E3=83=BC=E3=81=8C=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E3=81=AE=E3=82=A2=E3=83=90=E3=82=BF=E3=83=BC?= =?UTF-8?q?=E3=83=90=E3=83=8A=E3=83=BC=E3=82=92=E6=9C=AA=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E7=8A=B6=E6=85=8B=E3=81=AB=E5=87=BA=E6=9D=A5=E3=82=8B=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E5=95=8F=E9=A1=8C?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=20(#12889)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: syuilo --- CHANGELOG.md | 3 ++- packages/frontend/src/pages/admin-user.vue | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efd98ba31a..54fbb04120 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,8 @@ ### Client - Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように -- Enhance: チャンネルノートのピン留めをノートのメニューからできるように +- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 +- Enhance: チャンネルノートのピン留めをノートのメニューからできるよ ## 2023.12.2 diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue index d69d627ce8..ce820e10e8 100644 --- a/packages/frontend/src/pages/admin-user.vue +++ b/packages/frontend/src/pages/admin-user.vue @@ -223,7 +223,7 @@ import { url } from '@/config.js'; import { acct } from '@/filters/user.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import { i18n } from '@/i18n.js'; -import { iAmAdmin, $i } from '@/account.js'; +import { iAmAdmin, $i, iAmModerator } from '@/account.js'; import MkRolePreview from '@/components/MkRolePreview.vue'; import MkPagination from '@/components/MkPagination.vue'; From da154c8209bdacfc1ad9f708a638b8ebf027c66b Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 4 Jan 2024 08:44:38 +0900 Subject: [PATCH 06/41] Update ROADMAP.md --- ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ROADMAP.md b/ROADMAP.md index 3077c41e73..509ecb9fe7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -6,6 +6,7 @@ Also, the later tasks are more indefinite and are subject to change as developme This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development. - ~~Make the number of type errors zero (backend)~~ → Done ✔️ +- Make the number of type errors zero (frontend) - Improve CI - ~~Fix tests~~ → Done ✔️ - Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986 From f8d5a46dbf8ad89e576dafa3ae776334ccbbf751 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Thu, 4 Jan 2024 12:26:57 +0900 Subject: [PATCH 07/41] =?UTF-8?q?Fix:=20AiScript=E3=81=AEreadline=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=82=92Play=E4=BB=A5=E5=A4=96=E3=81=AB?= =?UTF-8?q?=E3=82=82=E9=81=A9=E7=94=A8=20(#12841)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add AiScriptReadline() in api.ts * apply AiScriptReadline on flash.vue * AiScriptReadline → aiScriptReadline * Update flash.vue * Update scratchpad.vue * Update WidgetAiscript.vue * Update WidgetAiscriptApp.vue * Update WidgetButton.vue * Update plugin.ts --- packages/frontend/src/pages/flash/flash.vue | 12 ++---------- packages/frontend/src/pages/scratchpad.vue | 16 ++-------------- packages/frontend/src/plugin.ts | 16 ++-------------- packages/frontend/src/scripts/aiscript/api.ts | 10 ++++++++++ packages/frontend/src/widgets/WidgetAiscript.vue | 16 ++-------------- .../frontend/src/widgets/WidgetAiscriptApp.vue | 16 ++-------------- packages/frontend/src/widgets/WidgetButton.vue | 16 ++-------------- 7 files changed, 22 insertions(+), 80 deletions(-) diff --git a/packages/frontend/src/pages/flash/flash.vue b/packages/frontend/src/pages/flash/flash.vue index 6df9bbc241..13e8184c19 100644 --- a/packages/frontend/src/pages/flash/flash.vue +++ b/packages/frontend/src/pages/flash/flash.vue @@ -67,7 +67,7 @@ import { i18n } from '@/i18n.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import MkAsUi from '@/components/MkAsUi.vue'; import { AsUiComponent, AsUiRoot, registerAsUiLib } from '@/scripts/aiscript/ui.js'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import MkFolder from '@/components/MkFolder.vue'; import MkCode from '@/components/MkCode.vue'; import { defaultStore } from '@/store.js'; @@ -162,15 +162,7 @@ async function run() { THIS_ID: values.STR(flash.value.id), THIS_URL: values.STR(`${url}/play/${flash.value.id}`), }, { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ result: a }) => { - ok(a ?? ''); - }); - }); - }, + in: aiScriptReadline, out: (value) => { // nop }, diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue index 1453bc1658..31a3b4e91b 100644 --- a/packages/frontend/src/pages/scratchpad.vue +++ b/packages/frontend/src/pages/scratchpad.vue @@ -44,7 +44,7 @@ import { Interpreter, Parser, utils } from '@syuilo/aiscript'; import MkContainer from '@/components/MkContainer.vue'; import MkButton from '@/components/MkButton.vue'; import MkCodeEditor from '@/components/MkCodeEditor.vue'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import * as os from '@/os.js'; import { $i } from '@/account.js'; import { i18n } from '@/i18n.js'; @@ -86,19 +86,7 @@ async function run() { root.value = _root.value; }), }), { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ canceled, result: a }) => { - if (canceled) { - ok(''); - } else { - ok(a); - } - }); - }); - }, + in: aiScriptReadline, out: (value) => { if (value.type === 'str' && value.value.toLowerCase().replace(',', '').includes('hello world')) { claimAchievement('outputHelloWorldOnScratchpad'); diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 5e49af4858..acc3e836fb 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -4,7 +4,7 @@ */ import { Interpreter, Parser, utils, values } from '@syuilo/aiscript'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import { inputText } from '@/os.js'; import { Plugin, noteActions, notePostInterruptors, noteViewInterruptors, postFormActions, userActions, pageViewInterruptors } from '@/store.js'; @@ -19,19 +19,7 @@ export async function install(plugin: Plugin): Promise { plugin: plugin, storageKey: 'plugins:' + plugin.id, }), { - in: (q): Promise => { - return new Promise(ok => { - inputText({ - title: q, - }).then(({ canceled, result: a }) => { - if (canceled) { - ok(''); - } else { - ok(a); - } - }); - }); - }, + in: aiScriptReadline, out: (value): void => { console.log(value); }, diff --git a/packages/frontend/src/scripts/aiscript/api.ts b/packages/frontend/src/scripts/aiscript/api.ts index 038ae23109..f6f63bb59e 100644 --- a/packages/frontend/src/scripts/aiscript/api.ts +++ b/packages/frontend/src/scripts/aiscript/api.ts @@ -11,6 +11,16 @@ import { customEmojis } from '@/custom-emojis.js'; import { url, lang } from '@/config.js'; import { nyaize } from '@/scripts/nyaize.js'; +export function aiScriptReadline(q: string): Promise { + return new Promise(ok => { + os.inputText({ + title: q, + }).then(({ result: a }) => { + ok(a ?? ''); + }); + }); +} + export function createAiScriptEnv(opts) { return { USER_ID: $i ? values.STR($i.id) : values.NULL, diff --git a/packages/frontend/src/widgets/WidgetAiscript.vue b/packages/frontend/src/widgets/WidgetAiscript.vue index 5968b54626..a4c1025265 100644 --- a/packages/frontend/src/widgets/WidgetAiscript.vue +++ b/packages/frontend/src/widgets/WidgetAiscript.vue @@ -25,7 +25,7 @@ import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, Wid import { GetFormResultType } from '@/scripts/form.js'; import * as os from '@/os.js'; import MkContainer from '@/components/MkContainer.vue'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import { $i } from '@/account.js'; import { i18n } from '@/i18n.js'; @@ -69,19 +69,7 @@ const run = async () => { storageKey: 'widget', token: $i?.token, }), { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ canceled, result: a }) => { - if (canceled) { - ok(''); - } else { - ok(a); - } - }); - }); - }, + in: aiScriptReadline, out: (value) => { logs.value.push({ id: Math.random().toString(), diff --git a/packages/frontend/src/widgets/WidgetAiscriptApp.vue b/packages/frontend/src/widgets/WidgetAiscriptApp.vue index 10248a840a..e236253797 100644 --- a/packages/frontend/src/widgets/WidgetAiscriptApp.vue +++ b/packages/frontend/src/widgets/WidgetAiscriptApp.vue @@ -18,7 +18,7 @@ import { Interpreter, Parser } from '@syuilo/aiscript'; import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js'; import { GetFormResultType } from '@/scripts/form.js'; import * as os from '@/os.js'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import { $i } from '@/account.js'; import MkAsUi from '@/components/MkAsUi.vue'; import MkContainer from '@/components/MkContainer.vue'; @@ -64,19 +64,7 @@ async function run() { root.value = _root.value; }), }, { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ canceled, result: a }) => { - if (canceled) { - ok(''); - } else { - ok(a); - } - }); - }); - }, + in: aiScriptReadline, out: (value) => { // nop }, diff --git a/packages/frontend/src/widgets/WidgetButton.vue b/packages/frontend/src/widgets/WidgetButton.vue index 11082c1e3f..80fd000d09 100644 --- a/packages/frontend/src/widgets/WidgetButton.vue +++ b/packages/frontend/src/widgets/WidgetButton.vue @@ -16,7 +16,7 @@ import { Interpreter, Parser } from '@syuilo/aiscript'; import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js'; import { GetFormResultType } from '@/scripts/form.js'; import * as os from '@/os.js'; -import { createAiScriptEnv } from '@/scripts/aiscript/api.js'; +import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js'; import { $i } from '@/account.js'; import MkButton from '@/components/MkButton.vue'; @@ -56,19 +56,7 @@ const run = async () => { storageKey: 'widget', token: $i?.token, }), { - in: (q) => { - return new Promise(ok => { - os.inputText({ - title: q, - }).then(({ canceled, result: a }) => { - if (canceled) { - ok(''); - } else { - ok(a); - } - }); - }); - }, + in: aiScriptReadline, out: (value) => { // nop }, From 6598d320d69bec2336b4b33501c47ac69e0eea95 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Thu, 4 Jan 2024 13:04:00 +0900 Subject: [PATCH 08/41] enhance: Use SI prefixes for job queue widget, extends bytes (#12896) * Use SI prefixes for job queue widget * a * bytes * lint --- packages/frontend/src/filters/bytes.ts | 4 ++-- packages/frontend/src/filters/kmg.ts | 9 +++++++++ .../frontend/src/widgets/WidgetJobQueue.vue | 18 +++++++++--------- 3 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 packages/frontend/src/filters/kmg.ts diff --git a/packages/frontend/src/filters/bytes.ts b/packages/frontend/src/filters/bytes.ts index d40b020a9e..2497ddb775 100644 --- a/packages/frontend/src/filters/bytes.ts +++ b/packages/frontend/src/filters/bytes.ts @@ -5,10 +5,10 @@ export default (v, digits = 0) => { if (v == null) return '?'; - const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; + const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'RB', 'QB']; if (v === 0) return '0'; const isMinus = v < 0; if (isMinus) v = -v; const i = Math.floor(Math.log(v) / Math.log(1024)); - return (isMinus ? '-' : '') + (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, '') + sizes[i]; + return (isMinus ? '-' : '') + (v / Math.pow(1024, i)).toFixed(digits).replace(/(\.[1-9]*)0+$/, '$1').replace(/\.$/, '') + (sizes[i] ?? `e+${ i * 3 }B`); }; diff --git a/packages/frontend/src/filters/kmg.ts b/packages/frontend/src/filters/kmg.ts new file mode 100644 index 0000000000..4dcb5c5800 --- /dev/null +++ b/packages/frontend/src/filters/kmg.ts @@ -0,0 +1,9 @@ +export default (v, fractionDigits = 0) => { + if (v == null) return 'N/A'; + if (v === 0) return '0'; + const sizes = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q']; + const isMinus = v < 0; + if (isMinus) v = -v; + const i = Math.floor(Math.log(v) / Math.log(1000)); + return (isMinus ? '-' : '') + (v / Math.pow(1000, i)).toFixed(fractionDigits).replace(/(\.[1-9]*)0+$/, '$1').replace(/\.$/, '') + (sizes[i] ?? `e+${ i * 3 }`); +}; diff --git a/packages/frontend/src/widgets/WidgetJobQueue.vue b/packages/frontend/src/widgets/WidgetJobQueue.vue index 10bc257e12..91983d8474 100644 --- a/packages/frontend/src/widgets/WidgetJobQueue.vue +++ b/packages/frontend/src/widgets/WidgetJobQueue.vue @@ -10,19 +10,19 @@ SPDX-License-Identifier: AGPL-3.0-only
Process
-
{{ number(current.inbox.activeSincePrevTick) }}
+
{{ kmg(current.inbox.activeSincePrevTick, 2) }}
Active
-
{{ number(current.inbox.active) }}
+
{{ kmg(current.inbox.active, 2) }}
Delayed
-
{{ number(current.inbox.delayed) }}
+
{{ kmg(current.inbox.delayed, 2) }}
Waiting
-
{{ number(current.inbox.waiting) }}
+
{{ kmg(current.inbox.waiting, 2) }}
@@ -31,19 +31,19 @@ SPDX-License-Identifier: AGPL-3.0-only
Process
-
{{ number(current.deliver.activeSincePrevTick) }}
+
{{ kmg(current.deliver.activeSincePrevTick, 2) }}
Active
-
{{ number(current.deliver.active) }}
+
{{ kmg(current.deliver.active, 2) }}
Delayed
-
{{ number(current.deliver.delayed) }}
+
{{ kmg(current.deliver.delayed, 2) }}
Waiting
-
{{ number(current.deliver.waiting) }}
+
{{ kmg(current.deliver.waiting, 2) }}
@@ -55,7 +55,7 @@ import { onUnmounted, reactive, ref } from 'vue'; import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js'; import { GetFormResultType } from '@/scripts/form.js'; import { useStream } from '@/stream.js'; -import number from '@/filters/number.js'; +import kmg from '@/filters/kmg.js'; import * as sound from '@/scripts/sound.js'; import { deepClone } from '@/scripts/clone.js'; import { defaultStore } from '@/store.js'; From 02978d02475a214c85c0ca636c0702eec2b87733 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 4 Jan 2024 15:20:23 +0900 Subject: [PATCH 09/41] lint --- packages/frontend/src/account.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index f23fb804c5..1e5f38cf1c 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -23,7 +23,7 @@ const accountData = miLocalStorage.getItem('account'); // TODO: 外部からはreadonlyに export const $i = accountData ? reactive(JSON.parse(accountData) as Account) : null; -export const iAmModerator = $i != null && ($i.isAdmin || $i.isModerator); +export const iAmModerator = $i != null && ($i.isAdmin === true || $i.isModerator === true); export const iAmAdmin = $i != null && $i.isAdmin; export let notesCount = $i == null ? 0 : $i.notesCount; From ea41cc6ec0f7b79fc753d37b4586abfef87bf23f Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 4 Jan 2024 15:30:40 +0900 Subject: [PATCH 10/41] refactor(frontend): reduce type errors --- packages/frontend/src/account.ts | 5 +++++ packages/frontend/src/pages/my-lists/index.vue | 6 ++++-- packages/frontend/src/pages/my-lists/list.vue | 6 ++++-- .../frontend/src/pages/settings/2fa.qrdialog.vue | 6 ++++-- packages/frontend/src/pages/settings/2fa.vue | 6 ++++-- .../settings/avatar-decoration.decoration.vue | 4 +++- .../pages/settings/avatar-decoration.dialog.vue | 4 +++- .../src/pages/settings/avatar-decoration.vue | 4 +++- packages/frontend/src/pages/settings/drive.vue | 4 +++- packages/frontend/src/pages/settings/email.vue | 16 +++++++++------- .../src/pages/settings/import-export.vue | 2 +- .../frontend/src/pages/settings/migration.vue | 10 ++++++---- .../pages/settings/mute-block.instance-mute.vue | 6 ++++-- .../frontend/src/pages/settings/mute-block.vue | 8 +++++--- .../src/pages/settings/notifications.vue | 8 +++++--- packages/frontend/src/pages/settings/other.vue | 12 +++--------- packages/frontend/src/pages/settings/privacy.vue | 8 +++++--- packages/frontend/src/pages/settings/profile.vue | 6 ++++-- packages/frontend/src/pages/settings/roles.vue | 8 ++------ 19 files changed, 77 insertions(+), 52 deletions(-) diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 1e5f38cf1c..25af298910 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -26,6 +26,11 @@ export const $i = accountData ? reactive(JSON.parse(accountData) as Account) : n export const iAmModerator = $i != null && ($i.isAdmin === true || $i.isModerator === true); export const iAmAdmin = $i != null && $i.isAdmin; +export function signinRequired() { + if ($i == null) throw new Error('signin required'); + return $i; +} + export let notesCount = $i == null ? 0 : $i.notesCount; export function incNotesCount() { notesCount++; diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue index 0abfb15d98..14e2315843 100644 --- a/packages/frontend/src/pages/my-lists/index.vue +++ b/packages/frontend/src/pages/my-lists/index.vue @@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ list.name }} ({{ i18n.t('nUsers', { n: `${list.userIds.length}/${$i?.policies['userEachUserListsLimit']}` }) }})
+
{{ list.name }} ({{ i18n.t('nUsers', { n: `${list.userIds.length}/${$i.policies['userEachUserListsLimit']}` }) }})
@@ -37,7 +37,9 @@ import { i18n } from '@/i18n.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import { userListsCache } from '@/cache.js'; import { infoImageUrl } from '@/instance.js'; -import { $i } from '@/account.js'; +import { signinRequired } from '@/account.js'; + +const $i = signinRequired(); const items = computed(() => userListsCache.value.value ?? []); diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue index cf9da02868..482fdcd8f2 100644 --- a/packages/frontend/src/pages/my-lists/list.vue +++ b/packages/frontend/src/pages/my-lists/list.vue @@ -25,7 +25,7 @@ SPDX-License-Identifier: AGPL-3.0-only - +
{{ i18n.ts.addUser }} @@ -66,10 +66,12 @@ import MkSwitch from '@/components/MkSwitch.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkInput from '@/components/MkInput.vue'; import { userListsCache } from '@/cache.js'; -import { $i } from '@/account.js'; +import { signinRequired } from '@/account.js'; import { defaultStore } from '@/store.js'; import MkPagination from '@/components/MkPagination.vue'; +const $i = signinRequired(); + const { enableInfiniteScroll, } = defaultStore.reactiveState; diff --git a/packages/frontend/src/pages/settings/2fa.qrdialog.vue b/packages/frontend/src/pages/settings/2fa.qrdialog.vue index 4641b49103..3d7bb06da2 100644 --- a/packages/frontend/src/pages/settings/2fa.qrdialog.vue +++ b/packages/frontend/src/pages/settings/2fa.qrdialog.vue @@ -110,7 +110,9 @@ import * as os from '@/os.js'; import MkFolder from '@/components/MkFolder.vue'; import MkInfo from '@/components/MkInfo.vue'; import { confetti } from '@/scripts/confetti.js'; -import { $i } from '@/account.js'; +import { signinRequired } from '@/account.js'; + +const $i = signinRequired(); defineProps<{ twoFactorData: { @@ -151,7 +153,7 @@ function downloadBackupCodes() { const txtBlob = new Blob([backupCodes.value.join('\n')], { type: 'text/plain' }); const dummya = document.createElement('a'); dummya.href = URL.createObjectURL(txtBlob); - dummya.download = `${$i?.username}-2fa-backup-codes.txt`; + dummya.download = `${$i.username}-2fa-backup-codes.txt`; dummya.click(); } } diff --git a/packages/frontend/src/pages/settings/2fa.vue b/packages/frontend/src/pages/settings/2fa.vue index 4c165ef4ee..35331738fd 100644 --- a/packages/frontend/src/pages/settings/2fa.vue +++ b/packages/frontend/src/pages/settings/2fa.vue @@ -80,9 +80,11 @@ import MkSwitch from '@/components/MkSwitch.vue'; import FormSection from '@/components/form/section.vue'; import MkFolder from '@/components/MkFolder.vue'; import * as os from '@/os.js'; -import { $i } from '@/account.js'; +import { signinRequired } from '@/account.js'; import { i18n } from '@/i18n.js'; +const $i = signinRequired(); + // メモ: 各エンドポイントはmeUpdatedを発行するため、refreshAccountは不要 withDefaults(defineProps<{ @@ -91,7 +93,7 @@ withDefaults(defineProps<{ first: false, }); -const usePasswordLessLogin = computed(() => $i?.usePasswordLessLogin ?? false); +const usePasswordLessLogin = computed(() => $i.usePasswordLessLogin ?? false); async function registerTOTP(): Promise { const auth = await os.authenticateDialog(); diff --git a/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue b/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue index 9c95b5547e..29586ad5f1 100644 --- a/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue +++ b/packages/frontend/src/pages/settings/avatar-decoration.decoration.vue @@ -16,7 +16,9 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index baee85866c..9cf4be778c 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -527,6 +527,10 @@ export const routes = [{ path: '/clicker', component: page(() => import('./pages/clicker.vue')), loginRequired: true, +}, { + path: '/drop-and-fusion', + component: page(() => import('./pages/drop-and-fusion.vue')), + loginRequired: true, }, { path: '/timeline', component: page(() => import('./pages/timeline.vue')), diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 0b966ff199..acde78f5fd 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -92,7 +92,13 @@ export type OperationType = typeof operationTypes[number]; * @param soundStore サウンド設定 * @param options `useCache`: デフォルトは`true` 一度再生した音声はキャッシュする */ -export async function loadAudio(soundStore: SoundStore, options?: { useCache?: boolean; }) { +export async function loadAudio(soundStore: { + type: Exclude; +} | { + type: '_driveFile_'; + fileId: string; + fileUrl: string; +}, options?: { useCache?: boolean; }) { if (_DEV_) console.log('loading audio. opts:', options); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (soundStore.type === null || (soundStore.type === '_driveFile_' && !soundStore.fileUrl)) { @@ -179,18 +185,31 @@ export async function playFile(soundStore: SoundStore) { createSourceNode(buffer, soundStore.volume)?.start(); } -export function createSourceNode(buffer: AudioBuffer, volume: number) : AudioBufferSourceNode | null { +export async function playRaw(type: Exclude, volume = 1, pan = 0, playbackRate = 1) { + const buffer = await loadAudio({ type }); + if (!buffer) return; + createSourceNode(buffer, volume, pan, playbackRate)?.start(); +} + +export function createSourceNode(buffer: AudioBuffer, volume: number, pan = 0, playbackRate = 1) : AudioBufferSourceNode | null { const masterVolume = defaultStore.state.sound_masterVolume; if (isMute() || masterVolume === 0 || volume === 0) { return null; } + const panNode = ctx.createStereoPanner(); + panNode.pan.value = pan; + const gainNode = ctx.createGain(); gainNode.gain.value = masterVolume * volume; const soundSource = ctx.createBufferSource(); soundSource.buffer = buffer; - soundSource.connect(gainNode).connect(ctx.destination); + soundSource.playbackRate.value = playbackRate; + soundSource + .connect(panNode) + .connect(gainNode) + .connect(ctx.destination); return soundSource; } diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index b970ff1df4..e50002dc2c 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -27,6 +27,11 @@ function toolsMenuItems(): MenuItem[] { to: '/clicker', text: '🍪👈', icon: 'ti ti-cookie', + }, { + type: 'link', + to: '/drop-and-fusion', + text: 'Drop & Fusion', + icon: 'ti ti-apple', }, ($i && ($i.isAdmin || $i.policies.canManageCustomEmojis)) ? { type: 'link', to: '/custom-emojis-manager', From 9eae82de1d4f9157602451e26e734c8f4ae94bea Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sat, 6 Jan 2024 13:33:56 +0100 Subject: [PATCH 21/41] chore(dependabot) open-pull-requests-limit=10? Somehow it's not opening any PR, so try higher count --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c5755315fc..d4678ec5e0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,7 +17,7 @@ updates: directory: "/" schedule: interval: daily - open-pull-requests-limit: 5 + open-pull-requests-limit: 10 # List dependencies required to be updated together, sharing the same version numbers. # Those who simply have the common owner (e.g. @fastify) don't need to be listed. groups: From 0815a5235d226434e17ead0166227f5ec60133b8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jan 2024 09:24:04 +0900 Subject: [PATCH 22/41] tweak game --- .../assets/drop-and-fusion/dropper.png | Bin 0 -> 32415 bytes .../assets/drop-and-fusion/frame-dark.svg | Bin 0 -> 68475 bytes .../assets/drop-and-fusion/frame-light.svg | Bin 0 -> 67975 bytes .../frontend/assets/drop-and-fusion/frame.svg | Bin 69947 -> 0 bytes .../frontend/src/pages/drop-and-fusion.vue | 80 ++++++++++++++---- 5 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 packages/frontend/assets/drop-and-fusion/dropper.png create mode 100644 packages/frontend/assets/drop-and-fusion/frame-dark.svg create mode 100644 packages/frontend/assets/drop-and-fusion/frame-light.svg delete mode 100644 packages/frontend/assets/drop-and-fusion/frame.svg diff --git a/packages/frontend/assets/drop-and-fusion/dropper.png b/packages/frontend/assets/drop-and-fusion/dropper.png new file mode 100644 index 0000000000000000000000000000000000000000..f4300aa5c06f6001a87c01f8525847b294f43be3 GIT binary patch literal 32415 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 A_y7O^ literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/frame-dark.svg b/packages/frontend/assets/drop-and-fusion/frame-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3fa7c0da81e0b8eb7aae48b18e85d0f9ee72441a GIT binary patch literal 68475 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/frame-light.svg b/packages/frontend/assets/drop-and-fusion/frame-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..6052ccbaa09bcc6120bbd81eb1988b666aedafbd GIT binary patch literal 67975 zcmeFZSCjk5l`r_dpQ5*KY{X1JYIrA&_6A785T5YF%MDnAUPNzjpnv|MUO;KmOzYd>D7FlBQ#ZQ0-c9{f<||Md4i@BEhZE&Lt7 zvjKmUmre7>X>GDUWn0$uY5M1+DTjZ4XI`eh&i)84CrhH?PgB2k>7W1M&8jcEe}1R2 zijjXnvERTq1o`*B9_0JS->?6evSj(?JJi4aa{he(>%4$r|Icap8UKH{)j#b8xU@h2 z3jf2E!2cUu*7S-04I{yg67(OifB*B(tn^@7%jNtN@*4_<@V~v{b@(fE(ge>p)kNzy0_CWj&k zhNb@S$G^Wqe*5e1a0dU4MCm{L5ku+UFpB)gnfw1f>OUUrugCxUQU3^r<~Ncc|3IMR zZ#el+NBxP1|7IMpe;SAXUt{odxWA9X-(UPUC%}JBfRR68$g;nI7k?XP1o_8tCTQ{> z#`(V*Ui2sMu|I&+gHsHh{Sn3gfc?{*{ypmddOjSC$v>X&KWFv3ZvJVN|7o3?fBPT* zO9iVqnuve@dqn-`jHg*X|HHZ{zhU%Cnf~S1zem*HZjAh=8~Z(g{wWC4Xo>#xa{zeg zK7Wp*IirX_l-|v-c0>_BJqNyY+bwwa170Oh@a@^%x%c;dHS@aR`{Ewlo_?T#S2Pd4 z83!kN%1*@Kwcqd!|MD!NGw?L0&Xf)CHEmI7eXlvllvh8N6l5!jfJ4Ty3<3l14O}n_8)Wilue0 z8>&z(&k{V(bv-Y&(8DCtghkjGg{j438A{&ZSX!ar^?2*rBIYjhl;EnbEto_gD1##n z&Nrp;*>yb>R5c(aT_8$*vH4mK2z{%>_edFWstV`Uqf&=LvWa)4^EeKu+cl~LnJYIl z8K;?|LUC!sksVCozgvkP!=F8Y{UKV2Ikcmamv&-? z-IHc*l+rTl$w%G8L~~(Z_76NmxHG3<93TgA1ODTn7yV8QdV`4rhdW4Qvy)?_kG92W z<&96`W#*={`!IcVB*{=q8_2yGPYtD2FxD){iw&539G@7v^jNE;qF?HYHyZtTYXUwI zDq(NAmvJPLn?@AGv3X{{GxPEl3Qku229r#V;8KnwPlin@j#0t6)wBx7S)wc-j3~TJ zkBh`;Xo#kCcJds8buF8s%xoC`+$y~er}(|MauVtSX<&!wP!X#mNN7KY5;-~ruJAZt zDj3FLwIQJS?D5LQVeKAt_;u(fogI73k^YkwFaKGZrJn6D#DK449XHRD1eL`}w5cY0 zIN~@nne~ZZ5r%2lNwkiY>H;euL2RX#zFJ#&O5+Kz*TYJw%nt7b`dh8W9WW!xo1_+ujf@J%Z=&6`xB7*jnCHA#5ip*hY zh)+M*V~&s&>}CVhFS^QFNZ{`6cWzcOjyY?@|_&PE!>^vwA{B{$BM5a*^IUpgPB7=NzH&oHOqFdb{i6XpRMeHS8k^ zY&d@u(E{4)WXR(Ngx0Qd(kB(Dn*Uew7{WTsiJZSoy2XafwdK=8 zyEJ9LEhuLV&GR*LrIw$s`*64UfBpQg@%UFf{A)e@DJlSxYeH00;>E^!) zEj-k_TfL{i?Y+S6EC6RI$+HgHC@siqk{iJ>Kb*u=Wp(^s5EqH(?`6CJtm`0imYsg> zORQu|IypX#-JdbN+~;XG0e-}j^qDG+TAbwdh}2P?!irhMN>ay^x7|ol_(Di6$!-pn z65fH8mZ5iKc;TZv|0ziDntn|7dW0e$g3GfHvqqyUaLCi&gA=jk2|yTU>DOtgS>bd6 zZJo3%bDhTLmcT<8$OY5$fuz$@`(AWZ46ukzI$L})GUT~z@Ek_W(hb*;oOCLS^iVVZ zqS?+{lH2o{OAQ0(emp(_XR(yydqCn>vldG1oPlxY zdbZwp(PZuF__fLrCtQ%Zwblz_Sz2=xFLK8uU2lOS3=kb6L7pk(eBB>>#>3&U2#2s> zaPYvCiI*IJ)dR^n!X(RKv3Mhy`4Cgod~vJ8WQJ5U5S4?wJa#-tj{{-pe(cB{jl(o2 zq5TqRA<|x$Dcth!Tv_}Tsmr?spS>Vsde0XZR3w_dhCX&}%>_EGiH52(j5Z94&x;1u^$ME2QGNUuQ3f|s%Wg9cpF1;f?Hv<~&vI4R`ouVEG{*MUAF55=Sc>ANz zLb=wR+B{_Agu7sIB^H6qVUKGOK|#*|@6c*94Sx$nNXey;U=}>j-tl?DNe)3pM|KUm zKLDp-f_sNpm=QKrg?B77)s#dxd%C7(!VeI2DB2X$dXzdw7TVfY5xkHe^HdVr|LpH- z5er?~v~ewqij(x~?(>dUcEy=H~Tu{at)xDJ>)o-^t=8+G8% ze6j*BDQ}JI(e%`uQ$-Vkdz995tEkxNvl#?VQX1wwAVCoGvx>UD#D||lZH%&{oxF~x z^)0dSvGsazY4aW) z0ItZ_{FW9UY5L$&FHj-miBU|}CK`41;^*we)bdcz1#B;MbhAFTkNwWko=}?auz6y` zf*!Dg;(*{2F*(6jCsIPE*H9$&OM3Q$j;)jZT`Uh#<-;9)miFQaTR>2tR&}-vqAniS zclGGs)2GQdY|CGYe%tvq&K47f1E&ucD^@~_R(m^scZ1Ll4YA*)e9PYS8~q%QNYWG) z=9ID5o5=ARkEdKP{FbLno`~~-7h5PQppu(!@i_LwU{pTEs%NQiawbl>6lKG0)nS}w zgOv}QJk>`u&SCk(kPqAgM0`5cpA2W${BAmk&*!Tpdt;pE80UasM>rMoMszpsB@qx2k*1+*9VNFEMVS@v| zy;$7nC@SSVW1iyI%lbUBj&(_(ht$L&3NO|cla5-d#3x>NMjPQJbwWy6pDq1f;40p! zAN_?TSW3uYsismXf$<6{;;K^7-6N1zUfQ*7DIGLaF%&2j3TOA4e{%Q$yI!B8&qTO+ znv>0MOkAtkC*RqbNX$Do<371)1_3-Ut|H(>9~!>$J9In93xpc`b1eJzD&1BYR2+~2+$B6L9UV;+Y=ayEluIe#%wzYA;L0iB_L1_VN23-W z%k_R+pZC#&P$zJahtC6zM!%V*O&bqimEij=%e&f!p%FF@7trc>*^Hor-pOo*4Yq}# z>+oTSO|%>~)M|iXbwQv-?OqMhCLrHKG`yqnwR0~$SO979#mIvp_VJacwo=x9z1e5fxN#4`==g%3fD zpo4m#!a{By$i<$3!KTtKp9AaSiS@bLmCHKbN8*ByGb+tdST!OC%U5KPjLj zfi@`z{qr+Kg&@f{qn~1$ZAlcz&HS-rUdFIfkg+!{H@EUoFA{ezW>V96G6pt5SC^ZW31i>+ zj`8h)MJE8-0fxz;oo0cVIXoBKx#qd{<2Mh5ei!s=a~|xau)*wupnGgv2d`p!KnA>J z(4!zHF9WT~&7BoQ#iJ#&5WEw)D!-I(7{mnew{n+N3ZBmfd;Io zHl!O9Ytb7tD0JoZHWH5K10fNvdn!O)WLJPZ$dZk;%%OU{1MgiG9DqWV-h zgCdThf(78Ua_j*w8$9{<06s!ICdMe`nMu7*Fg>QAKEMo}7dX7%aHfj&rG442vL6`S z^8&eoaZpTfh%sQgvl%oh-TO02R6oqWSA zY3I!2VjOP2LsJUhVwmjUs$*;##!c*f$akgej@0v#=IdyHg#0Q@_$39b-{;U64K|Ttb z6dyQDu^^#ZRrGRM<;`+hG~VP}^uE>V@^RhF7Q5iBtRa3=lRBXq>7B^JarmEH~64$FB{q;n4C%)q82SoZ2sBc@B;!_oCsm|mXjuM zTksoOu*9+DwGQeZ3||vAx_Istx0v$6yJz@s-;4%}A<$Wpc(@rH+6!2_4`84}ZxZU6 z4>+z#AIbrMb*@0UYb7(l3`H}#2~$q6Cmd|Xo8*fD%9g2umn^S%Z**+?`sRA`sETV; zzB+y)F;HOY?1ffMtG`jQNGWPRv5kpnxWtYdv23mcgA+X*_~>ESQ=uDdl+O~H{Z-{R zQpI6&gT>Jr1F`5EMiyF`6t02*xgr6Y{)!n!g4UH9Q$28u6!SA-;U}3h8RB!&k@U=& z!?Xq$6-*8=fl%vqc@=afP8B4)mV?WRGY|az4!kvyF-L_Zs1A&$+MOKbd+-@|d*FRt zS6EBrvWq^hvV+gtd1F`o$V(HO3q}Mj zE=q&z9#MSsPm|oY1?1NN#MWrp{AaJaSGjLVLwlp{<9SVM0lZi6?)vtd94O-vz{4}E zr&A>3ZO=7kJd2@`qe5`?>^}A~6X6Z-0n+dGeNTw)+f8ZdL*n+JSjCUQ3DvVna-VUw<6U|G!zpXU%ysg_bRnqMq3MVz|JWh7G2E==H z)A*NuUVR|DBv}C4DeD+9$Td$Iu8UTNsjtAVCfo+mZ*HIlkxr|geJQ}Ag(_V?f1aW$ zC*8&?HdCzTUZA;aekOhw`=qxg$*|r&aE{PT3VRlsa5;?V@XL&8ILfPt073Hjf(pD| zUEtVg85QuUw8B}w>)Bh>Sd`NGq-`@a%>u@VBCQ?cxe3zWp@&o(O=l+pa4(L6mMxYf z;FXeL!fa(Wje*_GydF#cv~_&Et8)*AAxzd;A+`W3E?X9p61ck*U|Gf)d6qbFpVX&V z*2+t8e27J~!1p>ChG~#KqO2Qe5aGwq+RU%zt=>YAKSUT>p}2P<%(LwK{E4y%wSAA4 z-x3Ob7ww!VS**oN(pp{CCY`IoIo&49+YDmnOL{CUK=o}c@;;ZX!J{=3yF150a1Fzj zKN^>Ws%*}*t6pOc8eL*(0)TZ;e~Iq4*z>9py@Wuwp9EZNXux#OQl&8Tl^kfyQ+51J4Vb+PW0IM?@A+Lq6%*OI*A zgJ#)-bUE<~6A*tF7TY^T8MOqFrCRKGGB|{6>R#e=k|iy zK4xWjA?v#i&+PfN$xZ`}1+@E;XJL?w1S-qwGv0hfXco7%NGvb4_pxa*i>gmE_7Vb*jx!+-BL$zsncKtVhjpbB@ufdRBV^Dqc1=sZRgPAUo%yT-+KikW-_#DY8s>$GcQ|{LD zZURC9OA(nm3t-m5v^kdx>}{=+8^X4Gf^I$Q&Q`EzFa!#u(qtgIj zvz2p=ew6XUHF29lFvUf~`%@|5J10m3Ym%GED8MF$q||8we40n7#a!Ym?~V=j_YL@e z)LR;k_+2%aMt57tFGuz{M?zj34|znLA)cPFQbyawrLU_c_R6=YWbIbGnvcsN>$`r- z9`v@tbi9#G`7WQ{4faM;8yW`nyQ>YW+9ZO_1m>>JpPNsI@Pq-4l>Y7U82Bx<72fURGPr^vrEQhmmfWelW8n z5AMzuumsGF$nz~Balu!t#(?cD$lbIHQ`z~VuhvItC=^KEVeZ7lZ&hh)R zeNv_&zc{MnCjXRIz<@sw3E0z=XxKjZL-vfJ!vh5K#1Gex=mcDTCe;#%#3d@|tZig0 zLeek&pj2IaAIk?mRxwm0)pvahH__V9MjD(eN(CSv;XHq5u&_z-LcK9v?;uyx2jRp4 zPi3m>Aa4u6zgsNiVclSKwXm90iBF%Rtz`+Jhm4}&0MO%ay~LBd?5Po>_KrlA z$cwWzNSLIYn${a4DN3b2WPkC_HV;3jU4#Df;PhARC~f^(o;5t(4F6&K6`cYq0NzCP z)qZX@+T?jCz6H{qb$E;{b1vU3LKVCY;M;4vE&0jApSTNfO1y*L`zHq{H!s~?lkvK8klGv3=yG(Mo0}FQ z(rqo6jxbR&bgC#Lm!u>dl5e4!``(DPfpQPgOl}oj;_wg|3)?yQOw-$-VkIk!zo9T# z@8iZcR0}ByW#e6bQwB9ljx)3NNFvCoaBZ+wt513BuklEna~R^%2Vz4g>90;tu>B2e zkty8W?VeRV@wE|}?#0()khSEg-r5A)_Vm~^lfU!qg^{Pq(P8vX2uNAG-DCuz`Gw^a ze08(;Aa`@45XP$730BG#=ts_&>+(m1NC6BKN%mv&g=B@)Hu+7Ye(2E<0NHfeFC+%> znzk2kLvHkeW`g#Z1FBzm?px6J*HRLPNl|*#JFD?Z3k$y(09mBe#zFmc$EJVa=43no z!RuHBB&dmYfU13}_7bZfxG$3w^fk8x^%=Uel2Gw|pkWv+Ny@-lY?POjK*HKLA21}j zya*ufKEBFdZSH(>Gewa7mP!xWownv%|E(V6-1ALJR^lTXNtkMfG`wZnAu^t>Beg(1 ztySraENLPEMr#(W?_QZ@K=I27Hq}4<6ePMHA3`tRK{6CSP|HjR*?(w@`_&^1zWasZstwk6dfRPb>?$~jOZwGdE8r(2)fX?T&UcSrd_z8+iH}RmQ zcO9yQ&4LsdIUs9vks}@J`!gyy>kh2N_=k)v8%U3xVfkm|HFftSs!SWsd>GqH=qq54 zl_K7Fe{hPMs_04<#6xBE1wW}r8B%<)6|Sx)ohp=X2Osv%2rm@6#OJE_;$3z3DHTX@ z0p!p`iS`q0oLdDKtfE(1B|>m!ek$6??Q)F9kI2!h!_=J%ISER4QvDRviF-aGiJoES zvwA)=WH;J6C2v3Li~)Q{k2EHne%FEOHofBm_{ACn-82G}l`1h7PrVpa@;QmCHPAtp z^bv&7(=&VQfg-i)7r)>$j|qJYy86M6EGQ?#4;G>!5Y2^#L{uP90a(Ir05}&k7mSZ^ zq~f~>tN?(+#}1$~x99AT0WdxTh*9%}e@*O)3XsFQr8bIDjmk$n_>g;)$HE6kyHv7r3VLD^CUdV158!FMd1Z@hgjbA_q zAYRjXRBu0{QK}7f`YpNS)2Vx=dIuPYbw`~xoyo!+?1g($f&r*fe;a!SD`~|hy>Zhp zR0g{w3JeXrT#$#`C<4hmVdbHl-zS!l^SgYbv@))N3I^RW{U_DMA(G}l>x2t|&{*Gc z>h;8}s-Uuq@aObI7V<3Sz_*eKY*nCb7SIpdNFyLWf;`QKlBd+skV<~;)T+~AG{#X7 zX?8pbiWa|=$w8Z4U(Dl5XduVKrn<)Qjm0mMr5)%1;awWUr)6EM1^j6`G-2lK@|0!t z{KQe{b2%rm@I$msML~(M|7NaSE8mnT#K)|H-0W<}{?p44D`E}kixfrX_kPlzA9~j6 zV6JYH34d!(!}I+zH+_QMGC7~~Tc}hLLY+7euA}FuF9^3JY>revxjP{RIcc&SMeq)> zb|2L1rUfQ+N_)a}LNg4F!pyRQoLPV}vc4}ax2_}*Q^)`yUEH_FgV(|+=%^DS=Ow?8 z64Y-j^BT3Ute6A3X#wB8+*o7VFH(ucA&NvvZokQ(h|x;8fuG_FY$XxT_$7I8bN+CS zq#ix$Vd45m@#OC{>1{cnQq=sGRc`7KX<#b$RRa@!GM|jh^mFdu!ca?3ri8RHcmlkf z)m7S=FCMFzF#y?yuUz@cbzm9^LCvg3Jwq12+!_PpIE~;5(GwGD7P>Y_`Wj&^1>WQvB`jA^(cs zz>z;O)GWz*l6JxsuAa{~qt)OFqb@D1^wy11>W%+M&t%X_mnE9DN~5dOtubTrZ|_dG zUbvf&hpR#OHIGuw-p6@}fdWG}XSS%%;Kkk`W57FkWx)vg)umUFA(5vwNkQE_fn5p| zSsZmSo;*Pnf6+K#=wyL!1{Y9_^0(Y7bjHa?J`A60JvM+xiUchpIpOVpy1(-&{sx!>3K ztjk1e((Ps-g&Egq>bV%-uA5tcWQi0Gof3}5l`M5JVA%+4*BQ|n zP}4?H@nVDhUWtP1DX@k~aH`^mcUN;DSoS62yulS4eHsdfbZ%x~V~q4b-E9XzHU*Ub zIQoF;%dOkT1RJwK`c6;~wod~p^|gdyxOqNn94X6GKE=;pd$C6M0k_fA0l!nOPQwUj z5F~pWi%14}mMT+#Le~N}C;&Ty-fnyIV5NXqJ|Z_Md%Z2fnSom11Y{cO4sttz0U-F| z!m4*lMRF;6y?-L8g!$clKnSil&qitNrbo^DFL1nUI45@{l#IeStbE;?u=QvK^gd{#=fI&RE#ikAQ(HBbIHu9Ndg>bW zifVvU!=%#k^cWcj)ECxybZ_P_jGfE*jc7cN-gP(2=Z^&OLwx;pmmUk`0PVd*!gB+wcfeLf}^St zgKW;`fX~e_1OXT$1rP?#eId4y`FtUr$R60kwva6J?RN490{Zra3tPgQ#4^g;5tkdo zf?i*Ug{h3v-WQX#d>4HE#cucOh;i2@WQ9-Bw-|{?(_;!*k$^XlcRg9BsmQsTlmTo+ z`rZUdar|ucbOS!0FSpM=YO3nd*9vMYNw(fxH80|7Tm9868^SdCPjAY7m;wdWdm*bR zwFYF^)Q7S*pValY5B5{r?DG+fx6X@zw=3x>za0f9}%T*;r=h@!v>(tRsq4YMc zToXMp6jNCJm5id)>R<_&E