Merge remote-branch 'misskey/develop'
This commit is contained in:
commit
4eee67647d
|
@ -114,6 +114,7 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# aidx ... Millisecond accuracy
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -121,7 +122,7 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aid'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
|
@ -125,6 +125,7 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# aidx ... Millisecond accuracy
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -132,7 +133,7 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aid'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
|
@ -114,6 +114,7 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# aidx ... Millisecond accuracy
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -121,7 +122,7 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: 'aid'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
2
.github/cherrypick/test.yml
vendored
2
.github/cherrypick/test.yml
vendored
|
@ -12,4 +12,4 @@ db:
|
||||||
redis:
|
redis:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
port: 56312
|
port: 56312
|
||||||
id: aid
|
id: aidx
|
||||||
|
|
2
.github/workflows/test-backend.yml
vendored
2
.github/workflows/test-backend.yml
vendored
|
@ -13,7 +13,7 @@ jobs:
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [20.x]
|
node-version: [20.5.1]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
|
|
2
.github/workflows/test-cherrypick-js.yml
vendored
2
.github/workflows/test-cherrypick-js.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [20.x]
|
node-version: [20.5.1]
|
||||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
4
.github/workflows/test-frontend.yml
vendored
4
.github/workflows/test-frontend.yml
vendored
|
@ -13,7 +13,7 @@ jobs:
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [20.x]
|
node-version: [20.5.1]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.0.0
|
- uses: actions/checkout@v4.0.0
|
||||||
|
@ -51,7 +51,7 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [20.x]
|
node-version: [20.5.1]
|
||||||
browser: [chrome]
|
browser: [chrome]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|
2
.github/workflows/test-production.yml
vendored
2
.github/workflows/test-production.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [20.x]
|
node-version: [20.5.1]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.0.0
|
- uses: actions/checkout@v4.0.0
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
- お知らせのバナー表示やダイアログ表示が可能に
|
- お知らせのバナー表示やダイアログ表示が可能に
|
||||||
- お知らせのアイコンを設定可能に
|
- お知らせのアイコンを設定可能に
|
||||||
- チャンネルをセンシティブ指定できるようになりました
|
- チャンネルをセンシティブ指定できるようになりました
|
||||||
|
- センシティブチャンネルのNoteのReNoteはデフォルトでHome TLに流れるようになりました
|
||||||
- 二要素認証のバックアップコードが生成されるようになりました ref. https://github.com/MisskeyIO/misskey/pull/121
|
- 二要素認証のバックアップコードが生成されるようになりました ref. https://github.com/MisskeyIO/misskey/pull/121
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
@ -35,6 +36,7 @@
|
||||||
- Enhance: ノート検索にローカルのみ検索可能なオプションの追加
|
- Enhance: ノート検索にローカルのみ検索可能なオプションの追加
|
||||||
- Enhance: AiScriptで`LOCALE`として現在の設定言語を取得できるように
|
- Enhance: AiScriptで`LOCALE`として現在の設定言語を取得できるように
|
||||||
- Enhance: Renote自体を通報できるように
|
- Enhance: Renote自体を通報できるように
|
||||||
|
- Enhance: データセーバーモードの強化
|
||||||
- Enhance: Renoteを管理者権限で削除可能に
|
- Enhance: Renoteを管理者権限で削除可能に
|
||||||
- `$[rainbow ]`記法が、動きのあるMFMが無効になっていても使用できるようになりました
|
- `$[rainbow ]`記法が、動きのあるMFMが無効になっていても使用できるようになりました
|
||||||
- Playの操作を行うAPI TokenをAPIコンソールから発行できるように
|
- Playの操作を行うAPI TokenをAPIコンソールから発行できるように
|
||||||
|
@ -52,6 +54,7 @@
|
||||||
- ファイルアップロード時等にファイル名の拡張子を修正する関数(correctFilename)の挙動を改善
|
- ファイルアップロード時等にファイル名の拡張子を修正する関数(correctFilename)の挙動を改善
|
||||||
- Webhookのペイロードにサーバーのurlが含まれるようになりました
|
- Webhookのペイロードにサーバーのurlが含まれるようになりました
|
||||||
- Webhook設定でsecretを空に出来るように
|
- Webhook設定でsecretを空に出来るように
|
||||||
|
- 使われていないアンテナの自動停止を設定可能に
|
||||||
- Fix: 一部のfeatured noteを照会できない問題を修正
|
- Fix: 一部のfeatured noteを照会できない問題を修正
|
||||||
- Fix: muteがapiからのuser list timeline取得で機能しない問題を修正
|
- Fix: muteがapiからのuser list timeline取得で機能しない問題を修正
|
||||||
- Fix: ジョブキュー管理画面の認証を回避できる問題を修正
|
- Fix: ジョブキュー管理画面の認証を回避できる問題を修正
|
||||||
|
|
|
@ -135,6 +135,7 @@ redis:
|
||||||
|
|
||||||
# Available methods:
|
# Available methods:
|
||||||
# aid ... Short, Millisecond accuracy
|
# aid ... Short, Millisecond accuracy
|
||||||
|
# aidx ... Millisecond accuracy
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||||
# ulid ... Millisecond accuracy
|
# ulid ... Millisecond accuracy
|
||||||
# objectid ... This is left for backward compatibility
|
# objectid ... This is left for backward compatibility
|
||||||
|
@ -142,7 +143,7 @@ redis:
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: "aid"
|
id: "aidx"
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
|
65
gulpfile.mjs
65
gulpfile.mjs
|
@ -1,65 +0,0 @@
|
||||||
/**
|
|
||||||
* Gulp tasks
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as fs from 'node:fs';
|
|
||||||
import gulp from 'gulp';
|
|
||||||
import replace from 'gulp-replace';
|
|
||||||
import terser from 'gulp-terser';
|
|
||||||
import cssnano from 'gulp-cssnano';
|
|
||||||
|
|
||||||
import locales from './locales/index.js';
|
|
||||||
import meta from './package.json' assert { type: "json" };
|
|
||||||
|
|
||||||
gulp.task('copy:backend:views', () =>
|
|
||||||
gulp.src('./packages/backend/src/server/web/views/**/*').pipe(gulp.dest('./packages/backend/built/server/web/views'))
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task('copy:frontend:fonts', () =>
|
|
||||||
gulp.src('./packages/frontend/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_frontend_dist_/fonts/'))
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task('copy:frontend:tabler-icons', () =>
|
|
||||||
gulp.src('./packages/frontend/node_modules/@tabler/icons-webfont/**/*').pipe(gulp.dest('./built/_frontend_dist_/tabler-icons/'))
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task('copy:frontend:locales', cb => {
|
|
||||||
fs.mkdirSync('./built/_frontend_dist_/locales', { recursive: true });
|
|
||||||
|
|
||||||
const v = { '_version_': meta.version };
|
|
||||||
|
|
||||||
for (const [lang, locale] of Object.entries(locales)) {
|
|
||||||
fs.writeFileSync(`./built/_frontend_dist_/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
|
|
||||||
}
|
|
||||||
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('build:backend:script', () => {
|
|
||||||
return gulp.src(['./packages/backend/src/server/web/boot.js', './packages/backend/src/server/web/bios.js', './packages/backend/src/server/web/cli.js'])
|
|
||||||
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
|
||||||
.pipe(terser({
|
|
||||||
toplevel: true
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('build:backend:style', () => {
|
|
||||||
return gulp.src(['./packages/backend/src/server/web/style.css', './packages/backend/src/server/web/bios.css', './packages/backend/src/server/web/cli.css', './packages/backend/src/server/web/error.css'])
|
|
||||||
.pipe(cssnano({
|
|
||||||
zindex: false
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./packages/backend/built/server/web/'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('build', gulp.parallel(
|
|
||||||
'copy:frontend:locales', 'copy:backend:views', 'build:backend:script', 'build:backend:style', 'copy:frontend:fonts', 'copy:frontend:tabler-icons'
|
|
||||||
));
|
|
||||||
|
|
||||||
gulp.task('default', gulp.task('build'));
|
|
||||||
|
|
||||||
gulp.task('watch', () => {
|
|
||||||
gulp.watch([
|
|
||||||
'./packages/*/src/**/*',
|
|
||||||
], { ignoreInitial: false }, gulp.task('build'));
|
|
||||||
});
|
|
|
@ -45,6 +45,7 @@ pin: "An dein Profil anheften"
|
||||||
unpin: "Von deinem Profil lösen"
|
unpin: "Von deinem Profil lösen"
|
||||||
copyContent: "Inhalt kopieren"
|
copyContent: "Inhalt kopieren"
|
||||||
copyLink: "Link kopieren"
|
copyLink: "Link kopieren"
|
||||||
|
copyLinkRenote: "Renote-Link kopieren"
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
deleteAndEdit: "Löschen und Bearbeiten"
|
deleteAndEdit: "Löschen und Bearbeiten"
|
||||||
deleteAndEditConfirm: "Möchtest du diese Notiz wirklich löschen und bearbeiten? Alle Reaktionen, Renotes und Antworten dieser Notiz werden verloren gehen."
|
deleteAndEditConfirm: "Möchtest du diese Notiz wirklich löschen und bearbeiten? Alle Reaktionen, Renotes und Antworten dieser Notiz werden verloren gehen."
|
||||||
|
@ -667,6 +668,7 @@ behavior: "Verhalten"
|
||||||
sample: "Beispiel"
|
sample: "Beispiel"
|
||||||
abuseReports: "Meldungen"
|
abuseReports: "Meldungen"
|
||||||
reportAbuse: "Melden"
|
reportAbuse: "Melden"
|
||||||
|
reportAbuseRenote: "Renote melden"
|
||||||
reportAbuseOf: "{name} melden"
|
reportAbuseOf: "{name} melden"
|
||||||
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an."
|
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an."
|
||||||
abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
|
abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
|
||||||
|
|
|
@ -85,6 +85,7 @@ pin: "Pin to profile"
|
||||||
unpin: "Unpin from profile"
|
unpin: "Unpin from profile"
|
||||||
copyContent: "Copy contents"
|
copyContent: "Copy contents"
|
||||||
copyLink: "Copy link"
|
copyLink: "Copy link"
|
||||||
|
copyLinkRenote: "Copy renote link"
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
deleteAndEdit: "Delete and edit"
|
deleteAndEdit: "Delete and edit"
|
||||||
deleteAndEditConfirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
|
deleteAndEditConfirm: "Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it."
|
||||||
|
@ -711,7 +712,7 @@ behavior: "Behavior"
|
||||||
sample: "Sample"
|
sample: "Sample"
|
||||||
abuseReports: "Reports"
|
abuseReports: "Reports"
|
||||||
reportAbuse: "Report"
|
reportAbuse: "Report"
|
||||||
reportAbuseRenote: "Report Renote"
|
reportAbuseRenote: "Report renote"
|
||||||
reportAbuseOf: "Report {name}"
|
reportAbuseOf: "Report {name}"
|
||||||
fillAbuseReportDescription: "Please fill in details regarding this report. If it is about a specific note, please include its URL."
|
fillAbuseReportDescription: "Please fill in details regarding this report. If it is about a specific note, please include its URL."
|
||||||
abuseReported: "Your report has been sent. Thank you very much."
|
abuseReported: "Your report has been sent. Thank you very much."
|
||||||
|
|
|
@ -45,6 +45,7 @@ pin: "Fijar al perfil"
|
||||||
unpin: "Desfijar"
|
unpin: "Desfijar"
|
||||||
copyContent: "Copiar contenido"
|
copyContent: "Copiar contenido"
|
||||||
copyLink: "Copiar enlace"
|
copyLink: "Copiar enlace"
|
||||||
|
copyLinkRenote: "Copiar enlace de renota"
|
||||||
delete: "Borrar"
|
delete: "Borrar"
|
||||||
deleteAndEdit: "Borrar y editar"
|
deleteAndEdit: "Borrar y editar"
|
||||||
deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta nota y editarla? Perderás todas las reacciones, renotas y respuestas."
|
deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta nota y editarla? Perderás todas las reacciones, renotas y respuestas."
|
||||||
|
@ -667,6 +668,7 @@ behavior: "Comportamiento"
|
||||||
sample: "Muestra"
|
sample: "Muestra"
|
||||||
abuseReports: "Reportes"
|
abuseReports: "Reportes"
|
||||||
reportAbuse: "Reportar"
|
reportAbuse: "Reportar"
|
||||||
|
reportAbuseRenote: "Reportar renota"
|
||||||
reportAbuseOf: "Reportar a {name}"
|
reportAbuseOf: "Reportar a {name}"
|
||||||
fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en particular, ingrese la URL de esta."
|
fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en particular, ingrese la URL de esta."
|
||||||
abuseReported: "Se ha enviado el reporte. Muchas gracias."
|
abuseReported: "Se ha enviado el reporte. Muchas gracias."
|
||||||
|
@ -1834,6 +1836,10 @@ _permissions:
|
||||||
"write:gallery": "Editar galería"
|
"write:gallery": "Editar galería"
|
||||||
"read:gallery-likes": "Ver favoritos de la galería"
|
"read:gallery-likes": "Ver favoritos de la galería"
|
||||||
"write:gallery-likes": "Editar favoritos de la galería"
|
"write:gallery-likes": "Editar favoritos de la galería"
|
||||||
|
"read:flash": "Ver Play"
|
||||||
|
"write:flash": "Editar Plays"
|
||||||
|
"read:flash-likes": "Ver los Play que me gustan"
|
||||||
|
"write:flash-likes": "Editar lista de Play que me gustan"
|
||||||
_auth:
|
_auth:
|
||||||
shareAccessTitle: "Permisos de la aplicación"
|
shareAccessTitle: "Permisos de la aplicación"
|
||||||
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
|
||||||
|
@ -2110,6 +2116,8 @@ _deck:
|
||||||
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas columnas donde quieras."
|
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas columnas donde quieras."
|
||||||
widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna y agrega un widget."
|
widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna y agrega un widget."
|
||||||
useSimpleUiForNonRootPages: "Mostrar páginas no pertenecientes a la raíz con la interfaz simple"
|
useSimpleUiForNonRootPages: "Mostrar páginas no pertenecientes a la raíz con la interfaz simple"
|
||||||
|
usedAsMinWidthWhenFlexible: "Se usará el ancho mínimo cuando la opción \"Autoajustar ancho\" esté habilitada"
|
||||||
|
flexible: "Autoajustar ancho"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Principal"
|
main: "Principal"
|
||||||
widgets: "Widgets"
|
widgets: "Widgets"
|
||||||
|
|
|
@ -45,6 +45,7 @@ pin: "Fissa sul profilo"
|
||||||
unpin: "Non fissare sul profilo"
|
unpin: "Non fissare sul profilo"
|
||||||
copyContent: "Copia il contenuto"
|
copyContent: "Copia il contenuto"
|
||||||
copyLink: "Copia il link"
|
copyLink: "Copia il link"
|
||||||
|
copyLinkRenote: "Copia collegamento alla Rinota"
|
||||||
delete: "Elimina"
|
delete: "Elimina"
|
||||||
deleteAndEdit: "Elimina e modifica"
|
deleteAndEdit: "Elimina e modifica"
|
||||||
deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verranno eliminate anche tutte le reazioni, rinote e risposte collegate."
|
deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verranno eliminate anche tutte le reazioni, rinote e risposte collegate."
|
||||||
|
@ -667,6 +668,7 @@ behavior: "Comportamento"
|
||||||
sample: "Esempio"
|
sample: "Esempio"
|
||||||
abuseReports: "Segnalazioni"
|
abuseReports: "Segnalazioni"
|
||||||
reportAbuse: "Segnala"
|
reportAbuse: "Segnala"
|
||||||
|
reportAbuseRenote: "Segnala la Rinota"
|
||||||
reportAbuseOf: "Segnala {name}"
|
reportAbuseOf: "Segnala {name}"
|
||||||
fillAbuseReportDescription: "Per favore, spiegaci il motivo della segnalazione. Se riguarda una Nota precisa, indica anche l'indirizzo URL."
|
fillAbuseReportDescription: "Per favore, spiegaci il motivo della segnalazione. Se riguarda una Nota precisa, indica anche l'indirizzo URL."
|
||||||
abuseReported: "La segnalazione è stata inviata. Grazie."
|
abuseReported: "La segnalazione è stata inviata. Grazie."
|
||||||
|
@ -2114,8 +2116,8 @@ _deck:
|
||||||
introduction2: "È possibile aggiungere colonne in qualsiasi momento premendo + sulla destra dello schermo."
|
introduction2: "È possibile aggiungere colonne in qualsiasi momento premendo + sulla destra dello schermo."
|
||||||
widgetsIntroduction: "Dal menu della colonna, selezionare \"Modifica i riquadri\" per aggiungere un un riquadro con funzionalità"
|
widgetsIntroduction: "Dal menu della colonna, selezionare \"Modifica i riquadri\" per aggiungere un un riquadro con funzionalità"
|
||||||
useSimpleUiForNonRootPages: "Visualizza sotto pagine con interfaccia web semplice"
|
useSimpleUiForNonRootPages: "Visualizza sotto pagine con interfaccia web semplice"
|
||||||
usedAsMinWidthWhenFlexible: "Lunghezza minima sarò usata quando l'opzione \"Lunghezza automacia\" è attivata"
|
usedAsMinWidthWhenFlexible: "Se \"larghezza flessibile\" è abilitato, questa diventa la larghezza minima"
|
||||||
flexible: "Lunghezza automatica"
|
flexible: "Larghezza flessibile"
|
||||||
_columns:
|
_columns:
|
||||||
main: "Principale"
|
main: "Principale"
|
||||||
widgets: "Riquadri"
|
widgets: "Riquadri"
|
||||||
|
|
|
@ -45,6 +45,7 @@ pin: "Fixar no perfil"
|
||||||
unpin: "Desafixar do perfil"
|
unpin: "Desafixar do perfil"
|
||||||
copyContent: "Copiar conteúdos"
|
copyContent: "Copiar conteúdos"
|
||||||
copyLink: "Copiar link"
|
copyLink: "Copiar link"
|
||||||
|
copyLinkRenote: "Copiar o link da repostagem"
|
||||||
delete: "Excluir"
|
delete: "Excluir"
|
||||||
deleteAndEdit: "Excluir e editar"
|
deleteAndEdit: "Excluir e editar"
|
||||||
deleteAndEditConfirm: "Deseja excluir esta nota e editá-la novamente? Todas as reações, compartilhamentos e respostas a esta nota também serão excluídas."
|
deleteAndEditConfirm: "Deseja excluir esta nota e editá-la novamente? Todas as reações, compartilhamentos e respostas a esta nota também serão excluídas."
|
||||||
|
@ -654,6 +655,7 @@ behavior: "Comportamento"
|
||||||
sample: "Exemplo"
|
sample: "Exemplo"
|
||||||
abuseReports: "Denúncias"
|
abuseReports: "Denúncias"
|
||||||
reportAbuse: "Denúncias"
|
reportAbuse: "Denúncias"
|
||||||
|
reportAbuseRenote: "Reportar repostagem"
|
||||||
reportAbuseOf: "Denunciar {name}"
|
reportAbuseOf: "Denunciar {name}"
|
||||||
fillAbuseReportDescription: "Por favor, forneça detalhes sobre o motivo da denúncia. Se houver uma nota específica envolvida, inclua também a URL dela."
|
fillAbuseReportDescription: "Por favor, forneça detalhes sobre o motivo da denúncia. Se houver uma nota específica envolvida, inclua também a URL dela."
|
||||||
abuseReported: "Denúncia enviada. Obrigado por sua ajuda."
|
abuseReported: "Denúncia enviada. Obrigado por sua ajuda."
|
||||||
|
@ -829,7 +831,7 @@ hashtags: "Hashtags"
|
||||||
troubleshooting: "Resolução de problemas"
|
troubleshooting: "Resolução de problemas"
|
||||||
useBlurEffect: "Usar efeito de desfoque na UI"
|
useBlurEffect: "Usar efeito de desfoque na UI"
|
||||||
learnMore: "Saiba mais"
|
learnMore: "Saiba mais"
|
||||||
misskeyUpdated: "Misskey foi atualizado!"
|
misskeyUpdated: "CherryPick foi atualizado!"
|
||||||
whatIsNew: "Ver atualizações"
|
whatIsNew: "Ver atualizações"
|
||||||
translate: "Traduzir"
|
translate: "Traduzir"
|
||||||
translatedFrom: "Traduzido de"
|
translatedFrom: "Traduzido de"
|
||||||
|
@ -917,23 +919,42 @@ pleaseSelect: "Por favor, selecione."
|
||||||
reverse: "Inversão"
|
reverse: "Inversão"
|
||||||
colored: "Colorido"
|
colored: "Colorido"
|
||||||
refreshInterval: "Intervalo de atualização"
|
refreshInterval: "Intervalo de atualização"
|
||||||
|
type: "Tipo"
|
||||||
speed: "Velocidade"
|
speed: "Velocidade"
|
||||||
|
slow: "Lento"
|
||||||
|
fast: "Rápido"
|
||||||
sensitiveMediaDetection: "Detecção de conteúdo sensível"
|
sensitiveMediaDetection: "Detecção de conteúdo sensível"
|
||||||
|
localOnly: "Apenas local"
|
||||||
|
remoteOnly: "Apenas remoto"
|
||||||
cannotUploadBecauseExceedsFileSizeLimit: "Não é possível realizar o upload deste arquivo porque ele excede o tamanho máximo permitido."
|
cannotUploadBecauseExceedsFileSizeLimit: "Não é possível realizar o upload deste arquivo porque ele excede o tamanho máximo permitido."
|
||||||
beta: "Beta"
|
beta: "Beta"
|
||||||
enableAutoSensitive: "Marcar automaticamente como conteúdo sensível"
|
enableAutoSensitive: "Marcar automaticamente como conteúdo sensível"
|
||||||
enableAutoSensitiveDescription: "Quando disponível, a marcação de mídia sensível será automaticamente atribuído ao conteúdo de mídia usando aprendizado de máquina. Mesmo que você desative essa função, em alguns servidores, isso pode ser configurado automaticamente."
|
enableAutoSensitiveDescription: "Quando disponível, a marcação de mídia sensível será automaticamente atribuído ao conteúdo de mídia usando aprendizado de máquina. Mesmo que você desative essa função, em alguns servidores, isso pode ser configurado automaticamente."
|
||||||
activeEmailValidationDescription: "A validação do endereço de e-mail do usuário será realizada de forma mais rigorosa, considerando se é um endereço descartável ou se é possível realizar comunicação efetiva. Se desativado, apenas a validade do formato do endereço será verificada como uma sequência de caracteres."
|
activeEmailValidationDescription: "A validação do endereço de e-mail do usuário será realizada de forma mais rigorosa, considerando se é um endereço descartável ou se é possível realizar comunicação efetiva. Se desativado, apenas a validade do formato do endereço será verificada como uma sequência de caracteres."
|
||||||
|
shuffle: "Aleatório"
|
||||||
account: "Contas"
|
account: "Contas"
|
||||||
|
move: "Mover"
|
||||||
|
pushNotification: "Notificações Push"
|
||||||
|
subscribePushNotification: "Ativar notificações push"
|
||||||
|
unsubscribePushNotification: "Desativar notificações push"
|
||||||
|
windowMinimize: "Minimizar"
|
||||||
|
windowRestore: "Restaurar"
|
||||||
|
caption: "legenda"
|
||||||
|
tools: "Ferramentas"
|
||||||
like: "Curtir"
|
like: "Curtir"
|
||||||
unlike: "Remover curtida"
|
unlike: "Remover curtida"
|
||||||
numberOfLikes: "Número de curtidas"
|
numberOfLikes: "Número de curtidas"
|
||||||
show: "Visualizar"
|
show: "Visualizar"
|
||||||
|
neverShow: "Não exibir novamente"
|
||||||
|
remindMeLater: "Lembrar mais tarde"
|
||||||
didYouLikeMisskey: "Você gostou do CherryPick?"
|
didYouLikeMisskey: "Você gostou do CherryPick?"
|
||||||
pleaseDonate: "O CherryPick é um software gratuito utilizado por {host}. Para que possamos continuar o desenvolvimento, pedimos que considerem fazer doações. A sua contribuição é muito importante!"
|
pleaseDonate: "O CherryPick é um software gratuito utilizado por {host}. Para que possamos continuar o desenvolvimento, pedimos que considerem fazer doações. A sua contribuição é muito importante!"
|
||||||
roles: "Cargos"
|
roles: "Cargos"
|
||||||
role: "Cargo"
|
role: "Cargo"
|
||||||
noRole: "Nenhum cargo"
|
noRole: "Nenhum cargo"
|
||||||
|
normalUser: "Usuários padrão"
|
||||||
|
undefined: "Indefinido"
|
||||||
|
assign: "Atribuir"
|
||||||
unassign: "Remover"
|
unassign: "Remover"
|
||||||
color: "Cor"
|
color: "Cor"
|
||||||
manageCustomEmojis: "Gerenciar Emojis customizados"
|
manageCustomEmojis: "Gerenciar Emojis customizados"
|
||||||
|
@ -953,7 +974,7 @@ thisPostMayBeAnnoying: "Esta nota pode incomodar outras pessoas."
|
||||||
thisPostMayBeAnnoyingHome: "Postar na linha do tempo inicial"
|
thisPostMayBeAnnoyingHome: "Postar na linha do tempo inicial"
|
||||||
thisPostMayBeAnnoyingCancel: "Cancelar"
|
thisPostMayBeAnnoyingCancel: "Cancelar"
|
||||||
thisPostMayBeAnnoyingIgnore: "Postar mesmo assim"
|
thisPostMayBeAnnoyingIgnore: "Postar mesmo assim"
|
||||||
collapseRenotes: "Ocultar Renotes já visualizadas"
|
collapseRenotes: "Ocultar repostagens já visualizadas"
|
||||||
internalServerError: "Erro interno de servidor"
|
internalServerError: "Erro interno de servidor"
|
||||||
emailNotSupported: "O envio de e-mails não é suportado nesta instância"
|
emailNotSupported: "O envio de e-mails não é suportado nesta instância"
|
||||||
likeOnly: "Apenas curtidas"
|
likeOnly: "Apenas curtidas"
|
||||||
|
@ -963,8 +984,19 @@ rolesAssignedToMe: "Cargos atribuídos a mim"
|
||||||
unfavoriteConfirm: "Deseja realmente remover dos favoritos?"
|
unfavoriteConfirm: "Deseja realmente remover dos favoritos?"
|
||||||
drivecleaner: "Limpeza do drive"
|
drivecleaner: "Limpeza do drive"
|
||||||
retryAllQueuesConfirmTitle: "Gostaria de tentar novamente agora?"
|
retryAllQueuesConfirmTitle: "Gostaria de tentar novamente agora?"
|
||||||
|
reactionsList: "Reações"
|
||||||
|
renotesList: "Repostagens"
|
||||||
|
leftTop: "Superior esquerdo"
|
||||||
|
rightTop: "Superior direito"
|
||||||
|
leftBottom: "Inferior esquerdo"
|
||||||
|
rightBottom: "Inferior direito"
|
||||||
|
vertical: "Vertical"
|
||||||
horizontal: "Exibir painel lateral inteiro"
|
horizontal: "Exibir painel lateral inteiro"
|
||||||
|
position: "Posição"
|
||||||
|
serverRules: "Regras do servidor"
|
||||||
|
continue: "Continuar"
|
||||||
preservedUsernamesDescription: "Liste os nomes de usuário que deseja reservar, separando-os por quebras de linha. Os nomes de usuário especificados aqui não poderão ser utilizados durante a criação de contas. No entanto, esta restrição não se aplica quando a conta é criada por um administrador. Além disso, as contas que já existem não serão afetadas."
|
preservedUsernamesDescription: "Liste os nomes de usuário que deseja reservar, separando-os por quebras de linha. Os nomes de usuário especificados aqui não poderão ser utilizados durante a criação de contas. No entanto, esta restrição não se aplica quando a conta é criada por um administrador. Além disso, as contas que já existem não serão afetadas."
|
||||||
|
archive: "Arquivo"
|
||||||
channelArchiveConfirmTitle: "Deseja realmente arquivar {name}?"
|
channelArchiveConfirmTitle: "Deseja realmente arquivar {name}?"
|
||||||
youFollowing: "Seguindo"
|
youFollowing: "Seguindo"
|
||||||
preventAiLearningDescription: "Solicita-se que o conteúdo de notas e imagens enviadas não seja usado como objeto de aprendizado por sistemas externos de geração de texto ou imagens. Isso é alcançado incluindo a flag 'noai' na resposta HTML. No entanto, o cumprimento dessa solicitação depende do próprio sistema de IA, portanto, não é garantia total de prevenção de aprendizado."
|
preventAiLearningDescription: "Solicita-se que o conteúdo de notas e imagens enviadas não seja usado como objeto de aprendizado por sistemas externos de geração de texto ou imagens. Isso é alcançado incluindo a flag 'noai' na resposta HTML. No entanto, o cumprimento dessa solicitação depende do próprio sistema de IA, portanto, não é garantia total de prevenção de aprendizado."
|
||||||
|
@ -1268,6 +1300,8 @@ _menuDisplay:
|
||||||
sideFull: "Exibir painel lateral inteiro"
|
sideFull: "Exibir painel lateral inteiro"
|
||||||
top: "Exibir barra superior"
|
top: "Exibir barra superior"
|
||||||
hide: "Ocultar"
|
hide: "Ocultar"
|
||||||
|
_instanceMute:
|
||||||
|
instanceMuteDescription: "Todas as notas e repostagens do servidor configurado serão silenciados, incluindo respostas aos usuários do servidor mutado."
|
||||||
_theme:
|
_theme:
|
||||||
description: "Descrição"
|
description: "Descrição"
|
||||||
alpha: "Opacidade"
|
alpha: "Opacidade"
|
||||||
|
@ -1402,6 +1436,7 @@ _notification:
|
||||||
youGotMention: "{name} te mencionou"
|
youGotMention: "{name} te mencionou"
|
||||||
youGotReply: "{name} te respondeu"
|
youGotReply: "{name} te respondeu"
|
||||||
youGotQuote: "{name} te citou"
|
youGotQuote: "{name} te citou"
|
||||||
|
youRenoted: "Repostagens de {name}"
|
||||||
youWereFollowed: "Você tem um novo seguidor"
|
youWereFollowed: "Você tem um novo seguidor"
|
||||||
youReceivedFollowRequest: "Você recebeu um pedido de seguidor"
|
youReceivedFollowRequest: "Você recebeu um pedido de seguidor"
|
||||||
yourFollowRequestAccepted: "Seu pedido de seguidor foi aceito"
|
yourFollowRequestAccepted: "Seu pedido de seguidor foi aceito"
|
||||||
|
@ -1454,3 +1489,4 @@ _webhookSettings:
|
||||||
_events:
|
_events:
|
||||||
follow: "Quando seguindo um usuário"
|
follow: "Quando seguindo um usuário"
|
||||||
followed: "Quando sendo seguido"
|
followed: "Quando sendo seguido"
|
||||||
|
renote: "Quando repostado"
|
||||||
|
|
|
@ -45,6 +45,7 @@ pin: "置顶"
|
||||||
unpin: "取消置顶"
|
unpin: "取消置顶"
|
||||||
copyContent: "复制内容"
|
copyContent: "复制内容"
|
||||||
copyLink: "复制链接"
|
copyLink: "复制链接"
|
||||||
|
copyLinkRenote: "复制转帖链接"
|
||||||
delete: "删除"
|
delete: "删除"
|
||||||
deleteAndEdit: "删除并编辑"
|
deleteAndEdit: "删除并编辑"
|
||||||
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。"
|
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。"
|
||||||
|
@ -667,6 +668,7 @@ behavior: "行为"
|
||||||
sample: "示例"
|
sample: "示例"
|
||||||
abuseReports: "举报"
|
abuseReports: "举报"
|
||||||
reportAbuse: "举报"
|
reportAbuse: "举报"
|
||||||
|
reportAbuseRenote: "举报转帖"
|
||||||
reportAbuseOf: "举报 {name}"
|
reportAbuseOf: "举报 {name}"
|
||||||
fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写 URL 地址。"
|
fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写 URL 地址。"
|
||||||
abuseReported: "内容已发送。感谢您提交信息。"
|
abuseReported: "内容已发送。感谢您提交信息。"
|
||||||
|
|
19
package.json
19
package.json
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "cherrypick",
|
"name": "cherrypick",
|
||||||
"version": "2023.9.0-beta.3-cp-4.3.0-beta.3",
|
"version": "2023.9.0-beta.4-cp-4.3.0-beta.3",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/kokonect-link/cherrypick.git"
|
"url": "https://github.com/kokonect-link/cherrypick.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@8.7.1",
|
"packageManager": "pnpm@8.7.4",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/frontend",
|
"packages/frontend",
|
||||||
"packages/backend",
|
"packages/backend",
|
||||||
|
@ -15,7 +15,8 @@
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build-pre": "node ./scripts/build-pre.js",
|
"build-pre": "node ./scripts/build-pre.js",
|
||||||
"build": "pnpm build-pre && pnpm -r build && pnpm gulp",
|
"build-assets": "node ./scripts/build-assets.mjs",
|
||||||
|
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
|
||||||
"build-storybook": "pnpm --filter frontend build-storybook",
|
"build-storybook": "pnpm --filter frontend build-storybook",
|
||||||
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/index.js",
|
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/index.js",
|
||||||
"start:docker": "pnpm check:connect && cd packages/backend && exec node ./built/boot/index.js",
|
"start:docker": "pnpm check:connect && cd packages/backend && exec node ./built/boot/index.js",
|
||||||
|
@ -25,7 +26,6 @@
|
||||||
"check:connect": "cd packages/backend && pnpm check:connect",
|
"check:connect": "cd packages/backend && pnpm check:connect",
|
||||||
"migrateandstart": "pnpm migrate && pnpm start",
|
"migrateandstart": "pnpm migrate && pnpm start",
|
||||||
"migrateandstart:docker": "pnpm migrate && exec pnpm start:docker",
|
"migrateandstart:docker": "pnpm migrate && exec pnpm start:docker",
|
||||||
"gulp": "pnpm exec gulp build",
|
|
||||||
"watch": "pnpm dev",
|
"watch": "pnpm dev",
|
||||||
"dev": "node ./scripts/dev.mjs",
|
"dev": "node ./scripts/dev.mjs",
|
||||||
"lint": "pnpm -r lint",
|
"lint": "pnpm -r lint",
|
||||||
|
@ -36,7 +36,6 @@
|
||||||
"jest-and-coverage": "cd packages/backend && pnpm jest-and-coverage",
|
"jest-and-coverage": "cd packages/backend && pnpm jest-and-coverage",
|
||||||
"test": "pnpm -r test",
|
"test": "pnpm -r test",
|
||||||
"test-and-coverage": "pnpm -r test-and-coverage",
|
"test-and-coverage": "pnpm -r test-and-coverage",
|
||||||
"format": "pnpm exec gulp format",
|
|
||||||
"clean": "node ./scripts/clean.js",
|
"clean": "node ./scripts/clean.js",
|
||||||
"clean-all": "node ./scripts/clean-all.js",
|
"clean-all": "node ./scripts/clean-all.js",
|
||||||
"cleanall": "pnpm clean-all"
|
"cleanall": "pnpm clean-all"
|
||||||
|
@ -47,17 +46,13 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"gulp": "4.0.2",
|
"cssnano": "6.0.1",
|
||||||
"gulp-cssnano": "2.1.3",
|
|
||||||
"gulp-rename": "2.0.0",
|
|
||||||
"gulp-replace": "1.1.4",
|
|
||||||
"gulp-terser": "2.1.0",
|
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
|
"postcss": "8.4.27",
|
||||||
|
"terser": "5.19.2",
|
||||||
"typescript": "5.2.2"
|
"typescript": "5.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/gulp": "4.0.13",
|
|
||||||
"@types/gulp-rename": "2.0.2",
|
|
||||||
"@typescript-eslint/eslint-plugin": "6.6.0",
|
"@typescript-eslint/eslint-plugin": "6.6.0",
|
||||||
"@typescript-eslint/parser": "6.6.0",
|
"@typescript-eslint/parser": "6.6.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
|
|
|
@ -123,6 +123,7 @@
|
||||||
"microformats-parser": "1.4.1",
|
"microformats-parser": "1.4.1",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"ms": "3.0.0-canary.1",
|
"ms": "3.0.0-canary.1",
|
||||||
|
"nanoid": "4.0.2",
|
||||||
"nested-property": "4.0.0",
|
"nested-property": "4.0.0",
|
||||||
"node-fetch": "3.3.2",
|
"node-fetch": "3.3.2",
|
||||||
"nodemailer": "6.9.4",
|
"nodemailer": "6.9.4",
|
||||||
|
|
|
@ -94,6 +94,7 @@ type Source = {
|
||||||
|
|
||||||
perChannelMaxNoteCacheCount?: number;
|
perChannelMaxNoteCacheCount?: number;
|
||||||
perUserNotificationsMaxCount?: number;
|
perUserNotificationsMaxCount?: number;
|
||||||
|
deactivateAntennaThreshold?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Config = {
|
export type Config = {
|
||||||
|
@ -167,6 +168,7 @@ export type Config = {
|
||||||
redisForJobQueue: RedisOptions & RedisOptionsSource;
|
redisForJobQueue: RedisOptions & RedisOptionsSource;
|
||||||
perChannelMaxNoteCacheCount: number;
|
perChannelMaxNoteCacheCount: number;
|
||||||
perUserNotificationsMaxCount: number;
|
perUserNotificationsMaxCount: number;
|
||||||
|
deactivateAntennaThreshold: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
const _filename = fileURLToPath(import.meta.url);
|
const _filename = fileURLToPath(import.meta.url);
|
||||||
|
@ -258,6 +260,7 @@ export function loadConfig(): Config {
|
||||||
clientManifestExists: clientManifestExists,
|
clientManifestExists: clientManifestExists,
|
||||||
perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000,
|
perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000,
|
||||||
perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 300,
|
perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 300,
|
||||||
|
deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { ulid } from 'ulid';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
import { genAid, parseAid } from '@/misc/id/aid.js';
|
import { genAid, parseAid } from '@/misc/id/aid.js';
|
||||||
|
import { genAidx, parseAidx } from '@/misc/id/aidx.js';
|
||||||
import { genMeid, parseMeid } from '@/misc/id/meid.js';
|
import { genMeid, parseMeid } from '@/misc/id/meid.js';
|
||||||
import { genMeidg, parseMeidg } from '@/misc/id/meidg.js';
|
import { genMeidg, parseMeidg } from '@/misc/id/meidg.js';
|
||||||
import { genObjectId, parseObjectId } from '@/misc/id/object-id.js';
|
import { genObjectId, parseObjectId } from '@/misc/id/object-id.js';
|
||||||
|
@ -31,6 +32,7 @@ export class IdService {
|
||||||
|
|
||||||
switch (this.method) {
|
switch (this.method) {
|
||||||
case 'aid': return genAid(date);
|
case 'aid': return genAid(date);
|
||||||
|
case 'aidx': return genAidx(date);
|
||||||
case 'meid': return genMeid(date);
|
case 'meid': return genMeid(date);
|
||||||
case 'meidg': return genMeidg(date);
|
case 'meidg': return genMeidg(date);
|
||||||
case 'ulid': return ulid(date.getTime());
|
case 'ulid': return ulid(date.getTime());
|
||||||
|
@ -43,6 +45,7 @@ export class IdService {
|
||||||
public parse(id: string): { date: Date; } {
|
public parse(id: string): { date: Date; } {
|
||||||
switch (this.method) {
|
switch (this.method) {
|
||||||
case 'aid': return parseAid(id);
|
case 'aid': return parseAid(id);
|
||||||
|
case 'aidx': return parseAidx(id);
|
||||||
case 'objectid': return parseObjectId(id);
|
case 'objectid': return parseObjectId(id);
|
||||||
case 'meid': return parseMeid(id);
|
case 'meid': return parseMeid(id);
|
||||||
case 'meidg': return parseMeidg(id);
|
case 'meidg': return parseMeidg(id);
|
||||||
|
|
44
packages/backend/src/misc/id/aidx.ts
Normal file
44
packages/backend/src/misc/id/aidx.ts
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
// AIDX
|
||||||
|
// 長さ8の[2000年1月1日からの経過ミリ秒をbase36でエンコードしたもの] + 長さ4の[個体ID] + 長さ4の[カウンタ]
|
||||||
|
// (c) mei23
|
||||||
|
// https://misskey.m544.net/notes/71899acdcc9859ec5708ac24
|
||||||
|
|
||||||
|
import { customAlphabet } from 'nanoid';
|
||||||
|
|
||||||
|
export const aidxRegExp = /^[0-9a-z]{16}$/;
|
||||||
|
|
||||||
|
const TIME2000 = 946684800000;
|
||||||
|
const TIME_LENGTH = 8;
|
||||||
|
const NODE_LENGTH = 4;
|
||||||
|
const NOISE_LENGTH = 4;
|
||||||
|
|
||||||
|
const nodeId = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', NODE_LENGTH)();
|
||||||
|
let counter = 0;
|
||||||
|
|
||||||
|
function getTime(time: number): string {
|
||||||
|
time = time - TIME2000;
|
||||||
|
if (time < 0) time = 0;
|
||||||
|
|
||||||
|
return time.toString(36).padStart(TIME_LENGTH, '0').slice(-TIME_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNoise(): string {
|
||||||
|
return counter.toString(36).padStart(NOISE_LENGTH, '0').slice(-NOISE_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function genAidx(date: Date): string {
|
||||||
|
const t = date.getTime();
|
||||||
|
if (isNaN(t)) throw new Error('Failed to create AIDX: Invalid Date');
|
||||||
|
counter++;
|
||||||
|
return getTime(t) + nodeId + getNoise();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function parseAidx(id: string): { date: Date; } {
|
||||||
|
const time = parseInt(id.slice(0, TIME_LENGTH), 36) + TIME2000;
|
||||||
|
return { date: new Date(time) };
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import type { AntennasRepository, MutedNotesRepository, RoleAssignmentsRepositor
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import type { Config } from '@/config.js';
|
||||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||||
import type * as Bull from 'bullmq';
|
import type * as Bull from 'bullmq';
|
||||||
|
|
||||||
|
@ -18,6 +19,9 @@ export class CleanProcessorService {
|
||||||
private logger: Logger;
|
private logger: Logger;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@Inject(DI.config)
|
||||||
|
private config: Config,
|
||||||
|
|
||||||
@Inject(DI.userIpsRepository)
|
@Inject(DI.userIpsRepository)
|
||||||
private userIpsRepository: UserIpsRepository,
|
private userIpsRepository: UserIpsRepository,
|
||||||
|
|
||||||
|
@ -54,12 +58,14 @@ export class CleanProcessorService {
|
||||||
reason: 'word',
|
reason: 'word',
|
||||||
});
|
});
|
||||||
|
|
||||||
// 7日以上使われてないアンテナを停止
|
// 使われてないアンテナを停止
|
||||||
this.antennasRepository.update({
|
if (this.config.deactivateAntennaThreshold > 0) {
|
||||||
lastUsedAt: LessThan(new Date(Date.now() - (1000 * 60 * 60 * 24 * 7))),
|
this.antennasRepository.update({
|
||||||
}, {
|
lastUsedAt: LessThan(new Date(Date.now() - this.config.deactivateAntennaThreshold)),
|
||||||
isActive: false,
|
}, {
|
||||||
});
|
isActive: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const expiredRoleAssignments = await this.roleAssignmentsRepository.createQueryBuilder('assign')
|
const expiredRoleAssignments = await this.roleAssignmentsRepository.createQueryBuilder('assign')
|
||||||
.where('assign.expiresAt IS NOT NULL')
|
.where('assign.expiresAt IS NOT NULL')
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { GlobalModule } from '@/GlobalModule.js';
|
||||||
import { AnnouncementService } from '@/core/AnnouncementService.js';
|
import { AnnouncementService } from '@/core/AnnouncementService.js';
|
||||||
import type { MiAnnouncement, AnnouncementsRepository, AnnouncementReadsRepository, UsersRepository, MiUser } from '@/models/index.js';
|
import type { MiAnnouncement, AnnouncementsRepository, AnnouncementReadsRepository, UsersRepository, MiUser } from '@/models/index.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { genAid } from '@/misc/id/aid.js';
|
import { genAidx } from '@/misc/id/aidx.js';
|
||||||
import { CacheService } from '@/core/CacheService.js';
|
import { CacheService } from '@/core/CacheService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
|
@ -33,7 +33,7 @@ describe('AnnouncementService', () => {
|
||||||
function createUser(data: Partial<MiUser> = {}) {
|
function createUser(data: Partial<MiUser> = {}) {
|
||||||
const un = secureRndstr(16);
|
const un = secureRndstr(16);
|
||||||
return usersRepository.insert({
|
return usersRepository.insert({
|
||||||
id: genAid(new Date()),
|
id: genAidx(new Date()),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
username: un,
|
username: un,
|
||||||
usernameLower: un,
|
usernameLower: un,
|
||||||
|
@ -44,7 +44,7 @@ describe('AnnouncementService', () => {
|
||||||
|
|
||||||
function createAnnouncement(data: Partial<MiAnnouncement> = {}) {
|
function createAnnouncement(data: Partial<MiAnnouncement> = {}) {
|
||||||
return announcementsRepository.insert({
|
return announcementsRepository.insert({
|
||||||
id: genAid(new Date()),
|
id: genAidx(new Date()),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: null,
|
updatedAt: null,
|
||||||
title: 'Title',
|
title: 'Title',
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { RoleService } from '@/core/RoleService.js';
|
||||||
import type { MiRole, RolesRepository, RoleAssignmentsRepository, UsersRepository, MiUser } from '@/models/index.js';
|
import type { MiRole, RolesRepository, RoleAssignmentsRepository, UsersRepository, MiUser } from '@/models/index.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
import { genAid } from '@/misc/id/aid.js';
|
import { genAidx } from '@/misc/id/aidx.js';
|
||||||
import { CacheService } from '@/core/CacheService.js';
|
import { CacheService } from '@/core/CacheService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
|
@ -37,7 +37,7 @@ describe('RoleService', () => {
|
||||||
function createUser(data: Partial<MiUser> = {}) {
|
function createUser(data: Partial<MiUser> = {}) {
|
||||||
const un = secureRndstr(16);
|
const un = secureRndstr(16);
|
||||||
return usersRepository.insert({
|
return usersRepository.insert({
|
||||||
id: genAid(new Date()),
|
id: genAidx(new Date()),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
username: un,
|
username: un,
|
||||||
usernameLower: un,
|
usernameLower: un,
|
||||||
|
@ -48,7 +48,7 @@ describe('RoleService', () => {
|
||||||
|
|
||||||
function createRole(data: Partial<MiRole> = {}) {
|
function createRole(data: Partial<MiRole> = {}) {
|
||||||
return rolesRepository.insert({
|
return rolesRepository.insert({
|
||||||
id: genAid(new Date()),
|
id: genAidx(new Date()),
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
lastUsedAt: new Date(),
|
lastUsedAt: new Date(),
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import { ulid } from 'ulid';
|
import { ulid } from 'ulid';
|
||||||
import { describe, test, expect } from '@jest/globals';
|
import { describe, test, expect } from '@jest/globals';
|
||||||
import { aidRegExp, genAid, parseAid } from '@/misc/id/aid.js';
|
import { aidRegExp, genAid, parseAid } from '@/misc/id/aid.js';
|
||||||
|
import { aidxRegExp, genAidx, parseAidx } from '@/misc/id/aidx.js';
|
||||||
import { genMeid, meidRegExp, parseMeid } from '@/misc/id/meid.js';
|
import { genMeid, meidRegExp, parseMeid } from '@/misc/id/meid.js';
|
||||||
import { genMeidg, meidgRegExp, parseMeidg } from '@/misc/id/meidg.js';
|
import { genMeidg, meidgRegExp, parseMeidg } from '@/misc/id/meidg.js';
|
||||||
import { genObjectId, objectIdRegExp, parseObjectId } from '@/misc/id/object-id.js';
|
import { genObjectId, objectIdRegExp, parseObjectId } from '@/misc/id/object-id.js';
|
||||||
|
@ -19,6 +20,13 @@ describe('misc:id', () => {
|
||||||
expect(parseAid(gotAid).date.getTime()).toBe(date.getTime());
|
expect(parseAid(gotAid).date.getTime()).toBe(date.getTime());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('aidx', () => {
|
||||||
|
const date = new Date();
|
||||||
|
const gotAidx = genAidx(date);
|
||||||
|
expect(gotAidx).toMatch(aidxRegExp);
|
||||||
|
expect(parseAidx(gotAidx).date.getTime()).toBe(date.getTime());
|
||||||
|
});
|
||||||
|
|
||||||
test('meid', () => {
|
test('meid', () => {
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
const gotMeid = genMeid(date);
|
const gotMeid = genMeid(date);
|
||||||
|
|
|
@ -101,8 +101,6 @@
|
||||||
"@types/autosize": "^4.0.1",
|
"@types/autosize": "^4.0.1",
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/estree": "1.0.1",
|
"@types/estree": "1.0.1",
|
||||||
"@types/gulp": "4.0.13",
|
|
||||||
"@types/gulp-rename": "2.0.2",
|
|
||||||
"@types/matter-js": "0.19.0",
|
"@types/matter-js": "0.19.0",
|
||||||
"@types/micromatch": "4.0.2",
|
"@types/micromatch": "4.0.2",
|
||||||
"@types/node": "20.5.9",
|
"@types/node": "20.5.9",
|
||||||
|
|
|
@ -352,9 +352,15 @@ async function renote() {
|
||||||
const configuredVisibility = defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility;
|
const configuredVisibility = defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility;
|
||||||
const localOnly = defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly;
|
const localOnly = defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly;
|
||||||
|
|
||||||
|
let visibility = appearNote.visibility;
|
||||||
|
visibility = smallerVisibility(visibility, configuredVisibility);
|
||||||
|
if (appearNote.channel?.isSensitive) {
|
||||||
|
visibility = smallerVisibility(visibility, 'home');
|
||||||
|
}
|
||||||
|
|
||||||
os.api('notes/create', {
|
os.api('notes/create', {
|
||||||
localOnly,
|
localOnly,
|
||||||
visibility: smallerVisibility(appearNote.visibility, configuredVisibility),
|
visibility,
|
||||||
renoteId: appearNote.id,
|
renoteId: appearNote.id,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
os.noteToast(i18n.ts.renoted);
|
os.noteToast(i18n.ts.renoted);
|
||||||
|
|
2687
pnpm-lock.yaml
2687
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
87
scripts/build-assets.mjs
Normal file
87
scripts/build-assets.mjs
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey, cherrypick contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as fs from 'node:fs/promises';
|
||||||
|
import * as path from 'node:path';
|
||||||
|
import cssnano from 'cssnano';
|
||||||
|
import postcss from 'postcss';
|
||||||
|
import * as terser from 'terser';
|
||||||
|
|
||||||
|
import locales from '../locales/index.js';
|
||||||
|
import meta from '../package.json' assert { type: "json" };
|
||||||
|
|
||||||
|
async function copyFrontendFonts() {
|
||||||
|
await fs.cp('./packages/frontend/node_modules/three/examples/fonts', './built/_frontend_dist_/fonts', { dereference: true, recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyFrontendTablerIcons() {
|
||||||
|
await fs.cp('./packages/frontend/node_modules/@tabler/icons-webfont', './built/_frontend_dist_/tabler-icons', { dereference: true, recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyFrontendLocales() {
|
||||||
|
await fs.mkdir('./built/_frontend_dist_/locales', { recursive: true });
|
||||||
|
|
||||||
|
const v = { '_version_': meta.version };
|
||||||
|
|
||||||
|
for (const [lang, locale] of Object.entries(locales)) {
|
||||||
|
await fs.writeFile(`./built/_frontend_dist_/locales/${lang}.${meta.version}.json`, JSON.stringify({ ...locale, ...v }), 'utf-8');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function copyBackendViews() {
|
||||||
|
await fs.cp('./packages/backend/src/server/web/views', './packages/backend/built/server/web/views', { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buildBackendScript() {
|
||||||
|
await fs.mkdir('./packages/backend/built/server/web', { recursive: true });
|
||||||
|
|
||||||
|
for (const file of [
|
||||||
|
'./packages/backend/src/server/web/boot.js',
|
||||||
|
'./packages/backend/src/server/web/bios.js',
|
||||||
|
'./packages/backend/src/server/web/cli.js'
|
||||||
|
]) {
|
||||||
|
let source = await fs.readFile(file, { encoding: 'utf-8' });
|
||||||
|
source = source.replaceAll('LANGS', JSON.stringify(Object.keys(locales)));
|
||||||
|
const { code } = await terser.minify(source, { toplevel: true });
|
||||||
|
await fs.writeFile(`./packages/backend/built/server/web/${path.basename(file)}`, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buildBackendStyle() {
|
||||||
|
await fs.mkdir('./packages/backend/built/server/web', { recursive: true });
|
||||||
|
|
||||||
|
for (const file of [
|
||||||
|
'./packages/backend/src/server/web/style.css',
|
||||||
|
'./packages/backend/src/server/web/bios.css',
|
||||||
|
'./packages/backend/src/server/web/cli.css',
|
||||||
|
'./packages/backend/src/server/web/error.css'
|
||||||
|
]) {
|
||||||
|
const source = await fs.readFile(file, { encoding: 'utf-8' });
|
||||||
|
const { css } = await postcss([cssnano({ zindex: false })]).process(source, { from: undefined });
|
||||||
|
await fs.writeFile(`./packages/backend/built/server/web/${path.basename(file)}`, css);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function build() {
|
||||||
|
await Promise.all([
|
||||||
|
copyFrontendFonts(),
|
||||||
|
copyFrontendTablerIcons(),
|
||||||
|
copyFrontendLocales(),
|
||||||
|
copyBackendViews(),
|
||||||
|
buildBackendScript(),
|
||||||
|
buildBackendStyle(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
await build();
|
||||||
|
|
||||||
|
if (process.argv.includes("--watch")) {
|
||||||
|
const watcher = fs.watch('./packages', { recursive: true });
|
||||||
|
for await (const event of watcher) {
|
||||||
|
if (/^[a-z]+\/src/.test(event.filename)) {
|
||||||
|
await build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,7 +23,13 @@ await execa('pnpm', ['build-pre'], {
|
||||||
stderr: process.stderr,
|
stderr: process.stderr,
|
||||||
});
|
});
|
||||||
|
|
||||||
execa('pnpm', ['exec', 'gulp', 'watch'], {
|
await execa('pnpm', ['build-assets'], {
|
||||||
|
cwd: _dirname + '/../',
|
||||||
|
stdout: process.stdout,
|
||||||
|
stderr: process.stderr,
|
||||||
|
});
|
||||||
|
|
||||||
|
execa('pnpm', ['build-assets', '--watch'], {
|
||||||
cwd: _dirname + '/../',
|
cwd: _dirname + '/../',
|
||||||
stdout: process.stdout,
|
stdout: process.stdout,
|
||||||
stderr: process.stderr,
|
stderr: process.stderr,
|
||||||
|
|
Loading…
Reference in a new issue