Merge branch 'develop' into refine-moderation-log

This commit is contained in:
syuilo 2023-06-02 14:56:40 +09:00
commit bcacebc89f
15 changed files with 717 additions and 454 deletions

View file

@ -1060,6 +1060,8 @@ cancelReactionConfirm: "Möchtest du deine Reaktion wirklich löschen?"
changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?" changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?"
later: "Später" later: "Später"
goToMisskey: "Zu Misskey" goToMisskey: "Zu Misskey"
additionalEmojiDictionary: "Zusätzliche Emoji-Wörterbücher"
installed: "Installiert"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "Dein Konto wurde erfolgreich erstellt!" accountCreated: "Dein Konto wurde erfolgreich erstellt!"
letsStartAccountSetup: "Lass uns nun dein Konto einrichten." letsStartAccountSetup: "Lass uns nun dein Konto einrichten."

View file

@ -1060,6 +1060,8 @@ cancelReactionConfirm: "Really delete your reaction?"
changeReactionConfirm: "Really change your reaction?" changeReactionConfirm: "Really change your reaction?"
later: "Later" later: "Later"
goToMisskey: "To Misskey" goToMisskey: "To Misskey"
additionalEmojiDictionary: "Additional emoji dictionaries"
installed: "Installed"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "Your account was successfully created!" accountCreated: "Your account was successfully created!"
letsStartAccountSetup: "For starters, let's set up your profile." letsStartAccountSetup: "For starters, let's set up your profile."

View file

@ -1060,6 +1060,8 @@ cancelReactionConfirm: "리액션을 취소하시겠습니까?"
changeReactionConfirm: "리액션을 변경하시겠습니까?" changeReactionConfirm: "리액션을 변경하시겠습니까?"
later: "나중에" later: "나중에"
goToMisskey: "Misskey로" goToMisskey: "Misskey로"
additionalEmojiDictionary: "이모지 추가 사전"
installed: "설치됨"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "계정 생성이 완료되었습니다!" accountCreated: "계정 생성이 완료되었습니다!"
letsStartAccountSetup: "계정의 초기 설정을 진행합니다." letsStartAccountSetup: "계정의 초기 설정을 진행합니다."
@ -1080,12 +1082,12 @@ _serverRules:
_accountMigration: _accountMigration:
moveFrom: "다른 계정에서 이 계정으로 이사" moveFrom: "다른 계정에서 이 계정으로 이사"
moveFromSub: "다른 계정에 대한 별칭을 생성" moveFromSub: "다른 계정에 대한 별칭을 생성"
moveFromLabel: "기존 계정 #{n}" moveFromLabel: "기존 계정 #{n}"
moveFromDescription: "다른 계정에서 이 계정으로 팔로워를 가져오려면, 우선 여기에서 별칭을 지정해야 합니다. 반드시 이사하기 전에 지정해야 합니다! 기존 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com" moveFromDescription: "다른 계정에서 이 계정으로 팔로워를 가져오려면, 우선 여기에서 별칭을 지정해야 합니다. 반드시 이사하기 전에 지정해야 합니다! 기존 계정을 다음과 같은 형식으로 입력해 주십시오: @person@instance.com"
moveTo: "이 계정에서 다른 계정으로 이사" moveTo: "이 계정에서 다른 계정으로 이사"
moveToLabel: "이사할 계정:" moveToLabel: "이사할 계정:"
moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다." moveCannotBeUndone: "한 번 이사하면, 두 번 다시 되돌릴 수 없습니다."
moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워의 이전은 자동이지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)" moveAccountDescription: "새 계정으로 이전합니다.\n ・팔로워가 새 계정을 자동으로 팔로우 합니다\n ・이 계정에서 팔로우는 모두 해제됩니다\n ・이 계정으로는 노트 작성 등을 할 수 없게 됩니다\n\n팔로워는 자동으로 이전되지만, 팔로우는 수동으로 진행해야 합니다. 이전하기 전에 이 계정에서 팔로우를 내보내고, 이전 후에는 즉시 이전한 계정에서 가져오기를 진행하십시오.\n리스트・뮤트・차단에 대해서도 마찬가지이므로 수동으로 이전해야 합니다.\n\n(이 설명은 이 서버(Misskey v13.12.0 이후)의 사양입니다. Mastodon 등의 다른 ActivityPub 소프트웨어에서는 작동이 다를 수 있습니다.)"
moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com" moveAccountHowTo: "계정을 이사하려면 우선 이사갈 계정에서 이 계정에 대한 별칭을 지정해야 합니다.\n별칭을 작성한 다음, 이사갈 계정을 다음과 같이 입력하십시오:\n@username@server.example.com"
startMigration: "이사하기" startMigration: "이사하기"
migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오." migrationConfirm: "정말로 이 계정을 {account} 으로 이전하시겠습니까? 한 번 이전한 다음에는 취소할 수 없으며, 두 번 다시 원래 상태로 복구할 수 없습니다.\n이사할 계정에서 계정 별칭을 지정하였는지 다시 한 번 확인하십시오."

View file

@ -25,7 +25,7 @@ otherSettings: "Andre innstillinger"
openInWindow: "Åpne i vindu" openInWindow: "Åpne i vindu"
profile: "Profil" profile: "Profil"
timeline: "Tidslinje" timeline: "Tidslinje"
noAccountDescription: "Denne brukeren har ikke skrevet sin bio ennå." noAccountDescription: "Denne brukeren har ikke skrevet sin biografi ennå."
login: "Logg inn" login: "Logg inn"
loggingIn: "Logget inn" loggingIn: "Logget inn"
logout: "Logg ut" logout: "Logg ut"
@ -81,6 +81,7 @@ pageLoadError: "Kunne ikke hente side."
serverIsDead: "Denne serveren svarer ikke. Vennligst vent en stund og prøv igjen." serverIsDead: "Denne serveren svarer ikke. Vennligst vent en stund og prøv igjen."
enterListName: "Skriv inn et navn på listen" enterListName: "Skriv inn et navn på listen"
privacy: "Personvern" privacy: "Personvern"
defaultNoteVisibility: "Standard synlighet"
follow: "Følg" follow: "Følg"
followRequest: "Følgeforespørsel" followRequest: "Følgeforespørsel"
followRequests: "Følgeforespørsel" followRequests: "Følgeforespørsel"
@ -92,6 +93,8 @@ renoted: "Renotet."
cantRenote: "Dette innlegget kan ikke renotes." cantRenote: "Dette innlegget kan ikke renotes."
cantReRenote: "En Renote kan ikke renotes." cantReRenote: "En Renote kan ikke renotes."
quote: "Sitat" quote: "Sitat"
inChannelRenote: "Renote kun for kanal"
inChannelQuote: "Sitat kun for kanal"
pinnedNote: "Festet Note" pinnedNote: "Festet Note"
pinned: "Fest til profil" pinned: "Fest til profil"
you: "Du" you: "Du"
@ -145,14 +148,18 @@ instances: "Servere"
registeredAt: "Registrerte seg" registeredAt: "Registrerte seg"
latestRequestReceivedAt: "Siste forespørsel mottatt" latestRequestReceivedAt: "Siste forespørsel mottatt"
latestStatus: "Siste status" latestStatus: "Siste status"
charts: "Diagrammer"
perHour: "Per time" perHour: "Per time"
perDay: "Per dag" perDay: "Per dag"
stopActivityDelivery: "Slutt å sende aktiviteter" stopActivityDelivery: "Slutt å sende aktiviteter"
blockThisInstance: "Blokker denne serveren" blockThisInstance: "Blokker denne serveren"
operations: "Operasjoner"
software: "Programvare" software: "Programvare"
version: "Versjon" version: "Versjon"
metadata: "Metadata"
withNFiles: "{n} fil(er)" withNFiles: "{n} fil(er)"
network: "Nettverk" network: "Nettverk"
instanceInfo: "Serverinformasjon"
statistics: "Statistikk" statistics: "Statistikk"
clearQueue: "Tøm kø" clearQueue: "Tøm kø"
clearQueueConfirmTitle: "Er du sikker på at du vil tømme køen?" clearQueueConfirmTitle: "Er du sikker på at du vil tømme køen?"
@ -167,6 +174,8 @@ noteDeleteConfirm: "Er du sikker på at du vil slette denne Noten?"
pinLimitExceeded: "Du kan ikke feste flere." pinLimitExceeded: "Du kan ikke feste flere."
intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto." intro: "Installasjonen av Misskey er ferdig! Vennligst opprett en administratorkonto."
done: "Ferdig" done: "Ferdig"
default: "Standard"
defaultValueIs: "Standard: {value}"
noCustomEmojis: "Det er ingen emoji" noCustomEmojis: "Det er ingen emoji"
noJobs: "Det er ingen jobber" noJobs: "Det er ingen jobber"
blocked: "Blokkert" blocked: "Blokkert"
@ -175,10 +184,13 @@ all: "Alle"
notResponding: "Svarer ikke" notResponding: "Svarer ikke"
changePassword: "Endre passord" changePassword: "Endre passord"
security: "Sikkerhet" security: "Sikkerhet"
retypedNotMatch: "Inngangene stemmer ikke overens."
currentPassword: "Nåværende passord"
newPassword: "Nytt passord" newPassword: "Nytt passord"
newPasswordRetype: "Nytt passord (gjenta)" newPasswordRetype: "Nytt passord (gjenta)"
attachFile: "Legg ved filer" attachFile: "Legg ved filer"
more: "Mer!" more: "Mer!"
noSuchUser: "Bruker ikke funnet"
announcements: "Kunngjøringer" announcements: "Kunngjøringer"
remove: "Slett" remove: "Slett"
removed: "Vellykket slettet" removed: "Vellykket slettet"
@ -188,9 +200,15 @@ saved: "Lagret"
upload: "Laste opp" upload: "Laste opp"
keepOriginalUploading: "Behold originalbildet" keepOriginalUploading: "Behold originalbildet"
fromUrl: "Fra URL" fromUrl: "Fra URL"
uploadFromUrl: "Last opp fra en URL"
uploadFromUrlDescription: "URL til filen du vil laste opp"
explore: "Utforsk" explore: "Utforsk"
messageRead: "Lest" messageRead: "Lest"
agree: "Jeg godtar" nUsersRead: "lest av {n}"
agreeTo: "Jeg godtar {0}"
agree: "Godta"
agreeBelow: "Jeg godtar følgende"
basicNotesBeforeCreateAccount: "Viktige merknader"
termsOfService: "Vilkår for bruk" termsOfService: "Vilkår for bruk"
home: "Hjem" home: "Hjem"
activity: "Aktivitet" activity: "Aktivitet"
@ -198,8 +216,12 @@ images: "Bilder"
image: "Bilde" image: "Bilde"
birthday: "Bursdag" birthday: "Bursdag"
yearsOld: "{age} år gammel" yearsOld: "{age} år gammel"
theme: "Temaer"
light: "Lys" light: "Lys"
dark: "Mørk" dark: "Mørk"
lightThemes: "Lyse temaer"
darkThemes: "Mørke temaer"
syncDeviceDarkMode: "Synkroniser mørkmodus med enhetens innstillinger"
fileName: "Filnavn" fileName: "Filnavn"
selectFile: "Velg en fil" selectFile: "Velg en fil"
selectFiles: "Velg filer" selectFiles: "Velg filer"
@ -213,6 +235,9 @@ deleteFolder: "Slett denne mappen"
addFile: "Legg til en fil" addFile: "Legg til en fil"
emptyFolder: "Denne mappen er tom" emptyFolder: "Denne mappen er tom"
unableToDelete: "Kan ikke slette" unableToDelete: "Kan ikke slette"
inputNewFileName: "Skriv inn et nytt filnavn"
inputNewDescription: "Skriv inn ny bildetekst"
inputNewFolderName: "Skriv inn et nytt mappenavn"
circularReferenceFolder: "Målmappen er en undermappe til mappen du ønsker å flytte." circularReferenceFolder: "Målmappen er en undermappe til mappen du ønsker å flytte."
hasChildFilesOrFolders: "Siden denne mappen ikke er tom, kan den ikke slettes." hasChildFilesOrFolders: "Siden denne mappen ikke er tom, kan den ikke slettes."
copyUrl: "Kopier URL" copyUrl: "Kopier URL"
@ -251,13 +276,23 @@ turnstile: "Turnstile"
enableTurnstile: "Aktiver Turnstile" enableTurnstile: "Aktiver Turnstile"
antennas: "Antenner" antennas: "Antenner"
name: "Navn" name: "Navn"
antennaSource: "Antennekilde"
notifyAntenna: "Varsle om nye Notes"
withFileAntenna: "Bare Notes med filer"
notesAndReplies: "Notes og svar"
popularUsers: "Populære brukere" popularUsers: "Populære brukere"
exploreUsersCount: "Det finnes {count} brukere" exploreUsersCount: "Det finnes {count} brukere"
exploreFediverse: "Utforsk Fediverse"
userList: "Lister" userList: "Lister"
about: "Infomasjon" about: "Informasjon"
aboutMisskey: "Om Misskey" aboutMisskey: "Om Misskey"
newPasswordIs: "Det nye passordet er \"{password}\"."
share: "Del" share: "Del"
notFound: "Ikke funnet"
markAsReadAllNotifications: "Merk alle varsler som lest"
markAsReadAllUnreadNotes: "Merk alle Notes som lest"
help: "Hjelp" help: "Hjelp"
inputMessageHere: "Skriv inn melding her"
close: "Lukk" close: "Lukk"
invites: "Inviter" invites: "Inviter"
members: "Medlemmer" members: "Medlemmer"
@ -265,6 +300,10 @@ title: "Tittel"
text: "Tekst" text: "Tekst"
next: "Neste" next: "Neste"
retype: "Gjenta" retype: "Gjenta"
quoteAttached: "Sitat"
noMessagesYet: "Ingen meldinger ennå"
newMessageExists: "Det er nye meldinger"
onlyOneFileCanBeAttached: "Du kan bare legge ved én fil i en melding"
invitations: "Inviter" invitations: "Inviter"
available: "Tilgjengelig" available: "Tilgjengelig"
unavailable: "Utilgjengelig" unavailable: "Utilgjengelig"
@ -564,6 +603,7 @@ _time:
day: "Dager" day: "Dager"
_timelineTutorial: _timelineTutorial:
title: "Hvordan bruke Misskey" title: "Hvordan bruke Misskey"
step2_2: "Hva med å skrive en selvpresentasjon, eller bare \"Hei {name}!\" hvis du ikke har lyst?"
_2fa: _2fa:
renewTOTPCancel: "Avbryt" renewTOTPCancel: "Avbryt"
_weekday: _weekday:
@ -576,6 +616,7 @@ _weekday:
saturday: "Lørdag" saturday: "Lørdag"
_widgets: _widgets:
profile: "Profil" profile: "Profil"
instanceInfo: "Serverinformasjon"
notifications: "Varsler" notifications: "Varsler"
timeline: "Tidslinje" timeline: "Tidslinje"
calendar: "Kalender" calendar: "Kalender"
@ -611,6 +652,7 @@ _postForm:
_profile: _profile:
name: "Navn" name: "Navn"
username: "Brukernavn" username: "Brukernavn"
description: "Biografi"
metadataContent: "Innhold" metadataContent: "Innhold"
_exportOrImport: _exportOrImport:
followingList: "Følg" followingList: "Følg"
@ -652,12 +694,14 @@ _pages:
button: "Knapp" button: "Knapp"
_notification: _notification:
youWereFollowed: "fulgte deg" youWereFollowed: "fulgte deg"
unreadAntennaNote: "Antenne {name}"
achievementEarned: "Prestasjon låst opp"
_types: _types:
follow: "Følg" follow: "Nye følgere"
reply: "Svar" reply: "Svar"
renote: "Renote" renote: "Renotes"
quote: "Sitat" quote: "Sitater"
reaction: "Reaksjon" reaction: "Reaksjoner"
_actions: _actions:
reply: "Svar" reply: "Svar"
renote: "Renote" renote: "Renote"

View file

@ -1060,6 +1060,7 @@ cancelReactionConfirm: "要取消回应吗?"
changeReactionConfirm: "要更改回应吗?" changeReactionConfirm: "要更改回应吗?"
later: "一会再说" later: "一会再说"
goToMisskey: "去往Misskey" goToMisskey: "去往Misskey"
installed: "已安装"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "账户创建完成了!" accountCreated: "账户创建完成了!"
letsStartAccountSetup: "来进行帐户的初始设置吧。" letsStartAccountSetup: "来进行帐户的初始设置吧。"

View file

@ -51,16 +51,16 @@
"gulp-replace": "1.1.4", "gulp-replace": "1.1.4",
"gulp-terser": "2.1.0", "gulp-terser": "2.1.0",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"typescript": "5.0.4" "typescript": "5.1.3"
}, },
"devDependencies": { "devDependencies": {
"@types/gulp": "4.0.10", "@types/gulp": "4.0.10",
"@types/gulp-rename": "2.0.1", "@types/gulp-rename": "2.0.1",
"@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/eslint-plugin": "5.59.8",
"@typescript-eslint/parser": "5.59.5", "@typescript-eslint/parser": "5.59.8",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "12.13.0", "cypress": "12.13.0",
"eslint": "8.40.0", "eslint": "8.41.0",
"start-server-and-test": "2.0.0" "start-server-and-test": "2.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {

View file

@ -60,27 +60,27 @@
"@discordapp/twemoji": "14.1.2", "@discordapp/twemoji": "14.1.2",
"@fastify/accepts": "4.1.0", "@fastify/accepts": "4.1.0",
"@fastify/cookie": "8.3.0", "@fastify/cookie": "8.3.0",
"@fastify/cors": "8.2.1", "@fastify/cors": "8.3.0",
"@fastify/http-proxy": "9.1.0", "@fastify/http-proxy": "9.1.0",
"@fastify/multipart": "7.6.0", "@fastify/multipart": "7.6.0",
"@fastify/static": "6.10.1", "@fastify/static": "6.10.2",
"@fastify/view": "7.4.1", "@fastify/view": "7.4.1",
"@nestjs/common": "9.4.2", "@nestjs/common": "9.4.2",
"@nestjs/core": "9.4.2", "@nestjs/core": "9.4.2",
"@nestjs/testing": "9.4.2", "@nestjs/testing": "9.4.2",
"@peertube/http-signature": "1.7.0", "@peertube/http-signature": "1.7.0",
"@sinonjs/fake-timers": "10.0.2", "@sinonjs/fake-timers": "10.2.0",
"@swc/cli": "0.1.62", "@swc/cli": "0.1.62",
"@swc/core": "1.3.59", "@swc/core": "1.3.61",
"accepts": "1.3.8", "accepts": "1.3.8",
"ajv": "8.12.0", "ajv": "8.12.0",
"archiver": "5.3.1", "archiver": "5.3.1",
"autwh": "0.1.0", "autwh": "0.1.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "2.0.5", "blurhash": "2.0.5",
"bullmq": "3.14.1", "bullmq": "3.15.0",
"cacheable-lookup": "6.1.0", "cacheable-lookup": "6.1.0",
"cbor": "8.1.0", "cbor": "9.0.0",
"chalk": "5.2.0", "chalk": "5.2.0",
"chalk-template": "0.4.0", "chalk-template": "0.4.0",
"chokidar": "3.5.3", "chokidar": "3.5.3",
@ -96,24 +96,24 @@
"fluent-ffmpeg": "2.1.2", "fluent-ffmpeg": "2.1.2",
"form-data": "4.0.0", "form-data": "4.0.0",
"got": "12.6.0", "got": "12.6.0",
"happy-dom": "9.19.2", "happy-dom": "9.20.3",
"hpagent": "1.2.0", "hpagent": "1.2.0",
"ioredis": "5.3.2", "ioredis": "5.3.2",
"ip-cidr": "3.1.0", "ip-cidr": "3.1.0",
"is-svg": "4.3.2", "is-svg": "4.3.2",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "21.1.1", "jsdom": "22.1.0",
"json5": "2.2.3", "json5": "2.2.3",
"jsonld": "8.1.1", "jsonld": "8.2.0",
"jsrsasign": "10.8.6", "jsrsasign": "10.8.6",
"meilisearch": "0.32.4", "meilisearch": "0.32.5",
"mfm-js": "0.23.3", "mfm-js": "0.23.3",
"mime-types": "2.1.35", "mime-types": "2.1.35",
"misskey-js": "workspace:*", "misskey-js": "workspace:*",
"ms": "3.0.0-canary.1", "ms": "3.0.0-canary.1",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "3.3.1", "node-fetch": "3.3.1",
"nodemailer": "6.9.2", "nodemailer": "6.9.3",
"nsfwjs": "2.4.2", "nsfwjs": "2.4.2",
"oauth": "0.10.0", "oauth": "0.10.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
@ -129,7 +129,7 @@
"qrcode": "1.5.3", "qrcode": "1.5.3",
"random-seed": "0.3.0", "random-seed": "0.3.0",
"ratelimiter": "3.4.1", "ratelimiter": "3.4.1",
"re2": "1.18.0", "re2": "1.19.0",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"rename": "1.0.4", "rename": "1.0.4",
@ -146,16 +146,16 @@
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"summaly": "github:misskey-dev/summaly", "summaly": "github:misskey-dev/summaly",
"systeminformation": "5.17.12", "systeminformation": "5.17.16",
"tinycolor2": "1.6.0", "tinycolor2": "1.6.0",
"tmp": "0.2.1", "tmp": "0.2.1",
"tsc-alias": "1.8.6", "tsc-alias": "1.8.6",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"twemoji-parser": "14.0.0", "twemoji-parser": "14.0.0",
"typeorm": "0.3.16", "typeorm": "0.3.16",
"typescript": "5.0.4", "typescript": "5.1.3",
"ulid": "2.3.0", "ulid": "2.3.0",
"unzipper": "0.10.11", "unzipper": "0.10.14",
"uuid": "9.0.0", "uuid": "9.0.0",
"vary": "1.1.2", "vary": "1.1.2",
"web-push": "3.6.1", "web-push": "3.6.1",
@ -173,13 +173,13 @@
"@types/content-disposition": "0.5.5", "@types/content-disposition": "0.5.5",
"@types/escape-regexp": "0.0.1", "@types/escape-regexp": "0.0.1",
"@types/fluent-ffmpeg": "2.1.21", "@types/fluent-ffmpeg": "2.1.21",
"@types/jest": "29.5.1", "@types/jest": "29.5.2",
"@types/js-yaml": "4.0.5", "@types/js-yaml": "4.0.5",
"@types/jsdom": "21.1.1", "@types/jsdom": "21.1.1",
"@types/jsonld": "1.5.8", "@types/jsonld": "1.5.8",
"@types/jsrsasign": "10.5.8", "@types/jsrsasign": "10.5.8",
"@types/mime-types": "2.1.1", "@types/mime-types": "2.1.1",
"@types/node": "20.2.3", "@types/node": "20.2.5",
"@types/node-fetch": "3.0.3", "@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.8", "@types/nodemailer": "6.4.8",
"@types/oauth": "0.9.1", "@types/oauth": "0.9.1",
@ -203,11 +203,11 @@
"@types/web-push": "3.3.2", "@types/web-push": "3.3.2",
"@types/websocket": "1.0.5", "@types/websocket": "1.0.5",
"@types/ws": "8.5.4", "@types/ws": "8.5.4",
"@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/eslint-plugin": "5.59.8",
"@typescript-eslint/parser": "5.59.5", "@typescript-eslint/parser": "5.59.8",
"aws-sdk-client-mock": "2.1.1", "aws-sdk-client-mock": "2.1.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"eslint": "8.40.0", "eslint": "8.41.0",
"eslint-plugin-import": "2.27.5", "eslint-plugin-import": "2.27.5",
"execa": "6.1.0", "execa": "6.1.0",
"jest": "29.5.0", "jest": "29.5.0",

View file

@ -19,6 +19,8 @@ import type * as http from 'node:http';
@Injectable() @Injectable()
export class StreamingApiServerService { export class StreamingApiServerService {
#wss: WebSocket.WebSocketServer; #wss: WebSocket.WebSocketServer;
#connections = new Map<WebSocket.WebSocket, number>();
#cleanConnectionsIntervalId: NodeJS.Timeout | null = null;
constructor( constructor(
@Inject(DI.config) @Inject(DI.config)
@ -109,7 +111,9 @@ export class StreamingApiServerService {
await stream.listen(ev, connection); await stream.listen(ev, connection);
const intervalId = user ? setInterval(() => { this.#connections.set(connection, Date.now());
const userUpdateIntervalId = user ? setInterval(() => {
this.usersRepository.update(user.id, { this.usersRepository.update(user.id, {
lastActiveDate: new Date(), lastActiveDate: new Date(),
}); });
@ -124,19 +128,34 @@ export class StreamingApiServerService {
ev.removeAllListeners(); ev.removeAllListeners();
stream.dispose(); stream.dispose();
this.redisForSub.off('message', onRedisMessage); this.redisForSub.off('message', onRedisMessage);
if (intervalId) clearInterval(intervalId); if (userUpdateIntervalId) clearInterval(userUpdateIntervalId);
}); });
connection.on('message', async (data) => { connection.on('message', async (data) => {
this.#connections.set(connection, Date.now());
if (data.toString() === 'ping') { if (data.toString() === 'ping') {
connection.send('pong'); connection.send('pong');
} }
}); });
}); });
this.#cleanConnectionsIntervalId = setInterval(() => {
const now = Date.now();
for (const [connection, lastActive] of this.#connections.entries()) {
if (now - lastActive > 1000 * 60 * 5) {
connection.terminate();
this.#connections.delete(connection);
}
}
}, 1000 * 60 * 5);
} }
@bindThis @bindThis
public detach(): Promise<void> { public detach(): Promise<void> {
if (this.#cleanConnectionsIntervalId) {
clearInterval(this.#cleanConnectionsIntervalId);
this.#cleanConnectionsIntervalId = null;
}
return new Promise((resolve) => { return new Promise((resolve) => {
this.#wss.close(() => resolve()); this.#wss.close(() => resolve());
}); });

View file

@ -1,6 +1,6 @@
import { promisify } from 'node:util'; import { promisify } from 'node:util';
import bcrypt from 'bcryptjs'; import bcrypt from 'bcryptjs';
import * as cbor from 'cbor'; import cbor from 'cbor';
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js'; import { Endpoint } from '@/server/api/endpoint-base.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js';

View file

@ -35,7 +35,7 @@ html
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg') link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
//- https://github.com/misskey-dev/misskey/issues/9842 //- https://github.com/misskey-dev/misskey/issues/9842
link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.17.0') link(rel='stylesheet' href='/assets/tabler-icons/tabler-icons.min.css?v2.21.0')
link(rel='modulepreload' href=`/vite/${clientEntry.file}`) link(rel='modulepreload' href=`/vite/${clientEntry.file}`)
if !config.clientManifestExists if !config.clientManifestExists

View file

@ -1,6 +1,6 @@
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true" as="image" type="image/png" crossorigin="anonymous"> <link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true" as="image" type="image/png" crossorigin="anonymous">
<link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true" as="image" type="image/jpeg" crossorigin="anonymous"> <link rel="preload" href="https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true" as="image" type="image/jpeg" crossorigin="anonymous">
<link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.12.0/tabler-icons.min.css"> <link rel="stylesheet" href="https://unpkg.com/@tabler/icons-webfont@2.21.0/tabler-icons.min.css">
<link rel="stylesheet" href="https://unpkg.com/@fontsource/m-plus-rounded-1c/index.css"> <link rel="stylesheet" href="https://unpkg.com/@fontsource/m-plus-rounded-1c/index.css">
<style> <style>
html { html {

View file

@ -20,13 +20,13 @@
"@rollup/plugin-replace": "5.0.2", "@rollup/plugin-replace": "5.0.2",
"@rollup/pluginutils": "5.0.2", "@rollup/pluginutils": "5.0.2",
"@syuilo/aiscript": "0.13.3", "@syuilo/aiscript": "0.13.3",
"@tabler/icons-webfont": "2.17.0", "@tabler/icons-webfont": "2.21.0",
"@vitejs/plugin-vue": "4.2.3", "@vitejs/plugin-vue": "4.2.3",
"@vue-macros/reactivity-transform": "0.3.8", "@vue-macros/reactivity-transform": "0.3.9",
"@vue/compiler-sfc": "3.3.4", "@vue/compiler-sfc": "3.3.4",
"astring": "1.8.5", "astring": "1.8.6",
"autosize": "6.0.1", "autosize": "6.0.1",
"broadcast-channel": "4.20.2", "broadcast-channel": "5.1.0",
"browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
"buraha": "github:misskey-dev/buraha", "buraha": "github:misskey-dev/buraha",
"canvas-confetti": "1.6.0", "canvas-confetti": "1.6.0",
@ -35,7 +35,7 @@
"chartjs-chart-matrix": "2.0.1", "chartjs-chart-matrix": "2.0.1",
"chartjs-plugin-gradient": "0.6.1", "chartjs-plugin-gradient": "0.6.1",
"chartjs-plugin-zoom": "2.0.1", "chartjs-plugin-zoom": "2.0.1",
"chromatic": "6.17.4", "chromatic": "6.18.0",
"compare-versions": "5.0.3", "compare-versions": "5.0.3",
"cropperjs": "2.0.0-beta.2", "cropperjs": "2.0.0-beta.2",
"date-fns": "2.30.0", "date-fns": "2.30.0",
@ -63,13 +63,13 @@
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"three": "0.151.3", "three": "0.153.0",
"throttle-debounce": "5.0.0", "throttle-debounce": "5.0.0",
"tinycolor2": "1.6.0", "tinycolor2": "1.6.0",
"tsc-alias": "1.8.6", "tsc-alias": "1.8.6",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"twemoji-parser": "14.0.0", "twemoji-parser": "14.0.0",
"typescript": "5.0.4", "typescript": "5.1.3",
"uuid": "9.0.0", "uuid": "9.0.0",
"vanilla-tilt": "1.8.0", "vanilla-tilt": "1.8.0",
"vite": "4.3.9", "vite": "4.3.9",
@ -114,19 +114,19 @@
"@types/uuid": "9.0.1", "@types/uuid": "9.0.1",
"@types/websocket": "1.0.5", "@types/websocket": "1.0.5",
"@types/ws": "8.5.4", "@types/ws": "8.5.4",
"@typescript-eslint/eslint-plugin": "5.59.5", "@typescript-eslint/eslint-plugin": "5.59.8",
"@typescript-eslint/parser": "5.59.5", "@typescript-eslint/parser": "5.59.8",
"@vitest/coverage-c8": "0.31.1", "@vitest/coverage-c8": "0.31.4",
"@vue/runtime-core": "3.3.4", "@vue/runtime-core": "3.3.4",
"acorn": "^8.8.2", "acorn": "^8.8.2",
"chokidar-cli": "3.0.0", "chokidar-cli": "3.0.0",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "12.13.0", "cypress": "12.13.0",
"eslint": "8.40.0", "eslint": "8.41.0",
"eslint-plugin-import": "2.27.5", "eslint-plugin-import": "2.27.5",
"eslint-plugin-vue": "9.14.1", "eslint-plugin-vue": "9.14.1",
"fast-glob": "3.2.12", "fast-glob": "3.2.12",
"happy-dom": "9.19.2", "happy-dom": "9.20.3",
"micromatch": "3.1.10", "micromatch": "3.1.10",
"msw": "1.2.1", "msw": "1.2.1",
"msw-storybook-addon": "1.8.0", "msw-storybook-addon": "1.8.0",
@ -138,7 +138,7 @@
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
"summaly": "github:misskey-dev/summaly", "summaly": "github:misskey-dev/summaly",
"vite-plugin-turbosnap": "1.0.2", "vite-plugin-turbosnap": "1.0.2",
"vitest": "0.31.1", "vitest": "0.31.4",
"vitest-fetch-mock": "0.2.2", "vitest-fetch-mock": "0.2.2",
"vue-eslint-parser": "9.3.0", "vue-eslint-parser": "9.3.0",
"vue-tsc": "1.6.5" "vue-tsc": "1.6.5"

View file

@ -32,7 +32,7 @@
<div v-if="image.comment" :class="$style.indicator">ALT</div> <div v-if="image.comment" :class="$style.indicator">ALT</div>
<div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);">NSFW</div> <div v-if="image.isSensitive" :class="$style.indicator" style="color: var(--warn);">NSFW</div>
</div> </div>
<button :class="$style.menu" class="_button" @click.stop="showMenu"><i class="ti ti-dots"></i></button> <button :class="$style.menu" class="_button" @click.stop="showMenu"><i class="ti ti-dots" style="vertical-align: middle;"></i></button>
</template> </template>
</div> </div>
</template> </template>
@ -131,13 +131,14 @@ function showMenu(ev: MouseEvent) {
.menu { .menu {
display: block; display: block;
position: absolute; position: absolute;
border-radius: 6px; border-radius: 999px;
background-color: rgba(0, 0, 0, 0.3); background-color: rgba(0, 0, 0, 0.3);
-webkit-backdrop-filter: var(--blur, blur(15px)); -webkit-backdrop-filter: var(--blur, blur(15px));
backdrop-filter: var(--blur, blur(15px)); backdrop-filter: var(--blur, blur(15px));
color: #fff; color: #fff;
font-size: 0.8em; font-size: 0.8em;
padding: 6px 8px; width: 32px;
height: 32px;
text-align: center; text-align: center;
bottom: 10px; bottom: 10px;
right: 10px; right: 10px;

View file

@ -8,7 +8,7 @@
</div> </div>
<span v-if="$i && $i.id !== user.id && user.isFollowed" :class="$style.followed">{{ i18n.ts.followsYou }}</span> <span v-if="$i && $i.id !== user.id && user.isFollowed" :class="$style.followed">{{ i18n.ts.followsYou }}</span>
<div :class="$style.description"> <div :class="$style.description">
<div v-if="user.description" class="mfm"> <div v-if="user.description" :class="$style.mfm">
<Mfm :text="user.description" :author="user" :i="$i"/> <Mfm :text="user.description" :author="user" :i="$i"/>
</div> </div>
<span v-else style="opacity: 0.7;">{{ i18n.ts.noAccountDescription }}</span> <span v-else style="opacity: 0.7;">{{ i18n.ts.noAccountDescription }}</span>

File diff suppressed because it is too large Load diff