From 316ffcea54eb7f1f4b04c8b9937b390c629d088c Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 24 Dec 2023 14:20:43 +0900 Subject: [PATCH 001/184] =?UTF-8?q?ci:=20Get=20api.json=20from=20Misskey?= =?UTF-8?q?=E3=81=A7upload-artifact@v4=E3=81=A7=E5=90=8C=E5=90=8Dartifact?= =?UTF-8?q?=E3=81=A7=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=20(#12770)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci: upload-artifact@v4で同名artifactでエラーになるのを修正 Co-authored-by: おさむのひと <46447427+samunohito@users.noreply.github.com> * report-api-diff.ymlの最中にエラーが発生したときに分かりづらいので、PRにコメントを残すようにする * 古いget-api-diffを使ってるactionとの互換性をもたせる --------- Co-authored-by: おさむのひと <46447427+samunohito@users.noreply.github.com> --- .github/workflows/get-api-diff.yml | 4 +-- .github/workflows/report-api-diff.yml | 36 ++++++++++++++++++--------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.github/workflows/get-api-diff.yml b/.github/workflows/get-api-diff.yml index d604f9b16..bf92e701b 100644 --- a/.github/workflows/get-api-diff.yml +++ b/.github/workflows/get-api-diff.yml @@ -56,7 +56,7 @@ jobs: - name: Upload Artifact uses: actions/upload-artifact@v4 with: - name: api-artifact + name: api-artifact-${{ matrix.api-json-name }} path: ${{ matrix.api-json-name }} save-pr-number: @@ -69,5 +69,5 @@ jobs: echo "$PR_NUMBER" > ./pr_number - uses: actions/upload-artifact@v4 with: - name: api-artifact + name: api-artifact-pr-number path: pr_number diff --git a/.github/workflows/report-api-diff.yml b/.github/workflows/report-api-diff.yml index 309516772..54da8b4a8 100644 --- a/.github/workflows/report-api-diff.yml +++ b/.github/workflows/report-api-diff.yml @@ -19,24 +19,28 @@ jobs: uses: actions/github-script@v7 with: script: | + const fs = require('fs'); let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.payload.workflow_run.id, }); - let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { - return artifact.name == "api-artifact" - })[0]; - let download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', + let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => { + return artifact.name.startsWith("api-artifact-") || artifact.name == "api-artifact" }); - let fs = require('fs'); - fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/api-artifact.zip`, Buffer.from(download.data)); - - name: Extract artifact - run: unzip api-artifact.zip -d artifacts + await Promise.all(matchArtifacts.map(async (artifact) => { + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: artifact.id, + archive_format: 'zip', + }); + await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data)); + })); + - name: Extract all artifacts + run: | + find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';' + ls -la - name: Load PR Number id: load-pr-num run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT" @@ -83,3 +87,11 @@ jobs: pr_number: ${{ steps.load-pr-num.outputs.pr-number }} comment_tag: show_diff filePath: ./output.md + - name: Tell error to PR + uses: thollander/actions-comment-pull-request@v2 + if: failure() && steps.load-pr-num.outputs.pr-number + with: + pr_number: ${{ steps.load-pr-num.outputs.pr-number }} + comment_tag: show_diff_error + message: | + api.jsonの差分作成中にエラーが発生しました。詳細は[Workflowのログ](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})を確認してください。 From 6fce36374d8756f47f96c7a04cd388c994bd047f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 24 Dec 2023 15:23:56 +0900 Subject: [PATCH 002/184] =?UTF-8?q?enhance(backend):=20=E3=82=BB=E3=83=B3?= =?UTF-8?q?=E3=82=B7=E3=83=86=E3=82=A3=E3=83=96=E3=83=AF=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=81=8C=E3=83=8F=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A5=E3=82=BF=E3=82=B0=E3=83=88=E3=83=AC=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=81=AB=E3=82=82=E9=81=A9=E7=94=A8=E3=81=95=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 11 ++++++++ packages/backend/src/core/HashtagService.ts | 3 ++ .../backend/src/core/NoteCreateService.ts | 27 +----------------- packages/backend/src/core/UtilityService.ts | 28 +++++++++++++++++++ 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac31bc0d2..af2aea799 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,17 @@ --> +## 2023.12.1 + +### General +- + +### Client +- + +### Server +- Enhance: センシティブワードの設定がハッシュタグトレンドにも適用されるようになりました + ## 2023.12.0 ### Note diff --git a/packages/backend/src/core/HashtagService.ts b/packages/backend/src/core/HashtagService.ts index d37899990..5a2417c9c 100644 --- a/packages/backend/src/core/HashtagService.ts +++ b/packages/backend/src/core/HashtagService.ts @@ -15,6 +15,7 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { bindThis } from '@/decorators.js'; import { FeaturedService } from '@/core/FeaturedService.js'; import { MetaService } from '@/core/MetaService.js'; +import { UtilityService } from '@/core/UtilityService.js'; @Injectable() export class HashtagService { @@ -29,6 +30,7 @@ export class HashtagService { private featuredService: FeaturedService, private idService: IdService, private metaService: MetaService, + private utilityService: UtilityService, ) { } @@ -161,6 +163,7 @@ export class HashtagService { const instance = await this.metaService.fetch(); const hiddenTags = instance.hiddenTags.map(t => normalizeForSearch(t)); if (hiddenTags.includes(hashtag)) return; + if (this.utilityService.isSensitiveWordIncluded(hashtag, instance.sensitiveWords)) return; // YYYYMMDDHHmm (10分間隔) const now = new Date(); diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index 2bdff872a..35baa1447 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -253,7 +253,7 @@ export class NoteCreateService implements OnApplicationShutdown { if (data.visibility === 'public' && data.channel == null) { const sensitiveWords = meta.sensitiveWords; - if (this.isSensitive(data, sensitiveWords)) { + if (this.utilityService.isSensitiveWordIncluded(data.cw ?? data.text ?? '', sensitiveWords)) { data.visibility = 'home'; } else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) { data.visibility = 'home'; @@ -704,31 +704,6 @@ export class NoteCreateService implements OnApplicationShutdown { this.index(note); } - @bindThis - private isSensitive(note: Option, sensitiveWord: string[]): boolean { - if (sensitiveWord.length > 0) { - const text = note.cw ?? note.text ?? ''; - if (text === '') return false; - const matched = sensitiveWord.some(filter => { - // represents RegExp - const regexp = filter.match(/^\/(.+)\/(.*)$/); - // This should never happen due to input sanitisation. - if (!regexp) { - const words = filter.split(' '); - return words.every(keyword => text.includes(keyword)); - } - try { - return new RE2(regexp[1], regexp[2]).test(text); - } catch (err) { - // This should never happen due to input sanitisation. - return false; - } - }); - if (matched) return true; - } - return false; - } - @bindThis private isQuote(note: Option): note is Option & { renote: MiNote } { // sync with misc/is-quote.ts diff --git a/packages/backend/src/core/UtilityService.ts b/packages/backend/src/core/UtilityService.ts index b95e41167..5dec36c89 100644 --- a/packages/backend/src/core/UtilityService.ts +++ b/packages/backend/src/core/UtilityService.ts @@ -6,6 +6,7 @@ import { URL } from 'node:url'; import { toASCII } from 'punycode'; import { Inject, Injectable } from '@nestjs/common'; +import RE2 from 're2'; import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; import { bindThis } from '@/decorators.js'; @@ -41,6 +42,33 @@ export class UtilityService { return silencedHosts.some(x => `.${host.toLowerCase()}`.endsWith(`.${x}`)); } + @bindThis + public isSensitiveWordIncluded(text: string, sensitiveWords: string[]): boolean { + if (sensitiveWords.length === 0) return false; + if (text === '') return false; + + const regexpregexp = /^\/(.+)\/(.*)$/; + + const matched = sensitiveWords.some(filter => { + // represents RegExp + const regexp = filter.match(regexpregexp); + // This should never happen due to input sanitisation. + if (!regexp) { + const words = filter.split(' '); + return words.every(keyword => text.includes(keyword)); + } + try { + // TODO: RE2インスタンスをキャッシュ + return new RE2(regexp[1], regexp[2]).test(text); + } catch (err) { + // This should never happen due to input sanitisation. + return false; + } + }); + + return matched; + } + @bindThis public extractDbHost(uri: string): string { const url = new URL(uri); From 36701f8a7c867a68bcce814bfc4548624f43916b 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: Sun, 24 Dec 2023 15:24:26 +0900 Subject: [PATCH 003/184] =?UTF-8?q?fix(backend):=201702718871541-ffVisibil?= =?UTF-8?q?ity.js=E3=81=AEdown=E3=81=8C=E5=A3=8A=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8B=20(#12767)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/migration/1702718871541-ffVisibility.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend/migration/1702718871541-ffVisibility.js b/packages/backend/migration/1702718871541-ffVisibility.js index 24b187313..e9e820c89 100644 --- a/packages/backend/migration/1702718871541-ffVisibility.js +++ b/packages/backend/migration/1702718871541-ffVisibility.js @@ -24,9 +24,11 @@ export class ffVisibility1702718871541 { async down(queryRunner) { await queryRunner.query(`CREATE TYPE "public"."user_profile_ffvisibility_enum" AS ENUM('public', 'followers', 'private')`); await queryRunner.query(`ALTER TABLE "user_profile" ADD "ffVisibility" "public"."user_profile_ffvisibility_enum" NOT NULL DEFAULT 'public'`); + await queryRunner.query(`CREATE CAST ("public"."user_profile_followingvisibility_enum" AS "public"."user_profile_ffvisibility_enum") WITH INOUT AS ASSIGNMENT`); - await queryRunner.query(`UPDATE "user_profile" SET ffVisibility = "user_profile"."followingVisibility"`); + await queryRunner.query(`UPDATE "user_profile" SET "ffVisibility" = "followingVisibility"`); await queryRunner.query(`DROP CAST ("public"."user_profile_followingvisibility_enum" AS "public"."user_profile_ffvisibility_enum")`); + await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "followersVisibility"`); await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "followingVisibility"`); await queryRunner.query(`DROP TYPE "public"."user_profile_followersVisibility_enum"`); From cae40e68e4c84693fbeaf0e801e705ccb876e2c0 Mon Sep 17 00:00:00 2001 From: Nya Candy Date: Sun, 24 Dec 2023 14:24:51 +0800 Subject: [PATCH 004/184] fix: lint (#12761) --- packages/backend/src/core/EmailService.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/core/EmailService.ts b/packages/backend/src/core/EmailService.ts index 3a61e353f..7fc780078 100644 --- a/packages/backend/src/core/EmailService.ts +++ b/packages/backend/src/core/EmailService.ts @@ -7,7 +7,6 @@ import { URLSearchParams } from 'node:url'; import * as nodemailer from 'nodemailer'; import { Inject, Injectable } from '@nestjs/common'; import { validate as validateEmail } from 'deep-email-validator'; -import { SubOutputFormat } from 'deep-email-validator/dist/output/output.js'; import { MetaService } from '@/core/MetaService.js'; import { UtilityService } from '@/core/UtilityService.js'; import { DI } from '@/di-symbols.js'; @@ -166,7 +165,10 @@ export class EmailService { email: emailAddress, }); - let validated; + let validated: { + valid: boolean, + reason?: string | null, + }; if (meta.enableActiveEmailValidation) { if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) { From 0393d8f53cb8607ff9448208e125c7b9900ab422 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 24 Dec 2023 15:25:13 +0900 Subject: [PATCH 005/184] New Crowdin updates (#12759) * New translations ja-jp.yml (Spanish) * New translations ja-jp.yml (Chinese Traditional) * New translations ja-jp.yml (Korean) * New translations ja-jp.yml (Korean) --- locales/es-ES.yml | 78 +++++++++++++++++++++++++++++++++++++++++++++++ locales/ko-KR.yml | 5 +-- locales/zh-TW.yml | 15 ++++----- 3 files changed, 89 insertions(+), 9 deletions(-) diff --git a/locales/es-ES.yml b/locales/es-ES.yml index a079cf01f..80cf905f7 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -121,6 +121,12 @@ sensitive: "Marcado como sensible" add: "Agregar" reaction: "Reacción" reactions: "Reacción" +emojiPicker: "Selector de emojis" +pinnedEmojisForReactionSettingDescription: "Puedes seleccionar reacciones para fijarlos en el selector" +pinnedEmojisSettingDescription: "Puedes seleccionar emojis para fijarlos en el selector" +emojiPickerDisplay: "Mostrar el selector de emojis" +overwriteFromPinnedEmojisForReaction: "Sobreescribir las reacciones fijadas" +overwriteFromPinnedEmojis: "Sobreescribir los emojis fijados" reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir." rememberNoteVisibility: "Recordar visibilidad" attachCancel: "Quitar adjunto" @@ -260,6 +266,7 @@ removed: "Borrado" removeAreYouSure: "¿Desea borrar \"{x}\"?" deleteAreYouSure: "¿Desea borrar \"{x}\"?" resetAreYouSure: "¿Desea reestablecer?" +areYouSure: "¿Estás conforme?" saved: "Guardado" messaging: "Chat" upload: "Subir" @@ -640,6 +647,7 @@ smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP" smtpSecureInfo: "Apagar cuando se use STARTTLS" testEmail: "Prueba de envío" wordMute: "Silenciar palabras" +hardWordMute: "Filtro de palabra fuerte" regexpError: "Error de la expresión regular" regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line} de las palabras muteadas {tab}" instanceMute: "Instancias silenciadas" @@ -873,6 +881,8 @@ makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán pú classic: "Clásico" muteThread: "Silenciar hilo" unmuteThread: "Mostrar hilo" +followingVisibility: "Visibilidad de seguidos" +followersVisibility: "Visibilidad de seguidores" continueThread: "Ver la continuación del hilo" deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?" incorrectPassword: "La contraseña es incorrecta" @@ -1024,6 +1034,7 @@ sensitiveWords: "Palabras sensibles" sensitiveWordsDescription: "La visibilidad de todas las notas que contienen cualquiera de las palabras configuradas serán puestas en \"Inicio\" automáticamente. Puedes enumerás varias separándolas con saltos de línea" sensitiveWordsDescription2: "Si se usan espacios se crearán expresiones AND y las palabras subsecuentes con barras inclinadas se convertirán en expresiones regulares." hiddenTags: "Hashtags ocultos" +hiddenTagsDescription: "Selecciona las etiquetas que no se mostrarán en tendencias. Una etiqueta por línea." notesSearchNotAvailable: "No se puede buscar una nota" license: "Licencia" unfavoriteConfirm: "¿Desea quitar de favoritos?" @@ -1152,6 +1163,7 @@ tosAndPrivacyPolicy: "Condiciones de Uso y Política de Privacidad" avatarDecorations: "Decoraciones de avatar" attach: "Acoplar" detach: "Quitar" +detachAll: "Quitar todo" angle: "Ángulo" flip: "Echar de un capirotazo" showAvatarDecorations: "Mostrar decoraciones de avatar" @@ -1165,6 +1177,10 @@ cwNotationRequired: "Si se ha activado \"ocultar contenido\", es necesario propo doReaction: "Añadir reacción" code: "Código" reloadRequiredToApplySettings: "Es necesario recargar para que se aplique la configuración." +remainingN: "Faltan: {n}" +overwriteContentConfirm: "¿Quieres sustituir todo el contenido actual?" +seasonalScreenEffect: "Efectos de pantalla asociados a estaciones" +decorate: "Decorar" _announcement: forExistingUsers: "Solo para usuarios registrados" forExistingUsersDescription: "Este anuncio solo se mostrará a aquellos usuarios registrados en el momento de su publicación. Si se deshabilita esta opción, aquellos usuarios que se registren tras su publicación también lo verán." @@ -1222,6 +1238,45 @@ _initialTutorial: home: "Puedes ver los posts de las cuentas que sigues." local: "Puedes ver los posts de todos los usuarios de este servidor." social: "Se ven los posts de la línea de tiempo de inicio junto con los de la línea de tiempo local." + global: "Puedes ver notas de todos los servidores conectados." + description2: "Puedes cambiar la línea de tiempo en la parte superior de la pantalla cuando quieras." + description3: "Además, hay listas de líneas de tiempo y listas de canales. Para más detalle, por favor visita este enlace: {link}" + _postNote: + title: "Ajustes de publicación de nota" + description1: "Cuando publicas una nota en Misskey, hay varias opciones disponibles. El formulario tiene este aspecto." + _visibility: + description: "Puedes limitar quién puede ver tu nota." + public: "Tu nota será visible para todos los usuarios." + home: "Publicar solo en la línea de tiempo de Inicio. La nota se verá en tu perfil, la verán tus seguidores y también cuando sea renotada." + followers: "Visible solo para seguidores. Sólo tus seguidores podrán ver la nota, y no podrá ser renotada por otras personas." + direct: "Visible sólo para usuarios específicos, y el destinatario será notificado. Puede usarse como alternativa a la mensajería directa." + doNotSendConfidencialOnDirect1: "¡Ten cuidado cuando vayas a enviar información sensible!" + doNotSendConfidencialOnDirect2: "Los administradores del servidor pueden leer lo que escribes. Ten cuidado cuando envíes información sensible en notas directas en servidores no confiables." + localOnly: "Publicando con esta opción seleccionada, la nota no se federará hacia otros servidores. Los usuarios de otros servidores no podrán ver estas notas directamente, sin importar los ajustes seleccionados más arriba." + _cw: + title: "Alerta de contenido (CW)" + description: "En lugar de mostrarse el contenido de la nota, se mostrará lo que escribas en el campo \"comentarios\". Pulsando en \"leer más\" desplegará el contenido de la nota." + _exampleNote: + cw: "¡Esto te hará tener hambre!" + note: "Acabo de comerme un donut de chocolate glaseado 🍩😋" + useCases: "Esto se usa cuando las normas del servidor lo requieren, o para ocultar spoilers o contenido sensible." + _howToMakeAttachmentsSensitive: + title: "¿Cómo puedo marcar adjuntos como contenido sensible?" + description: "Cuando las normas del servidor lo requieran, o el contenido lo requiera, marca la opción de \"contenido sensible\" para el adjunto." + tryThisFile: "¡Prueba a marcar la imagen adjunta como contenido sensible!" + _exampleNote: + note: "Ups, la he liado al abrir la tapa del natto..." + method: "Para marcar un adjunto como sensible, haz clic en la miniatura, abre el menú, y haz clic en \"Marcar como sensible\"." + sensitiveSucceeded: "Cuando adjuntes archivos, por favor, ten en cuenta las normas del servidor para marcarlos como contenido sensible." + doItToContinue: "Marca el archivo adjunto como sensible para continuar." + _done: + title: "¡Has completado el tutorial! 🎉" + description: "Las funciones que mostramos aquí son sólo una pequeña parte. Para más detalles sobre el funcionamiento de Misskey, pulsa en este enlace: {link}" +_timelineDescription: + home: "En la línea de tiempo de Inicio puedes ver las notas de las cuentas a las que sigues." + local: "En la línea de tiempo Local puedes ver las notas de todos los usuarios del servidor." + social: "En la línea de tiempo Social verás las notas de Inicio y Local a la vez." + global: "En la línea de tiempo Global verás las notas de todos los servidores conectados." _serverRules: description: "Un conjunto de reglas que serán mostradas antes del registro. Configurar un sumario de términos de servicio es recomendado." _serverSettings: @@ -1233,6 +1288,7 @@ _serverSettings: manifestJsonOverride: "Sobreescribir manifest.json" shortName: "Nombre corto" shortNameDescription: "Forma corta del nombre de la instancia que puede mostrarse si el nombre completo es demasiado largo." + fanoutTimelineDescription: "Incrementa el rendimiento de forma significativa cuando se obtienen las líneas de tiempo y reduce la carga en la base de datos. A cambio, el uso de la memoria en Redis incrementará. Considera desactivar esta opción en caso de que tu servidor tenga poca memoria o detectes inestabilidad." _accountMigration: moveFrom: "Trasladar de otra cuenta a ésta" moveFromSub: "Crear un alias para otra cuenta." @@ -1490,6 +1546,9 @@ _achievements: _smashTestNotificationButton: title: "Sobrecarga de pruebas" description: "Envía muchas notificaciones de prueba en un corto espacio de tiempo" + _tutorialCompleted: + title: "Diploma del Curso Básico de Misskey" + description: "Tutorial completado" _role: new: "Crear rol" edit: "Editar rol" @@ -1500,7 +1559,9 @@ _role: assignTarget: "Asignar objetivo" descriptionOfAssignTarget: "Manual Para cambiar manualmente lo que se incluye en este rol.\nCondicional configura una condición, y los usuarios que cumplan la condición serán incluídos automáticamente." manual: "manual" + manualRoles: "Roles manuales" conditional: "condicional" + conditionalRoles: "Roles condicionales" condition: "condición" isConditionalRole: "Esto es un rol condicional" isPublic: "Publicar rol" @@ -1549,6 +1610,7 @@ _role: canHideAds: "Puede ocultar anuncios" canSearchNotes: "Uso de la búsqueda de notas" canUseTranslator: "Uso de traductor" + avatarDecorationLimit: "Número máximo de decoraciones de avatar" _condition: isLocal: "Usuario local" isRemote: "Usuario remoto" @@ -1577,6 +1639,7 @@ _emailUnavailable: disposable: "No es un correo reutilizable" mx: "Servidor de correo inválido" smtp: "Servidor de correo no disponible" + banned: "Email no disponible" _ffVisibility: public: "Publicar" followers: "Visible solo para seguidores" @@ -1653,6 +1716,7 @@ _aboutMisskey: donate: "Donar a Misskey" morePatrons: "Muchas más personas nos apoyan. Muchas gracias🥰" patrons: "Patrocinadores" + projectMembers: "Miembros del proyecto" _displayOfSensitiveMedia: respect: "Esconder medios marcados como sensibles" ignore: "Mostrar medios marcados como sensibles" @@ -1677,6 +1741,7 @@ _channel: notesCount: "{n} notas" nameAndDescription: "Nombre y descripción" nameOnly: "Sólo nombre" + allowRenoteToExternal: "Permitir renotas y menciones fuera del canal" _menuDisplay: sideFull: "Horizontal" sideIcon: "Horizontal (ícono)" @@ -1780,6 +1845,12 @@ _ago: yearsAgo: "Hace {n} años" invalid: "No hay nada que ver aqui" _timeIn: + seconds: "En {n} segundos" + minutes: "En {n}m" + hours: "En {n}h" + days: "En {n}d" + weeks: "En {n}sem." + months: "En {n}M" years: "En {n} años" _time: second: "Segundos" @@ -1906,6 +1977,7 @@ _widgets: _userList: chooseList: "Seleccione una lista" clicker: "Cliqueador" + birthdayFollowings: "Hoy cumplen años" _cw: hide: "Ocultar" show: "Ver más" @@ -1968,6 +2040,7 @@ _profile: changeAvatar: "Cambiar avatar" changeBanner: "Cambiar banner" verifiedLinkDescription: "Introduciendo una URL que contiene un enlace a tu perfil, se puede mostrar un icono de verificación de propiedad al lado del campo." + avatarDecorationMax: "Puedes añadir un máximo de {max} decoraciones de avatar." _exportOrImport: allNotes: "Todas las notas" favoritedNotes: "Notas favoritas" @@ -2089,6 +2162,7 @@ _notification: pollEnded: "Estan disponibles los resultados de la encuesta" newNote: "Nueva nota" unreadAntennaNote: "Antena {name}" + roleAssigned: "Rol asignado" emptyPushNotificationMessage: "Se han actualizado las notificaciones push" achievementEarned: "Logro desbloqueado" testNotification: "Notificación de prueba" @@ -2110,6 +2184,7 @@ _notification: pollEnded: "La encuesta terminó" receiveFollowRequest: "Recibió una solicitud de seguimiento" followRequestAccepted: "El seguimiento fue aceptado" + roleAssigned: "Rol asignado" achievementEarned: "Logro desbloqueado" app: "Notificaciones desde aplicaciones" _actions: @@ -2255,3 +2330,6 @@ _externalResourceInstaller: _themeInstallFailed: title: "Instalación de tema fallida" description: "Ha ocurrido un problema al instalar el tema. Por favor, inténtalo de nuevo. Se pueden ver más detalles del error en la consola de Javascript." +_dataSaver: + _media: + title: "Cargando Multimedia" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 6cdcc2c24..63d0812e9 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -114,7 +114,7 @@ quote: "인용" inChannelRenote: "채널 내 리노트" inChannelQuote: "채널 내 인용" pinnedNote: "고정된 노트" -pinned: "프로필에 고정" +pinned: "고정하기" you: "나" clickToShow: "클릭하여 보기" sensitive: "열람 주의" @@ -1179,7 +1179,7 @@ code: "문자열" reloadRequiredToApplySettings: "설정을 적용하려면 새로고침을 해야 합니다." remainingN: "나머지: {n}" overwriteContentConfirm: "현재 내용을 덮어쓰기 합니다. 계속 진행하시겠습니까?" -seasonalScreenEffect: "철에 맞는 화면으로 꾸미기" +seasonalScreenEffect: "계절에 따른 효과 보이기" decorate: "장식하기" _announcement: forExistingUsers: "기존 유저에게만 알림" @@ -1641,6 +1641,7 @@ _emailUnavailable: disposable: "임시 이메일 주소는 사용할 수 없습니다" mx: "메일 서버가 올바르지 않습니다" smtp: "메일 서버가 응답하지 않습니다" + banned: "이 메일 주소는 사용할 수 없습니다" _ffVisibility: public: "공개" followers: "팔로워에게만 공개" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 51ba42e66..782f871b1 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -632,11 +632,11 @@ tokenRequested: "允許存取帳戶" pluginTokenRequestedDescription: "此外掛將擁有在此設定的權限。" notificationType: "通知形式" edit: "編輯" -emailServer: "電郵伺服器" -enableEmail: "啟用發送電郵功能" -emailConfigInfo: "用於確認電郵地址及密碼重置" +emailServer: "電子郵件伺服器" +enableEmail: "啟用發送電子郵件功能" +emailConfigInfo: "用於確認電子郵件地址及密碼重置" email: "電子郵件" -emailAddress: "電郵地址" +emailAddress: "電子郵件位址" smtpConfig: "SMTP 伺服器設定" smtpHost: "主機" smtpPort: "埠" @@ -731,7 +731,7 @@ disableShowingAnimatedImages: "不播放動態圖檔" highlightSensitiveMedia: "強調敏感標記" verificationEmailSent: "已發送驗證電子郵件。請點擊進入電子郵件中的鏈接完成驗證。" notSet: "未設定" -emailVerified: "已成功驗證您的電郵" +emailVerified: "已成功驗證您的電子郵件地址" noteFavoritesCount: "我的最愛貼文的數目" pageLikesCount: "頁面被按讚次數" pageLikedCount: "頁面被按讚次數" @@ -783,7 +783,7 @@ capacity: "容量" inUse: "已使用" editCode: "編輯代碼" apply: "套用" -receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知" +receiveAnnouncementFromInstance: "接收來自伺服器的通知" emailNotification: "郵件通知" publish: "發布" inChannelSearch: "頻道内搜尋" @@ -955,7 +955,7 @@ cannotUploadBecauseExceedsFileSizeLimit: "由於超過了檔案大小的限制 beta: "測試版" enableAutoSensitive: "自動 NSFW 判定" enableAutoSensitiveDescription: "如果可用,它將使用機器學習技術判斷檔案是否需要標記為敏感。即使關閉此功能,也可能會依實例規則而自動啟用。" -activeEmailValidationDescription: "積極驗證使用者的電郵地址,以判斷它是否可以通訊。關閉此選項代表只會檢查地址是否符合格式。" +activeEmailValidationDescription: "主動地驗證使用者的電子郵件地址,以確定是否是一次性地址以及是否可以真正與其進行通訊。關閉時,僅檢查格式是否正確。" navbar: "導覽列" shuffle: "隨機" account: "帳戶" @@ -1641,6 +1641,7 @@ _emailUnavailable: disposable: "不是永久可用的地址" mx: "郵件伺服器不正確" smtp: "郵件伺服器沒有應答" + banned: "無法使用此電子郵件地址註冊" _ffVisibility: public: "公開" followers: "只有關注您的使用者能看到" From 7167bb397e6a40fa715254e2aa7f901956275975 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 24 Dec 2023 15:31:48 +0900 Subject: [PATCH 006/184] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af2aea799..4751fff65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -110,6 +110,7 @@ - Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように - Enhance: Meilisearchを有効にした検索で、ユーザーのミュートやブロックを考慮するように - Enhance: カスタム絵文字のインポート時の動作を改善 +- Enhance: json-schema(OpenAPIの戻り値として使用されるスキーマ定義)を出来る限り最新化 #12311 - Fix: 時間経過により無効化されたアンテナを再有効化したとき、サーバ再起動までその状況が反映されないのを修正 #12303 - Fix: ロールタイムラインが保存されない問題を修正 - Fix: api.jsonの生成ロジックを改善 #12402 @@ -137,7 +138,6 @@ - Feat: 管理者がコントロールパネルからメールアドレスの照会を行えるようになりました - Enhance: ローカリゼーションの更新 - Enhance: 依存関係の更新 -- Enhance: json-schema(OpenAPIの戻り値として使用されるスキーマ定義)を出来る限り最新化 #12311 ### Client - Enhance: MFMでルビを振れるように From bf45c2309845640de9a0d0472bb4480b2a9dc8af Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 24 Dec 2023 15:38:03 +0900 Subject: [PATCH 007/184] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4751fff65..432b39afb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,13 +15,14 @@ ## 2023.12.1 ### General -- +- Enhance: ローカリゼーションの更新 ### Client - ### Server - Enhance: センシティブワードの設定がハッシュタグトレンドにも適用されるようになりました +- Fix: 1702718871541-ffVisibility.jsのdownが壊れている ## 2023.12.0 From 0009aa332bec1bb52ee5600d528419c0455576d2 Mon Sep 17 00:00:00 2001 From: zyoshoka <107108195+zyoshoka@users.noreply.github.com> Date: Sun, 24 Dec 2023 16:16:58 +0900 Subject: [PATCH 008/184] =?UTF-8?q?refactor(frontend):=20import=E5=AE=A3?= =?UTF-8?q?=E8=A8=80=E5=91=A8=E3=82=8A=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=20(#12773)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...lugin-unwind-css-module-class-name.test.ts | 2 +- .../components/MkAbuseReport.stories.impl.ts | 4 ++-- .../MkAbuseReportWindow.stories.impl.ts | 4 ++-- .../components/MkAccountMoved.stories.impl.ts | 2 +- .../components/MkAchievements.stories.impl.ts | 4 ++-- .../components/MkAutocomplete.stories.impl.ts | 4 ++-- .../src/components/MkAvatars.stories.impl.ts | 4 ++-- .../frontend/src/components/MkContextMenu.vue | 2 +- .../src/components/MkDateSeparatedList.vue | 4 ++-- .../MkGalleryPostPreview.stories.impl.ts | 2 +- .../components/MkInviteCode.stories.impl.ts | 4 ++-- .../frontend/src/components/MkMediaList.vue | 2 +- packages/frontend/src/components/MkMenu.vue | 2 +- .../frontend/src/components/MkPageWindow.vue | 2 +- .../frontend/src/components/MkPagination.vue | 2 +- .../MkUserSetupDialog.Follow.stories.impl.ts | 4 ++-- .../MkUserSetupDialog.User.stories.impl.ts | 2 +- .../MkUserSetupDialog.stories.impl.ts | 4 ++-- .../frontend/src/components/MkWidgets.vue | 2 +- .../components/global/MkAcct.stories.impl.ts | 2 +- .../global/MkAvatar.stories.impl.ts | 2 +- .../MkMisskeyFlavoredMarkdown.stories.impl.ts | 2 +- .../components/global/MkStickyContainer.vue | 2 +- .../components/global/MkUrl.stories.impl.ts | 2 +- .../global/MkUserName.stories.impl.ts | 2 +- .../src/components/global/RouterView.vue | 2 +- .../src/components/page/page.block.vue | 2 +- .../src/components/page/page.image.vue | 2 +- .../src/components/page/page.note.vue | 2 +- .../src/components/page/page.section.vue | 2 +- .../src/components/page/page.text.vue | 2 +- packages/frontend/src/directives/hotkey.ts | 2 +- packages/frontend/src/directives/index.ts | 22 +++++++++---------- .../frontend/src/pages/admin/_header_.vue | 2 +- .../frontend/src/pages/admin/roles.edit.vue | 2 +- packages/frontend/src/pages/admin/roles.vue | 2 +- packages/frontend/src/pages/clip.vue | 2 +- .../frontend/src/pages/my-antennas/edit.vue | 2 +- .../frontend/src/pages/my-antennas/index.vue | 2 +- .../frontend/src/pages/my-clips/index.vue | 2 +- .../frontend/src/pages/my-lists/index.vue | 2 +- .../frontend/src/pages/settings/navbar.vue | 2 +- .../src/pages/settings/theme.manage.vue | 2 +- .../frontend/src/pages/settings/theme.vue | 2 +- packages/frontend/src/pages/theme-editor.vue | 2 +- .../src/pages/user/home.stories.impl.ts | 4 ++-- .../src/scripts/upload/compress-config.ts | 2 +- packages/frontend/src/ui/_common_/common.vue | 4 ++-- .../src/ui/_common_/navbar-for-mobile.vue | 4 ++-- packages/frontend/src/ui/classic.header.vue | 4 ++-- packages/frontend/src/ui/deck/column.vue | 2 +- packages/frontend/src/ui/deck/list-column.vue | 2 +- packages/frontend/src/ui/deck/main-column.vue | 2 +- .../src/widgets/server-metric/index.vue | 2 +- packages/frontend/test/init.ts | 4 ++-- packages/frontend/vite.config.local-dev.ts | 2 +- packages/frontend/vite.config.ts | 7 +++--- 57 files changed, 84 insertions(+), 83 deletions(-) diff --git a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts index 550e08d7f..535adc9c8 100644 --- a/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts +++ b/packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts @@ -6,7 +6,7 @@ import { parse } from 'acorn'; import { generate } from 'astring'; import { describe, expect, it } from 'vitest'; -import { normalizeClass, unwindCssModuleClassName } from './rollup-plugin-unwind-css-module-class-name'; +import { normalizeClass, unwindCssModuleClassName } from './rollup-plugin-unwind-css-module-class-name.js'; import type * as estree from 'estree'; function parseExpression(code: string): estree.Expression { diff --git a/packages/frontend/src/components/MkAbuseReport.stories.impl.ts b/packages/frontend/src/components/MkAbuseReport.stories.impl.ts index 3b6452962..77e7c84d5 100644 --- a/packages/frontend/src/components/MkAbuseReport.stories.impl.ts +++ b/packages/frontend/src/components/MkAbuseReport.stories.impl.ts @@ -7,8 +7,8 @@ import { action } from '@storybook/addon-actions'; import { StoryObj } from '@storybook/vue3'; import { rest } from 'msw'; -import { abuseUserReport } from '../../.storybook/fakes'; -import { commonHandlers } from '../../.storybook/mocks'; +import { abuseUserReport } from '../../.storybook/fakes.js'; +import { commonHandlers } from '../../.storybook/mocks.js'; import MkAbuseReport from './MkAbuseReport.vue'; export const Default = { render(args) { diff --git a/packages/frontend/src/components/MkAbuseReportWindow.stories.impl.ts b/packages/frontend/src/components/MkAbuseReportWindow.stories.impl.ts index b45d54679..dc842b3d1 100644 --- a/packages/frontend/src/components/MkAbuseReportWindow.stories.impl.ts +++ b/packages/frontend/src/components/MkAbuseReportWindow.stories.impl.ts @@ -7,8 +7,8 @@ import { action } from '@storybook/addon-actions'; import { StoryObj } from '@storybook/vue3'; import { rest } from 'msw'; -import { userDetailed } from '../../.storybook/fakes'; -import { commonHandlers } from '../../.storybook/mocks'; +import { userDetailed } from '../../.storybook/fakes.js'; +import { commonHandlers } from '../../.storybook/mocks.js'; import MkAbuseReportWindow from './MkAbuseReportWindow.vue'; export const Default = { render(args) { diff --git a/packages/frontend/src/components/MkAccountMoved.stories.impl.ts b/packages/frontend/src/components/MkAccountMoved.stories.impl.ts index a6d4d18c1..33c6c2463 100644 --- a/packages/frontend/src/components/MkAccountMoved.stories.impl.ts +++ b/packages/frontend/src/components/MkAccountMoved.stories.impl.ts @@ -5,7 +5,7 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { StoryObj } from '@storybook/vue3'; -import { userDetailed } from '../../.storybook/fakes'; +import { userDetailed } from '../../.storybook/fakes.js'; import MkAccountMoved from './MkAccountMoved.vue'; export const Default = { render(args) { diff --git a/packages/frontend/src/components/MkAchievements.stories.impl.ts b/packages/frontend/src/components/MkAchievements.stories.impl.ts index a67e1def1..6d972467b 100644 --- a/packages/frontend/src/components/MkAchievements.stories.impl.ts +++ b/packages/frontend/src/components/MkAchievements.stories.impl.ts @@ -6,8 +6,8 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { StoryObj } from '@storybook/vue3'; import { rest } from 'msw'; -import { userDetailed } from '../../.storybook/fakes'; -import { commonHandlers } from '../../.storybook/mocks'; +import { userDetailed } from '../../.storybook/fakes.js'; +import { commonHandlers } from '../../.storybook/mocks.js'; import MkAchievements from './MkAchievements.vue'; import { ACHIEVEMENT_TYPES } from '@/scripts/achievements.js'; export const Empty = { diff --git a/packages/frontend/src/components/MkAutocomplete.stories.impl.ts b/packages/frontend/src/components/MkAutocomplete.stories.impl.ts index 8232759ba..969519386 100644 --- a/packages/frontend/src/components/MkAutocomplete.stories.impl.ts +++ b/packages/frontend/src/components/MkAutocomplete.stories.impl.ts @@ -9,8 +9,8 @@ import { expect } from '@storybook/jest'; import { userEvent, waitFor, within } from '@storybook/testing-library'; import { StoryObj } from '@storybook/vue3'; import { rest } from 'msw'; -import { userDetailed } from '../../.storybook/fakes'; -import { commonHandlers } from '../../.storybook/mocks'; +import { userDetailed } from '../../.storybook/fakes.js'; +import { commonHandlers } from '../../.storybook/mocks.js'; import MkAutocomplete from './MkAutocomplete.vue'; import MkInput from './MkInput.vue'; import { tick } from '@/scripts/test-utils.js'; diff --git a/packages/frontend/src/components/MkAvatars.stories.impl.ts b/packages/frontend/src/components/MkAvatars.stories.impl.ts index 659c0eebd..d41b64695 100644 --- a/packages/frontend/src/components/MkAvatars.stories.impl.ts +++ b/packages/frontend/src/components/MkAvatars.stories.impl.ts @@ -6,8 +6,8 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { StoryObj } from '@storybook/vue3'; import { rest } from 'msw'; -import { userDetailed } from '../../.storybook/fakes'; -import { commonHandlers } from '../../.storybook/mocks'; +import { userDetailed } from '../../.storybook/fakes.js'; +import { commonHandlers } from '../../.storybook/mocks.js'; import MkAvatars from './MkAvatars.vue'; export const Default = { render(args) { diff --git a/packages/frontend/src/components/MkContextMenu.vue b/packages/frontend/src/components/MkContextMenu.vue index b78252be8..e29cf472f 100644 --- a/packages/frontend/src/components/MkContextMenu.vue +++ b/packages/frontend/src/components/MkContextMenu.vue @@ -20,7 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue index 33a6786d0..f1bcdec7f 100644 --- a/packages/frontend/src/components/MkNoteDetailed.vue +++ b/packages/frontend/src/components/MkNoteDetailed.vue @@ -224,7 +224,7 @@ import { claimAchievement } from '@/scripts/achievements.js'; import MkRippleEffect from '@/components/MkRippleEffect.vue'; import { showMovedDialog } from '@/scripts/show-moved-dialog.js'; import MkUserCardMini from '@/components/MkUserCardMini.vue'; -import MkPagination from '@/components/MkPagination.vue'; +import MkPagination, { Paging } from '@/components/MkPagination.vue'; import MkReactionIcon from '@/components/MkReactionIcon.vue'; import MkButton from '@/components/MkButton.vue'; @@ -307,7 +307,7 @@ const renotesPagination = computed(() => ({ params: { noteId: appearNote.value.id, }, -})); +} satisfies Paging)); const reactionsPagination = computed(() => ({ endpoint: 'notes/reactions', @@ -316,7 +316,7 @@ const reactionsPagination = computed(() => ({ noteId: appearNote.value.id, type: reactionTabType.value, }, -})); +} satisfies Paging)); useNoteCapture({ rootEl: el, diff --git a/packages/frontend/src/components/MkUserSetupDialog.Follow.vue b/packages/frontend/src/components/MkUserSetupDialog.Follow.vue index 5f3f5b81d..d924a54ff 100644 --- a/packages/frontend/src/components/MkUserSetupDialog.Follow.vue +++ b/packages/frontend/src/components/MkUserSetupDialog.Follow.vue @@ -37,15 +37,15 @@ SPDX-License-Identifier: AGPL-3.0-only import { i18n } from '@/i18n.js'; import MkFolder from '@/components/MkFolder.vue'; import XUser from '@/components/MkUserSetupDialog.User.vue'; -import MkPagination from '@/components/MkPagination.vue'; +import MkPagination, { Paging } from '@/components/MkPagination.vue'; -const pinnedUsers = { endpoint: 'pinned-users', noPaging: true }; +const pinnedUsers = { endpoint: 'pinned-users', noPaging: true } satisfies Paging; const popularUsers = { endpoint: 'users', limit: 10, noPaging: true, params: { state: 'alive', origin: 'local', sort: '+follower', -} }; +} } satisfies Paging; diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index baee85866..9cf4be778 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 0b966ff19..acde78f5f 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 b970ff1df..e50002dc2 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 129/184] 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 c5755315f..d4678ec5e 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 130/184] tweak game --- .../assets/drop-and-fusion/dropper.png | Bin 0 -> 32415 bytes .../assets/drop-and-fusion/frame-dark.svg | 28 ++++++ .../assets/drop-and-fusion/frame-light.svg | 28 ++++++ .../frontend/assets/drop-and-fusion/frame.svg | 25 ------ .../frontend/src/pages/drop-and-fusion.vue | 80 ++++++++++++++---- 5 files changed, 120 insertions(+), 41 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 000000000..3fa7c0da8 --- /dev/null +++ b/packages/frontend/assets/drop-and-fusion/frame-dark.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 000000000..6052ccbaa --- /dev/null +++ b/packages/frontend/assets/drop-and-fusion/frame-light.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/frontend/assets/drop-and-fusion/frame.svg b/packages/frontend/assets/drop-and-fusion/frame.svg deleted file mode 100644 index 4276dae83..000000000 --- a/packages/frontend/assets/drop-and-fusion/frame.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index d0ca5157e..7f4a885b4 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -11,7 +11,8 @@ SPDX-License-Identifier: AGPL-3.0-only
- SCORE: +
SCORE:
+
HIGH SCORE: -
@@ -33,7 +34,8 @@ SPDX-License-Identifier: AGPL-3.0-only
- + +
{{ comboPrev }} Chain!
+ (); const canvasEl = shallowRef(); @@ -191,7 +196,7 @@ const FRUITS = [{ const GAME_WIDTH = 450; const GAME_HEIGHT = 600; -const PHYSICS_QUALITY_FACTOR = 32; // 低いほどパフォーマンスが高いがガタガタして安定しなくなる +const PHYSICS_QUALITY_FACTOR = 16; // 低いほどパフォーマンスが高いがガタガタして安定しなくなる、逆に高すぎても何故か不安定になる let viewScaleX = 1; let viewScaleY = 1; @@ -203,6 +208,7 @@ const comboPrev = ref(0); const dropReady = ref(true); const gameOver = ref(false); const gameStarted = ref(false); +const highScore = ref(null); class Game extends EventEmitter<{ changeScore: (score: number) => void; @@ -251,6 +257,8 @@ class Game extends EventEmitter<{ this.emit('changeScore', value); } + private comboIntervalId: number | null = null; + constructor() { super(); @@ -294,6 +302,8 @@ class Game extends EventEmitter<{ //#region walls const WALL_OPTIONS: Matter.IChamferableBodyDefinition = { isStatic: true, + friction: 0.7, + slop: 1.0, render: { strokeStyle: 'transparent', fillStyle: 'transparent', @@ -308,7 +318,7 @@ class Game extends EventEmitter<{ ]); //#endregion - this.overflowCollider = Matter.Bodies.rectangle(GAME_WIDTH / 2, 0, GAME_WIDTH, 125, { + this.overflowCollider = Matter.Bodies.rectangle(GAME_WIDTH / 2, 0, GAME_WIDTH, 200, { isStatic: true, isSensor: true, render: { @@ -328,11 +338,13 @@ class Game extends EventEmitter<{ private createBody(fruit: typeof FRUITS[number], x: number, y: number) { return Matter.Bodies.circle(x, y, fruit.size / 2, { label: fruit.id, - density: 0.0005, + //density: 0.0005, + density: fruit.size / 1000, + restitution: 0.2, frictionAir: 0.01, - restitution: 0.4, - friction: 0.5, + friction: 0.7, frictionStatic: 5, + slop: 1.0, //mass: 0, render: { sprite: { @@ -372,7 +384,7 @@ class Game extends EventEmitter<{ this.activeBodyIds.push(body.id); }, 100); - const additionalScore = Math.round(currentFruit.score * (1 + (this.combo / 3))); + const additionalScore = Math.round(currentFruit.score * (1 + ((this.combo - 1) / 3))); this.score += additionalScore; const pan = ((newX / GAME_WIDTH) - 0.5) * 2; @@ -449,7 +461,7 @@ class Game extends EventEmitter<{ } }); - window.setInterval(() => { + this.comboIntervalId = window.setInterval(() => { if (this.latestFusionedAt < Date.now() - this.COMBO_INTERVAL) { this.combo = 0; } @@ -469,7 +481,7 @@ class Game extends EventEmitter<{ this.emit('changeStock', this.stock); const x = Math.min(GAME_WIDTH - this.PLAYAREA_MARGIN - (st.fruit.size / 2), Math.max(this.PLAYAREA_MARGIN + (st.fruit.size / 2), _x)); - const body = this.createBody(st.fruit, x, st.fruit.size / 2); + const body = this.createBody(st.fruit, x, 50 + st.fruit.size / 2); Matter.Composite.add(this.engine.world, body); this.activeBodyIds.push(body.id); this.latestDroppedBodyId = body.id; @@ -480,6 +492,7 @@ class Game extends EventEmitter<{ } public dispose() { + if (this.comboIntervalId) window.clearInterval(this.comboIntervalId); Matter.Render.stop(this.render); Matter.Runner.stop(this.runner); Matter.World.clear(this.engine.world, false); @@ -567,10 +580,28 @@ function attachGame() { currentPick.value = null; dropReady.value = false; gameOver.value = true; + + if (score.value > (highScore.value ?? 0)) { + highScore.value = score.value; + + misskeyApi('i/registry/set', { + scope: ['dropAndFusionGame'], + key: 'highScore', + value: highScore.value, + }); + } }); } -onMounted(() => { +onMounted(async () => { + try { + highScore.value = await misskeyApi('i/registry/get', { + scope: ['dropAndFusionGame'], + key: 'highScore', + }); + } catch (err) { + } + game = new Game(); attachGame(); @@ -667,7 +698,9 @@ definePageMetadata({ top: 0; left: 0; width: 100%; - filter: drop-shadow(0 6px 16px #0007); + // なんかiOSでちらつく + //filter: drop-shadow(0 6px 16px #0007); + border-radius: 16px; pointer-events: none; user-select: none; } @@ -699,13 +732,28 @@ definePageMetadata({ text-align: center; font-weight: bold; font-style: oblique; + color: #fff; + -webkit-text-stroke: 1px rgb(255, 145, 0); + text-shadow: 0 0 6px #0005; pointer-events: none; user-select: none; } .currentFruit { position: absolute; - margin-top: 20px; + margin-top: 80px; + z-index: 2; + filter: drop-shadow(0 6px 16px #0007); + pointer-events: none; + user-select: none; +} + +.dropper { + position: absolute; + top: 0; + width: 70px; + margin-top: -10px; + margin-left: -30px; z-index: 2; filter: drop-shadow(0 6px 16px #0007); pointer-events: none; @@ -714,7 +762,7 @@ definePageMetadata({ .currentFruitArrow { position: absolute; - margin-top: 20px; + margin-top: 100px; z-index: 3; animation: currentFruitArrow 2s ease infinite; pointer-events: none; @@ -723,10 +771,10 @@ definePageMetadata({ .dropGuide { position: absolute; - top: 50px; + top: 120px; z-index: 3; width: 3px; - height: calc(100% - 50px); + height: calc(100% - 120px); background: #f002; pointer-events: none; user-select: none; From d3fbef20f4a192d5c399d1ece4c01e369c1fea68 Mon Sep 17 00:00:00 2001 From: Marie Date: Sun, 7 Jan 2024 01:50:58 +0100 Subject: [PATCH 131/184] fix: hard mutes not working on SkNote component Closes #305 --- packages/frontend/src/components/MkNotes.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkNotes.vue b/packages/frontend/src/components/MkNotes.vue index fc1c8a0f0..74a73e04e 100644 --- a/packages/frontend/src/components/MkNotes.vue +++ b/packages/frontend/src/components/MkNotes.vue @@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only :ad="true" :class="$style.notes" > - +
From f2dee7b25eb473796ff77e2abfae88f174fd5b90 Mon Sep 17 00:00:00 2001 From: _ Date: Sun, 7 Jan 2024 09:57:01 +0900 Subject: [PATCH 132/184] =?UTF-8?q?Fix:=20=E3=83=AA=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=A9=E3=82=A4=E3=83=A0=E3=83=A9=E3=82=A4=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E3=80=8C=E3=83=AA=E3=83=8E=E3=83=BC=E3=83=88=E3=82=92=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA=E3=80=8D=E3=81=8C=E6=AD=A3=E3=81=97=E3=81=8F=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=97=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#12932)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: list timeline withRenotes * add CHANGELOG --- CHANGELOG.md | 1 + packages/backend/src/server/api/stream/channels/user-list.ts | 4 ++++ packages/frontend/src/components/MkTimeline.vue | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a6e2db95..8c27349f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ ### General - Feat: [mCaptcha](https://github.com/mCaptcha/mCaptcha)のサポートを追加 +- Fix: リストライムラインの「リノートを表示」が正しく機能しない問題を修正 ### Client - Feat: 新しいゲームを追加 diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index 909b5a5e0..e0245814c 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -21,6 +21,7 @@ class UserListChannel extends Channel { private membershipsMap: Record | undefined> = {}; private listUsersClock: NodeJS.Timeout; private withFiles: boolean; + private withRenotes: boolean; constructor( private userListsRepository: UserListsRepository, @@ -39,6 +40,7 @@ class UserListChannel extends Channel { public async init(params: any) { this.listId = params.listId as string; this.withFiles = params.withFiles ?? false; + this.withRenotes = params.withRenotes ?? true; // Check existence and owner const listExist = await this.userListsRepository.exist({ @@ -104,6 +106,8 @@ class UserListChannel extends Channel { } } + if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return; + // 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する if (isUserRelated(note, this.userIdsWhoMeMuting)) return; // 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue index d5adc02ca..63f779dbd 100644 --- a/packages/frontend/src/components/MkTimeline.vue +++ b/packages/frontend/src/components/MkTimeline.vue @@ -132,6 +132,7 @@ function connectChannel() { connection.on('mention', onNote); } else if (props.src === 'list') { connection = stream.useChannel('userList', { + withRenotes: props.withRenotes, withFiles: props.onlyFiles ? true : undefined, listId: props.list, }); @@ -198,6 +199,7 @@ function updatePaginationQuery() { } else if (props.src === 'list') { endpoint = 'notes/user-list-timeline'; query = { + withRenotes: props.withRenotes, withFiles: props.onlyFiles ? true : undefined, listId: props.list, }; @@ -236,8 +238,9 @@ function refreshEndpointAndChannel() { updatePaginationQuery(); } +// デッキのリストカラムでwithRenotesを変更した場合に自動的に更新されるようにさせる // IDが切り替わったら切り替え先のTLを表示させたい -watch(() => [props.list, props.antenna, props.channel, props.role], refreshEndpointAndChannel); +watch(() => [props.list, props.antenna, props.channel, props.role, props.withRenotes], refreshEndpointAndChannel); // 初回表示用 refreshEndpointAndChannel(); From 4ea030d66916777595bf1429fab4d5c1b93d4a5d Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jan 2024 10:35:39 +0900 Subject: [PATCH 133/184] tweak game --- .../frontend/src/pages/drop-and-fusion.vue | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 7f4a885b4..601493156 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only -
+
@@ -221,10 +221,10 @@ class Game extends EventEmitter<{ private COMBO_INTERVAL = 1000; public readonly DROP_INTERVAL = 500; private PLAYAREA_MARGIN = 25; + private STOCK_MAX = 4; private engine: Matter.Engine; private render: Matter.Render; private runner: Matter.Runner; - private detector: Matter.Detector; private overflowCollider: Matter.Body; private isGameOver = false; @@ -286,7 +286,7 @@ class Game extends EventEmitter<{ wireframeBackground: 'transparent', // transparent to hide wireframes: false, showSleeping: false, - pixelRatio: window.devicePixelRatio, + pixelRatio: Math.max(2, window.devicePixelRatio), }, }); @@ -295,8 +295,6 @@ class Game extends EventEmitter<{ this.runner = Matter.Runner.create(); Matter.Runner.run(this.runner, this.engine); - this.detector = Matter.Detector.create(); - this.engine.world.bodies = []; //#region walls @@ -412,7 +410,7 @@ class Game extends EventEmitter<{ } public start() { - for (let i = 0; i < 4; i++) { + for (let i = 0; i < this.STOCK_MAX; i++) { this.stock.push({ id: Math.random().toString(), fruit: FRUITS.filter(x => x.available)[Math.floor(Math.random() * FRUITS.filter(x => x.available).length)], @@ -423,8 +421,8 @@ class Game extends EventEmitter<{ // TODO: fusion予約状態のアイテムは光らせるなどの演出をすると楽しそう let fusionReservedPairs: { bodyA: Matter.Body; bodyB: Matter.Body }[] = []; - const minCollisionDepthForSound = 2.5; - const maxCollisionDepthForSound = 9; + const minCollisionEnergyForSound = 2.5; + const maxCollisionEnergyForSound = 9; const soundPitchMax = 4; const soundPitchMin = 0.5; @@ -451,8 +449,8 @@ class Game extends EventEmitter<{ } } else { const energy = pairs.collision.depth; - if (energy > minCollisionDepthForSound) { - const vol = (Math.min(maxCollisionDepthForSound, energy - minCollisionDepthForSound) / maxCollisionDepthForSound) / 4; + if (energy > minCollisionEnergyForSound) { + const vol = (Math.min(maxCollisionEnergyForSound, energy - minCollisionEnergyForSound) / maxCollisionEnergyForSound) / 4; const pan = ((((bodyA.position.x + bodyB.position.x) / 2) / GAME_WIDTH) - 0.5) * 2; const pitch = soundPitchMin + ((soundPitchMax - soundPitchMin) * (1 - (Math.min(10, energy) / 10))); sound.playRaw('syuilo/poi1', vol, pan, pitch); @@ -700,7 +698,6 @@ definePageMetadata({ width: 100%; // なんかiOSでちらつく //filter: drop-shadow(0 6px 16px #0007); - border-radius: 16px; pointer-events: none; user-select: none; } @@ -710,7 +707,8 @@ definePageMetadata({ display: block; z-index: 1; margin-top: -50px; - max-width: 100%; + width: 100% !important; + height: auto !important; pointer-events: none; user-select: none; } From 2a9db983fcd79e1993d5ea5b03e4979c1a578d7d Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 7 Jan 2024 02:35:58 +0100 Subject: [PATCH 134/184] feat: export clips (#12931) * feat: export clips * Update CHANGELOG.md --- CHANGELOG.md | 1 + locales/index.d.ts | 1 + locales/ja-JP.yml | 1 + packages/backend/src/core/QueueService.ts | 10 + .../backend/src/queue/QueueProcessorModule.ts | 2 + .../src/queue/QueueProcessorService.ts | 3 + .../processors/ExportClipsProcessorService.ts | 206 ++++++++++++++++++ .../backend/src/server/api/EndpointsModule.ts | 4 + packages/backend/src/server/api/endpoints.ts | 4 +- .../server/api/endpoints/i/export-clips.ts | 35 +++ packages/backend/test/e2e/exports.ts | 194 +++++++++++++++++ packages/backend/test/utils.ts | 2 +- .../src/pages/settings/import-export.vue | 12 + 13 files changed, 473 insertions(+), 2 deletions(-) create mode 100644 packages/backend/src/queue/processors/ExportClipsProcessorService.ts create mode 100644 packages/backend/src/server/api/endpoints/i/export-clips.ts create mode 100644 packages/backend/test/e2e/exports.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c27349f6..0d2fb4ccd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ ### Server - Enhance: 連合先のレートリミットに引っかかった際にリトライするようになりました - Enhance: ActivityPub Deliver queueでBodyを事前処理するように (#12916) +- Enhance: クリップをエクスポートできるように ## 2023.12.2 diff --git a/locales/index.d.ts b/locales/index.d.ts index 99bc0fc04..75517fa2a 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -2256,6 +2256,7 @@ export interface Locale { "_exportOrImport": { "allNotes": string; "favoritedNotes": string; + "clips": string; "followingList": string; "muteList": string; "blockingList": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 7cf5663a7..8b6b119d7 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2159,6 +2159,7 @@ _profile: _exportOrImport: allNotes: "全てのノート" favoritedNotes: "お気に入りにしたノート" + clips: "クリップ" followingList: "フォロー" muteList: "ミュート" blockingList: "ブロック" diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index 4f99dee64..dc3f248da 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -182,6 +182,16 @@ export class QueueService { }); } + @bindThis + public createExportClipsJob(user: ThinUser) { + return this.dbQueue.add('exportClips', { + user: { id: user.id }, + }, { + removeOnComplete: true, + removeOnFail: true, + }); + } + @bindThis public createExportFavoritesJob(user: ThinUser) { return this.dbQueue.add('exportFavorites', { diff --git a/packages/backend/src/queue/QueueProcessorModule.ts b/packages/backend/src/queue/QueueProcessorModule.ts index e6327002c..9c52c7d76 100644 --- a/packages/backend/src/queue/QueueProcessorModule.ts +++ b/packages/backend/src/queue/QueueProcessorModule.ts @@ -24,6 +24,7 @@ import { ExportCustomEmojisProcessorService } from './processors/ExportCustomEmo import { ExportFollowingProcessorService } from './processors/ExportFollowingProcessorService.js'; import { ExportMutingProcessorService } from './processors/ExportMutingProcessorService.js'; import { ExportNotesProcessorService } from './processors/ExportNotesProcessorService.js'; +import { ExportClipsProcessorService } from './processors/ExportClipsProcessorService.js'; import { ExportUserListsProcessorService } from './processors/ExportUserListsProcessorService.js'; import { ExportAntennasProcessorService } from './processors/ExportAntennasProcessorService.js'; import { ImportBlockingProcessorService } from './processors/ImportBlockingProcessorService.js'; @@ -53,6 +54,7 @@ import { RelationshipProcessorService } from './processors/RelationshipProcessor DeleteDriveFilesProcessorService, ExportCustomEmojisProcessorService, ExportNotesProcessorService, + ExportClipsProcessorService, ExportFavoritesProcessorService, ExportFollowingProcessorService, ExportMutingProcessorService, diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index b872dd65f..bcc1a69f8 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -16,6 +16,7 @@ import { InboxProcessorService } from './processors/InboxProcessorService.js'; import { DeleteDriveFilesProcessorService } from './processors/DeleteDriveFilesProcessorService.js'; import { ExportCustomEmojisProcessorService } from './processors/ExportCustomEmojisProcessorService.js'; import { ExportNotesProcessorService } from './processors/ExportNotesProcessorService.js'; +import { ExportClipsProcessorService } from './processors/ExportClipsProcessorService.js'; import { ExportFollowingProcessorService } from './processors/ExportFollowingProcessorService.js'; import { ExportMutingProcessorService } from './processors/ExportMutingProcessorService.js'; import { ExportBlockingProcessorService } from './processors/ExportBlockingProcessorService.js'; @@ -91,6 +92,7 @@ export class QueueProcessorService implements OnApplicationShutdown { private deleteDriveFilesProcessorService: DeleteDriveFilesProcessorService, private exportCustomEmojisProcessorService: ExportCustomEmojisProcessorService, private exportNotesProcessorService: ExportNotesProcessorService, + private exportClipsProcessorService: ExportClipsProcessorService, private exportFavoritesProcessorService: ExportFavoritesProcessorService, private exportFollowingProcessorService: ExportFollowingProcessorService, private exportMutingProcessorService: ExportMutingProcessorService, @@ -164,6 +166,7 @@ export class QueueProcessorService implements OnApplicationShutdown { case 'deleteDriveFiles': return this.deleteDriveFilesProcessorService.process(job); case 'exportCustomEmojis': return this.exportCustomEmojisProcessorService.process(job); case 'exportNotes': return this.exportNotesProcessorService.process(job); + case 'exportClips': return this.exportClipsProcessorService.process(job); case 'exportFavorites': return this.exportFavoritesProcessorService.process(job); case 'exportFollowing': return this.exportFollowingProcessorService.process(job); case 'exportMuting': return this.exportMutingProcessorService.process(job); diff --git a/packages/backend/src/queue/processors/ExportClipsProcessorService.ts b/packages/backend/src/queue/processors/ExportClipsProcessorService.ts new file mode 100644 index 000000000..5221497bd --- /dev/null +++ b/packages/backend/src/queue/processors/ExportClipsProcessorService.ts @@ -0,0 +1,206 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import * as fs from 'node:fs'; +import { Writable } from 'node:stream'; +import { Inject, Injectable, StreamableFile } from '@nestjs/common'; +import { MoreThan } from 'typeorm'; +import { format as dateFormat } from 'date-fns'; +import { DI } from '@/di-symbols.js'; +import type { ClipNotesRepository, ClipsRepository, MiClip, MiClipNote, MiUser, NotesRepository, PollsRepository, UsersRepository } from '@/models/_.js'; +import type Logger from '@/logger.js'; +import { DriveService } from '@/core/DriveService.js'; +import { createTemp } from '@/misc/create-temp.js'; +import type { MiPoll } from '@/models/Poll.js'; +import type { MiNote } from '@/models/Note.js'; +import { bindThis } from '@/decorators.js'; +import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js'; +import { Packed } from '@/misc/json-schema.js'; +import { IdService } from '@/core/IdService.js'; +import { QueueLoggerService } from '../QueueLoggerService.js'; +import type * as Bull from 'bullmq'; +import type { DbJobDataWithUser } from '../types.js'; + +@Injectable() +export class ExportClipsProcessorService { + private logger: Logger; + + constructor( + @Inject(DI.usersRepository) + private usersRepository: UsersRepository, + + @Inject(DI.pollsRepository) + private pollsRepository: PollsRepository, + + @Inject(DI.clipsRepository) + private clipsRepository: ClipsRepository, + + @Inject(DI.clipNotesRepository) + private clipNotesRepository: ClipNotesRepository, + + private driveService: DriveService, + private queueLoggerService: QueueLoggerService, + private idService: IdService, + ) { + this.logger = this.queueLoggerService.logger.createSubLogger('export-clips'); + } + + @bindThis + public async process(job: Bull.Job): Promise { + this.logger.info(`Exporting clips of ${job.data.user.id} ...`); + + const user = await this.usersRepository.findOneBy({ id: job.data.user.id }); + if (user == null) { + return; + } + + // Create temp file + const [path, cleanup] = await createTemp(); + + this.logger.info(`Temp file is ${path}`); + + try { + const stream = Writable.toWeb(fs.createWriteStream(path, { flags: 'a' })); + const writer = stream.getWriter(); + writer.closed.catch(this.logger.error); + + await writer.write('['); + + await this.processClips(writer, user, job); + + await writer.write(']'); + await writer.close(); + + this.logger.succ(`Exported to: ${path}`); + + const fileName = 'clips-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.json'; + const driveFile = await this.driveService.addFile({ user, path, name: fileName, force: true, ext: 'json' }); + + this.logger.succ(`Exported to: ${driveFile.id}`); + } finally { + cleanup(); + } + } + + async processClips(writer: WritableStreamDefaultWriter, user: MiUser, job: Bull.Job) { + let exportedClipsCount = 0; + let cursor: MiClip['id'] | null = null; + + while (true) { + const clips = await this.clipsRepository.find({ + where: { + userId: user.id, + ...(cursor ? { id: MoreThan(cursor) } : {}), + }, + take: 100, + order: { + id: 1, + }, + }); + + if (clips.length === 0) { + job.updateProgress(100); + break; + } + + cursor = clips.at(-1)?.id ?? null; + + for (const clip of clips) { + // Stringify but remove the last `]}` + const content = JSON.stringify(this.serializeClip(clip)).slice(0, -2); + const isFirst = exportedClipsCount === 0; + await writer.write(isFirst ? content : ',\n' + content); + + await this.processClipNotes(writer, clip.id); + + await writer.write(']}'); + exportedClipsCount++; + } + + const total = await this.clipsRepository.countBy({ + userId: user.id, + }); + + job.updateProgress(exportedClipsCount / total); + } + } + + async processClipNotes(writer: WritableStreamDefaultWriter, clipId: string): Promise { + let exportedClipNotesCount = 0; + let cursor: MiClipNote['id'] | null = null; + + while (true) { + const clipNotes = await this.clipNotesRepository.find({ + where: { + clipId, + ...(cursor ? { id: MoreThan(cursor) } : {}), + }, + take: 100, + order: { + id: 1, + }, + relations: ['note', 'note.user'], + }) as (MiClipNote & { note: MiNote & { user: MiUser } })[]; + + if (clipNotes.length === 0) { + break; + } + + cursor = clipNotes.at(-1)?.id ?? null; + + for (const clipNote of clipNotes) { + let poll: MiPoll | undefined; + if (clipNote.note.hasPoll) { + poll = await this.pollsRepository.findOneByOrFail({ noteId: clipNote.note.id }); + } + const content = JSON.stringify(this.serializeClipNote(clipNote, poll)); + const isFirst = exportedClipNotesCount === 0; + await writer.write(isFirst ? content : ',\n' + content); + + exportedClipNotesCount++; + } + } + } + + private serializeClip(clip: MiClip): Record { + return { + id: clip.id, + name: clip.name, + description: clip.description, + lastClippedAt: clip.lastClippedAt?.toISOString(), + clipNotes: [], + }; + } + + private serializeClipNote(clip: MiClipNote & { note: MiNote & { user: MiUser } }, poll: MiPoll | undefined): Record { + return { + id: clip.id, + createdAt: this.idService.parse(clip.id).date.toISOString(), + note: { + id: clip.note.id, + text: clip.note.text, + createdAt: this.idService.parse(clip.note.id).date.toISOString(), + fileIds: clip.note.fileIds, + replyId: clip.note.replyId, + renoteId: clip.note.renoteId, + poll: poll, + cw: clip.note.cw, + visibility: clip.note.visibility, + visibleUserIds: clip.note.visibleUserIds, + localOnly: clip.note.localOnly, + reactionAcceptance: clip.note.reactionAcceptance, + uri: clip.note.uri, + url: clip.note.url, + user: { + id: clip.note.user.id, + name: clip.note.user.name, + username: clip.note.user.username, + host: clip.note.user.host, + uri: clip.note.user.uri, + }, + }, + }; + } +} diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts index 86a64d712..a3a980544 100644 --- a/packages/backend/src/server/api/EndpointsModule.ts +++ b/packages/backend/src/server/api/EndpointsModule.ts @@ -208,6 +208,7 @@ import * as ep___i_exportBlocking from './endpoints/i/export-blocking.js'; import * as ep___i_exportFollowing from './endpoints/i/export-following.js'; import * as ep___i_exportMute from './endpoints/i/export-mute.js'; import * as ep___i_exportNotes from './endpoints/i/export-notes.js'; +import * as ep___i_exportClips from './endpoints/i/export-clips.js'; import * as ep___i_exportFavorites from './endpoints/i/export-favorites.js'; import * as ep___i_exportUserLists from './endpoints/i/export-user-lists.js'; import * as ep___i_exportAntennas from './endpoints/i/export-antennas.js'; @@ -569,6 +570,7 @@ const $i_exportBlocking: Provider = { provide: 'ep:i/export-blocking', useClass: const $i_exportFollowing: Provider = { provide: 'ep:i/export-following', useClass: ep___i_exportFollowing.default }; const $i_exportMute: Provider = { provide: 'ep:i/export-mute', useClass: ep___i_exportMute.default }; const $i_exportNotes: Provider = { provide: 'ep:i/export-notes', useClass: ep___i_exportNotes.default }; +const $i_exportClips: Provider = { provide: 'ep:i/export-clips', useClass: ep___i_exportClips.default }; const $i_exportFavorites: Provider = { provide: 'ep:i/export-favorites', useClass: ep___i_exportFavorites.default }; const $i_exportUserLists: Provider = { provide: 'ep:i/export-user-lists', useClass: ep___i_exportUserLists.default }; const $i_exportAntennas: Provider = { provide: 'ep:i/export-antennas', useClass: ep___i_exportAntennas.default }; @@ -934,6 +936,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $i_exportFollowing, $i_exportMute, $i_exportNotes, + $i_exportClips, $i_exportFavorites, $i_exportUserLists, $i_exportAntennas, @@ -1293,6 +1296,7 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention $i_exportFollowing, $i_exportMute, $i_exportNotes, + $i_exportClips, $i_exportFavorites, $i_exportUserLists, $i_exportAntennas, diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts index 41232091c..bd8aa4af7 100644 --- a/packages/backend/src/server/api/endpoints.ts +++ b/packages/backend/src/server/api/endpoints.ts @@ -3,8 +3,8 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import type { Schema } from '@/misc/json-schema.js'; import { permissions } from 'misskey-js'; +import type { Schema } from '@/misc/json-schema.js'; import { RolePolicies } from '@/core/RoleService.js'; import * as ep___admin_meta from './endpoints/admin/meta.js'; @@ -209,6 +209,7 @@ import * as ep___i_exportBlocking from './endpoints/i/export-blocking.js'; import * as ep___i_exportFollowing from './endpoints/i/export-following.js'; import * as ep___i_exportMute from './endpoints/i/export-mute.js'; import * as ep___i_exportNotes from './endpoints/i/export-notes.js'; +import * as ep___i_exportClips from './endpoints/i/export-clips.js'; import * as ep___i_exportFavorites from './endpoints/i/export-favorites.js'; import * as ep___i_exportUserLists from './endpoints/i/export-user-lists.js'; import * as ep___i_exportAntennas from './endpoints/i/export-antennas.js'; @@ -568,6 +569,7 @@ const eps = [ ['i/export-following', ep___i_exportFollowing], ['i/export-mute', ep___i_exportMute], ['i/export-notes', ep___i_exportNotes], + ['i/export-clips', ep___i_exportClips], ['i/export-favorites', ep___i_exportFavorites], ['i/export-user-lists', ep___i_exportUserLists], ['i/export-antennas', ep___i_exportAntennas], diff --git a/packages/backend/src/server/api/endpoints/i/export-clips.ts b/packages/backend/src/server/api/endpoints/i/export-clips.ts new file mode 100644 index 000000000..9435a2b23 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/i/export-clips.ts @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Injectable } from '@nestjs/common'; +import ms from 'ms'; +import { Endpoint } from '@/server/api/endpoint-base.js'; +import { QueueService } from '@/core/QueueService.js'; + +export const meta = { + secure: true, + requireCredential: true, + limit: { + duration: ms('1day'), + max: 1, + }, +} as const; + +export const paramDef = { + type: 'object', + properties: {}, + required: [], +} as const; + +@Injectable() +export default class extends Endpoint { // eslint-disable-line import/no-default-export + constructor( + private queueService: QueueService, + ) { + super(meta, paramDef, async (ps, me) => { + this.queueService.createExportClipsJob(me); + }); + } +} diff --git a/packages/backend/test/e2e/exports.ts b/packages/backend/test/e2e/exports.ts new file mode 100644 index 000000000..9686f2b7f --- /dev/null +++ b/packages/backend/test/e2e/exports.ts @@ -0,0 +1,194 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +process.env.NODE_ENV = 'test'; + +import * as assert from 'assert'; +import { signup, api, startServer, startJobQueue, port, post } from '../utils.js'; +import type { INestApplicationContext } from '@nestjs/common'; +import type * as misskey from 'misskey-js'; + +describe('export-clips', () => { + let app: INestApplicationContext; + let alice: misskey.entities.SignupResponse; + let bob: misskey.entities.SignupResponse; + + // XXX: Any better way to get the result? + async function pollFirstDriveFile() { + while (true) { + const files = (await api('/drive/files', {}, alice)).body; + if (!files.length) { + await new Promise(r => setTimeout(r, 100)); + continue; + } + if (files.length > 1) { + throw new Error('Too many files?'); + } + const file = (await api('/drive/files/show', { fileId: files[0].id }, alice)).body; + const res = await fetch(new URL(new URL(file.url).pathname, `http://127.0.0.1:${port}`)); + return await res.json(); + } + } + + beforeAll(async () => { + app = await startServer(); + await startJobQueue(); + alice = await signup({ username: 'alice' }); + bob = await signup({ username: 'bob' }); + }, 1000 * 60 * 2); + + afterAll(async () => { + await app.close(); + }); + + beforeEach(async () => { + // Clean all clips and files of alice + const clips = (await api('/clips/list', {}, alice)).body; + for (const clip of clips) { + const res = await api('/clips/delete', { clipId: clip.id }, alice); + if (res.status !== 204) { + throw new Error('Failed to delete clip'); + } + } + const files = (await api('/drive/files', {}, alice)).body; + for (const file of files) { + const res = await api('/drive/files/delete', { fileId: file.id }, alice); + if (res.status !== 204) { + throw new Error('Failed to delete file'); + } + } + }); + + test('basic export', async () => { + let res = await api('/clips/create', { + name: 'foo', + description: 'bar', + }, alice); + assert.strictEqual(res.status, 200); + + res = await api('/i/export-clips', {}, alice); + assert.strictEqual(res.status, 204); + + const exported = await pollFirstDriveFile(); + assert.strictEqual(exported[0].name, 'foo'); + assert.strictEqual(exported[0].description, 'bar'); + assert.strictEqual(exported[0].clipNotes.length, 0); + }); + + test('export with notes', async () => { + let res = await api('/clips/create', { + name: 'foo', + description: 'bar', + }, alice); + assert.strictEqual(res.status, 200); + const clip = res.body; + + const note1 = await post(alice, { + text: 'baz1', + }); + + const note2 = await post(alice, { + text: 'baz2', + poll: { + choices: ['sakura', 'izumi', 'ako'], + }, + }); + + for (const note of [note1, note2]) { + res = await api('/clips/add-note', { + clipId: clip.id, + noteId: note.id, + }, alice); + assert.strictEqual(res.status, 204); + } + + res = await api('/i/export-clips', {}, alice); + assert.strictEqual(res.status, 204); + + const exported = await pollFirstDriveFile(); + assert.strictEqual(exported[0].name, 'foo'); + assert.strictEqual(exported[0].description, 'bar'); + assert.strictEqual(exported[0].clipNotes.length, 2); + assert.strictEqual(exported[0].clipNotes[0].note.text, 'baz1'); + assert.strictEqual(exported[0].clipNotes[1].note.text, 'baz2'); + assert.deepStrictEqual(exported[0].clipNotes[1].note.poll.choices[0], 'sakura'); + }); + + test('multiple clips', async () => { + let res = await api('/clips/create', { + name: 'kawaii', + description: 'kawaii', + }, alice); + assert.strictEqual(res.status, 200); + const clip1 = res.body; + + res = await api('/clips/create', { + name: 'yuri', + description: 'yuri', + }, alice); + assert.strictEqual(res.status, 200); + const clip2 = res.body; + + const note1 = await post(alice, { + text: 'baz1', + }); + + const note2 = await post(alice, { + text: 'baz2', + }); + + res = await api('/clips/add-note', { + clipId: clip1.id, + noteId: note1.id, + }, alice); + assert.strictEqual(res.status, 204); + + res = await api('/clips/add-note', { + clipId: clip2.id, + noteId: note2.id, + }, alice); + assert.strictEqual(res.status, 204); + + res = await api('/i/export-clips', {}, alice); + assert.strictEqual(res.status, 204); + + const exported = await pollFirstDriveFile(); + assert.strictEqual(exported[0].name, 'kawaii'); + assert.strictEqual(exported[0].clipNotes.length, 1); + assert.strictEqual(exported[0].clipNotes[0].note.text, 'baz1'); + assert.strictEqual(exported[1].name, 'yuri'); + assert.strictEqual(exported[1].clipNotes.length, 1); + assert.strictEqual(exported[1].clipNotes[0].note.text, 'baz2'); + }); + + test('Clipping other user\'s note', async () => { + let res = await api('/clips/create', { + name: 'kawaii', + description: 'kawaii', + }, alice); + assert.strictEqual(res.status, 200); + const clip = res.body; + + const note = await post(bob, { + text: 'baz', + visibility: 'followers', + }); + + res = await api('/clips/add-note', { + clipId: clip.id, + noteId: note.id, + }, alice); + assert.strictEqual(res.status, 204); + + res = await api('/i/export-clips', {}, alice); + assert.strictEqual(res.status, 204); + + const exported = await pollFirstDriveFile(); + assert.strictEqual(exported[0].name, 'kawaii'); + assert.strictEqual(exported[0].clipNotes.length, 1); + assert.strictEqual(exported[0].clipNotes[0].note.text, 'baz'); + assert.strictEqual(exported[0].clipNotes[0].note.user.username, 'bob'); + }); +}); diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index 46b8ea9cd..7c9428d47 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -17,7 +17,7 @@ import { entities } from '../src/postgres.js'; import { loadConfig } from '../src/config.js'; import type * as misskey from 'misskey-js'; -export { server as startServer } from '@/boot/common.js'; +export { server as startServer, jobQueue as startJobQueue } from '@/boot/common.js'; interface UserToken { token: string; diff --git a/packages/frontend/src/pages/settings/import-export.vue b/packages/frontend/src/pages/settings/import-export.vue index 990eff99c..70d718f1a 100644 --- a/packages/frontend/src/pages/settings/import-export.vue +++ b/packages/frontend/src/pages/settings/import-export.vue @@ -21,6 +21,14 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.export }} + + + + + + {{ i18n.ts.export }} + +
@@ -157,6 +165,10 @@ const exportFavorites = () => { misskeyApi('i/export-favorites', {}).then(onExportSuccess).catch(onError); }; +const exportClips = () => { + misskeyApi('i/export-clips', {}).then(onExportSuccess).catch(onError); +}; + const exportFollowing = () => { misskeyApi('i/export-following', { excludeMuting: excludeMutingUsers.value, From 00e195f50bcc29ee28b6ae11f39b7661a10f2b16 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jan 2024 13:19:10 +0900 Subject: [PATCH 135/184] tweak game --- locales/index.d.ts | 1 + locales/ja-JP.yml | 1 + .../assets/drop-and-fusion/keycap_1.png | Bin 0 -> 29193 bytes .../assets/drop-and-fusion/keycap_10.png | Bin 0 -> 33717 bytes .../assets/drop-and-fusion/keycap_2.png | Bin 0 -> 32324 bytes .../assets/drop-and-fusion/keycap_3.png | Bin 0 -> 33127 bytes .../assets/drop-and-fusion/keycap_4.png | Bin 0 -> 31182 bytes .../assets/drop-and-fusion/keycap_5.png | Bin 0 -> 32745 bytes .../assets/drop-and-fusion/keycap_6.png | Bin 0 -> 32100 bytes .../assets/drop-and-fusion/keycap_7.png | Bin 0 -> 31318 bytes .../assets/drop-and-fusion/keycap_8.png | Bin 0 -> 32886 bytes .../assets/drop-and-fusion/keycap_9.png | Bin 0 -> 32483 bytes .../frontend/src/pages/drop-and-fusion.vue | 291 +++++++++++++++--- packages/frontend/src/router.ts | 2 +- packages/frontend/src/ui/_common_/common.ts | 4 +- 15 files changed, 245 insertions(+), 54 deletions(-) create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_1.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_10.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_2.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_3.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_4.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_5.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_6.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_7.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_8.png create mode 100644 packages/frontend/assets/drop-and-fusion/keycap_9.png diff --git a/locales/index.d.ts b/locales/index.d.ts index 75517fa2a..8dfb81790 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1192,6 +1192,7 @@ export interface Locale { "decorate": string; "addMfmFunction": string; "enableQuickAddMfmFunction": string; + "bubbleGame": string; "_announcement": { "forExistingUsers": string; "forExistingUsersDescription": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8b6b119d7..d92c5f9a1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1189,6 +1189,7 @@ seasonalScreenEffect: "季節に応じた画面の演出" decorate: "デコる" addMfmFunction: "装飾を追加" enableQuickAddMfmFunction: "高度なMFMのピッカーを表示する" +bubbleGame: "バブルゲーム" _announcement: forExistingUsers: "既存ユーザーのみ" diff --git a/packages/frontend/assets/drop-and-fusion/keycap_1.png b/packages/frontend/assets/drop-and-fusion/keycap_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d672f2854a8e22451f7329a1603c3241615c5936 GIT binary patch literal 29193 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 LRFbF>GYS3=P$`nK literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_10.png b/packages/frontend/assets/drop-and-fusion/keycap_10.png new file mode 100644 index 0000000000000000000000000000000000000000..32cf19354065bc8b720e46553c4da1ba5cedf4ea GIT binary patch literal 33717 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�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 a$jB1hdijoK?!Te$K+@t0VznZMLH`3BENuV) literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_3.png b/packages/frontend/assets/drop-and-fusion/keycap_3.png new file mode 100644 index 0000000000000000000000000000000000000000..424d8c123dd535754e606c2afcd04cf04b54fe76 GIT binary patch literal 33127 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 Qdd~m^p00i_>zopr0JZH>)Bpeg literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_4.png b/packages/frontend/assets/drop-and-fusion/keycap_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ea6ae505316bb6b1419586e7ecaf9e2f837a924d GIT binary patch literal 31182 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 z zo1Uf-4yogzKHh6j2jv=I2{?p+FPff|9l4k_-aJu4eZIKNS&s#tfF?=O>YH>&T z8r^xNdfz)au=aE2Dc)(IJY(!g z*e1q~_Kb|lYdm9`S*#F(%D3n9wzkx+QbY_>bEEvyQl@ zQ@`t~{PE(8sr8HFZ!Qk26W*BUUFhXtu+5B{l4C5&ecQPGthX(i@R_bWsn>F)QnuF59toLy0t<7FJr<|mO26K#e-zKJHmpr@>s?)$5;|n;tx*}LqV`Y zSnz?q+P%dkb9P<`?x5}G#Tww*eaS197kCQ>p!>x^@cD=Yr;#UX;88Vam36WbBD)99H!k2US2=M=5 zaDKC`&=Qssak>0B@_lUL;O9mD@06E!-$Y2p#&6~-$L*uxB4^XrSG9d#YC!5^@cYqlVmcj^LU0#&bSRy>CT240T_g1+-zj+>A8*$?i+@9uY|2CCl* zRX2_(iTeY-n*iw9VUpAMw_l>lO2uT z)fJ(z4hc7+MU)`mmeu{2k|)%kG&3Is^08})sxJWGf2e2ur%}89#m~&$?7SG|b=`pd z^?j6ez)$)&Tzh@v&F2$u@y<5W_^bgA@&>SsdgRmj)rr~F9^ODDV{MZ-tIcZXinvN- zsMY=g1Y&bqbfu1Z8aYSc0?dr?EU>T8i(C}Ygc z>%0)({OZ{+5J4i6^`J-t63FNNCVMPS?MeDJ_5VO`l+>n!k36lqdHwWNe3&cA)~>nk z*w*>JOETcjdK@74C6IglFGQY>e_`3n5IliT|HeImVNwE0Q+hTwaJO(RQ<8!DZ_rCz zC|iX0zm`!Obar*xW2HE9P~T=^W(ay1=Ns=vjgnpQMRL(xHs$%;dKZt8L#)kSYBar@ zpId*I{|ST<@q|N31*5*G#rW^3-y-1xp_`W6aV1VUF> zr=ha@N*qGoOF}YwYV6&__O$gl-sV^tip%%88YtxQuZ*e-f9c=wsf|`{??~@FM`xHr z`*!o$6mWU(UiBJ-E9qv;LLOC2=7W7-VYK`u>9O@IY)955Ps@*;wxyqM-9PuGk|%4$kKtR zH)G~A+y=kfrv6)QPYGQbvm=yWq0Y@2a^)X9=TOZ~#n6vEaZDl82PuBRrqoX_%p6`n zrR=PG%k=Q(*$c*V4HIZr^@kuI`E4paTK@Y~Cx!|iojcWM@~qZ|&eYqgM|!%-aWWL- zFSOl&y+hHu0vKRU?d6r@ZZ#3`8}cgr83I7I>G0llG#v6lIGOutw7`r`^KlDzi_LGd z#Zd8@4pA1MrmQcZu)R6Rgwb3Mnx@g{Q(Pa59G^%4M;K2;rjeU@`w|hmTz%5li7c4`w<$eO zqZc(bN3MzY&R)e`0M=0eiB zbi^CoZRy7sismB$E^)rq@U$u3w zB$$DhcqAaBX0snhm#}}dD^M}T@=XU|xipeMZ5TKjuY-t8X`NKF0MXC zdpr;epDwgZGbXJyU`G3N<9))QkTBdz((6Pn0F9ml5Mn&dx{uQb9g}9FF=`&mjEd(R#PZdtSS* zWXk}s+y4}p**@bd*8=t=dLlG$QOD(e@xLv|Wgj&{U~FC6=9fWwV)b*KYo!T#lAsV2 zjsi52B0!xoKIKe@k6kXu3kD1l>Z8l5t zc6c53!DkpyZ83yy8oM8GVXdqTQY{w~P2b|!NU2;(=EIs)pOR%;iu7{DcoAFjnj4?m z*Q)C0^FH!iquuV6kB2#CIzp6bhs#yB8L`}g_#I{AziJjqME%ENc26^?dAFc9x-C|J zUI@9Ptaelqz+yQ#OR;U)n0S!e27YgW@Pi7qAV@xsX z2S>3@j*JbZuy*MW^Zg}?{-29>{EWLR`V&3f

l80C5_?WrN9HnRk3rg_(?|YukMUlG?;5DcdB2Jig4&B+&@L06UPVC?jR5DLS(^ z{f|hz(R@vr^sZUNV!rRi^^s^FeZFHYwrRukrFcDn@XW$KG;(=U0b9&aE)I$~Zhv!> z{twkhCdfaMD39Hxbkj4#ci_v=7{g{@3-p$f>$m`gPHM?T{Q%2fi52+wR;_UPKz}7iId>G%D911`oM_&L)iiCh9uKU zV`VVAqDQFQsX_8q6J1;E6%S^xKxkMDqx{YQI1me++h}4o^q{T2KHLsm+-(*BTx9f3 zUz~sbS`jSmhKR{hOC^`=aUp2e9pa1ajulSE39TRAuy%wV96COmf)0va9u~J2^s1>a z<&20@D~K>}T5KurkV4~80T(VgIU>Y-@!k-Ml~R(*Rr2WUDc^Z=T_G8Ygxu_m1PZW= za2hD?hGan!iE?;OPnSb7Tlz&dzD!*8?Uk79uPY%7aloNaVxR;(Gi#Bk(UXIk1mvO>mMvQt&j)Q05h;E zlz40_-VGW+tAGxlXWVfMD^&6g|S?vL7OM z=mLO5&y&PXes&yxV}2_p(TO{}hY*nGHChALkvbcHaGFxGeJbrmaF=(f4cuP5CWAJ8 zcifdRnkB@~X(AZ?`M9DZ?X%?9S17_^Qykg4BkbEvx*YTqBF5_Ycs=}^WAX)N>jz0p zl_RsYN5;G@L4djRAHyClEL7Ayl~R$Rj6|hHC@>eoHPiZ7xH3%pMU5yYsJvP|Ij?#T z+{i5HT=1EBr-oS|XD17HEJJKd?ALr66zK_Xh5dofn*usFId`XOH-iLnAZZU+BseDn z+NEgPvlE7gb?9l#svrQJyEi0FFaStVI1yj4$TH_x2Eq^7zInv#9BUilk!1&wB$F|^ zdBX(ZBACJ*%{XhcDX*$2snrtQT%CLOQev91)OKj(XI3fVKR9(U75OGNSL0&?2`5$`FbGaODTt7sQHJG&U0M zg^;Sw30xE!Q}hkuOo&{Z1+!SgT6TcTKut;^G#uu4Ye`+feEJ;r@*f+_U-e=YV=mUt zq5)FG%EtmHSQx5V;w8c}%*nU3tCyHSar)4>ZYpE7!US6J2K8Pll1Wdajidk`R=3hx z*}T7)8c#zM{3rUEe}6l!H$n#;zDS#)6Ef#-MEb5LyZHmtkko$IpiS0?a4C7A8YCiQ z-BA&+6>j;}zB55L^(TA5Unmt6t!trE6@=+Ot1s9%Mp{mbrB|xZhepgGFwhTAZ8;>4 z&_meuI}xF<&}Jr8u#5{`JTqs-X$!GGw+a|r4pcXWVh6(79AW?C+gh!six^VYKhc*j zOgg1)wxy4H3O&xxr1V>^*OL{}?@}w~PQhUin@QE!nq~d@EaJTii9t)rPJPCn0ipZ2Hh>*K z#e<;4RcxeHp5O5j-CvGye21`SIv4b)<;?J-&A}OTp|&yU10Ug9SW$Rfjv8Mm^4{AevI~N!J-1!0Qpc{MxZKelgu9}$Nkdc-*rIn;H)2+Jt_8p&8i$HLA5_7 z7hr33JHo77Q);2SlfS8z{=WV~&?wGI1uS6oMx}|?)PGP%cc!m~>!>inC2-tJ7i}iI zODX=2LXqPTy*n@SjR4n~#X73wx7Tz17&cfEu9*_|Bkt@@|8OZCzm=L`V}QQubFuxy zbMCd0?a^O>jsoHOA*1 z@R0NAusZf`3ZYSyP$kSanGF~$ov^WkQqM8!W3UVdn=phtlq|!ttZe<`NJeD0+%cia+-%~?V6&Z1{Vm^T9x{)G`N zOG~(&m?N~3r2f(A!uld@N&lcp(~8~G*eP#QxN=OKYLPa#VL{iQ|FD#jE0+AMdJNej z!=>`Rx#$zK-=`_}H%L$V zc)>WOpnJPP;8)ikwtFY#04GB7L|J=K1^4DD4bG9}3ulU1=)Oxd^9~ zYsR!v#446jTM;8_5=}l?(w*GPnl5K~WPO3W8or+5j##cmweAnv7-^Z_3YEf1bjmQB zPbURTv|W;rlD3|%zZj5^=K#$JS9`3xkD;!R@x1z6TN&}OYc>$eD$k?(qyB?`mWj%T z5`#e!Pb1-sq=JaSPABg}E8IKoVm&Y0ChfKG9lU5)NF76IGJr6<#8wet7HxniT3B(t zQEokv#npYT5gxgMkE5goY|aJO8_=;wnHo} zhfyNG5I6}njN@3(%k64ckw$+$WybN}qE`~{+@Khd5CHIN0!D_G;JVJTCm!ErHBL{m zTU%aWr%$<=5VF2OQ-7VjtfD_wo7TAjV-YU2)9@TDmGg8WOK9{TT-FTT^jCKjB+Ama%SZaDSfnSJSB30vbmN8egdvT1JU7AOF#i(0xgQO>4!xA#&RXJloAQwW zyt@#+E|KTaq>vE=?DB9LpNR0eJfd}J0ntQTuTC$gt`s-q_K$Aly_>EsiQOmkL`TwwI#cEf>HX1yOU0ir{upW6(F1eI zws)1tF+RssC0I%l1E=KfJHkW{JPcMc>F_pp##~L{wx{bY>N4 zou~|1B6U%j4Pe8oWk~|T{^MCuAKZCRq^zD`zo5sF%Sv+kPTyx*wm-ysv^<1;U)vCp z>X-N`@f!(YC%3$zW{)DN^`~x3>gx^ zwNBeB={LK-PfyUkYKD@Uuc_ncl%EfKI>LO>p0+sIrUrlTKKNz-YRZ{{RC-wlu~@w;4M!iF)T z3Iwo3s4TtHdXxv)A0apq=<(D45eMy-C=ug&BfAWL` z+kmdIa}>z9DQKKy49Lgb3^RMV)dO{XvPk8LN*kx2BcD%Hnhw|pn|V3%6a+3hCsq?# zI;G3g*=kSu4oT!=>j5KXw4NfJ@+ZR4u?rv>+&lM&v&_r(=&xx{1;iZ}SQwGWVnR!} zf8k(|{C%FhA!|fqd~;Csvm8g5(J%Oj<$4?(gN(9rMtn&3{B_W+dN=0s+?cxy0#VxE z_4%kb8=mj`dU?gb^;S?iZ_Hj3foyrIP7-kwz>y?A6a9@--~#9|3MqV+;AmwTOEP)~ z1I(T7swgc+51L-ks?-zjH_$_+i4C28=_&kE!G&Sq$*w|4TtP~L$^L;R*&1f!J?-iU z!daA4RsTRpBb{kf#vPtT(*Ji-F=J3do!#|gs;r!BJJfg#AzfKq4>?Q!Y%IrQDF%;) z0g9|dh_vdV>HQ@D{9_FwPTg8wZ=7ekzDa373Qkt-2fa}e>Jn0vA{KL@Bdtd`gVH6^AH12~Y?TCRM zrqXR5?B`(Bhw+LB=fgvO!-(&0%(*W0#VD+J5RR&b8~;gDW4gCuS>*9J&|&CK<#TFBo> zFCE?KSfx0rZuRtk{wAR+rxQd@#B5K>%@TySt+U`R>tnkAJ;UtD6uR3msc)~0&|Ct~tZ7rh zES3Xg2|ty;ed`j=?tj^lm-Y2Zkqh#WqJA#A9t1!pSFVSnS~{Y71E7xs$+I9XOUO)r z_!mH9MC{LcNHcm8Uesv{rT1>FJ*k!{rg*;>bUbG!%l#hw43*kF^HDH7V`uJpn-45B z+s?F|m2eFt0^$MLbU94&iO$nRR~Y3AGFsh;LC) zTg)0(Po2w*8L8b>GTxO&Q+Cq#tojDlw}|ms6z^{^E<4y{P@xRZ>?Z1{yM zT&7E!B?!F%0==Gb+T5TvAcL!qDYpp>HNlT65LWN=pDng3D$+-Ij7JD>%fi9mt*Olp ze^Ut{Bwc%1+30@Jay%s4~09O#$zd*ybQ_hHX>>=Yj+t&Znm`wY!l!Fj+ zJoqgioC*QqXsYViMzoJ(J#bi6HKMhQNZD-M$MQ}(n3AS@H%TVti=NuzH2wlX0DysP z?O~9MQ~Kx;D?iNT`9xZWjp%Avfald=7MNp}^B>UL`Upa8R&8Z>7X@R?D1y7=l1dOK zQBsW7_Ki)X8ArS$HNz9|MIx)tEy+Wabju&rAq~y8;xZ||f%UHpiOODm$vOMtI-Zqv zw4QI3J!#QBmv2W{{*P-NR(kcf1Ia#QX1I`Ge_>v3F&F^>DL}RL=G?QVJeS__zLl;y zeE=X?V5f;QCU5f5O!;9Mmpx&K!lPeB^d_lltI&&}SnH|+7HipnrWr92so<%lvx_UQ zb_HKyjJwH@p04m;{$tT=<8q60SKcRh{AYMBiZh{u`eVR^yZN&$hK;BYLY%VEd=e=Q zEao;`yuYGKEc4-f2&;mVe-Wvy3a#vH?2rl9kB%NJpLZ@1*hHct<3ZbuoJP!W{7FZY zG4`WOM|L}!D9Q}tnfy?e_E)Zom0gO)1YuetA#E_)wu939gmF?x(_)-rf&wV)Lf$3R z<&SbiksI%OzxMj$w>K2(>i8LS?hnhPA|XPgV@#_l7T%*^nWL;cESjJ3>)2O&1OUGg z1Ot848(gxWMXhzfP$F=+roLE$0@EPf`f0m3*t^m#MKW?n*UciK0^V)|d?3C)A|7mj z*nOB1GKdh`5rBcfs3*o13sQjskd8g=3Wqd@Z^p#EGjml*Q<%Q}h z*xKz+9G7x%+dwfKdt{}w@_kH5(I7b8<;hF%DmifgNR%o%3&BXhe?&!Y2i9Lx6b(_| z3Wx*}cRPiDzZJY3nNQO=JBu6-vxg~P2r;$+VKJcpj6z)%vHg+g_^ID(ol~ecV`a%) z0~H&{*4E(3E@dZ5Ux6GbdVYx;R-VoHpg?+GZppQPduaw`)e>NSqA#aubs*;~^2R-Y z?+eAXl{SSAA#EmRRZrTaVIl|>&_*FMF8Gb@a>sqFpR|v>y%n0%ow@z7x^-{^dCPUc z3j?Im)9$^dB`}NBg9=D*t{dRLr=WuJxKkxZ$NZ`vkHwj8)?bf=sI5s2Ou-UA&LxE0 z`IZ_`32tB_T=S;Rj;>Ypj2m!})h=C##3_3cvVw{dVe!N(5~d>h;i>@!R=W#MBC`8T zeYA5b7&`i&Fg`iMChp1mGWt|gDQHMeU ziUzqe0`BH`>eWsC9APc6zbNhTp(-~YuDpuR-7U_xNx;)gmcwK`E5-JRhLd`r{%pwYos|veUtYh z$?3;HRIsKbEwYAh>iLuj@%V_8MJ&t($<0k*sCQa+Yj-}igA<$}OAF>5&46>G>Rc*~ zU;r7{x>90jkrRKAPKu7FC#%S}&n6a;Nd4bDty?Z$>nSO}Jj!?xylcc$W95S}Y7ArS z1X<6psb+K0|1hfh(e2?ciRkhy;pQGZXajwz}(TVb!`ic|D(WZxShbD#o@NQo(q zWeHGz{T&UDvyPa^&b98P8|g1AR=QH7eu7tw?*=7YP#1E69jF-o!4F7!xGuO3+)>%y zA3aUDYs5935NH}}wA$Eqz<0YIxeI#;bBtRFjNAC~o%&B=(%gzzZ#5=~tLFKfNNe%t zmoz!K{a!Mnnm1%cXk;u}MJ-zJ5C_O+{;oaf4!`(K*L#&RPk;I`$8w7 znPVr=+wqmDj{-RiXBa|I=?;gn+|+%Y9)Mw*^_LD!XOhs zyYOsnM!!m3{0)R;4VX92#WMyj3UN3)EMPr?Jrp};Dc4p7YhwlJm^F9R6iqdm7?VA#@mMuIr2^zo9qOc zX_qGP6fa*z-#PmX-s)CX*6(I3^sSInGe>mj&F@V*{!xp5&g=B{CY9p%%T%^)KpR+I zdZ8rQEp&(`WRK9RuwYu-C#8x=6R_X&*{B@+;6RwZy`R@s!>>bOmisB15;4!@JfHDv zW_CAi!e>cG7&m~=O!}MA@}&l%WF=5>=L}gipO>a7qw?OfD``CWJdl4ONDJ+%J)gv$ z(ZCtr7{d_hQ09I{Dz`oy3PmpVMPE#o)Yi<|G5N#MRz8hX7xOdXwAHF{=t~Yy_MkwDh~b9Q>Jq{pK2Q)49E4shCNOS##X0| z=GZ;BBFQoo1QFMe~>gM`=jIokFnC~XcFZ<&eQi8yq5Fmyr(E2|ef z8i3P>g=~6@#!p^Q3{bpLiD2+wL9n0Kv*0Q)Q{o{A;D%hmFUJ2mIUjTJdAYxf$nNZW zFZUy-nGPS6}cB{)N9_OO5Zdh)zgb zM~2lS-wibF3BdIZYOpll2Tx6hr)s5hG(>x-Ehvn+HcDaB$E^;Jtgj0>I0P{_X_Pv<$kU2D`C=z+#^49$gIs zwQ9)>tSL5(esd1`{oB#@^)}!N)v-Hj>sG?5X4BqcHp?s>CMixQoe*y0?BWbZ*St@g zMJ(S8Mi02#(fs+&5#lDBQ5??PEg|(Y(rKm*am)7_y6gEG-{hK}TjO!eVtUp=z&A$d zVbl6kNcaxRL;!2R1B1h<|xT}q_-8b3P)B~q6q1i>J-5)Tu|Ju*n4jN%%sD z<4-bJoY3>;RqZHiPU>Abkw92O12KoPCbKzuj)NMFC%Rqt9BCM&-*_7xWF~MbPpH3JEfTtO_uR9$ zX1Tj=>Ap&sJAdZ1`=o5YtU|q4Rb*{bG(iM7Zhz7C=Z(D!Mu@##46C07olpGX3gy$?OEau)*=&o5sup@ede@5}2q;CuwodwP)QRTS9Mo{wiKduE*Q-_RN`2@6&?tvtB^qWREOU=NzyIH)OmfR&~%O zqcVU5e;!{xM^cD>l`fMz&j7aTd;6179%Ypu0>Mq(6c7m|mBq9n14>o%$Z2CJJfYsQ zknz2avPK>`zfM+i1Qc)H=ApcvgJjJfGS5n;f`-C192OlhBBUV(ZM$?D%RC5il0iYX z7NHWk#38kCANgIKn5|jEDDyR+_dC>=Gq7YO^s>p}Ih4#M2wSu*c`0(GlfX`bZ0R)` z`i^97Q_f;nQkHHbHtjE3CZY^!<_wfAN?lP(5s-s~nFHycpVkGC|46bX;fO^4y@mM2 z?k;sn-exoF=OYWc{uJbT8m{5p>HvTzKdoU0-=mT6$!F5}bWZh>3CC~1l!1xLUNz?m z3P8*0&<6~jp;XT)M?Pf+7&{)pQB>6$jlAoK1r^H>if;t;>f$ADX=o|G(%;dJ7P+9wdybDR;1*E< z1K(CmLxhdei}WpIGmz5|2wOzADW|DuxgdU9qlTo(&`p1Ut)}ZYHKdk*F8qYJ+PmoO zf^F@6A!SSresnp?hpr@REHdm9+IaiW-b~

@@ -103,6 +104,7 @@ SPDX-License-Identifier: AGPL-3.0-only import * as Matter from 'matter-js'; import { Ref, onMounted, ref, shallowRef } from 'vue'; import { EventEmitter } from 'eventemitter3'; +import * as Misskey from 'misskey-js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import * as sound from '@/scripts/sound.js'; import MkRippleEffect from '@/components/MkRippleEffect.vue'; @@ -115,6 +117,8 @@ import { misskeyApi } from '@/scripts/misskey-api.js'; import { i18n } from '@/i18n.js'; import { useInterval } from '@/scripts/use-interval.js'; import MkSelect from '@/components/MkSelect.vue'; +import { apiUrl } from '@/config.js'; +import { $i } from '@/account.js'; type Mono = { id: string; @@ -788,6 +792,46 @@ async function start() { game.start(); } +function getGameImageDriveFile() { + return new Promise(res => { + canvasEl.value?.toBlob(blob => { + if (!blob) return res(null); + if ($i == null) return res(null); + const formData = new FormData(); + formData.append('file', blob); + formData.append('name', `bubble-game-${Date.now()}.png`); + formData.append('isSensitive', 'false'); + formData.append('comment', 'null'); + formData.append('i', $i.token); + if (defaultStore.state.uploadFolder) { + formData.append('folderId', defaultStore.state.uploadFolder); + } + + window.fetch(apiUrl + '/drive/files/create', { + method: 'POST', + body: formData, + }) + .then(response => response.json()) + .then(f => { + res(f); + }); + }, 'image/png'); + }); +} + +async function share() { + const uploading = getGameImageDriveFile(); + os.promiseDialog(uploading); + const file = await uploading; + if (!file) return; + os.post({ + initialText: `#BubbleGame +MODE: ${gameMode.value} +SCORE: ${score.value}`, + initialFiles: [file], + }); +} + useInterval(() => { if (!canvasEl.value) return; const actualCanvasWidth = canvasEl.value.getBoundingClientRect().width; From c6a4caa8be576f9ac457bbb218eccb91455148aa Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jan 2024 14:32:57 +0900 Subject: [PATCH 138/184] refactor --- .../frontend/src/pages/drop-and-fusion.vue | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 71d3f0619..a3be442d2 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -36,7 +36,7 @@ SPDX-License-Identifier: AGPL-3.0-only :moveClass="$style.transition_stock_move" >
- +
HO5=2qx)cz@+_u!}f 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
+
+
+
{{ i18n.ts.bubbleGame }}
+ + + + + {{ i18n.ts.start }} +
+
+
-
SCORE:
-
HIGH SCORE: -
+ BUBBLE GAME +
- {{ gameMode }} -
@@ -33,7 +43,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
@@ -67,7 +77,23 @@ SPDX-License-Identifier: AGPL-3.0-only
- Restart +
+
+
+
SCORE:
+
HIGH SCORE: -
+
+
+
+
+
+
+
+
+
+ Restart +
+
@@ -86,18 +112,35 @@ import MkPlusOneEffect from '@/components/MkPlusOneEffect.vue'; import MkButton from '@/components/MkButton.vue'; import { defaultStore } from '@/store.js'; import { misskeyApi } from '@/scripts/misskey-api.js'; +import { i18n } from '@/i18n.js'; +import { useInterval } from '@/scripts/use-interval.js'; +import MkSelect from '@/components/MkSelect.vue'; + +type Mono = { + id: string; + level: number; + size: number; + shape: 'circle' | 'rectangle'; + score: number; + dropCandidate: boolean; + sfxPitch: number; + img: string; + imgSize: number; + spriteScale: number; +}; const containerEl = shallowRef(); const canvasEl = shallowRef(); const mouseX = ref(0); -const BASE_SIZE = 30; -const FRUITS = [{ +const NORMAL_BASE_SIZE = 30; +const NORAML_MONOS: Mono[] = [{ id: '9377076d-c980-4d83-bdaf-175bc58275b7', level: 10, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 512, - available: false, + dropCandidate: false, sfxPitch: 0.25, img: '/client-assets/drop-and-fusion/exploding_head.png', imgSize: 256, @@ -105,9 +148,10 @@ const FRUITS = [{ }, { id: 'be9f38d2-b267-4b1a-b420-904e22e80568', level: 9, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 256, - available: false, + dropCandidate: false, sfxPitch: 0.5, img: '/client-assets/drop-and-fusion/face_with_symbols_on_mouth.png', imgSize: 256, @@ -115,9 +159,10 @@ const FRUITS = [{ }, { id: 'beb30459-b064-4888-926b-f572e4e72e0c', level: 8, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 128, - available: false, + dropCandidate: false, sfxPitch: 0.75, img: '/client-assets/drop-and-fusion/cold_face.png', imgSize: 256, @@ -125,9 +170,10 @@ const FRUITS = [{ }, { id: 'feab6426-d9d8-49ae-849c-048cdbb6cdf0', level: 7, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 64, - available: false, + dropCandidate: false, sfxPitch: 1, img: '/client-assets/drop-and-fusion/zany_face.png', imgSize: 256, @@ -135,9 +181,10 @@ const FRUITS = [{ }, { id: 'd6d8fed6-6d18-4726-81a1-6cf2c974df8a', level: 6, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 32, - available: false, + dropCandidate: false, sfxPitch: 1.5, img: '/client-assets/drop-and-fusion/pleading_face.png', imgSize: 256, @@ -145,9 +192,10 @@ const FRUITS = [{ }, { id: '249c728e-230f-4332-bbbf-281c271c75b2', level: 5, - size: BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 16, - available: true, + dropCandidate: true, sfxPitch: 2, img: '/client-assets/drop-and-fusion/face_with_open_mouth.png', imgSize: 256, @@ -155,9 +203,10 @@ const FRUITS = [{ }, { id: '23d67613-d484-4a93-b71e-3e81b19d6186', level: 4, - size: BASE_SIZE * 1.25 * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25 * 1.25, + shape: 'circle', score: 8, - available: true, + dropCandidate: true, sfxPitch: 2.5, img: '/client-assets/drop-and-fusion/smiling_face_with_sunglasses.png', imgSize: 256, @@ -165,9 +214,10 @@ const FRUITS = [{ }, { id: '3cbd0add-ad7d-4685-bad0-29f6dddc0b99', level: 3, - size: BASE_SIZE * 1.25 * 1.25, + size: NORMAL_BASE_SIZE * 1.25 * 1.25, + shape: 'circle', score: 4, - available: true, + dropCandidate: true, sfxPitch: 3, img: '/client-assets/drop-and-fusion/grinning_squinting_face.png', imgSize: 256, @@ -175,9 +225,10 @@ const FRUITS = [{ }, { id: '8f86d4f4-ee02-41bf-ad38-1ce0ae457fb5', level: 2, - size: BASE_SIZE * 1.25, + size: NORMAL_BASE_SIZE * 1.25, + shape: 'circle', score: 2, - available: true, + dropCandidate: true, sfxPitch: 3.5, img: '/client-assets/drop-and-fusion/smiling_face_with_hearts.png', imgSize: 256, @@ -185,14 +236,128 @@ const FRUITS = [{ }, { id: '64ec4add-ce39-42b4-96cb-33908f3f118d', level: 1, - size: BASE_SIZE, + size: NORMAL_BASE_SIZE, + shape: 'circle', score: 1, - available: true, + dropCandidate: true, sfxPitch: 4, img: '/client-assets/drop-and-fusion/heart_suit.png', imgSize: 256, spriteScale: 1.12, -}] as const; +}]; + +const SQUARE_BASE_SIZE = 28; +const SQUARE_MONOS: Mono[] = [{ + id: 'f75fd0ba-d3d4-40a4-9712-b470e45b0525', + level: 10, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 512, + dropCandidate: false, + sfxPitch: 0.25, + img: '/client-assets/drop-and-fusion/keycap_10.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '7b70f4af-1c01-45fd-af72-61b1f01e03d1', + level: 9, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 256, + dropCandidate: false, + sfxPitch: 0.5, + img: '/client-assets/drop-and-fusion/keycap_9.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '41607ef3-b6d6-4829-95b6-3737bf8bb956', + level: 8, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 128, + dropCandidate: false, + sfxPitch: 0.75, + img: '/client-assets/drop-and-fusion/keycap_8.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '8a8310d2-0374-460f-bb50-ca9cd3ee3416', + level: 7, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 64, + dropCandidate: false, + sfxPitch: 1, + img: '/client-assets/drop-and-fusion/keycap_7.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '1092e069-fe1a-450b-be97-b5d477ec398c', + level: 6, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 32, + dropCandidate: false, + sfxPitch: 1.5, + img: '/client-assets/drop-and-fusion/keycap_6.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '2294734d-7bb8-4781-bb7b-ef3820abf3d0', + level: 5, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 16, + dropCandidate: true, + sfxPitch: 2, + img: '/client-assets/drop-and-fusion/keycap_5.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: 'ea8a61af-e350-45f7-ba6a-366fcd65692a', + level: 4, + size: SQUARE_BASE_SIZE * 1.25 * 1.25 * 1.25, + shape: 'rectangle', + score: 8, + dropCandidate: true, + sfxPitch: 2.5, + img: '/client-assets/drop-and-fusion/keycap_4.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: 'd0c74815-fc1c-4fbe-9953-c92e4b20f919', + level: 3, + size: SQUARE_BASE_SIZE * 1.25 * 1.25, + shape: 'rectangle', + score: 4, + dropCandidate: true, + sfxPitch: 3, + img: '/client-assets/drop-and-fusion/keycap_3.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: 'd8fbd70e-611d-402d-87da-1a7fd8cd2c8d', + level: 2, + size: SQUARE_BASE_SIZE * 1.25, + shape: 'rectangle', + score: 2, + dropCandidate: true, + sfxPitch: 3.5, + img: '/client-assets/drop-and-fusion/keycap_2.png', + imgSize: 256, + spriteScale: 1.12, +}, { + id: '35e476ee-44bd-4711-ad42-87be245d3efd', + level: 1, + size: SQUARE_BASE_SIZE, + shape: 'rectangle', + score: 1, + dropCandidate: true, + sfxPitch: 4, + img: '/client-assets/drop-and-fusion/keycap_1.png', + imgSize: 256, + spriteScale: 1.12, +}]; const GAME_WIDTH = 450; const GAME_HEIGHT = 600; @@ -200,12 +365,13 @@ const PHYSICS_QUALITY_FACTOR = 16; // 低いほどパフォーマンスが高い let viewScaleX = 1; let viewScaleY = 1; -const currentPick = shallowRef<{ id: string; fruit: typeof FRUITS[number] } | null>(null); -const stock = shallowRef<{ id: string; fruit: typeof FRUITS[number] }[]>([]); +const currentPick = shallowRef<{ id: string; fruit: Mono } | null>(null); +const stock = shallowRef<{ id: string; fruit: Mono }[]>([]); const score = ref(0); const combo = ref(0); const comboPrev = ref(0); const dropReady = ref(true); +const gameMode = ref<'normal' | 'square'>('normal'); const gameOver = ref(false); const gameStarted = ref(false); const highScore = ref(null); @@ -213,7 +379,7 @@ const highScore = ref(null); class Game extends EventEmitter<{ changeScore: (score: number) => void; changeCombo: (combo: number) => void; - changeStock: (stock: { id: string; fruit: typeof FRUITS[number] }[]) => void; + changeStock: (stock: { id: string; fruit: Mono }[]) => void; dropped: () => void; fusioned: (x: number, y: number, score: number) => void; gameOver: () => void; @@ -228,6 +394,8 @@ class Game extends EventEmitter<{ private overflowCollider: Matter.Body; private isGameOver = false; + private monoDefinitions: Mono[] = []; + /** * フィールドに出ていて、かつ合体の対象となるアイテム */ @@ -237,7 +405,7 @@ class Game extends EventEmitter<{ private latestDroppedAt = 0; private latestFusionedAt = 0; - private stock: { id: string; fruit: typeof FRUITS[number] }[] = []; + private stock: { id: string; fruit: Mono }[] = []; private _combo = 0; private get combo() { @@ -259,9 +427,13 @@ class Game extends EventEmitter<{ private comboIntervalId: number | null = null; - constructor() { + constructor(opts: { + monoDefinitions: Mono[]; + }) { super(); + this.monoDefinitions = opts.monoDefinitions; + this.engine = Matter.Engine.create({ constraintIterations: 2 * PHYSICS_QUALITY_FACTOR, positionIterations: 6 * PHYSICS_QUALITY_FACTOR, @@ -333,8 +505,8 @@ class Game extends EventEmitter<{ }); } - private createBody(fruit: typeof FRUITS[number], x: number, y: number) { - return Matter.Bodies.circle(x, y, fruit.size / 2, { + private createBody(fruit: Mono, x: number, y: number) { + const options: Matter.IBodyDefinition = { label: fruit.id, //density: 0.0005, density: fruit.size / 1000, @@ -351,7 +523,14 @@ class Game extends EventEmitter<{ yScale: (fruit.size / fruit.imgSize) * fruit.spriteScale, }, }, - }); + }; + if (fruit.shape === 'circle') { + return Matter.Bodies.circle(x, y, fruit.size / 2, options); + } else if (fruit.shape === 'rectangle') { + return Matter.Bodies.rectangle(x, y, fruit.size, fruit.size, options); + } else { + throw new Error('unrecognized shape'); + } } private fusion(bodyA: Matter.Body, bodyB: Matter.Body) { @@ -370,8 +549,8 @@ class Game extends EventEmitter<{ Matter.Composite.remove(this.engine.world, [bodyA, bodyB]); this.activeBodyIds = this.activeBodyIds.filter(x => x !== bodyA.id && x !== bodyB.id); - const currentFruit = FRUITS.find(y => y.id === bodyA.label)!; - const nextFruit = FRUITS.find(x => x.level === currentFruit.level + 1); + const currentFruit = this.monoDefinitions.find(y => y.id === bodyA.label)!; + const nextFruit = this.monoDefinitions.find(x => x.level === currentFruit.level + 1); if (nextFruit) { const body = this.createBody(nextFruit, newX, newY); @@ -382,7 +561,8 @@ class Game extends EventEmitter<{ this.activeBodyIds.push(body.id); }, 100); - const additionalScore = Math.round(currentFruit.score * (1 + ((this.combo - 1) / 3))); + const comboBonus = 1 + ((this.combo - 1) / 5); + const additionalScore = Math.round(currentFruit.score * comboBonus); this.score += additionalScore; const pan = ((newX / GAME_WIDTH) - 0.5) * 2; @@ -413,7 +593,7 @@ class Game extends EventEmitter<{ for (let i = 0; i < this.STOCK_MAX; i++) { this.stock.push({ id: Math.random().toString(), - fruit: FRUITS.filter(x => x.available)[Math.floor(Math.random() * FRUITS.filter(x => x.available).length)], + fruit: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], }); } this.emit('changeStock', this.stock); @@ -474,7 +654,7 @@ class Game extends EventEmitter<{ const st = this.stock.shift()!; this.stock.push({ id: Math.random().toString(), - fruit: FRUITS.filter(x => x.available)[Math.floor(Math.random() * FRUITS.filter(x => x.available).length)], + fruit: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], }); this.emit('changeStock', this.stock); @@ -533,9 +713,7 @@ function restart() { score.value = 0; combo.value = 0; comboPrev.value = 0; - game = new Game(); - attachGame(); - game.start(); + gameStarted.value = false; } function attachGame() { @@ -584,36 +762,45 @@ function attachGame() { misskeyApi('i/registry/set', { scope: ['dropAndFusionGame'], - key: 'highScore', + key: 'highScore:' + gameMode.value, value: highScore.value, }); } }); } -onMounted(async () => { +async function start() { try { highScore.value = await misskeyApi('i/registry/get', { scope: ['dropAndFusionGame'], - key: 'highScore', + key: 'highScore:' + gameMode.value, }); } catch (err) { } - game = new Game(); - + gameStarted.value = true; + game = new Game(gameMode.value === 'normal' ? { + monoDefinitions: NORAML_MONOS, + } : { + monoDefinitions: SQUARE_MONOS, + }); attachGame(); - game.start(); +} +useInterval(() => { + if (!canvasEl.value) return; const actualCanvasWidth = canvasEl.value.getBoundingClientRect().width; const actualCanvasHeight = canvasEl.value.getBoundingClientRect().height; viewScaleX = actualCanvasWidth / GAME_WIDTH; viewScaleY = actualCanvasHeight / GAME_HEIGHT; +}, 1000, { immediate: false, afterMounted: true }); + +onMounted(async () => { }); definePageMetadata({ - title: 'Drop & Fusion', + title: i18n.ts.bubbleGame, icon: 'ti ti-apple', }); @@ -666,6 +853,8 @@ definePageMetadata({ } .root { + margin: 0 auto; + max-width: 600px; user-select: none; * { diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index 9cf4be778..35478a35a 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -528,7 +528,7 @@ export const routes = [{ component: page(() => import('./pages/clicker.vue')), loginRequired: true, }, { - path: '/drop-and-fusion', + path: '/bubble-game', component: page(() => import('./pages/drop-and-fusion.vue')), loginRequired: true, }, { diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index e50002dc2..9930b321f 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -29,8 +29,8 @@ function toolsMenuItems(): MenuItem[] { icon: 'ti ti-cookie', }, { type: 'link', - to: '/drop-and-fusion', - text: 'Drop & Fusion', + to: '/bubble-game', + text: i18n.ts.bubbleGame, icon: 'ti ti-apple', }, ($i && ($i.isAdmin || $i.policies.canManageCustomEmojis)) ? { type: 'link', 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: [PATCH 136/184] =?UTF-8?q?Fix:=20`Mk:C:mfm`=E3=81=AE`onClickEv`?= =?UTF-8?q?=E3=81=8C=E6=AD=A3=E5=B8=B8=E3=81=AB=E5=91=BC=E3=81=B3=E5=87=BA?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#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(-) diff --git a/packages/frontend/src/scripts/aiscript/ui.ts b/packages/frontend/src/scripts/aiscript/ui.ts index 08ba1e6d9..215ac4cc6 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)]); }, }; } From 1d1780081ee85ecc040e05a4ba18a4aa368c1490 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 7 Jan 2024 14:21:19 +0900 Subject: [PATCH 137/184] =?UTF-8?q?enhance(frontend):=20=E3=82=B2=E3=83=BC?= =?UTF-8?q?=E3=83=A0=E3=81=AE=E3=82=B7=E3=82=A7=E3=82=A2=E6=A9=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/src/pages/drop-and-fusion.vue | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 7f41be4c5..71d3f0619 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -74,6 +74,7 @@ SPDX-License-Identifier: AGPL-3.0-only
GAME OVER!
SCORE:
+ Share

;BDp(T|y3v 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_6.png b/packages/frontend/assets/drop-and-fusion/keycap_6.png new file mode 100644 index 0000000000000000000000000000000000000000..70c9522b4358aa3971d8d7187df98ce3dae4a6f4 GIT binary patch literal 32100 zcmb?iWm6nXvt8UF!QBb&?(Xiskl^mHxI@szNpRQT4vPoZ;O_43a-a7<+z(UTQ#Bu^ zs=KF7pVJeirXq`mOo$8s0MO*+q%;5ksQ+9j03!T<#>lnI@;`&*ET``V0H9#~Z$SYv zvhe?R#7#q10#H3keEi=A)=FGi8~~^Tqr82G0|5M<<)y^6Kv3tM-nEWn+GG!guY!+j z+v~hX!otF6suB`%avWx`@KnzD_QavRODqIKgVjT7Is`-7@?~11^7iIJT9`vy1WKrV z)kT<+3@*fY?D(O-%zI3~;6ewBNm%>M%yvAYc?nsuUgk$O>C{|wcHjCx9)Da{`93ap zcIegs*E>rtg#CJ;(4B)|h_?U;eE*+r>uQiQUcZ^sHp-CfBG9Yv%|N6e9qZ`p;6cEJ z^VjjrV1H7dFE7(^pZp$Cze>0~U<9VY-Y`7jKfYyrM4pu|I1gZ{$jvHQREzF;Nw()2 z5~4(&nE6T)D8qsrb>@C^xCWN^aAHKo!~R~h8eBSv^K(9W6a#lSvSiAb2_d{-uS9#$ zIPHoJ)I)h6%*esSH0w`WisPxYL3E~%<7Eu$mTn9>a=!hR_Mf>I4tQY!gU=$(od{dV zshV?V{fJ&FYDiRg!%krubR(aiho{$kd5PXm`b$BFncZQITP)!nV*u12?@N!y&*P-) zy4hPtW2#6sm*pLNqqLg5Zi)@f19w_z!x>dK(8mA9OmU@!=K9huDjklvgBsjUVw zSy~${Gx45?rzL9+3gj|6fc;hnbQH_;GD9Hg;9OhD^1M~y%}M7+e0zwC65Zh1Rr z&1Zaq?Wdgsy#4O}{D@SUH2J7;g8m#(w!aW0*)5Yl?kKvu&O83ae<5U%j?TKLSl-R&!Gb&f|2exys5*JxEAyLk2Tf z1oCsxPL*A%>mve~nXI?@29&P!w0CWXv{)+3=5gm&tFBk1mr>8NZ zvlFM9yF-Qn{OmI1ig?XzoXl;m4;>VVhnu{x6MGg9?Flh>H6-OG3F=rrUIkK(gzoto!0Whe3!?U+vNAy030?5mS< zb?qcam@c&CiLZoO@g`k*i0bN$p4g^9`_)f-{Zh5jVU$`CXni*HnI5eQCI)`ytAqIL zL;_c9Pc2f8TzfK*rK!OEEjuvQ3x(zGNfx6MYV*yqfYj?tyff|htGCM+1n_5nW$Ax6 z+5O(R8D2{k_Dm4l+H=__m7EbPA6d>(E76O`3k|1I=YmMK*$EuQv(QkpQSNNI+xG3| z41bO&EA2t41hlBpGjBP1Ru^keyQ9Y2m&)fQ>EiFCx>C5H@Jl=E&{07xn{q+F^U3VO z7{B|iQA3VL0tM4%iubuqsFTd?~3xnQg^PZA#G#7TfQRUG}v;z2B ziHw_$&nw5ESdGUDZ)PGoCSFkZ!oNf|wDfn%xrqns%q~Mu_>4J7d@`&wM?=&O{uP>X z6>lp(C#@w3X`%K+C`8VW)ScwT_JCreMdJ^Te{!v1;5&l5j|~Ih$w;d=Vg+F<_kS2Z z%?4gx^8$~bbA|h5-DBcsGDIC82GsLwVUGkf?B3(tHr#K&QvndownUB>HGIt2))KOs z@Al?~H$4BgXbroo8yhy-6zyZ=69B3nAXS5e=VR=wvB*`WNKd;!<20t}Zxx4z`^lfD{#5ma6I@O>YT;iK*XtOJHyIGCqU~eygtgRX4t_{mdLJG!TI zm(kc3FHD|ZfGZ%g^J0^boZI7z|mjBa^zbI4Vqj1nJ*zZZX@Me>E@m&&Q z2+#W<-8*cM5*bk3t&t$eE@rCn`dt)US_M>d*FRaq zR|9w3y9`7lepZ6?KPR-@P=qW)*nmWMNGsn;p;vDycdFM)w(y%XBu-wG@LvjBHGBJDB7w zFe)nj8bQ}mi@Wo$eqMR~q}wn54h(aIixHf_z(AwNP~@0uuMam|aZn%!DOthVR;5p~ zy>h#2HYnMC6@tvly%MBS`GGap6)|8UGGGN|>RGAjgS;oxueUHtV!9|;&%#MA2K0|xB1L9eNW%5*QA5Ex+qK4 z+&W-Vy$2sE)(cKWwIn?tvhD(*2h9OX6>v0> z=v)O6C8)H+E#&C72-k(G8JAoy44bTR0{dq)HJgqt6I;P@TV`R%w+Iy4t$^>gm?EWo z_vR{RJVu4Qe_HSTTlvQNP2Xup`mJodJ|2>$UI$^Oqw3ueAPz-qbz*}x0SosApaMA2 zG6Oc98%mGA=juO?Xn*|K+RoUD(0>rvnLHn9rb2Ok!YotCPN|-&+Q*5o7T?lkw7@1` z==1otHK-0{r^n=jdB)8}v~NF}j5)H4>TZ#!vjO+vVldIw80uWpi&Rn6UtGm<7L~P^;8Z zP2_DK<|*J-I6hN}RErR=UWSBk?~B59o{tJ1m-R104mZ}ARNxo1sOE4fudQnS#VFL1 zi^rc^!7R9uDxL`PS9+vGo8|45o7j?-Oh5%(*?gW)ZFANlER8wz7`D9Bbj_2+#fEoD zU5c{8*haI?Dm<5y!mEZV4Ywp_aVp};sBP9Oa+*40I=N^J<7bG;R-G4c?U4H*MXD?#rOGOTnD_RSLqz)>LT*qQQ2qBv~>hocFhQ zD-2Ich|Wbt%o4%Ocd^I9X4ghwX)XMoVZT>jf z1p3U@r0>)HEn74E=?!I7h9e{YR5NeT=QEEP_$8jMp}-74>jGgcMM(5-NTHKDK97%kRJ!NVq<$x)qa%7j z@nxwVc0ld^!=UI1->!b`Z@Jp4&L!UDht6Xhs_B@2#Cv7aa66)uVcHpJD8$jpbs#}H zGl~WMt4K2YooRzXjA44aomda-tF$|Df}3om5#M)(Os z?SnEnIxhQyx@9qs@OCK`txjo?1SNbXY8t_<<2;|I@uu)X_iDorM z!7)XYA%HA)s1>!ZR5F(W1baBBVDgUH8mpnEDR)LEur{ zbKv)`RD!q=NvuUL?xCrS!OX1+uCpHwuEzgr z!5Q{l-ZNWE&Ns83o?eSvC&GzFCi03G!#gw1o zCxBo($X%-P7ch{jp{VD+Zm`%b?DonuzW_o0Hn0hsgv2wCX0l7m0Mv1#y(?^44K{S* zQKE;Db%VGh847@;q7E$QGEasxv&R5F-AcTA0z}S27b4K7G0g*Eg%(VQO$RpFC8-Oh z**!0%$@aX<1ar~BmKE#$uo*dB;c4kPBqW&`-28Y+D9!{u4AxWl`m3mHzQ?FXt-&_J zZ^!^#FvtVg%*R*9;SVT1!?Mu;W*^EMGhsZoh{a^r^y|VwghJIw_F7tYunD&*{&mPu zPgw9;aFN2j!MF#O-BY$-Ani>;DT9?gRda$^Y6KR;ZX7@kLws1SSU>G;i)Ee&Gy3ju z+PEqzJGSSC4CT!D)^b}7ykAY~Y{P=0BORPj(Nom4=V(^^tKz;Ihz>aqKg(hSDB!8* z_g#Y)XBes%>7sv8gd{!>leJVD3UtuXnK8aj%PghgRTFa)L(zx)&^(JXsZ54YV(76` zNK`M(!1h#K?{JL7JvjL4lmM!9UW3-D0F*is#z^6fcBHBVzisdHZs#<8D9x#6(_YJ* zW4dh*rC`t3oVKxR3vC>@)|@@)Yg#C=R`i zmR}4Qt5)o{duq&{)g-@Tj4hHx@S#VejYOV>@?k?omaMj9^fVtB?3Jfmw)XJ~?pj$4 z*x;od>X544oHY)VO;o#u4uwcv6ZwhBX!h!ev_(MB)X z6sgt^$}65}7RoxW4lE!eymstwbr=ysvV)K@_`Aje#IKmEQC2qE=M{NZw1Wv;y&OCS zV)83Xew^zqU%L$2q2*{1AII&#RSYZbmFI=kz3rr?QuU-us#>N6ajOp0BJr!kJFEUz zut$3n>>W@?7c<{aa7I9^TQq;BXLpcl`TnW*=1abx7>0;_|3c~O92;WKx#02LfgktE zz+)+q(Q!_np7^0TS*Ygwm?65p;GC9qp2M{LE+Z;Mj1Uhrc=4OXD=9 zl8sZQ-pf>UAt+N!AZ!mcQ4!|K4^tMm%6A_{+dPc2*s;gFRd!sqJ=(=bxdvg@3#Abn z`n4?Pi?=lNja;`g+N?y+a_ry1j6^!lVUd3XA)K;XHC-mL)DJD*R3X2bsk2nw6%oe9 zb}L~gKhnxAi}K*&eyCM+6yT26$IRMl9qwXU;72QRgr8SB{=j7%rgOe8G;UmGN7iuh2AU`meELFGW9SC%FyR*Bnl&$)PIz-1?- zAA^?vRwrzA!(^yzn&Nkp_80PUHilzJoLnN~o!VUt8ErZtv?Hx-VY6r>@nSg)oL}*d znpDWc*<%*f>TTF{`4&OEbczu=PM)&%Pb!Jip|~hv@|nE*H@CimekrFegVu`Yt+clT zX=?#n$;-vGMg?KlEUy=x6xk0^xd*$bYTk(0m)4fitecev*l`sy2@VzU5L(5LEXKF(WRz@IaQ?h;|>B9He zXq~aTnF+Bvh-S(ZN!fmUs2xHSvt>&62Cis@Yic3p(0TDXq8fYE6D6+|H0e2h6EZmY z8!8@?j0P5s++fhFSf#58e{=~=krtpAlOAqq2P!O%;vLkL2jK|hfGPwg-&XwYje>0? z%MldXEG1!R7~3XE8z1ADp!P-#Pu&uyJZ#a#S>UJCOStVAzz+pCrfprQ*>-zIQ|$#v zdI1K0^P`J%;iQKZ@dnZrbh*Ckqb7v-vfk(Ca?gG0eZd$_N2w%KJ-Aavm1c0=T`^`u za-MtDKLLo9<{lAO$X~`7wf`ia>DkS5twklZy51t{e1T#IA}Wb>Qa1O?3W4b;g6=jA8kIednNY8!+atS- zX-5uuU^0S;*P7tJE-7R5ZvY98-$?&XWqp%ECr>BW5G3KysAF4TTqcXIQh?g?YH2u) zz|Iqt$^bQl|M$XDcs!YMICVg~iN`REm|M?jU^7Mq8({k*Rf9ldlQk{cI z+U<|t?SD&Lot0$Cqm={F5zIq5{*jKpztuQu?~V5NO*Oql#qS|V&1SaouoIz&x!L@c zJAgm8Amm*B5a(<=+4LlIQZ0+9SSNY%Ha!TnUeqgmu&zwpMI_i=_x*><6e!zpxlQYC*B&{vs=nW_+$(Ml6e8K`@#PYAK!UFf^GgoZt* zYzdkfw#+r*%vCG=!OWoMBX+MonIsjAmwB7Pvf>%VZw$LI0e{NCV2G%MEFX>udJ#iE z*XgkP?`3jPe)7HOh}wMZndPGm{HqWL2Uq;N8}52%H}mNP!D;K(iDVa{W&@0|woiTYrqwpuD_-c}f!FISV>h&0o9ubgSfMSKjROmAg>} z@48L1*3TwZ5PbJ#Z>6M9{50Krtl=Rk7b(@o)g@dg#S`b$C!NS=4pF-@6XK)9XXY`t zTZ8*V1l)p*?gX4}hG`t@EPG#&u<23#0ey&{Na0e$($|NZ-8=%ziyKn0Np2H#WgC{0 z!|0goJxqE7O^m5zPPXVNUrq-1MYcgkXIwF)T=Gmo8j-`b9K)cM5!n8U~Yt>bgzt-|Rs9TWvNsXEVE4Jed<&8?fN+d;-?DrBi$; z_w8SW!7c>XE|7p&*d-3sQY^+BdmrUxo_%QAWqKB>Q94%bEl;9K)IQ`ae`$a(2piu= zYDtcfk5TJS0({14^2)C~TLU_nMGzdSXuAqUXgxXusVVbSS|mVlyB=del0nfdl4;9q zeG1|iG8M4pqxP1!cDyvM(1jGe5pDuPKU@Zom-e%BaLGWk@_A*fM57J0hAeMar5@fD z&dau3^tEDB9ycndzA+d!t14QRZeXrjg|FwrkbCz}CD&i?J;qjg;$fUEO^Npn|+NZlsT5 zRJ}=^lvWSz{`7hKK&Z9`0)%tc)XFlFno@j!#6@6B5S}oI@@o0KCErKtwa8EI$7Bgi>7d2KRz|blDOWc3) z{!lg&S+t_rJW}pb)`O?3QI*(s@VWW81^|6N1c07?1*v3|$O&(5^a7Q!J^Ix|y9GB& z{;ntO=;q~}@T7&t7o4sQx1#4Uipor`E69mEO+mx#O_ThbiK-kw|a4R=`H^Ab#!wTCrx6y|Rfy5GHQKV6jo^`R610YP2^}knx-d*&`gwKya;5e;Rn`83XEfsCzk!&6b9{Jo76-@euIj9z zog5y!{b-?55qy2?i!mnSme`+VyYwD)?on^Q+F48>1;Tl2!#wcj?GQ%FAj$y-{#<2v zA_%~9y|dt-kh63qdUYF%<9oQP>*yYefW32c)DIJOT}eeXrktw5HjG3sMJveRXDVw~ zqSLDM02t%_ub~e~{Y|ph`2Hv&-Tsu&nwR_PB?^(n4`$L}^Al+811G!U$f=mIOnSzP zcBW!!-2Cb#$27CDR*g%h+SgFAZHv6Q4#eZ7rWA`B5wpf^sTmn{>nd>$DFgkq&PMR*tSCQg(jG2IOP?iM z{7XM#)34njcs+QlQ4{&?$imA6?9cPQUuN`ra=Z2ndly3f1HU$&r<92oP|v+vk9=po zO6RD2SV=lm*{$)9QuOPdLC17(gHl3S_s`vZ-W$@+;is%frx@i<6}o`*#k=oFfc#JM zoSVcAQIXw5eXAyF(8C>Zj)?T@bG*WD-cO|Lrmt!nE1CrctBlnxItMszWZvJnGI-Ek zHfzB(&~_X9J(UgW0WQXb=q&%xq6((@SBOBeD?M}2aLq1gcNwGU;{knep)TK{kjbQ7-2*G6an2* zZd{LtpWt)dE~F3;`wp3oVlBGF^bx}GG%n?noUXoUyV5`FOV~Bm)TixP(46gBkaub{ zDzLIbeF_{@;Y1@dJ8eb3*2leEG(}$0Wfv<0NyJbXiNR`im$A=*M>Mp28_wJB$&0!% zI&;2>jkKh~_D8H#!Pl4F&r6|gfz10r6qM*e6@8B3L=4~a37Q)FmZTDywwqL)L2qgQ zEqkwYhFb6;V6Ju5fvU5gY_@=RI42A_^t+3Ci9=4|FGzFstUVUtnfH9BT8e>t+ds#u z_#j=NrQgA=>cnn`@iT6&`QK%Etvdaiw}yIfF0@(02ibPE>U!kkCg067P_Wrb&Uc$5 z)6S68;;$RIUEUY6e%+NK`+Ji{6T=nkW8ofP7h+1E_hcWYFY{u=*G+0nwB~1M9dD;n zA%bFuI5Fm$85NX8pVx{!=4pKUqdI<2uk>Skw%6Pr;yuMiNiZO z8%invtbbVfV$?t+ux+b1nS`LjFvFvu%Qb_E9uYA9+g~d^P1o^8I@M=qsvWX2I9qeW6cK;tc~P>JRM6zia6eN;6u|~^ z<_-JNg#$kaav5cD45|SgM|pd+Xg{@zw`> zY`L92V|v8g@qkk8%J;O3c^3s8U|nC0{0p0AE<{qi$W)=frILLnc5LNL*@y-ev(|FWs-z}^a7KFhxMd+j;RE z#bnMb2kq;F*L2IP79I7l{5}{thv(xUJJ13adPeWGCAagZiT{D$MeY~ZM@OY9QN`K? z@+|RV8>r27Mls*qr~wa(-39Rxb}S^BHuE+{O2F~F>_xGat`)9u@Eu{0Up9GoR$8o+ z{EF!}>QM;qu$?^5>bB?abyF*uYbL=cck%vwhnSD6F%=hVk-hxfJHw5;u|M$pvKz~~ zg6}&jVn(lz!rLaIACL-HE*zBm5AD;dXn|{=ky-^URVZP13$FJ!Zt{J0;84TqFEw5X zt6*V2tXfU~T!gCPuO-6<+biDyHN%#HGp5fdcn>^@1M;|DnZ1^7fN-?NBixkyooMl` z8B@qZz~CvV5OeNL@~A3WS1{y3_Tj3t;W`~v93NuR?n)-&=T>L~RgKv&TOGNmRG8RZ zbfx&@2OpqQwChLn8`BN{tJZwR_hlJUJX29oRLr0X3+||d#ecJZ8C7pvx$sFx2(|un z7HL9^;X8v{rg|U$K-S!1CS=z5{1VaV`F5?kK89(tOKNjt57S%TwR{WENIu4381{5W zMc>+7e8R{+k2#c)rm?eh#Hs^!1Mq>7MUHv#J4i0YbhC18?*&3?P;DsQ0>vrK<(4g@vcv_(j7s z=5w;8YZVm)lpdC-&Yq6|BDPu`8K|6Zt{qAjG}sYA!4W;q{d!A^r}E2Ox|MjWWx=bk zGWmCoTtN_i>k-8@UvNbBXL=5NF<9_pf6&CPpVQ}=?M-3XcM1`9_o|L)=*deJ=!&CD zpljv#(;a6K%g3e$gBw!py*x;_bcd{O2ot`BM8^{iH@SXG+=Hn8b0%D~I%V-!e--Wu z`Y}Ke*dZ5LB8>3cIXsDlqyE5JOWOenu0k4y%5PuM*GK?ic*+AjN)uQ#WT%>p!fA!Q zCUP<+i~}sU_skh-tOuM7H$uCbqO2{g-Tr^+BpA>%SJVr#`qHII-Ih76$^|~gtHrDfYo734;W&*DkvPBi zf9a1qoF-b3l~ZO$`wkb*DF(>RhyNrQW1PwJ`(o(hBNFdRus!M@4a4FDe-oT#9GsS( zCRC>B3P;!icI^CG50qxOjf1P|+Q_Mp!;geY0;6`d#Rj4%(-^0j9GTVy(=oebt3u{_ zIxBWqyEr)%tKru_2n01gd8(%Yt~?*n>wynM3aStKmz!f{fL=9#=;zpIqu-eLmL+4#BgKPt2iIs*)iF?7x5X2J;yEW`76UD`B&Udn#*YpLNS3hX_7{F4Tl z+7Rhe6(Y@f+_cQHAe&y|#(SeT;we)cbaVLaWqd74>NM{MwBG1nj*oN02mGuzYn~Ju6$*kVPc%oul)H5O9JWMAFaC-)Q)PdK)M8ePhhd4Hg(l}Y}F=~6VZ?+wfr1X{hl@}cS zI(X%1_v`IMnO7a@Xxs0o7xBUXWL7}E`htYKVW%s$K6QEU?tgg3BoyXQXY&uyMalMW zQ#2^e2gvu$^D*Gce`w72^I$M{(LIZo1tV-)loISs*5wJ+eYY3h{@A>TVgrmSe1Q5x zS9eXotw#le&V`n(Zq#P(o(`=T(KAvbt?#wy&;wf^`A20rR8X6kaBs3AZ{j9)2E?TN zgiO@~r%OjV-?VN7tLbEzB`Os5amd^CXwm>RJRL&U>1Xnvl8B8cdYAwDz8WBiAB+py zCG$?(Khckm5ZBWZD;2V+1CK_C^d1`DL?L%t4(gjbKs`Km0CbR+QxM3@TW8DvB;03k zD~PwCH_~*4M7Ux$Qq+1xcffAcmAoTEZh%|&7!9Y-=bWE8V)NLdjsV+mgd5Gk9>E%5 zpOdIB?6L`;Szh(xg9l3J*C7#xOrvi_${dw{ONg1f)SC@`r^|6uvAt87?DTAXSCc+} zbqS^c%!qeX8YdfZeN|!-F*~&$?^A=>o`8yw9tFFCIwKt_ZT|#oB5MM~9NJTGfNPED z83B&TIQ6_y_bNFc?eQb{CedW;;TT@@Cf~P`y24u#xeIrk35vBCgdjQ?D0q zdJVCN+1kLU<1Z7>TPtf9VcfbGf;OI{yBDQQ;OPUafa`$a6$%XTdeM&X)V?(Bx<9aF@lWB*N@dj=GsYKVcDT*L+NIXz0&`aYD8!<|!2^;cj zzNqv>C+cy2w}aO*IFZ3I5I0NRMq&#%IIRTs&bPb??bob-s@m->L;t$(l7_F|5a?4C z4H((49O?F&V7%`1d&s0U94rwqyG}D}n!v3M9mV;`x(l03eTk>I0~)R3JlxSazq?NE z&e1njq6(55&CQOOa-I2vjJ2!i@LvnYn%6Dxrbi2*tm@e$SK{67lY!`WyKd!1O$=Z0 zgbb1x!2ZUj4()+^p^rN{mu&V!(;X3R6O327CBi&Rz*@I~tX8fTn?SUW(Gxv!9_V@G zNq}!Fn%r3iQ(;jToTV&!_y0WRCqzG0V$_7 z&(#)*anMB%Hyk||{gBJ!+b0a&cr3IwB!*|%b05QSeno?y!JR~TdtkKBA3{=#oW~h; zU!Mo2VxZuhn&=stTe4m@oRFAC?{I6=!6Dz?m5{>oCU0ea-?8Qw5CT|GhbsJ;W#x1n zKIXPiVH^rC8b7$6Yq1P%?6S^8IsU7mzRJ#Qr1$R+fXQabJ+Q0j+QVxvhLNX-lZ(+a zztY%Q#F`wH=_T$`2U2tO-$YRCU^d)HGQYk10XkW}@PpS#VULj?GM9HCk3N(8YEizd z)Fw2xxC|F{Gn(fSqEE~sPH;VzRlen~Gt%I3rw<7wCS-}5_Cu)L54NcsGM~jjW$I~b z3HFL^YOc?C(*Kc1mnz-Y6hB#Jr1TwfXjNt;eJg* z;xAgXr2Qe3+ed;IS-w6u=w+39xzaakSbb&07atj%CoP+P=2cGoW&^tGK2GfF>o26X zeq)#5&icsL9*kP;CleknUI`_IXTcSv-8BsOEs$Htl;6=ek=@?YIe*%9A^hLtzpA2{wBu3pC%rd531@#O+ zmgUz1JSbKOf=?-#z#OaR2bzB*j=IbU`IJmvCUtJv&|A#JZVQ}c>@`wvBum!LV^(*> zRN&K!IcmW32+C79*rZ33wg@%YE|Z3{kung&rrBaU!)|aS`o}=RvLEB99jYl8htlte z6~ly|b=e^R&j?}spviPrn}r!uXZpJGH98RCyb%wEL5X+-;%}aqg9Sn;)0W;UYhr?% zMA5eBs0kpcu;7@_8jnL&UHh0 zCLmmsyWs}VP-+ZlRhD(9pSQgT)rR>Zu7$)*SLY$+p?Y5pF_irIz(7m9_`8d|Z^R@n z0qOoUSE*ZO8!+fU4mb`2dSnwOv&cXO#;ql#Ca0(jF8(#8gzN|$e$t45K0gI}2@RQD4X zDY}28g`pnhzagfXOX#J4lEnDC@$*t)hK9jCOg{iy-L?ujABPL3>z{Ih^m=w72Dm@| z<4Q+ub^nBo`;5?Rp#aB6Z^zaH@%L-~sf!gHA3215{ng^y{{%kwyhWfLJPm*#b_DF^ zKzZ#@QS2t=A4Uz9iaNv8bY8*-JeZ|l?Sf7IDsN8~k<>86mIiyxAOfnrz+GXC0YfDt zc9m%@u#hY~*2|<#_!Ka-Vhyv}Uv2_e;0%0}jZ&^(-Osgl91lJAVaGP%1?X2B*XSV# zZve8{?8NEK(K8+|U_@S1ANN$_=I(}b=O8_-;~A!K{Vu!r`KKt?%7EFpqNtDpAMY7O z*EZbLPNvB_HPCx1>VnmZv_kN3bsVimspVjFJIcieK?6Z)9Hh(1-O)TZx`ncCY)RUtk`IOy)knQ04AKetbFPY_TYSm2Y|C&bLNP+Od)(zddy4 zfnKH?_kVgjH0d|10USpVrYOi*<_nT>A89O$PFP2tg4J}g`v z_zJrOhWcXn@;t+PNYj1RDlQ+Rm?h!TghMBShf5h+{KaWR>{zhtvKS>H=vcVrN;%gRj+M}ns)Qn8)}fT- zTOgi=N#zklER!?PsBkf;sZ2{=mQo|)GN%Pr_WUnpH64zFk~UXa^l$A6w%S-OK(~U9o2VK0mmj4~Pm_W#nlq z58bCL?`8rj(8q@5Wge|A>IxGVx%auo26X_(CZ1%`mgWYaKL94TBe5v5bPFGBU&U5D zWV)(>8vCdzzDOkWW&kV6+8E^A0B^auWA~!z#P{$Yec{Sr(dV09L?fYloDI+lEDlYr zM@4H>J7aY^>1~{t;@e1oOR@5T`&#v|%PP#-0H8I$Q=zWMO(t>sle`p9JdXoojn3_4 zSdUsI#vHHyuPmUdR%!yReXJZRdsU6-g}ZgRa^P z9A`=d%=_D}P<`}-HX<>~v-He}A}RohuzLZd|M?#xYGTiAyst3A0z;%b2Qtq7?Fsh2 zU3Hs)yEMV#6(g4sJ(_>A7o41yY372hXF3FpZ}R*7dZ11Vz@LADif8P{Pu$jcU3^#e z3Onp2pWkI~XB6jHXRzp3-mJuwK?tCaG*N{qlduy~{RL&ZFCMd0HJ0*X$4n_EbndhT zK`ZM)Dg-b?U);S_O{H4>F0cdNEL69%NI*jk?IwNt8MzLzVue5lj3B0f3Az!X8ekB0 zjQtJ6(`!hl5F(dy#odLQ#9JKyRD1_0=Qb+pjhFk;`d zYQ|f6?FZzN`;(#oGahd@YHMd$cAqCcn-_TQKKy{2!k_pKe*1;0+c{|I{#&l-auH@`PjwOEuONe-y`1D?+C zPMl3PE@Hfy88uNU5+FbP(2b1?Q)J^Eep-tW23OBod82$82^I8(N=g6fTnLSYq@);Z z2jUW<$N#Okk*wUk&&M_jkSFZbaAyc3v{2+bJDlLiexCE87*#{KUuvZ95X^zyQ$UFR zhxbfBVUft~R*|9pgXhpz(s4IBmN`m?p9QX{C1uf2+Xr8oH&)NTAw#YYtKa-@mXaf8#Vo_oIly-b7Mm zSjgx1v&R02PouifnUi3EIg{ZMfX5FIeuL1NBeKiQ@O+&2^bT_7dwDwT-aa~P;MS0c z3~j-X=^=#P-ELr~yZv4mG`$_m+w$&9+NFb@L5uMttEzffF38q>2`_Y|wY089T4f`n zMx^pa=9QtI@yd%A#`o!49*})%oI~v$Ghqb$v};v9M;mDS#YH-_Xi7>amBjqM4UfES z2^phW-ONJ))a32Ghk2C?nST7BzmsWN6qr!6dlRAlR>Lafn*;7KIeB?w1B9>%huD*eP_kbvBRc=M)_yb|x&^aN<>Dk8*dMm>$Q4m> zaiobwXHyP|pey~}myA+Eo3e8IS6o^q<4!Tzo0Rq^{2hY!D+uq9E^j%k^+rh$Pn6oW zvr9O+JeRt!@f!tF$nD$@MchS|!Sqfh&{W=8b{wowK+p|Oy4nZ+&D3@P`g5r}S=S*g z#6K2rU`@VN?j!d#+?@JGPzKsll$@x})lKyRWmviY=$+~spCq<)D&VSJFrbP4v5Wpo zda?cBbbR5XOMKc_uV;2|MeRy;q*7~evZfNnASxe)^R9U9v)@CPu<~RV26TVrJYT(Ab<&oo*hD|j8)(rh(mM^SfL?8r)Y8;XaLRv-Zn;$P1*G*JMf& zKo@QH@LKJ7bwSJfv^7goy#cH8@+=sD0W=r#A-h_M43;Is7yVq%$6)W$I^&a=m6iNY zFiCER@z1kig(kj|gu|31Ipq2HV;+mi*Sb44Lt#grLYO0F-qCg!d z(N?LI_X0zKJam=Z{xb+`W*)3N=JU-ENv9_6Mr7^r0^T%sa=!0x26yGtv#fA5!M(eX z7`tP(JU64k{Em@}Ll4~TFPhj~|=aYfc5;L)COXTXQ z==+D;Q~5S%2Y$Zov&Z>Gdut#)c$3#&r)zt^=USbOPraAkt3s0WP(E1B_brU;JWOPV1F*(H4zu+qP}nWtWpMp9XPgzzFml^``!5 z=(~anIKYw1q*rj(g}iG4rTNE^z!irV-|om_n4rvEzUMmt*;ttj437 zNoHtis3S5c%y+Us=1xD8Y^4dnoGe6~)d%$OW|jhH7mhOa-h+`XvM8JP4_XWvk2te(J5fQW(d*ADFqE0wvmXwqmR6odfztMTOmD#^N zu9;~U9SBU$Uc)FU17H{*wMdNt7$OCl>+yz)X8bE2KCWy7I=|7D0mXyf!qw5p(=qG- z@EJJuV??BOpYUM*e3`xri~fSqVx$6(#(Pd=(Bs%02cV?IO+bO^p9Z~WKv(y6B&T4Q zU;wf2HS6bci*ZjfelTXg&ckESH~g0CkM>gbJa8ELqKGmZ_RtZ)V#8WbYQjKeM!W>1 zATMwA6X|Ndp9xuSy&j3Db-0-r@&g~-?<0!i8CDc+e(3|($EA@NN|a1eH$-jHkVye) z&KT0HO>F@+ETWUjT$FVSp-{rJ(&88?&|fz7Wo~oDS9B`&bdIoSL%}Y4(NGmq4lehRAwM_(rQt@w9m{hHc@i>V zCWc5CVLgkEQO6S3EO7@QEmF^rczYQ1GS;-ox#PBGpikHM$#{%Z?|qbs#W&4Ke&0^yg?Kl_O299dnhkOL5b;_tOZPimCrs%1<8ZRxb9r z^ZH5k;4A@Or4~$m_Ob+di>mnN@!_Xo<}Cp);f-v6OK%Ew3^}L*C$(KoubGL=pm|`R zyJ2Z)JLJ02TA+T=^H-O@@CGLjs#FhyXaSq$Iu)jn6j%~ikiqC&Iy-Tf6MwX1Z;589 zUUx?ar*+<2CM2B=x{rq^opGY9tH7y|#sdw)cSP+8grPz0Zy`kg-T)g1-?&448be}k z617oJkUhSu_wl=U2obRB1k6d`9zcK}!^}&A~I_4Nrc=R4`opOGQ zwa3vI((lUmUM=sM@HO$TP*J7W?y-Q2VE2UAO@|-96YA677q>OSj19c;5IeTUeLpw6 zddzxR)&@#$dJ|z{$fBe^Jb(g~@fE032-5O~2n)*vLc(XLh`qT!Pcs1xRxi@Xa)z9L4~QgN&&&CAmU!ik| zh*qgzTpp~p2rIV5QsN8f(Jmn|g}cfdW2%}%c?=OZaW4nj%co8Lbr3rWTrKgs7OEq> z6f$NnUG#)G9kj`l=jH|1^gAs%5JFEAc22F_@gjK@Nvo``B)#OKVWRnWsE_mLNl~E< z6}0`$W1Y=Nk%^jjdO7w%s^u`+Rvy3fdGz~;x?wl~#~paVF3cp@`W4KAf&e1MC#i&c zUSxx=a35!?((`s}o(RUDlR;7vPTQ|@`?ijjIw+P{h4X8~&YR4L{XQR8^tQz3C=#mt z6b_-zt6#RUkrn|f$hG77BYo2O z=g2SNCx(F_X%#3r#3E{FYi$&Jn7;?A$F(Y|KG>G_sh<2!Dcp+{`n!8j@T|Vo>uNMQS%T*UF&i(c!>^g(Sp^`!H1Gi;3Vis~ zv*+@Y0GgYooS5+(KxOku>(m_>OJ1N7PY5+fYpq5;7~ z1{4IY)~)sxFEs?P)OXNBDhh(rx{vUW%A`M^TLQ^*YGH%={7pWhz`*-meSc2oZMWH! zN4lsQB;^A$43;AK!J4ATtkx3Hc}hHDNvhNU(?tZYv<7Q0^&)?{1$hLm{VEk1Sj zSd4GPxfy4Yi$f~Lb}|0)#Vm^p<#;L=Y39%tUOL?r5<1NfWGIp}D+d|dkY%w>vEf4P zVyWn2bwx!$ekP`TI%!-(8u=d;P6)ZR%{%&K#D=LVrjyF2+Cf1`G0_*zX@1E_{c(NV zmf@~6@!&5rh{rQ%Lhv85AQr-D_%W<4*xY=>H(wbnAa>Ebbek@BSo4^Ani&C~S!oFickdch7`2(B zNJ~WqEBr1pMjGP-CTk3b?IK#{??jU-IxardJ9fmnLpAU#5mC}>I&yD&Afz|A zoRg7qHITjvM#M>9TCt`?cb=tH%|p?Y`s+$Zy9gTCr6(^2_YF?%>|vAt`AUx^}|sJBEJe^T}k= zy2ITG2mbV-iP$VyBu{|7Dc8c0I1{YQtn*KXf2F$~Hclqm)tS90($4N6P~23S87{0A z;w(o#Q;|wH3G%*2nzc!?^=vRYzd&jT#lDn%OP4?#~KOW z)mP}cp~oru<@o1u{o>r?48tt(LUgF!SwID1sQ$q{#xUH({6-9ZP&xs$G*&&9P8wOt zs)ZJyIOiC~R?O6wId?12l9CQ5fN(gOUzgO7qO{3PD#UFQc;P^R-X8i!Z$gx$G~uqT zvA6Bp?rcU>ixx3wt53}B(DK%jH}Vz|POvBqv|h$_*6`~6I9;r0{R|Qi4oE7U!gWtifj7hMqcK%woA`B+uh9d?)&zB7PPF14iCRie45%nw#usc${ zPbOoX=E8T55bs`CJ<9>fJjJpuKd5Lt>`Y+tnBS{nDpw|S0DbqyrD3(I6nnCTrn-wm95!dKwUehE|;zOTnlPes+0V+R14wp1|=7V3X&&O zKzR>}OUa|!v-8@1n&%qDY5eRI+kNwv>G9g>MWD-`^~UrSZLy#6)%~`~O?{|53-vHW zp4AlfTtMeZP}CR69(jAP`kq_*T0WvAiE8j+B0Omn5&`BFEz@5VfxCE&3MW2uVhVxw z3trk)YGoQZ2!lK=vYxisNsde5K-cS@Iv+5bRbs&Lx3c0+@J-T;&RB2hWc4V)+FJ!b zP;Ub(BW{pde9-^PZwR|vZ|LETK^OjjUr- zvsZkOW}F<+xb6$HpQ1Anrc#nb>Dwot-5FBw_DrDQ4skxrp zc^Wlv{D5q!Sg&(j&|cFku|*JxLZQN=>#Nvd%kI))%g)+i>0I2T^HC&XJcQnt)7smL z?qTuw>GlziQ50IAv!H(8PkG(jhJ4FIYQV85c!dUs!M&~&j-YvC{IJiI=W-%;BWW0k z#(4({X`{X1iUIW?dMI(}^VB14lWRzr4f%+wDCfeq;WPD05GV}y)Sk#4gHye>QXI|) zV^aK$fR{kx!=Q$jw;6;$0T~AkJ63fGLq-|CR;10nX@*cTXcTpYTJJpwBVbkwZ?+Dz6ot z2NIwVD%RmVh^03-s=X#1owvZcC+J+Ep=5phmG~;7mLz-0#}n=1!Z<``xV(t^5@S)L zABwNU;`F#opcHpFt1J@YZS)tX-XQ8?Uy4);^<$%qRu(P-wEW@CYW&`shMUD*RI}Lp zE3_DqE=atyYYovXUFZ+{*VP*>h^heyW$GL|2dUm5{j;Nh74(yTum8R|<6M%XKjeGy zJ&M0%x9n-SLEz2kq)e0V07T=)Z!46ne(`bHprI9@6-WMqO%vsHy_avz@QfNo*iwe3 z84#wY8q-kTuT(#}cKD1~GqNs&CzQ~9m;;Geh;k;&p*~$y(Co8!D6N~BOv)KMq z#~Z|+&$JG?I1ppfhO0rMFvcSa-97V@aNEDuU|i*#xn*CE&Crpkm3QJx=@Gx#h*1C8 zX!iu^mv&Aojf@Lx%$pay&fkZM3_Uq`RWj%>m9lFP%`>Ho z+szvimF3JBfF~k_i45f5i6+yzeV3{G8;+QuwJg_aeFyCC?GuF9)$Rgu=%-#(z-?zh z%ZJwCzUQutFd>znm;e*(0dl14-iSLGjpv6s#J`Kn0?X-8lSIT|L9tDPu!P>gD3OPg zQj7}D?(W;LoBrauyLDkNYZfq#n0C7We2c1wInMs3_nUGad!0cloZG4<%Cp43rw!w! zj!1UU?f3!nwbE5dtj`QaQ`r>{axe-+23!9^x9M%?h2;r&*brtTtZq_Fdv)q z%h1LxW^MvYaD+e4JGYJ7Fislx&^hPG#7_Qs#0&+fVURq7*+9b%USFVzOVHh$Aavq@ zHa(^a_ zzA_&qqE%)gdxgorxKh+RwFRPf{E-^Wq1yR0*T^UsvfqU7WY!+?wGTu~yfoX04Uff+ zJ-+sThppZ&CCQ}e;RFjgex80>2`;cDfRn!B9uR-9KGMYttb9R%BT6=Q{ETh^4HCuq z+{Ekq%zfz*BvD3RH2_ccTodEP8J80Cy3VMwK4>@E-s5LjK66&Jj{MZxnd(41N$Yem za}ZJwf$&U^NMWEmUE_PJKib8P60wRj6o+1^-M(B0QQrCi>|xHy$Ak2c4@A0D?3-dh zl;9wVhGN74v1u&hVu;*gUw9*$-G8RL$VC+OfD#EGQTE?q%W2!R@Uj~!v{Ih_lk1=j z_-o-`C;(_Pa@>_)DojIBc@~cvQu^AwDxrV%lFil);HHjj9@w?f;W`de&HL-D} z0qY9VhxU)lX!!;?xmN$Fmk-lUyWbm^!`5%)IT$+v$rw0m!4@9(sV>pw*V*435M}nO zF$eOGi>2L$`_i$~4SOY%eJou2*dbrr+a3OEAdT$jQ{sSK!?6hYA@FMBhIx#FzTYEs zS8+HQ3>rhKu!@P0s85Ht4B!5R@VnlSWVQ$@Z+b87b9m3!!5;w6DIeHz#`P4Ai^{e1 z#pX#mez=8t1+Db$`u!PN5$5L~3s5yz~Zs_v!bpB*ezO5rd_EwlV3R!Xv8|BS!DtKUJ7cL*n z2x6tLnaV`_!~Vx;5zYw96nYv%hQ317`~7&=XTQMd_I8rhD{`!s2C-`&JiVC^X2-fJ z0|Xtw@GKG|j;>sIJjo`je(oU0*)_;@?evpn!WkTk;|IC5Avj$6_)kx74Ydocq^X)f zTu>R=qSyW#s-gAU*l36#o?{SZVN-Ok!4xhWPWGE_QVyGTxjT47{Jb{q=Ki<|BOoZ? zHmx4aS`5%%zDT|2;s7yw2l|vCa=}ggrfiS3)~=-;JJLFC3ELzOcwiElP@(q7baQFj zkxChfy*~<*3s`dKwuMk>zLe7`v=1p_L3^sT_X;*afF#Ece)YL;9Nq@bX1?^Guj2<| zyr~=Z?vqrE1V9)96lHfMpA+V!r$X+;9Ur2*@i+)KY^RCOjPTvwzn+cTh^M!TP4i4S zWcSwgFu=!uOY2-ZAN`7k{*|;2PqkVBowNsf!V)(gp0}#b4SV);>h+nguL0euZ@RJA0;x0 z(kRfW<~A%6Ah%?S6p7}oEKDzSoC}XX{-#4jgK&x;H239r-AYW{&gAggdj^#{A5huy zgq5GAUwzXJV^GF$qE_J$Sv+V)ezi-`J#a8TnS2rY%v4)K8E|U7sGe$3Xk|BRFu#B` z@@rFrofHKwONFopJh7jP2}2YrO$uZV=}FXbtR?d_WZToU zb!Rg-5izS*X2|o~&g<8ye=G90S8{&_X)kk=1W>RT#ky2rT0}o#f0pUe1pibyp-+LG_ zOtzrE@P~P8*T=94AFj5e>&sS)^da^>NufX$V7@5{X^Q8!FisZ6i3cD`j%fKvLtEW+ zCr^jf$fh}iIxzKJ{|c(73%(~u?YRCmY5buub#V@wZWmO$S_c>B=VtMbqHpu- zW)3NcPe=_7Pp{4|CZtot+zwWpK;n+T+^@-@%|Myu3&d9BR~~t=wq5LL8$6ong1e{i zmb*K~?yU>py5)!e@fd2?JN7kxR3^ED+)n4~!W_mkjA^kR-wN*!-e)(W>{q}&+kzh) z0^=a`SUY5g0rgSCuHvQbCFs=%S{`s0(T&e8Do~}1<1ioZbQWZ#v6tqFaBm2<$aV?% zPi|Zv2h5U-T#?>2fm(MEPM616*aXNd>;=C4)j)kR8GDO?Iq|k-_(g7v9i5&tR+m0J zVRtYH?d|m%H*E*wlHFD#{QP+zble?P;=tE|odME_k%(qHYjwnnl@)gS&9ccJ3h2fz zZe+l+skbkx2Xf9n2aJ1BB2kk!LLUqF5(&XYOgL>w$XUnZ&I|aPaFL?n@+Rd1(Q=XQ zh2YAWq*Z>!KfjE-ec-QwH?&=^!h%Ea zL?o$El*&rzx}JH%s9kVVHl%`n4^M0J%7Z;Z&bUv-S=pIkADBx2C;8$S;UMN5bND zbZnIWIHwvsSn zKZ)p@gx@cDas151f6;an?mhjshIXnia?tl~-QAPm4e$LW^nNg4#*da%ep!7c+`k5{ zd)MEk2K{a5aE1?we@=glLa!N(!ohY)oz&gHhcQ-~5Fd_jPKS1T(S&Ie;(s+tIb#yX z&0jE2PT{aNvw5Zlb&mxJAARKgqmE^bT<;$9C?kQKRp}Zj!+^h@Zzn~o#8p%REqzT) zV`(t@1I9R<;LYH{@O~iKM_z9B2L6ai1#RA0_9i8_{ZGs15Ny{KAokWe)=lqk2x+b2 z0)$3-p6s9D#?C>@PJd>EK!E^bf1e=#$1A}1p7RbXHz$@WNrvDk=#b}DfXn70Ey9YS zGbvFAroPx5fp+ge#a)kUbR^IPfBx{>44UK_-QFC*e5vC~M82K%95Gf>+8p))WCD@c zVKa*}lJ32QCu-i&6HUMg3f{%;~o^+Bk%ECplw__+`ogA)7N7FW6cE zv~efKb?3kiLVrs}cDzBq{uT>p^LGb1GuVG7DN0=n@`fu7@ZsI9!@^}o8)(TQp zK`i2U(!j%-SK@+O!;v_@p2UC^FZ7QkxkHq`Ik3Q>NF=si^P1!>m_x^b*^4y(oVh&p zcofI?d9|J11sMAUo4uR;>w`&>b4(KU`qh{uj2}op4c2|rizNKakMDDlVb`?O8`0SA zknotcU^P+a{V&GM?3iIl)h<8yfLkq?lsn1-<77nC27jcR5fsN*yNR|QUk+&U&$f~e z8>YRNCP#FWwbhk zs$THdsT~)e2W3?X8Z1~ZIPh&)=@wtuGs4?1<))39zwg*@4%O&=1nM}3<2{7*Bwnzq zgFYQ+bbap#QJ_v%(w#Os}&3Wg>Ik{>B7=Y%>I=u)PYgGO~^g=RK|}-j9tGX%R(X zMG4hBmYHNx2m^(6#r>jxj=uU}6s%^=Y(M6Ec?1C2x4jjDLQcuI zTe0BXkGHR>!G-&_t^+Ja{fT2E7KF6WRE|VQ@z8EVX^DRql*qB-e*~iAUQU^15-E!; zyp8VA^B;`(gb3d0U|};vi8Stb;@09{(1NA)mx2{0{NAmaO;)2)CORL!jmG!PkTTI< zm;-@j)_pB(t;FQl^>3zQuqul=o#1F=s_#Md-F{-73K{)LTCpFxyDsd?Mu@K8?>x=h zcYh6fMU2pUXx2Aq7EFw4vC%Qv%7qhW>4^CEgAc2u&d)z1M+GPJRr zQ=5Kd(k-big!O8MhN%W+=Bdr{kqM;QmTS-vXKgQ%^q)M|Ow)e?()hR{`j51KU+~VB zv0^##MmFh;Ok6tu+XZ_x5UDIY@lNa?fxp3vsp^{wWXoP-)YD*S3f&I9H=n9+fAxi{ zxVs?WEZt3Wwm-thqdlEbG&^jh9#&5dXN#;^tGt;=8CEl@k2{!nLz)|D{sGz z*o}apHMs@NCSR1rG)FS{9oc`>&Z7JiQIE}t`aptwTOcsIgNbs@r-OGgkb9Dkea(im{6`pMd3s$|h6k1n?4 z`lzsUruccLxt4+Vb+KEJ=k0;?<3KF5#AN28*pMMrKA^7LQ)gm|eD(bk&Qol}vQSzu z&+o~bOoopl^ACAOLg~|OAZc@C;|lteFln_m@syad7-wTxP-KLQ27HR>sa&x*R*1cK zogGnohbzqT0Y`tOV}5A{96QB1X&chAVs=>?XZI3M93%RR`8#!FzZbEc7B0p>+F-dv ztSMFv%aloChnse|{dVGCR9&_+da|U3{!by;p}UDAys?a_k3_<;LyRXB3_}Y>&rMzg z40$o@ACOE9Zyr`&1T;HnmIYF<ZInP@Zy-h72K<9>fn$`f-k-;pQ*hC7_9YIC-;)p&$iI_CnY%M_(I=OlB zuR-?y93v<+1KE;kHN1Ka6^{`z{TUr26s1SlgBki+_4ZkSM=6!^7IaQ^^mD>}2^f;R z8tiJ6NRB1D?4RqOt3o5Y0`yLq!FYVl3>XO&w)GB{U^ zjAr671UcsXE;l0+=q1H-;?^!4;Mb?|?34|vSd$}A;6rr+Jh{F-L_#oqjZx&Yl2WsO zHU=9-kM$f*-ncSmWa1g%q*nIiy&dQ^2kPsw^AV-~;yArk!`W-uOjj5~ zPpj*rEp;h?*@cZzo8>WRUV=}q0a*L7ovJx@XV3xr4I{s}g6*6{l?}-0>?~ABllY9} z(=D_-SN)t4w3*1XFigMG1+RtyGq|T8lf1Z7sG1ofIqa=_O_9SsRrpH3BrGyhrP9s} z2q#j(L;lI zE9DiE)6v#%Q5N2?#cjl)gNceINwE=*`D{86OtAc*;6?~hsi203Y_L(4H2p0vDkFw+ zKL`1zJ8Oo$8s$bz=NEf*-vzn><5Lt8eGMeu>jj;V&N(2-o^= zBIxHMiWh8+GU3q4fhzX5AurBZk|6(&mBbxF?SLv=wXZtaRfm)w44kgBR6gxxvw3_J zwJe4XK9nYFW1Jw=4~CPc9{nSEj0*Y@pf{D7QHhPzd?PiU^FV1h9a`^D&WwQqr5Pn9 zdu+~a018eGLssFwlKszBRI)#IAGD8@!jW>k10@O56!HiMl;N#PBkv6$@1AHX=~APm zDpO8MIIMqjCb0{2eSV6}{~61~7&=fEVY7b?JyOSNHR{Ed@uio|5+|fQ_$_!yAJU)J ze(m%AQ~3VUjTF2}>=0AO#$y-gS1A)8PEdSKLgINbB0*G{&05jQN>0|IIO-t+V!f|Q zPjBa}b)}&&Q=h_M;T0$7tc0{VA~GNcN9I}Yj(-(#4LVRq-ytCT$^?;fVb*pFFq+Bn zB9hJ#7Mi#Nn9^kZdw6>t+yW8>s*U1A3_hV&%NmK_7d-SYHNC+2g#V4GA3dP^-4_x^ z+i&Fc8j&?z8p0Z1a4Nbw&Inm<6;2oJwNHx>f$Lc98lk$Y70qseilLKbWl5WsjbtE> ze*JY^9bb!{Yhz$QTsa?zw z@j2i+Sod}STNVN)B2u=`1~|jVEeX>{Hp*$~Aqs1utQy4yQ8#MBrVgO^h(Fh`P^-a& zfDAd`B>PU09)xAmM)RRjd2X(1RqNyot~ArZTwkOBbRCFOROJzuDC_93$@~6HUy#%j z*@}zLrdpMdAQ<|nD$+J$NVYjMZm6O*c;3T4Dd0()#3jdkcU((H$6O+-X8fgUE2vaSAChb#*>++$$7AwBffzr! zq+V!R#7l+w!d&{QQbGYRm$_6|Hw3DaxX&7bU?pY%6Vm9LZgZ2u z65>akHHgd~rHo6hpf!DAd2nG@h9>ZhezTgm)}xcy*JSI9vz1}tSCeFT!3B$=F0Rpa zBZS1Digu$RZdQwwB#28gAToErNJL4Rpmc_hHX}`%^}@VEtXM-k^=0w-x@|LH{ImJK z?BT`Pe!Mtyue9HmZ-Q0f6YMP>+`tY2nC?Lq>>tFn-Rl8J3PETXNe58Gu!GoIwOQ)| zeP@fmVfsi%H?;(NSoc`^Wa{q}6cV)P(PKXQH}F$^VCSd;LkGxf@=7b4m7U0tNIe?@ zXSmeIN_VjPRPqtV%pvD58wuhgEaHANWazL-5->VZ$v-%BVSH|2}9&3pJ!%x@PsXrcmt84;DspD z8+4L2B$qV#?ZRbTk922eaDO9$9{(^MsCiO)F}OR$Ma1PSS{!vfjf#JmQA)y!#uErK z7$LjM;~5G~;v9({e)F7u zsldN*x`hMzUv=&Trjl$PcISV_X|uq`7|)_=ECL|CDH;?E;bX{DHIP;b`0ZE>f=rk4 z=LhJNs;)6=m5{`c!^?$4O zCJGEm@j8(qim~{NwUUe$1H}MGA@O8^f_*|MAU~o%6)S zB|jQ+{qOJ^MlTG=pnY%Qh*>@H93j1#G+h>Sj~kV>=*6?j;m*aS@FW*7&WtJYa)4HnLdj5fd{ibh!&EZtP=miZI<+Z!e68&%@+7WK8F zsBlUMVdnXiqje45Roil48ZwO+s+KJ(51L2lXs3o|w-Q;inh)MTl_w=Z@-Nxkl+00{i=Upcvgy~N! z%hU_!Nj-<|+zeV%GW}g<2xFPWyLF0*7bXNFFU`}dWSLYXP^3J{ALYc3)>tc9*FDJd z<=`u$!>f+9WQAl;V95_hxr*!?x-m+KZKY)MIEx{5f;s~#prkp_`3FRr4Cw^Y%ctV@ zCFsKe*%AEvx0`fP`RYm%$if+Rv*)IzZ6q-RtYnDoKy z1;AT9F+1gHDkrk;jC^cDZ|QIP_a*uG%UGVI0*>>tT?lZHJh?iG<; zcu8|XIb9F5b{3Rl-DVSPgJ2+AaULPWI zj6p)A9IP=EHO1Y+l{X22@f8K3iZ#)NB?;}5QiH0)&7hA39cPMAQRGWOb)BGNu4Dt< zkPE?yP~=||gXL6TB`%?uqAm;EQH5m;?siab0K9XD>{DzL>W{i7WXrazSm9Bnj|(g5 zlJ>ue#{K`RuJ^ln(Vp6D_3H#T&fc!cHRDRMwNVUzlWrGI2FPh!3iOUu7m&9~K8xELF}K6)QH9M(+v*HcODUq-7@K z?~9^Ero5{3&lH#4UoeBH#$X&YDqGj>BU2n+^XBfOkL5Iewp`r%J(J=np0! z`=D0Ya6y?%1|g@@sA8Z~g+JjP1^@V2Q0$*u{K>!U)Hv{b3bicY4A=A-SBcijyy8>Y zRn?{IFwtr)W!!454xC%Bn4`g8$KkndgHH8}1ISn$6VS$`w3|*6PmO}W9Hvf#M~$I$ zt90VJ9vFPn{1^X~m`r7_10w<4%H5Y#zy0c0!Nb9EpFvpgq2SejMI!0_Y?ER&B`~Bt(m#Fv!BR;W$;b0ti$PoVmGJn^f^iedQ0{=P!zx-dz z^dGF9ac71tM0lo=g0!O_O2`MFQ_+1>`U!<;Ijk+ol89R7*&*%-Eos3rSMM7!(_Mj61m8f#OmrWnHKc} z5*(9L*LnG^{#DErIq73JRXK2;+l{W1dH8u|{_|YQuqum&`r^b=d#NK}ny~VmP75V{Py9NOe6EZ19oyXAftikv zKE@j(I6#3nQ!$>)J7sYkQ(!5Oz~RyPUrkyxNXZScu9+rZR&ssMPFf=>9d4f@>0>>13-jcbk)xpPH2sSQLxH!{b1M`}Np)qdL*m`*2af@taQYL8W2*H}W>I`~*ta zEmgWBWdz^1maj-jxmsOx_1fIG6kKu9blzD2hp0<6UYC);q+5M$a>sU-(m%!M6`yDJ zr5?P$#BQI4-IX-ge+5aiIDGMVzu9>55euD>%ICLtvRC9dOk{Fhy&Jv#Ant!Ph6wDp zE#VMGXIZOj#9ax2A&~~V-SV&7rRD||Ez5cQ>=o)6GH08i`g`GJDx1AD=*^a?1-H9q zvL#jyuYqcF?XRcJ0ysYBP9@fthDQw6G$k>o=Kbq&WG=DyE0zroq;XIB;zh@o+w)WP z)!Sg}ruFrC((zTk=2hte_32BtwnDr6eXi*JYe6=a+bLJu-nZTx^|vG3wRMR!CG44z zv!AcakUAVA6mAZ6G`iWcB}E+#B*b}#2CSrt*wRd`T~+)~$*QA2zU-uq-Y$X0YRiqC zFnKZJGq!$O$%p;9Occd#xQ_~F6F&}nW}2A!PQ8A*$t+n=Uf!nUx>J)B?*XUjdUzj7 zoR5iHErW9Xj?{%8+v_ZK8lx=(g<5tnr zmVuwF{GYAZC@U>n?Kc5PF%bAcHSAwX{NE1Q6&Jjdi4gBl-{xP`FI&Hh)qc1{c`?j; zE`gjX3Ku+RczvvPNpRze`%xTr^B8P+$K?L=vA%!1evQn%bGX30N^A7F+D&+QWZ zx>!Ze*DpZLb67)8bNdPc4e$`kgI~7B{T4LUgQ~=WxGQN}Re|c5q0o6$0VAAgJ_s=_ zD3LPkTW&1UBU`%aq8!;*Jf^cLZMea%(3Fz~H*k6xkU<$6%u_*2CyD^ZjQfZZa;3dW-7QQw9OpKo`h`xbU48Nq`HiiWiVZ zMUOkBquX+^B^oO48}jaV>t{k--~$%<2HLMfH>dW=9k)$ItCt{n)p3 zcz)g_Ps`_dqCijbn*~Zn3d9th1s76>{KwtgpFHrjHiqrJGQ?i4h;6(f!|1_? zf8L<-$4ZQ#R}hNw#Nm!1Ua^3hG9%^!I-!bik(#fPN)*tjW8Q<@&d=MpRvw+eap{MJ zL%@UL_N(w#I-)RgjygC?pIPk3ON9gAImOcP7QZ@|&EauB;l~z9R#kBn+yN0tef?NF zNLqAg6zG__Wos>uZE`k{LF(VL@$i!NFU%D;xk8=9DVGQ>QAV5iZEWzl^X^~ddKsvl z3v3UObNto}YaA9QHLZ2Cf8QJejIR4D?`dZU`af04rhgSIQyU26J9mDmV_V-N`ae5% z-ErR#^Z^_|q&)WVyZr&Lck-VX(dfWM+m`n*hnP?j3GjP#b(2;#2oMaDZdNe0_`_|8 zr=`41tmWzpdwkG1GEK?dHtaj;*py$XD(eXMHy^+kwfPM_qp)#4H1ef8!EzPwkmKdG z1{Z7uub4cfuHX0sbA_fN%*v{#0Ii1?-B)N|Vz*aV?9c&0>4$+3z(Z<|$92hnRkI-3 zd%U57(Vwe3_}#bm$al29<3C_Nfsga^?~d6q<6t?@&;cE4a%0)jTs7B+l{|9H7EyW; z#1=BlxNvyUZ|$kN3jwxS6K)O7mXfw}UFw$}_D5}CXYo?y&RESIyzamd8}+;aCw~Dh z9Kp{AI_9a^2>+OBB&Z!?gA-<8)%8nEsvkiv$xAR^0L<5+nebCj)770>%iFwTt6%%q z!z@bHLjh@;yZ8Hz;k$=-Y$Y@`##V&}k>$~jN7;!l?>wz$DVN=WrS7v>)4vXd8om8C zHGzHbL#)^A(1jG0wm9xV+Jo&$U1ef>d?_f=a2>jwsfKerV3^h_$2qs;BouZBK`B`U_UU1h`d0@12) zzayu+80L838JIoqeuog6WkiD|L}73Z5~>Kd*B)c^`((I1#fAzGXI`z{hWeSzd=Ynf zINX2vzPEG(Q*Q|_u4+QsCqS$`F6y2QT904;EF<>6W_)7Q@L2en|9Jg0*gqNc8+u-oa>>7_UUp-^#7TC0q zGUMl*iDhB<9h2Y@7}_#in=M^MTj?;kcNl1B8#ho`4b6`52f@PSF3KjO#9b%UgrKF? z0ijKMTJ<@8lGkgR^|9M+I=R5T>-F8p8T|jZ4gCMA#p!p2!9H_+^M?cN4!%p#L1ZPB KB&x-J{Qe)zY2c3l literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_7.png b/packages/frontend/assets/drop-and-fusion/keycap_7.png new file mode 100644 index 0000000000000000000000000000000000000000..5a24307487e4a56d6bb53f39aea4f1568770bcdf GIT binary patch literal 31318 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�pr!q%q7zU$?tNZFV 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/keycap_9.png b/packages/frontend/assets/drop-and-fusion/keycap_9.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3f638841207751545ee904ef57fd327fd7b9e9 GIT binary patch literal 32483 zcmb@N^-~nlu2=oQC#lg#Z8m1C-^Ybpv27`T~EuPU=zKZyW)4 z@}KWY+!Auqqv^^O;HWT($gozikiH1PxPWZQNI~m3)5c?yD*A>-345!^Vr-0`z{L4> zv|sE*o7+Jxk+|0B$wYKwToeD{L@oT*uI;TX>fM3#Jrox5{%(3`F!P;zy9`}?*}HtW z^gq?TSZ}ZWtfA+7**ysJ$s-(&3=BXL`v2^9ZH0S~jzqa1p&g|*fZiEy&K~2pFMsp)gh`p6<1i z@;p-NvkpOFRIxKKvS zuM)&G$KNVL9gmgYY3lBPa3RFMg8qb_ry*~5kp*AI-DyBF*`UP`9n~xy@DboRcxLU}rc;pXX z*Z~k@LLhNP&llo7jROhgjiU4+${JgvzykMEd$($%iow7IPbz1>E-!WC(z&OqnZCw@ zdS(-y?ZJe#^L<{|1kMHloiBe;XD#7dLixK|E+&e9I(?G;I#TjGk)3~>89->H*pN>e{DUT$NEy%ZI(BNoqCy+Y9R=9 z`~=At$Ll>bYN^(WmK${0h{LtC*AtMbY>p;y_2h@q6nrYbDf_4a;-A#C0)Lj#^hoTl z=&%g3;j@~%Um>jH$&{eMfESAok|5M#yT>|`aLMaVN#M@xP436W*PGa|6z$*O?R1uM#PQ*4t?ctD@B;prQ0bG&9%I=lvF+_al0sj_WLKR}f4RC*U z011EGW`>=9)(AUcalh>2W(ua1$o%VX)fIc&1;+Q23f<(|F;_DVWL$a?>b5-_sjh_P z;0+IHsQ`ACmOb|0)LXk++(_Jowl`?)u#NY+b+>C6Fp^wUasoqEa*$OoGIJ^MB^D|? z)E;2jfjtsLuw#28i{N?5dz9Bf(Rbv+zr5(Z@pIq6Ljw=1a0UT4_eafvdy|&5?u+)? zA*qS(!=V}cae5W?Y$OK4MvI0M3$8uYv5*dE$%dD>kNmD#w|lp6wVLYE7noB-dsp6C zdRsEMd;Iy~vT;O$@!q^XS8-@-m$o{_I8OF}H@XxX?#6GO9#RR#kt4C)K0;A3Avrk8 zpAJ|O<%nRDkM}+IpnJRzOUSc-;R4a6`=UtL`VUHRAkomZMYRFUQlA6h_s{&0`zcNJ z{T~?Bt*G=Z)J;<-9o;-2^)r9z)mCafFNbfTUYRjkTe0fx@np|sE@wckw`DUgtwKs6 z^>W@R&ZQQS(NCk!lBAJVMvxi#vCg-Y#xj2}FT4YG#D&%B)<@33!^u@h&(-^I$*Yfz z=Iat3RPlha4=Cu=eS6Cd8xNP43>dB;KJa62vjONc`>O(2x*V8uMFyrs-K2Ys>=fas zTF-d~F`8L@Y(pE#@YidT?*$Hi&t*hw4^hae_rG*^xA<=RHQ)4$&2mL>0 z8wdSE8Pw6-x?ut~Ho9K!2*vOHi%$gI`$T-M#+pXL)_nuxBzvA3&`3ioFr;$v!)TMk zs~<=6G*h1=p}{JKXuoPpdy({%V-huy4KJS1Xw-R=7;zoem`r6#L&{1(tokHcae~fd zpv-uC$wIMQ!Outdzu>a@GBeA9_^39D$5`0%$B+c8;snRkhId5@a9-bDw&UHyNHanU zY#TkIO;DnaKJEr?R(C?5eQuUn#p)hFN{-9w>$Ho_lHJuw-B?EHWoXeZ^%9OH|d_B-ho zwmNmT7dZiZDMUK4CWIoFH6#_DKrfG`(@f7_#QK)E47?iqU% zeiq#c93L2>9ogFONU}8HHpJL@?xYA_(h+|@@gB+hh)!M1lXSb6udhnK>>+!u_Si8M z+8R=x}(dw`!#x7x5byiI8&^&adCQALf-O=#ha_Y0LiH8`cG4WYI(}h6F zWC!BlzF;o>@55i2#ghQJgDVwUs={yd8R-9fGIDq8V~&G94MULwxAWR(;pr@Z=$-%* z0C5+)9b6K6@SZPlyX;v;InY3)V*O}4ygF(6lT zLs=?mnpR(4oo;kKzvE}Ca*|nCJn=RCKa7wt`?6_b&zTxq z=i5TA&nZW*h1c)o2N(mE$cxVu_@jgm*S1vmQY>M2Pk?;4O~#1oSeZ`C(t@m88|NC= z=z4}u`TRD5um~8v|5yc>JK4)st~=WP+g^Wzp}DvdG}{1RwOM6r4W0yuV<=cA!^h4C zg2js;iTZ4Msg*blSw8icla?c zKD_=Oxf@WqH^^Ed% zKZQe2#xE^0w#nMk(5eNnXaM{4Ql^NTVi>A0V|!+4oU2FvNcx3j^)a=I`Bwq&ZM_eO zJtrF>nMagpS&OrR0;)zD$Z3>|-^te3*Mn@2>s3S_GL*RoI?y;MnSYkIpy%{2h3P^J z+Vyq`Q#?&vMmiYpdBR)7jai~31>}oaK*P%Z&W{cIrHcw>8m`aSBAE_>K2N34F0QG! zF`=Ko;yww0`-h5wNcYIm;zLn854*ud2RD?VUYn1keUdRqK#`|{kMp-9jDf(nos_e% zX6GIw!w+|X=TcPN1{>|zU#e-oJyNVUw%l7i?OpyI4P#bFkb8WW7wjJtUHYZk3hJT0 zbn7)qu2VHGXeP^Kz?e?N(hzLH+4W3}P004g zYwwBEIm|r)Ou^!HF=&0sOi-xd#isf+kD&;_#4bsEMLEr)ecE0I?V=X-yj=n0UQA&I zpoQ9YxiT8pbRs0QVtnxH!=~gNX@?;9*X|jgM6SnX9%JA zk;gE9R9Kw(!x=T0Wot@hfEQxk}os7xX>csF7H(i9+EBg(W8< zcsA?>*S*Vc%EIR}XaHf9`-Nh*q1!T9st!q3)vT1U?W@=~b6UexfFiY3DO*R+=rw%^ zOft{1M8_14_?3=LiW+5CS)1Oo>IH3@UJ7NUp~8^yg=Z9!AM}ryi0k+3oHpXmb=FLh zl`ky~{36W*%(6@|zhh410FPxK?>oB~t8nKBM3DW8kJwD0;R9`dHh0j+Q&Hjq<)0Kj z_mRBu>(@HwGEah#n_t`-gJNPO@ zD1C;>58Dks->%5cV+=!wYH>talS`cmFSiBNo4uL*xU&N_u^3QWH61Yu&x-U$sX4_F z_u`9YH8PKgNbCzxkpR)ECw5AV6V79C?<{Vb(^_#g4F(XpHT&yDW9AF(t-kfF7eIZL z_Q#iW?VSD323byD#;Ez!Q>oJriohPSU0W%9`W-bGEyd?;y9f2uq{ovtuFfF=35^JJ zzH}3IcQu39pt}JwZ@&Ntdfn&2@2x7=;+u|C!mK{~5g?J$|A4-nAT^Pc$w&D4$FhZ@ z*5+fa^#*HUYp8-qb#fyqM;MAItd(K_Gyr0et zT#RJOQ6S?n+r`{J-IFnyLgk}VsDD_ef_ zFh0Vpl2CLKy%_iN&;3YR43Ji&o=QvC0xoTT#i!I}?H^V@JQ;j6L@y!Rw#5@7LjS}F zBUTK%iCzpuhT%Z3zT^}c>g(&E&z6(7SK?j1vp8*J$GT~q z4O6WY@Y!#n0yN=iJ<00;d=6JE09p*@GUtuFb4<+Kx(uw^WzK8=PR72uX6BN+?TF20n* zAX$00jJ$EYC_<{z6pRPmB^qJCBiU_p4bXH&E@h~uFp@pSb^{bkOQYE^@npi5)H%?8 z6KaGUOD8MFD4Kuu#$QeXwYAypI^xJ0eMhs0`^+YZ;Te`}Te)jb6qCCmWdll`4$sUF zV3&A747cD93M0^WfmaW!w3i`;nP)=2;@n}j09h23-Xqp=Ysw7D9K*aV=j8zc5)HKO z>B-zmx~7;j^qFXlUD7EbHSI1VhPoIFi-vW4sA?MScn!+S**+wvPsGnF&SJG3R?2IgT6iZ`E|hG=vAXrdm@fOjZ0mVKdGPe@QdjD; z@iCUOicTLv=^Bw~S&Si{JoDeJ%`djABL4nnhT;L&*^3baDuhWR`sZH&lP_qrT(1L^ zqQjTffaqSB-9Q_lP5L>UL`-yy^AY&Bm?Y8r!;ZL}tbP#U>jdnWcVbA|f!^5QU(djU zY`vU3tuEc=dRox{-4+&ElY}GOL6OQG>H)tj1zjlFiBdUs%0Qk5EvuY_>kpwu9e1*y zm{JNOwhtL)54q+aZS%WfVk%?}{x*uMYXJ2B%=QPxs|{0PlJIjPW@-{&Y_ZNQMFLr( zI}c*)McM!>WvwL|Ty?Og$10a5x*LPAoUGx5Q~DWpby4kF$wRq&4AWWS@nzDLy_t`)ufqYE(r zjKKswrS@%d9V(K4H6&Xz?+s2Hd^k~H&25hwnvj}%bsdFR%#gM+1zTe0|Gh{H2~ay`^j&ktUe-Zz zRUDQIXU~2$k$`)yW;J_P7ug@<59%*=)NcX@Q{_?}ZO#`kcbb?zoA$~t_R3uf4Ts-x zhQ|7IQg(0jTw4_eqv*{$*;?mO{U`^`*bnb83vybI2yr88u+au$8W0np`IQIwqrZ z+#Z{lX7RBXO!))1_t^%s(cNR|G)FX>*ms7hns^DProV}a5{`CF(v##bY<}OFX`Co^ zNKd3a$VQ}IOtdkSYcF_Xu*Nk9k;`)!aPeiap}-bcjo?V%d+? z@Q?pu>TJ%iPi-b0rZaC$T$tdV0}P0a}F2!lToc&blCOWs>(8P@_fj>t&b zH!EY9(r$+I(HZpiS++?tmlUx)z!7<&F@tx?T&PCB2Z3K~*`T-ar}GKtAjLi4Ya7)2 zkjqS&C<1$ulHNMYS>?#wPE;jKpOz|Yr~g=8=5z8(he`*IZG{YEgOe-?kLXW?ie0A` zW74URmzjn-d5f44Njs>0j2c_;f%Q~>KvJ{&LEu~cPHns1LTj7xpyL&>D@t$xEtWw) z0(<~Bs%#vews!V-W4G+!7S=9ee;MQAqAas;?JZ+qoXXSUrYnXiaJ74kFTtmdGT2yI9GTB*`i}?_)AQS{drD8?Hf0lo7Udj*{DwLfj&2Mh9AlNJ2>u-^;H0uAsIkNNqt&eU?a-LcY>RJXaq8B)M z;Y-%t7&~Etb~Ck>eGXJcRbDzQ+TC}WXLyBN9w8puChcMZV*Kk4Y5I03RCaL%Av{j3 zNbFbaM|eCJ#NFc2Frtcp8-j5D1Fk9wTdpMO&M$jOEP;IDJ_FA!4^ri(hr+jJ2c14d zF)PaxXoH_9F^YcNv9nhTZJ_}t+p4Q-$5b!+vl+)H!F0L=#ql(k^-TDI6d#6Q6MIoR zg!m9+h3}WoCSu>Z(`E;dJHbao!s~! zPXdzroZK7tT2if`V)LZ9&!hq#3YJ<-HW#k^tgkbcH@vyAZKXeZ#94U^)k|%b0HyU z`9kuI=k$NP`fUsc4##!|3$Kr)=*=3Z2+l+^CczcI`ANV&LrLN%X#OAn|SAg;yiW_d89>;XVvu;aWE7HYQIgF*Ra=B*Roy`~iqLqWOXgpkW zi*FMh8#ool<}-~bZ!-A0Kj<`mDm<|~Cb=5mbv;Yd?m#9}wJe4Bh_Wg1x9jkDe0f*(aZ!1AAhPVKq` zacE*pQyP>ARYw!UTQiY_y3RQf7^0#(N{uk|T;O5Bl}|6WmfdbQCAcm^4($Wg7{oSNVvIDFRw*4@bh2dxG4} z=K#F}1O@gfMZ`y-6MBWjeJ%|WLE0uWQ&i1F3u5VBt85Q73E{`jI$XaGx+U=ynj~AD z9jkw3$S?#(+SIJlwsk6X=YpV@LqR}IcAVzHP6vvj;=?74l|C$ROPtLXI zN_d%1Db@i&y2i;B1)CF)J77u&8Q%~!Hdn#FGHJy^T80!G$@iKwA(w=H$uOkGJoDe| zO)i%!vjZGAgDvgK_>Zdk>UVgtfv`2u!Y;l`Q)h#8_Oe8AqDXNvxVbPT2isPn3cJhN zKeoJ|y-EtLMIT2otp^#|2M}lG=vF7I`DO4>Tu@AV9YQ(9@k-gLusP6&?@yBiuk%FR zz&D&*U$e~oskePaBvTbhg2!UYDT;fEB?#TX{?Uey-Al9~kST5nj{`B_*(stRaV0-m zNb`)%&UTlIiKH@>rZiDY9iqD2iZy}iyUj1`W{iuxD+_22ZxH*j-$)f&E#cLM&3&^L}#!&sWsJD1Lcgq)H z;QBT2^|ub;^>rr4LgeRp76Yg~4NG~e9Go-yB#s-Lg~+GXL$f2m*2BWMR|el^|Q z!@uwX7QJgijxfG`qmze#b##4i7 zqb|I~^I3($X#c-zKC&u$q6iOpL!AAqh?`sB%P%ZYkYViW88yk{BqJvnafBbf0V?O` zUir6?4>j5Er7cI1M_I$(IdCClV$VpggZ3PVUi0adCO)IWNOOYNsT~O*UD-{aL{p;~ zi5t^k#kQLD-5*;a1Uay@s&9=Vp!Zdk6ij+0IYfHdE#b-iwiyKdy$I0!eh%+&9{NJE z_a~r1^((&k+Rcf|#CYEj*3Z7k(#7la_aB5}X)749;E(s;b|L4+s~&vb8C4Wa1CBNr zk-0gK0)34w1P$5D=UNgp(t&qV4-h)A1dvFsBKnXhQ;;~~MBmv2NAbxIY%IGB%b617 zT;|-SwT=hBE4hSjQtGxV9N0(!dKVlx7r7J@e5Y_hg5pV<#k8oJXKPVy6>N@RU=P+k zQj_N(UQ-v}#!xR8=AF{XF6_z6WD! zHci%WpFYpm%6B4GeH!`gfE1?D6bz45r+Ghd9xZXB-V)i=T(K1)c!O9#sf;|B`;C8j?3GQk=D@qwn@5wshZJ-=JenCBsM#fVVVb zG#HigFDoK}Rnd~-f-l8YB;RwkxFs|9+l75^9Ou{-Idkg3#iwn>b6s#)Kn^H*`|?Bk zxcg^4iY+MR4OYbl+dXj2?HukNGD2l}_v%0f^MH(%9t_voa1=Zc;o(|>haExJ9Rtu6 zbcBB@GgeE;Ezx%0x7s{@smk5{nY-#fnHpqHU{j3PbN-$%6*>wVLb0#YF$r z5hK0Nf(>)bW<8>S=V%`95*FkxHF82;YN*=A0@dpE(^E91O zoK^ml|qnz?(u6B@*)6|R((mkZF z#6O^Q#fgkZ*f0p?Tm-|_hx(|oNA!LN;Ucm>JBNtiz!SmFpVG|OPDs6=?CKZ5??Z{5SnF_KAX;>@X|WF8L;+ZTL;qj4(%N z-3ZzBymOsT)3V`WjENS=r(!?Q`2Q!5eJ3)@xFpe7hK46^*rRFj9J@hTq-EyP|L*N745kjK|E5fzN-jNum7W<#KVsEWhH`RVe^^RJUqH&XQT+I-Q?Q}AOWk{% zBKu++I3rSNbkHKqgEG%m^?c2SHPH*9rlq_=nI@yl7AY#mA-f3*ORpX%mp_B!g}ZJH z-EDn5{zC}P+)a|>ul&J`tA`$`wvu{@S`)v^5*4XnvRoq9(?UKJHRXTkVqd)%r9?5(vV3NE}@M_E>EOX_-bGC8#g+mbm zdy&0eLM(KGSw|I)_EqGxrX1|o`}~p&=oD12jD4a!Q%5s+oD8x==0Mz zHnNXJpwa7Kna;%--V)TL>Bbze?IiPq6KVlOdCZ%?INE}?T{8BSDyBj+^%1|%n43s2 zegQ)z-Be$2QE@!oq7$j zM_KN7q{|9Fn3ft*TR2ziXQ&0at78Wz1HRS+V&kdavx7ci(>4*u4ab)hkku`&)I)H* z%4KxYf9|g~Tiy_3j8X#W_Z(^Qr*_tmN>7_}dxs`=)|Ni@W92?87Et-{6izWwK4pku z3`Q=>5))H#`qI3UT0qDyMK5o-zn!Cl=ggZDdULd!O1t$}A9a4+&m^$6~ zJ(>aX`spd~jY#2kf?D(IK7m!_HIy3+s*T^s@%k0=SuTro)sRuZU>b5sAA|5i4u_|5?>B*x90dKqX7u0b%I&w^|-x)^nT zdwJqz3X?Qdq+N*Pd*~ZFm?=*d0(=aW)2LwQhw*F*k^=4MurP*R9YC-B!Nv1qGs)yG zMZDFzNyw{A3?%}1Hny5=zf@G8%L-V}^~uwfgIe}lJVZg5mJ&L1p3KvXg7JUlzyAID zHC?93+G6;}&|Tzu_$A~}5f zliRrae&Y{rJ~Nwa5=2Vrw$!OgPW<-57B(kUx;QuGnpSab-1{*lQY3+^W zB}sM24V>RHXypmo+xVJkFP_<9!$KQT#l*G%<7`vDK-yLhZPkS1MBN;3gu6Jx8;s?i zIgsm$m)AzOM~D#L^aYKIEYfi9HkMiNq9XRc0&yiW4K+y5)=*z`yvZbkW;rp2d=5b9 z@ly>s2ws7MWax5kN-Sa8uWARq$XwK6kGZ)3rK#e3bnTTR5GUC^?AVS_4NGfZ13T}@ zaC{l}D)lV8h=~Y15%7D&)#T^SIAlvoRlt-)!5tcT8D;|YoKIn}B8^|-$>ZNiQ~vw) z6Q`1I4eiiKvwBmuVNSiy#d9Moy1Pow*xp0NsEIFOy9nBmmC*5&KJXgj!J%cek^7YO zGd-i2*8wu76pb+0p6&AaB+PJF0>=6^Xvjwr?`9sWz{$gb zR8=|LMaDJYO;8qgZT)Kv+2d=t@aL~j;+-egJ<}`K{SI?S5(dL(f9y=EIs>5^{Cdm} zixeki=3k@Q#ITfJ;sN&%vv4L@Yj&f-O*Q(Te$gZD2pv8Rn&w2cM%c&=L{aO5E9)Bw z=AOg>zvyq|i#UP}i2G6d2xsVw{=JIPYA}VFezc~4Wo&STY%9*~{sRVgzmfX(3iqcR z`;PD&)LP6v{+<7(c5_>peBN}_Q+{;iKocscQ7!f(nKT5t7V?Su9VAGXlT2r>gkyV* z7S|X4ARgMUE2crbLKKC6;!;82LALI^V=Y)^V%3TM(yc&?cTO9!Ghz}!J7ey!y@~QL z{KDvpIwh$Vw(#Hg5+_Atc~};$Tyr%0eO%=sRKOj73_}Vz7=v?W>MAHK68K;a>I8Ak zj9CaLxQOCn4ELVfHzTk$vDP@N0 z)Sp@exy`X}EFrt0km9r4*g<4eQP6y1+Fv40P8cDx;;!{w_xCBg*Po2-P(pZC$WV2} z0MtGF0qFASDmd0SiDCN!u_~Tm|JvdQoOUcHz1#uDUBI8pr^5KzzP$B6Ra(qPsF%h; z{2r&x*}_>tGm(wt@^1L&6!M1C70`h0qIGF2eAw^Q@w7IGIe6@KhkrhCCB3M?f z{pS4l){R*~Vz6wa*t5+7QrG>0Q$-C0*&i=EVJO9*mc={0XD=S6cg%NG$Yt7$f~Dz; z3GG6L`)}(&J~!oyC@U)BRAd1gX!a0*j^f}Cbbz2*-+a=cx*_-IFNw^rUd74>xgPx$ zwJVr=Z&YwZOG66wXJ5C`=yjSO;6SNV`BYr_!5>WCv(X^yRZ~%a_`3q}=$Rz~kvxI- z^y1UA;J2)uN#@-+;2uqp*krT;pBBH%-i72708*P4qf{~<%fu|0z(jRmm*#de;UkgK z%@xl%;PH3fTb09DXoDnzJ|wd<<(%7Rb>PPwiA^*8`4Hfi#jTV-?#55FRS8WbS%kbK zU{WE%ZAby8Xys`1hxbMke&{1e^sK1m`!`SI=FE;p4iC^Y54(2`n#x4K(IRqpFjR@v6K2;X!_k z(}J4Q&AfJtAYMQ(%fVx!LizXBNL2Vs8o=_<=Sg`xph@6>^qq&=c?e~0>8(0VP_)T$M zLvpGcwSylK4ivnK1p=0vqB7yoaYEf!k(5+nq~ZW}Z!eKBjzL>FksJs0%H_ZAVFTXh zT2X%27(|5zT#3sAHbK6lxZoY2;o0{Urlb7F|LP`zdr6Y>l#QFWvIHLO_qlc_nHsP( zI+)@Ep5HPA{MxxazU6aLhAObZ{QPCP^)lPN-NG0g?Dv_Q!}VDnh+5mKe{Ev3%iQ=a zDKd5?Y#eJv;B}MlY0Tat7%n(~GW=kL6x*Cg-jUf(tq`L>k*^@ZGH{2)@v8sJcs9C5 zvE6oa;3Lv~E9@6(tc=W@+CaH6hZk{)ANl_|@F5rXCqfX)yf_EdcSBg3Z0~p)V!XGU zB3e%whd^R(`+rUwhcaG8%Y?J*vlX+TXZ(^KzQN}(>F<{s_Bo+yx`E9Tl!0q&f0`6Z z4gQnCv;8iIAc^j;#;`?8+$pYU}ReI^@hyW-J;Y1GhGX5Vnodktzu6(qLRu??G5(!H*>Sa7~B{Q(Ku zBsl-TlTzj&9JQ6-F#6B)F<&*HcMh7P6;;#8z-jy>^NTp&u`1CRzY9!l$XWbNInVuCqMn+us9afA5QM~?1P4_)ih2SXhQ5rIXd~h0NIZPHCgPEGRcDA8 z9R}fL$z#m5c=qk!@%` zQjjq20+p#m#j>>69li^!!=#$i^3FI*#7p`TYQ-=5RdKF#wgQ=8>yvSHGy(T?%^{@YB+>79LSl?V@*Vtjy zc6aPFl-qpA!#$0#;7aS})$|4-QM-TT)Xl_3%+t#jJ+Yrh1<1~^0{L8ci2A96?a23- z-KduRWF5Aj;@$(@P#D5(G9QDFiL<1yE1d}w7OP2_oG1Pr+%UCKCU*anaYPcst;U3y zfL;Vj+bP%iK%|8{J!}p-UrGECeWEz4Dv0LE?26+e8KTwD>X15tt_uMnh!ye)^I)od`wQe|BcBF8Va(U(xD-kI;g)XubaS%6wZ&` z{kU7A6$@O%(rRF>4`lqVvO)FVVRs9yBX;f!h92?KA76?yXc?vHvRdfKyCtS7z?uaV zmVwNClWS)@L*d|#CHT_CMdwRf9?p8g|DgIL^%e>bD*V`;3p4>%f`QtOMaZTQLkF|v6yZf->90e?$uiO!NvTsmb$QK8A?fG83)yD^FVR~ zC(;Bki{l!LZgxU8PP3#@{$@7F7pdh3IfA>oK7FZfS_ErK*L`vL?Lz6{d=JQi#s;5Y z{IK;RCN_>Ov9UGWt0S)=PXQQA?UMxa0ao10Qt7S=Tfm#GD;g@C637ZvL{UhW-3jiY zckL&>wr-TGA98VQ*I_H6;{8t%XT#2U$8g&v$LKjXw36VEvdo#W*Qeu~Bf?`5yCNh) zc_@*ZxTNLJ8MMB7>V&`!@|RV2y$T^tYB6(XVrThajPtz|sr{Gauf6-tYq~a)t_1&0 z1}k;TAcze$W(WWC)E5qi(X`_|EwH<|c`3GR@YMEpzZnu;3ZMk&uTl5WTk>kAH1OU} z`nc5C8%bzkS^wLaF8+xBVX2fBTH?!m@li_5?j-J$ z$-EgCe0Zc|Ij5e*$Ui30d4Oigd}*|=8iFrTU#uNV*bk$9QTJ^GzbS2p@PI*4<*8u1 zt9<-&pMD6{PC%vU0W?k3o;(O^)?Saza8F1X)A+ipB6D5MMhwG5TPhy5;`?;e#q^r!5BH*dfcN_Jx{aS!?ho{>DLJvcOQt|d0514oxvJ7CjCmgM#zo$ zw2}BPp+vOpnQ54SBPz0(NDEi}j|A~^io?;UGAX^V!ypmsi z^M|QIiijrv_LrEzbM~A9di9ZP2Y*#*9KriSqBbCv;_U_aoWN~YBn z9DpE0ECO2BQH*W;MY%($-C0u2D#Yr%+plx|MD{IA^MGVx6-WM;X#=k}!ASD&iMa(} z!D6vtq#}`F*?HfkP9*ne$|sOB*QWsz}62ffXoypFPqKNH<5b%X~M0rLZwD%;f=clr>jsz7p^^UYTG=sDDXbl+_+ zU@3(;ACWcn3t4wGOm`%mXK{*rS9!PTd!!=GcRn!-2ZWmcK2<9aimVRu+SNZ1X~0qh zp$0sKs+S_)==hKO2gN$XE2A3!22OR@y!Lof0;O!oGESdEj#H|H#?cQkHkc05uFMm?uONoO>^E}Zt14>9 ztx0nSP6Z@jP6vMt$#NylR`v)MLlu(;Q0%+l1TuGe#Zp=Xk0KBY=w=|G2k|n~oR-TC ztXW$+54Xrn=7OswVo$1jOymC@{774@8nz?_OWmJymnc7d7%`+TdM1mtb}Ol|5T$|p zV-}urPWW;Gck8PE-Q=f0u|77&uWm<7y`XGtvsy#t6Mp;Agi1=L`Q!NCsM|(o_=U_XmT6-S5d~!w$3|w(!q>`UkfIgn%QYDiniUP00!)KY>~cx7J22U_KW7(< zg}iRboV<-O%*@A9|V`qgZr(S{W$YUyX^^?LPjla5r9vBP&R~ z0ZSfCB6(1iiqGHnCZ!UwDvqwo7zrO}Bx4`FzfuOAc$p+(20Tw3;L$X`y$rv|%A-o& z9d9j-NY;kU?ANIbvMxf+Cl-yD#duUTMYH4O=tN&010mvlcz88q(h!k(`4)Wr>~V%l zYL7-(YLfNG=JTQx=30I7`{{AQ&+nVE*+D}9DwaZi_{09pfL-7-e3X<`{r0!{_}*sU zzYduS#wFFPE&ZX=06LS1VB_~(wf?7w72HtvXu>MgFVz64^ zW3ub}k_GY3cY~pn(hg0?95?(jslR$*N;Q~fz=(qugAp~N_kEr`rKoVW%7Sv_LrAb7 z7wzMHQuOpHcSsv1CnbWtwsJI7J`1g+{Wh8n?_f-`Ys>1__65`!vPj*eURfEzp~FY? zoJ62yB2?R5H3ylf|H>Lem?C2u_D8^t0Apx9mYWi#|4fh+ndToZ!!83ndqUfc=fuk= zp(GYhFMlOuSIY#vV z*ZVKBe?%2pX#@k->;4R9`Z3Mpj~M1z-?_@z85hah((EvH&}TE00-(n@#kMif8zUZ~3 zYbDmm=<4a?P7f+95C!2(#TLA_M;b;Pxx-36wmLQ*jIFKlWeu?AqVV`!iQuwp%Kl=d z^p~0>#ks1pU9WdhPuoQeeU4MgO*zsFwg_;{i|s_)nE;i4QWQ$Ub6QrWY=Jg^ zf$!Mh!hu+U)S% z%Q#N+Ewk%(l@*pfUpv#p)ZT<-5(|av6}fR{k?<&sX-V31H$YXjI{O24MpkFppuKJ9 z8J@dQg@g8b_P!mUU8{>%DWV4JRdE15Wa4WAeB#0uQ!77SyN$fAL=txR(yvwd z+Q*=a9a)Jd!QmH*0o*jRjo;as>p><~4rVdgcH5$q1bw`MZruq#C?p#YENiRm5dN(S zaPXc#+g)V(gARv=ld9;zF}>g3vZ=YA<`p@i{WtMq(WN6|dj4@8autXP`FVrpdr%bK z8sUI%!XmaT2P+jCCz(Y!RWmlX@rdjEVcziJAnSQBhA4SGDXK;KqXmOJ0`F$2L}%VH zOV3ue!w63=E5E~0Coo_`>%O)S|K1v~s*K-SrZCQA&7Chyj+FXez@X|(z?UA)YL3m} z)7Hb<67Se=fv+r(fpA>{A^vtXz{q@KHkuVex9M#$=&L=bo6Bcz_}rLr2( ziv9Rq@p9~@`c7fOR3~5kolnxV)Dy9?^I>jEr@FgE&MK~0Gv~gHNN>%`>bhboxj2;R zs)z=_OSAN`UehXoNIjdN{>X)vrn8ujFv0 zF*7)fIC=1n6fNHDz3c2FCPkbWqozr6@n0%3iTG0|R?+sxg#pJRVq49mNMSS)4&tL~EJJekfDHjJ4O+Z;f~VG%q}X6|>A)8la#tK9p^l>#waI}4 zX{`^6!ABMn2tvbM*Z!v%Vqgh4s>c6o?Hso&i?$$qVt3H7ZQHipF*~+>V%v7dwr#6B zwr%s~j{6Gt4d#!v)*id+n^p04cCRL@Z15?iRpt}@J_|_V`osT-FH|*B)oAK+tBxB`bYc}-XbTWEi*s304g5vW*$LWAAPrVm{?3z45AuRwEj zR)1oqGlmG_LzN%<-6sfYvUus&?-x6z_HQ-bF$jO@x%&==0iL5v=yybBaxzcSyC7@u zVkx|IQc&e4<59Q_((S>P4z)?h#3~g%zX2BaHN{Z1`{tl;{;l}Qe*~V5h)F@;s!_`$ zq~I1QgTDlKhLi(7+Ub`LO#ntbx&m|S4b1h9A=mZMC)stM1ctd3#3MT-l>ii=L4lCt z5q-dW@k1tpK*Y1-^2*C$KQ$GcB1LlqN2}sdVI&)rz|X$*JnWg4?C_% z-D{+5j8@!$v2|!g%=LL~D0J@&vK<%mCMCuTE~Ia?f11N+Tq37d?Q%L56_ZZ8qXZRP zpFQ~|+9^x_&n3UB?|K7*i z$Yp;?jZKQkaz=+XQ*%|5i(xMxf&YUIhrzDHNk0v}@&8W7r1nHW-(B)!G0CgAQx zP)D8_7^kd-DE=jbXddNH2fxLa13?(q%L}y9ue3%}8jPm~pqn854PCM_X+`Dl$(^rQ#Qd+O9Ce%0D$tOnjoISqNOyIAOf-_|v-y9Ls1Mcl2g8S6 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 601493156..7f41be4c5 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -7,12 +7,22 @@ SPDX-License-Identifier: AGPL-3.0-only -

@@ -65,10 +65,10 @@ SPDX-License-Identifier: AGPL-3.0-only :moveClass="$style.transition_picked_move" mode="out-in" > - +
@@ -369,8 +369,8 @@ const PHYSICS_QUALITY_FACTOR = 16; // 低いほどパフォーマンスが高い let viewScaleX = 1; let viewScaleY = 1; -const currentPick = shallowRef<{ id: string; fruit: Mono } | null>(null); -const stock = shallowRef<{ id: string; fruit: Mono }[]>([]); +const currentPick = shallowRef<{ id: string; mono: Mono } | null>(null); +const stock = shallowRef<{ id: string; mono: Mono }[]>([]); const score = ref(0); const combo = ref(0); const comboPrev = ref(0); @@ -383,7 +383,7 @@ const highScore = ref(null); class Game extends EventEmitter<{ changeScore: (score: number) => void; changeCombo: (combo: number) => void; - changeStock: (stock: { id: string; fruit: Mono }[]) => void; + changeStock: (stock: { id: string; mono: Mono }[]) => void; dropped: () => void; fusioned: (x: number, y: number, score: number) => void; gameOver: () => void; @@ -409,7 +409,7 @@ class Game extends EventEmitter<{ private latestDroppedAt = 0; private latestFusionedAt = 0; - private stock: { id: string; fruit: Mono }[] = []; + private stock: { id: string; mono: Mono }[] = []; private _combo = 0; private get combo() { @@ -509,11 +509,11 @@ class Game extends EventEmitter<{ }); } - private createBody(fruit: Mono, x: number, y: number) { + private createBody(mono: Mono, x: number, y: number) { const options: Matter.IBodyDefinition = { - label: fruit.id, + label: mono.id, //density: 0.0005, - density: fruit.size / 1000, + density: mono.size / 1000, restitution: 0.2, frictionAir: 0.01, friction: 0.7, @@ -522,16 +522,16 @@ class Game extends EventEmitter<{ //mass: 0, render: { sprite: { - texture: fruit.img, - xScale: (fruit.size / fruit.imgSize) * fruit.spriteScale, - yScale: (fruit.size / fruit.imgSize) * fruit.spriteScale, + texture: mono.img, + xScale: (mono.size / mono.imgSize) * mono.spriteScale, + yScale: (mono.size / mono.imgSize) * mono.spriteScale, }, }, }; - if (fruit.shape === 'circle') { - return Matter.Bodies.circle(x, y, fruit.size / 2, options); - } else if (fruit.shape === 'rectangle') { - return Matter.Bodies.rectangle(x, y, fruit.size, fruit.size, options); + if (mono.shape === 'circle') { + return Matter.Bodies.circle(x, y, mono.size / 2, options); + } else if (mono.shape === 'rectangle') { + return Matter.Bodies.rectangle(x, y, mono.size, mono.size, options); } else { throw new Error('unrecognized shape'); } @@ -553,11 +553,11 @@ class Game extends EventEmitter<{ Matter.Composite.remove(this.engine.world, [bodyA, bodyB]); this.activeBodyIds = this.activeBodyIds.filter(x => x !== bodyA.id && x !== bodyB.id); - const currentFruit = this.monoDefinitions.find(y => y.id === bodyA.label)!; - const nextFruit = this.monoDefinitions.find(x => x.level === currentFruit.level + 1); + const currentMono = this.monoDefinitions.find(y => y.id === bodyA.label)!; + const nextMono = this.monoDefinitions.find(x => x.level === currentMono.level + 1); - if (nextFruit) { - const body = this.createBody(nextFruit, newX, newY); + if (nextMono) { + const body = this.createBody(nextMono, newX, newY); Matter.Composite.add(this.engine.world, body); // 連鎖してfusionした場合の分かりやすさのため少し間を置いてからfusion対象になるようにする @@ -566,11 +566,11 @@ class Game extends EventEmitter<{ }, 100); const comboBonus = 1 + ((this.combo - 1) / 5); - const additionalScore = Math.round(currentFruit.score * comboBonus); + const additionalScore = Math.round(currentMono.score * comboBonus); this.score += additionalScore; const pan = ((newX / GAME_WIDTH) - 0.5) * 2; - sound.playRaw('syuilo/bubble2', 1, pan, nextFruit.sfxPitch); + sound.playRaw('syuilo/bubble2', 1, pan, nextMono.sfxPitch); this.emit('fusioned', newX, newY, additionalScore); } else { @@ -597,7 +597,7 @@ class Game extends EventEmitter<{ for (let i = 0; i < this.STOCK_MAX; i++) { this.stock.push({ id: Math.random().toString(), - fruit: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], + mono: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], }); } this.emit('changeStock', this.stock); @@ -658,12 +658,12 @@ class Game extends EventEmitter<{ const st = this.stock.shift()!; this.stock.push({ id: Math.random().toString(), - fruit: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], + mono: this.monoDefinitions.filter(x => x.dropCandidate)[Math.floor(Math.random() * this.monoDefinitions.filter(x => x.dropCandidate).length)], }); this.emit('changeStock', this.stock); - const x = Math.min(GAME_WIDTH - this.PLAYAREA_MARGIN - (st.fruit.size / 2), Math.max(this.PLAYAREA_MARGIN + (st.fruit.size / 2), _x)); - const body = this.createBody(st.fruit, x, 50 + st.fruit.size / 2); + const x = Math.min(GAME_WIDTH - this.PLAYAREA_MARGIN - (st.mono.size / 2), Math.max(this.PLAYAREA_MARGIN + (st.mono.size / 2), _x)); + const body = this.createBody(st.mono, x, 50 + st.mono.size / 2); Matter.Composite.add(this.engine.world, body); this.activeBodyIds.push(body.id); this.latestDroppedBodyId = body.id; @@ -970,7 +970,7 @@ definePageMetadata({ user-select: none; } -.currentFruit { +.currentMono { position: absolute; margin-top: 80px; z-index: 2; @@ -991,11 +991,11 @@ definePageMetadata({ user-select: none; } -.currentFruitArrow { +.currentMonoArrow { position: absolute; margin-top: 100px; z-index: 3; - animation: currentFruitArrow 2s ease infinite; + animation: currentMonoArrow 2s ease infinite; pointer-events: none; user-select: none; } @@ -1030,7 +1030,7 @@ definePageMetadata({ } } -@keyframes currentFruitArrow { +@keyframes currentMonoArrow { 0% { transform: translateY(0); } 25% { transform: translateY(-8px); } 50% { transform: translateY(0); } From 5e71418d5caca1cea333ee1b8629987cc69c4fbc Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sun, 7 Jan 2024 08:02:53 +0100 Subject: [PATCH 139/184] 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 + .../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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d2fb4ccd..474fcad67 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 76ca8688d..f6b21343b 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 + + From 7e52ea4818029cbb7a981cb58a7eca0bf6b7e0e7 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:44:13 +0900 Subject: [PATCH 167/184] Update CHANGELOG.md (#12953) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b56ff9fc..6963d45f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ - Fix: ネイティブモードの絵文字がモノクロにならないように - Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 - Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正 +- Fix: v2023.12.1で追加された`$[clickable ...]`および`onClickEv`が正しく機能していないのを修正 ### Server - Enhance: 連合先のレートリミットに引っかかった際にリトライするようになりました From 9ceb74b98d4f96d3b11e70d8a5e7293c2ae86618 Mon Sep 17 00:00:00 2001 From: Nila The Dragon Date: Tue, 9 Jan 2024 21:32:47 +0100 Subject: [PATCH 168/184] feat: Implement Donation URL --- locales/de-DE.yml | 3 +++ locales/en-US.yml | 3 +++ locales/index.d.ts | 3 +++ locales/ja-JP.yml | 5 ++++- .../migration/1704744370000-add-donation-url.js | 10 ++++++++++ packages/backend/src/models/Meta.ts | 6 ++++++ .../backend/src/server/NodeinfoServerService.ts | 13 +++++++------ .../backend/src/server/api/endpoints/admin/meta.ts | 5 +++++ .../src/server/api/endpoints/admin/update-meta.ts | 5 +++++ packages/backend/src/server/api/endpoints/meta.ts | 5 +++++ packages/frontend/src/components/MkDonation.vue | 10 ++++++++++ .../frontend/src/components/MkVisitorDashboard.vue | 8 +++++++- packages/frontend/src/pages/about.vue | 1 + packages/frontend/src/pages/admin/settings.vue | 8 ++++++++ packages/frontend/src/ui/_common_/common.ts | 8 +++++++- packages/misskey-js/src/autogen/types.ts | 3 +++ 16 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 packages/backend/migration/1704744370000-add-donation-url.js diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 83b254b2d..fd25ba028 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -973,6 +973,7 @@ neverShow: "Nicht wieder anzeigen" remindMeLater: "Vielleicht später" didYouLikeMisskey: "Gefällt dir Sharkey?" pleaseDonate: "Sharkey ist die kostenlose Software, die von {host} verwendet wird. Wir würden uns über Spenden freuen, damit dessen Entwicklung weitergeführt werden kann!" +pleaseDonateInstance: "Du kannst {host} auch direkt unterstützen, indem du an deine Instanz Administration spendest." roles: "Rollen" role: "Rolle" noRole: "Rolle nicht gefunden" @@ -1150,6 +1151,8 @@ impressumDescription: "In manchen Ländern, wie Deutschland und dessen Umgebung, privacyPolicy: "Datenschutzerklärung" privacyPolicyUrl: "Datenschutzerklärungs-URL" tosAndPrivacyPolicy: "Nutzungsbedingungen und Datenschutzerklärung" +donation: "Spenden" +donationUrl: "Spenden-URL" avatarDecorations: "Profilbilddekoration" attach: "Anbringen" detach: "Entfernen" diff --git a/locales/en-US.yml b/locales/en-US.yml index 0affe133e..7a28ce109 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1014,6 +1014,7 @@ neverShow: "Don't show again" remindMeLater: "Maybe later" didYouLikeMisskey: "Have you taken a liking to Sharkey?" pleaseDonate: "{host} uses the free software, Sharkey. We would highly appreciate your donations so development of Sharkey can continue!" +pleaseDonateInstance: "You can also support {host} directly by donating to your instance administration." roles: "Roles" role: "Role" noRole: "Role not found" @@ -1200,6 +1201,8 @@ impressumDescription: "In some countries, like germany, the inclusion of operato privacyPolicy: "Privacy Policy" privacyPolicyUrl: "Privacy Policy URL" tosAndPrivacyPolicy: "Terms of Service and Privacy Policy" +donation: "Donate" +donationUrl: "Donation URL" avatarDecorations: "Avatar decorations" attach: "Attach" detach: "Remove" diff --git a/locales/index.d.ts b/locales/index.d.ts index 1ec9ed64e..28b3a9444 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1023,6 +1023,7 @@ export interface Locale { "remindMeLater": string; "didYouLikeMisskey": string; "pleaseDonate": string; + "pleaseDonateInstance": string; "roles": string; "role": string; "noRole": string; @@ -1209,6 +1210,8 @@ export interface Locale { "privacyPolicy": string; "privacyPolicyUrl": string; "tosAndPrivacyPolicy": string; + "donation": string; + "donationUrl": string; "avatarDecorations": string; "attach": string; "detach": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 4a4feed06..cb1b3eeb1 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1020,6 +1020,7 @@ neverShow: "今後表示しない" remindMeLater: "また後で" didYouLikeMisskey: "Sharkeyを気に入っていただけましたか?" pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!" +pleaseDonateInstance: インスタンス管理への寄付によって{host}を直接サポートすることもできます。 roles: "ロール" role: "ロール" noRole: "ロールはありません" @@ -1206,6 +1207,8 @@ impressumDescription: "ドイツなどの一部の国と地域では表示が義 privacyPolicy: "プライバシーポリシー" privacyPolicyUrl: "プライバシーポリシーURL" tosAndPrivacyPolicy: "利用規約・プライバシーポリシー" +donation: "寄付する" +donationUrl: "寄付URL" avatarDecorations: "アイコンデコレーション" attach: "付ける" detach: "外す" @@ -2541,7 +2544,7 @@ _dataRequest: warn: "データのリクエストは3日ごとにしかできない。" text: "データのダウンロードが完了すると、このアカウントに登録されているEメールアドレスにEメールが送信されます。" button: "リクエスト" - + _dataSaver: _media: title: "メディアの読み込み" diff --git a/packages/backend/migration/1704744370000-add-donation-url.js b/packages/backend/migration/1704744370000-add-donation-url.js new file mode 100644 index 000000000..c953b13cc --- /dev/null +++ b/packages/backend/migration/1704744370000-add-donation-url.js @@ -0,0 +1,10 @@ +export class AddDonationUrl1704744370000 { + name = 'AddDonationUrl1704744370000' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" ADD "donationUrl" character varying(1024)`); + } + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "donationUrl"`); + } +} diff --git a/packages/backend/src/models/Meta.ts b/packages/backend/src/models/Meta.ts index e7f7458c1..6d5c4b374 100644 --- a/packages/backend/src/models/Meta.ts +++ b/packages/backend/src/models/Meta.ts @@ -385,6 +385,12 @@ export class MiMeta { }) public privacyPolicyUrl: string | null; + @Column('varchar', { + length: 1024, + nullable: true, + }) + public donationUrl: string | null; + @Column('varchar', { length: 8192, nullable: true, diff --git a/packages/backend/src/server/NodeinfoServerService.ts b/packages/backend/src/server/NodeinfoServerService.ts index 31479269b..1356ec6ec 100644 --- a/packages/backend/src/server/NodeinfoServerService.ts +++ b/packages/backend/src/server/NodeinfoServerService.ts @@ -36,12 +36,12 @@ export class NodeinfoServerService { @bindThis public getLinks() { return [{ - rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', - href: this.config.url + nodeinfo2_1path - }, { - rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', - href: this.config.url + nodeinfo2_0path, - }]; + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', + href: this.config.url + nodeinfo2_1path, + }, { + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', + href: this.config.url + nodeinfo2_0path, + }]; } @bindThis @@ -108,6 +108,7 @@ export class NodeinfoServerService { tosUrl: meta.termsOfServiceUrl, privacyPolicyUrl: meta.privacyPolicyUrl, impressumUrl: meta.impressumUrl, + donationUrl: meta.donationUrl, repositoryUrl: meta.repositoryUrl, feedbackUrl: meta.feedbackUrl, disableRegistration: meta.disableRegistration, diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 66b6799ed..9fe997f88 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -415,6 +415,10 @@ export const meta = { type: 'string', optional: false, nullable: true, }, + donationUrl: { + type: 'string', + optional: false, nullable: true, + }, maintainerEmail: { type: 'string', optional: false, nullable: true, @@ -498,6 +502,7 @@ export default class extends Endpoint { // eslint- repositoryUrl: instance.repositoryUrl, feedbackUrl: instance.feedbackUrl, impressumUrl: instance.impressumUrl, + donationUrl: instance.donationUrl, privacyPolicyUrl: instance.privacyPolicyUrl, disableRegistration: instance.disableRegistration, emailRequiredForSignup: instance.emailRequiredForSignup, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 05d2cd61c..786a628d6 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -105,6 +105,7 @@ export const paramDef = { repositoryUrl: { type: 'string' }, feedbackUrl: { type: 'string' }, impressumUrl: { type: 'string', nullable: true }, + donationUrl: { type: 'string', nullable: true }, privacyPolicyUrl: { type: 'string', nullable: true }, useObjectStorage: { type: 'boolean' }, objectStorageBaseUrl: { type: 'string', nullable: true }, @@ -406,6 +407,10 @@ export default class extends Endpoint { // eslint- set.impressumUrl = ps.impressumUrl; } + if (ps.donationUrl !== undefined) { + set.donationUrl = ps.donationUrl; + } + if (ps.privacyPolicyUrl !== undefined) { set.privacyPolicyUrl = ps.privacyPolicyUrl; } diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index 9d2ae8369..af779aa85 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -291,6 +291,10 @@ export const meta = { type: 'string', optional: false, nullable: true, }, + donationUrl: { + type: 'string', + optional: false, nullable: true, + }, logoImageUrl: { type: 'string', optional: false, nullable: true, @@ -365,6 +369,7 @@ export default class extends Endpoint { // eslint- repositoryUrl: instance.repositoryUrl, feedbackUrl: instance.feedbackUrl, impressumUrl: instance.impressumUrl, + donationUrl: instance.donationUrl, privacyPolicyUrl: instance.privacyPolicyUrl, disableRegistration: instance.disableRegistration, emailRequiredForSignup: instance.emailRequiredForSignup, diff --git a/packages/frontend/src/components/MkDonation.vue b/packages/frontend/src/components/MkDonation.vue index a77ff42f9..92e4f14bb 100644 --- a/packages/frontend/src/components/MkDonation.vue +++ b/packages/frontend/src/components/MkDonation.vue @@ -26,6 +26,16 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.learnMore }}
+
+ + + +
+ {{ i18n.ts.learnMore }} +
+
{{ i18n.ts.remindMeLater }} {{ i18n.ts.neverShow }} diff --git a/packages/frontend/src/components/MkVisitorDashboard.vue b/packages/frontend/src/components/MkVisitorDashboard.vue index 9f4fc0093..8f15fa93a 100644 --- a/packages/frontend/src/components/MkVisitorDashboard.vue +++ b/packages/frontend/src/components/MkVisitorDashboard.vue @@ -123,7 +123,13 @@ function showMenu(ev) { action: () => { window.open(instance.privacyPolicyUrl, '_blank', 'noopener'); }, - } : undefined, (!instance.impressumUrl && !instance.tosUrl && !instance.privacyPolicyUrl) ? undefined : { type: 'divider' }, { + } : undefined, (instance.donationUrl) ? { + text: i18n.ts.donation, + icon: 'ph-hand-coins ph-bold ph-lg', + action: () => { + window.open(instance.donationUrl, '_blank', 'noopener'); + }, + } : undefined, (!instance.impressumUrl && !instance.tosUrl && !instance.privacyPolicyUrl && !instance.donationUrl) ? undefined : { type: 'divider' }, { text: i18n.ts.help, icon: 'ph-question ph-bold ph-lg', action: () => { diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue index 820951506..f0bbcebd5 100644 --- a/packages/frontend/src/pages/about.vue +++ b/packages/frontend/src/pages/about.vue @@ -47,6 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.impressum }} + {{ i18n.ts.donation }}
diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue index d08bfac74..f11d37ab2 100644 --- a/packages/frontend/src/pages/admin/settings.vue +++ b/packages/frontend/src/pages/admin/settings.vue @@ -40,6 +40,11 @@ SPDX-License-Identifier: AGPL-3.0-only + + + + + @@ -170,6 +175,7 @@ const description = ref(null); const maintainerName = ref(null); const maintainerEmail = ref(null); const impressumUrl = ref(null); +const donationUrl = ref(null); const pinnedUsers = ref(''); const cacheRemoteFiles = ref(false); const cacheRemoteSensitiveFiles = ref(false); @@ -192,6 +198,7 @@ async function init(): Promise { maintainerName.value = meta.maintainerName; maintainerEmail.value = meta.maintainerEmail; impressumUrl.value = meta.impressumUrl; + donationUrl.value = meta.donationUrl; pinnedUsers.value = meta.pinnedUsers.join('\n'); cacheRemoteFiles.value = meta.cacheRemoteFiles; cacheRemoteSensitiveFiles.value = meta.cacheRemoteSensitiveFiles; @@ -215,6 +222,7 @@ async function save(): void { maintainerName: maintainerName.value, maintainerEmail: maintainerEmail.value, impressumUrl: impressumUrl.value, + donationUrl: donationUrl.value, pinnedUsers: pinnedUsers.value.split('\n'), cacheRemoteFiles: cacheRemoteFiles.value, cacheRemoteSensitiveFiles: cacheRemoteSensitiveFiles.value, diff --git a/packages/frontend/src/ui/_common_/common.ts b/packages/frontend/src/ui/_common_/common.ts index e7f24228b..6e2f8b7e4 100644 --- a/packages/frontend/src/ui/_common_/common.ts +++ b/packages/frontend/src/ui/_common_/common.ts @@ -102,7 +102,13 @@ export function openInstanceMenu(ev: MouseEvent) { action: () => { window.open(instance.privacyPolicyUrl, '_blank', 'noopener'); }, - } : undefined, (!instance.impressumUrl && !instance.tosUrl && !instance.privacyPolicyUrl) ? undefined : { type: 'divider' }, { + } : undefined, (instance.donationUrl) ? { + text: i18n.ts.donation, + icon: 'ph-hand-coins ph-bold ph-lg', + action: () => { + window.open(instance.donationUrl, '_blank', 'noopener'); + }, + } : undefined, (!instance.impressumUrl && !instance.tosUrl && !instance.privacyPolicyUrl && !instance.donationUrl) ? undefined : { type: 'divider' }, { text: i18n.ts.help, icon: 'ph-question ph-bold ph-lg', action: () => { diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index 0e068e526..f881c5db6 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -4631,6 +4631,7 @@ export type operations = { description: string | null; disableRegistration: boolean; impressumUrl: string | null; + donationUrl: string | null; maintainerEmail: string | null; maintainerName: string | null; name: string | null; @@ -8650,6 +8651,7 @@ export type operations = { repositoryUrl?: string; feedbackUrl?: string; impressumUrl?: string | null; + donationUrl?: string | null; privacyPolicyUrl?: string | null; useObjectStorage?: boolean; objectStorageBaseUrl?: string | null; @@ -19400,6 +19402,7 @@ export type operations = { }; backgroundImageUrl: string | null; impressumUrl: string | null; + donationUrl: string | null; logoImageUrl: string | null; privacyPolicyUrl: string | null; serverRules: string[]; From e74cd2f6ee7f8ad39433a74309569d985f76c5f9 Mon Sep 17 00:00:00 2001 From: Nila The Dragon Date: Tue, 9 Jan 2024 22:02:28 +0100 Subject: [PATCH 169/184] Move donation link on about page --- packages/frontend/src/pages/about.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/about.vue b/packages/frontend/src/pages/about.vue index f0bbcebd5..024f2dc74 100644 --- a/packages/frontend/src/pages/about.vue +++ b/packages/frontend/src/pages/about.vue @@ -47,7 +47,6 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.impressum }} - {{ i18n.ts.donation }}
@@ -58,6 +57,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.termsOfService }} {{ i18n.ts.privacyPolicy }} + {{ i18n.ts.donation }}
From e0e52368646392b712e8c79733d9d489767078d8 Mon Sep 17 00:00:00 2001 From: Nila The Dragon Date: Tue, 9 Jan 2024 22:25:46 +0100 Subject: [PATCH 170/184] Revert auto-formatted change in NodeinfoServerService --- packages/backend/src/server/NodeinfoServerService.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/server/NodeinfoServerService.ts b/packages/backend/src/server/NodeinfoServerService.ts index 1356ec6ec..a3e3c39ec 100644 --- a/packages/backend/src/server/NodeinfoServerService.ts +++ b/packages/backend/src/server/NodeinfoServerService.ts @@ -36,12 +36,12 @@ export class NodeinfoServerService { @bindThis public getLinks() { return [{ - rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', - href: this.config.url + nodeinfo2_1path, - }, { - rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', - href: this.config.url + nodeinfo2_0path, - }]; + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1', + href: this.config.url + nodeinfo2_1path + }, { + rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0', + href: this.config.url + nodeinfo2_0path, + }]; } @bindThis From f3aeb4c3517617329520635fd2f5e3a681c51db6 Mon Sep 17 00:00:00 2001 From: Nila The Dragon Date: Tue, 9 Jan 2024 22:27:15 +0100 Subject: [PATCH 171/184] Add missing quotes in ja-JP --- locales/ja-JP.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index cb1b3eeb1..e6f9dc6b9 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1020,7 +1020,7 @@ neverShow: "今後表示しない" remindMeLater: "また後で" didYouLikeMisskey: "Sharkeyを気に入っていただけましたか?" pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!" -pleaseDonateInstance: インスタンス管理への寄付によって{host}を直接サポートすることもできます。 +pleaseDonateInstance: "インスタンス管理への寄付によって{host}を直接サポートすることもできます。" roles: "ロール" role: "ロール" noRole: "ロールはありません" From f5b864df7bedc3b4a7abdfb09a3df9c2db8c3627 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Jan 2024 07:26:16 +0900 Subject: [PATCH 172/184] fix(frontend): fix game replay --- packages/frontend/src/scripts/drop-and-fusion-engine.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/frontend/src/scripts/drop-and-fusion-engine.ts b/packages/frontend/src/scripts/drop-and-fusion-engine.ts index 9db93d153..16fe87d97 100644 --- a/packages/frontend/src/scripts/drop-and-fusion-engine.ts +++ b/packages/frontend/src/scripts/drop-and-fusion-engine.ts @@ -500,12 +500,13 @@ export class DropAndFusionGame extends EventEmitter<{ }); this.emit('changeStock', this.stock); - const x = Math.min(this.gameWidth - this.PLAYAREA_MARGIN - (head.mono.size / 2), Math.max(this.PLAYAREA_MARGIN + (head.mono.size / 2), Math.round(_x))); + const inputX = Math.round(_x); + const x = Math.min(this.gameWidth - this.PLAYAREA_MARGIN - (head.mono.size / 2), Math.max(this.PLAYAREA_MARGIN + (head.mono.size / 2), inputX)); const body = this.createBody(head.mono, x, 50 + head.mono.size / 2); this.logs.push({ frame: this.frame, operation: 'drop', - x, + x: inputX, }); Matter.Composite.add(this.engine.world, body); this.activeBodyIds.push(body.id); From 6bae440f3912f882fea1e3901aad2d18f2b6a3b8 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 10 Jan 2024 09:47:47 +0900 Subject: [PATCH 173/184] bump aiscript version to 0.17.0 (#12955) * bump aiscript version to 0.17.0 * Update CHANGELOG.md --- CHANGELOG.md | 2 ++ packages/frontend/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6963d45f6..244fd724a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ - Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように - Enhance: チャンネルノートのピン留めをノートのメニューからできるように - Enhance: 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように +- Enhance: AiScriptを0.17.0に更新 [CHANGELOG](https://github.com/aiscript-dev/aiscript/blob/bb89d132b633a622d3cb0eff0d0cc7e476c0cfdd/CHANGELOG.md) + - 配列の範囲外・非整数のインデックスへの代入が完全禁止になるので注意 - Fix: ネイティブモードの絵文字がモノクロにならないように - Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 - Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正 diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 895aa4741..8c3ce3066 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -24,7 +24,7 @@ "@rollup/plugin-json": "6.1.0", "@rollup/plugin-replace": "5.0.5", "@rollup/pluginutils": "5.1.0", - "@syuilo/aiscript": "0.16.0", + "@syuilo/aiscript": "0.17.0", "@tabler/icons-webfont": "2.44.0", "@twemoji/parser": "15.0.0", "@vitejs/plugin-vue": "5.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d9822482..400051bce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -686,8 +686,8 @@ importers: specifier: 5.1.0 version: 5.1.0(rollup@4.9.1) '@syuilo/aiscript': - specifier: 0.16.0 - version: 0.16.0 + specifier: 0.17.0 + version: 0.17.0 '@tabler/icons-webfont': specifier: 2.44.0 version: 2.44.0 @@ -7649,8 +7649,8 @@ packages: dev: false optional: true - /@syuilo/aiscript@0.16.0: - resolution: {integrity: sha512-CXvoWOq6kmOSUQtKv0IEf7Ebfkk5PO1LxAgLqgRRPgssPvDvINCXu/gFNXKdapkFMkmX+Gj8qjemKR1vnUS4ZA==} + /@syuilo/aiscript@0.17.0: + resolution: {integrity: sha512-3JtQ1rWJHMxQ3153zLCXMUOwrOgjPPYGBl0dPHhR0ohm4tn7okMQRugxMCT0t3YxByemb9FfiM6TUjd0tEGxdA==} dependencies: seedrandom: 3.0.5 stringz: 2.1.0 From 138a248a6ce875af812c8ab126b78817d495b0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BE=E3=81=A3=E3=81=A1=E3=82=83=E3=81=A8=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=82=85?= <17376330+u1-liquid@users.noreply.github.com> Date: Wed, 10 Jan 2024 10:40:09 +0900 Subject: [PATCH 174/184] =?UTF-8?q?fix(drop-and-fusion):=20=E3=83=90?= =?UTF-8?q?=E3=83=96=E3=83=AB=E3=82=B2=E3=83=BC=E3=83=A0=E3=81=AE=E3=83=AA?= =?UTF-8?q?=E3=83=88=E3=83=A9=E3=82=A4=E3=83=9C=E3=82=BF=E3=83=B3=E3=81=A7?= =?UTF-8?q?=E3=83=AA=E3=83=88=E3=83=A9=E3=82=A4=E3=81=8C=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20(#12957)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ゲーム中なら諦める、ゲームオーバー画面の表示中はリスタートになるように --- packages/frontend/src/pages/drop-and-fusion.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 974daf35e..d041a675f 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -153,7 +153,8 @@ SPDX-License-Identifier: AGPL-3.0-only
- Retry + Surrender + Retry
@@ -483,15 +484,22 @@ async function surrender() { game.surrender(); } +async function retry() { + end(); + await start(); +} + function end() { game.dispose(); isGameOver.value = false; + replaying.value = false; currentPick.value = null; dropReady.value = true; stock.value = []; score.value = 0; combo.value = 0; comboPrev.value = 0; + maxCombo.value = 0; bgmNodes?.soundSource.stop(); gameStarted.value = false; } From 3d9e42efca8792bcfa1be7bd6125cf732db50fdb Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Jan 2024 11:38:49 +0900 Subject: [PATCH 175/184] =?UTF-8?q?enhance(drop-and-fusion):=20=E3=83=AA?= =?UTF-8?q?=E3=83=97=E3=83=AC=E3=82=A4=E3=81=AE=E5=80=8D=E9=80=9F=E5=86=8D?= =?UTF-8?q?=E7=94=9F=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/src/pages/drop-and-fusion.vue | 12 ++- .../src/scripts/drop-and-fusion-engine.ts | 79 ++++++++++--------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index d041a675f..f58551945 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -103,7 +103,11 @@ SPDX-License-Identifier: AGPL-3.0-only
- END REPLAY +
+ END REPLAY + x2 + x4 +
@@ -437,10 +441,15 @@ const gameStarted = ref(false); const highScore = ref(null); const showConfig = ref(false); const replaying = ref(false); +const replayPlaybackRate = ref(1); const mute = ref(false); const bgmVolume = ref(defaultStore.state.dropAndFusion.bgmVolume); const sfxVolume = ref(defaultStore.state.dropAndFusion.sfxVolume); +watch(replayPlaybackRate, (newValue) => { + game.replayPlaybackRate = newValue; +}); + function onClick(ev: MouseEvent) { if (!containerElRect) return; if (replaying.value) return; @@ -493,6 +502,7 @@ function end() { game.dispose(); isGameOver.value = false; replaying.value = false; + replayPlaybackRate.value = 1; currentPick.value = null; dropReady.value = true; stock.value = []; diff --git a/packages/frontend/src/scripts/drop-and-fusion-engine.ts b/packages/frontend/src/scripts/drop-and-fusion-engine.ts index 16fe87d97..a59eb271e 100644 --- a/packages/frontend/src/scripts/drop-and-fusion-engine.ts +++ b/packages/frontend/src/scripts/drop-and-fusion-engine.ts @@ -44,7 +44,7 @@ export class DropAndFusionGame extends EventEmitter<{ gameOver: () => void; }> { private PHYSICS_QUALITY_FACTOR = 16; // 低いほどパフォーマンスが高いがガタガタして安定しなくなる、逆に高すぎても何故か不安定になる - private COMBO_INTERVAL = 1000; + private COMBO_INTERVAL = 60; // frame public readonly DROP_INTERVAL = 500; public readonly PLAYAREA_MARGIN = 25; private STOCK_MAX = 4; @@ -76,7 +76,7 @@ export class DropAndFusionGame extends EventEmitter<{ private latestDroppedBodyId: Matter.Body['id'] | null = null; private latestDroppedAt = 0; - private latestFusionedAt = 0; + private latestFusionedAt = 0; // frame private stock: { id: string; mono: Mono }[] = []; private holding: { id: string; mono: Mono } | null = null; @@ -100,6 +100,8 @@ export class DropAndFusionGame extends EventEmitter<{ private comboIntervalId: number | null = null; + public replayPlaybackRate = 1; + constructor(opts: { canvas: HTMLCanvasElement; width: number; @@ -219,13 +221,12 @@ export class DropAndFusionGame extends EventEmitter<{ } private fusion(bodyA: Matter.Body, bodyB: Matter.Body) { - const now = Date.now(); - if (this.latestFusionedAt > now - this.COMBO_INTERVAL) { + if (this.latestFusionedAt > this.frame - this.COMBO_INTERVAL) { this.combo++; } else { this.combo = 1; } - this.latestFusionedAt = now; + this.latestFusionedAt = this.frame; // TODO: 単に位置だけでなくそれぞれの動きベクトルも融合する? const newX = (bodyA.position.x + bodyB.position.x) / 2; @@ -390,44 +391,43 @@ export class DropAndFusionGame extends EventEmitter<{ } }); - this.comboIntervalId = window.setInterval(() => { - if (this.latestFusionedAt < Date.now() - this.COMBO_INTERVAL) { - this.combo = 0; - } - }, 500); - if (logs) { const playTick = () => { - this.frame++; - const log = logs.find(x => x.frame === this.frame - 1); - if (log) { - switch (log.operation) { - case 'drop': { - this.drop(log.x); - break; - } - case 'hold': { - this.hold(); - break; - } - case 'surrender': { - this.surrender(); - break; - } - default: - break; + for (let i = 0; i < this.replayPlaybackRate; i++) { + this.frame++; + if (this.latestFusionedAt < this.frame - this.COMBO_INTERVAL) { + this.combo = 0; } - } - this.tickCallbackQueue = this.tickCallbackQueue.filter(x => { - if (x.frame === this.frame) { - x.callback(); - return false; - } else { - return true; + const log = logs.find(x => x.frame === this.frame - 1); + if (log) { + switch (log.operation) { + case 'drop': { + this.drop(log.x); + break; + } + case 'hold': { + this.hold(); + break; + } + case 'surrender': { + this.surrender(); + break; + } + default: + break; + } } - }); + this.tickCallbackQueue = this.tickCallbackQueue.filter(x => { + if (x.frame === this.frame) { + x.callback(); + return false; + } else { + return true; + } + }); - Matter.Engine.update(this.engine, this.TICK_DELTA); + Matter.Engine.update(this.engine, this.TICK_DELTA); + } if (!this.isGameOver) { this.tickRaf = window.requestAnimationFrame(playTick); @@ -446,6 +446,9 @@ export class DropAndFusionGame extends EventEmitter<{ private tick() { this.frame++; + if (this.latestFusionedAt < this.frame - this.COMBO_INTERVAL) { + this.combo = 0; + } this.tickCallbackQueue = this.tickCallbackQueue.filter(x => { if (x.frame === this.frame) { x.callback(); From 4bd9f664d7213e9d6d507ae1b8cb67e2b78e766a Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Jan 2024 13:44:00 +0900 Subject: [PATCH 176/184] enhance(drop-and-fusion): some tweaks --- .../frontend/src/pages/drop-and-fusion.vue | 1 + .../src/scripts/drop-and-fusion-engine.ts | 29 +++++++++++++------ packages/frontend/src/scripts/sound.ts | 2 -- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index f58551945..c5ab7a33f 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -1028,6 +1028,7 @@ definePageMetadata({ bottom: 10px; padding: 6px 8px; color: #f00; + font-weight: bold; background: #0008; border-radius: 6px; pointer-events: none; diff --git a/packages/frontend/src/scripts/drop-and-fusion-engine.ts b/packages/frontend/src/scripts/drop-and-fusion-engine.ts index a59eb271e..342e81890 100644 --- a/packages/frontend/src/scripts/drop-and-fusion-engine.ts +++ b/packages/frontend/src/scripts/drop-and-fusion-engine.ts @@ -157,6 +157,7 @@ export class DropAndFusionGame extends EventEmitter<{ //#region walls const WALL_OPTIONS: Matter.IChamferableBodyDefinition = { + label: '_wall_', isStatic: true, friction: 0.7, slop: 1.0, @@ -254,12 +255,14 @@ export class DropAndFusionGame extends EventEmitter<{ const additionalScore = Math.round(currentMono.score * comboBonus); this.score += additionalScore; - // TODO: 効果音再生はコンポーネント側の責務なので移動する - const pan = ((newX / this.gameWidth) - 0.5) * 2; + // TODO: 効果音再生はコンポーネント側の責務なので移動するべき? + const panV = newX - this.PLAYAREA_MARGIN; + const panW = this.gameWidth - this.PLAYAREA_MARGIN - this.PLAYAREA_MARGIN; + const pan = ((panV / panW) - 0.5) * 2; sound.playUrl('/client-assets/drop-and-fusion/bubble2.mp3', { volume: this.sfxVolume, pan, - playbackRate: nextMono.sfxPitch, + playbackRate: nextMono.sfxPitch * this.replayPlaybackRate, }); this.emit('monoAdded', nextMono); @@ -293,7 +296,7 @@ export class DropAndFusionGame extends EventEmitter<{ this.tickRaf = null; this.emit('gameOver'); - // TODO: 効果音再生はコンポーネント側の責務なので移動する + // TODO: 効果音再生はコンポーネント側の責務なので移動するべき? sound.playUrl('/client-assets/drop-and-fusion/gameover.mp3', { volume: this.sfxVolume, }); @@ -377,14 +380,19 @@ export class DropAndFusionGame extends EventEmitter<{ } else { const energy = pairs.collision.depth; if (energy > minCollisionEnergyForSound) { - // TODO: 効果音再生はコンポーネント側の責務なので移動する + // TODO: 効果音再生はコンポーネント側の責務なので移動するべき? const vol = ((Math.min(maxCollisionEnergyForSound, energy - minCollisionEnergyForSound) / maxCollisionEnergyForSound) / 4) * this.sfxVolume; - const pan = ((((bodyA.position.x + bodyB.position.x) / 2) / this.gameWidth) - 0.5) * 2; + const panV = + pairs.bodyA.label === '_wall_' ? bodyB.position.x - this.PLAYAREA_MARGIN : + pairs.bodyB.label === '_wall_' ? bodyA.position.x - this.PLAYAREA_MARGIN : + ((bodyA.position.x + bodyB.position.x) / 2) - this.PLAYAREA_MARGIN; + const panW = this.gameWidth - this.PLAYAREA_MARGIN - this.PLAYAREA_MARGIN; + const pan = ((panV / panW) - 0.5) * 2; const pitch = soundPitchMin + ((soundPitchMax - soundPitchMin) * (1 - (Math.min(10, energy) / 10))); sound.playUrl('/client-assets/drop-and-fusion/poi1.mp3', { volume: vol, pan, - playbackRate: pitch, + playbackRate: pitch * this.replayPlaybackRate, }); } } @@ -518,11 +526,14 @@ export class DropAndFusionGame extends EventEmitter<{ this.emit('dropped'); this.emit('monoAdded', head.mono); - // TODO: 効果音再生はコンポーネント側の責務なので移動する - const pan = ((x / this.gameWidth) - 0.5) * 2; + // TODO: 効果音再生はコンポーネント側の責務なので移動するべき? + const panV = x - this.PLAYAREA_MARGIN; + const panW = this.gameWidth - this.PLAYAREA_MARGIN - this.PLAYAREA_MARGIN; + const pan = ((panV / panW) - 0.5) * 2; sound.playUrl('/client-assets/drop-and-fusion/poi2.mp3', { volume: this.sfxVolume, pan, + playbackRate: this.replayPlaybackRate, }); } diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 142ddf87c..05c8977ec 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -99,7 +99,6 @@ export async function loadAudio(url: string, options?: { useCache?: boolean; }) } if (options?.useCache ?? true) { if (cache.has(url)) { - if (_DEV_) console.log('use cache'); return cache.get(url) as AudioBuffer; } } @@ -128,7 +127,6 @@ export async function loadAudio(url: string, options?: { useCache?: boolean; }) */ export function playMisskeySfx(operationType: OperationType) { const sound = defaultStore.state[`sound_${operationType}`]; - if (_DEV_) console.log('play', operationType, sound); if (sound.type == null || !canPlay) return; canPlay = false; From c1c363bf08a391400e4b8b1df91962c26f2f3192 Mon Sep 17 00:00:00 2001 From: 1Step621 <86859447+1STEP621@users.noreply.github.com> Date: Wed, 10 Jan 2024 15:06:04 +0900 Subject: [PATCH 177/184] =?UTF-8?q?Enhance(frontend):=20=E7=B5=B5=E6=96=87?= =?UTF-8?q?=E5=AD=97=E3=83=94=E3=83=83=E3=82=AB=E3=83=BC/=E3=82=AA?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=82=B3=E3=83=B3=E3=83=97=E3=83=AA=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=81=A7=E5=AE=8C=E5=85=A8=E4=B8=80=E8=87=B4=E3=81=AE?= =?UTF-8?q?=E7=B5=B5=E6=96=87=E5=AD=97=E3=82=92=E5=84=AA=E5=85=88=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20(#12928)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 絵文字ピッカー/オートコンプリートで完全一致の絵文字を優先するように * update CHANGELOG.md * improve performance --- CHANGELOG.md | 1 + .../frontend/src/components/MkAutocomplete.vue | 17 +++++++++++++---- .../frontend/src/components/MkEmojiPicker.vue | 13 +++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 244fd724a..13ad3a350 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - Enhance: 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように - Enhance: AiScriptを0.17.0に更新 [CHANGELOG](https://github.com/aiscript-dev/aiscript/blob/bb89d132b633a622d3cb0eff0d0cc7e476c0cfdd/CHANGELOG.md) - 配列の範囲外・非整数のインデックスへの代入が完全禁止になるので注意 +- Enhance: 絵文字ピッカー・オートコンプリートで、完全一致した絵文字を優先的に表示するように - Fix: ネイティブモードの絵文字がモノクロにならないように - Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 - Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正 diff --git a/packages/frontend/src/components/MkAutocomplete.vue b/packages/frontend/src/components/MkAutocomplete.vue index 49884c705..15eda4499 100644 --- a/packages/frontend/src/components/MkAutocomplete.vue +++ b/packages/frontend/src/components/MkAutocomplete.vue @@ -262,15 +262,24 @@ function emojiAutoComplete(query: string | null, emojiDb: EmojiDef[], max = 30): } const matched = new Map(); - - // 前方一致(エイリアスなし) + // 完全一致(エイリアス込み) emojiDb.some(x => { - if (x.name.startsWith(query) && !x.aliasOf) { - matched.set(x.name, { emoji: x, score: query.length + 1 }); + if (x.name === query && !matched.has(x.aliasOf ?? x.name)) { + matched.set(x.aliasOf ?? x.name, { emoji: x, score: query.length + 2 }); } return matched.size === max; }); + // 前方一致(エイリアスなし) + if (matched.size < max) { + emojiDb.some(x => { + if (x.name.startsWith(query) && !x.aliasOf) { + matched.set(x.name, { emoji: x, score: query.length + 1 }); + } + return matched.size === max; + }); + } + // 前方一致(エイリアス込み) if (matched.size < max) { emojiDb.some(x => { diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue index f36d46506..84424c58e 100644 --- a/packages/frontend/src/components/MkEmojiPicker.vue +++ b/packages/frontend/src/components/MkEmojiPicker.vue @@ -221,6 +221,19 @@ watch(q, () => { } } } else { + if (customEmojisMap.has(newQ)) { + matches.add(customEmojisMap.get(newQ)!); + } + if (matches.size >= max) return matches; + + for (const emoji of emojis) { + if (emoji.aliases.some(alias => alias === newQ)) { + matches.add(emoji); + if (matches.size >= max) break; + } + } + if (matches.size >= max) return matches; + for (const emoji of emojis) { if (emoji.name.startsWith(newQ)) { matches.add(emoji); From 5c786cace839147a11fadac6ee46da29db5f2457 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Jan 2024 17:31:59 +0900 Subject: [PATCH 178/184] enhance(drop-and-fusion): add game description --- locales/index.d.ts | 8 ++++++++ locales/ja-JP.yml | 7 +++++++ packages/frontend/src/pages/drop-and-fusion.vue | 16 +++++++++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/locales/index.d.ts b/locales/index.d.ts index aa74ba54b..852cbdd27 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1199,6 +1199,14 @@ export interface Locale { "showReplay": string; "replay": string; "replaying": string; + "_bubbleGame": { + "howToPlay": string; + "_howToPlay": { + "section1": string; + "section2": string; + "section3": string; + }; + }; "_announcement": { "forExistingUsers": string; "forExistingUsersDescription": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 4863bbe77..f85dc0fcf 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1197,6 +1197,13 @@ showReplay: "リプレイを見る" replay: "リプレイ" replaying: "リプレイ中" +_bubbleGame: + howToPlay: "遊び方" + _howToPlay: + section1: "位置を調整してハコにモノを落とします。" + section2: "同じ種類のモノがくっつくと別のモノに変化して、スコアが得られます。" + section3: "モノがハコからあふれるとゲームオーバーです。ハコからあふれないようにしつつモノを融合させてハイスコアを目指そう!" + _announcement: forExistingUsers: "既存ユーザーのみ" forExistingUsersDescription: "有効にすると、このお知らせ作成時点で存在するユーザーにのみお知らせが表示されます。無効にすると、このお知らせ作成後にアカウントを作成したユーザーにもお知らせが表示されます。" diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index c5ab7a33f..9fb7ab2e2 100644 --- a/packages/frontend/src/pages/drop-and-fusion.vue +++ b/packages/frontend/src/pages/drop-and-fusion.vue @@ -8,13 +8,13 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
+
+
-
+
@@ -33,6 +33,16 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
+
{{ i18n.ts._bubbleGame.howToPlay }}
+
    +
  1. {{ i18n.ts._bubbleGame._howToPlay.section1 }}
  2. +
  3. {{ i18n.ts._bubbleGame._howToPlay.section2 }}
  4. +
  5. {{ i18n.ts._bubbleGame._howToPlay.section3 }}
  6. +
+
+
From 9c52e67490a772c485e1d54c2edd1b151f38be0b Mon Sep 17 00:00:00 2001 From: morotesovtannu Date: Wed, 10 Jan 2024 18:46:32 +0900 Subject: [PATCH 179/184] chore: fix ja-JP locale --- locales/ja-JP.yml | 88 +++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d337adb0c..7fc44b416 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -15,7 +15,7 @@ gotIt: "わかった" cancel: "キャンセル" noThankYou: "やめておく" enterUsername: "ユーザー名を入力" -renotedBy: "{user}がリノート" +renotedBy: "{user}がブースト" noNotes: "ノートはありません" noNotifications: "通知はありません" instance: "サーバー" @@ -46,16 +46,16 @@ pin: "ピン留め" unpin: "ピン留め解除" copyContent: "内容をコピー" copyLink: "リンクをコピー" -copyLinkRenote: "リノートのリンクをコピー" +copyLinkRenote: "ブーストのリンクをコピー" delete: "削除" deleteAndEdit: "削除して編集" -deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、リノート、返信も全て削除されます。" +deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、ブースト、返信も全て削除されます。" addToList: "リストに追加" addToAntenna: "アンテナに追加" sendMessage: "メッセージを送信" copyRSS: "RSSをコピー" copyUsername: "ユーザー名をコピー" -openRemoteProfile: "リモートプロファイルを開く" +openRemoteProfile: "リモートプロフィールを開く" copyUserId: "ユーザーIDをコピー" copyNoteId: "ノートIDをコピー" copyFileId: "ファイルIDをコピー" @@ -107,15 +107,15 @@ followRequests: "フォロー申請" unfollow: "フォロー解除" followRequestPending: "フォロー許可待ち" enterEmoji: "絵文字を入力" -renote: "リノート" -unrenote: "リノート解除" -renoted: "ブースト。" +renote: "ブースト" +unrenote: "ブースト解除" +renoted: "ブーストしました。" quoted: "引用。" -rmboost: "アンブースト。" -cantRenote: "この投稿はリノートできません。" -cantReRenote: "リノートをリノートすることはできません。" +rmboost: "ブースト解除しました。" +cantRenote: "この投稿はブーストできません。" +cantReRenote: "ブーストをブーストすることはできません。" quote: "引用" -inChannelRenote: "チャンネル内リノート" +inChannelRenote: "チャンネル内ブースト" inChannelQuote: "チャンネル内引用" pinnedNote: "ピン留めされたノート" pinned: "ピン留め" @@ -139,8 +139,8 @@ unmarkAsSensitive: "センシティブを解除する" enterFileName: "ファイル名を入力" mute: "ミュート" unmute: "ミュート解除" -renoteMute: "リノートをミュート" -renoteUnmute: "リノートのミュートを解除" +renoteMute: "ブーストをミュート" +renoteUnmute: "ブーストのミュートを解除" block: "ブロック" unblock: "ブロック解除" markAsNSFW: "ユーザーのすべてのメディアをNSFWとしてマークする" @@ -209,8 +209,8 @@ charts: "チャート" perHour: "1時間ごと" perDay: "1日ごと" stopActivityDelivery: "アクティビティの配送を停止" -blockThisInstance: "このサーバーをブロック" -silenceThisInstance: "サーバーをサイレンス" +blockThisInstance: "このインスタンスをブロック" +silenceThisInstance: "インスタンスをサイレンス" operations: "操作" software: "ソフトウェア" version: "バージョン" @@ -231,7 +231,7 @@ clearCachedFilesConfirm: "キャッシュされたリモートファイルをす blockedInstances: "ブロックしたサーバー" blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このインスタンスとやり取りできなくなります。" silencedInstances: "サイレンスしたサーバー" -silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。" +silencedInstancesDescription: "サイレンスしたいインスタンスのホストを改行で区切って設定します。サイレンスされたインスタンスに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。" muteAndBlock: "ミュートとブロック" mutedUsers: "ミュートしたユーザー" blockedUsers: "ブロックしたユーザー" @@ -696,7 +696,7 @@ behavior: "動作" sample: "サンプル" abuseReports: "通報" reportAbuse: "通報" -reportAbuseRenote: "リノートを通報" +reportAbuseRenote: "ブーストを通報" reportAbuseOf: "{name}を通報する" fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。" abuseReported: "内容が送信されました。ご報告ありがとうございました。" @@ -730,9 +730,9 @@ manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" notesCount: "ノートの数" repliesCount: "返信した数" -renotesCount: "リノートした数" +renotesCount: "ブーストした数" repliedCount: "返信された数" -renotedCount: "リノートされた数" +renotedCount: "ブーストされた数" followingCount: "フォロー数" followersCount: "フォロワー数" sentReactionsCount: "リアクションした数" @@ -968,7 +968,7 @@ numberOfReplies: "スレッド内の返信数" numberOfRepliesDescription: "この数値を大きくすると、より多くの返信が表示されます。この値を大きくしすぎると、返信が窮屈になり、読めなくなることがあります。" boostSettings: "ブースト設定" showVisibilitySelectorOnBoost: "可視性セレクタを表示" -showVisibilitySelectorOnBoostDescription: "無効の場合、以下で定義されるデフォルトの可視性が使用され、セレクタは表示されない。" +showVisibilitySelectorOnBoostDescription: "無効の場合、以下で定義されるデフォルトの可視性が使用され、セレクタは表示されません。" visibilityOnBoost: "デフォルトのブースト可視性の設定" logoutConfirm: "ログアウトしますか?" lastActiveDate: "最終利用日時" @@ -1021,7 +1021,7 @@ neverShow: "今後表示しない" remindMeLater: "また後で" didYouLikeMisskey: "Sharkeyを気に入っていただけましたか?" pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!" -pleaseDonateInstance: "インスタンス管理への寄付によって{host}を直接サポートすることもできます。" +pleaseDonateInstance: "インスタンス管理者への寄付によって{host}を直接サポートすることもできます。" roles: "ロール" role: "ロール" noRole: "ロールはありません" @@ -1048,7 +1048,7 @@ thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります thisPostMayBeAnnoyingHome: "ホームに投稿" thisPostMayBeAnnoyingCancel: "やめる" thisPostMayBeAnnoyingIgnore: "このまま投稿" -collapseRenotes: "見たことのあるリノートを省略して表示" +collapseRenotes: "見たことのあるブーストを省略して表示" collapseFiles: "ファイルを折りたたむ" autoloadConversation: "返信に会話を読み込む" internalServerError: "サーバー内部エラー" @@ -1102,7 +1102,7 @@ forceShowAds: "常に広告を表示する" addMemo: "メモを追加" editMemo: "メモを編集" reactionsList: "リアクション一覧" -renotesList: "リノート一覧" +renotesList: "ブースト一覧" notificationDisplay: "通知の表示" leftTop: "左上" rightTop: "右上" @@ -1144,9 +1144,9 @@ installed: "インストール済み" branding: "ブランディング" enableServerMachineStats: "サーバーのマシン情報を公開する" enableAchievements: "実績を有効にする" -turnOffAchievements: "これをオフにすると、達成システムは無効になります。" -enableBotTrending: "ハッシュタグにボットを追加する" -turnOffBotTrending: "これをオフにすると、ボットがハッシュタグを入力しなくなります。" +turnOffAchievements: "オフにすると実績システムは無効になります。" +enableBotTrending: "botのハッシュタグ追加を許可する" +turnOffBotTrending: "オフにするとボットがハッシュタグを入力しなくなります。" enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。" createInviteCode: "招待コードを作成" @@ -1177,7 +1177,7 @@ pastAnnouncements: "過去のお知らせ" youHaveUnreadAnnouncements: "未読のお知らせがあります。" useSecurityKey: "ブラウザまたはデバイスの指示に従って、セキュリティキーまたはパスキーを使用してください。" replies: "返信" -renotes: "リノート" +renotes: "ブースト" loadReplies: "返信を見る" loadConversation: "会話を見る" pinnedList: "ピン留めされたリスト" @@ -1190,7 +1190,7 @@ unnotifyNotes: "投稿の通知を解除" authentication: "認証" authenticationRequiredToContinue: "続けるには認証を行ってください" dateAndTime: "日時" -showRenotes: "リノートを表示" +showRenotes: "ブーストを表示" edited: "編集済み" notificationRecieveConfig: "通知の受信設定" mutualFollow: "相互フォロー" @@ -1308,8 +1308,8 @@ _initialTutorial: _visibility: description: "ノートを表示できる相手を制限できます。" public: "すべてのユーザーに公開。" - home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。" - followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。" + home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・ブーストから、他のユーザーも見ることができます。" + followers: "フォロワーにのみ公開。本人以外がブーストすることはできず、またフォロワー以外は閲覧できません。" direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。" doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。" doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。" @@ -1663,7 +1663,7 @@ _role: high: "高" _options: gtlAvailable: "グローバルタイムラインの閲覧" - btlAvailable: "バブルのタイムラインを見ることができる" + btlAvailable: "バブルタイムラインの閲覧" ltlAvailable: "ローカルタイムラインの閲覧" canPublicNote: "パブリック投稿の許可" canImportNotes: "ノートのインポートが可能" @@ -1839,7 +1839,7 @@ _channel: notesCount: "{n}投稿があります" nameAndDescription: "名前と説明" nameOnly: "名前のみ" - allowRenoteToExternal: "チャンネル外へのリノートと引用リノートを許可する" + allowRenoteToExternal: "チャンネル外へのブーストと引用ブーストを許可する" _menuDisplay: sideFull: "横" @@ -1853,7 +1853,7 @@ _wordMute: muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。" _instanceMute: - instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとRenoteをミュートします。" + instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとブーストをミュートします。" instanceMuteDescription2: "改行で区切って設定します" title: "設定したサーバーのノートを隠します。" heading: "ミュートするサーバー" @@ -1907,7 +1907,7 @@ _theme: hashtag: "ハッシュタグ" mention: "メンション" mentionMe: "あなた宛てメンション" - renote: "Renote" + renote: "Boost" modalBg: "モーダルの背景" divider: "分割線" scrollbarHandle: "スクロールバーの取っ手" @@ -2348,7 +2348,7 @@ _notification: youGotMention: "{name}からのメンション" youGotReply: "{name}からのリプライ" youGotQuote: "{name}による引用" - youRenoted: "{name}がRenoteしました" + youRenoted: "{name}がBoostしました" youWereFollowed: "フォローされました" youReceivedFollowRequest: "フォローリクエストが来ました" yourFollowRequestAccepted: "フォローリクエストが承認されました" @@ -2363,7 +2363,7 @@ _notification: sendTestNotification: "テスト通知を送信する" notificationWillBeDisplayedLikeThis: "通知はこのように表示されます" reactedBySomeUsers: "{n}人がリアクションしました" - renotedBySomeUsers: "{n}人がリノートしました" + renotedBySomeUsers: "{n}人がブーストしました" followedBySomeUsers: "{n}人にフォローされました" _types: @@ -2372,7 +2372,7 @@ _notification: follow: "フォロー" mention: "メンション" reply: "リプライ" - renote: "Renote" + renote: "Boost" quote: "引用" reaction: "リアクション" pollEnded: "アンケートが終了" @@ -2385,7 +2385,7 @@ _notification: _actions: followBack: "フォローバック" reply: "返信" - renote: "Renote" + renote: "Boost" _deck: alwaysShowMainColumn: "常にメインカラムを表示" @@ -2443,7 +2443,7 @@ _webhookSettings: followed: "フォローされたとき" note: "ノートを投稿したとき" reply: "返信されたとき" - renote: "Renoteされたとき" + renote: "Boostされたとき" reaction: "リアクションがあったとき" mention: "メンションされたとき" @@ -2540,13 +2540,13 @@ _animatedMFM: play: "MFMアニメーションを再生" stop: "MFMアニメーション停止" _alert: - text: "アニメーションMFMには、点滅するライトや高速で動くテキスト/絵文字を含めることができる。" - confirm: "アニメイト" + text: "MFMアニメーションには、点滅するライトや高速で動くテキスト/絵文字を含まれる場合があります。" + confirm: "再生する" _dataRequest: - title: "リクエストデータ" - warn: "データのリクエストは3日ごとにしかできない。" - text: "データのダウンロードが完了すると、このアカウントに登録されているEメールアドレスにEメールが送信されます。" + title: "データリクエスト" + warn: "データリクエストは3日ごとに可能です。" + text: "データの保存が完了すると、このアカウントに登録されているEメールアドレスにメールが送信されます。" button: "リクエスト" _dataSaver: From a62898bcb740f5deb9a876f01640f0e8ece1e855 Mon Sep 17 00:00:00 2001 From: morotesovtannu Date: Wed, 10 Jan 2024 18:54:22 +0900 Subject: [PATCH 180/184] chore: fix ja-KS locale --- locales/ja-JP.yml | 2 +- locales/ja-KS.yml | 50 +++++++++++++++++++++++------------------------ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 7fc44b416..0688d20ce 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1801,7 +1801,7 @@ _registry: createKey: "キーを作成" _aboutMisskey: - about: "Sharkeyは、2014年からsyuiloによって開発されているMisskeyをベースにしたオープンソースのソフトウェアです。" + about: "Sharkeyは、Misskeyをベースにしたオープンソースのソフトウェアです。" contributors: "主なコントリビューター" allContributors: "全てのコントリビューター" source: "ソースコード" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 1a78c1ec4..1f9795a5d 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -15,7 +15,7 @@ gotIt: "ほい" cancel: "やめとく" noThankYou: "やめとく" enterUsername: "ユーザー名を入れてや" -renotedBy: "{user}がリノートしたで" +renotedBy: "{user}がブーストしたで" noNotes: "ノートはあらへん" noNotifications: "通知はあらへん" instance: "サーバー" @@ -45,10 +45,10 @@ pin: "ピン留めしとく" unpin: "やっぱピン留めせん" copyContent: "内容をコピー" copyLink: "リンクをコピー" -copyLinkRenote: "リノートのリンクをコピーするで?" +copyLinkRenote: "ブーストのリンクをコピーするで?" delete: "ほかす" deleteAndEdit: "ほかして直す" -deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、リノート、返信も全部消えるんやけどそれでもええん?" +deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、ブースト、返信も全部消えるんやけどそれでもええん?" addToList: "リストに入れたる" addToAntenna: "アンテナに入れる" sendMessage: "メッセージを送る" @@ -105,13 +105,13 @@ followRequests: "フォロー申請" unfollow: "フォローやめる" followRequestPending: "フォロー許してくれるん待っとる" enterEmoji: "絵文字を入れてや" -renote: "リノート" -unrenote: "リノートやめる" -renoted: "リノートしたで。" -cantRenote: "この投稿はリノートできへんっぽい。" -cantReRenote: "リノート自体はリノートできへんで。" +renote: "ブースト" +unrenote: "ブーストやめる" +renoted: "ブーストしたで。" +cantRenote: "この投稿はブーストできへんっぽい。" +cantReRenote: "ブースト自体はブーストできへんで。" quote: "引用" -inChannelRenote: "チャンネルの中でリノート" +inChannelRenote: "チャンネルの中でブースト" inChannelQuote: "チャンネル内引用" pinnedNote: "ピン留めされとるノート" pinned: "ピン留めしとく" @@ -135,8 +135,8 @@ unmarkAsSensitive: "そこまでアカンことないやろ" enterFileName: "ファイル名を入れてや" mute: "ミュート" unmute: "ミュートやめたる" -renoteMute: "リノートは見いひん" -renoteUnmute: "リノートもやっぱ見るわ" +renoteMute: "ブーストは見いひん" +renoteUnmute: "ブーストもやっぱ見るわ" block: "ブロック" unblock: "ブロックやめたる" suspend: "凍結" @@ -677,7 +677,7 @@ behavior: "動作" sample: "サンプル" abuseReports: "通報" reportAbuse: "通報" -reportAbuseRenote: "リノート苦情だすで?" +reportAbuseRenote: "ブースト苦情だすで?" reportAbuseOf: "{name}を通報する" fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ノートがある時はそのURLも書いといてなー。" abuseReported: "無事内容が送信されたみたいやで。おおきに〜。" @@ -711,9 +711,9 @@ manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" notesCount: "ノートの数やで" repliesCount: "返信した数やで" -renotesCount: "リノートした数やで" +renotesCount: "ブーストした数やで" repliedCount: "返信された数やで" -renotedCount: "リノートされた数やで" +renotedCount: "ブーストされた数やで" followingCount: "フォロー数やで" followersCount: "フォロワー数やで" sentReactionsCount: "ツッコんだ数" @@ -1009,7 +1009,7 @@ thisPostMayBeAnnoying: "この投稿は迷惑かもしらんで。" thisPostMayBeAnnoyingHome: "ホームに投稿" thisPostMayBeAnnoyingCancel: "やめとく" thisPostMayBeAnnoyingIgnore: "このまま投稿" -collapseRenotes: "見たことあるリノートは飛ばして表示するで" +collapseRenotes: "見たことあるブーストは飛ばして表示するで" internalServerError: "サーバー内部エラー" internalServerErrorDescription: "サーバーでなんか変なこと起こっとるわ。" copyErrorInfo: "エラー情報をコピるで" @@ -1060,7 +1060,7 @@ forceShowAds: "いっつも広告を映す" addMemo: "メモを足す" editMemo: "メモをいらう" reactionsList: "ツッコミ一覧" -renotesList: "リノート一覧" +renotesList: "ブースト一覧" notificationDisplay: "通知見せる" leftTop: "左上" rightTop: "右上" @@ -1131,7 +1131,7 @@ pastAnnouncements: "過去のお知らせやで" youHaveUnreadAnnouncements: "あんたまだこのお知らせ読んどらんやろ。" useSecurityKey: "ブラウザまたはデバイスの言う通りに、セキュリティキーまたはパスキーを使ってや。" replies: "返事" -renotes: "リノート" +renotes: "ブースト" loadReplies: "返信を見るで" loadConversation: "会話を見るで" pinnedList: "ピン留めしはったリスト" @@ -1142,7 +1142,7 @@ unnotifyNotes: "投稿の通知やめる" authentication: "認証" authenticationRequiredToContinue: "続けるんなら認証してや。" dateAndTime: "日時" -showRenotes: "リノート出す" +showRenotes: "ブースト出す" edited: "いじったやつ" notificationRecieveConfig: "通知もらうかの設定" mutualFollow: "お互いフォローしてんで" @@ -1247,8 +1247,8 @@ _initialTutorial: _visibility: description: "ノートを見れる相手を制限できるわ。" public: "みんなに見せるで。" - home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、リノートからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。" - followers: "フォロワーにだけ見せるで。自分以外はリノートできへんし、フォロワー以外は絶対に見れへん。" + home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、ブーストからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。" + followers: "フォロワーにだけ見せるで。自分以外はブーストできへんし、フォロワー以外は絶対に見れへん。" direct: "指定した人にだけ公開されて、ついでに通知も送るで。ダイレクトメールの代わりとして使ってな。" doNotSendConfidencialOnDirect1: "機密情報を送るときは十分注意せえよ。" doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容が見れるから、信用できへんサーバーのひとにダイレクト投稿するときには、めっちゃ用心しとくんやで。" @@ -1709,7 +1709,7 @@ _registry: domain: "ドメイン" createKey: "キーを作る" _aboutMisskey: - about: "Sharkeyは、syuiloが2014年からずっと作ってはる、Misskeyをベースにしたオープンソースなソフトウェアや。" + about: "Sharkeyは、Misskeyをベースにしたオープンソースなソフトウェアや。" contributors: "主な貢献者" allContributors: "全ての貢献者" source: "ソースコード" @@ -1742,7 +1742,7 @@ _channel: notesCount: "{n}こ投稿があるで" nameAndDescription: "名前と説明" nameOnly: "名前だけ" - allowRenoteToExternal: "チャンネルの外にリノートできるようにする" + allowRenoteToExternal: "チャンネルの外にブーストできるようにする" _menuDisplay: sideFull: "横" sideIcon: "横(アイコン)" @@ -2164,7 +2164,7 @@ _notification: youGotMention: "{name}からのメンション" youGotReply: "{name}からのリプライ" youGotQuote: "{name}による引用" - youRenoted: "{name}がリノートしたみたいやで" + youRenoted: "{name}がブーストしたみたいやで" youWereFollowed: "フォローされたで" youReceivedFollowRequest: "フォロー許可してほしいみたいやな" yourFollowRequestAccepted: "フォローさせてもろたで" @@ -2178,7 +2178,7 @@ _notification: sendTestNotification: "テスト通知を送信するで" notificationWillBeDisplayedLikeThis: "通知はこのように表示されるで" reactedBySomeUsers: "{n}人がツッコんだで" - renotedBySomeUsers: "{n}人がリノートしたで" + renotedBySomeUsers: "{n}人がブーストしたで" followedBySomeUsers: "{n}人にフォローされたで" _types: all: "すべて" @@ -2249,7 +2249,7 @@ _webhookSettings: followed: "フォローもらったとき~!" note: "ノートを投稿したとき~!" reply: "返信があるとき~!" - renote: "リノートされるとき~!" + renote: "ブーストされるとき~!" reaction: "ツッコまれたとき~!" mention: "メンションがあるとき~!" _moderationLogTypes: From 36fd7d17cf1c71fa59eae445d05498a7bf5ab173 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 10 Jan 2024 19:54:59 +0900 Subject: [PATCH 181/184] enhance(drop-and-fusion): some tweaks --- .../src/pages/drop-and-fusion.game.vue | 1052 +++++++++++++++++ .../frontend/src/pages/drop-and-fusion.vue | 982 +-------------- .../src/scripts/drop-and-fusion-engine.ts | 2 +- 3 files changed, 1088 insertions(+), 948 deletions(-) create mode 100644 packages/frontend/src/pages/drop-and-fusion.game.vue diff --git a/packages/frontend/src/pages/drop-and-fusion.game.vue b/packages/frontend/src/pages/drop-and-fusion.game.vue new file mode 100644 index 000000000..acaebbadf --- /dev/null +++ b/packages/frontend/src/pages/drop-and-fusion.game.vue @@ -0,0 +1,1052 @@ + + + + + + + diff --git a/packages/frontend/src/pages/drop-and-fusion.vue b/packages/frontend/src/pages/drop-and-fusion.vue index 9fb7ab2e2..7bd0eef00 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 342e81890..d64c6015a 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 From 762fa6a8d85691e2d5d94a46b23d7641feefd402 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 11 Jan 2024 12:34:03 +0900 Subject: [PATCH 182/184] enhance(drop-and-fusion): make game engine headless for server-side running --- .../src/pages/drop-and-fusion.game.vue | 458 ++++++++++++------ .../src/scripts/drop-and-fusion-engine.ts | 359 ++++---------- 2 files changed, 397 insertions(+), 420 deletions(-) diff --git a/packages/frontend/src/pages/drop-and-fusion.game.vue b/packages/frontend/src/pages/drop-and-fusion.game.vue index acaebbadf..3fefb49fa 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" > - +