From 2a3398181104e8cfa1aed84badd2fdf64428ec2b Mon Sep 17 00:00:00 2001 From: tamaina Date: Sun, 31 Dec 2023 09:45:35 +0900 Subject: chore: use summaly, browser-image-resizer, and sharp-read-bmp on registry.npmjs.org instead of git (#12856) * chore: use @misskey-dev/summaly on registry.npmjs.org instead of git * fix backend dependency * fic backend dependency * @misskey-dev/sharp-read-bmp * fix * use @misskey-dev/browser-image-resizer --- packages/frontend/src/scripts/upload.ts | 2 +- packages/frontend/src/scripts/upload/compress-config.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/scripts/upload.ts b/packages/frontend/src/scripts/upload.ts index b896376ec8..14b667fd68 100644 --- a/packages/frontend/src/scripts/upload.ts +++ b/packages/frontend/src/scripts/upload.ts @@ -5,7 +5,7 @@ import { reactive, ref } from 'vue'; import * as Misskey from 'misskey-js'; -import { readAndCompressImage } from 'browser-image-resizer'; +import { readAndCompressImage } from '@misskey-dev/browser-image-resizer'; import { getCompressionConfig } from './upload/compress-config.js'; import { defaultStore } from '@/store.js'; import { apiUrl } from '@/config.js'; diff --git a/packages/frontend/src/scripts/upload/compress-config.ts b/packages/frontend/src/scripts/upload/compress-config.ts index 2deb9cbb81..4775213c20 100644 --- a/packages/frontend/src/scripts/upload/compress-config.ts +++ b/packages/frontend/src/scripts/upload/compress-config.ts @@ -5,7 +5,7 @@ import isAnimated from 'is-file-animated'; import { isWebpSupported } from './isWebpSupported.js'; -import type { BrowserImageResizerConfig } from 'browser-image-resizer'; +import type { BrowserImageResizerConfigWithConvertedOutput } from '@misskey-dev/browser-image-resizer'; const compressTypeMap = { 'image/jpeg': { quality: 0.90, mimeType: 'image/webp' }, @@ -21,7 +21,7 @@ const compressTypeMapFallback = { 'image/svg+xml': { quality: 1, mimeType: 'image/png' }, } as const; -export async function getCompressionConfig(file: File): Promise { +export async function getCompressionConfig(file: File): Promise { const imgConfig = (isWebpSupported() ? compressTypeMap : compressTypeMapFallback)[file.type]; if (!imgConfig || await isAnimated(file)) { return; -- cgit v1.2.3-freya From a9127e3ecd0c5789ba01123b8c4bbfc22c4e70e3 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:35:40 +0900 Subject: enhance(frontend): チャンネルノートのピン留めをノートメニューからできるように (#12887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): チャンネルノートのピン留めをノートメニューからできるように * Update Changelog --- CHANGELOG.md | 1 + .../backend/src/core/entities/NoteEntityService.ts | 1 + packages/backend/src/models/json-schema/note.ts | 4 +++ packages/frontend/src/scripts/get-note-menu.ts | 36 ++++++++++++++++++++++ packages/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(-) (limited to 'packages/frontend/src/scripts') 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; -- cgit v1.2.3-freya 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: Fix: AiScriptのreadlineの修正をPlay以外にも適用 (#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 ++-------------- packages/frontend/src/widgets/WidgetAiscriptApp.vue | 16 ++-------------- packages/frontend/src/widgets/WidgetButton.vue | 16 ++-------------- 7 files changed, 22 insertions(+), 80 deletions(-) (limited to 'packages/frontend/src/scripts') 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 }, -- cgit v1.2.3-freya From fa9c4a19b98167c7552bec8f4d791bd89db8fbbe Mon Sep 17 00:00:00 2001 From: おさむのひと <46447427+samunohito@users.noreply.github.com> Date: Thu, 4 Jan 2024 18:32:46 +0900 Subject: refactor(frontend): os.tsに引き込んだscripts/api.tsの再exportをやめる (#12694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(frontend): os.tsに引き込んだscripts/api.tsの再exportをやめる * fix * fix * renate to "misskeyApi" * rename file --- packages/frontend/src/account.ts | 5 +- packages/frontend/src/cache.ts | 10 +-- .../frontend/src/components/MkAccountMoved.vue | 4 +- .../frontend/src/components/MkAchievements.vue | 3 +- .../src/components/MkAnnouncementDialog.vue | 3 +- .../frontend/src/components/MkAutocomplete.vue | 5 +- packages/frontend/src/components/MkAvatars.vue | 4 +- .../src/components/MkChannelFollowButton.vue | 6 +- packages/frontend/src/components/MkChart.vue | 40 ++++----- .../frontend/src/components/MkDrive.folder.vue | 9 ++- .../frontend/src/components/MkDrive.navFolder.vue | 6 +- packages/frontend/src/components/MkDrive.vue | 23 +++--- .../frontend/src/components/MkFeaturedPhotos.vue | 4 +- .../frontend/src/components/MkFollowButton.vue | 11 +-- packages/frontend/src/components/MkHeatmap.vue | 12 +-- .../frontend/src/components/MkInstanceCardMini.vue | 4 +- .../frontend/src/components/MkInstanceStats.vue | 3 +- packages/frontend/src/components/MkNote.vue | 15 ++-- .../frontend/src/components/MkNoteDetailed.vue | 17 ++-- packages/frontend/src/components/MkNoteSub.vue | 4 +- .../frontend/src/components/MkNotification.vue | 6 +- packages/frontend/src/components/MkPagination.vue | 7 +- packages/frontend/src/components/MkPoll.vue | 3 +- packages/frontend/src/components/MkPostForm.vue | 9 ++- .../frontend/src/components/MkPostFormAttaches.vue | 7 +- .../components/MkPushNotificationAllowButton.vue | 7 +- .../src/components/MkReactionsViewer.reaction.vue | 9 ++- .../frontend/src/components/MkRetentionHeatmap.vue | 4 +- .../src/components/MkRetentionLineChart.vue | 4 +- packages/frontend/src/components/MkSignin.vue | 9 ++- .../src/components/MkSignupDialog.form.vue | 9 ++- .../components/MkUserAnnouncementEditDialog.vue | 3 +- .../frontend/src/components/MkUserCardMini.vue | 4 +- packages/frontend/src/components/MkUserPopup.vue | 3 +- .../frontend/src/components/MkUserSelectDialog.vue | 6 +- .../src/components/MkUserSetupDialog.Privacy.vue | 4 +- .../src/components/MkUserSetupDialog.User.vue | 4 +- .../MkVisitorDashboard.ActiveUsersChart.vue | 4 +- .../frontend/src/components/MkVisitorDashboard.vue | 5 +- .../frontend/src/components/page/page.note.vue | 4 +- packages/frontend/src/custom-emojis.ts | 6 +- packages/frontend/src/instance.ts | 4 +- packages/frontend/src/os.ts | 9 +-- packages/frontend/src/pages/_error_.vue | 4 +- packages/frontend/src/pages/about.vue | 4 +- packages/frontend/src/pages/admin-file.vue | 7 +- packages/frontend/src/pages/admin-user.vue | 23 +++--- packages/frontend/src/pages/admin/ads.vue | 11 +-- .../frontend/src/pages/admin/announcements.vue | 9 ++- .../frontend/src/pages/admin/bot-protection.vue | 3 +- packages/frontend/src/pages/admin/branding.vue | 3 +- packages/frontend/src/pages/admin/database.vue | 4 +- .../frontend/src/pages/admin/email-settings.vue | 3 +- .../frontend/src/pages/admin/external-services.vue | 3 +- packages/frontend/src/pages/admin/files.vue | 3 +- packages/frontend/src/pages/admin/index.vue | 5 +- .../frontend/src/pages/admin/instance-block.vue | 3 +- packages/frontend/src/pages/admin/invites.vue | 7 +- packages/frontend/src/pages/admin/moderation.vue | 3 +- .../frontend/src/pages/admin/object-storage.vue | 3 +- .../frontend/src/pages/admin/other-settings.vue | 3 +- .../src/pages/admin/overview.active-users.vue | 4 +- .../src/pages/admin/overview.ap-requests.vue | 4 +- .../src/pages/admin/overview.federation.vue | 5 +- .../src/pages/admin/overview.instances.vue | 4 +- .../src/pages/admin/overview.moderators.vue | 4 +- .../frontend/src/pages/admin/overview.stats.vue | 10 +-- .../frontend/src/pages/admin/overview.users.vue | 4 +- packages/frontend/src/pages/admin/overview.vue | 11 +-- .../frontend/src/pages/admin/proxy-account.vue | 5 +- packages/frontend/src/pages/admin/queue.chart.vue | 4 +- packages/frontend/src/pages/admin/relays.vue | 7 +- packages/frontend/src/pages/admin/roles.edit.vue | 3 +- packages/frontend/src/pages/admin/roles.role.vue | 3 +- packages/frontend/src/pages/admin/roles.vue | 3 +- packages/frontend/src/pages/admin/security.vue | 3 +- packages/frontend/src/pages/admin/settings.vue | 3 +- packages/frontend/src/pages/announcements.vue | 3 +- packages/frontend/src/pages/antenna-timeline.vue | 3 +- packages/frontend/src/pages/api-console.vue | 8 +- packages/frontend/src/pages/auth.form.vue | 6 +- packages/frontend/src/pages/auth.vue | 6 +- packages/frontend/src/pages/avatar-decorations.vue | 5 +- packages/frontend/src/pages/channel-editor.vue | 7 +- packages/frontend/src/pages/channel.vue | 3 +- packages/frontend/src/pages/clip.vue | 3 +- .../frontend/src/pages/custom-emojis-manager.vue | 5 +- packages/frontend/src/pages/drive.file.info.vue | 3 +- packages/frontend/src/pages/emoji-edit-dialog.vue | 7 +- packages/frontend/src/pages/emojis.emoji.vue | 3 +- packages/frontend/src/pages/explore.roles.vue | 4 +- packages/frontend/src/pages/explore.users.vue | 6 +- packages/frontend/src/pages/flash/flash-edit.vue | 3 +- packages/frontend/src/pages/flash/flash.vue | 3 +- packages/frontend/src/pages/follow-requests.vue | 6 +- packages/frontend/src/pages/follow.vue | 7 +- packages/frontend/src/pages/gallery/edit.vue | 3 +- packages/frontend/src/pages/gallery/post.vue | 3 +- packages/frontend/src/pages/install-extentions.vue | 3 +- packages/frontend/src/pages/instance-info.vue | 13 +-- packages/frontend/src/pages/invite.vue | 5 +- packages/frontend/src/pages/list.vue | 5 +- packages/frontend/src/pages/miauth.vue | 4 +- packages/frontend/src/pages/my-antennas/edit.vue | 4 +- packages/frontend/src/pages/my-antennas/editor.vue | 5 +- packages/frontend/src/pages/my-clips/index.vue | 3 +- packages/frontend/src/pages/my-lists/list.vue | 7 +- packages/frontend/src/pages/note.vue | 6 +- .../pages/page-editor/els/page-editor.el.image.vue | 3 +- .../pages/page-editor/els/page-editor.el.note.vue | 4 +- .../frontend/src/pages/page-editor/page-editor.vue | 15 ++-- packages/frontend/src/pages/page.vue | 3 +- packages/frontend/src/pages/registry.keys.vue | 3 +- packages/frontend/src/pages/registry.value.vue | 3 +- packages/frontend/src/pages/registry.vue | 3 +- packages/frontend/src/pages/role.vue | 4 +- packages/frontend/src/pages/search.note.vue | 3 +- packages/frontend/src/pages/search.user.vue | 3 +- packages/frontend/src/pages/settings/accounts.vue | 3 +- packages/frontend/src/pages/settings/api.vue | 3 +- packages/frontend/src/pages/settings/apps.vue | 4 +- .../src/pages/settings/avatar-decoration.vue | 3 +- .../frontend/src/pages/settings/drive-cleaner.vue | 3 +- packages/frontend/src/pages/settings/drive.vue | 9 ++- packages/frontend/src/pages/settings/email.vue | 5 +- packages/frontend/src/pages/settings/general.vue | 3 +- .../frontend/src/pages/settings/import-export.vue | 25 +++--- packages/frontend/src/pages/settings/migration.vue | 5 +- .../pages/settings/mute-block.instance-mute.vue | 4 +- .../frontend/src/pages/settings/mute-block.vue | 5 +- .../frontend/src/pages/settings/notifications.vue | 5 +- packages/frontend/src/pages/settings/other.vue | 3 +- .../src/pages/settings/preferences-backups.vue | 3 +- packages/frontend/src/pages/settings/privacy.vue | 4 +- packages/frontend/src/pages/settings/security.vue | 3 +- .../frontend/src/pages/settings/sounds.sound.vue | 3 +- packages/frontend/src/pages/settings/statusbar.vue | 4 +- .../frontend/src/pages/settings/webhook.edit.vue | 3 +- packages/frontend/src/pages/share.vue | 13 +-- packages/frontend/src/pages/signup-complete.vue | 3 +- packages/frontend/src/pages/timeline.vue | 3 +- packages/frontend/src/pages/user-list-timeline.vue | 4 +- .../frontend/src/pages/user/activity.following.vue | 4 +- .../frontend/src/pages/user/activity.heatmap.vue | 4 +- .../frontend/src/pages/user/activity.notes.vue | 4 +- packages/frontend/src/pages/user/activity.pv.vue | 4 +- packages/frontend/src/pages/user/followers.vue | 4 +- packages/frontend/src/pages/user/following.vue | 4 +- packages/frontend/src/pages/user/home.vue | 6 +- packages/frontend/src/pages/user/index.files.vue | 4 +- packages/frontend/src/pages/user/index.vue | 4 +- packages/frontend/src/pages/welcome.entrance.a.vue | 6 +- packages/frontend/src/pages/welcome.setup.vue | 3 +- packages/frontend/src/pages/welcome.timeline.vue | 4 +- packages/frontend/src/pages/welcome.vue | 4 +- packages/frontend/src/pizzax.ts | 6 +- packages/frontend/src/scripts/achievements.ts | 4 +- packages/frontend/src/scripts/aiscript/api.ts | 3 +- packages/frontend/src/scripts/api.ts | 94 ---------------------- packages/frontend/src/scripts/clicker-game.ts | 6 +- packages/frontend/src/scripts/gen-search-query.ts | 2 +- .../frontend/src/scripts/get-drive-file-menu.ts | 9 ++- packages/frontend/src/scripts/get-note-menu.ts | 23 +++--- packages/frontend/src/scripts/get-user-menu.ts | 3 +- packages/frontend/src/scripts/install-plugin.ts | 3 +- packages/frontend/src/scripts/lookup-user.ts | 5 +- packages/frontend/src/scripts/lookup.ts | 3 +- packages/frontend/src/scripts/misskey-api.ts | 94 ++++++++++++++++++++++ packages/frontend/src/scripts/select-file.ts | 3 +- packages/frontend/src/scripts/sound.ts | 4 +- packages/frontend/src/theme-store.ts | 8 +- packages/frontend/src/ui/_common_/common.vue | 3 +- .../src/ui/_common_/statusbar-federation.vue | 4 +- .../src/ui/_common_/statusbar-user-list.vue | 4 +- packages/frontend/src/ui/_common_/sw-inject.ts | 7 +- packages/frontend/src/ui/deck/antenna-column.vue | 3 +- packages/frontend/src/ui/deck/channel-column.vue | 5 +- packages/frontend/src/ui/deck/deck-store.ts | 10 +-- packages/frontend/src/ui/deck/list-column.vue | 3 +- .../frontend/src/ui/deck/role-timeline-column.vue | 3 +- packages/frontend/src/ui/visitor.vue | 3 +- packages/frontend/src/widgets/WidgetActivity.vue | 4 +- .../src/widgets/WidgetBirthdayFollowings.vue | 4 +- packages/frontend/src/widgets/WidgetFederation.vue | 6 +- .../frontend/src/widgets/WidgetInstanceCloud.vue | 3 +- .../frontend/src/widgets/WidgetOnlineUsers.vue | 4 +- packages/frontend/src/widgets/WidgetPhotos.vue | 4 +- packages/frontend/src/widgets/WidgetSlideshow.vue | 3 +- packages/frontend/src/widgets/WidgetTimeline.vue | 5 +- packages/frontend/src/widgets/WidgetTrends.vue | 4 +- packages/frontend/src/widgets/WidgetUserList.vue | 7 +- .../frontend/src/widgets/server-metric/index.vue | 4 +- 192 files changed, 673 insertions(+), 560 deletions(-) delete mode 100644 packages/frontend/src/scripts/api.ts create mode 100644 packages/frontend/src/scripts/misskey-api.ts (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 25af298910..b01a80d137 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -11,7 +11,8 @@ import { miLocalStorage } from '@/local-storage.js'; import { MenuButton } from '@/types/menu.js'; import { del, get, set } from '@/scripts/idb-proxy.js'; import { apiUrl } from '@/config.js'; -import { waiting, api, popup, popupMenu, success, alert } from '@/os.js'; +import { waiting, popup, popupMenu, success, alert } from '@/os.js'; +import { misskeyApi } from '@/scripts/misskey-api.js'; import { unisonReload, reloadChannel } from '@/scripts/unison-reload.js'; // TODO: 他のタブと永続化されたstateを同期 @@ -251,7 +252,7 @@ export async function openAccountMenu(opts: { } const storedAccounts = await getAccounts().then(accounts => accounts.filter(x => x.id !== $i.id)); - const accountsPromise = api('users/show', { userIds: storedAccounts.map(x => x.id) }); + const accountsPromise = misskeyApi('users/show', { userIds: storedAccounts.map(x => x.id) }); function createItem(account: Misskey.entities.UserDetailed) { return { diff --git a/packages/frontend/src/cache.ts b/packages/frontend/src/cache.ts index 25d2b3c15f..20950add80 100644 --- a/packages/frontend/src/cache.ts +++ b/packages/frontend/src/cache.ts @@ -5,9 +5,9 @@ import * as Misskey from 'misskey-js'; import { Cache } from '@/scripts/cache.js'; -import { api } from '@/os.js'; +import { misskeyApi } from '@/scripts/misskey-api.js'; -export const clipsCache = new Cache(1000 * 60 * 30, () => api('clips/list')); -export const rolesCache = new Cache(1000 * 60 * 30, () => api('admin/roles/list')); -export const userListsCache = new Cache(1000 * 60 * 30, () => api('users/lists/list')); -export const antennasCache = new Cache(1000 * 60 * 30, () => api('antennas/list')); +export const clipsCache = new Cache(1000 * 60 * 30, () => misskeyApi('clips/list')); +export const rolesCache = new Cache(1000 * 60 * 30, () => misskeyApi('admin/roles/list')); +export const userListsCache = new Cache(1000 * 60 * 30, () => misskeyApi('users/lists/list')); +export const antennasCache = new Cache(1000 * 60 * 30, () => misskeyApi('antennas/list')); diff --git a/packages/frontend/src/components/MkAccountMoved.vue b/packages/frontend/src/components/MkAccountMoved.vue index 155d9fe3a9..a5b43d3c6c 100644 --- a/packages/frontend/src/components/MkAccountMoved.vue +++ b/packages/frontend/src/components/MkAccountMoved.vue @@ -17,7 +17,7 @@ import * as Misskey from 'misskey-js'; import MkMention from './MkMention.vue'; import { i18n } from '@/i18n.js'; import { host as localHost } from '@/config.js'; -import { api } from '@/os.js'; +import { misskeyApi } from '@/scripts/misskey-api.js'; const user = ref(); @@ -25,7 +25,7 @@ const props = defineProps<{ movedTo: string; // user id }>(); -api('users/show', { userId: props.movedTo }).then(u => user.value = u); +misskeyApi('users/show', { userId: props.movedTo }).then(u => user.value = u); 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', -- cgit v1.2.3-freya From 622a09f8ed2e94b5b89894f1f10745d53af45069 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sun, 7 Jan 2024 13:29:17 +0900 Subject: Fix: `Mk:C:mfm`の`onClickEv`が正常に呼び出されない問題を修正 (#12831) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix clickable api * Update CHANGELOG.md * revert CHANGELOG.md * Update CHANGELOG.md --- packages/frontend/src/scripts/aiscript/ui.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/scripts/aiscript/ui.ts b/packages/frontend/src/scripts/aiscript/ui.ts index 08ba1e6d9b..215ac4cc69 100644 --- a/packages/frontend/src/scripts/aiscript/ui.ts +++ b/packages/frontend/src/scripts/aiscript/ui.ts @@ -218,7 +218,7 @@ function getTextOptions(def: values.Value | undefined): Omit { +function getMfmOptions(def: values.Value | undefined, call: (fn: values.VFn, args: values.Value[]) => Promise): Omit { utils.assertObject(def); const text = def.value.get('text'); @@ -241,7 +241,7 @@ function getMfmOptions(def: values.Value | undefined): Omit { - if (onClickEv) call(onClickEv, values.STR(evId)); + if (onClickEv) call(onClickEv, [values.STR(evId)]); }, }; } -- cgit v1.2.3-freya From 5e71418d5caca1cea333ee1b8629987cc69c4fbc Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 7 Jan 2024 08:02:53 +0100 Subject: fix(frontend/emoji) restore U+FE0F for simple emojis (#12866) * fix(frontend/emoji) restore U+FE0F for simple emojis * Update CHANGELOG.md --------- Co-authored-by: syuilo --- CHANGELOG.md | 1 + .../frontend/src/components/global/MkEmoji.vue | 10 +++--- packages/frontend/src/scripts/emojilist.ts | 7 +++- packages/frontend/test/emoji.test.ts | 41 ++++++++++++++++++++++ packages/frontend/test/init.ts | 24 +++++++------ 5 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 packages/frontend/test/emoji.test.ts (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d2fb4ccd5..474fcad674 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ ### Client - Feat: 新しいゲームを追加 - Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように +- Fix: ネイティブモードの絵文字がモノクロにならないように - Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 - Enhance: チャンネルノートのピン留めをノートのメニューからできるよ diff --git a/packages/frontend/src/components/global/MkEmoji.vue b/packages/frontend/src/components/global/MkEmoji.vue index 76ca8688d1..f6b21343b6 100644 --- a/packages/frontend/src/components/global/MkEmoji.vue +++ b/packages/frontend/src/components/global/MkEmoji.vue @@ -5,15 +5,14 @@ SPDX-License-Identifier: AGPL-3.0-only + + diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 9fb7ab2e23..7bd0eef000 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -4,10 +4,16 @@ SPDX-License-Identifier: AGPL-3.0-only --> diff --git a/packages/frontend/src/scripts/drop-and-fusion-engine.ts b/packages/frontend/src/scripts/drop-and-fusion-engine.ts index 342e818905..d64c6015a5 100644 --- a/packages/frontend/src/scripts/drop-and-fusion-engine.ts +++ b/packages/frontend/src/scripts/drop-and-fusion-engine.ts @@ -33,6 +33,7 @@ type Log = { operation: 'surrender'; }; +// TODO: インスタンスを作り直さなくてもゲームをリスタートできるようにする export class DropAndFusionGame extends EventEmitter<{ changeScore: (newScore: number) => void; changeCombo: (newCombo: number) => void; @@ -307,7 +308,6 @@ export class DropAndFusionGame extends EventEmitter<{ async function loadSingleMonoTexture(mono: Mono, game: DropAndFusionGame) { // Matter-js内にキャッシュがある場合はスキップ if (game.render.textures[mono.img]) return; - console.log('loading', mono.img); let src = mono.img; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- cgit v1.2.3-freya From 762fa6a8d85691e2d5d94a46b23d7641feefd402 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Jan 2024 12:34:03 +0900 Subject: enhance(drop-and-fusion): make game engine headless for server-side running --- .../frontend/src/pages/drop-and-fusion.game.vue | 438 ++++++++++++++------- .../frontend/src/scripts/drop-and-fusion-engine.ts | 359 +++++------------ 2 files changed, 387 insertions(+), 410 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/pages/drop-and-fusion.game.vue b/packages/frontend/src/pages/drop-and-fusion.game.vue index acaebbadf7..3fefb49fae 100644 --- a/packages/frontend/src/pages/drop-and-fusion.game.vue +++ b/packages/frontend/src/pages/drop-and-fusion.game.vue @@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
HOLD - +
- +
@@ -65,7 +65,7 @@ SPDX-License-Identifier: AGPL-3.0-only :moveClass="$style.transition_picked_move" mode="out-in" > - +