Merge branch 'develop'
This commit is contained in:
		
						commit
						9fd0e90850
					
				
					 21 changed files with 654 additions and 703 deletions
				
			
		| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
v16.2.0
 | 
					v16.6.2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										24
									
								
								CHANGELOG.md
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								CHANGELOG.md
									
										
									
									
									
								
							| 
						 | 
					@ -1,3 +1,25 @@
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					## 12.x.x (unreleased)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Improvements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bugfixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.87.0 (2021/08/12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Improvements
 | 
				
			||||||
 | 
					- 絵文字オートコンプリートで一文字目は最近使った絵文字をサジェストするように
 | 
				
			||||||
 | 
					- 絵文字オートコンプリートのパフォーマンスを改善
 | 
				
			||||||
 | 
					- about-misskeyページにドキュメントへのリンクを追加
 | 
				
			||||||
 | 
					- Docker: Node.jsを16.6.2に
 | 
				
			||||||
 | 
					- 依存関係の更新
 | 
				
			||||||
 | 
					- 翻訳の更新
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Bugfixes
 | 
				
			||||||
 | 
					- Misskey更新時、テーマキャッシュの影響でスタイルがおかしくなる問題を修正
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 12.86.0 (2021/08/11)
 | 
					## 12.86.0 (2021/08/11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Improvements
 | 
					### Improvements
 | 
				
			||||||
| 
						 | 
					@ -9,4 +31,4 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Bugfixes
 | 
					### Bugfixes
 | 
				
			||||||
- ハッシュタグ入力が空のときに#が付くのを修正
 | 
					- ハッシュタグ入力が空のときに#が付くのを修正
 | 
				
			||||||
- フォロー通知のEメール通知を修正
 | 
					- フォローリクエストのEメール通知を修正
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
FROM node:16.2.0-alpine3.13 AS base
 | 
					FROM node:16.6.2-alpine3.13 AS base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV NODE_ENV=production
 | 
					ENV NODE_ENV=production
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -771,6 +771,7 @@ received: "Erhalten"
 | 
				
			||||||
searchResult: "Suchergebnisse"
 | 
					searchResult: "Suchergebnisse"
 | 
				
			||||||
hashtags: "Hashtags"
 | 
					hashtags: "Hashtags"
 | 
				
			||||||
troubleshooting: "Problembehandlung"
 | 
					troubleshooting: "Problembehandlung"
 | 
				
			||||||
 | 
					useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden"
 | 
				
			||||||
_docs:
 | 
					_docs:
 | 
				
			||||||
  continueReading: "Mehr lesen"
 | 
					  continueReading: "Mehr lesen"
 | 
				
			||||||
  features: "Funktionen"
 | 
					  features: "Funktionen"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -249,7 +249,7 @@ agreeTo: "I agree to {0}"
 | 
				
			||||||
tos: "Terms of Service"
 | 
					tos: "Terms of Service"
 | 
				
			||||||
start: "Begin"
 | 
					start: "Begin"
 | 
				
			||||||
home: "Home"
 | 
					home: "Home"
 | 
				
			||||||
remoteUserCaution: "As this user is from a renote instance, the shown information may be incomplete."
 | 
					remoteUserCaution: "As this user is from a remote instance, the shown information may be incomplete."
 | 
				
			||||||
activity: "Activity"
 | 
					activity: "Activity"
 | 
				
			||||||
images: "Images"
 | 
					images: "Images"
 | 
				
			||||||
birthday: "Birthday"
 | 
					birthday: "Birthday"
 | 
				
			||||||
| 
						 | 
					@ -771,6 +771,7 @@ received: "Received"
 | 
				
			||||||
searchResult: "Search results"
 | 
					searchResult: "Search results"
 | 
				
			||||||
hashtags: "Hashtags"
 | 
					hashtags: "Hashtags"
 | 
				
			||||||
troubleshooting: "Troubleshooting"
 | 
					troubleshooting: "Troubleshooting"
 | 
				
			||||||
 | 
					useBlurEffect: "Use blur effects in the UI"
 | 
				
			||||||
_docs:
 | 
					_docs:
 | 
				
			||||||
  continueReading: "Read more"
 | 
					  continueReading: "Read more"
 | 
				
			||||||
  features: "Features"
 | 
					  features: "Features"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -772,6 +772,7 @@ searchResult: "検索結果"
 | 
				
			||||||
hashtags: "ハッシュタグ"
 | 
					hashtags: "ハッシュタグ"
 | 
				
			||||||
troubleshooting: "トラブルシューティング"
 | 
					troubleshooting: "トラブルシューティング"
 | 
				
			||||||
useBlurEffect: "UIにぼかし効果を使用"
 | 
					useBlurEffect: "UIにぼかし効果を使用"
 | 
				
			||||||
 | 
					learnMore: "詳しく"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_docs: 
 | 
					_docs: 
 | 
				
			||||||
  continueReading: "続きを読む"
 | 
					  continueReading: "続きを読む"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -771,12 +771,14 @@ received: "수신"
 | 
				
			||||||
searchResult: "검색 결과"
 | 
					searchResult: "검색 결과"
 | 
				
			||||||
hashtags: "해시태그"
 | 
					hashtags: "해시태그"
 | 
				
			||||||
troubleshooting: "트러블 슈팅"
 | 
					troubleshooting: "트러블 슈팅"
 | 
				
			||||||
 | 
					useBlurEffect: "UI에 흐림 효과 사용"
 | 
				
			||||||
_docs:
 | 
					_docs:
 | 
				
			||||||
  continueReading: "계속 읽기"
 | 
					  continueReading: "계속 읽기"
 | 
				
			||||||
  features: "기능"
 | 
					  features: "기능"
 | 
				
			||||||
  generalTopics: "일반 주제"
 | 
					  generalTopics: "일반 주제"
 | 
				
			||||||
  advancedTopics: "심화 주제"
 | 
					  advancedTopics: "심화 주제"
 | 
				
			||||||
  admin: "관리"
 | 
					  admin: "관리"
 | 
				
			||||||
 | 
					  translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
 | 
				
			||||||
_ad:
 | 
					_ad:
 | 
				
			||||||
  back: "뒤로"
 | 
					  back: "뒤로"
 | 
				
			||||||
  reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
 | 
					  reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -529,6 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков"
 | 
				
			||||||
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
 | 
					removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
 | 
				
			||||||
userSuspended: "Эта учётная запись заморожена"
 | 
					userSuspended: "Эта учётная запись заморожена"
 | 
				
			||||||
userSilenced: "Этот пользователь был заглушен"
 | 
					userSilenced: "Этот пользователь был заглушен"
 | 
				
			||||||
 | 
					menu: "Меню"
 | 
				
			||||||
divider: "Линия-разделитель"
 | 
					divider: "Линия-разделитель"
 | 
				
			||||||
addItem: "Добавить элемент"
 | 
					addItem: "Добавить элемент"
 | 
				
			||||||
rooms: "Комната"
 | 
					rooms: "Комната"
 | 
				
			||||||
| 
						 | 
					@ -761,15 +762,23 @@ middle: "Средне"
 | 
				
			||||||
low: "Низкий"
 | 
					low: "Низкий"
 | 
				
			||||||
emailNotConfiguredWarning: "Не указан адрес электронной почты"
 | 
					emailNotConfiguredWarning: "Не указан адрес электронной почты"
 | 
				
			||||||
ratio: "Соотношение"
 | 
					ratio: "Соотношение"
 | 
				
			||||||
 | 
					customCss: "Индивидуальный CSS"
 | 
				
			||||||
 | 
					customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
 | 
				
			||||||
global: "Всеобщая"
 | 
					global: "Всеобщая"
 | 
				
			||||||
 | 
					squareAvatars: "Квадратные аватарки"
 | 
				
			||||||
sent: "Отправить"
 | 
					sent: "Отправить"
 | 
				
			||||||
 | 
					received: "Получено"
 | 
				
			||||||
 | 
					searchResult: "Результаты поиска"
 | 
				
			||||||
hashtags: "Хэштег"
 | 
					hashtags: "Хэштег"
 | 
				
			||||||
 | 
					troubleshooting: "Разрешение проблем"
 | 
				
			||||||
 | 
					useBlurEffect: "Размытие в интерфейсе"
 | 
				
			||||||
_docs:
 | 
					_docs:
 | 
				
			||||||
  continueReading: "Читать подробнее"
 | 
					  continueReading: "Читать подробнее"
 | 
				
			||||||
  features: "Возможности"
 | 
					  features: "Возможности"
 | 
				
			||||||
  generalTopics: "Основные темы"
 | 
					  generalTopics: "Основные темы"
 | 
				
			||||||
  advancedTopics: "Дополнительные темы"
 | 
					  advancedTopics: "Дополнительные темы"
 | 
				
			||||||
  admin: "Управление"
 | 
					  admin: "Управление"
 | 
				
			||||||
 | 
					  translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала."
 | 
				
			||||||
_ad:
 | 
					_ad:
 | 
				
			||||||
  back: "Выход"
 | 
					  back: "Выход"
 | 
				
			||||||
  reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
 | 
					  reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -771,6 +771,8 @@ received: "收取"
 | 
				
			||||||
searchResult: "搜索结果"
 | 
					searchResult: "搜索结果"
 | 
				
			||||||
hashtags: "话题标签"
 | 
					hashtags: "话题标签"
 | 
				
			||||||
troubleshooting: "故障排除"
 | 
					troubleshooting: "故障排除"
 | 
				
			||||||
 | 
					useBlurEffect: "在UI上使用模糊效果"
 | 
				
			||||||
 | 
					learnMore: "更多信息"
 | 
				
			||||||
_docs:
 | 
					_docs:
 | 
				
			||||||
  continueReading: "继续阅读"
 | 
					  continueReading: "继续阅读"
 | 
				
			||||||
  features: "特性"
 | 
					  features: "特性"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										82
									
								
								package.json
									
										
									
									
									
								
							
							
						
						
									
										82
									
								
								package.json
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	"name": "misskey",
 | 
						"name": "misskey",
 | 
				
			||||||
	"author": "syuilo <syuilotan@yahoo.co.jp>",
 | 
						"author": "syuilo <syuilotan@yahoo.co.jp>",
 | 
				
			||||||
	"version": "12.86.0",
 | 
						"version": "12.87.0",
 | 
				
			||||||
	"codename": "indigo",
 | 
						"codename": "indigo",
 | 
				
			||||||
	"repository": {
 | 
						"repository": {
 | 
				
			||||||
		"type": "git",
 | 
							"type": "git",
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@
 | 
				
			||||||
		"@sinonjs/fake-timers": "7.1.2",
 | 
							"@sinonjs/fake-timers": "7.1.2",
 | 
				
			||||||
		"@syuilo/aiscript": "0.11.1",
 | 
							"@syuilo/aiscript": "0.11.1",
 | 
				
			||||||
		"@types/bcryptjs": "2.4.2",
 | 
							"@types/bcryptjs": "2.4.2",
 | 
				
			||||||
		"@types/bull": "3.15.2",
 | 
							"@types/bull": "3.15.3",
 | 
				
			||||||
		"@types/cbor": "6.0.0",
 | 
							"@types/cbor": "6.0.0",
 | 
				
			||||||
		"@types/dateformat": "3.0.1",
 | 
							"@types/dateformat": "3.0.1",
 | 
				
			||||||
		"@types/escape-regexp": "0.0.0",
 | 
							"@types/escape-regexp": "0.0.0",
 | 
				
			||||||
| 
						 | 
					@ -57,8 +57,8 @@
 | 
				
			||||||
		"@types/jsonld": "1.5.6",
 | 
							"@types/jsonld": "1.5.6",
 | 
				
			||||||
		"@types/katex": "0.11.1",
 | 
							"@types/katex": "0.11.1",
 | 
				
			||||||
		"@types/koa": "2.13.4",
 | 
							"@types/koa": "2.13.4",
 | 
				
			||||||
		"@types/koa-bodyparser": "4.3.2",
 | 
							"@types/koa-bodyparser": "4.3.3",
 | 
				
			||||||
		"@types/koa-cors": "0.0.1",
 | 
							"@types/koa-cors": "0.0.2",
 | 
				
			||||||
		"@types/koa-favicon": "2.0.21",
 | 
							"@types/koa-favicon": "2.0.21",
 | 
				
			||||||
		"@types/koa-logger": "3.1.1",
 | 
							"@types/koa-logger": "3.1.1",
 | 
				
			||||||
		"@types/koa-mount": "4.0.0",
 | 
							"@types/koa-mount": "4.0.0",
 | 
				
			||||||
| 
						 | 
					@ -68,10 +68,10 @@
 | 
				
			||||||
		"@types/koa__multer": "2.0.3",
 | 
							"@types/koa__multer": "2.0.3",
 | 
				
			||||||
		"@types/koa__router": "8.0.7",
 | 
							"@types/koa__router": "8.0.7",
 | 
				
			||||||
		"@types/markdown-it": "12.0.3",
 | 
							"@types/markdown-it": "12.0.3",
 | 
				
			||||||
		"@types/matter-js": "0.17.3",
 | 
							"@types/matter-js": "0.17.5",
 | 
				
			||||||
		"@types/mocha": "8.2.3",
 | 
							"@types/mocha": "8.2.3",
 | 
				
			||||||
		"@types/node": "16.3.3",
 | 
							"@types/node": "16.6.0",
 | 
				
			||||||
		"@types/node-fetch": "2.5.11",
 | 
							"@types/node-fetch": "2.5.12",
 | 
				
			||||||
		"@types/nodemailer": "6.4.4",
 | 
							"@types/nodemailer": "6.4.4",
 | 
				
			||||||
		"@types/nprogress": "0.2.0",
 | 
							"@types/nprogress": "0.2.0",
 | 
				
			||||||
		"@types/oauth": "0.9.1",
 | 
							"@types/oauth": "0.9.1",
 | 
				
			||||||
| 
						 | 
					@ -88,7 +88,7 @@
 | 
				
			||||||
		"@types/request-stats": "3.0.0",
 | 
							"@types/request-stats": "3.0.0",
 | 
				
			||||||
		"@types/rimraf": "3.0.1",
 | 
							"@types/rimraf": "3.0.1",
 | 
				
			||||||
		"@types/seedrandom": "2.4.28",
 | 
							"@types/seedrandom": "2.4.28",
 | 
				
			||||||
		"@types/sharp": "0.28.4",
 | 
							"@types/sharp": "0.28.5",
 | 
				
			||||||
		"@types/sinonjs__fake-timers": "6.0.3",
 | 
							"@types/sinonjs__fake-timers": "6.0.3",
 | 
				
			||||||
		"@types/speakeasy": "2.0.6",
 | 
							"@types/speakeasy": "2.0.6",
 | 
				
			||||||
		"@types/throttle-debounce": "2.1.0",
 | 
							"@types/throttle-debounce": "2.1.0",
 | 
				
			||||||
| 
						 | 
					@ -98,40 +98,40 @@
 | 
				
			||||||
		"@types/web-push": "3.3.2",
 | 
							"@types/web-push": "3.3.2",
 | 
				
			||||||
		"@types/webpack": "5.28.0",
 | 
							"@types/webpack": "5.28.0",
 | 
				
			||||||
		"@types/webpack-stream": "3.2.12",
 | 
							"@types/webpack-stream": "3.2.12",
 | 
				
			||||||
		"@types/websocket": "1.0.3",
 | 
							"@types/websocket": "1.0.4",
 | 
				
			||||||
		"@types/ws": "7.4.6",
 | 
							"@types/ws": "7.4.7",
 | 
				
			||||||
		"@typescript-eslint/parser": "4.28.3",
 | 
							"@typescript-eslint/parser": "4.29.1",
 | 
				
			||||||
		"@vue/compiler-sfc": "3.2.1",
 | 
							"@vue/compiler-sfc": "3.2.2",
 | 
				
			||||||
		"abort-controller": "3.0.0",
 | 
							"abort-controller": "3.0.0",
 | 
				
			||||||
		"apexcharts": "3.27.2",
 | 
							"apexcharts": "3.27.3",
 | 
				
			||||||
		"autobind-decorator": "2.4.0",
 | 
							"autobind-decorator": "2.4.0",
 | 
				
			||||||
		"autosize": "4.0.4",
 | 
							"autosize": "4.0.4",
 | 
				
			||||||
		"autwh": "0.1.0",
 | 
							"autwh": "0.1.0",
 | 
				
			||||||
		"aws-sdk": "2.948.0",
 | 
							"aws-sdk": "2.966.0",
 | 
				
			||||||
		"bcryptjs": "2.4.3",
 | 
							"bcryptjs": "2.4.3",
 | 
				
			||||||
		"blurhash": "1.1.3",
 | 
							"blurhash": "1.1.3",
 | 
				
			||||||
		"broadcast-channel": "3.7.0",
 | 
							"broadcast-channel": "3.7.0",
 | 
				
			||||||
		"bull": "3.26.0",
 | 
							"bull": "3.26.0",
 | 
				
			||||||
		"cafy": "15.2.1",
 | 
							"cafy": "15.2.1",
 | 
				
			||||||
		"cbor": "7.0.6",
 | 
							"cbor": "8.0.0",
 | 
				
			||||||
		"chalk": "4.1.1",
 | 
							"chalk": "4.1.2",
 | 
				
			||||||
		"chart.js": "2.9.4",
 | 
							"chart.js": "2.9.4",
 | 
				
			||||||
		"cli-highlight": "2.1.11",
 | 
							"cli-highlight": "2.1.11",
 | 
				
			||||||
		"commander": "7.2.0",
 | 
							"commander": "7.2.0",
 | 
				
			||||||
		"concurrently": "6.2.0",
 | 
							"concurrently": "6.2.0",
 | 
				
			||||||
		"content-disposition": "0.5.3",
 | 
							"content-disposition": "0.5.3",
 | 
				
			||||||
		"core-js": "3.15.2",
 | 
							"core-js": "3.16.1",
 | 
				
			||||||
		"crc-32": "1.2.0",
 | 
							"crc-32": "1.2.0",
 | 
				
			||||||
		"css-loader": "6.0.0",
 | 
							"css-loader": "6.2.0",
 | 
				
			||||||
		"cssnano": "5.0.6",
 | 
							"cssnano": "5.0.7",
 | 
				
			||||||
		"dateformat": "4.5.1",
 | 
							"dateformat": "4.5.1",
 | 
				
			||||||
		"diskusage": "1.1.3",
 | 
							"diskusage": "1.1.3",
 | 
				
			||||||
		"escape-regexp": "0.0.1",
 | 
							"escape-regexp": "0.0.1",
 | 
				
			||||||
		"eslint": "7.30.0",
 | 
							"eslint": "7.32.0",
 | 
				
			||||||
		"eslint-plugin-vue": "7.13.0",
 | 
							"eslint-plugin-vue": "7.16.0",
 | 
				
			||||||
		"eventemitter3": "4.0.7",
 | 
							"eventemitter3": "4.0.7",
 | 
				
			||||||
		"feed": "4.2.2",
 | 
							"feed": "4.2.2",
 | 
				
			||||||
		"file-type": "16.5.1",
 | 
							"file-type": "16.5.3",
 | 
				
			||||||
		"fluent-ffmpeg": "2.1.2",
 | 
							"fluent-ffmpeg": "2.1.2",
 | 
				
			||||||
		"glob": "7.1.7",
 | 
							"glob": "7.1.7",
 | 
				
			||||||
		"got": "11.8.2",
 | 
							"got": "11.8.2",
 | 
				
			||||||
| 
						 | 
					@ -146,17 +146,17 @@
 | 
				
			||||||
		"http-proxy-agent": "4.0.1",
 | 
							"http-proxy-agent": "4.0.1",
 | 
				
			||||||
		"http-signature": "1.3.5",
 | 
							"http-signature": "1.3.5",
 | 
				
			||||||
		"https-proxy-agent": "5.0.0",
 | 
							"https-proxy-agent": "5.0.0",
 | 
				
			||||||
		"idb-keyval": "5.0.6",
 | 
							"idb-keyval": "5.1.3",
 | 
				
			||||||
		"insert-text-at-cursor": "0.3.0",
 | 
							"insert-text-at-cursor": "0.3.0",
 | 
				
			||||||
		"is-root": "2.1.0",
 | 
							"is-root": "2.1.0",
 | 
				
			||||||
		"is-svg": "4.3.1",
 | 
							"is-svg": "4.3.1",
 | 
				
			||||||
		"js-yaml": "4.1.0",
 | 
							"js-yaml": "4.1.0",
 | 
				
			||||||
		"jsdom": "16.6.0",
 | 
							"jsdom": "16.7.0",
 | 
				
			||||||
		"json5": "2.2.0",
 | 
							"json5": "2.2.0",
 | 
				
			||||||
		"json5-loader": "4.0.1",
 | 
							"json5-loader": "4.0.1",
 | 
				
			||||||
		"jsonld": "5.2.0",
 | 
							"jsonld": "5.2.0",
 | 
				
			||||||
		"jsrsasign": "8.0.20",
 | 
							"jsrsasign": "8.0.20",
 | 
				
			||||||
		"katex": "0.13.11",
 | 
							"katex": "0.13.13",
 | 
				
			||||||
		"koa": "2.13.1",
 | 
							"koa": "2.13.1",
 | 
				
			||||||
		"koa-bodyparser": "4.3.0",
 | 
							"koa-bodyparser": "4.3.0",
 | 
				
			||||||
		"koa-favicon": "2.1.0",
 | 
							"koa-favicon": "2.1.0",
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,7 @@
 | 
				
			||||||
		"koa-views": "7.0.1",
 | 
							"koa-views": "7.0.1",
 | 
				
			||||||
		"langmap": "0.0.16",
 | 
							"langmap": "0.0.16",
 | 
				
			||||||
		"lookup-dns-cache": "2.1.0",
 | 
							"lookup-dns-cache": "2.1.0",
 | 
				
			||||||
		"markdown-it": "12.1.0",
 | 
							"markdown-it": "12.2.0",
 | 
				
			||||||
		"markdown-it-anchor": "7.1.0",
 | 
							"markdown-it-anchor": "7.1.0",
 | 
				
			||||||
		"matter-js": "0.17.1",
 | 
							"matter-js": "0.17.1",
 | 
				
			||||||
		"mfm-js": "0.19.0",
 | 
							"mfm-js": "0.19.0",
 | 
				
			||||||
| 
						 | 
					@ -176,7 +176,7 @@
 | 
				
			||||||
		"mocha": "8.4.0",
 | 
							"mocha": "8.4.0",
 | 
				
			||||||
		"moji": "0.5.1",
 | 
							"moji": "0.5.1",
 | 
				
			||||||
		"ms": "2.1.3",
 | 
							"ms": "2.1.3",
 | 
				
			||||||
		"multer": "1.4.2",
 | 
							"multer": "1.4.3",
 | 
				
			||||||
		"nested-property": "4.0.0",
 | 
							"nested-property": "4.0.0",
 | 
				
			||||||
		"node-fetch": "2.6.1",
 | 
							"node-fetch": "2.6.1",
 | 
				
			||||||
		"nodemailer": "6.6.3",
 | 
							"nodemailer": "6.6.3",
 | 
				
			||||||
| 
						 | 
					@ -185,7 +185,7 @@
 | 
				
			||||||
		"parse5": "6.0.1",
 | 
							"parse5": "6.0.1",
 | 
				
			||||||
		"pg": "8.6.0",
 | 
							"pg": "8.6.0",
 | 
				
			||||||
		"portscanner": "2.2.0",
 | 
							"portscanner": "2.2.0",
 | 
				
			||||||
		"postcss": "8.3.5",
 | 
							"postcss": "8.3.6",
 | 
				
			||||||
		"postcss-loader": "6.1.1",
 | 
							"postcss-loader": "6.1.1",
 | 
				
			||||||
		"prismjs": "1.24.1",
 | 
							"prismjs": "1.24.1",
 | 
				
			||||||
		"probe-image-size": "7.2.1",
 | 
							"probe-image-size": "7.2.1",
 | 
				
			||||||
| 
						 | 
					@ -202,32 +202,32 @@
 | 
				
			||||||
		"redis": "3.1.2",
 | 
							"redis": "3.1.2",
 | 
				
			||||||
		"redis-lock": "0.1.4",
 | 
							"redis-lock": "0.1.4",
 | 
				
			||||||
		"reflect-metadata": "0.1.13",
 | 
							"reflect-metadata": "0.1.13",
 | 
				
			||||||
		"regenerator-runtime": "0.13.7",
 | 
							"regenerator-runtime": "0.13.9",
 | 
				
			||||||
		"rename": "1.0.4",
 | 
							"rename": "1.0.4",
 | 
				
			||||||
		"request-stats": "3.0.0",
 | 
							"request-stats": "3.0.0",
 | 
				
			||||||
		"require-all": "3.0.0",
 | 
							"require-all": "3.0.0",
 | 
				
			||||||
		"rimraf": "3.0.2",
 | 
							"rimraf": "3.0.2",
 | 
				
			||||||
		"rndstr": "1.0.0",
 | 
							"rndstr": "1.0.0",
 | 
				
			||||||
		"s-age": "1.1.2",
 | 
							"s-age": "1.1.2",
 | 
				
			||||||
		"sass": "1.35.2",
 | 
							"sass": "1.37.5",
 | 
				
			||||||
		"sass-loader": "12.1.0",
 | 
							"sass-loader": "12.1.0",
 | 
				
			||||||
		"seedrandom": "3.0.5",
 | 
							"seedrandom": "3.0.5",
 | 
				
			||||||
		"sharp": "0.28.3",
 | 
							"sharp": "0.28.3",
 | 
				
			||||||
		"speakeasy": "2.0.0",
 | 
							"speakeasy": "2.0.0",
 | 
				
			||||||
		"stringz": "2.1.0",
 | 
							"stringz": "2.1.0",
 | 
				
			||||||
		"style-loader": "3.1.0",
 | 
							"style-loader": "3.2.1",
 | 
				
			||||||
		"summaly": "2.4.0",
 | 
							"summaly": "2.4.1",
 | 
				
			||||||
		"syslog-pro": "1.0.0",
 | 
							"syslog-pro": "1.0.0",
 | 
				
			||||||
		"systeminformation": "5.7.7",
 | 
							"systeminformation": "5.8.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.117.1",
 | 
							"three": "0.117.1",
 | 
				
			||||||
		"throttle-debounce": "3.0.1",
 | 
							"throttle-debounce": "3.0.1",
 | 
				
			||||||
		"tinycolor2": "1.4.2",
 | 
							"tinycolor2": "1.4.2",
 | 
				
			||||||
		"tmp": "0.2.1",
 | 
							"tmp": "0.2.1",
 | 
				
			||||||
		"ts-loader": "9.2.3",
 | 
							"ts-loader": "9.2.5",
 | 
				
			||||||
		"ts-node": "10.1.0",
 | 
							"ts-node": "10.2.0",
 | 
				
			||||||
		"tsc-alias": "1.3.7",
 | 
							"tsc-alias": "1.3.8",
 | 
				
			||||||
		"tsconfig-paths": "3.10.1",
 | 
							"tsconfig-paths": "3.10.1",
 | 
				
			||||||
		"tslint": "6.1.3",
 | 
							"tslint": "6.1.3",
 | 
				
			||||||
		"tslint-sonarts": "1.9.0",
 | 
							"tslint-sonarts": "1.9.0",
 | 
				
			||||||
| 
						 | 
					@ -237,21 +237,21 @@
 | 
				
			||||||
		"ulid": "2.3.0",
 | 
							"ulid": "2.3.0",
 | 
				
			||||||
		"uuid": "8.3.2",
 | 
							"uuid": "8.3.2",
 | 
				
			||||||
		"v-debounce": "0.1.2",
 | 
							"v-debounce": "0.1.2",
 | 
				
			||||||
		"vanilla-tilt": "1.7.0",
 | 
							"vanilla-tilt": "1.7.1",
 | 
				
			||||||
		"vue": "3.2.1",
 | 
							"vue": "3.2.2",
 | 
				
			||||||
		"vue-color": "2.8.1",
 | 
							"vue-color": "2.8.1",
 | 
				
			||||||
		"vue-json-pretty": "1.8.1",
 | 
							"vue-json-pretty": "1.8.1",
 | 
				
			||||||
		"vue-loader": "16.3.1",
 | 
							"vue-loader": "16.5.0",
 | 
				
			||||||
		"vue-prism-editor": "2.0.0-alpha.2",
 | 
							"vue-prism-editor": "2.0.0-alpha.2",
 | 
				
			||||||
		"vue-router": "4.0.5",
 | 
							"vue-router": "4.0.5",
 | 
				
			||||||
		"vue-style-loader": "4.1.3",
 | 
							"vue-style-loader": "4.1.3",
 | 
				
			||||||
		"vue-svg-loader": "0.17.0-beta.2",
 | 
							"vue-svg-loader": "0.17.0-beta.2",
 | 
				
			||||||
		"vuedraggable": "4.0.1",
 | 
							"vuedraggable": "4.0.1",
 | 
				
			||||||
		"web-push": "3.4.5",
 | 
							"web-push": "3.4.5",
 | 
				
			||||||
		"webpack": "5.45.1",
 | 
							"webpack": "5.50.0",
 | 
				
			||||||
		"webpack-cli": "4.7.2",
 | 
							"webpack-cli": "4.7.2",
 | 
				
			||||||
		"websocket": "1.0.34",
 | 
							"websocket": "1.0.34",
 | 
				
			||||||
		"ws": "7.5.3",
 | 
							"ws": "8.1.0",
 | 
				
			||||||
		"xev": "2.0.1"
 | 
							"xev": "2.0.1"
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"devDependencies": {
 | 
						"devDependencies": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ import { twemojiSvgBase } from '@/misc/twemoji-base';
 | 
				
			||||||
import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
 | 
					import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
 | 
				
			||||||
import { acct } from '@client/filters/user';
 | 
					import { acct } from '@client/filters/user';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
 | 
					import { instance } from '@client/instance';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type EmojiDef = {
 | 
					type EmojiDef = {
 | 
				
			||||||
	emoji: string;
 | 
						emoji: string;
 | 
				
			||||||
| 
						 | 
					@ -75,6 +76,36 @@ for (const x of lib) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
emjdb.sort((a, b) => a.name.length - b.name.length);
 | 
					emjdb.sort((a, b) => a.name.length - b.name.length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#region Construct Emoji DB
 | 
				
			||||||
 | 
					const customEmojis = instance.emojis;
 | 
				
			||||||
 | 
					const emojiDefinitions: EmojiDef[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for (const x of customEmojis) {
 | 
				
			||||||
 | 
						emojiDefinitions.push({
 | 
				
			||||||
 | 
							name: x.name,
 | 
				
			||||||
 | 
							emoji: `:${x.name}:`,
 | 
				
			||||||
 | 
							url: x.url,
 | 
				
			||||||
 | 
							isCustomEmoji: true
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (x.aliases) {
 | 
				
			||||||
 | 
							for (const alias of x.aliases) {
 | 
				
			||||||
 | 
								emojiDefinitions.push({
 | 
				
			||||||
 | 
									name: alias,
 | 
				
			||||||
 | 
									aliasOf: x.name,
 | 
				
			||||||
 | 
									emoji: `:${x.name}:`,
 | 
				
			||||||
 | 
									url: x.url,
 | 
				
			||||||
 | 
									isCustomEmoji: true
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emojiDb = markRaw(emojiDefinitions.concat(emjdb));
 | 
				
			||||||
 | 
					//#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		type: {
 | 
							type: {
 | 
				
			||||||
| 
						 | 
					@ -124,7 +155,6 @@ export default defineComponent({
 | 
				
			||||||
			emojis: [],
 | 
								emojis: [],
 | 
				
			||||||
			items: [],
 | 
								items: [],
 | 
				
			||||||
			select: -1,
 | 
								select: -1,
 | 
				
			||||||
			emojiDb: [] as EmojiDef[]
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,36 +174,6 @@ export default defineComponent({
 | 
				
			||||||
	mounted() {
 | 
						mounted() {
 | 
				
			||||||
		this.setPosition();
 | 
							this.setPosition();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//#region Construct Emoji DB
 | 
					 | 
				
			||||||
		const customEmojis = this.$instance.emojis;
 | 
					 | 
				
			||||||
		const emojiDefinitions: EmojiDef[] = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for (const x of customEmojis) {
 | 
					 | 
				
			||||||
			emojiDefinitions.push({
 | 
					 | 
				
			||||||
				name: x.name,
 | 
					 | 
				
			||||||
				emoji: `:${x.name}:`,
 | 
					 | 
				
			||||||
				url: x.url,
 | 
					 | 
				
			||||||
				isCustomEmoji: true
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (x.aliases) {
 | 
					 | 
				
			||||||
				for (const alias of x.aliases) {
 | 
					 | 
				
			||||||
					emojiDefinitions.push({
 | 
					 | 
				
			||||||
						name: alias,
 | 
					 | 
				
			||||||
						aliasOf: x.name,
 | 
					 | 
				
			||||||
						emoji: `:${x.name}:`,
 | 
					 | 
				
			||||||
						url: x.url,
 | 
					 | 
				
			||||||
						isCustomEmoji: true
 | 
					 | 
				
			||||||
					});
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		this.emojiDb = markRaw(emojiDefinitions.concat(emjdb));
 | 
					 | 
				
			||||||
		//#endregion
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		this.textarea.addEventListener('keydown', this.onKeydown);
 | 
							this.textarea.addEventListener('keydown', this.onKeydown);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (const el of Array.from(document.querySelectorAll('body *'))) {
 | 
							for (const el of Array.from(document.querySelectorAll('body *'))) {
 | 
				
			||||||
| 
						 | 
					@ -203,6 +203,13 @@ export default defineComponent({
 | 
				
			||||||
		complete(type, value) {
 | 
							complete(type, value) {
 | 
				
			||||||
			this.$emit('done', { type, value });
 | 
								this.$emit('done', { type, value });
 | 
				
			||||||
			this.$emit('closed');
 | 
								this.$emit('closed');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (type === 'emoji') {
 | 
				
			||||||
 | 
									let recents = this.$store.state.recentlyUsedEmojis;
 | 
				
			||||||
 | 
									recents = recents.filter((e: any) => e !== value);
 | 
				
			||||||
 | 
									recents.unshift(value);
 | 
				
			||||||
 | 
									this.$store.set('recentlyUsedEmojis', recents.splice(0, 32));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		setPosition() {
 | 
							setPosition() {
 | 
				
			||||||
| 
						 | 
					@ -281,29 +288,26 @@ export default defineComponent({
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else if (this.type == 'emoji') {
 | 
								} else if (this.type == 'emoji') {
 | 
				
			||||||
				if (this.q == null || this.q == '') {
 | 
									if (this.q == null || this.q == '') {
 | 
				
			||||||
					this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
 | 
										// 最近使った絵文字をサジェスト
 | 
				
			||||||
						var textA = a.name.toUpperCase();
 | 
										this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null);
 | 
				
			||||||
						var textB = b.name.toUpperCase();
 | 
					 | 
				
			||||||
						return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
 | 
					 | 
				
			||||||
					});
 | 
					 | 
				
			||||||
					return;
 | 
										return;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				const matched = [];
 | 
									const matched = [];
 | 
				
			||||||
				const max = 30;
 | 
									const max = 30;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				this.emojiDb.some(x => {
 | 
									emojiDb.some(x => {
 | 
				
			||||||
					if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
										if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
				
			||||||
					return matched.length == max;
 | 
										return matched.length == max;
 | 
				
			||||||
				});
 | 
									});
 | 
				
			||||||
				if (matched.length < max) {
 | 
									if (matched.length < max) {
 | 
				
			||||||
					this.emojiDb.some(x => {
 | 
										emojiDb.some(x => {
 | 
				
			||||||
						if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
											if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
				
			||||||
						return matched.length == max;
 | 
											return matched.length == max;
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (matched.length < max) {
 | 
									if (matched.length < max) {
 | 
				
			||||||
					this.emojiDb.some(x => {
 | 
										emojiDb.some(x => {
 | 
				
			||||||
						if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
											if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
 | 
				
			||||||
						return matched.length == max;
 | 
											return matched.length == max;
 | 
				
			||||||
					});
 | 
										});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ import { router } from '@client/router';
 | 
				
			||||||
import { applyTheme } from '@client/scripts/theme';
 | 
					import { applyTheme } from '@client/scripts/theme';
 | 
				
			||||||
import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
 | 
					import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
 | 
				
			||||||
import { i18n } from '@client/i18n';
 | 
					import { i18n } from '@client/i18n';
 | 
				
			||||||
import { stream, dialog, post } from '@client/os';
 | 
					import { stream, dialog, post, popup } from '@client/os';
 | 
				
			||||||
import * as sound from '@client/scripts/sound';
 | 
					import * as sound from '@client/scripts/sound';
 | 
				
			||||||
import { $i, refreshAccount, login, updateAccount, signout } from '@client/account';
 | 
					import { $i, refreshAccount, login, updateAccount, signout } from '@client/account';
 | 
				
			||||||
import { defaultStore, ColdDeviceStorage } from '@client/store';
 | 
					import { defaultStore, ColdDeviceStorage } from '@client/store';
 | 
				
			||||||
| 
						 | 
					@ -198,6 +198,19 @@ if (splash) {
 | 
				
			||||||
	splash.style.pointerEvents = 'none';
 | 
						splash.style.pointerEvents = 'none';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// クライアントが更新されたか?
 | 
				
			||||||
 | 
					const lastVersion = localStorage.getItem('lastVersion');
 | 
				
			||||||
 | 
					if (lastVersion !== version) {
 | 
				
			||||||
 | 
						localStorage.setItem('lastVersion', version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// テーマリビルドするため
 | 
				
			||||||
 | 
						localStorage.removeItem('theme');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO: バージョンが新しくなった時だけダイアログ出す
 | 
				
			||||||
 | 
						//popup();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NOTE: この処理は必ず↑のクライアント更新時処理より後に来ること(テーマ再構築のため)
 | 
				
			||||||
watch(defaultStore.reactiveState.darkMode, (darkMode) => {
 | 
					watch(defaultStore.reactiveState.darkMode, (darkMode) => {
 | 
				
			||||||
	applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'));
 | 
						applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'));
 | 
				
			||||||
}, { immediate: localStorage.theme == null });
 | 
					}, { immediate: localStorage.theme == null });
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,14 +4,14 @@
 | 
				
			||||||
		<div id="debug"></div>
 | 
							<div id="debug"></div>
 | 
				
			||||||
		<section class="_formItem about">
 | 
							<section class="_formItem about">
 | 
				
			||||||
			<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
 | 
								<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
 | 
				
			||||||
				<img src="/static-assets/client/about-icon.png" alt="" class="icon" ref="icon" @load="iconLoaded" draggable="false"/>
 | 
									<img src="/static-assets/client/about-icon.png" alt="" class="icon" @load="iconLoaded" draggable="false" @click="gravity"/>
 | 
				
			||||||
				<div class="misskey">Misskey</div>
 | 
									<div class="misskey">Misskey</div>
 | 
				
			||||||
				<div class="version">v{{ version }}</div>
 | 
									<div class="version">v{{ version }}</div>
 | 
				
			||||||
				<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
 | 
									<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
		<section class="_formItem" style="text-align: center; padding: 0 16px;" @click="gravity">
 | 
							<section class="_formItem" style="text-align: center; padding: 0 16px;">
 | 
				
			||||||
			{{ $ts._aboutMisskey.about }}
 | 
								{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
		<FormGroup>
 | 
							<FormGroup>
 | 
				
			||||||
			<FormLink to="https://github.com/misskey-dev/misskey" external>
 | 
								<FormLink to="https://github.com/misskey-dev/misskey" external>
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import VanillaTilt from 'vanilla-tilt';
 | 
					 | 
				
			||||||
import { version } from '@client/config';
 | 
					import { version } from '@client/config';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/form/link.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/form/base.vue';
 | 
				
			||||||
| 
						 | 
					@ -62,7 +61,6 @@ import FormGroup from '@client/components/form/group.vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
				
			||||||
import MkLink from '@client/components/link.vue';
 | 
					import MkLink from '@client/components/link.vue';
 | 
				
			||||||
import { physics } from '@client/scripts/physics.ts';
 | 
					import { physics } from '@client/scripts/physics.ts';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const patrons = [
 | 
					const patrons = [
 | 
				
			||||||
| 
						 | 
					@ -145,15 +143,6 @@ export default defineComponent({
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mounted() {
 | 
					 | 
				
			||||||
		VanillaTilt.init(this.$refs.icon, {
 | 
					 | 
				
			||||||
			max: 30,
 | 
					 | 
				
			||||||
			perspective: 500,
 | 
					 | 
				
			||||||
			scale: 1.125,
 | 
					 | 
				
			||||||
			speed: 1000,
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	beforeUnmount() {
 | 
						beforeUnmount() {
 | 
				
			||||||
		if (this.easterEggEngine) {
 | 
							if (this.easterEggEngine) {
 | 
				
			||||||
			this.easterEggEngine.stop();
 | 
								this.easterEggEngine.stop();
 | 
				
			||||||
| 
						 | 
					@ -181,7 +170,6 @@ export default defineComponent({
 | 
				
			||||||
		gravity() {
 | 
							gravity() {
 | 
				
			||||||
			if (!this.easterEggReady) return;
 | 
								if (!this.easterEggReady) return;
 | 
				
			||||||
			this.easterEggReady = false;
 | 
								this.easterEggReady = false;
 | 
				
			||||||
			this.$refs.icon.vanillaTilt.destroy();
 | 
					 | 
				
			||||||
			this.easterEggEngine = physics(this.$refs.about);
 | 
								this.easterEggEngine = physics(this.$refs.about);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,4 +51,4 @@ If you enable this option, your note won't be federated to remote instances.
 | 
				
			||||||
By pinning a note to your profile it will be constantly displayed on your profile page. To pin a note, open the note menu and press "Pin to profile". It's also possible to pin multiple notes to your profile.
 | 
					By pinning a note to your profile it will be constantly displayed on your profile page. To pin a note, open the note menu and press "Pin to profile". It's also possible to pin multiple notes to your profile.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Watch
 | 
					## Watch
 | 
				
			||||||
ノートをウォッチすると、自分以外のノートへのリアクションや返信などの通知を受け取ることができます。 ノートのメニューを開き、「ウォッチ」を選択してウォッチできます。
 | 
					You can get notifications for replies, reactions etc. for a note that is not yours by watching it. To watch a note, select "Watch" from the respective note's menu.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
# A collection of links
 | 
					# A collection of links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Websites
 | 
					## Websites
 | 
				
			||||||
 | 
					- [Official Discord](https://discord.gg/Wp8gVStHW3) - The official Discord server for Misskey
 | 
				
			||||||
- [Misskey Forum](https://forum.misskey.io/) - A forum used for questions surrounding Misskey
 | 
					- [Misskey Forum](https://forum.misskey.io/) - A forum used for questions surrounding Misskey
 | 
				
			||||||
- [Misskey Forum](https://forum.misskey.io/) - Misskeyに関する話題を扱うフォーラム
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Accounts
 | 
					## Accounts
 | 
				
			||||||
- [@repo@misskey.io](https://misskey.io/@repo) - A bot that publishes posts about updates to the Misskey repository
 | 
					- [@repo@misskey.io](https://misskey.io/@repo) - A bot that publishes posts about updates to the Misskey repository
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
# トラブルシューティング
 | 
					# Разрешение проблем
 | 
				
			||||||
<div class="info">ℹ️ <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
 | 
					<div class="info">ℹ️ <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。
 | 
					問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
# 禁用 LTL/STL/GTL
 | 
					# 禁用 LTL/STL/GTL
 | 
				
			||||||
Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
 | 
					Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。
 | 
					LTL 和 STL 的优点是新用户不必寻找用户,因为他们可以查看来自所有实例的帖子,从而更容易找到感兴趣的用户。 但同时它也存在着诸多缺点,例如无法使用关注,容易看到不适宜的帖子,感觉像小圈子内部对话一样而使新用户难以参与等等。 不同的服务器会有不同的优缺点,因此可以选择禁用它们。 如果您认为弊大于利,请考虑禁用这些时间线。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します。</div>
 | 
					<div class="warn">⚠️ 禁用后可能会使用户感到困惑,并导致短期内的用户数量减少。因此,建议在禁用时慎重考虑影响。建议事先发布声明并留出一定时间作为过渡。</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です。
 | 
					请注意,这些时间线的禁用状态不适用于管理员/版主,这些用户可以继续使用。
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,58 +1,58 @@
 | 
				
			||||||
# Misskey API
 | 
					# Misskey API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
 | 
					您可以使用Misskey API来开发Misskey客户端、与Misskey链接的Web服务、Bot等应用(以下称为“应用程序”)。 另外还有一个流式API,因此还可以用来创建实时性的应用程序。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
 | 
					开始使用API前,您首先需要获取访问令牌。 本文档将向您介绍获取访问令牌所需的步骤,以及API的基本使用方法。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## アクセストークンの取得
 | 
					## 访问令牌的获取
 | 
				
			||||||
基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
 | 
					总的来说,API请求需要访问令牌。 获取方式则根据请求的API或者非特定用户所使用的应用程序而有所不同。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
 | 
					* 对于前者:请转到[“手动发放自己的访问令牌”](#自分自身のアクセストークンを手動発行する)
 | 
				
			||||||
* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
 | 
					* 对于后者:请转到[“请求应用程序用户发放访问令牌”](#アプリケーション利用者にアクセストークンの発行をリクエストする)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 自分自身のアクセストークンを手動発行する
 | 
					### 手动发放自己的访问令牌
 | 
				
			||||||
「設定 > API」で、自分のアクセストークンを発行できます。
 | 
					您可以在“设置 > API”中发放自己的访问令牌。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[「APIの使い方」へ進む](#APIの使い方)
 | 
					[请转到“API使用方法”](#APIの使い方)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### アプリケーション利用者にアクセストークンの発行をリクエストする
 | 
					### 请求应用程序用户发放访问令牌
 | 
				
			||||||
アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
 | 
					要获取应用程序用户的访问令牌,请按照以下步骤请求发放。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Step 1
 | 
					#### 步骤 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UUIDを生成する。以後これをセッションIDと呼びます。
 | 
					生成UUID。以下将其称为会话ID。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> このセッションIDは毎回生成し、使いまわさないようにしてください。
 | 
					> 此会话ID需要每次重新生成,请勿重复使用。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Step 2
 | 
					#### 步骤 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
 | 
					在用户的浏览器中显示`{_URL_}/miauth/{session}`。将`{session}`的部分替换为会话ID。
 | 
				
			||||||
> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
 | 
					> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
 | 
					显示时,可以在URL中设置一些选项作为查询参数:
 | 
				
			||||||
* `name` ... アプリケーション名
 | 
					* `name` ... 应用程序名称
 | 
				
			||||||
    * > 例: `MissDeck`
 | 
					    * > 例: `MissDeck`
 | 
				
			||||||
* `icon` ... アプリケーションのアイコン画像URL
 | 
					* `icon` ... 应用程序图标URL
 | 
				
			||||||
    * > 例: `https://missdeck.example.com/icon.png`
 | 
					    * > 例: `https://missdeck.example.com/icon.png`
 | 
				
			||||||
* `callback` ... 認証が終わった後にリダイレクトするURL
 | 
					* `callback` ... 认证后重定向的URL
 | 
				
			||||||
    * > 例: `https://missdeck.example.com/callback`
 | 
					    * > 例: `https://missdeck.example.com/callback`
 | 
				
			||||||
    * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
 | 
					    * 重定向时,会话ID将添加查询参数`session`
 | 
				
			||||||
* `permission` ... アプリケーションが要求する権限
 | 
					* `permission` ... 应用程序要求的权限
 | 
				
			||||||
    * > 例: `write:notes,write:following,read:drive`
 | 
					    * > 例: `write:notes,write:following,read:drive`
 | 
				
			||||||
    * 要求する権限を`,`で区切って列挙します
 | 
					    * 要求的权限需要以`,`分隔
 | 
				
			||||||
    * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
 | 
					    * 您可以在[API参考](/api-doc)中确认您所拥有的权限。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Step 3
 | 
					#### 步骤 3
 | 
				
			||||||
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
 | 
					用户允许发行后,对`{_URL_}/api/miauth/{session}/check`的POST请求所返回的是一个包含访问令牌的JSON格式的响应。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
レスポンスに含まれるプロパティ:
 | 
					响应中包含的属性:
 | 
				
			||||||
* `token` ... ユーザーのアクセストークン
 | 
					* `token` ... 用户的访问令牌
 | 
				
			||||||
* `user` ... ユーザーの情報
 | 
					* `user` ... 用户信息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[「APIの使い方」へ進む](#APIの使い方)
 | 
					[请转到“API使用方法”](#APIの使い方)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## APIの使い方
 | 
					## API使用方法
 | 
				
			||||||
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
 | 
					**所有API均为POST,并且请求/响应均为JSON格式。不是REST。** 访问令牌包含在请求中,参数名为`i`。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [APIリファレンス](/api-doc)
 | 
					* [API 参考](/api-doc)
 | 
				
			||||||
* [ストリーミングAPI](./stream)
 | 
					* [流式API](./stream)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
# プラグインの作成
 | 
					# 插件开发
 | 
				
			||||||
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
 | 
					Misskey Web客户端插件功能使您可以扩展客户端并添加各种功能。 我们在这里给出用于创建插件的元数据定义和AiScript API参考。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 元数据
 | 
					## 元数据
 | 
				
			||||||
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
 | 
					プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ Misskey Webクライアントのプラグイン機能を使うと、クライア
 | 
				
			||||||
#### default
 | 
					#### default
 | 
				
			||||||
設定のデフォルト値
 | 
					設定のデフォルト値
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## APIリファレンス
 | 
					## API 参考
 | 
				
			||||||
AiScript標準で組み込まれているAPIは掲載しません。
 | 
					AiScript標準で組み込まれているAPIは掲載しません。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Mk:dialog(title text type)
 | 
					### Mk:dialog(title text type)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
# ストリーミングAPI
 | 
					# 流式API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
 | 
					ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue