1
0
mirror of https://github.com/hotomoe/hotomoe synced 2024-11-24 23:26:17 +09:00

Merge branch 'develop'

This commit is contained in:
syuilo 2021-08-12 12:48:58 +09:00
commit 9fd0e90850
21 changed files with 654 additions and 703 deletions

View File

@ -1 +1 @@
v16.2.0
v16.6.2

View File

@ -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メール通知を修正

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -772,6 +772,7 @@ searchResult: "検索結果"
hashtags: "ハッシュタグ"
troubleshooting: "トラブルシューティング"
useBlurEffect: "UIにぼかし効果を使用"
learnMore: "詳しく"
_docs:
continueReading: "続きを読む"

View File

@ -771,12 +771,14 @@ received: "수신"
searchResult: "검색 결과"
hashtags: "해시태그"
troubleshooting: "트러블 슈팅"
useBlurEffect: "UI에 흐림 효과 사용"
_docs:
continueReading: "계속 읽기"
features: "기능"
generalTopics: "일반 주제"
advancedTopics: "심화 주제"
admin: "관리"
translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
_ad:
back: "뒤로"
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"

View File

@ -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: "Реже показывать эту рекламу"

View File

@ -771,6 +771,8 @@ received: "收取"
searchResult: "搜索结果"
hashtags: "话题标签"
troubleshooting: "故障排除"
useBlurEffect: "在UI上使用模糊效果"
learnMore: "更多信息"
_docs:
continueReading: "继续阅读"
features: "特性"

View File

@ -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": {

View File

@ -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;
});

View File

@ -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 });

View File

@ -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);
}
}

View File

@ -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.

View File

@ -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

View File

@ -1,4 +1,4 @@
# トラブルシューティング
# Разрешение проблем
<div class="info"> <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。

View File

@ -1,8 +1,8 @@
# 禁用 LTL/STL/GTL
Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください
LTL 和 STL 的优点是新用户不必寻找用户,因为他们可以查看来自所有实例的帖子,从而更容易找到感兴趣的用户。 但同时它也存在着诸多缺点,例如无法使用关注,容易看到不适宜的帖子,感觉像小圈子内部对话一样而使新用户难以参与等等。 不同的服务器会有不同的优缺点,因此可以选择禁用它们。 如果您认为弊大于利,请考虑禁用这些时间线
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します</div>
<div class="warn">⚠️ 禁用后可能会使用户感到困惑,并导致短期内的用户数量减少。因此,建议在禁用时慎重考虑影响。建议事先发布声明并留出一定时间作为过渡</div>
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です
请注意,这些时间线的禁用状态不适用于管理员/版主,这些用户可以继续使用

View File

@ -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)

View File

@ -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)

View File

@ -1,4 +1,4 @@
# ストリーミングAPI
# 流式API
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。

1026
yarn.lock

File diff suppressed because it is too large Load Diff