From 316ffcea54eb7f1f4b04c8b9937b390c629d088c Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 24 Dec 2023 14:20:43 +0900 Subject: [PATCH 01/99] =?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 02/99] =?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 03/99] =?UTF-8?q?fix(backend):=201702718871541-ffVisibilit?= =?UTF-8?q?y.js=E3=81=AEdown=E3=81=8C=E5=A3=8A=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=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 04/99] 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 05/99] 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 06/99] 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 07/99] 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 08/99] =?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 73/99] 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 74/99] tweak game --- .../assets/drop-and-fusion/dropper.png | Bin 0 -> 32415 bytes .../assets/drop-and-fusion/frame-dark.svg | Bin 0 -> 68475 bytes .../assets/drop-and-fusion/frame-light.svg | Bin 0 -> 67975 bytes .../frontend/assets/drop-and-fusion/frame.svg | Bin 69947 -> 0 bytes .../frontend/src/pages/drop-and-fusion.vue | 80 ++++++++++++++---- 5 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 packages/frontend/assets/drop-and-fusion/dropper.png create mode 100644 packages/frontend/assets/drop-and-fusion/frame-dark.svg create mode 100644 packages/frontend/assets/drop-and-fusion/frame-light.svg delete mode 100644 packages/frontend/assets/drop-and-fusion/frame.svg diff --git a/packages/frontend/assets/drop-and-fusion/dropper.png b/packages/frontend/assets/drop-and-fusion/dropper.png new file mode 100644 index 0000000000000000000000000000000000000000..f4300aa5c06f6001a87c01f8525847b294f43be3 GIT binary patch literal 32415 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 A_y7O^ literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/frame-dark.svg b/packages/frontend/assets/drop-and-fusion/frame-dark.svg new file mode 100644 index 0000000000000000000000000000000000000000..3fa7c0da81e0b8eb7aae48b18e85d0f9ee72441a GIT binary patch literal 68475 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 literal 0 HcmV?d00001 diff --git a/packages/frontend/assets/drop-and-fusion/frame-light.svg b/packages/frontend/assets/drop-and-fusion/frame-light.svg new file mode 100644 index 0000000000000000000000000000000000000000..6052ccbaa09bcc6120bbd81eb1988b666aedafbd GIT binary patch literal 67975 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