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) | ||||
| 
 | ||||
| ### Improvements | ||||
|  | @ -9,4 +31,4 @@ | |||
| 
 | ||||
| ### 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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -771,6 +771,7 @@ received: "Erhalten" | |||
| searchResult: "Suchergebnisse" | ||||
| hashtags: "Hashtags" | ||||
| troubleshooting: "Problembehandlung" | ||||
| useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden" | ||||
| _docs: | ||||
|   continueReading: "Mehr lesen" | ||||
|   features: "Funktionen" | ||||
|  |  | |||
|  | @ -249,7 +249,7 @@ agreeTo: "I agree to {0}" | |||
| tos: "Terms of Service" | ||||
| start: "Begin" | ||||
| 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" | ||||
| images: "Images" | ||||
| birthday: "Birthday" | ||||
|  | @ -771,6 +771,7 @@ received: "Received" | |||
| searchResult: "Search results" | ||||
| hashtags: "Hashtags" | ||||
| troubleshooting: "Troubleshooting" | ||||
| useBlurEffect: "Use blur effects in the UI" | ||||
| _docs: | ||||
|   continueReading: "Read more" | ||||
|   features: "Features" | ||||
|  |  | |||
|  | @ -772,6 +772,7 @@ searchResult: "検索結果" | |||
| hashtags: "ハッシュタグ" | ||||
| troubleshooting: "トラブルシューティング" | ||||
| useBlurEffect: "UIにぼかし効果を使用" | ||||
| learnMore: "詳しく" | ||||
| 
 | ||||
| _docs:  | ||||
|   continueReading: "続きを読む" | ||||
|  |  | |||
|  | @ -771,12 +771,14 @@ received: "수신" | |||
| searchResult: "검색 결과" | ||||
| hashtags: "해시태그" | ||||
| troubleshooting: "트러블 슈팅" | ||||
| useBlurEffect: "UI에 흐림 효과 사용" | ||||
| _docs: | ||||
|   continueReading: "계속 읽기" | ||||
|   features: "기능" | ||||
|   generalTopics: "일반 주제" | ||||
|   advancedTopics: "심화 주제" | ||||
|   admin: "관리" | ||||
|   translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다." | ||||
| _ad: | ||||
|   back: "뒤로" | ||||
|   reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기" | ||||
|  |  | |||
|  | @ -529,6 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков" | |||
| removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует." | ||||
| userSuspended: "Эта учётная запись заморожена" | ||||
| userSilenced: "Этот пользователь был заглушен" | ||||
| menu: "Меню" | ||||
| divider: "Линия-разделитель" | ||||
| addItem: "Добавить элемент" | ||||
| rooms: "Комната" | ||||
|  | @ -761,15 +762,23 @@ middle: "Средне" | |||
| low: "Низкий" | ||||
| emailNotConfiguredWarning: "Не указан адрес электронной почты" | ||||
| ratio: "Соотношение" | ||||
| customCss: "Индивидуальный CSS" | ||||
| customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас." | ||||
| global: "Всеобщая" | ||||
| squareAvatars: "Квадратные аватарки" | ||||
| sent: "Отправить" | ||||
| received: "Получено" | ||||
| searchResult: "Результаты поиска" | ||||
| hashtags: "Хэштег" | ||||
| troubleshooting: "Разрешение проблем" | ||||
| useBlurEffect: "Размытие в интерфейсе" | ||||
| _docs: | ||||
|   continueReading: "Читать подробнее" | ||||
|   features: "Возможности" | ||||
|   generalTopics: "Основные темы" | ||||
|   advancedTopics: "Дополнительные темы" | ||||
|   admin: "Управление" | ||||
|   translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала." | ||||
| _ad: | ||||
|   back: "Выход" | ||||
|   reduceFrequencyOfThisAd: "Реже показывать эту рекламу" | ||||
|  |  | |||
|  | @ -771,6 +771,8 @@ received: "收取" | |||
| searchResult: "搜索结果" | ||||
| hashtags: "话题标签" | ||||
| troubleshooting: "故障排除" | ||||
| useBlurEffect: "在UI上使用模糊效果" | ||||
| learnMore: "更多信息" | ||||
| _docs: | ||||
|   continueReading: "继续阅读" | ||||
|   features: "特性" | ||||
|  |  | |||
							
								
								
									
										82
									
								
								package.json
									
										
									
									
									
								
							
							
						
						
									
										82
									
								
								package.json
									
										
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| { | ||||
| 	"name": "misskey", | ||||
| 	"author": "syuilo <syuilotan@yahoo.co.jp>", | ||||
| 	"version": "12.86.0", | ||||
| 	"version": "12.87.0", | ||||
| 	"codename": "indigo", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
|  | @ -44,7 +44,7 @@ | |||
| 		"@sinonjs/fake-timers": "7.1.2", | ||||
| 		"@syuilo/aiscript": "0.11.1", | ||||
| 		"@types/bcryptjs": "2.4.2", | ||||
| 		"@types/bull": "3.15.2", | ||||
| 		"@types/bull": "3.15.3", | ||||
| 		"@types/cbor": "6.0.0", | ||||
| 		"@types/dateformat": "3.0.1", | ||||
| 		"@types/escape-regexp": "0.0.0", | ||||
|  | @ -57,8 +57,8 @@ | |||
| 		"@types/jsonld": "1.5.6", | ||||
| 		"@types/katex": "0.11.1", | ||||
| 		"@types/koa": "2.13.4", | ||||
| 		"@types/koa-bodyparser": "4.3.2", | ||||
| 		"@types/koa-cors": "0.0.1", | ||||
| 		"@types/koa-bodyparser": "4.3.3", | ||||
| 		"@types/koa-cors": "0.0.2", | ||||
| 		"@types/koa-favicon": "2.0.21", | ||||
| 		"@types/koa-logger": "3.1.1", | ||||
| 		"@types/koa-mount": "4.0.0", | ||||
|  | @ -68,10 +68,10 @@ | |||
| 		"@types/koa__multer": "2.0.3", | ||||
| 		"@types/koa__router": "8.0.7", | ||||
| 		"@types/markdown-it": "12.0.3", | ||||
| 		"@types/matter-js": "0.17.3", | ||||
| 		"@types/matter-js": "0.17.5", | ||||
| 		"@types/mocha": "8.2.3", | ||||
| 		"@types/node": "16.3.3", | ||||
| 		"@types/node-fetch": "2.5.11", | ||||
| 		"@types/node": "16.6.0", | ||||
| 		"@types/node-fetch": "2.5.12", | ||||
| 		"@types/nodemailer": "6.4.4", | ||||
| 		"@types/nprogress": "0.2.0", | ||||
| 		"@types/oauth": "0.9.1", | ||||
|  | @ -88,7 +88,7 @@ | |||
| 		"@types/request-stats": "3.0.0", | ||||
| 		"@types/rimraf": "3.0.1", | ||||
| 		"@types/seedrandom": "2.4.28", | ||||
| 		"@types/sharp": "0.28.4", | ||||
| 		"@types/sharp": "0.28.5", | ||||
| 		"@types/sinonjs__fake-timers": "6.0.3", | ||||
| 		"@types/speakeasy": "2.0.6", | ||||
| 		"@types/throttle-debounce": "2.1.0", | ||||
|  | @ -98,40 +98,40 @@ | |||
| 		"@types/web-push": "3.3.2", | ||||
| 		"@types/webpack": "5.28.0", | ||||
| 		"@types/webpack-stream": "3.2.12", | ||||
| 		"@types/websocket": "1.0.3", | ||||
| 		"@types/ws": "7.4.6", | ||||
| 		"@typescript-eslint/parser": "4.28.3", | ||||
| 		"@vue/compiler-sfc": "3.2.1", | ||||
| 		"@types/websocket": "1.0.4", | ||||
| 		"@types/ws": "7.4.7", | ||||
| 		"@typescript-eslint/parser": "4.29.1", | ||||
| 		"@vue/compiler-sfc": "3.2.2", | ||||
| 		"abort-controller": "3.0.0", | ||||
| 		"apexcharts": "3.27.2", | ||||
| 		"apexcharts": "3.27.3", | ||||
| 		"autobind-decorator": "2.4.0", | ||||
| 		"autosize": "4.0.4", | ||||
| 		"autwh": "0.1.0", | ||||
| 		"aws-sdk": "2.948.0", | ||||
| 		"aws-sdk": "2.966.0", | ||||
| 		"bcryptjs": "2.4.3", | ||||
| 		"blurhash": "1.1.3", | ||||
| 		"broadcast-channel": "3.7.0", | ||||
| 		"bull": "3.26.0", | ||||
| 		"cafy": "15.2.1", | ||||
| 		"cbor": "7.0.6", | ||||
| 		"chalk": "4.1.1", | ||||
| 		"cbor": "8.0.0", | ||||
| 		"chalk": "4.1.2", | ||||
| 		"chart.js": "2.9.4", | ||||
| 		"cli-highlight": "2.1.11", | ||||
| 		"commander": "7.2.0", | ||||
| 		"concurrently": "6.2.0", | ||||
| 		"content-disposition": "0.5.3", | ||||
| 		"core-js": "3.15.2", | ||||
| 		"core-js": "3.16.1", | ||||
| 		"crc-32": "1.2.0", | ||||
| 		"css-loader": "6.0.0", | ||||
| 		"cssnano": "5.0.6", | ||||
| 		"css-loader": "6.2.0", | ||||
| 		"cssnano": "5.0.7", | ||||
| 		"dateformat": "4.5.1", | ||||
| 		"diskusage": "1.1.3", | ||||
| 		"escape-regexp": "0.0.1", | ||||
| 		"eslint": "7.30.0", | ||||
| 		"eslint-plugin-vue": "7.13.0", | ||||
| 		"eslint": "7.32.0", | ||||
| 		"eslint-plugin-vue": "7.16.0", | ||||
| 		"eventemitter3": "4.0.7", | ||||
| 		"feed": "4.2.2", | ||||
| 		"file-type": "16.5.1", | ||||
| 		"file-type": "16.5.3", | ||||
| 		"fluent-ffmpeg": "2.1.2", | ||||
| 		"glob": "7.1.7", | ||||
| 		"got": "11.8.2", | ||||
|  | @ -146,17 +146,17 @@ | |||
| 		"http-proxy-agent": "4.0.1", | ||||
| 		"http-signature": "1.3.5", | ||||
| 		"https-proxy-agent": "5.0.0", | ||||
| 		"idb-keyval": "5.0.6", | ||||
| 		"idb-keyval": "5.1.3", | ||||
| 		"insert-text-at-cursor": "0.3.0", | ||||
| 		"is-root": "2.1.0", | ||||
| 		"is-svg": "4.3.1", | ||||
| 		"js-yaml": "4.1.0", | ||||
| 		"jsdom": "16.6.0", | ||||
| 		"jsdom": "16.7.0", | ||||
| 		"json5": "2.2.0", | ||||
| 		"json5-loader": "4.0.1", | ||||
| 		"jsonld": "5.2.0", | ||||
| 		"jsrsasign": "8.0.20", | ||||
| 		"katex": "0.13.11", | ||||
| 		"katex": "0.13.13", | ||||
| 		"koa": "2.13.1", | ||||
| 		"koa-bodyparser": "4.3.0", | ||||
| 		"koa-favicon": "2.1.0", | ||||
|  | @ -168,7 +168,7 @@ | |||
| 		"koa-views": "7.0.1", | ||||
| 		"langmap": "0.0.16", | ||||
| 		"lookup-dns-cache": "2.1.0", | ||||
| 		"markdown-it": "12.1.0", | ||||
| 		"markdown-it": "12.2.0", | ||||
| 		"markdown-it-anchor": "7.1.0", | ||||
| 		"matter-js": "0.17.1", | ||||
| 		"mfm-js": "0.19.0", | ||||
|  | @ -176,7 +176,7 @@ | |||
| 		"mocha": "8.4.0", | ||||
| 		"moji": "0.5.1", | ||||
| 		"ms": "2.1.3", | ||||
| 		"multer": "1.4.2", | ||||
| 		"multer": "1.4.3", | ||||
| 		"nested-property": "4.0.0", | ||||
| 		"node-fetch": "2.6.1", | ||||
| 		"nodemailer": "6.6.3", | ||||
|  | @ -185,7 +185,7 @@ | |||
| 		"parse5": "6.0.1", | ||||
| 		"pg": "8.6.0", | ||||
| 		"portscanner": "2.2.0", | ||||
| 		"postcss": "8.3.5", | ||||
| 		"postcss": "8.3.6", | ||||
| 		"postcss-loader": "6.1.1", | ||||
| 		"prismjs": "1.24.1", | ||||
| 		"probe-image-size": "7.2.1", | ||||
|  | @ -202,32 +202,32 @@ | |||
| 		"redis": "3.1.2", | ||||
| 		"redis-lock": "0.1.4", | ||||
| 		"reflect-metadata": "0.1.13", | ||||
| 		"regenerator-runtime": "0.13.7", | ||||
| 		"regenerator-runtime": "0.13.9", | ||||
| 		"rename": "1.0.4", | ||||
| 		"request-stats": "3.0.0", | ||||
| 		"require-all": "3.0.0", | ||||
| 		"rimraf": "3.0.2", | ||||
| 		"rndstr": "1.0.0", | ||||
| 		"s-age": "1.1.2", | ||||
| 		"sass": "1.35.2", | ||||
| 		"sass": "1.37.5", | ||||
| 		"sass-loader": "12.1.0", | ||||
| 		"seedrandom": "3.0.5", | ||||
| 		"sharp": "0.28.3", | ||||
| 		"speakeasy": "2.0.0", | ||||
| 		"stringz": "2.1.0", | ||||
| 		"style-loader": "3.1.0", | ||||
| 		"summaly": "2.4.0", | ||||
| 		"style-loader": "3.2.1", | ||||
| 		"summaly": "2.4.1", | ||||
| 		"syslog-pro": "1.0.0", | ||||
| 		"systeminformation": "5.7.7", | ||||
| 		"systeminformation": "5.8.0", | ||||
| 		"syuilo-password-strength": "0.0.1", | ||||
| 		"textarea-caret": "3.1.0", | ||||
| 		"three": "0.117.1", | ||||
| 		"throttle-debounce": "3.0.1", | ||||
| 		"tinycolor2": "1.4.2", | ||||
| 		"tmp": "0.2.1", | ||||
| 		"ts-loader": "9.2.3", | ||||
| 		"ts-node": "10.1.0", | ||||
| 		"tsc-alias": "1.3.7", | ||||
| 		"ts-loader": "9.2.5", | ||||
| 		"ts-node": "10.2.0", | ||||
| 		"tsc-alias": "1.3.8", | ||||
| 		"tsconfig-paths": "3.10.1", | ||||
| 		"tslint": "6.1.3", | ||||
| 		"tslint-sonarts": "1.9.0", | ||||
|  | @ -237,21 +237,21 @@ | |||
| 		"ulid": "2.3.0", | ||||
| 		"uuid": "8.3.2", | ||||
| 		"v-debounce": "0.1.2", | ||||
| 		"vanilla-tilt": "1.7.0", | ||||
| 		"vue": "3.2.1", | ||||
| 		"vanilla-tilt": "1.7.1", | ||||
| 		"vue": "3.2.2", | ||||
| 		"vue-color": "2.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-router": "4.0.5", | ||||
| 		"vue-style-loader": "4.1.3", | ||||
| 		"vue-svg-loader": "0.17.0-beta.2", | ||||
| 		"vuedraggable": "4.0.1", | ||||
| 		"web-push": "3.4.5", | ||||
| 		"webpack": "5.45.1", | ||||
| 		"webpack": "5.50.0", | ||||
| 		"webpack-cli": "4.7.2", | ||||
| 		"websocket": "1.0.34", | ||||
| 		"ws": "7.5.3", | ||||
| 		"ws": "8.1.0", | ||||
| 		"xev": "2.0.1" | ||||
| 	}, | ||||
| 	"devDependencies": { | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ import { twemojiSvgBase } from '@/misc/twemoji-base'; | |||
| import { getStaticImageUrl } from '@client/scripts/get-static-image-url'; | ||||
| import { acct } from '@client/filters/user'; | ||||
| import * as os from '@client/os'; | ||||
| import { instance } from '@client/instance'; | ||||
| 
 | ||||
| type EmojiDef = { | ||||
| 	emoji: string; | ||||
|  | @ -75,6 +76,36 @@ for (const x of lib) { | |||
| 
 | ||||
| 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({ | ||||
| 	props: { | ||||
| 		type: { | ||||
|  | @ -124,7 +155,6 @@ export default defineComponent({ | |||
| 			emojis: [], | ||||
| 			items: [], | ||||
| 			select: -1, | ||||
| 			emojiDb: [] as EmojiDef[] | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
|  | @ -144,36 +174,6 @@ export default defineComponent({ | |||
| 	mounted() { | ||||
| 		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); | ||||
| 
 | ||||
| 		for (const el of Array.from(document.querySelectorAll('body *'))) { | ||||
|  | @ -203,6 +203,13 @@ export default defineComponent({ | |||
| 		complete(type, value) { | ||||
| 			this.$emit('done', { type, value }); | ||||
| 			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() { | ||||
|  | @ -281,29 +288,26 @@ export default defineComponent({ | |||
| 				} | ||||
| 			} else if (this.type == 'emoji') { | ||||
| 				if (this.q == null || this.q == '') { | ||||
| 					this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => { | ||||
| 						var textA = a.name.toUpperCase(); | ||||
| 						var textB = b.name.toUpperCase(); | ||||
| 						return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; | ||||
| 					}); | ||||
| 					// 最近使った絵文字をサジェスト | ||||
| 					this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null); | ||||
| 					return; | ||||
| 				} | ||||
| 
 | ||||
| 				const matched = []; | ||||
| 				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); | ||||
| 					return 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); | ||||
| 						return 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); | ||||
| 						return matched.length == max; | ||||
| 					}); | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ import { router } from '@client/router'; | |||
| import { applyTheme } from '@client/scripts/theme'; | ||||
| import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode'; | ||||
| 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 { $i, refreshAccount, login, updateAccount, signout } from '@client/account'; | ||||
| import { defaultStore, ColdDeviceStorage } from '@client/store'; | ||||
|  | @ -198,6 +198,19 @@ if (splash) { | |||
| 	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) => { | ||||
| 	applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme')); | ||||
| }, { immediate: localStorage.theme == null }); | ||||
|  |  | |||
|  | @ -4,14 +4,14 @@ | |||
| 		<div id="debug"></div> | ||||
| 		<section class="_formItem 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="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> | ||||
| 			</div> | ||||
| 		</section> | ||||
| 		<section class="_formItem" style="text-align: center; padding: 0 16px;" @click="gravity"> | ||||
| 			{{ $ts._aboutMisskey.about }} | ||||
| 		<section class="_formItem" style="text-align: center; padding: 0 16px;"> | ||||
| 			{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA> | ||||
| 		</section> | ||||
| 		<FormGroup> | ||||
| 			<FormLink to="https://github.com/misskey-dev/misskey" external> | ||||
|  | @ -54,7 +54,6 @@ | |||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import VanillaTilt from 'vanilla-tilt'; | ||||
| import { version } from '@client/config'; | ||||
| import FormLink from '@client/components/form/link.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 MkLink from '@client/components/link.vue'; | ||||
| import { physics } from '@client/scripts/physics.ts'; | ||||
| import * as os from '@client/os'; | ||||
| import * as symbols from '@client/symbols'; | ||||
| 
 | ||||
| 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() { | ||||
| 		if (this.easterEggEngine) { | ||||
| 			this.easterEggEngine.stop(); | ||||
|  | @ -181,7 +170,6 @@ export default defineComponent({ | |||
| 		gravity() { | ||||
| 			if (!this.easterEggReady) return; | ||||
| 			this.easterEggReady = false; | ||||
| 			this.$refs.icon.vanillaTilt.destroy(); | ||||
| 			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. | ||||
| 
 | ||||
| ## 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 | ||||
| 
 | ||||
| ## 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/) - Misskeyに関する話題を扱うフォーラム | ||||
| 
 | ||||
| ## Accounts | ||||
| - [@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> | ||||
| 
 | ||||
| 問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。 | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| # 禁用 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 | ||||
| 
 | ||||
| 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にクエリパラメータとしていくつかのオプションを設定できます: | ||||
| * `name` ... アプリケーション名 | ||||
| 显示时,可以在URL中设置一些选项作为查询参数: | ||||
| * `name` ... 应用程序名称 | ||||
|     * > 例: `MissDeck` | ||||
| * `icon` ... アプリケーションのアイコン画像URL | ||||
| * `icon` ... 应用程序图标URL | ||||
|     * > 例: `https://missdeck.example.com/icon.png` | ||||
| * `callback` ... 認証が終わった後にリダイレクトするURL | ||||
| * `callback` ... 认证后重定向的URL | ||||
|     * > 例: `https://missdeck.example.com/callback` | ||||
|     * リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます | ||||
| * `permission` ... アプリケーションが要求する権限 | ||||
|     * 重定向时,会话ID将添加查询参数`session` | ||||
| * `permission` ... 应用程序要求的权限 | ||||
|     * > 例: `write:notes,write:following,read:drive` | ||||
|     * 要求する権限を`,`で区切って列挙します | ||||
|     * どのような権限があるかは[APIリファレンス](/api-doc)で確認できます | ||||
|     * 要求的权限需要以`,`分隔 | ||||
|     * 您可以在[API参考](/api-doc)中确认您所拥有的权限。 | ||||
| 
 | ||||
| #### Step 3 | ||||
| ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。 | ||||
| #### 步骤 3 | ||||
| 用户允许发行后,对`{_URL_}/api/miauth/{session}/check`的POST请求所返回的是一个包含访问令牌的JSON格式的响应。 | ||||
| 
 | ||||
| レスポンスに含まれるプロパティ: | ||||
| * `token` ... ユーザーのアクセストークン | ||||
| * `user` ... ユーザーの情報 | ||||
| 响应中包含的属性: | ||||
| * `token` ... 用户的访问令牌 | ||||
| * `user` ... 用户信息 | ||||
| 
 | ||||
| [「APIの使い方」へ進む](#APIの使い方) | ||||
| [请转到“API使用方法”](#APIの使い方) | ||||
| 
 | ||||
| ## APIの使い方 | ||||
| **APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。 | ||||
| ## API使用方法 | ||||
| **所有API均为POST,并且请求/响应均为JSON格式。不是REST。** 访问令牌包含在请求中,参数名为`i`。 | ||||
| 
 | ||||
| * [APIリファレンス](/api-doc) | ||||
| * [ストリーミングAPI](./stream) | ||||
| * [API 参考](/api-doc) | ||||
| * [流式API](./stream) | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| # プラグインの作成 | ||||
| Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。 | ||||
| # 插件开发 | ||||
| Misskey Web客户端插件功能使您可以扩展客户端并添加各种功能。 我们在这里给出用于创建插件的元数据定义和AiScript API参考。 | ||||
| 
 | ||||
| ## 元数据 | ||||
| プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。 | ||||
|  | @ -34,7 +34,7 @@ Misskey Webクライアントのプラグイン機能を使うと、クライア | |||
| #### default | ||||
| 設定のデフォルト値 | ||||
| 
 | ||||
| ## APIリファレンス | ||||
| ## API 参考 | ||||
| AiScript標準で組み込まれているAPIは掲載しません。 | ||||
| 
 | ||||
| ### Mk:dialog(title text type) | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| # ストリーミングAPI | ||||
| # 流式API | ||||
| 
 | ||||
| ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue