Merge branch 'develop' into enh-tweak-signin-dialog
This commit is contained in:
commit
ae4c690cb7
|
@ -2,6 +2,19 @@
|
||||||
# Misskey configuration
|
# Misskey configuration
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
# ┌────────────────────────┐
|
||||||
|
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Password to initiate setting up admin account.
|
||||||
|
# It will not be used after the initial setup is complete.
|
||||||
|
#
|
||||||
|
# Be sure to change this when you set up Misskey via the Internet.
|
||||||
|
#
|
||||||
|
# The provider of the service who sets up Misskey on behalf of the customer should
|
||||||
|
# set this value to something unique when generating the Misskey config file,
|
||||||
|
# and provide it to the customer.
|
||||||
|
initialPassword: example_password_please_change_this_or_you_will_get_hacked
|
||||||
|
|
||||||
# ┌─────┐
|
# ┌─────┐
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,19 @@
|
||||||
#
|
#
|
||||||
# publishTarballInsteadOfProvideRepositoryUrl: true
|
# publishTarballInsteadOfProvideRepositoryUrl: true
|
||||||
|
|
||||||
|
# ┌────────────────────────┐
|
||||||
|
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Password to initiate setting up admin account.
|
||||||
|
# It will not be used after the initial setup is complete.
|
||||||
|
#
|
||||||
|
# Be sure to change this when you set up Misskey via the Internet.
|
||||||
|
#
|
||||||
|
# The provider of the service who sets up Misskey on behalf of the customer should
|
||||||
|
# set this value to something unique when generating the Misskey config file,
|
||||||
|
# and provide it to the customer.
|
||||||
|
initialPassword: example_password_please_change_this_or_you_will_get_hacked
|
||||||
|
|
||||||
# ┌─────┐
|
# ┌─────┐
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ jobs:
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
persist-credentials: false
|
||||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
|
|
||||||
- name: setup pnpm
|
- name: setup pnpm
|
||||||
|
@ -57,7 +58,7 @@ jobs:
|
||||||
name: generated-misskey-js
|
name: generated-misskey-js
|
||||||
path: packages/misskey-js/generator/built/autogen
|
path: packages/misskey-js/generator/built/autogen
|
||||||
|
|
||||||
# pull_request_target safety: permissions: read-all, and there are no secrets used in this job
|
# pull_request_target safety: permissions: read-all, and no user codes are executed
|
||||||
get-actual-misskey-js:
|
get-actual-misskey-js:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
|
@ -68,6 +69,7 @@ jobs:
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
|
persist-credentials: false
|
||||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
|
|
||||||
- name: Upload From Merged
|
- name: Upload From Merged
|
||||||
|
@ -131,3 +133,7 @@ jobs:
|
||||||
mode: delete
|
mode: delete
|
||||||
message: "Thank you!"
|
message: "Thank you!"
|
||||||
create_if_not_exists: false
|
create_if_not_exists: false
|
||||||
|
|
||||||
|
- name: Make failure if changes are detected
|
||||||
|
if: steps.check-changes.outputs.changes == 'true'
|
||||||
|
run: exit 1
|
||||||
|
|
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -1,14 +1,22 @@
|
||||||
## Unreleased
|
## 2024.10.0
|
||||||
|
|
||||||
|
### Note
|
||||||
|
- サーバー初期設定時に使用する初期パスワードを設定できるようになりました。今後Misskeyサーバーを新たに設置する際には、初回の起動前にコンフィグファイルの`initialPassword`を必ず変更してください。(すでに初期設定を完了しているサーバーについては、この変更に伴い対応する必要はありません)
|
||||||
|
ホスティングサービスを運営している場合は、コンフィグファイルを構築する際に`initialPassword`をランダムな値に設定し、ユーザーに通知するようにしてください。
|
||||||
|
|
||||||
### General
|
### General
|
||||||
|
- Feat: サーバー初期設定時に初期パスワードを設定できるように
|
||||||
- Enhance: セキュリティ向上のため、サインイン時もCAPTCHAを求めるようになりました
|
- Enhance: セキュリティ向上のため、サインイン時もCAPTCHAを求めるようになりました
|
||||||
|
- Enhance: 依存関係の更新
|
||||||
|
- Enhance: l10nの更新
|
||||||
|
- Fix: 連合のホワイトリストが正常に登録されない問題を修正
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
- Enhance: フォロワーへのメッセージ欄のデザイン改良
|
- Enhance: デザインの調整
|
||||||
- Enhance: ログイン画面の認証フローを改善
|
- Enhance: ログイン画面の認証フローを改善
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
-
|
- Enhance: セキュリティ向上のため、ログイン時にメール通知を行うように
|
||||||
|
|
||||||
|
|
||||||
## 2024.9.0
|
## 2024.9.0
|
||||||
|
|
|
@ -23,6 +23,7 @@ describe('Before setup instance', () => {
|
||||||
|
|
||||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||||
|
|
||||||
|
cy.get('[data-cy-admin-initial-password] input').type('example_password_please_change_this_or_you_will_get_hacked');
|
||||||
cy.get('[data-cy-admin-username] input').type('admin');
|
cy.get('[data-cy-admin-username] input').type('admin');
|
||||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||||
cy.get('[data-cy-admin-ok]').click();
|
cy.get('[data-cy-admin-ok]').click();
|
||||||
|
|
|
@ -1533,6 +1533,7 @@ _notification:
|
||||||
reaction: "التفاعل"
|
reaction: "التفاعل"
|
||||||
receiveFollowRequest: "طلبات المتابعة"
|
receiveFollowRequest: "طلبات المتابعة"
|
||||||
followRequestAccepted: "طلبات المتابعة المقبولة"
|
followRequestAccepted: "طلبات المتابعة المقبولة"
|
||||||
|
login: "لِج"
|
||||||
app: "إشعارات التطبيقات المرتبطة"
|
app: "إشعارات التطبيقات المرتبطة"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "تابعك بالمثل"
|
followBack: "تابعك بالمثل"
|
||||||
|
|
|
@ -1313,6 +1313,7 @@ _notification:
|
||||||
pollEnded: "পোল শেষ"
|
pollEnded: "পোল শেষ"
|
||||||
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
||||||
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
||||||
|
login: "প্রবেশ করুন"
|
||||||
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "ফলো ব্যাক করেছে"
|
followBack: "ফলো ব্যাক করেছে"
|
||||||
|
|
|
@ -236,6 +236,8 @@ silencedInstances: "Instàncies silenciades"
|
||||||
silencedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols silenciar. Tots els comptes de les instàncies llistades s'establiran com silenciades i només podran fer sol·licitacions de seguiment, i no podran mencionar als comptes locals si no els segueixen. Això no afectarà les instàncies bloquejades."
|
silencedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols silenciar. Tots els comptes de les instàncies llistades s'establiran com silenciades i només podran fer sol·licitacions de seguiment, i no podran mencionar als comptes locals si no els segueixen. Això no afectarà les instàncies bloquejades."
|
||||||
mediaSilencedInstances: "Instàncies amb els arxius silenciats"
|
mediaSilencedInstances: "Instàncies amb els arxius silenciats"
|
||||||
mediaSilencedInstancesDescription: "Llista els noms dels servidors que vulguis silenciar els arxius, un servidor per línia. Tots els comptes que pertanyin als servidors llistats seran tractats com sensibles i no podran fer servir emojis personalitzats. Això no tindrà efecte sobre els servidors blocats."
|
mediaSilencedInstancesDescription: "Llista els noms dels servidors que vulguis silenciar els arxius, un servidor per línia. Tots els comptes que pertanyin als servidors llistats seran tractats com sensibles i no podran fer servir emojis personalitzats. Això no tindrà efecte sobre els servidors blocats."
|
||||||
|
federationAllowedHosts: "Llista de servidors federats"
|
||||||
|
federationAllowedHostsDescription: "Llista dels servidors amb els quals es federa."
|
||||||
muteAndBlock: "Silencia i bloca"
|
muteAndBlock: "Silencia i bloca"
|
||||||
mutedUsers: "Usuaris silenciats"
|
mutedUsers: "Usuaris silenciats"
|
||||||
blockedUsers: "Usuaris bloquejats"
|
blockedUsers: "Usuaris bloquejats"
|
||||||
|
@ -334,6 +336,7 @@ renameFolder: "Canvia el nom de la carpeta"
|
||||||
deleteFolder: "Elimina la carpeta"
|
deleteFolder: "Elimina la carpeta"
|
||||||
folder: "Carpeta "
|
folder: "Carpeta "
|
||||||
addFile: "Afegeix un fitxer"
|
addFile: "Afegeix un fitxer"
|
||||||
|
showFile: "Mostrar fitxer"
|
||||||
emptyDrive: "La teva unitat és buida"
|
emptyDrive: "La teva unitat és buida"
|
||||||
emptyFolder: "La carpeta està buida"
|
emptyFolder: "La carpeta està buida"
|
||||||
unableToDelete: "No es pot eliminar"
|
unableToDelete: "No es pot eliminar"
|
||||||
|
@ -509,6 +512,10 @@ uiLanguage: "Idioma de l'interfície"
|
||||||
aboutX: "Respecte a {x}"
|
aboutX: "Respecte a {x}"
|
||||||
emojiStyle: "Estil d'emoji"
|
emojiStyle: "Estil d'emoji"
|
||||||
native: "Nadiu"
|
native: "Nadiu"
|
||||||
|
menuStyle: "Estil de menú"
|
||||||
|
style: "Estil"
|
||||||
|
drawer: "Calaix"
|
||||||
|
popup: "Emergent"
|
||||||
showNoteActionsOnlyHover: "Només mostra accions de la nota en passar amb el cursor"
|
showNoteActionsOnlyHover: "Només mostra accions de la nota en passar amb el cursor"
|
||||||
showReactionsCount: "Mostra el nombre de reaccions a les publicacions"
|
showReactionsCount: "Mostra el nombre de reaccions a les publicacions"
|
||||||
noHistory: "No hi ha un registre previ"
|
noHistory: "No hi ha un registre previ"
|
||||||
|
@ -1268,6 +1275,15 @@ fromX: "De {x}"
|
||||||
genEmbedCode: "Obtenir el codi per incrustar"
|
genEmbedCode: "Obtenir el codi per incrustar"
|
||||||
noteOfThisUser: "Notes d'aquest usuari"
|
noteOfThisUser: "Notes d'aquest usuari"
|
||||||
clipNoteLimitExceeded: "No es poden afegir més notes a aquest clip."
|
clipNoteLimitExceeded: "No es poden afegir més notes a aquest clip."
|
||||||
|
performance: "Rendiment"
|
||||||
|
modified: "Modificat"
|
||||||
|
discard: "Descarta"
|
||||||
|
thereAreNChanges: "Hi ha(n) {n} canvi(s)"
|
||||||
|
signinWithPasskey: "Inicia sessió amb Passkey"
|
||||||
|
unknownWebAuthnKey: "Passkey desconeguda"
|
||||||
|
passkeyVerificationFailed: "La verificació a fallat"
|
||||||
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verificació de la passkey a estat correcta, però s'ha deshabilitat l'inici de sessió sense contrasenya."
|
||||||
|
messageToFollower: "Missatge als meus seguidors"
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "Estat d'entrega "
|
status: "Estat d'entrega "
|
||||||
stop: "Suspés"
|
stop: "Suspés"
|
||||||
|
@ -2235,6 +2251,9 @@ _profile:
|
||||||
changeBanner: "Canviar el bàner "
|
changeBanner: "Canviar el bàner "
|
||||||
verifiedLinkDescription: "Escrivint una adreça URL que enllaci a aquest perfil, una icona de propietat verificada es mostrarà al costat del camp."
|
verifiedLinkDescription: "Escrivint una adreça URL que enllaci a aquest perfil, una icona de propietat verificada es mostrarà al costat del camp."
|
||||||
avatarDecorationMax: "Pot afegir un màxim de {max} decoracions."
|
avatarDecorationMax: "Pot afegir un màxim de {max} decoracions."
|
||||||
|
followedMessage: "Missatge als nous seguidors"
|
||||||
|
followedMessageDescription: "Es pot configurar un missatge curt que es mostra a l'altra persona quan comença a seguir-te."
|
||||||
|
followedMessageDescriptionForLockedAccount: "Si comencen a seguir-te es mostra un missatge de quan es permet aquesta sol·licitud. "
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Totes les publicacions"
|
allNotes: "Totes les publicacions"
|
||||||
favoritedNotes: "Notes preferides"
|
favoritedNotes: "Notes preferides"
|
||||||
|
@ -2373,6 +2392,7 @@ _notification:
|
||||||
renotedBySomeUsers: "L'han impulsat {n} usuaris"
|
renotedBySomeUsers: "L'han impulsat {n} usuaris"
|
||||||
followedBySomeUsers: "Et segueixen {n} usuaris"
|
followedBySomeUsers: "Et segueixen {n} usuaris"
|
||||||
flushNotification: "Netejar notificacions"
|
flushNotification: "Netejar notificacions"
|
||||||
|
exportOfXCompleted: "Completada l'exportació de {n}"
|
||||||
_types:
|
_types:
|
||||||
all: "Tots"
|
all: "Tots"
|
||||||
note: "Notes noves"
|
note: "Notes noves"
|
||||||
|
@ -2387,6 +2407,9 @@ _notification:
|
||||||
followRequestAccepted: "Petició de seguiment acceptada"
|
followRequestAccepted: "Petició de seguiment acceptada"
|
||||||
roleAssigned: "Rol donat"
|
roleAssigned: "Rol donat"
|
||||||
achievementEarned: "Assoliment desbloquejat"
|
achievementEarned: "Assoliment desbloquejat"
|
||||||
|
exportCompleted: "Exportació completada"
|
||||||
|
login: "Iniciar sessió"
|
||||||
|
test: "Prova la notificació"
|
||||||
app: "Notificacions d'aplicacions"
|
app: "Notificacions d'aplicacions"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "t'ha seguit també"
|
followBack: "t'ha seguit també"
|
||||||
|
|
|
@ -1962,6 +1962,7 @@ _notification:
|
||||||
receiveFollowRequest: "Obdržené žádosti o sledování"
|
receiveFollowRequest: "Obdržené žádosti o sledování"
|
||||||
followRequestAccepted: "Přijaté žádosti o sledování"
|
followRequestAccepted: "Přijaté žádosti o sledování"
|
||||||
achievementEarned: "Úspěch odemčen"
|
achievementEarned: "Úspěch odemčen"
|
||||||
|
login: "Přihlásit se"
|
||||||
app: "Oznámení z propojených aplikací"
|
app: "Oznámení z propojených aplikací"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "vás začal sledovat zpět"
|
followBack: "vás začal sledovat zpět"
|
||||||
|
|
|
@ -2141,6 +2141,7 @@ _notification:
|
||||||
receiveFollowRequest: "Erhaltene Follow-Anfragen"
|
receiveFollowRequest: "Erhaltene Follow-Anfragen"
|
||||||
followRequestAccepted: "Akzeptierte Follow-Anfragen"
|
followRequestAccepted: "Akzeptierte Follow-Anfragen"
|
||||||
achievementEarned: "Errungenschaft freigeschaltet"
|
achievementEarned: "Errungenschaft freigeschaltet"
|
||||||
|
login: "Anmelden"
|
||||||
app: "Benachrichtigungen von Apps"
|
app: "Benachrichtigungen von Apps"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "folgt dir nun auch"
|
followBack: "folgt dir nun auch"
|
||||||
|
|
|
@ -378,6 +378,7 @@ _notification:
|
||||||
renote: "Κοινοποίηση σημειώματος"
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
quote: "Παράθεση"
|
quote: "Παράθεση"
|
||||||
reaction: "Αντιδράσεις"
|
reaction: "Αντιδράσεις"
|
||||||
|
login: "Σύνδεση"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Απάντηση"
|
reply: "Απάντηση"
|
||||||
renote: "Κοινοποίηση σημειώματος"
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
|
|
|
@ -236,6 +236,8 @@ silencedInstances: "Silenced instances"
|
||||||
silencedInstancesDescription: "List the host names of the servers that you want to silence, separated by a new line. All accounts belonging to the listed servers will be treated as silenced, and can only make follow requests, and cannot mention local accounts if not followed. This will not affect the blocked servers."
|
silencedInstancesDescription: "List the host names of the servers that you want to silence, separated by a new line. All accounts belonging to the listed servers will be treated as silenced, and can only make follow requests, and cannot mention local accounts if not followed. This will not affect the blocked servers."
|
||||||
mediaSilencedInstances: "Media-silenced servers"
|
mediaSilencedInstances: "Media-silenced servers"
|
||||||
mediaSilencedInstancesDescription: "List the host names of the servers that you want to media-silence, separated by a new line. All accounts belonging to the listed servers will be treated as sensitive, and can't use custom emojis. This will not affect the blocked servers."
|
mediaSilencedInstancesDescription: "List the host names of the servers that you want to media-silence, separated by a new line. All accounts belonging to the listed servers will be treated as sensitive, and can't use custom emojis. This will not affect the blocked servers."
|
||||||
|
federationAllowedHosts: "Federation allowed servers"
|
||||||
|
federationAllowedHostsDescription: "Specify the hostnames of the servers you want to allow federation separated by line breaks."
|
||||||
muteAndBlock: "Mutes and Blocks"
|
muteAndBlock: "Mutes and Blocks"
|
||||||
mutedUsers: "Muted users"
|
mutedUsers: "Muted users"
|
||||||
blockedUsers: "Blocked users"
|
blockedUsers: "Blocked users"
|
||||||
|
@ -334,6 +336,7 @@ renameFolder: "Rename this folder"
|
||||||
deleteFolder: "Delete this folder"
|
deleteFolder: "Delete this folder"
|
||||||
folder: "Folder"
|
folder: "Folder"
|
||||||
addFile: "Add a file"
|
addFile: "Add a file"
|
||||||
|
showFile: "Show files"
|
||||||
emptyDrive: "Your Drive is empty"
|
emptyDrive: "Your Drive is empty"
|
||||||
emptyFolder: "This folder is empty"
|
emptyFolder: "This folder is empty"
|
||||||
unableToDelete: "Unable to delete"
|
unableToDelete: "Unable to delete"
|
||||||
|
@ -509,6 +512,10 @@ uiLanguage: "User interface language"
|
||||||
aboutX: "About {x}"
|
aboutX: "About {x}"
|
||||||
emojiStyle: "Emoji style"
|
emojiStyle: "Emoji style"
|
||||||
native: "Native"
|
native: "Native"
|
||||||
|
menuStyle: "Menu style"
|
||||||
|
style: "Style"
|
||||||
|
drawer: "Drawer"
|
||||||
|
popup: "Pop up"
|
||||||
showNoteActionsOnlyHover: "Only show note actions on hover"
|
showNoteActionsOnlyHover: "Only show note actions on hover"
|
||||||
showReactionsCount: "See the number of reactions in notes"
|
showReactionsCount: "See the number of reactions in notes"
|
||||||
noHistory: "No history available"
|
noHistory: "No history available"
|
||||||
|
@ -591,6 +598,8 @@ ascendingOrder: "Ascending"
|
||||||
descendingOrder: "Descending"
|
descendingOrder: "Descending"
|
||||||
scratchpad: "Scratchpad"
|
scratchpad: "Scratchpad"
|
||||||
scratchpadDescription: "The Scratchpad provides an environment for AiScript experiments. You can write, execute, and check the results of it interacting with Misskey in it."
|
scratchpadDescription: "The Scratchpad provides an environment for AiScript experiments. You can write, execute, and check the results of it interacting with Misskey in it."
|
||||||
|
uiInspector: "UI inspector"
|
||||||
|
uiInspectorDescription: "You can see the UI component server list on memory. UI component will be generated by Ui:C: function."
|
||||||
output: "Output"
|
output: "Output"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
disablePagesScript: "Disable AiScript on Pages"
|
disablePagesScript: "Disable AiScript on Pages"
|
||||||
|
@ -1125,7 +1134,7 @@ options: "Options"
|
||||||
specifyUser: "Specific user"
|
specifyUser: "Specific user"
|
||||||
lookupConfirm: "Do you want to look up?"
|
lookupConfirm: "Do you want to look up?"
|
||||||
openTagPageConfirm: "Do you want to open a hashtag page?"
|
openTagPageConfirm: "Do you want to open a hashtag page?"
|
||||||
specifyHost: "Specify a host"
|
specifyHost: "Specific host"
|
||||||
failedToPreviewUrl: "Could not preview"
|
failedToPreviewUrl: "Could not preview"
|
||||||
update: "Update"
|
update: "Update"
|
||||||
rolesThatCanBeUsedThisEmojiAsReaction: "Roles that can use this emoji as reaction"
|
rolesThatCanBeUsedThisEmojiAsReaction: "Roles that can use this emoji as reaction"
|
||||||
|
@ -1266,6 +1275,14 @@ fromX: "From {x}"
|
||||||
genEmbedCode: "Generate embed code"
|
genEmbedCode: "Generate embed code"
|
||||||
noteOfThisUser: "Notes by this user"
|
noteOfThisUser: "Notes by this user"
|
||||||
clipNoteLimitExceeded: "No more notes can be added to this clip."
|
clipNoteLimitExceeded: "No more notes can be added to this clip."
|
||||||
|
performance: "Performance"
|
||||||
|
modified: "Modified"
|
||||||
|
discard: "Discard"
|
||||||
|
thereAreNChanges: "There are {n} change(s)"
|
||||||
|
signinWithPasskey: "Sign in with Passkey"
|
||||||
|
unknownWebAuthnKey: "Unknown Passkey"
|
||||||
|
passkeyVerificationFailed: "Passkey verification has failed."
|
||||||
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "Passkey verification has succeeded but password-less login is disabled."
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "Delivery status"
|
status: "Delivery status"
|
||||||
stop: "Suspended"
|
stop: "Suspended"
|
||||||
|
@ -1400,6 +1417,7 @@ _serverSettings:
|
||||||
fanoutTimelineDescription: "Greatly increases performance of timeline retrieval and reduces load on the database when enabled. In exchange, memory usage of Redis will increase. Consider disabling this in case of low server memory or server instability."
|
fanoutTimelineDescription: "Greatly increases performance of timeline retrieval and reduces load on the database when enabled. In exchange, memory usage of Redis will increase. Consider disabling this in case of low server memory or server instability."
|
||||||
fanoutTimelineDbFallback: "Fallback to database"
|
fanoutTimelineDbFallback: "Fallback to database"
|
||||||
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
|
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
|
||||||
|
reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
|
||||||
inquiryUrl: "Inquiry URL"
|
inquiryUrl: "Inquiry URL"
|
||||||
inquiryUrlDescription: "Specify a URL for the inquiry form to the server maintainer or a web page for the contact information."
|
inquiryUrlDescription: "Specify a URL for the inquiry form to the server maintainer or a web page for the contact information."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
|
@ -1733,6 +1751,11 @@ _role:
|
||||||
canSearchNotes: "Usage of note search"
|
canSearchNotes: "Usage of note search"
|
||||||
canUseTranslator: "Translator usage"
|
canUseTranslator: "Translator usage"
|
||||||
avatarDecorationLimit: "Maximum number of avatar decorations that can be applied"
|
avatarDecorationLimit: "Maximum number of avatar decorations that can be applied"
|
||||||
|
canImportAntennas: "Allow importing antennas"
|
||||||
|
canImportBlocking: "Allow importing blocking"
|
||||||
|
canImportFollowing: "Allow importing following"
|
||||||
|
canImportMuting: "Allow importing muting"
|
||||||
|
canImportUserLists: "Allow importing lists"
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "Assigned to manual roles"
|
roleAssignedTo: "Assigned to manual roles"
|
||||||
isLocal: "Local user"
|
isLocal: "Local user"
|
||||||
|
@ -2227,6 +2250,9 @@ _profile:
|
||||||
changeBanner: "Change banner"
|
changeBanner: "Change banner"
|
||||||
verifiedLinkDescription: "By entering an URL that contains a link to your profile here, an ownership verification icon can be displayed next to the field."
|
verifiedLinkDescription: "By entering an URL that contains a link to your profile here, an ownership verification icon can be displayed next to the field."
|
||||||
avatarDecorationMax: "You can add up to {max} decorations."
|
avatarDecorationMax: "You can add up to {max} decorations."
|
||||||
|
followedMessage: "Message when you are followed"
|
||||||
|
followedMessageDescription: "You can set a short message to be displayed to the recipient when they follow you."
|
||||||
|
followedMessageDescriptionForLockedAccount: "If you have set up that follow requests require approval, this will be displayed when you grant a follow request."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "All notes"
|
allNotes: "All notes"
|
||||||
favoritedNotes: "Favorite notes"
|
favoritedNotes: "Favorite notes"
|
||||||
|
@ -2365,6 +2391,7 @@ _notification:
|
||||||
renotedBySomeUsers: "Renote from {n} users"
|
renotedBySomeUsers: "Renote from {n} users"
|
||||||
followedBySomeUsers: "Followed by {n} users"
|
followedBySomeUsers: "Followed by {n} users"
|
||||||
flushNotification: "Clear notifications"
|
flushNotification: "Clear notifications"
|
||||||
|
exportOfXCompleted: "Export of {x} has been completed"
|
||||||
_types:
|
_types:
|
||||||
all: "All"
|
all: "All"
|
||||||
note: "New notes"
|
note: "New notes"
|
||||||
|
@ -2379,6 +2406,9 @@ _notification:
|
||||||
followRequestAccepted: "Accepted follow requests"
|
followRequestAccepted: "Accepted follow requests"
|
||||||
roleAssigned: "Role given"
|
roleAssigned: "Role given"
|
||||||
achievementEarned: "Achievement unlocked"
|
achievementEarned: "Achievement unlocked"
|
||||||
|
exportCompleted: "The export has been completed"
|
||||||
|
login: "Sign In"
|
||||||
|
test: "Notification test"
|
||||||
app: "Notifications from linked apps"
|
app: "Notifications from linked apps"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "followed you back"
|
followBack: "followed you back"
|
||||||
|
@ -2445,6 +2475,7 @@ _webhookSettings:
|
||||||
abuseReportResolved: "When resolved abuse report"
|
abuseReportResolved: "When resolved abuse report"
|
||||||
userCreated: "When user is created"
|
userCreated: "When user is created"
|
||||||
deleteConfirm: "Are you sure you want to delete the Webhook?"
|
deleteConfirm: "Are you sure you want to delete the Webhook?"
|
||||||
|
testRemarks: "Click the button to the right of the switch to send a test Webhook with dummy data."
|
||||||
_abuseReport:
|
_abuseReport:
|
||||||
_notificationRecipient:
|
_notificationRecipient:
|
||||||
createRecipient: "Add a recipient for abuse reports"
|
createRecipient: "Add a recipient for abuse reports"
|
||||||
|
|
|
@ -2343,6 +2343,7 @@ _notification:
|
||||||
followRequestAccepted: "El seguimiento fue aceptado"
|
followRequestAccepted: "El seguimiento fue aceptado"
|
||||||
roleAssigned: "Rol asignado"
|
roleAssigned: "Rol asignado"
|
||||||
achievementEarned: "Logro desbloqueado"
|
achievementEarned: "Logro desbloqueado"
|
||||||
|
login: "Iniciar sesión"
|
||||||
app: "Notificaciones desde aplicaciones"
|
app: "Notificaciones desde aplicaciones"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Te sigue de vuelta"
|
followBack: "Te sigue de vuelta"
|
||||||
|
|
|
@ -2037,6 +2037,7 @@ _notification:
|
||||||
followRequestAccepted: "Demande d'abonnement acceptée"
|
followRequestAccepted: "Demande d'abonnement acceptée"
|
||||||
roleAssigned: "Rôle reçu"
|
roleAssigned: "Rôle reçu"
|
||||||
achievementEarned: "Déverrouillage d'accomplissement"
|
achievementEarned: "Déverrouillage d'accomplissement"
|
||||||
|
login: "Se connecter"
|
||||||
app: "Notifications provenant des apps"
|
app: "Notifications provenant des apps"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Suivre"
|
followBack: "Suivre"
|
||||||
|
|
|
@ -96,6 +96,7 @@ _notification:
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "Idézet"
|
quote: "Idézet"
|
||||||
reaction: "Reakciók"
|
reaction: "Reakciók"
|
||||||
|
login: "Bejelentkezés"
|
||||||
_actions:
|
_actions:
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
_deck:
|
_deck:
|
||||||
|
|
|
@ -2354,6 +2354,7 @@ _notification:
|
||||||
followRequestAccepted: "Permintaan mengikuti disetujui"
|
followRequestAccepted: "Permintaan mengikuti disetujui"
|
||||||
roleAssigned: "Peran Diberikan"
|
roleAssigned: "Peran Diberikan"
|
||||||
achievementEarned: "Pencapaian didapatkan"
|
achievementEarned: "Pencapaian didapatkan"
|
||||||
|
login: "Masuk"
|
||||||
app: "Notifikasi dari aplikasi tertaut"
|
app: "Notifikasi dari aplikasi tertaut"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Ikuti Kembali"
|
followBack: "Ikuti Kembali"
|
||||||
|
|
|
@ -48,6 +48,20 @@ export interface Locale extends ILocale {
|
||||||
* パスワード
|
* パスワード
|
||||||
*/
|
*/
|
||||||
"password": string;
|
"password": string;
|
||||||
|
/**
|
||||||
|
* 初期設定開始用パスワード
|
||||||
|
*/
|
||||||
|
"initialPasswordForSetup": string;
|
||||||
|
/**
|
||||||
|
* 初期設定開始用のパスワードが違います。
|
||||||
|
*/
|
||||||
|
"initialPasswordIsIncorrect": string;
|
||||||
|
/**
|
||||||
|
* Misskeyを自分でインストールした場合は、設定ファイルに入力したパスワードを使用してください。
|
||||||
|
* Misskeyのホスティングサービスなどを使用している場合は、提供されたパスワードを使用してください。
|
||||||
|
* パスワードを設定していない場合は、空欄にしたまま続行してください。
|
||||||
|
*/
|
||||||
|
"initialPasswordForSetupDescription": string;
|
||||||
/**
|
/**
|
||||||
* パスワードを忘れた
|
* パスワードを忘れた
|
||||||
*/
|
*/
|
||||||
|
@ -9289,6 +9303,10 @@ export interface Locale extends ILocale {
|
||||||
* {x}のエクスポートが完了しました
|
* {x}のエクスポートが完了しました
|
||||||
*/
|
*/
|
||||||
"exportOfXCompleted": ParameterizedString<"x">;
|
"exportOfXCompleted": ParameterizedString<"x">;
|
||||||
|
/**
|
||||||
|
* ログインがありました
|
||||||
|
*/
|
||||||
|
"login": string;
|
||||||
"_types": {
|
"_types": {
|
||||||
/**
|
/**
|
||||||
* すべて
|
* すべて
|
||||||
|
@ -9346,6 +9364,10 @@ export interface Locale extends ILocale {
|
||||||
* エクスポートが完了した
|
* エクスポートが完了した
|
||||||
*/
|
*/
|
||||||
"exportCompleted": string;
|
"exportCompleted": string;
|
||||||
|
/**
|
||||||
|
* ログイン
|
||||||
|
*/
|
||||||
|
"login": string;
|
||||||
/**
|
/**
|
||||||
* 通知のテスト
|
* 通知のテスト
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -236,6 +236,8 @@ silencedInstances: "Istanze silenziate"
|
||||||
silencedInstancesDescription: "Elenca i nomi host delle istanze che vuoi silenziare. Tutti i profili nelle istanze silenziate vengono trattati come tali. Possono solo inviare richieste di follow e menzionare soltanto i profili locali che seguono. Le istanze bloccate non sono interessate."
|
silencedInstancesDescription: "Elenca i nomi host delle istanze che vuoi silenziare. Tutti i profili nelle istanze silenziate vengono trattati come tali. Possono solo inviare richieste di follow e menzionare soltanto i profili locali che seguono. Le istanze bloccate non sono interessate."
|
||||||
mediaSilencedInstances: "Istanze coi media silenziati"
|
mediaSilencedInstances: "Istanze coi media silenziati"
|
||||||
mediaSilencedInstancesDescription: "Elenca i nomi host delle istanze di cui vuoi silenziare i media, uno per riga. Tutti gli allegati dei profili nelle istanze silenziate per via degli allegati espliciti, verranno impostati come tali, le emoji personalizzate non saranno disponibili. Le istanze bloccate sono escluse."
|
mediaSilencedInstancesDescription: "Elenca i nomi host delle istanze di cui vuoi silenziare i media, uno per riga. Tutti gli allegati dei profili nelle istanze silenziate per via degli allegati espliciti, verranno impostati come tali, le emoji personalizzate non saranno disponibili. Le istanze bloccate sono escluse."
|
||||||
|
federationAllowedHosts: "Server a cui consentire la federazione"
|
||||||
|
federationAllowedHostsDescription: "Indica gli host dei server a cui è consentita la federazione, uno per ogni linea."
|
||||||
muteAndBlock: "Silenziare e bloccare"
|
muteAndBlock: "Silenziare e bloccare"
|
||||||
mutedUsers: "Profili silenziati"
|
mutedUsers: "Profili silenziati"
|
||||||
blockedUsers: "Profili bloccati"
|
blockedUsers: "Profili bloccati"
|
||||||
|
@ -1281,6 +1283,7 @@ signinWithPasskey: "Accedi con passkey"
|
||||||
unknownWebAuthnKey: "Questa è una passkey sconosciuta."
|
unknownWebAuthnKey: "Questa è una passkey sconosciuta."
|
||||||
passkeyVerificationFailed: "La verifica della passkey non è riuscita."
|
passkeyVerificationFailed: "La verifica della passkey non è riuscita."
|
||||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verifica della passkey è riuscita, ma l'accesso senza password è disabilitato."
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verifica della passkey è riuscita, ma l'accesso senza password è disabilitato."
|
||||||
|
messageToFollower: "Messaggio ai follower"
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "Stato della consegna"
|
status: "Stato della consegna"
|
||||||
stop: "Sospensione"
|
stop: "Sospensione"
|
||||||
|
@ -2248,6 +2251,9 @@ _profile:
|
||||||
changeBanner: "Cambia intestazione"
|
changeBanner: "Cambia intestazione"
|
||||||
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
||||||
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
|
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
|
||||||
|
followedMessage: "Messaggio, quando qualcuno ti segue"
|
||||||
|
followedMessageDescription: "Puoi impostare un breve messaggio da mostrare agli altri profili quando ti seguono."
|
||||||
|
followedMessageDescriptionForLockedAccount: "Quando approvi una richiesta di follow, verrà visualizzato questo testo."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Tutte le note"
|
allNotes: "Tutte le note"
|
||||||
favoritedNotes: "Note preferite"
|
favoritedNotes: "Note preferite"
|
||||||
|
@ -2402,6 +2408,7 @@ _notification:
|
||||||
roleAssigned: "Ruolo concesso"
|
roleAssigned: "Ruolo concesso"
|
||||||
achievementEarned: "Risultato raggiunto"
|
achievementEarned: "Risultato raggiunto"
|
||||||
exportCompleted: "Esportazione completata"
|
exportCompleted: "Esportazione completata"
|
||||||
|
login: "Accedi"
|
||||||
test: "Prova la notifica"
|
test: "Prova la notifica"
|
||||||
app: "Notifiche da applicazioni"
|
app: "Notifiche da applicazioni"
|
||||||
_actions:
|
_actions:
|
||||||
|
|
|
@ -8,6 +8,9 @@ search: "検索"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
username: "ユーザー名"
|
username: "ユーザー名"
|
||||||
password: "パスワード"
|
password: "パスワード"
|
||||||
|
initialPasswordForSetup: "初期設定開始用パスワード"
|
||||||
|
initialPasswordIsIncorrect: "初期設定開始用のパスワードが違います。"
|
||||||
|
initialPasswordForSetupDescription: "Misskeyを自分でインストールした場合は、設定ファイルに入力したパスワードを使用してください。\nMisskeyのホスティングサービスなどを使用している場合は、提供されたパスワードを使用してください。\nパスワードを設定していない場合は、空欄にしたまま続行してください。"
|
||||||
forgotPassword: "パスワードを忘れた"
|
forgotPassword: "パスワードを忘れた"
|
||||||
fetchingAsApObject: "連合に照会中"
|
fetchingAsApObject: "連合に照会中"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
|
@ -2452,6 +2455,7 @@ _notification:
|
||||||
followedBySomeUsers: "{n}人にフォローされました"
|
followedBySomeUsers: "{n}人にフォローされました"
|
||||||
flushNotification: "通知の履歴をリセットする"
|
flushNotification: "通知の履歴をリセットする"
|
||||||
exportOfXCompleted: "{x}のエクスポートが完了しました"
|
exportOfXCompleted: "{x}のエクスポートが完了しました"
|
||||||
|
login: "ログインがありました"
|
||||||
|
|
||||||
_types:
|
_types:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
|
@ -2468,6 +2472,7 @@ _notification:
|
||||||
roleAssigned: "ロールが付与された"
|
roleAssigned: "ロールが付与された"
|
||||||
achievementEarned: "実績の獲得"
|
achievementEarned: "実績の獲得"
|
||||||
exportCompleted: "エクスポートが完了した"
|
exportCompleted: "エクスポートが完了した"
|
||||||
|
login: "ログイン"
|
||||||
test: "通知のテスト"
|
test: "通知のテスト"
|
||||||
app: "連携アプリからの通知"
|
app: "連携アプリからの通知"
|
||||||
|
|
||||||
|
|
|
@ -2374,6 +2374,7 @@ _notification:
|
||||||
followRequestAccepted: "フォローが受理されたで"
|
followRequestAccepted: "フォローが受理されたで"
|
||||||
roleAssigned: "ロールが付与された"
|
roleAssigned: "ロールが付与された"
|
||||||
achievementEarned: "実績の獲得"
|
achievementEarned: "実績の獲得"
|
||||||
|
login: "ログイン"
|
||||||
app: "連携アプリからの通知や"
|
app: "連携アプリからの通知や"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "フォローバック"
|
followBack: "フォローバック"
|
||||||
|
|
|
@ -77,6 +77,8 @@ _profile:
|
||||||
username: "ಬಳಕೆಹೆಸರು"
|
username: "ಬಳಕೆಹೆಸರು"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||||
|
_types:
|
||||||
|
login: "ಪ್ರವೇಶ"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "ಉತ್ತರಿಸು"
|
reply: "ಉತ್ತರಿಸು"
|
||||||
_deck:
|
_deck:
|
||||||
|
|
|
@ -813,6 +813,7 @@ _notification:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
quote: "따오기"
|
quote: "따오기"
|
||||||
reaction: "반엉"
|
reaction: "반엉"
|
||||||
|
login: "로그인"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "답하기"
|
reply: "답하기"
|
||||||
_deck:
|
_deck:
|
||||||
|
|
|
@ -1283,6 +1283,7 @@ signinWithPasskey: "패스키로 로그인"
|
||||||
unknownWebAuthnKey: "등록되지 않은 패스키입니다."
|
unknownWebAuthnKey: "등록되지 않은 패스키입니다."
|
||||||
passkeyVerificationFailed: "패스키 검증을 실패했습니다."
|
passkeyVerificationFailed: "패스키 검증을 실패했습니다."
|
||||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "패스키를 검증했으나, 비밀번호 없이 로그인하기가 꺼져 있습니다."
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "패스키를 검증했으나, 비밀번호 없이 로그인하기가 꺼져 있습니다."
|
||||||
|
messageToFollower: "팔로워에 보낼 메시지"
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "전송 상태"
|
status: "전송 상태"
|
||||||
stop: "정지됨"
|
stop: "정지됨"
|
||||||
|
@ -2407,6 +2408,7 @@ _notification:
|
||||||
roleAssigned: "역할이 부여 됨"
|
roleAssigned: "역할이 부여 됨"
|
||||||
achievementEarned: "도전 과제 획득"
|
achievementEarned: "도전 과제 획득"
|
||||||
exportCompleted: "추출을 성공함"
|
exportCompleted: "추출을 성공함"
|
||||||
|
login: "로그인"
|
||||||
test: "알림 테스트"
|
test: "알림 테스트"
|
||||||
app: "연동된 앱을 통한 알림"
|
app: "연동된 앱을 통한 알림"
|
||||||
_actions:
|
_actions:
|
||||||
|
|
|
@ -456,6 +456,7 @@ _notification:
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "ອ້າງອີງ"
|
quote: "ອ້າງອີງ"
|
||||||
reaction: "Reaction"
|
reaction: "Reaction"
|
||||||
|
login: "ເຂົ້າສູ່ລະບົບ"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "ຕອບກັບ"
|
reply: "ຕອບກັບ"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
|
|
|
@ -486,6 +486,7 @@ _notification:
|
||||||
renote: "Herdelen"
|
renote: "Herdelen"
|
||||||
quote: "Quote"
|
quote: "Quote"
|
||||||
reaction: "Reacties"
|
reaction: "Reacties"
|
||||||
|
login: "Inloggen"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Antwoord"
|
reply: "Antwoord"
|
||||||
renote: "Herdelen"
|
renote: "Herdelen"
|
||||||
|
|
|
@ -701,6 +701,7 @@ _notification:
|
||||||
renote: "Renotes"
|
renote: "Renotes"
|
||||||
quote: "Sitater"
|
quote: "Sitater"
|
||||||
reaction: "Reaksjoner"
|
reaction: "Reaksjoner"
|
||||||
|
login: "Logg inn"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Svar"
|
reply: "Svar"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
|
|
|
@ -1509,6 +1509,7 @@ _notification:
|
||||||
reaction: "Reakcja"
|
reaction: "Reakcja"
|
||||||
receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji"
|
receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji"
|
||||||
followRequestAccepted: "Przyjęto prośbę o możliwość obserwacji"
|
followRequestAccepted: "Przyjęto prośbę o możliwość obserwacji"
|
||||||
|
login: "Zaloguj się"
|
||||||
app: "Powiadomienia z aplikacji"
|
app: "Powiadomienia z aplikacji"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "zaobserwował cię z powrotem"
|
followBack: "zaobserwował cię z powrotem"
|
||||||
|
|
|
@ -2376,6 +2376,7 @@ _notification:
|
||||||
followRequestAccepted: "Aceitou pedidos de seguidor"
|
followRequestAccepted: "Aceitou pedidos de seguidor"
|
||||||
roleAssigned: "Cargo dado"
|
roleAssigned: "Cargo dado"
|
||||||
achievementEarned: "Conquista desbloqueada"
|
achievementEarned: "Conquista desbloqueada"
|
||||||
|
login: "Iniciar sessão"
|
||||||
app: "Notificações de aplicativos conectados"
|
app: "Notificações de aplicativos conectados"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "te seguiu de volta"
|
followBack: "te seguiu de volta"
|
||||||
|
|
|
@ -714,6 +714,7 @@ _notification:
|
||||||
renote: "Re-notează"
|
renote: "Re-notează"
|
||||||
quote: "Citează"
|
quote: "Citează"
|
||||||
reaction: "Reacție"
|
reaction: "Reacție"
|
||||||
|
login: "Autentifică-te"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Răspunde"
|
reply: "Răspunde"
|
||||||
renote: "Re-notează"
|
renote: "Re-notează"
|
||||||
|
|
|
@ -2046,6 +2046,7 @@ _notification:
|
||||||
receiveFollowRequest: "Получен запрос на подписку"
|
receiveFollowRequest: "Получен запрос на подписку"
|
||||||
followRequestAccepted: "Запрос на подписку одобрен"
|
followRequestAccepted: "Запрос на подписку одобрен"
|
||||||
achievementEarned: "Получение достижений"
|
achievementEarned: "Получение достижений"
|
||||||
|
login: "Войти"
|
||||||
app: "Уведомления из приложений"
|
app: "Уведомления из приложений"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "отвечает взаимной подпиской"
|
followBack: "отвечает взаимной подпиской"
|
||||||
|
|
|
@ -17,3 +17,6 @@ _sfx:
|
||||||
note: "නෝට්"
|
note: "නෝට්"
|
||||||
_profile:
|
_profile:
|
||||||
username: "පරිශීලක නාමය"
|
username: "පරිශීලක නාමය"
|
||||||
|
_notification:
|
||||||
|
_types:
|
||||||
|
login: "පිවිසෙන්න"
|
||||||
|
|
|
@ -1409,6 +1409,7 @@ _notification:
|
||||||
pollEnded: "Hlasovanie skončilo"
|
pollEnded: "Hlasovanie skončilo"
|
||||||
receiveFollowRequest: "Doručené žiadosti o sledovanie"
|
receiveFollowRequest: "Doručené žiadosti o sledovanie"
|
||||||
followRequestAccepted: "Schválené žiadosti o sledovanie"
|
followRequestAccepted: "Schválené žiadosti o sledovanie"
|
||||||
|
login: "Prihlásiť sa"
|
||||||
app: "Oznámenia z prepojených aplikácií"
|
app: "Oznámenia z prepojených aplikácií"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Sledovať späť\n"
|
followBack: "Sledovať späť\n"
|
||||||
|
|
|
@ -562,6 +562,7 @@ _notification:
|
||||||
renote: "Omnotera"
|
renote: "Omnotera"
|
||||||
quote: "Citat"
|
quote: "Citat"
|
||||||
reaction: "Reaktioner"
|
reaction: "Reaktioner"
|
||||||
|
login: "Logga in"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Svara"
|
reply: "Svara"
|
||||||
renote: "Omnotera"
|
renote: "Omnotera"
|
||||||
|
|
|
@ -2374,6 +2374,7 @@ _notification:
|
||||||
followRequestAccepted: "อนุมัติให้ติดตามแล้ว"
|
followRequestAccepted: "อนุมัติให้ติดตามแล้ว"
|
||||||
roleAssigned: "ให้บทบาท"
|
roleAssigned: "ให้บทบาท"
|
||||||
achievementEarned: "ปลดล็อกความสำเร็จแล้ว"
|
achievementEarned: "ปลดล็อกความสำเร็จแล้ว"
|
||||||
|
login: "เข้าสู่ระบบ"
|
||||||
app: "การแจ้งเตือนจากแอปที่มีลิงก์"
|
app: "การแจ้งเตือนจากแอปที่มีลิงก์"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "ติดตามกลับด้วย"
|
followBack: "ติดตามกลับด้วย"
|
||||||
|
|
|
@ -446,6 +446,7 @@ _notification:
|
||||||
reaction: "Tepkiler"
|
reaction: "Tepkiler"
|
||||||
receiveFollowRequest: "Takip isteği alındı"
|
receiveFollowRequest: "Takip isteği alındı"
|
||||||
followRequestAccepted: "Takip isteği kabul edildi"
|
followRequestAccepted: "Takip isteği kabul edildi"
|
||||||
|
login: "Giriş Yap "
|
||||||
_actions:
|
_actions:
|
||||||
reply: "yanıt"
|
reply: "yanıt"
|
||||||
renote: "vazgeçme"
|
renote: "vazgeçme"
|
||||||
|
|
|
@ -17,3 +17,6 @@ _2fa:
|
||||||
renewTOTPCancel: "ئۇنى توختىتىڭ"
|
renewTOTPCancel: "ئۇنى توختىتىڭ"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "profile"
|
profile: "profile"
|
||||||
|
_notification:
|
||||||
|
_types:
|
||||||
|
login: "كىرىش"
|
||||||
|
|
|
@ -1587,6 +1587,7 @@ _notification:
|
||||||
reaction: "Реакції"
|
reaction: "Реакції"
|
||||||
receiveFollowRequest: "Запити на підписку"
|
receiveFollowRequest: "Запити на підписку"
|
||||||
followRequestAccepted: "Прийняті підписки"
|
followRequestAccepted: "Прийняті підписки"
|
||||||
|
login: "Увійти"
|
||||||
app: "Сповіщення від додатків"
|
app: "Сповіщення від додатків"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Відповісти"
|
reply: "Відповісти"
|
||||||
|
|
|
@ -1057,6 +1057,7 @@ _notification:
|
||||||
quote: "Iqtibos keltirish"
|
quote: "Iqtibos keltirish"
|
||||||
reaction: "Reaktsiyalar"
|
reaction: "Reaktsiyalar"
|
||||||
receiveFollowRequest: "Qabul qilingan kuzatuv so'rovlari"
|
receiveFollowRequest: "Qabul qilingan kuzatuv so'rovlari"
|
||||||
|
login: "Kirish"
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Javob berish"
|
reply: "Javob berish"
|
||||||
renote: "Qayta qayd qilish"
|
renote: "Qayta qayd qilish"
|
||||||
|
|
|
@ -1878,6 +1878,7 @@ _notification:
|
||||||
receiveFollowRequest: "Yêu cầu theo dõi"
|
receiveFollowRequest: "Yêu cầu theo dõi"
|
||||||
followRequestAccepted: "Yêu cầu theo dõi được chấp nhận"
|
followRequestAccepted: "Yêu cầu theo dõi được chấp nhận"
|
||||||
achievementEarned: "Hoàn thành Achievement"
|
achievementEarned: "Hoàn thành Achievement"
|
||||||
|
login: "Đăng nhập"
|
||||||
app: "Từ app liên kết"
|
app: "Từ app liên kết"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "đã theo dõi lại bạn"
|
followBack: "đã theo dõi lại bạn"
|
||||||
|
|
|
@ -90,7 +90,7 @@ followsYou: "正在关注你"
|
||||||
createList: "创建列表"
|
createList: "创建列表"
|
||||||
manageLists: "管理列表"
|
manageLists: "管理列表"
|
||||||
error: "错误"
|
error: "错误"
|
||||||
somethingHappened: "出现了一些问题!"
|
somethingHappened: "出错了"
|
||||||
retry: "重试"
|
retry: "重试"
|
||||||
pageLoadError: "页面加载失败。"
|
pageLoadError: "页面加载失败。"
|
||||||
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
||||||
|
@ -167,7 +167,7 @@ emojiUrl: "emoji 地址"
|
||||||
addEmoji: "添加表情符号"
|
addEmoji: "添加表情符号"
|
||||||
settingGuide: "推荐配置"
|
settingGuide: "推荐配置"
|
||||||
cacheRemoteFiles: "缓存远程文件"
|
cacheRemoteFiles: "缓存远程文件"
|
||||||
cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
|
cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
|
||||||
youCanCleanRemoteFilesCache: "可以使用文件管理的🗑️按钮来删除所有的缓存。"
|
youCanCleanRemoteFilesCache: "可以使用文件管理的🗑️按钮来删除所有的缓存。"
|
||||||
cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件"
|
cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件"
|
||||||
cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。"
|
cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。"
|
||||||
|
@ -236,6 +236,8 @@ silencedInstances: "被静音的服务器"
|
||||||
silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
|
silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
|
||||||
mediaSilencedInstances: "已隐藏媒体文件的服务器"
|
mediaSilencedInstances: "已隐藏媒体文件的服务器"
|
||||||
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置为隐藏媒体文件服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。"
|
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置为隐藏媒体文件服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。"
|
||||||
|
federationAllowedHosts: "允许联合的服务器"
|
||||||
|
federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。"
|
||||||
muteAndBlock: "静音/拉黑"
|
muteAndBlock: "静音/拉黑"
|
||||||
mutedUsers: "已静音用户"
|
mutedUsers: "已静音用户"
|
||||||
blockedUsers: "已拉黑的用户"
|
blockedUsers: "已拉黑的用户"
|
||||||
|
@ -512,6 +514,7 @@ emojiStyle: "表情符号的样式"
|
||||||
native: "原生"
|
native: "原生"
|
||||||
menuStyle: "菜单样式"
|
menuStyle: "菜单样式"
|
||||||
style: "样式"
|
style: "样式"
|
||||||
|
drawer: "抽屉"
|
||||||
popup: "弹窗"
|
popup: "弹窗"
|
||||||
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
|
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
|
||||||
showReactionsCount: "显示帖子的回应数"
|
showReactionsCount: "显示帖子的回应数"
|
||||||
|
@ -1273,10 +1276,14 @@ genEmbedCode: "生成嵌入代码"
|
||||||
noteOfThisUser: "此用户的帖子"
|
noteOfThisUser: "此用户的帖子"
|
||||||
clipNoteLimitExceeded: "无法再往此便签内添加更多帖子"
|
clipNoteLimitExceeded: "无法再往此便签内添加更多帖子"
|
||||||
performance: "性能"
|
performance: "性能"
|
||||||
|
modified: "有变更"
|
||||||
|
discard: "取消"
|
||||||
|
thereAreNChanges: "有 {n} 处更改"
|
||||||
signinWithPasskey: "使用通行密钥登录"
|
signinWithPasskey: "使用通行密钥登录"
|
||||||
unknownWebAuthnKey: "此通行密钥未注册。"
|
unknownWebAuthnKey: "此通行密钥未注册。"
|
||||||
passkeyVerificationFailed: "验证通行密钥失败。"
|
passkeyVerificationFailed: "验证通行密钥失败。"
|
||||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "通行密钥验证成功,但账户未开启无密码登录。"
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "通行密钥验证成功,但账户未开启无密码登录。"
|
||||||
|
messageToFollower: "给关注者的消息"
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "投递状态"
|
status: "投递状态"
|
||||||
stop: "停止投递"
|
stop: "停止投递"
|
||||||
|
@ -2244,6 +2251,9 @@ _profile:
|
||||||
changeBanner: "修改横幅"
|
changeBanner: "修改横幅"
|
||||||
verifiedLinkDescription: "如果将内容设置为 URL,当链接所指向的网页内包含自己的个人资料链接时,可以显示一个已验证图标。"
|
verifiedLinkDescription: "如果将内容设置为 URL,当链接所指向的网页内包含自己的个人资料链接时,可以显示一个已验证图标。"
|
||||||
avatarDecorationMax: "最多可添加 {max} 个挂件"
|
avatarDecorationMax: "最多可添加 {max} 个挂件"
|
||||||
|
followedMessage: "被关注时显示的消息"
|
||||||
|
followedMessageDescription: "可以设置被关注时向对方显示的短消息。"
|
||||||
|
followedMessageDescriptionForLockedAccount: "需要批准才能关注的情况下,消息是在被请求被批准后显示。"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "所有帖子"
|
allNotes: "所有帖子"
|
||||||
favoritedNotes: "收藏的帖子"
|
favoritedNotes: "收藏的帖子"
|
||||||
|
@ -2398,6 +2408,7 @@ _notification:
|
||||||
roleAssigned: "授予的角色"
|
roleAssigned: "授予的角色"
|
||||||
achievementEarned: "取得的成就"
|
achievementEarned: "取得的成就"
|
||||||
exportCompleted: "已完成导出"
|
exportCompleted: "已完成导出"
|
||||||
|
login: "登录"
|
||||||
test: "测试通知"
|
test: "测试通知"
|
||||||
app: "关联应用的通知"
|
app: "关联应用的通知"
|
||||||
_actions:
|
_actions:
|
||||||
|
|
|
@ -1283,6 +1283,7 @@ signinWithPasskey: "使用密碼金鑰登入"
|
||||||
unknownWebAuthnKey: "未註冊的金鑰。"
|
unknownWebAuthnKey: "未註冊的金鑰。"
|
||||||
passkeyVerificationFailed: "驗證金鑰失敗。"
|
passkeyVerificationFailed: "驗證金鑰失敗。"
|
||||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "雖然驗證金鑰成功,但是無密碼登入的方式是停用的。"
|
passkeyVerificationSucceededButPasswordlessLoginDisabled: "雖然驗證金鑰成功,但是無密碼登入的方式是停用的。"
|
||||||
|
messageToFollower: "給追隨者的訊息"
|
||||||
_delivery:
|
_delivery:
|
||||||
status: "傳送狀態"
|
status: "傳送狀態"
|
||||||
stop: "停止發送"
|
stop: "停止發送"
|
||||||
|
@ -2407,6 +2408,7 @@ _notification:
|
||||||
roleAssigned: "已授予角色"
|
roleAssigned: "已授予角色"
|
||||||
achievementEarned: "獲得成就"
|
achievementEarned: "獲得成就"
|
||||||
exportCompleted: "已完成匯出。"
|
exportCompleted: "已完成匯出。"
|
||||||
|
login: "登入"
|
||||||
test: "通知測試"
|
test: "通知測試"
|
||||||
app: "應用程式通知"
|
app: "應用程式通知"
|
||||||
_actions:
|
_actions:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2024.9.0",
|
"version": "2024.10.0-alpha.0",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
|
@ -71,20 +71,20 @@
|
||||||
"@bull-board/fastify": "6.0.0",
|
"@bull-board/fastify": "6.0.0",
|
||||||
"@bull-board/ui": "6.0.0",
|
"@bull-board/ui": "6.0.0",
|
||||||
"@discordapp/twemoji": "15.1.0",
|
"@discordapp/twemoji": "15.1.0",
|
||||||
"@fastify/accepts": "5.0.0",
|
"@fastify/accepts": "5.0.1",
|
||||||
"@fastify/cookie": "10.0.0",
|
"@fastify/cookie": "10.0.1",
|
||||||
"@fastify/cors": "10.0.0",
|
"@fastify/cors": "10.0.1",
|
||||||
"@fastify/express": "4.0.0",
|
"@fastify/express": "4.0.1",
|
||||||
"@fastify/http-proxy": "10.0.0",
|
"@fastify/http-proxy": "10.0.0",
|
||||||
"@fastify/multipart": "9.0.0",
|
"@fastify/multipart": "9.0.1",
|
||||||
"@fastify/static": "8.0.0",
|
"@fastify/static": "8.0.1",
|
||||||
"@fastify/view": "10.0.0",
|
"@fastify/view": "10.0.1",
|
||||||
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
"@misskey-dev/sharp-read-bmp": "1.2.0",
|
||||||
"@misskey-dev/summaly": "5.1.0",
|
"@misskey-dev/summaly": "5.1.0",
|
||||||
"@napi-rs/canvas": "0.1.56",
|
"@napi-rs/canvas": "0.1.56",
|
||||||
"@nestjs/common": "10.4.3",
|
"@nestjs/common": "10.4.4",
|
||||||
"@nestjs/core": "10.4.3",
|
"@nestjs/core": "10.4.4",
|
||||||
"@nestjs/testing": "10.4.3",
|
"@nestjs/testing": "10.4.4",
|
||||||
"@peertube/http-signature": "1.7.0",
|
"@peertube/http-signature": "1.7.0",
|
||||||
"@sentry/node": "8.20.0",
|
"@sentry/node": "8.20.0",
|
||||||
"@sentry/profiling-node": "8.20.0",
|
"@sentry/profiling-node": "8.20.0",
|
||||||
|
@ -149,7 +149,7 @@
|
||||||
"oauth2orize": "1.12.0",
|
"oauth2orize": "1.12.0",
|
||||||
"oauth2orize-pkce": "0.1.2",
|
"oauth2orize-pkce": "0.1.2",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"otpauth": "9.3.2",
|
"otpauth": "9.3.4",
|
||||||
"parse5": "7.1.2",
|
"parse5": "7.1.2",
|
||||||
"pg": "8.13.0",
|
"pg": "8.13.0",
|
||||||
"pkce-challenge": "4.1.0",
|
"pkce-challenge": "4.1.0",
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@jest/globals": "29.7.0",
|
"@jest/globals": "29.7.0",
|
||||||
"@nestjs/platform-express": "10.4.3",
|
"@nestjs/platform-express": "10.4.4",
|
||||||
"@simplewebauthn/types": "10.0.0",
|
"@simplewebauthn/types": "10.0.0",
|
||||||
"@swc/jest": "0.2.36",
|
"@swc/jest": "0.2.36",
|
||||||
"@types/accepts": "1.3.7",
|
"@types/accepts": "1.3.7",
|
||||||
|
|
|
@ -63,6 +63,8 @@ type Source = {
|
||||||
|
|
||||||
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
|
publishTarballInsteadOfProvideRepositoryUrl?: boolean;
|
||||||
|
|
||||||
|
initialPassword?: string;
|
||||||
|
|
||||||
proxy?: string;
|
proxy?: string;
|
||||||
proxySmtp?: string;
|
proxySmtp?: string;
|
||||||
proxyBypassHosts?: string[];
|
proxyBypassHosts?: string[];
|
||||||
|
@ -152,6 +154,7 @@ export type Config = {
|
||||||
|
|
||||||
version: string;
|
version: string;
|
||||||
publishTarballInsteadOfProvideRepositoryUrl: boolean;
|
publishTarballInsteadOfProvideRepositoryUrl: boolean;
|
||||||
|
initialPassword: string | undefined;
|
||||||
host: string;
|
host: string;
|
||||||
hostname: string;
|
hostname: string;
|
||||||
scheme: string;
|
scheme: string;
|
||||||
|
@ -232,6 +235,7 @@ export function loadConfig(): Config {
|
||||||
return {
|
return {
|
||||||
version,
|
version,
|
||||||
publishTarballInsteadOfProvideRepositoryUrl: !!config.publishTarballInsteadOfProvideRepositoryUrl,
|
publishTarballInsteadOfProvideRepositoryUrl: !!config.publishTarballInsteadOfProvideRepositoryUrl,
|
||||||
|
initialPassword: config.initialPassword,
|
||||||
url: url.origin,
|
url: url.origin,
|
||||||
port: config.port ?? parseInt(process.env.PORT ?? '', 10),
|
port: config.port ?? parseInt(process.env.PORT ?? '', 10),
|
||||||
socket: config.socket,
|
socket: config.socket,
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { userExportableEntities } from '@/types.js';
|
||||||
import { MiUser } from './User.js';
|
import { MiUser } from './User.js';
|
||||||
import { MiNote } from './Note.js';
|
import { MiNote } from './Note.js';
|
||||||
import { MiAccessToken } from './AccessToken.js';
|
import { MiAccessToken } from './AccessToken.js';
|
||||||
import { MiRole } from './Role.js';
|
import { MiRole } from './Role.js';
|
||||||
import { MiDriveFile } from './DriveFile.js';
|
import { MiDriveFile } from './DriveFile.js';
|
||||||
import { userExportableEntities } from '@/types.js';
|
|
||||||
|
|
||||||
export type MiNotification = {
|
export type MiNotification = {
|
||||||
type: 'note';
|
type: 'note';
|
||||||
|
@ -86,6 +86,10 @@ export type MiNotification = {
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
exportedEntity: typeof userExportableEntities[number];
|
exportedEntity: typeof userExportableEntities[number];
|
||||||
fileId: MiDriveFile['id'];
|
fileId: MiDriveFile['id'];
|
||||||
|
} | {
|
||||||
|
type: 'login';
|
||||||
|
id: string;
|
||||||
|
createdAt: string;
|
||||||
} | {
|
} | {
|
||||||
type: 'app';
|
type: 'app';
|
||||||
id: string;
|
id: string;
|
||||||
|
|
|
@ -322,6 +322,16 @@ export const packedNotificationSchema = {
|
||||||
format: 'id',
|
format: 'id',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
...baseSchema.properties,
|
||||||
|
type: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
enum: ['login'],
|
||||||
|
},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
|
|
|
@ -118,6 +118,7 @@ export class ApiServerService {
|
||||||
'hcaptcha-response'?: string;
|
'hcaptcha-response'?: string;
|
||||||
'g-recaptcha-response'?: string;
|
'g-recaptcha-response'?: string;
|
||||||
'turnstile-response'?: string;
|
'turnstile-response'?: string;
|
||||||
|
'm-captcha-response'?: string;
|
||||||
}
|
}
|
||||||
}>('/signup', (request, reply) => this.signupApiService.signup(request, reply));
|
}>('/signup', (request, reply) => this.signupApiService.signup(request, reply));
|
||||||
|
|
||||||
|
@ -126,17 +127,18 @@ export class ApiServerService {
|
||||||
username: string;
|
username: string;
|
||||||
password: string;
|
password: string;
|
||||||
token?: string;
|
token?: string;
|
||||||
signature?: string;
|
credential?: AuthenticationResponseJSON;
|
||||||
authenticatorData?: string;
|
'hcaptcha-response'?: string;
|
||||||
clientDataJSON?: string;
|
'g-recaptcha-response'?: string;
|
||||||
credentialId?: string;
|
'turnstile-response'?: string;
|
||||||
challengeId?: string;
|
'm-captcha-response'?: string;
|
||||||
};
|
};
|
||||||
}>('/signin', (request, reply) => this.signinApiService.signin(request, reply));
|
}>('/signin', (request, reply) => this.signinApiService.signin(request, reply));
|
||||||
|
|
||||||
fastify.post<{
|
fastify.post<{
|
||||||
Body: {
|
Body: {
|
||||||
credential?: AuthenticationResponseJSON;
|
credential?: AuthenticationResponseJSON;
|
||||||
|
context?: string;
|
||||||
};
|
};
|
||||||
}>('/signin-with-passkey', (request, reply) => this.signinWithPasskeyApiService.signin(request, reply));
|
}>('/signin-with-passkey', (request, reply) => this.signinWithPasskeyApiService.signin(request, reply));
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,14 @@
|
||||||
|
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import type { SigninsRepository } from '@/models/_.js';
|
import type { SigninsRepository, UserProfilesRepository } from '@/models/_.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import type { MiLocalUser } from '@/models/User.js';
|
import type { MiLocalUser } from '@/models/User.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { SigninEntityService } from '@/core/entities/SigninEntityService.js';
|
import { SigninEntityService } from '@/core/entities/SigninEntityService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
|
import { EmailService } from '@/core/EmailService.js';
|
||||||
|
import { NotificationService } from '@/core/NotificationService.js';
|
||||||
import type { FastifyRequest, FastifyReply } from 'fastify';
|
import type { FastifyRequest, FastifyReply } from 'fastify';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -19,7 +21,12 @@ export class SigninService {
|
||||||
@Inject(DI.signinsRepository)
|
@Inject(DI.signinsRepository)
|
||||||
private signinsRepository: SigninsRepository,
|
private signinsRepository: SigninsRepository,
|
||||||
|
|
||||||
|
@Inject(DI.userProfilesRepository)
|
||||||
|
private userProfilesRepository: UserProfilesRepository,
|
||||||
|
|
||||||
private signinEntityService: SigninEntityService,
|
private signinEntityService: SigninEntityService,
|
||||||
|
private emailService: EmailService,
|
||||||
|
private notificationService: NotificationService,
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
) {
|
) {
|
||||||
|
@ -28,7 +35,8 @@ export class SigninService {
|
||||||
@bindThis
|
@bindThis
|
||||||
public signin(request: FastifyRequest, reply: FastifyReply, user: MiLocalUser) {
|
public signin(request: FastifyRequest, reply: FastifyReply, user: MiLocalUser) {
|
||||||
setImmediate(async () => {
|
setImmediate(async () => {
|
||||||
// Append signin history
|
this.notificationService.createNotification(user.id, 'login', {});
|
||||||
|
|
||||||
const record = await this.signinsRepository.insertOne({
|
const record = await this.signinsRepository.insertOne({
|
||||||
id: this.idService.gen(),
|
id: this.idService.gen(),
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
@ -37,8 +45,14 @@ export class SigninService {
|
||||||
success: true,
|
success: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Publish signin event
|
|
||||||
this.globalEventService.publishMainStream(user.id, 'signin', await this.signinEntityService.pack(record));
|
this.globalEventService.publishMainStream(user.id, 'signin', await this.signinEntityService.pack(record));
|
||||||
|
|
||||||
|
const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id });
|
||||||
|
if (profile.email && profile.emailVerified) {
|
||||||
|
this.emailService.sendEmail(profile.email, 'New login / ログインがありました',
|
||||||
|
'There is a new login. If you do not recognize this login, update the security status of your account, including changing your password. / 新しいログインがありました。このログインに心当たりがない場合は、パスワードを変更するなど、アカウントのセキュリティ状態を更新してください。',
|
||||||
|
'There is a new login. If you do not recognize this login, update the security status of your account, including changing your password. / 新しいログインがありました。このログインに心当たりがない場合は、パスワードを変更するなど、アカウントのセキュリティ状態を更新してください。');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
reply.code(200);
|
reply.code(200);
|
||||||
|
|
|
@ -12,11 +12,27 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { InstanceActorService } from '@/core/InstanceActorService.js';
|
import { InstanceActorService } from '@/core/InstanceActorService.js';
|
||||||
import { localUsernameSchema, passwordSchema } from '@/models/User.js';
|
import { localUsernameSchema, passwordSchema } from '@/models/User.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
import type { Config } from '@/config.js';
|
||||||
|
import { ApiError } from '@/server/api/error.js';
|
||||||
import { Packed } from '@/misc/json-schema.js';
|
import { Packed } from '@/misc/json-schema.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
|
||||||
|
errors: {
|
||||||
|
accessDenied: {
|
||||||
|
message: 'Access denied.',
|
||||||
|
code: 'ACCESS_DENIED',
|
||||||
|
id: '1fb7cb09-d46a-4fff-b8df-057708cce513',
|
||||||
|
},
|
||||||
|
|
||||||
|
wrongInitialPassword: {
|
||||||
|
message: 'Initial password is incorrect.',
|
||||||
|
code: 'INCORRECT_INITIAL_PASSWORD',
|
||||||
|
id: '97147c55-1ae1-4f6f-91d6-e1c3e0e76d62',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
res: {
|
res: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
@ -35,6 +51,7 @@ export const paramDef = {
|
||||||
properties: {
|
properties: {
|
||||||
username: localUsernameSchema,
|
username: localUsernameSchema,
|
||||||
password: passwordSchema,
|
password: passwordSchema,
|
||||||
|
initialPassword: { type: 'string', nullable: true },
|
||||||
},
|
},
|
||||||
required: ['username', 'password'],
|
required: ['username', 'password'],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -42,6 +59,9 @@ export const paramDef = {
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||||
constructor(
|
constructor(
|
||||||
|
@Inject(DI.config)
|
||||||
|
private config: Config,
|
||||||
|
|
||||||
@Inject(DI.usersRepository)
|
@Inject(DI.usersRepository)
|
||||||
private usersRepository: UsersRepository,
|
private usersRepository: UsersRepository,
|
||||||
|
|
||||||
|
@ -52,7 +72,23 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
super(meta, paramDef, async (ps, _me, token) => {
|
super(meta, paramDef, async (ps, _me, token) => {
|
||||||
const me = _me ? await this.usersRepository.findOneByOrFail({ id: _me.id }) : null;
|
const me = _me ? await this.usersRepository.findOneByOrFail({ id: _me.id }) : null;
|
||||||
const realUsers = await this.instanceActorService.realLocalUsersPresent();
|
const realUsers = await this.instanceActorService.realLocalUsersPresent();
|
||||||
if ((realUsers && !me?.isRoot) || token !== null) throw new Error('access denied');
|
|
||||||
|
if (!realUsers && me == null && token == null) {
|
||||||
|
// 初回セットアップの場合
|
||||||
|
if (this.config.initialPassword != null) {
|
||||||
|
// 初期パスワードが設定されている場合
|
||||||
|
if (ps.initialPassword !== this.config.initialPassword) {
|
||||||
|
// 初期パスワードが違う場合
|
||||||
|
throw new ApiError(meta.errors.wrongInitialPassword);
|
||||||
|
}
|
||||||
|
} else if (ps.initialPassword != null && ps.initialPassword.trim() !== '') {
|
||||||
|
// 初期パスワードが設定されていないのに初期パスワードが入力された場合
|
||||||
|
throw new ApiError(meta.errors.wrongInitialPassword);
|
||||||
|
}
|
||||||
|
} else if ((realUsers && !me?.isRoot) || token !== null) {
|
||||||
|
// 初回セットアップではなく、管理者でない場合 or 外部トークンを使用している場合
|
||||||
|
throw new ApiError(meta.errors.accessDenied);
|
||||||
|
}
|
||||||
|
|
||||||
const { account, secret } = await this.signupService.signup({
|
const { account, secret } = await this.signupService.signup({
|
||||||
username: ps.username,
|
username: ps.username,
|
||||||
|
|
|
@ -652,7 +652,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Array.isArray(ps.federationHosts)) {
|
if (Array.isArray(ps.federationHosts)) {
|
||||||
set.blockedHosts = ps.federationHosts.filter(Boolean).map(x => x.toLowerCase());
|
set.federationHosts = ps.federationHosts.filter(Boolean).map(x => x.toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
const before = await this.metaService.fetch(true);
|
const before = await this.metaService.fetch(true);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* roleAssigned - ロールが付与された
|
* roleAssigned - ロールが付与された
|
||||||
* achievementEarned - 実績を獲得
|
* achievementEarned - 実績を獲得
|
||||||
* exportCompleted - エクスポートが完了
|
* exportCompleted - エクスポートが完了
|
||||||
|
* login - ログイン
|
||||||
* app - アプリ通知
|
* app - アプリ通知
|
||||||
* test - テスト通知(サーバー側)
|
* test - テスト通知(サーバー側)
|
||||||
*/
|
*/
|
||||||
|
@ -34,6 +35,7 @@ export const notificationTypes = [
|
||||||
'roleAssigned',
|
'roleAssigned',
|
||||||
'achievementEarned',
|
'achievementEarned',
|
||||||
'exportCompleted',
|
'exportCompleted',
|
||||||
|
'login',
|
||||||
'app',
|
'app',
|
||||||
'test',
|
'test',
|
||||||
] as const;
|
] as const;
|
||||||
|
|
|
@ -91,6 +91,11 @@ export function getConfig(): UserConfig {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
preprocessorOptions: {
|
||||||
|
scss: {
|
||||||
|
api: 'modern-compiler',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
define: {
|
define: {
|
||||||
|
|
|
@ -68,6 +68,7 @@ export const notificationTypes = [
|
||||||
'roleAssigned',
|
'roleAssigned',
|
||||||
'achievementEarned',
|
'achievementEarned',
|
||||||
'exportCompleted',
|
'exportCompleted',
|
||||||
|
'login',
|
||||||
'test',
|
'test',
|
||||||
'app',
|
'app',
|
||||||
] as const;
|
] as const;
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
"rollup": "4.22.5",
|
"rollup": "4.22.5",
|
||||||
"sanitize-html": "2.13.0",
|
"sanitize-html": "2.13.0",
|
||||||
"sass": "1.79.3",
|
"sass": "1.79.3",
|
||||||
"shiki": "1.12.0",
|
"shiki": "1.21.0",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.169.0",
|
"three": "0.169.0",
|
||||||
|
|
|
@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkA v-user-preview="canonical" :class="[$style.root, { [$style.isMe]: isMe }]" :to="url" :style="{ background: bgCss }" :behavior="navigationBehavior">
|
<MkA v-user-preview="canonical" :class="[$style.root, { [$style.isMe]: isMe }]" :to="url" :behavior="navigationBehavior">
|
||||||
<img :class="$style.icon" :src="avatarUrl" alt="">
|
<img :class="$style.icon" :src="avatarUrl" alt="">
|
||||||
<span>
|
<span>
|
||||||
<span>@{{ username }}</span>
|
<span>@{{ username }}</span>
|
||||||
|
@ -16,7 +16,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { toUnicode } from 'punycode';
|
import { toUnicode } from 'punycode';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import tinycolor from 'tinycolor2';
|
|
||||||
import { host as localHost } from '@@/js/config.js';
|
import { host as localHost } from '@@/js/config.js';
|
||||||
import { $i } from '@/account.js';
|
import { $i } from '@/account.js';
|
||||||
import { defaultStore } from '@/store.js';
|
import { defaultStore } from '@/store.js';
|
||||||
|
@ -37,11 +36,7 @@ const isMe = $i && (
|
||||||
`@${props.username}@${toUnicode(props.host)}` === `@${$i.username}@${toUnicode(localHost)}`.toLowerCase()
|
`@${props.username}@${toUnicode(props.host)}` === `@${$i.username}@${toUnicode(localHost)}`.toLowerCase()
|
||||||
);
|
);
|
||||||
|
|
||||||
const bg = tinycolor(getComputedStyle(document.documentElement).getPropertyValue(isMe ? '--mentionMe' : '--mention'));
|
const avatarUrl = computed(() => defaultStore.state.disableShowingAnimatedImages || defaultStore.state.dataSaver.avatar
|
||||||
bg.setAlpha(0.1);
|
|
||||||
const bgCss = bg.toRgbString();
|
|
||||||
|
|
||||||
const avatarUrl = computed(() => defaultStore.state.disableShowingAnimatedImages
|
|
||||||
? getStaticImageUrl(`/avatar/@${props.username}@${props.host}`)
|
? getStaticImageUrl(`/avatar/@${props.username}@${props.host}`)
|
||||||
: `/avatar/@${props.username}@${props.host}`,
|
: `/avatar/@${props.username}@${props.host}`,
|
||||||
);
|
);
|
||||||
|
@ -53,9 +48,11 @@ const avatarUrl = computed(() => defaultStore.state.disableShowingAnimatedImages
|
||||||
padding: 4px 8px 4px 4px;
|
padding: 4px 8px 4px 4px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
color: var(--mention);
|
color: var(--mention);
|
||||||
|
background: color(from var(--mention) srgb r g b / 0.1);
|
||||||
|
|
||||||
&.isMe {
|
&.isMe {
|
||||||
color: var(--mentionMe);
|
color: var(--mentionMe);
|
||||||
|
background: color(from var(--mentionMe) srgb r g b / 0.1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div :class="$style.root">
|
<div :class="$style.root">
|
||||||
<div :class="$style.head">
|
<div :class="$style.head">
|
||||||
<MkAvatar v-if="['pollEnded', 'note'].includes(notification.type) && 'note' in notification" :class="$style.icon" :user="notification.note.user" link preview/>
|
<MkAvatar v-if="['pollEnded', 'note'].includes(notification.type) && 'note' in notification" :class="$style.icon" :user="notification.note.user" link preview/>
|
||||||
<MkAvatar v-else-if="['roleAssigned', 'achievementEarned'].includes(notification.type)" :class="$style.icon" :user="$i" link preview/>
|
<MkAvatar v-else-if="['roleAssigned', 'achievementEarned', 'exportCompleted', 'login'].includes(notification.type)" :class="$style.icon" :user="$i" link preview/>
|
||||||
<div v-else-if="notification.type === 'reaction:grouped' && notification.note.reactionAcceptance === 'likeOnly'" :class="[$style.icon, $style.icon_reactionGroupHeart]"><i class="ti ti-heart" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'reaction:grouped' && notification.note.reactionAcceptance === 'likeOnly'" :class="[$style.icon, $style.icon_reactionGroupHeart]"><i class="ti ti-heart" style="line-height: 1;"></i></div>
|
||||||
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
||||||
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
||||||
<img v-else-if="notification.type === 'test'" :class="$style.icon" :src="infoImageUrl"/>
|
<img v-else-if="notification.type === 'test'" :class="$style.icon" :src="infoImageUrl"/>
|
||||||
<MkAvatar v-else-if="'user' in notification" :class="$style.icon" :user="notification.user" link preview/>
|
<MkAvatar v-else-if="'user' in notification" :class="$style.icon" :user="notification.user" link preview/>
|
||||||
<MkAvatar v-else-if="notification.type === 'exportCompleted'" :class="$style.icon" :user="$i" link preview/>
|
|
||||||
<img v-else-if="'icon' in notification && notification.icon != null" :class="[$style.icon, $style.icon_app]" :src="notification.icon" alt=""/>
|
<img v-else-if="'icon' in notification && notification.icon != null" :class="[$style.icon, $style.icon_app]" :src="notification.icon" alt=""/>
|
||||||
<div
|
<div
|
||||||
:class="[$style.subIcon, {
|
:class="[$style.subIcon, {
|
||||||
|
@ -27,6 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
[$style.t_pollEnded]: notification.type === 'pollEnded',
|
[$style.t_pollEnded]: notification.type === 'pollEnded',
|
||||||
[$style.t_achievementEarned]: notification.type === 'achievementEarned',
|
[$style.t_achievementEarned]: notification.type === 'achievementEarned',
|
||||||
[$style.t_exportCompleted]: notification.type === 'exportCompleted',
|
[$style.t_exportCompleted]: notification.type === 'exportCompleted',
|
||||||
|
[$style.t_login]: notification.type === 'login',
|
||||||
[$style.t_roleAssigned]: notification.type === 'roleAssigned' && notification.role.iconUrl == null,
|
[$style.t_roleAssigned]: notification.type === 'roleAssigned' && notification.role.iconUrl == null,
|
||||||
}]"
|
}]"
|
||||||
>
|
>
|
||||||
|
@ -40,6 +40,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<i v-else-if="notification.type === 'pollEnded'" class="ti ti-chart-arrows"></i>
|
<i v-else-if="notification.type === 'pollEnded'" class="ti ti-chart-arrows"></i>
|
||||||
<i v-else-if="notification.type === 'achievementEarned'" class="ti ti-medal"></i>
|
<i v-else-if="notification.type === 'achievementEarned'" class="ti ti-medal"></i>
|
||||||
<i v-else-if="notification.type === 'exportCompleted'" class="ti ti-archive"></i>
|
<i v-else-if="notification.type === 'exportCompleted'" class="ti ti-archive"></i>
|
||||||
|
<i v-else-if="notification.type === 'login'" class="ti ti-login-2"></i>
|
||||||
<template v-else-if="notification.type === 'roleAssigned'">
|
<template v-else-if="notification.type === 'roleAssigned'">
|
||||||
<img v-if="notification.role.iconUrl" style="height: 1.3em; vertical-align: -22%;" :src="notification.role.iconUrl" alt=""/>
|
<img v-if="notification.role.iconUrl" style="height: 1.3em; vertical-align: -22%;" :src="notification.role.iconUrl" alt=""/>
|
||||||
<i v-else class="ti ti-badges"></i>
|
<i v-else class="ti ti-badges"></i>
|
||||||
|
@ -59,6 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<span v-else-if="notification.type === 'note'">{{ i18n.ts._notification.newNote }}: <MkUserName :user="notification.note.user"/></span>
|
<span v-else-if="notification.type === 'note'">{{ i18n.ts._notification.newNote }}: <MkUserName :user="notification.note.user"/></span>
|
||||||
<span v-else-if="notification.type === 'roleAssigned'">{{ i18n.ts._notification.roleAssigned }}</span>
|
<span v-else-if="notification.type === 'roleAssigned'">{{ i18n.ts._notification.roleAssigned }}</span>
|
||||||
<span v-else-if="notification.type === 'achievementEarned'">{{ i18n.ts._notification.achievementEarned }}</span>
|
<span v-else-if="notification.type === 'achievementEarned'">{{ i18n.ts._notification.achievementEarned }}</span>
|
||||||
|
<span v-else-if="notification.type === 'login'">{{ i18n.ts._notification.login }}</span>
|
||||||
<span v-else-if="notification.type === 'test'">{{ i18n.ts._notification.testNotification }}</span>
|
<span v-else-if="notification.type === 'test'">{{ i18n.ts._notification.testNotification }}</span>
|
||||||
<span v-else-if="notification.type === 'exportCompleted'">{{ i18n.tsx._notification.exportOfXCompleted({ x: exportEntityName[notification.exportedEntity] }) }}</span>
|
<span v-else-if="notification.type === 'exportCompleted'">{{ i18n.tsx._notification.exportOfXCompleted({ x: exportEntityName[notification.exportedEntity] }) }}</span>
|
||||||
<MkA v-else-if="notification.type === 'follow' || notification.type === 'mention' || notification.type === 'reply' || notification.type === 'renote' || notification.type === 'quote' || notification.type === 'reaction' || notification.type === 'receiveFollowRequest' || notification.type === 'followRequestAccepted'" v-user-preview="notification.user.id" :class="$style.headerName" :to="userPage(notification.user)"><MkUserName :user="notification.user"/></MkA>
|
<MkA v-else-if="notification.type === 'follow' || notification.type === 'mention' || notification.type === 'reply' || notification.type === 'renote' || notification.type === 'quote' || notification.type === 'reaction' || notification.type === 'receiveFollowRequest' || notification.type === 'followRequestAccepted'" v-user-preview="notification.user.id" :class="$style.headerName" :to="userPage(notification.user)"><MkUserName :user="notification.user"/></MkA>
|
||||||
|
@ -225,6 +227,7 @@ function getActualReactedUsersCount(notification: Misskey.entities.Notification)
|
||||||
--eventReactionHeart: var(--love);
|
--eventReactionHeart: var(--love);
|
||||||
--eventReaction: #e99a0b;
|
--eventReaction: #e99a0b;
|
||||||
--eventAchievement: #cb9a11;
|
--eventAchievement: #cb9a11;
|
||||||
|
--eventLogin: #007aff;
|
||||||
--eventOther: #88a6b7;
|
--eventOther: #88a6b7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,6 +349,12 @@ function getActualReactedUsersCount(notification: Misskey.entities.Notification)
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.t_login {
|
||||||
|
padding: 3px;
|
||||||
|
background: var(--eventLogin);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
.tail {
|
.tail {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
|
|
@ -7,7 +7,14 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div v-show="props.modelValue.length != 0" :class="$style.root">
|
<div v-show="props.modelValue.length != 0" :class="$style.root">
|
||||||
<Sortable :modelValue="props.modelValue" :class="$style.files" itemKey="id" :animation="150" :delay="100" :delayOnTouchOnly="true" @update:modelValue="v => emit('update:modelValue', v)">
|
<Sortable :modelValue="props.modelValue" :class="$style.files" itemKey="id" :animation="150" :delay="100" :delayOnTouchOnly="true" @update:modelValue="v => emit('update:modelValue', v)">
|
||||||
<template #item="{element}">
|
<template #item="{element}">
|
||||||
<div :class="$style.file" @click="showFileMenu(element, $event)" @contextmenu.prevent="showFileMenu(element, $event)">
|
<div
|
||||||
|
:class="$style.file"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
@click="showFileMenu(element, $event)"
|
||||||
|
@keydown.space.enter="showFileMenu(element, $event)"
|
||||||
|
@contextmenu.prevent="showFileMenu(element, $event)"
|
||||||
|
>
|
||||||
<MkDriveFileThumbnail :data-id="element.id" :class="$style.thumbnail" :file="element" fit="cover"/>
|
<MkDriveFileThumbnail :data-id="element.id" :class="$style.thumbnail" :file="element" fit="cover"/>
|
||||||
<div v-if="element.isSensitive" :class="$style.sensitive">
|
<div v-if="element.isSensitive" :class="$style.sensitive">
|
||||||
<i class="ti ti-eye-exclamation" style="margin: auto;"></i>
|
<i class="ti ti-eye-exclamation" style="margin: auto;"></i>
|
||||||
|
@ -133,7 +140,7 @@ async function crop(file: Misskey.entities.DriveFile): Promise<void> {
|
||||||
emit('replaceFile', file, newFile);
|
emit('replaceFile', file, newFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent): void {
|
function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent | KeyboardEvent): void {
|
||||||
if (menuShowing) return;
|
if (menuShowing) return;
|
||||||
|
|
||||||
const isImage = file.type.startsWith('image/');
|
const isImage = file.type.startsWith('image/');
|
||||||
|
@ -199,6 +206,10 @@ function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent): void {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
cursor: move;
|
cursor: move;
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
outline-offset: 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnail {
|
.thumbnail {
|
||||||
|
|
|
@ -14,6 +14,10 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</div>
|
</div>
|
||||||
<div class="_gaps_m" style="padding: 32px;">
|
<div class="_gaps_m" style="padding: 32px;">
|
||||||
<div>{{ i18n.ts.intro }}</div>
|
<div>{{ i18n.ts.intro }}</div>
|
||||||
|
<MkInput v-model="initialPassword" type="password" data-cy-admin-initial-password>
|
||||||
|
<template #label>{{ i18n.ts.initialPasswordForSetup }} <div v-tooltip:dialog="i18n.ts.initialPasswordForSetupDescription" class="_button _help"><i class="ti ti-help-circle"></i></div></template>
|
||||||
|
<template #prefix><i class="ti ti-lock"></i></template>
|
||||||
|
</MkInput>
|
||||||
<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username>
|
<MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" :spellcheck="false" required data-cy-admin-username>
|
||||||
<template #label>{{ i18n.ts.username }}</template>
|
<template #label>{{ i18n.ts.username }}</template>
|
||||||
<template #prefix>@</template>
|
<template #prefix>@</template>
|
||||||
|
@ -47,6 +51,7 @@ import MkAnimBg from '@/components/MkAnimBg.vue';
|
||||||
|
|
||||||
const username = ref('');
|
const username = ref('');
|
||||||
const password = ref('');
|
const password = ref('');
|
||||||
|
const initialPassword = ref('');
|
||||||
const submitting = ref(false);
|
const submitting = ref(false);
|
||||||
|
|
||||||
function submit() {
|
function submit() {
|
||||||
|
@ -56,14 +61,27 @@ function submit() {
|
||||||
misskeyApi('admin/accounts/create', {
|
misskeyApi('admin/accounts/create', {
|
||||||
username: username.value,
|
username: username.value,
|
||||||
password: password.value,
|
password: password.value,
|
||||||
|
initialPassword: initialPassword.value === '' ? null : initialPassword.value,
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
return login(res.token);
|
return login(res.token);
|
||||||
}).catch(() => {
|
}).catch((err) => {
|
||||||
submitting.value = false;
|
submitting.value = false;
|
||||||
|
|
||||||
|
let title = i18n.ts.somethingHappened;
|
||||||
|
let text = err.message + '\n' + err.id;
|
||||||
|
|
||||||
|
if (err.code === 'ACCESS_DENIED') {
|
||||||
|
title = i18n.ts.permissionDeniedError;
|
||||||
|
text = i18n.ts.operationForbidden;
|
||||||
|
} else if (err.code === 'INCORRECT_INITIAL_PASSWORD') {
|
||||||
|
title = i18n.ts.permissionDeniedError;
|
||||||
|
text = i18n.ts.incorrectPassword;
|
||||||
|
}
|
||||||
|
|
||||||
os.alert({
|
os.alert({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: i18n.ts.somethingHappened,
|
title,
|
||||||
|
text,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -74,8 +92,8 @@ function submit() {
|
||||||
min-height: 100svh;
|
min-height: 100svh;
|
||||||
padding: 32px 32px 64px 32px;
|
padding: 32px 32px 64px 32px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
display: grid;
|
display: grid;
|
||||||
place-content: center;
|
place-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form {
|
.form {
|
||||||
|
|
|
@ -109,6 +109,11 @@ export function getConfig(): UserConfig {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
preprocessorOptions: {
|
||||||
|
scss: {
|
||||||
|
api: 'modern-compiler',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
define: {
|
define: {
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
|
|
||||||
|
import type { AuthenticationResponseJSON } from '@simplewebauthn/types';
|
||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
|
import type { PublicKeyCredentialRequestOptionsJSON } from '@simplewebauthn/types';
|
||||||
|
|
||||||
// Warning: (ae-forgotten-export) The symbol "components" needs to be exported by the entry point index.d.ts
|
// Warning: (ae-forgotten-export) The symbol "components" needs to be exported by the entry point index.d.ts
|
||||||
//
|
//
|
||||||
|
@ -1162,7 +1164,19 @@ export type Endpoints = Overwrite<Endpoints_2, {
|
||||||
};
|
};
|
||||||
'signin-with-passkey': {
|
'signin-with-passkey': {
|
||||||
req: SigninWithPasskeyRequest;
|
req: SigninWithPasskeyRequest;
|
||||||
res: SigninWithPasskeyResponse;
|
res: {
|
||||||
|
$switch: {
|
||||||
|
$cases: [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
context: string;
|
||||||
|
},
|
||||||
|
SigninWithPasskeyResponse
|
||||||
|
]
|
||||||
|
];
|
||||||
|
$default: SigninWithPasskeyInitResponse;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
'admin/roles/create': {
|
'admin/roles/create': {
|
||||||
req: Overwrite<AdminRolesCreateRequest, {
|
req: Overwrite<AdminRolesCreateRequest, {
|
||||||
|
@ -1196,6 +1210,7 @@ declare namespace entities {
|
||||||
SignupPendingResponse,
|
SignupPendingResponse,
|
||||||
SigninRequest,
|
SigninRequest,
|
||||||
SigninWithPasskeyRequest,
|
SigninWithPasskeyRequest,
|
||||||
|
SigninWithPasskeyInitResponse,
|
||||||
SigninWithPasskeyResponse,
|
SigninWithPasskeyResponse,
|
||||||
SigninResponse,
|
SigninResponse,
|
||||||
PartialRolePolicyOverride,
|
PartialRolePolicyOverride,
|
||||||
|
@ -3027,6 +3042,11 @@ type SigninRequest = {
|
||||||
username: string;
|
username: string;
|
||||||
password: string;
|
password: string;
|
||||||
token?: string;
|
token?: string;
|
||||||
|
credential?: AuthenticationResponseJSON;
|
||||||
|
'hcaptcha-response'?: string | null;
|
||||||
|
'g-recaptcha-response'?: string | null;
|
||||||
|
'turnstile-response'?: string | null;
|
||||||
|
'm-captcha-response'?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
|
@ -3035,17 +3055,21 @@ type SigninResponse = {
|
||||||
i: string;
|
i: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// @public (undocumented)
|
||||||
|
type SigninWithPasskeyInitResponse = {
|
||||||
|
option: PublicKeyCredentialRequestOptionsJSON;
|
||||||
|
context: string;
|
||||||
|
};
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type SigninWithPasskeyRequest = {
|
type SigninWithPasskeyRequest = {
|
||||||
credential?: object;
|
credential?: AuthenticationResponseJSON;
|
||||||
context?: string;
|
context?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type SigninWithPasskeyResponse = {
|
type SigninWithPasskeyResponse = {
|
||||||
option?: object;
|
signinResponse: SigninResponse;
|
||||||
context?: string;
|
|
||||||
signinResponse?: SigninResponse;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
|
@ -3069,6 +3093,7 @@ type SignupRequest = {
|
||||||
'hcaptcha-response'?: string | null;
|
'hcaptcha-response'?: string | null;
|
||||||
'g-recaptcha-response'?: string | null;
|
'g-recaptcha-response'?: string | null;
|
||||||
'turnstile-response'?: string | null;
|
'turnstile-response'?: string | null;
|
||||||
|
'm-captcha-response'?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
|
@ -3346,7 +3371,7 @@ type UsersUpdateMemoRequest = operations['users___update-memo']['requestBody']['
|
||||||
|
|
||||||
// Warnings were encountered during analysis:
|
// Warnings were encountered during analysis:
|
||||||
//
|
//
|
||||||
// src/entities.ts:49:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
|
// src/entities.ts:50:2 - (ae-forgotten-export) The symbol "ModerationLogPayloads" needs to be exported by the entry point index.d.ts
|
||||||
// src/streaming.types.ts:220:4 - (ae-forgotten-export) The symbol "ReversiUpdateKey" needs to be exported by the entry point index.d.ts
|
// src/streaming.types.ts:220:4 - (ae-forgotten-export) The symbol "ReversiUpdateKey" needs to be exported by the entry point index.d.ts
|
||||||
// src/streaming.types.ts:230:4 - (ae-forgotten-export) The symbol "ReversiUpdateSettings" needs to be exported by the entry point index.d.ts
|
// src/streaming.types.ts:230:4 - (ae-forgotten-export) The symbol "ReversiUpdateSettings" needs to be exported by the entry point index.d.ts
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"name": "misskey-js",
|
"name": "misskey-js",
|
||||||
"version": "2024.9.0",
|
"version": "2024.10.0-alpha.0",
|
||||||
"description": "Misskey SDK for JavaScript",
|
"description": "Misskey SDK for JavaScript",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
|
@ -57,6 +57,7 @@
|
||||||
"built"
|
"built"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@simplewebauthn/types": "10.0.0",
|
||||||
"eventemitter3": "5.0.1",
|
"eventemitter3": "5.0.1",
|
||||||
"reconnecting-websocket": "4.4.0"
|
"reconnecting-websocket": "4.4.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import {
|
||||||
PartialRolePolicyOverride,
|
PartialRolePolicyOverride,
|
||||||
SigninRequest,
|
SigninRequest,
|
||||||
SigninResponse,
|
SigninResponse,
|
||||||
|
SigninWithPasskeyInitResponse,
|
||||||
SigninWithPasskeyRequest,
|
SigninWithPasskeyRequest,
|
||||||
SigninWithPasskeyResponse,
|
SigninWithPasskeyResponse,
|
||||||
SignupPendingRequest,
|
SignupPendingRequest,
|
||||||
|
@ -86,8 +87,20 @@ export type Endpoints = Overwrite<
|
||||||
},
|
},
|
||||||
'signin-with-passkey': {
|
'signin-with-passkey': {
|
||||||
req: SigninWithPasskeyRequest;
|
req: SigninWithPasskeyRequest;
|
||||||
res: SigninWithPasskeyResponse;
|
res: {
|
||||||
}
|
$switch: {
|
||||||
|
$cases: [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
context: string;
|
||||||
|
},
|
||||||
|
SigninWithPasskeyResponse,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$default: SigninWithPasskeyInitResponse;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
'admin/roles/create': {
|
'admin/roles/create': {
|
||||||
req: Overwrite<AdminRolesCreateRequest, { policies: PartialRolePolicyOverride }>;
|
req: Overwrite<AdminRolesCreateRequest, { policies: PartialRolePolicyOverride }>;
|
||||||
res: AdminRolesCreateResponse;
|
res: AdminRolesCreateResponse;
|
||||||
|
|
|
@ -4288,7 +4288,14 @@ export type components = {
|
||||||
exportedEntity: 'antenna' | 'blocking' | 'clip' | 'customEmoji' | 'favorite' | 'following' | 'muting' | 'note' | 'userList';
|
exportedEntity: 'antenna' | 'blocking' | 'clip' | 'customEmoji' | 'favorite' | 'following' | 'muting' | 'note' | 'userList';
|
||||||
/** Format: id */
|
/** Format: id */
|
||||||
fileId: string;
|
fileId: string;
|
||||||
}) | ({
|
}) | {
|
||||||
|
/** Format: id */
|
||||||
|
id: string;
|
||||||
|
/** Format: date-time */
|
||||||
|
createdAt: string;
|
||||||
|
/** @enum {string} */
|
||||||
|
type: 'login';
|
||||||
|
} | ({
|
||||||
/** Format: id */
|
/** Format: id */
|
||||||
id: string;
|
id: string;
|
||||||
/** Format: date-time */
|
/** Format: date-time */
|
||||||
|
@ -5604,6 +5611,7 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
username: string;
|
username: string;
|
||||||
password: string;
|
password: string;
|
||||||
|
initialPassword?: string | null;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -18550,8 +18558,8 @@ export type operations = {
|
||||||
untilId?: string;
|
untilId?: string;
|
||||||
/** @default true */
|
/** @default true */
|
||||||
markAsRead?: boolean;
|
markAsRead?: boolean;
|
||||||
includeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'app' | 'test' | 'pollVote' | 'groupInvited')[];
|
includeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'login' | 'app' | 'test' | 'pollVote' | 'groupInvited')[];
|
||||||
excludeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'app' | 'test' | 'pollVote' | 'groupInvited')[];
|
excludeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'login' | 'app' | 'test' | 'pollVote' | 'groupInvited')[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -18618,8 +18626,8 @@ export type operations = {
|
||||||
untilId?: string;
|
untilId?: string;
|
||||||
/** @default true */
|
/** @default true */
|
||||||
markAsRead?: boolean;
|
markAsRead?: boolean;
|
||||||
includeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped' | 'pollVote' | 'groupInvited')[];
|
includeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'login' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped' | 'pollVote' | 'groupInvited')[];
|
||||||
excludeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped' | 'pollVote' | 'groupInvited')[];
|
excludeTypes?: ('note' | 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollEnded' | 'receiveFollowRequest' | 'followRequestAccepted' | 'roleAssigned' | 'achievementEarned' | 'exportCompleted' | 'login' | 'app' | 'test' | 'reaction:grouped' | 'renote:grouped' | 'pollVote' | 'groupInvited')[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,6 +10,7 @@ import {
|
||||||
User,
|
User,
|
||||||
UserDetailedNotMe,
|
UserDetailedNotMe,
|
||||||
} from './autogen/models.js';
|
} from './autogen/models.js';
|
||||||
|
import type { AuthenticationResponseJSON, PublicKeyCredentialRequestOptionsJSON } from '@simplewebauthn/types';
|
||||||
|
|
||||||
export * from './autogen/entities.js';
|
export * from './autogen/entities.js';
|
||||||
export * from './autogen/models.js';
|
export * from './autogen/models.js';
|
||||||
|
@ -250,6 +251,7 @@ export type SignupRequest = {
|
||||||
'hcaptcha-response'?: string | null;
|
'hcaptcha-response'?: string | null;
|
||||||
'g-recaptcha-response'?: string | null;
|
'g-recaptcha-response'?: string | null;
|
||||||
'turnstile-response'?: string | null;
|
'turnstile-response'?: string | null;
|
||||||
|
'm-captcha-response'?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SignupResponse = MeDetailed & {
|
export type SignupResponse = MeDetailed & {
|
||||||
|
@ -269,17 +271,25 @@ export type SigninRequest = {
|
||||||
username: string;
|
username: string;
|
||||||
password: string;
|
password: string;
|
||||||
token?: string;
|
token?: string;
|
||||||
|
credential?: AuthenticationResponseJSON;
|
||||||
|
'hcaptcha-response'?: string | null;
|
||||||
|
'g-recaptcha-response'?: string | null;
|
||||||
|
'turnstile-response'?: string | null;
|
||||||
|
'm-captcha-response'?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SigninWithPasskeyRequest = {
|
export type SigninWithPasskeyRequest = {
|
||||||
credential?: object;
|
credential?: AuthenticationResponseJSON;
|
||||||
context?: string;
|
context?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type SigninWithPasskeyInitResponse = {
|
||||||
|
option: PublicKeyCredentialRequestOptionsJSON;
|
||||||
|
context: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type SigninWithPasskeyResponse = {
|
export type SigninWithPasskeyResponse = {
|
||||||
option?: object;
|
signinResponse: SigninResponse;
|
||||||
context?: string;
|
|
||||||
signinResponse?: SigninResponse;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SigninResponse = {
|
export type SigninResponse = {
|
||||||
|
|
|
@ -210,6 +210,12 @@ async function composeNotification(data: PushNotificationDataMap[keyof PushNotif
|
||||||
tag: `achievement:${data.body.achievement}`,
|
tag: `achievement:${data.body.achievement}`,
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
case 'login':
|
||||||
|
return [i18n.ts._notification.login, {
|
||||||
|
badge: iconUrl('login-2'),
|
||||||
|
data,
|
||||||
|
}];
|
||||||
|
|
||||||
case 'exportCompleted': {
|
case 'exportCompleted': {
|
||||||
const entityName = {
|
const entityName = {
|
||||||
antenna: i18n.ts.antennas,
|
antenna: i18n.ts.antennas,
|
||||||
|
|
|
@ -50,4 +50,5 @@ export type BadgeNames =
|
||||||
| 'quote'
|
| 'quote'
|
||||||
| 'repeat'
|
| 'repeat'
|
||||||
| 'user-plus'
|
| 'user-plus'
|
||||||
| 'users';
|
| 'users'
|
||||||
|
| 'login-2';
|
||||||
|
|
663
pnpm-lock.yaml
663
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue