Merge branch 'develop' into koa-to-fastify
This commit is contained in:
commit
a2fcbddccc
22
CHANGELOG.md
22
CHANGELOG.md
@ -7,6 +7,28 @@
|
||||
|
||||
-->
|
||||
|
||||
## 12.x.x (unreleased)
|
||||
|
||||
### Improvements
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 長いメニューが画面からはみ出す問題を修正
|
||||
- クライアント: コントロールパネルのジョブキューに個々のジョブが表示されないのを修正
|
||||
- クライアント: fix missing i18n string
|
||||
- fix html conversion issue with code blocks
|
||||
|
||||
## 12.95.0 (2021/10/31)
|
||||
|
||||
### Improvements
|
||||
- スレッドミュート機能
|
||||
|
||||
### Bugfixes
|
||||
- リレー向けのActivityが一部実装で除外されてしまうことがあるのを修正
|
||||
- 削除したノートやユーザーがリモートから参照されると復活することがあるのを修正
|
||||
- クライアント: ページ編集時のドロップダウンメニューなどが動作しない問題を修正
|
||||
- クライアント: コントロールパネルのカスタム絵文字タブが切り替わらないように見える問題を修正
|
||||
- API: ユーザー情報の hasUnreadChannel が常に false になっている問題を修正
|
||||
|
||||
## 12.94.1 (2021/10/25)
|
||||
|
||||
### Improvements
|
||||
|
@ -49,10 +49,6 @@ If your language is not listed in Crowdin, please open an issue.
|
||||
|
||||
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
|
||||
|
||||
## Documentation
|
||||
* Documents for instance admins are located in [`/docs`](/docs).
|
||||
* Documents for end users are located in [`/src/docs`](/src/docs).
|
||||
|
||||
## Testing
|
||||
- Test codes are located in [`/test`](/test).
|
||||
|
||||
|
@ -2,6 +2,3 @@ files:
|
||||
- source: /locales/ja-JP.yml
|
||||
translation: /locales/%locale%.yml
|
||||
update_option: update_as_unapproved
|
||||
- source: /src/docs/ja-JP/**/*.md
|
||||
translation: /src/docs/%locale%/**/%original_file_name%
|
||||
update_option: update_as_unapproved
|
||||
|
@ -1,5 +1,6 @@
|
||||
---
|
||||
_lang_: "العربية"
|
||||
headlineMisskey: "شبكة مرتبطة بالملاحظات"
|
||||
introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "البحث"
|
||||
@ -12,6 +13,7 @@ ok: " حسناً"
|
||||
gotIt: "فهِمت"
|
||||
cancel: " إلغاء"
|
||||
enterUsername: "أدخِل إسم مسخدم"
|
||||
renotedBy: "أعاد {user} نشر ملاحظة"
|
||||
noNotes: "لم يتم العثور على أية ملاحظات"
|
||||
noNotifications: "ليس هناك أية اشعارات"
|
||||
instance: "مثيل الخادم"
|
||||
@ -26,7 +28,7 @@ login: "لِج"
|
||||
loggingIn: "جارٍ تسجيل الدخول"
|
||||
logout: "الخروج"
|
||||
signup: "أنشئ حسابًا"
|
||||
uploading: "عملية الإرسال جارية"
|
||||
uploading: "يرفع..."
|
||||
save: "حفظ"
|
||||
users: "المستخدمون"
|
||||
addUser: "اضافة مستخدم"
|
||||
@ -37,7 +39,7 @@ favorited: "تمت الإضافة إلى المفضلة."
|
||||
alreadyFavorited: "تمت إضافته بالفعل إلى المفضلة."
|
||||
cantFavorite: "تعذرت الإضافة إلى المفضلة."
|
||||
pin: "دبّسها على الصفحة الشخصية"
|
||||
unpin: "ألغ تثبيتها من ملفك الشخصي"
|
||||
unpin: "ألغ تدبيسها من ملفك الشخصي"
|
||||
copyContent: "انسخ المحتوى"
|
||||
copyLink: "انسخ الرابط"
|
||||
delete: "حذف"
|
||||
@ -63,13 +65,14 @@ files: "الملفات"
|
||||
download: "تنزيل"
|
||||
driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف."
|
||||
unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟"
|
||||
exportRequested: "قد تستغرق عملية التصدير بعض الوقت. بمجرد الانتهاء ستتم إضافة الملف الناتج إلى قرص التخزين."
|
||||
importRequested: "يستغرق الاستيراد بعض الوقت"
|
||||
lists: "القوائم"
|
||||
noLists: "ليس لديك أية قائمة"
|
||||
note: "ملاحظة"
|
||||
notes: "الملاحظات"
|
||||
following: "المتابَعون"
|
||||
followers: "المتابِعين"
|
||||
followers: "المتابِعون"
|
||||
followsYou: "يتابعك"
|
||||
createList: "إنشاء قائمة"
|
||||
manageLists: "إدارة القوائم"
|
||||
@ -82,7 +85,7 @@ serverIsDead: "الخادم لا يستجيب، حاول بعد قليل"
|
||||
youShouldUpgradeClient: "حدّث الصفحة لعرضها."
|
||||
enterListName: "اسم القائمة"
|
||||
privacy: "الخصوصية"
|
||||
makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك"
|
||||
makeFollowManuallyApprove: "قبول طلبات الإشتراك يدويا"
|
||||
defaultNoteVisibility: "مدى الرؤية الافتراضي"
|
||||
follow: "تابِع"
|
||||
followRequest: "طلب اشتراك"
|
||||
@ -90,7 +93,11 @@ followRequests: "طلبات الإشتراك"
|
||||
unfollow: "إلغاء الاشتراك"
|
||||
followRequestPending: "طلبات الإشتراك المعلّقة"
|
||||
enterEmoji: "أدخل إيموجي"
|
||||
renote: "أعد النشر"
|
||||
unrenote: "إلغاء مشاركة الملاحظة"
|
||||
renoted: "أُعيد نشره"
|
||||
cantRenote: "لا يمكن إعادة نشر الملاحظة"
|
||||
cantReRenote: "لا يمكنك إعادة نشر ملاحظة معاد نشرها"
|
||||
quote: "اقتبس"
|
||||
pinnedNote: "ملاحظة مدبسة"
|
||||
pinned: "دبّسها على الصفحة الشخصية"
|
||||
@ -99,9 +106,12 @@ clickToShow: "اضغط للعرض"
|
||||
sensitive: "محتوى حساس"
|
||||
add: "إضافة"
|
||||
reaction: "تفاعل"
|
||||
reactionSettingDescription: "اختر التفاعلات المفضلة التي تريد تثبيتها في منتقي التفاعلات."
|
||||
reactionSettingDescription2: "اسحب لإعادة التنظيم ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||
attachCancel: "أزل المرفق"
|
||||
markAsSensitive: "علّمه كمحتوى حساس"
|
||||
unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
||||
enterFileName: "ادخل اسم الملف"
|
||||
mute: "اكتم"
|
||||
unmute: "إلغاء الكتم"
|
||||
@ -111,8 +121,12 @@ suspend: "علِق"
|
||||
unsuspend: "ألغ التعليق"
|
||||
blockConfirm: "أمتأكد من حجب هذا الحساب؟"
|
||||
unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
|
||||
suspendConfirm: "أمتأكد من تعليق الحساب؟"
|
||||
unsuspendConfirm: "أمتأكد من إلغاء تعليق؟"
|
||||
selectList: "اختر قائمة"
|
||||
selectAntenna: "اختر هوائيًا"
|
||||
selectWidget: "اختر ودجة"
|
||||
editWidgets: "عدّل الودجات"
|
||||
editWidgetsExit: "تم"
|
||||
customEmojis: "إيموجي مخصص"
|
||||
emoji: "الوجوه التعبيرية"
|
||||
@ -122,6 +136,10 @@ emojiUrl: "رابط الوجه التعبيري"
|
||||
addEmoji: "إضافة إيموجي"
|
||||
settingGuide: "الإعدادات المستحسنة"
|
||||
cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة"
|
||||
flagAsBot: "علّمه كحساب آلي"
|
||||
flagAsBotDescription: "فعّل هذا الخيار إذا كان هذا الحساب يُدار عبر برمجية. إذا فُعل فسيكون بمثابة علامة للمطورين الآخرين لتجنب سلاسل لا متناعية من التفاعل بين حسابات الآلية وضبط أنظمة ميسكي للتعامل مع هذا الحساب كروبوت."
|
||||
flagAsCat: "علّم هذا الحساب كحساب قط"
|
||||
flagAsCatDescription: "فعّل هذا الخيار لوضع علامة على الحساب لتوضيح أنه حساب قط."
|
||||
autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة"
|
||||
addAccount: "أضف حساباً"
|
||||
loginFailed: "فشل الولوج"
|
||||
@ -165,6 +183,9 @@ statistics: "الإحصائيات"
|
||||
clearQueue: "تفريغ قائمة الإنتظار"
|
||||
clearQueueConfirmTitle: "أتريد مسح الطابور؟"
|
||||
clearCachedFiles: "امسح التخزين المؤقت"
|
||||
clearCachedFilesConfirm: "أتريد حذف التخزين المؤقت للملفات البعيدة؟"
|
||||
blockedInstances: "المثلاء المحجوبون"
|
||||
blockedInstancesDescription: "قائمة بالمثلاء التي تريد حظرها بحيث كل نطاق في سطر لوحده. بعد إدراجهم لن يتمكنوا من التفاعل مع هذا المثيل."
|
||||
muteAndBlock: "تم كتمها / تم حجبها"
|
||||
mutedUsers: "الحسابات التي تم كتمها"
|
||||
blockedUsers: "الحسابات التي تم حظرها"
|
||||
@ -191,7 +212,7 @@ usernameOrUserId: "اسم المستخدم أو معرّفه"
|
||||
noSuchUser: "لم يُعثَر على المستخدم"
|
||||
lookup: "البحث"
|
||||
announcements: "الإعلانات"
|
||||
imageUrl: "عنوان URL للصورة"
|
||||
imageUrl: "رابط الصورة"
|
||||
remove: "حذف"
|
||||
removed: "تم حذفه بنجاح"
|
||||
removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||
@ -199,11 +220,11 @@ deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
||||
saved: "تم حفظه"
|
||||
messaging: "المحادثة"
|
||||
upload: "تحميل"
|
||||
upload: "ارفع"
|
||||
fromDrive: "من المخزن"
|
||||
fromUrl: "من عنوان URL"
|
||||
uploadFromUrl: "التحميل عبر URL"
|
||||
uploadFromUrlDescription: "رابط الملف المراد تحميله "
|
||||
fromUrl: "عبر رابط"
|
||||
uploadFromUrl: "ارفع عبر رابط"
|
||||
uploadFromUrlDescription: "رابط الملف المراد رفعه"
|
||||
uploadFromUrlRequested: "الرفع مطلوب"
|
||||
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
|
||||
explore: "استكشاف"
|
||||
@ -248,7 +269,7 @@ unableToDelete: "لا يمكن حذفه"
|
||||
inputNewFileName: "ادخل الإسم الجديد للملف"
|
||||
inputNewFolderName: "ادخل الإسم الجديد للمجلد"
|
||||
hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه"
|
||||
copyUrl: "انسخ عنوان URL"
|
||||
copyUrl: "انسخ الرابط"
|
||||
rename: "إعادة التسمية"
|
||||
avatar: "الصورة الرمزية"
|
||||
banner: "الصورة الرأسية"
|
||||
@ -267,7 +288,7 @@ instanceName: "اسم مثيل الخادم"
|
||||
instanceDescription: "وصف مثيل الخادم"
|
||||
maintainerName: "المدير"
|
||||
maintainerEmail: "عنوان بريد المدير الإلكتروني"
|
||||
tosUrl: "عنوان URL لشروط الخدمة"
|
||||
tosUrl: "رابط صفحة شروط الخدمة"
|
||||
thisYear: "هذا العام"
|
||||
thisMonth: "هذا الشهر"
|
||||
today: "اليوم"
|
||||
@ -289,10 +310,10 @@ iconUrl: "رابط الأيقونة"
|
||||
bannerUrl: "رابط صورة اللافتة"
|
||||
backgroundImageUrl: "رابط صورة الخلفية"
|
||||
basicInfo: "المعلومات الأساسية "
|
||||
pinnedUsers: "المستخدمون المثبتون"
|
||||
pinnedUsersDescription: "قائمة المستخدمين المثبتين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده."
|
||||
pinnedPages: "الصفحات المثبتة"
|
||||
pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تثبيتها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده."
|
||||
pinnedUsers: "المستخدمون المدبسون"
|
||||
pinnedUsersDescription: "قائمة المستخدمين المدبسين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده."
|
||||
pinnedPages: "الصفحات المدبسة"
|
||||
pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تدبيسها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده."
|
||||
pinnedNotes: "ملاحظة مدبسة"
|
||||
hcaptchaSiteKey: "مفتاح الموقع"
|
||||
hcaptchaSecretKey: "المفتاح السري"
|
||||
@ -310,9 +331,11 @@ withFileAntenna: "ملاحظات تحوي ملفات فقط"
|
||||
caseSensitive: "حساسية حالة الأحرف"
|
||||
withReplies: "بالردود"
|
||||
notesAndReplies: "الملاحظات والردود"
|
||||
withFiles: "بالمرفقات"
|
||||
withFiles: "ذات مرفقات"
|
||||
silence: "اكتم"
|
||||
silenceConfirm: "أمتأكد من كتم هذا المستخدم؟"
|
||||
unsilence: "إلغاء الكتم"
|
||||
unsilenceConfirm: "أمتأكد من إلغاء كتم هذا المستخدم؟"
|
||||
popularUsers: "المستخدمون الشائعون"
|
||||
recentlyUpdatedUsers: "أصحاب النشاطات الأخيرة"
|
||||
recentlyRegisteredUsers: "المستخدمون المنضمون حديثًا"
|
||||
@ -339,14 +362,20 @@ newPasswordIs: "كلمتك السرية الجديدة هي {password}"
|
||||
reduceUiAnimation: "قلص تأثيرات الواجهة"
|
||||
share: "شارِك"
|
||||
notFound: "غير موجود"
|
||||
notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط."
|
||||
uploadFolder: "المجلد الافتراضي للرفع"
|
||||
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||
markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة"
|
||||
markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة"
|
||||
help: "المساعدة"
|
||||
inputMessageHere: "اكتب رسالتك هنا"
|
||||
close: "اغلق"
|
||||
group: "الفريق"
|
||||
groups: "الفِرَق"
|
||||
createGroup: "انشئ فريقًا"
|
||||
ownedGroups: "مجموعات المالك"
|
||||
joinedGroups: "المجموعات المنضم إليها"
|
||||
invites: "دعوة"
|
||||
groupName: "اسم الفريق"
|
||||
members: "الأعضاء"
|
||||
@ -360,13 +389,18 @@ next: "التالية"
|
||||
retype: "أعد الكتابة"
|
||||
noteOf: "ملاحظات {user}"
|
||||
inviteToGroup: "دعوة إلى فريق"
|
||||
maxNoteTextLength: "حد عدد المحارف لكل ملاحظة"
|
||||
quoteAttached: "اِقتُبسَ"
|
||||
noMessagesYet: "ليس هناك رسائل بعد"
|
||||
newMessageExists: "لقد تلقيت رسالة جديدة"
|
||||
onlyOneFileCanBeAttached: "يمكنك إرفاق ملف واحد بالرسالة"
|
||||
signinRequired: "رجاءً لِج"
|
||||
invitations: "دعوة"
|
||||
invitationCode: "رمز الدعوة"
|
||||
checking: "التحقق جارٍ"
|
||||
available: "متوفر"
|
||||
unavailable: "غير متوفر"
|
||||
usernameInvalidFormat: "يمكنك استخدام A-z، a-z، 0-9، _"
|
||||
tooShort: "قصير جدًا"
|
||||
tooLong: "طويل جدًا"
|
||||
weakPassword: "الكلمة السرية ضعيفة"
|
||||
@ -375,11 +409,15 @@ strongPassword: "الكلمة السرية قوية"
|
||||
passwordMatched: "التطابق صحيح!"
|
||||
passwordNotMatched: "غير متطابقتان"
|
||||
signinWith: "الولوج عبر {x}"
|
||||
signinFailed: "فشل الولوج، خطأ في اسم المستخدم أو كلمة المرور."
|
||||
or: "أو"
|
||||
language: "اللغة"
|
||||
uiLanguage: "لغة واجهة المستخدم"
|
||||
groupInvited: "دُعيت إلى مجموعة"
|
||||
aboutX: "عن {x}"
|
||||
useOsNativeEmojis: "استخدم الإيموجيات الخاصة بنظام التشغيل"
|
||||
youHaveNoGroups: "لا تمتلك أية فِرَق"
|
||||
joinOrCreateGroup: "احصل على دعوة لمجموعة أو أنشئ واحدة."
|
||||
noHistory: "السجل فارغ"
|
||||
signinHistory: "تاريخ تسجيل الدخول"
|
||||
doing: "انتظر لحظة"
|
||||
@ -387,8 +425,10 @@ category: "الفئات"
|
||||
tags: "الوسوم"
|
||||
docSource: "مصدر هذا المستند"
|
||||
createAccount: "أنشئ حسابًا"
|
||||
existingAccount: "الحسابات الموجودة"
|
||||
regenerate: "أعِد التوليد"
|
||||
fontSize: "حجم الخط"
|
||||
noFollowRequests: "ليس لديك طلبات متابعة معلقة"
|
||||
openImageInNewTab: "إفتح الصورة بصفحة جديدة"
|
||||
dashboard: "لوحة التحكم"
|
||||
local: "المحلي"
|
||||
@ -429,13 +469,17 @@ nothing: "لا يوجد شيء هنا"
|
||||
lastUsedDate: "آخر استخدام"
|
||||
state: "الحالة"
|
||||
sort: "ترتيب حسب"
|
||||
ascendingOrder: "تصاعدي"
|
||||
descendingOrder: "تنازلي"
|
||||
output: "الخارجة"
|
||||
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
|
||||
deleteAllFiles: "حذف كافة الملفات"
|
||||
deleteAllFilesConfirm: "أتريد حذف كل الملفات؟"
|
||||
removeAllFollowing: "ألغ متابعة كل المتابِعين"
|
||||
removeAllFollowing: "ألغ متابعة كل المتابَعين"
|
||||
userSuspended: "تم تعليق هذا المستخدم."
|
||||
userSilenced: "تم إسكات هذا المستخدم."
|
||||
yourAccountSuspendedTitle: "هذا الحساب معلق"
|
||||
menu: "القائمة"
|
||||
addItem: "إضافة عنصر"
|
||||
rooms: "الغرفة"
|
||||
relays: "المُرَحلات"
|
||||
@ -443,9 +487,15 @@ addRelay: "إضافة مُرحّل"
|
||||
addedRelays: "المرحلات التي تم إضافتها"
|
||||
deletedNote: "ملاحظة محذوفة"
|
||||
invisibleNote: "ملاحظة مخفية"
|
||||
enableInfiniteScroll: "فعّل التمرير المتواصل"
|
||||
visibility: "الظهور"
|
||||
poll: "استطلاع رأي"
|
||||
useCw: "إخفاء المحتوى"
|
||||
enablePlayer: "افتح مشغل الفيديو"
|
||||
disablePlayer: "أغلق مشغل الفيديو"
|
||||
themeEditor: "مصمم القوالب"
|
||||
description: "الوصف"
|
||||
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
|
||||
manage: "إدارة "
|
||||
plugins: "الإضافات"
|
||||
width: "العرض"
|
||||
@ -453,12 +503,14 @@ height: "الإرتفاع"
|
||||
large: "كبير"
|
||||
medium: "متوسط"
|
||||
small: "صغير"
|
||||
generateAccessToken: "ولّد رمز الوصول"
|
||||
permission: "أذونات"
|
||||
enableAll: "تشغيل الكل"
|
||||
disableAll: "تعطيل الكل"
|
||||
tokenRequested: "منح حق الوصول إلى الحساب"
|
||||
notificationType: "أنواع الإشعارات"
|
||||
edit: "التعديل"
|
||||
emailServer: "خادم البريد الإلكتروني"
|
||||
email: "البريد الإلكتروني "
|
||||
emailAddress: "عنوان البريد الالكتروني"
|
||||
smtpHost: "المضيف"
|
||||
@ -469,6 +521,12 @@ makeActive: "تفعيل"
|
||||
display: "المظهر"
|
||||
copy: "نسخ"
|
||||
metrics: "المقاييس"
|
||||
channel: "القنوات"
|
||||
create: "أنشئ"
|
||||
notificationSetting: "إعدادات التنبيهات"
|
||||
notificationSettingDesc: "اختر نوع التنبيهات المراد عرضها"
|
||||
other: "منوعات"
|
||||
regenerateLoginToken: "أعد توليد الرمز"
|
||||
fileIdOrUrl: "معرف الملف أو رابط"
|
||||
chatOpenBehavior: "سلوك نفاذة المحادثة عند فتحها"
|
||||
behavior: "السلوك"
|
||||
@ -476,7 +534,7 @@ sample: "مثال"
|
||||
abuseReports: "البلاغات"
|
||||
reportAbuse: "البلاغات"
|
||||
reportAbuseOf: "أبلغ عن {name}"
|
||||
fillAbuseReportDescription: "أكتب بالتفصيل سبب الإبلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها."
|
||||
fillAbuseReportDescription: "أكتب بالتفصيل سبب البلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها."
|
||||
abuseReported: "أُرسل البلاغ، شكرًا لك"
|
||||
send: "أرسل"
|
||||
abuseMarkAsResolved: "علّم البلاغ كمحلول"
|
||||
@ -494,7 +552,9 @@ manageAccessTokens: "إدارة رموز الوصول"
|
||||
accountInfo: "معلومات الحساب"
|
||||
notesCount: "عدد الملاحظات"
|
||||
repliesCount: "عدد الردود المرسلة"
|
||||
renotesCount: "عدد الملاحظات المعاد نشرها (المرسلة)"
|
||||
repliedCount: "عدد الردود المستلمة"
|
||||
renotedCount: "عدد الملاحظات المعاد نشرها (المستلمة)"
|
||||
followingCount: "عدد الحسابات المتابَعة"
|
||||
followersCount: "عدد المتابِعين"
|
||||
sentReactionsCount: "عدد الانفعالات المرسلة"
|
||||
@ -503,33 +563,141 @@ pollVotesCount: "عدد الاستطلاعات المرسلة"
|
||||
pollVotedCount: "عدد الاستطلاعات المستلمة"
|
||||
yes: "نعم"
|
||||
no: "لا"
|
||||
driveFilesCount: "عدد الملفات في قرص التخزين"
|
||||
useSystemFont: "استخدم الخط الافتراضية للنظام"
|
||||
experimentalFeatures: "ميّزات اختبارية"
|
||||
developer: "المطور"
|
||||
clearCache: "امسح التخزين المؤقت"
|
||||
currentVersion: "الإصدار الحالي"
|
||||
latestVersion: "آخر نسخة مستقرة"
|
||||
usageAmount: "الإستخدام"
|
||||
capacity: "السعة"
|
||||
inUse: "مستخدم"
|
||||
useReactionPickerForContextMenu: "افتح منتقي التفاعلات عند التقر بالزر الأيمن"
|
||||
typingUsers: "{users} يكتب(ون)..."
|
||||
jumpToSpecifiedDate: "انتقل إلى التاريخ المحدد"
|
||||
showingPastTimeline: "أنت تستعرض حاليًا خيطًا زمنيًا قديمًا"
|
||||
markAllAsRead: "علّم الكل كمقروء"
|
||||
goBack: "رجوع"
|
||||
unlikeConfirm: "أتريد إلغاء إعجابك؟"
|
||||
fullView: "ملء الشاشة"
|
||||
quitFullView: "اخرج من وضع ملء للشاشة"
|
||||
addDescription: "أضف وصفًا"
|
||||
info: "عن"
|
||||
userInfo: "معلومات المستخدم"
|
||||
unknown: "مجهول"
|
||||
onlineStatus: "الحالة"
|
||||
hideOnlineStatus: "اخف الحالة"
|
||||
online: "متصل"
|
||||
active: "نشط"
|
||||
offline: "غير متصل"
|
||||
notRecommended: "غير مستحسن"
|
||||
botProtection: "الحماية من الحسابات الآلية"
|
||||
instanceBlocking: "المثيلات المحجوبة"
|
||||
selectAccount: "اختر حسابًا"
|
||||
enabled: "مفعّل"
|
||||
disabled: "معطّل"
|
||||
quickAction: "الإجراءات السّريعة"
|
||||
user: "المستخدمون"
|
||||
administration: "إدارة "
|
||||
accounts: "الحسابات"
|
||||
switch: "بدّل"
|
||||
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
|
||||
configure: "اضبط"
|
||||
postToGallery: "انشر في المعرض"
|
||||
gallery: "المعرض"
|
||||
recentPosts: "المشاركات الحديثة"
|
||||
shareWithNote: "شاركه في ملاحظة"
|
||||
ads: "الإعلانات"
|
||||
expiration: "ينتهي استطلاع الرأي في"
|
||||
priority: "الأولوية"
|
||||
high: "عالية"
|
||||
middle: "متوسط"
|
||||
low: "منخفضة"
|
||||
emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا"
|
||||
ratio: "النسبة"
|
||||
previewNoteText: "اعرض معاينة"
|
||||
customCss: "CSS مخصصة"
|
||||
global: "الشامل"
|
||||
squareAvatars: "اعرض شكل الصور الرمزية كمربعات"
|
||||
sent: "أرسل"
|
||||
received: "اُستلم"
|
||||
searchResult: "نتائج البحث"
|
||||
hashtags: "الوسوم"
|
||||
learnMore: "راجع المزيد"
|
||||
misskeyUpdated: "حُدث ميسكي!"
|
||||
whatIsNew: "اعرض التغييرات"
|
||||
translate: "ترجم"
|
||||
translatedFrom: "تُرجم من {x}"
|
||||
accountDeletionInProgress: "حذف الحساب جارٍ"
|
||||
usernameInfo: "الاسم الذي يميزك عن بافي مستخدمي هذا الخادم، يمكنك استخدام الحروف اللاتينية (a~z, A~Z) والأرقام (0~9) والشرطة السفلية (_). لا يمكنك تغييره بعد تسجيله."
|
||||
lastCommunication: "آخر تواصل"
|
||||
itsOn: "مفعّل"
|
||||
itsOff: "معطّل"
|
||||
emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل"
|
||||
filter: "رشّح"
|
||||
controlPanel: "لوحة التحكم"
|
||||
manageAccounts: "إدارة الحسابات"
|
||||
makeReactionsPublic: "اجعل سجل التفاعلات علنيًا"
|
||||
makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك مرئية للعلن."
|
||||
classic: "تقليدي"
|
||||
_docs:
|
||||
admin: "إدارة "
|
||||
_gallery:
|
||||
unlike: "أزل الإعجاب"
|
||||
_email:
|
||||
_follow:
|
||||
title: "يتابعك"
|
||||
_registry:
|
||||
keys: "المفاتيح"
|
||||
domain: "النّطاق"
|
||||
createKey: "أنشئ مفتاحًا"
|
||||
_aboutMisskey:
|
||||
about: "ميسكي هو برمجية مفتوحة المصدر يطورها syuilo منذ 2014."
|
||||
contributors: "المساهم الرئيسي"
|
||||
allContributors: "كل المساهمين"
|
||||
source: "الشفرة المصدرية"
|
||||
translation: "ترجم ميسكي"
|
||||
donate: "تبرع لميسكي"
|
||||
morePatrons: "نحن نقدر الدعم الذي قدمه العديد من الأشخاص الذين لم نذكرهم. شكرًا لكم 🥰"
|
||||
patrons: "الداعمون"
|
||||
_nsfw:
|
||||
force: "اخف كل الوسائط"
|
||||
_mfm:
|
||||
mention: "أشر الى"
|
||||
hashtag: "الوسوم"
|
||||
url: "الرابط"
|
||||
urlDescription: "يمكن عرض الروابط"
|
||||
link: "رابط"
|
||||
bold: "عريض"
|
||||
small: "صغير"
|
||||
quote: "اقتبس"
|
||||
emoji: "إيموجي مخصص"
|
||||
search: "البحث"
|
||||
_reversi:
|
||||
gameSettings: "إعدادات اللعبة"
|
||||
chooseBoard: "اختر اللوح"
|
||||
blackOrWhite: "أسود/أبيض"
|
||||
blackIs: "{name} سيلعب بالأسود"
|
||||
botSettings: "خيارات الحسابات الآلية"
|
||||
waitingBoth: "استعد"
|
||||
ready: "جاهز"
|
||||
cancelReady: "ألغ الجهوزية"
|
||||
opponentTurn: "دور الخصم"
|
||||
myTurn: "دورك"
|
||||
turnOf: "دور {name}"
|
||||
pastTurnOf: "دور {name}"
|
||||
surrender: "استسلم"
|
||||
drawn: "تعادل"
|
||||
won: "فاز {name}"
|
||||
black: "أسود"
|
||||
white: "أبيض"
|
||||
total: "المجموع"
|
||||
turnCount: "الدور {count}"
|
||||
myGames: "جولاتي"
|
||||
allGames: "كل الجولات"
|
||||
ended: "انتهت"
|
||||
playing: "يُلعب الآن"
|
||||
_channel:
|
||||
featured: "المتداوَلة"
|
||||
_menuDisplay:
|
||||
@ -539,11 +707,15 @@ _theme:
|
||||
install: "تنصيب قالب"
|
||||
manage: "إدارة القوالب"
|
||||
code: "شيفرة القالب"
|
||||
description: "الوصف"
|
||||
installed: "تم تنصيب {name}"
|
||||
make: "إنشاء قالب"
|
||||
alpha: "الشفافية"
|
||||
keys:
|
||||
link: "رابط"
|
||||
hashtag: "وسم"
|
||||
mention: "أشر الى"
|
||||
renote: "أعد النشر"
|
||||
messageBg: "خلفية المحادثة"
|
||||
_sfx:
|
||||
note: "الملاحظات"
|
||||
@ -569,11 +741,35 @@ _time:
|
||||
_tutorial:
|
||||
title: "كيف تستخدم Misskey"
|
||||
step1_1: "مرحبًا!"
|
||||
step1_2: "تدعى هذه الصفحة 'الخيط الزمني' وهي تحوي ملاحظات الأشخاص الذي تتابعهم مرتبة حسب تاريخ نشرها."
|
||||
step1_3: "خيطك الزمني فارغ حاليًا بما أنك لا تتابع أي شخص ولم تنشر أي ملاحظة."
|
||||
step2_1: "لننهي إعداد ملفك الشخصي قبل كتابة ملاحظة أو متابعة أشخاص."
|
||||
step3_1: "هل أنهيت إعداد حسابك؟"
|
||||
step3_2: "إذا تاليًا للنشر ملاحظة. أنقر على أيقونة القلم في أعلى الشاشة"
|
||||
step5_3: "لمتابعة مستخدمين ادخل ملفهم الشخصي بالنقر على صورتهم الشخصية ثم اضغط زر 'تابع'."
|
||||
_2fa:
|
||||
registerKey: "تسجيل مفتاح أمان جديد"
|
||||
_permissions:
|
||||
"read:account": "اعرض معلومات حسابك"
|
||||
"write:account": "تعديل معلومات حسابك"
|
||||
"read:blocks": "اعرض قائمة المستخدمين المحجوبين"
|
||||
"write:blocks": "عدّل قائمة المستخدمين المحجوبين"
|
||||
"read:drive": "تصفح قرص التخزين"
|
||||
"write:drive": "احذف أو عدّل محتويات قرص التخزين"
|
||||
"read:favorites": "اعرض المفضلة"
|
||||
"write:favorites": "عدّل المفضلة"
|
||||
"read:notifications": "اظهر الإشعارات"
|
||||
"read:reactions": "اعرض تفاعلاتك"
|
||||
"write:reactions": "عدّل تفاعلاتك"
|
||||
"write:votes": "صوّت"
|
||||
"read:pages": "اعرض صفحاتك"
|
||||
"write:pages": "عدّل أو احذف صفحاتك"
|
||||
"read:user-groups": "اعرض مجموعات المستخدمين"
|
||||
"write:user-groups": "عدّل أو احذف مجموعات المستخدمين"
|
||||
"read:gallery": "اعرض المعرض"
|
||||
"write:gallery": "عدّل المعرض"
|
||||
_auth:
|
||||
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
|
||||
_weekday:
|
||||
sunday: "الأحد"
|
||||
monday: "الإثنين"
|
||||
@ -624,39 +820,74 @@ _poll:
|
||||
_visibility:
|
||||
public: "للعامة"
|
||||
home: "الرئيسي"
|
||||
followers: "المتابِعين"
|
||||
followers: "المتابِعون"
|
||||
specified: "مباشرة"
|
||||
localOnly: "المحلي فقط"
|
||||
_postForm:
|
||||
replyPlaceholder: "رد على هذه الملاحظة…"
|
||||
quotePlaceholder: "اقتبس هذه الملاحظة…"
|
||||
channelPlaceholder: "انشر في قناة..."
|
||||
_placeholders:
|
||||
c: "ما الذي تفكر فيه؟"
|
||||
d: "ما الذي تريد قوله؟"
|
||||
e: "أكتب..."
|
||||
_profile:
|
||||
name: "الإسم"
|
||||
username: "اسم المستخدم"
|
||||
description: "السيرة"
|
||||
youCanIncludeHashtags: "يمكنك أيضًا إضافة وسوم إلى نبذتك التعريفية."
|
||||
metadata: "معلومات إضافية"
|
||||
metadataEdit: "عدّل المعلومات الإضافية"
|
||||
metadataDescription: "يُمكنك عرض 4 حقول معلومات في ملفك الشخصي"
|
||||
metadataLabel: "التسمية"
|
||||
metadataContent: "المحتوى"
|
||||
changeAvatar: "غيّر الصورة الرمزية"
|
||||
changeBanner: "غيّر اللافتة"
|
||||
_exportOrImport:
|
||||
allNotes: "كل الملاحظات"
|
||||
followingList: "المتابَعون"
|
||||
muteList: "اكتم"
|
||||
blockingList: "احجب"
|
||||
muteList: "المستخدمون المكتومون"
|
||||
blockingList: "المستخدمون المحجوبون"
|
||||
userLists: "القوائم"
|
||||
_charts:
|
||||
usersTotal: "مجموع عدد المستخدمين والمستخدمات"
|
||||
activeUsers: "المستخدمون النشطون"
|
||||
notesTotal: "إجمالي الملاحظات"
|
||||
_timelines:
|
||||
home: "الرئيسي"
|
||||
local: "المحلي"
|
||||
social: "الاجتماعي"
|
||||
global: "الشامل"
|
||||
_rooms:
|
||||
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
|
||||
chooseImage: "اختر صورة"
|
||||
roomType: "نوع الغرفة"
|
||||
_roomType:
|
||||
default: "افتراضي"
|
||||
washitsu: "الأسلوب الياباني"
|
||||
_furnitures:
|
||||
milk: "علبة حليب"
|
||||
bed: "سرير"
|
||||
low-table: "طاولة قصيرة"
|
||||
desk: "مكتب"
|
||||
chair: "كرسي"
|
||||
chair2: "كرسي 2"
|
||||
pc: "حاسوب"
|
||||
monitor: "شاشة التحكم"
|
||||
banknote: "أوراق نقدية"
|
||||
_pages:
|
||||
viewPage: "اعرض صفحاتك"
|
||||
like: "أعجبني"
|
||||
unlike: "أزل الإعجاب"
|
||||
my: "صفحاتي"
|
||||
blocks:
|
||||
image: "الصور"
|
||||
_post:
|
||||
text: "المحتوى"
|
||||
_button:
|
||||
_action:
|
||||
_dialog:
|
||||
content: "المحتوى"
|
||||
script:
|
||||
categories:
|
||||
list: "القوائم"
|
||||
@ -685,9 +916,11 @@ _notification:
|
||||
youGotMessagingMessageFromUser: "لقد تلقيت رسالة مِن {name}"
|
||||
youGotMessagingMessageFromGroup: "لقد أرسِلَت رسالة إلى الفريق {name}"
|
||||
youWereFollowed: "يتابعك"
|
||||
youWereInvitedToGroup: "دُعيت إلى مجموعة"
|
||||
_types:
|
||||
follow: "المتابَعون"
|
||||
mention: "أشر الى"
|
||||
renote: "أعد النشر"
|
||||
quote: "اقتبس"
|
||||
reaction: "تفاعل"
|
||||
_deck:
|
||||
|
@ -799,6 +799,8 @@ manageAccounts: "Benutzerkonten verwalten"
|
||||
makeReactionsPublic: "Reaktionsverlauf veröffentlichen"
|
||||
makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktionen einsehen können."
|
||||
classic: "Classic"
|
||||
muteThread: "Thread stummschalten"
|
||||
unmuteThread: "Threadstummschaltung aufheben"
|
||||
_signup:
|
||||
almostThere: "Fast geschafft"
|
||||
emailAddressInfo: "Bitte gib deine Email-Adresse ein."
|
||||
|
@ -800,6 +800,8 @@ manageAccounts: "Manage Accounts"
|
||||
makeReactionsPublic: "Set reaction history to public"
|
||||
makeReactionsPublicDescription: "This will make the list of all your past reactions publicly visible."
|
||||
classic: "Classic"
|
||||
muteThread: "Mute thread"
|
||||
unmuteThread: "Unmute thread"
|
||||
_signup:
|
||||
almostThere: "Almost there"
|
||||
emailAddressInfo: "Please enter your email address."
|
||||
|
@ -543,6 +543,7 @@ learnMore: "Lernu pli"
|
||||
translate: "Traduki"
|
||||
translatedFrom: "Tradukita el {x}"
|
||||
controlPanel: "Ŝaltpodio"
|
||||
classic: "Klasika"
|
||||
_docs:
|
||||
continueReading: "Legi plu"
|
||||
features: "Funkcioj"
|
||||
|
@ -19,9 +19,11 @@ const languages = [
|
||||
'da-DK',
|
||||
'de-DE',
|
||||
'en-US',
|
||||
'eo-UY',
|
||||
'es-ES',
|
||||
'fr-FR',
|
||||
'id-ID',
|
||||
'it-IT',
|
||||
'ja-JP',
|
||||
'ja-KS',
|
||||
'kab-KAB',
|
||||
|
@ -620,6 +620,8 @@ reportAbuse: "通報"
|
||||
reportAbuseOf: "{name}を通報する"
|
||||
fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。"
|
||||
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
|
||||
reporteeOrigin: "通報先"
|
||||
reporterOrigin: "通報元"
|
||||
send: "送信"
|
||||
abuseMarkAsResolved: "対応済みにする"
|
||||
openInNewTab: "新しいタブで開く"
|
||||
@ -800,6 +802,8 @@ manageAccounts: "アカウントを管理"
|
||||
makeReactionsPublic: "リアクション一覧を公開する"
|
||||
makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見れるようにします。"
|
||||
classic: "クラシック"
|
||||
muteThread: "スレッドをミュート"
|
||||
unmuteThread: "スレッドのミュートを解除"
|
||||
|
||||
_signup:
|
||||
almostThere: "ほとんど完了です"
|
||||
@ -814,14 +818,6 @@ _accountDelete:
|
||||
started: "削除処理が開始されました。"
|
||||
inProgress: "削除が進行中"
|
||||
|
||||
_docs:
|
||||
continueReading: "続きを読む"
|
||||
features: "機能"
|
||||
generalTopics: "一般的なトピック"
|
||||
advancedTopics: "高度なトピック"
|
||||
admin: "管理"
|
||||
translateWarn: "このドキュメントは翻訳されたものです。オリジナルとは内容が異なる場合があります。"
|
||||
|
||||
_ad:
|
||||
back: "戻る"
|
||||
reduceFrequencyOfThisAd: "この広告の表示頻度を下げる"
|
||||
|
26
migration/1635500777168-note-thread-mute.ts
Normal file
26
migration/1635500777168-note-thread-mute.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import {MigrationInterface, QueryRunner} from "typeorm";
|
||||
|
||||
export class noteThreadMute1635500777168 implements MigrationInterface {
|
||||
name = 'noteThreadMute1635500777168'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`CREATE TABLE "note_thread_muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "threadId" character varying(256) NOT NULL, CONSTRAINT "PK_ec5936d94d1a0369646d12a3a47" PRIMARY KEY ("id"))`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_29c11c7deb06615076f8c95b80" ON "note_thread_muting" ("userId") `);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_c426394644267453e76f036926" ON "note_thread_muting" ("threadId") `);
|
||||
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_ae7aab18a2641d3e5f25e0c4ea" ON "note_thread_muting" ("userId", "threadId") `);
|
||||
await queryRunner.query(`ALTER TABLE "note" ADD "threadId" character varying(256)`);
|
||||
await queryRunner.query(`CREATE INDEX "IDX_d4ebdef929896d6dc4a3c5bb48" ON "note" ("threadId") `);
|
||||
await queryRunner.query(`ALTER TABLE "note_thread_muting" ADD CONSTRAINT "FK_29c11c7deb06615076f8c95b80a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "note_thread_muting" DROP CONSTRAINT "FK_29c11c7deb06615076f8c95b80a"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_d4ebdef929896d6dc4a3c5bb48"`);
|
||||
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "threadId"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_ae7aab18a2641d3e5f25e0c4ea"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_c426394644267453e76f036926"`);
|
||||
await queryRunner.query(`DROP INDEX "public"."IDX_29c11c7deb06615076f8c95b80"`);
|
||||
await queryRunner.query(`DROP TABLE "note_thread_muting"`);
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"version": "12.94.1",
|
||||
"version": "12.95.0",
|
||||
"codename": "indigo",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -57,7 +57,6 @@
|
||||
"@types/jsdom": "16.2.13",
|
||||
"@types/jsonld": "1.5.6",
|
||||
"@types/katex": "0.11.1",
|
||||
"@types/markdown-it": "12.2.3",
|
||||
"@types/matter-js": "0.17.6",
|
||||
"@types/mocha": "8.2.3",
|
||||
"@types/node": "16.11.4",
|
||||
@ -147,8 +146,6 @@
|
||||
"jsrsasign": "8.0.20",
|
||||
"katex": "0.13.18",
|
||||
"langmap": "0.0.16",
|
||||
"markdown-it": "12.2.0",
|
||||
"markdown-it-anchor": "7.1.0",
|
||||
"matter-js": "0.17.1",
|
||||
"mfm-js": "0.20.0",
|
||||
"misskey-js": "0.0.8",
|
||||
|
@ -61,7 +61,7 @@ export async function signout() {
|
||||
document.cookie = `igi=; path=/`;
|
||||
|
||||
if (accounts.length > 0) login(accounts[0].token);
|
||||
else unisonReload();
|
||||
else unisonReload('/');
|
||||
}
|
||||
|
||||
export async function getAccounts(): Promise<{ id: Account['id'], token: Account['token'] }[]> {
|
||||
@ -122,7 +122,9 @@ export async function login(token: Account['token'], redirect?: string) {
|
||||
await addAccount(me.id, token);
|
||||
|
||||
if (redirect) {
|
||||
reloadChannel.postMessage('reload');
|
||||
// 他のタブは再読み込みするだけ
|
||||
reloadChannel.postMessage(null);
|
||||
// このページはredirectで指定された先に移動
|
||||
location.href = redirect;
|
||||
return;
|
||||
}
|
||||
|
@ -7,21 +7,21 @@
|
||||
>
|
||||
<template #header>{{ $ts.forgotPassword }}</template>
|
||||
|
||||
<form class="_monolithic_" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
||||
<div class="_section">
|
||||
<MkInput v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
||||
<form class="bafeceda" @submit.prevent="onSubmit" v-if="$instance.enableEmail">
|
||||
<div class="main _formRoot">
|
||||
<MkInput class="_formBlock" v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
|
||||
<template #label>{{ $ts.username }}</template>
|
||||
<template #prefix>@</template>
|
||||
</MkInput>
|
||||
|
||||
<MkInput v-model="email" type="email" spellcheck="false" required>
|
||||
<MkInput class="_formBlock" v-model="email" type="email" spellcheck="false" required>
|
||||
<template #label>{{ $ts.emailAddress }}</template>
|
||||
<template #caption>{{ $ts._forgotPassword.enterEmail }}</template>
|
||||
</MkInput>
|
||||
|
||||
<MkButton type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
||||
<MkButton class="_formBlock" type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ $ts.send }}</MkButton>
|
||||
</div>
|
||||
<div class="_section">
|
||||
<div class="sub">
|
||||
<MkA to="/about" class="_link">{{ $ts._forgotPassword.ifNoEmail }}</MkA>
|
||||
</div>
|
||||
</form>
|
||||
@ -69,3 +69,16 @@ export default defineComponent({
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.bafeceda {
|
||||
> .main {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
> .sub {
|
||||
border-top: solid 0.5px var(--divider);
|
||||
padding: 24px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@ -150,26 +150,26 @@ export default defineComponent({
|
||||
});
|
||||
};
|
||||
|
||||
for (const optionOrOptgroup of options) {
|
||||
if (optionOrOptgroup.type === 'optgroup') {
|
||||
const optgroup = optionOrOptgroup;
|
||||
menu.push({
|
||||
type: 'label',
|
||||
text: optgroup.props.label,
|
||||
});
|
||||
for (const option of optgroup.children) {
|
||||
const scanOptions = (options: VNode[]) => {
|
||||
for (const vnode of options) {
|
||||
if (vnode.type === 'optgroup') {
|
||||
const optgroup = vnode;
|
||||
menu.push({
|
||||
type: 'label',
|
||||
text: optgroup.props.label,
|
||||
});
|
||||
scanOptions(optgroup.children);
|
||||
} else if (Array.isArray(vnode.children)) { // 何故かフラグメントになってくることがある
|
||||
const fragment = vnode;
|
||||
scanOptions(fragment.children);
|
||||
} else {
|
||||
const option = vnode;
|
||||
pushOption(option);
|
||||
}
|
||||
} else if (Array.isArray(optionOrOptgroup.children)) { // 何故かフラグメントになってくることがある
|
||||
const fragment = optionOrOptgroup;
|
||||
for (const option of fragment.children) {
|
||||
pushOption(option);
|
||||
}
|
||||
} else {
|
||||
const option = optionOrOptgroup;
|
||||
pushOption(option);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
scanOptions(options);
|
||||
|
||||
os.popupMenu(menu, container.value, {
|
||||
width: container.value.offsetWidth,
|
||||
|
@ -16,10 +16,10 @@
|
||||
</template>
|
||||
</div>
|
||||
<div class="sub">
|
||||
<MkA to="/docs" @click.passive="close()" v-click-anime>
|
||||
<a href="https://misskey-hub.net/help.html" target="_blank" @click.passive="close()" v-click-anime>
|
||||
<i class="fas fa-question-circle icon"></i>
|
||||
<div class="text">{{ $ts.help }}</div>
|
||||
</MkA>
|
||||
</a>
|
||||
<MkA to="/about" @click.passive="close()" v-click-anime>
|
||||
<i class="fas fa-info-circle icon"></i>
|
||||
<div class="text">{{ $t('aboutX', { x: instanceName }) }}</div>
|
||||
|
@ -11,6 +11,7 @@
|
||||
:title="video.name"
|
||||
preload="none"
|
||||
controls
|
||||
@contextmenu.stop
|
||||
>
|
||||
<source
|
||||
:src="video.url"
|
||||
|
@ -1,13 +1,12 @@
|
||||
<template>
|
||||
<MkA class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" v-if="url.startsWith('/')">
|
||||
<span class="me" v-if="isMe">{{ $ts.you }}</span>
|
||||
<MkA v-if="url.startsWith('/')" class="ldlomzub" :class="{ isMe }" :to="url" v-user-preview="canonical" :style="{ background: bg }">
|
||||
<img class="icon" :src="`/avatar/@${username}@${host}`" alt="">
|
||||
<span class="main">
|
||||
<span class="username">@{{ username }}</span>
|
||||
<span class="host" v-if="(host != localHost) || $store.state.showFullAcct">@{{ toUnicode(host) }}</span>
|
||||
</span>
|
||||
</MkA>
|
||||
<a class="ldlomzub" :href="url" target="_blank" rel="noopener" v-else>
|
||||
<a v-else class="ldlomzub" :href="url" target="_blank" rel="noopener" :style="{ background: bg }">
|
||||
<span class="main">
|
||||
<span class="username">@{{ username }}</span>
|
||||
<span class="host">@{{ toUnicode(host) }}</span>
|
||||
@ -17,10 +16,11 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { toUnicode } from 'punycode/';
|
||||
import * as tinycolor from 'tinycolor2';
|
||||
import { toUnicode } from 'punycode';
|
||||
import { host as localHost } from '@client/config';
|
||||
import { wellKnownServices } from '../../well-known-services';
|
||||
import * as os from '@client/os';
|
||||
import { $i } from '@client/account';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -33,53 +33,46 @@ export default defineComponent({
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
||||
setup(props) {
|
||||
const canonical = props.host === localHost ? `@${props.username}` : `@${props.username}@${toUnicode(props.host)}`;
|
||||
|
||||
const wellKnown = wellKnownServices.find(x => x[0] === props.host);
|
||||
const url = wellKnown ? wellKnown[1](props.username) : `/${canonical}`;
|
||||
|
||||
const isMe = $i && (
|
||||
`@${props.username}@${toUnicode(props.host)}` === `@${$i.username}@${toUnicode(localHost)}`.toLowerCase()
|
||||
);
|
||||
|
||||
const bg = tinycolor(getComputedStyle(document.documentElement).getPropertyValue(isMe ? '--mentionMe' : '--mention'));
|
||||
bg.setAlpha(0.1);
|
||||
|
||||
return {
|
||||
localHost
|
||||
localHost,
|
||||
isMe,
|
||||
url,
|
||||
canonical,
|
||||
toUnicode,
|
||||
bg: bg.toRgbString(),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
url(): string {
|
||||
const wellKnown = wellKnownServices.find(x => x[0] === this.host);
|
||||
if (wellKnown) {
|
||||
return wellKnown[1](this.username);
|
||||
} else {
|
||||
return `/${this.canonical}`;
|
||||
}
|
||||
},
|
||||
canonical(): string {
|
||||
return this.host === localHost ? `@${this.username}` : `@${this.username}@${toUnicode(this.host)}`;
|
||||
},
|
||||
isMe(): boolean {
|
||||
return this.$i && (
|
||||
`@${this.username}@${toUnicode(this.host)}` === `@${this.$i.username}@${toUnicode(localHost)}`.toLowerCase()
|
||||
);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toUnicode
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.ldlomzub {
|
||||
display: inline-block;
|
||||
padding: 4px 8px 4px 4px;
|
||||
border-radius: 999px;
|
||||
color: var(--mention);
|
||||
|
||||
&.isMe {
|
||||
color: var(--mentionMe);
|
||||
}
|
||||
|
||||
> .me {
|
||||
pointer-events: none;
|
||||
user-select: none;
|
||||
font-size: 70%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
> .icon {
|
||||
width: 1.5em;
|
||||
margin: 0 0.2em;
|
||||
margin: 0 0.2em 0 0;
|
||||
vertical-align: bottom;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import MkGoogle from '@client/components/google.vue';
|
||||
import MkSparkle from '@client/components/sparkle.vue';
|
||||
import MkA from '@client/components/global/a.vue';
|
||||
import { host } from '@client/config';
|
||||
import { fnNameList } from '@/mfm/fn-name-list';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@ -46,7 +47,7 @@ export default defineComponent({
|
||||
render() {
|
||||
if (this.text == null || this.text == '') return;
|
||||
|
||||
const ast = (this.plain ? mfm.parsePlain : mfm.parse)(this.text);
|
||||
const ast = (this.plain ? mfm.parsePlain : mfm.parse)(this.text, { fnNameList });
|
||||
|
||||
const validTime = (t: string | null | undefined) => {
|
||||
if (t == null) return null;
|
||||
|
@ -601,6 +601,12 @@ export default defineComponent({
|
||||
});
|
||||
},
|
||||
|
||||
toggleThreadMute(mute: boolean) {
|
||||
os.apiWithDialog(mute ? 'notes/thread-muting/create' : 'notes/thread-muting/delete', {
|
||||
noteId: this.appearNote.id
|
||||
});
|
||||
},
|
||||
|
||||
getMenu() {
|
||||
let menu;
|
||||
if (this.$i) {
|
||||
@ -657,6 +663,15 @@ export default defineComponent({
|
||||
text: this.$ts.watch,
|
||||
action: () => this.toggleWatch(true)
|
||||
}) : undefined,
|
||||
statePromise.then(state => state.isMutedThread ? {
|
||||
icon: 'fas fa-comment-slash',
|
||||
text: this.$ts.unmuteThread,
|
||||
action: () => this.toggleThreadMute(false)
|
||||
} : {
|
||||
icon: 'fas fa-comment-slash',
|
||||
text: this.$ts.muteThread,
|
||||
action: () => this.toggleThreadMute(true)
|
||||
}),
|
||||
this.appearNote.userId == this.$i.id ? (this.$i.pinnedNoteIds || []).includes(this.appearNote.id) ? {
|
||||
icon: 'fas fa-thumbtack',
|
||||
text: this.$ts.unpin,
|
||||
|
@ -576,6 +576,12 @@ export default defineComponent({
|
||||
});
|
||||
},
|
||||
|
||||
toggleThreadMute(mute: boolean) {
|
||||
os.apiWithDialog(mute ? 'notes/thread-muting/create' : 'notes/thread-muting/delete', {
|
||||
noteId: this.appearNote.id
|
||||
});
|
||||
},
|
||||
|
||||
getMenu() {
|
||||
let menu;
|
||||
if (this.$i) {
|
||||
@ -632,6 +638,15 @@ export default defineComponent({
|
||||
text: this.$ts.watch,
|
||||
action: () => this.toggleWatch(true)
|
||||
}) : undefined,
|
||||
statePromise.then(state => state.isMutedThread ? {
|
||||
icon: 'fas fa-comment-slash',
|
||||
text: this.$ts.unmuteThread,
|
||||
action: () => this.toggleThreadMute(false)
|
||||
} : {
|
||||
icon: 'fas fa-comment-slash',
|
||||
text: this.$ts.muteThread,
|
||||
action: () => this.toggleThreadMute(true)
|
||||
}),
|
||||
this.appearNote.userId == this.$i.id ? (this.$i.pinnedNoteIds || []).includes(this.appearNote.id) ? {
|
||||
icon: 'fas fa-thumbtack',
|
||||
text: this.$ts.unpin,
|
||||
|
@ -147,6 +147,8 @@ export default defineComponent({
|
||||
.rrevdjwt {
|
||||
padding: 8px 0;
|
||||
min-width: 200px;
|
||||
max-height: 90vh;
|
||||
overflow: auto;
|
||||
|
||||
&.center {
|
||||
> .item {
|
||||
|
@ -30,7 +30,7 @@ export default defineComponent({
|
||||
methods: {
|
||||
whatIsNew() {
|
||||
this.$refs.modal.close();
|
||||
this.$router.push('/docs/general/changelog');
|
||||
window.open(`https://misskey-hub.net/docs/releases.html#_${version.replace(/\./g, '-')}`, '_blank');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -37,6 +37,8 @@ import { isMobile } from '@client/scripts/is-mobile';
|
||||
import { initializeSw } from '@client/scripts/initialize-sw';
|
||||
import { reloadChannel } from '@client/scripts/unison-reload';
|
||||
import { reactionPicker } from '@client/scripts/reaction-picker';
|
||||
import { getUrlWithoutLoginId } from '@client/scripts/login-id';
|
||||
import { getAccountFromId } from '@client/scripts/get-account-from-id';
|
||||
|
||||
console.info(`Misskey v${version}`);
|
||||
|
||||
@ -91,7 +93,10 @@ if (defaultStore.state.reportError && !_DEV_) {
|
||||
document.addEventListener('touchend', () => {}, { passive: true });
|
||||
|
||||
// 一斉リロード
|
||||
reloadChannel.addEventListener('message', () => location.reload());
|
||||
reloadChannel.addEventListener('message', path => {
|
||||
if (path !== null) location.href = path;
|
||||
else location.reload();
|
||||
});
|
||||
|
||||
//#region SEE: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
|
||||
// TODO: いつの日にか消したい
|
||||
@ -116,6 +121,25 @@ const html = document.documentElement;
|
||||
html.setAttribute('lang', lang);
|
||||
//#endregion
|
||||
|
||||
//#region loginId
|
||||
const params = new URLSearchParams(location.search);
|
||||
const loginId = params.get('loginId');
|
||||
|
||||
if (loginId) {
|
||||
const target = getUrlWithoutLoginId(location.href);
|
||||
|
||||
if (!$i || $i.id !== loginId) {
|
||||
const account = await getAccountFromId(loginId);
|
||||
if (account) {
|
||||
await login(account.token, target);
|
||||
}
|
||||
}
|
||||
|
||||
history.replaceState({ misskey: 'loginId' }, '', target);
|
||||
}
|
||||
|
||||
//#endregion
|
||||
|
||||
//#region Fetch user
|
||||
if ($i && $i.token) {
|
||||
if (_DEV_) {
|
||||
|
@ -11,7 +11,7 @@
|
||||
</div>
|
||||
</section>
|
||||
<section class="_debobigegoItem" style="text-align: center; padding: 0 16px;">
|
||||
{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
|
||||
{{ $ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ $ts.learnMore }}</a>
|
||||
</section>
|
||||
<FormGroup>
|
||||
<FormLink to="https://github.com/misskey-dev/misskey" external>
|
||||
|
@ -10,7 +10,7 @@
|
||||
<option value="resolved">{{ $ts.resolved }}</option>
|
||||
</MkSelect>
|
||||
<MkSelect v-model="targetUserOrigin" style="margin: 0; flex: 1;">
|
||||
<template #label>{{ $ts.targetUserOrigin }}</template>
|
||||
<template #label>{{ $ts.reporteeOrigin }}</template>
|
||||
<option value="combined">{{ $ts.all }}</option>
|
||||
<option value="local">{{ $ts.local }}</option>
|
||||
<option value="remote">{{ $ts.remote }}</option>
|
||||
|
@ -48,7 +48,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent } from 'vue';
|
||||
import { computed, defineComponent, toRef } from 'vue';
|
||||
import MkButton from '@client/components/ui/button.vue';
|
||||
import MkInput from '@client/components/form/input.vue';
|
||||
import MkPagination from '@client/components/ui/pagination.vue';
|
||||
@ -112,7 +112,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
async mounted() {
|
||||
this.$emit('info', this[symbols.PAGE_INFO]);
|
||||
this.$emit('info', toRef(this, symbols.PAGE_INFO));
|
||||
},
|
||||
|
||||
methods: {
|
||||
@ -168,6 +168,10 @@ export default defineComponent({
|
||||
<style lang="scss" scoped>
|
||||
.ogwlenmc {
|
||||
> .local {
|
||||
.empty {
|
||||
margin: var(--margin);
|
||||
}
|
||||
|
||||
.ldhfsamy {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
||||
@ -210,6 +214,10 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
> .remote {
|
||||
.empty {
|
||||
margin: var(--margin);
|
||||
}
|
||||
|
||||
.ldhfsamy {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
|
||||
|
@ -26,7 +26,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineAsyncComponent, defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue';
|
||||
import { computed, defineAsyncComponent, defineComponent, isRef, nextTick, onMounted, reactive, ref, watch } from 'vue';
|
||||
import { i18n } from '@client/i18n';
|
||||
import MkSuperMenu from '@client/components/ui/super-menu.vue';
|
||||
import FormGroup from '@client/components/debobigego/group.vue';
|
||||
@ -73,7 +73,13 @@ export default defineComponent({
|
||||
const view = ref(null);
|
||||
const el = ref(null);
|
||||
const onInfo = (viewInfo) => {
|
||||
childInfo.value = viewInfo;
|
||||
if (isRef(viewInfo)) {
|
||||
watch(viewInfo, () => {
|
||||
childInfo.value = viewInfo.value;
|
||||
}, { immediate: true });
|
||||
} else {
|
||||
childInfo.value = viewInfo;
|
||||
}
|
||||
};
|
||||
const pageProps = ref({});
|
||||
|
||||
|
@ -55,8 +55,8 @@ export default defineComponent({
|
||||
const jobs = ref([]);
|
||||
|
||||
onMounted(() => {
|
||||
os.api(props.domain === 'inbox' ? 'admin/queue/inbox-delayed' : props.domain === 'deliver' ? 'admin/queue/deliver-delayed' : null, {}).then(jobs => {
|
||||
jobs.value = jobs;
|
||||
os.api(props.domain === 'inbox' ? 'admin/queue/inbox-delayed' : props.domain === 'deliver' ? 'admin/queue/deliver-delayed' : null, {}).then(result => {
|
||||
jobs.value = result;
|
||||
});
|
||||
|
||||
const onStats = (stats) => {
|
||||
|
@ -1,240 +0,0 @@
|
||||
<template>
|
||||
<div class="qyqbqfal" v-size="{ max: [500] }">
|
||||
<div class="main">
|
||||
<div class="title">{{ title }}</div>
|
||||
<div class="body" v-html="body"></div>
|
||||
<div class="footer">
|
||||
<MkLink :url="`https://github.com/misskey-dev/misskey/blob/master/src/docs/${lang}/${doc}.md`" class="at">{{ $ts.docSource }}</MkLink>
|
||||
<p v-if="lang !== 'ja-JP'">{{ $ts.translateWarn }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent } from 'vue';
|
||||
import MarkdownIt from 'markdown-it';
|
||||
import MarkdownItAnchor from 'markdown-it-anchor';
|
||||
import { url, lang } from '@client/config';
|
||||
import MkLink from '@client/components/link.vue';
|
||||
import * as symbols from '@client/symbols';
|
||||
|
||||
const markdown = MarkdownIt({
|
||||
html: true
|
||||
});
|
||||
|
||||
markdown.use(MarkdownItAnchor, {
|
||||
slugify: (s) => encodeURIComponent(String(s).trim().replace(/\s+/g, '-'))
|
||||
});
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkLink
|
||||
},
|
||||
|
||||
props: {
|
||||
doc: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
[symbols.PAGE_INFO]: computed(() => this.title ? {
|
||||
title: this.title,
|
||||
icon: 'fas fa-question-circle',
|
||||
} : null),
|
||||
title: null,
|
||||
body: null,
|
||||
markdown: null,
|
||||
lang,
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
doc: {
|
||||
handler() {
|
||||
this.fetchDoc();
|
||||
},
|
||||
immediate: true,
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
fetchDoc() {
|
||||
fetch(`${url}/doc-assets/${lang}/${this.doc}.md`).then(res => res.text()).then(md => {
|
||||
this.parse(md);
|
||||
}).catch(() => {
|
||||
fetch(`${url}/doc-assets/ja-JP/${this.doc}.md`).then(res => res.text()).then(md => {
|
||||
this.parse(md);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
parse(md: string) {
|
||||
// 変数置換
|
||||
md = md.replace(/\{_URL_\}/g, url);
|
||||
|
||||
// markdown の全容をパースする
|
||||
const parsed = markdown.parse(md, {});
|
||||
if (parsed.length === 0) return;
|
||||
|
||||
const buf = [...parsed];
|
||||
const headingTokens = [];
|
||||
let headingStart = 0;
|
||||
|
||||
// もっとも上にある見出しを抽出する
|
||||
while (buf[0].type !== 'heading_open') {
|
||||
buf.shift();
|
||||
headingStart++;
|
||||
}
|
||||
buf.shift();
|
||||
while (buf[0].type as string !== 'heading_close') {
|
||||
const token = buf.shift();
|
||||
if (token) {
|
||||
headingTokens.push(token);
|
||||
}
|
||||
}
|
||||
|
||||
// 抽出した見出しを除く部分をbodyとして抽出する
|
||||
const bodyTokens = [...parsed];
|
||||
bodyTokens.splice(headingStart, headingTokens.length + 2);
|
||||
|
||||
// 各々レンダーする
|
||||
this.title = markdown.renderer.render(headingTokens, {}, {});
|
||||
this.body = markdown.renderer.render(bodyTokens, {}, {});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.qyqbqfal {
|
||||
padding: 32px;
|
||||
background: var(--panel);
|
||||
line-height: 1.5;
|
||||
|
||||
&.max-width_500px {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
> .main {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
|
||||
> .title {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
padding: 0 0 0.75em 0;
|
||||
margin: 0 0 1em 0;
|
||||
border-bottom: solid 2px var(--divider);
|
||||
}
|
||||
|
||||
> .body {
|
||||
> *:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
> *:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
::v-deep(a) {
|
||||
color: var(--link);
|
||||
}
|
||||
|
||||
::v-deep(blockquote) {
|
||||
display: block;
|
||||
margin: 8px;
|
||||
padding: 6px 0 6px 12px;
|
||||
color: var(--fg);
|
||||
border-left: solid 3px var(--fg);
|
||||
opacity: 0.7;
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep(h2) {
|
||||
font-size: 1.25em;
|
||||
padding: 0 0 0.5em 0;
|
||||
margin: 1.5em 0 1em 0;
|
||||
border-bottom: solid 0.5px var(--divider);
|
||||
}
|
||||
|
||||
::v-deep(h3) {
|
||||
margin: 1.25em 0 0.5em 0;
|
||||
}
|
||||
|
||||
::v-deep(table) {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
::v-deep(kbd.group) {
|
||||
display: inline-block;
|
||||
padding: 2px;
|
||||
border: 1px solid var(--divider);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
::v-deep(kbd.key) {
|
||||
display: inline-block;
|
||||
padding: 6px 8px;
|
||||
border: solid 0.5px var(--divider);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
::v-deep(code) {
|
||||
display: inline-block;
|
||||
font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
|
||||
tab-size: 2;
|
||||
background: #272822;
|
||||
color: #f8f8f2;
|
||||
border-radius: 6px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
|
||||
::v-deep(pre) {
|
||||
background: #272822;
|
||||
color: #f8f8f2;
|
||||
border-radius: 6px;
|
||||
padding: 12px 16px;
|
||||
|
||||
> code {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep(.info) {
|
||||
font-size: 90%;
|
||||
background: var(--infoBg);
|
||||
color: var(--infoFg);
|
||||
padding: 1em;
|
||||
margin: 0.75em 0;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
::v-deep(.warn) {
|
||||
font-size: 90%;
|
||||
background: var(--infoWarnBg);
|
||||
color: var(--infoWarnFg);
|
||||
padding: 1em;
|
||||
margin: 0.75em 0;
|
||||
border-radius: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
> .footer {
|
||||
padding: 1.5em 0 0 0;
|
||||
margin: 1.5em 0 0 0;
|
||||
border-top: solid 2px var(--divider);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,152 +0,0 @@
|
||||
<template>
|
||||
<div class="vtaihdtm">
|
||||
<div class="body">
|
||||
<div class="search">
|
||||
<MkInput v-model="query" :debounce="true" type="search" class="" :placeholder="$ts.search">
|
||||
<template #prefix><i class="fas fa-search"></i></template>
|
||||
</MkInput>
|
||||
</div>
|
||||
<div class="list">
|
||||
<MkFolder>
|
||||
<template #header>{{ $ts._docs.generalTopics }}</template>
|
||||
<div class="docs">
|
||||
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('general/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||
<div class="title">{{ doc.title }}</div>
|
||||
<div class="summary">{{ doc.summary }}</div>
|
||||
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||
</MkA>
|
||||
</div>
|
||||
</MkFolder>
|
||||
<MkFolder>
|
||||
<template #header>{{ $ts._docs.features }}</template>
|
||||
<div class="docs">
|
||||
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('features/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||
<div class="title">{{ doc.title }}</div>
|
||||
<div class="summary">{{ doc.summary }}</div>
|
||||
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||
</MkA>
|
||||
</div>
|
||||
</MkFolder>
|
||||
<MkFolder>
|
||||
<template #header>{{ $ts._docs.advancedTopics }}</template>
|
||||
<div class="docs">
|
||||
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('advanced/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||
<div class="title">{{ doc.title }}</div>
|
||||
<div class="summary">{{ doc.summary }}</div>
|
||||
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||
</MkA>
|
||||
</div>
|
||||
</MkFolder>
|
||||
<MkFolder>
|
||||
<template #header>{{ $ts._docs.admin }}</template>
|
||||
<div class="docs">
|
||||
<MkA v-for="doc in docs.filter(doc => doc.path.startsWith('admin/'))" :key="doc.path" :to="`/docs/${doc.path}`" class="doc">
|
||||
<div class="title">{{ doc.title }}</div>
|
||||
<div class="summary">{{ doc.summary }}</div>
|
||||
<div class="read">{{ $ts._docs.continueReading }}</div>
|
||||
</MkA>
|
||||
</div>
|
||||
</MkFolder>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { url, lang } from '@client/config';
|
||||
import * as symbols from '@client/symbols';
|
||||
import MkFolder from '@client/components/ui/folder.vue';
|
||||
import MkInput from '@client/components/form/input.vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkFolder,
|
||||
MkInput,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
[symbols.PAGE_INFO]: {
|
||||
title: this.$ts.help,
|
||||
icon: 'fas fa-question-circle'
|
||||
},
|
||||
docs: [],
|
||||
query: null,
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
query() {
|
||||
fetch(`${url}/docs.json?lang=${lang}&q=${this.query}`).then(res => res.json()).then(docs => {
|
||||
this.docs = docs;
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
fetch(`${url}/docs.json?lang=ja-JP`).then(res => res.json()).then(jaDocs => {
|
||||
fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => {
|
||||
this.docs = jaDocs.map(doc => {
|
||||
const exist = docs.find(d => d.path === doc.path);
|
||||
return exist || doc;
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.vtaihdtm {
|
||||
background: var(--panel);
|
||||
|
||||
> .body {
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
|
||||
> .search {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
> .list {
|
||||
padding: 0 16px;
|
||||
|
||||
.docs {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
|
||||
grid-gap: 12px;
|
||||
margin: 0 0 16px 0;
|
||||
|
||||
> .doc {
|
||||
display: inline-block;
|
||||
padding: 16px;
|
||||
border: solid 1px var(--divider);
|
||||
border-radius: 6px;
|
||||
|
||||
&:hover {
|
||||
border: solid 1px var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
> .title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
> .summary {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
> .read {
|
||||
color: var(--link);
|
||||
font-size: 0.9em;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -70,7 +70,7 @@
|
||||
<MkRadios v-model="searchOrigin">
|
||||
<option value="local">{{ $ts.local }}</option>
|
||||
<option value="remote">{{ $ts.remote }}</option>
|
||||
<option value="both">{{ $ts.both }}</option>
|
||||
<option value="both">{{ $ts.all }}</option>
|
||||
</MkRadios>
|
||||
</div>
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
// SPECIFICATION: /src/docs/ja-JP/advanced/share-page.md
|
||||
// SPECIFICATION: https://misskey-hub.net/docs/features/share-form.html
|
||||
|
||||
import { defineComponent } from 'vue';
|
||||
import MkButton from '@client/components/ui/button.vue';
|
||||
|
@ -43,7 +43,7 @@
|
||||
<div>{{ $ts._tutorial.step7_1 }}</div>
|
||||
<I18n :src="$ts._tutorial.step7_2" tag="div">
|
||||
<template #help>
|
||||
<MkA class="_link" to="/docs">{{ $ts.help }}</MkA>
|
||||
<a href="https://misskey-hub.net/help.html" target="_blank" class="_link">{{ $ts.help }}</a>
|
||||
</template>
|
||||
</I18n>
|
||||
<div>{{ $ts._tutorial.step7_3 }}</div>
|
||||
|
@ -133,7 +133,7 @@ export default defineComponent({
|
||||
text: this.$ts.help,
|
||||
icon: 'fas fa-question-circle',
|
||||
action: () => {
|
||||
os.pageWindow('/docs');
|
||||
window.open(`https://misskey-hub.net/help.md`, '_blank');
|
||||
}
|
||||
}], ev.currentTarget || ev.target);
|
||||
},
|
||||
|
@ -117,7 +117,7 @@ export default defineComponent({
|
||||
text: this.$ts.help,
|
||||
icon: 'fas fa-question-circle',
|
||||
action: () => {
|
||||
os.pageWindow('/docs');
|
||||
window.open(`https://misskey-hub.net/help.md`, '_blank');
|
||||
}
|
||||
}], ev.currentTarget || ev.target);
|
||||
},
|
||||
|
@ -137,7 +137,7 @@ export default defineComponent({
|
||||
text: this.$ts.help,
|
||||
icon: 'fas fa-question-circle',
|
||||
action: () => {
|
||||
os.pageWindow('/docs');
|
||||
window.open(`https://misskey-hub.net/help.md`, '_blank');
|
||||
}
|
||||
}], ev.currentTarget || ev.target);
|
||||
},
|
||||
|
@ -28,10 +28,8 @@ const defaultRoutes = [
|
||||
{ path: '/about', component: page('about') },
|
||||
{ path: '/about-misskey', component: page('about-misskey') },
|
||||
{ path: '/featured', component: page('featured') },
|
||||
{ path: '/docs', component: page('docs') },
|
||||
{ path: '/theme-editor', component: page('theme-editor') },
|
||||
{ path: '/advanced-theme-editor', component: page('advanced-theme-editor') },
|
||||
{ path: '/docs/:doc(.*)', component: page('doc'), props: route => ({ doc: route.params.doc }) },
|
||||
{ path: '/explore', component: page('explore') },
|
||||
{ path: '/explore/tags/:tag', props: true, component: page('explore') },
|
||||
{ path: '/federation', component: page('federation') },
|
||||
|
11
src/client/scripts/login-id.ts
Normal file
11
src/client/scripts/login-id.ts
Normal file
@ -0,0 +1,11 @@
|
||||
export function getUrlWithLoginId(url: string, loginId: string) {
|
||||
const u = new URL(url, origin);
|
||||
u.searchParams.append('loginId', loginId);
|
||||
return u.toString();
|
||||
}
|
||||
|
||||
export function getUrlWithoutLoginId(url: string) {
|
||||
const u = new URL(url);
|
||||
u.searchParams.delete('loginId');
|
||||
return u.toString();
|
||||
}
|
@ -1,10 +1,15 @@
|
||||
// SafariがBroadcastChannel未実装なのでライブラリを使う
|
||||
import { BroadcastChannel } from 'broadcast-channel';
|
||||
|
||||
export const reloadChannel = new BroadcastChannel<'reload'>('reload');
|
||||
export const reloadChannel = new BroadcastChannel<string | null>('reload');
|
||||
|
||||
// BroadcastChannelを用いて、クライアントが一斉にreloadするようにします。
|
||||
export function unisonReload() {
|
||||
reloadChannel.postMessage('reload');
|
||||
location.reload();
|
||||
export function unisonReload(path?: string) {
|
||||
if (path !== undefined) {
|
||||
reloadChannel.postMessage(path);
|
||||
location.href = path;
|
||||
} else {
|
||||
reloadChannel.postMessage(null);
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
@ -15,5 +15,6 @@
|
||||
navBg: '#fff',
|
||||
panel: '#fff',
|
||||
panelHeaderDivider: '@divider',
|
||||
mentionMe: 'rgb(0, 179, 70)',
|
||||
},
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ export default defineComponent({
|
||||
|
||||
methods: {
|
||||
help() {
|
||||
this.$router.push('/docs/keyboard-shortcut');
|
||||
window.open(`https://misskey-hub.net/docs/keyboard-shortcut.md`, '_blank');
|
||||
},
|
||||
}
|
||||
});
|
||||
|
@ -120,7 +120,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
help() {
|
||||
this.$router.push('/docs/keyboard-shortcut');
|
||||
window.open(`https://misskey-hub.net/docs/keyboard-shortcut.md`, '_blank');
|
||||
},
|
||||
|
||||
onTransition() {
|
||||
|
@ -134,7 +134,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
help() {
|
||||
this.$router.push('/docs/keyboard-shortcut');
|
||||
window.open(`https://misskey-hub.net/docs/keyboard-shortcut.md`, '_blank');
|
||||
},
|
||||
|
||||
onTransition() {
|
||||
|
@ -56,7 +56,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
help() {
|
||||
this.$router.push('/docs/keyboard-shortcut');
|
||||
window.open(`https://misskey-hub.net/docs/keyboard-shortcut.md`, '_blank');
|
||||
},
|
||||
|
||||
onTransition() {
|
||||
|
@ -17,6 +17,7 @@ import { PollVote } from '@/models/entities/poll-vote';
|
||||
import { Note } from '@/models/entities/note';
|
||||
import { NoteReaction } from '@/models/entities/note-reaction';
|
||||
import { NoteWatching } from '@/models/entities/note-watching';
|
||||
import { NoteThreadMuting } from '@/models/entities/note-thread-muting';
|
||||
import { NoteUnread } from '@/models/entities/note-unread';
|
||||
import { Notification } from '@/models/entities/notification';
|
||||
import { Meta } from '@/models/entities/meta';
|
||||
@ -138,6 +139,7 @@ export const entities = [
|
||||
NoteFavorite,
|
||||
NoteReaction,
|
||||
NoteWatching,
|
||||
NoteThreadMuting,
|
||||
NoteUnread,
|
||||
Page,
|
||||
PageLike,
|
||||
|
@ -1,8 +0,0 @@
|
||||
# LTL/STL/GTLの無効化
|
||||
Misskeyでは、LTL/STL/GTLをそれぞれ無効化することができます。有効/無効を切り替えるには、インスタンスコントロールパネルで設定します。
|
||||
|
||||
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。
|
||||
|
||||
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します。</div>
|
||||
|
||||
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です。
|
@ -1,5 +0,0 @@
|
||||
# よくある質問
|
||||
ここでは、サーバー管理者向けのよくある質問を掲載しています。
|
||||
|
||||
## デフォルトテーマを設定したい
|
||||
現在、デフォルトテーマ設定機能は実装されていません。
|
@ -1,7 +0,0 @@
|
||||
# AiScript
|
||||
AiScriptは、Misskeyで使用できるスクリプト言語です。
|
||||
|
||||
<div class="info">ℹ️ AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されています。</a></div>
|
||||
|
||||
## 使い方
|
||||
AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されています。
|
@ -1,58 +0,0 @@
|
||||
# Misskey API
|
||||
|
||||
MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
|
||||
|
||||
APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
|
||||
|
||||
## アクセストークンの取得
|
||||
基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
|
||||
|
||||
* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
|
||||
* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
|
||||
|
||||
### 自分自身のアクセストークンを手動発行する
|
||||
「設定 > API」で、自分のアクセストークンを発行できます。
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
### アプリケーション利用者にアクセストークンの発行をリクエストする
|
||||
アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
|
||||
|
||||
#### Step 1
|
||||
|
||||
UUIDを生成する。以後これをセッションIDと呼びます。
|
||||
|
||||
> このセッションIDは毎回生成し、使いまわさないようにしてください。
|
||||
|
||||
#### Step 2
|
||||
|
||||
`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
|
||||
> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
|
||||
|
||||
表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
|
||||
* `name` ... アプリケーション名
|
||||
* > 例: `MissDeck`
|
||||
* `icon` ... アプリケーションのアイコン画像URL
|
||||
* > 例: `https://missdeck.example.com/icon.png`
|
||||
* `callback` ... 認証が終わった後にリダイレクトするURL
|
||||
* > 例: `https://missdeck.example.com/callback`
|
||||
* リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
|
||||
* `permission` ... アプリケーションが要求する権限
|
||||
* > 例: `write:notes,write:following,read:drive`
|
||||
* 要求する権限を`,`で区切って列挙します
|
||||
* どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
|
||||
|
||||
#### Step 3
|
||||
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
|
||||
|
||||
レスポンスに含まれるプロパティ:
|
||||
* `token` ... ユーザーのアクセストークン
|
||||
* `user` ... ユーザーの情報
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
## APIの使い方
|
||||
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
|
||||
|
||||
* [APIリファレンス](/api-doc)
|
||||
* [ストリーミングAPI](./stream)
|
@ -1,74 +0,0 @@
|
||||
# プラグインの作成
|
||||
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
|
||||
|
||||
## البيانات الوصفية
|
||||
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
|
||||
|
||||
### name
|
||||
プラグイン名
|
||||
|
||||
### author
|
||||
プラグイン作者
|
||||
|
||||
### version
|
||||
プラグインバージョン。数値を指定してください。
|
||||
|
||||
### description
|
||||
プラグインの説明
|
||||
|
||||
### permissions
|
||||
プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
|
||||
|
||||
### config
|
||||
プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
|
||||
|
||||
#### type
|
||||
設定値の種類を表す文字列。以下から選択します。 string number boolean
|
||||
|
||||
#### label
|
||||
ユーザーに表示する設定名
|
||||
|
||||
#### description
|
||||
設定の説明
|
||||
|
||||
#### default
|
||||
設定のデフォルト値
|
||||
|
||||
## APIリファレンス
|
||||
AiScript標準で組み込まれているAPIは掲載しません。
|
||||
|
||||
### Mk:dialog(title text type)
|
||||
ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
|
||||
|
||||
### Mk:confirm(title text type)
|
||||
確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
|
||||
|
||||
### Mk:api(endpoint params)
|
||||
Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
|
||||
|
||||
### Mk:save(key value)
|
||||
任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
|
||||
|
||||
### Mk:load(key)
|
||||
Mk:saveで永続化した指定の名前の値を読み取ります。
|
||||
|
||||
### Plugin:register_post_form_action(title fn)
|
||||
投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_action(title fn)
|
||||
ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_user_action(title fn)
|
||||
ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_view_interruptor(fn)
|
||||
UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:register_note_post_interruptor(fn)
|
||||
ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:open_url(url)
|
||||
第一引数に渡されたURLをブラウザの新しいタブで開きます。
|
||||
|
||||
### Plugin:config
|
||||
プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
|
@ -1,6 +0,0 @@
|
||||
# Botの作成
|
||||
[Misskey API](./api)を利用してBotの開発が可能です。 また、いくつかのBot実装が公開されているため、ぜひ参考にしてください。
|
||||
|
||||
- [syuilo/ai](https://github.com/syuilo/ai) ... Node.js上で動く、TypeScript製Bot実装
|
||||
|
||||
Botを作成したときは、プロフィール設定からBotフラグをオンにしておくことを強くおすすめします。
|
@ -1,160 +0,0 @@
|
||||
# MisskeyリバーシBotの開発
|
||||
Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
|
||||
|
||||
1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
|
||||
* `i`: botアカウントのAPIキー
|
||||
|
||||
2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
|
||||
* イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
|
||||
|
||||
3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
|
||||
|
||||
4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
|
||||
* `i`: botアカウントのAPIキー
|
||||
* `game`: `game`の`id`
|
||||
|
||||
5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
|
||||
|
||||
6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
|
||||
|
||||
7. ゲームが開始すると、`started`イベントが流れてくる
|
||||
* イベントの中身にはゲーム情報が含まれている
|
||||
|
||||
8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
|
||||
|
||||
9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
|
||||
* `color`として石の色が含まれている
|
||||
* `pos`として位置情報が含まれている
|
||||
|
||||
## 位置の計算法
|
||||
8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
|
||||
```
|
||||
+--+--+--+--+--+--+--+--+
|
||||
| 0| 1| 2| 3| 4| 5| 6| 7|
|
||||
+--+--+--+--+--+--+--+--+
|
||||
| 8| 9|10|11|12|13|14|15|
|
||||
+--+--+--+--+--+--+--+--+
|
||||
|16|17|18|19|20|21|22|23|
|
||||
...
|
||||
```
|
||||
|
||||
### X,Y座標 から インデックス に変換する
|
||||
```
|
||||
pos = x + (y * mapWidth)
|
||||
```
|
||||
`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
|
||||
```
|
||||
mapWidth = map[0].length
|
||||
```
|
||||
|
||||
### インデックス から X,Y座標 に変換する
|
||||
```
|
||||
x = pos % mapWidth
|
||||
y = Math.floor(pos / mapWidth)
|
||||
```
|
||||
|
||||
## マップ情報
|
||||
マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
|
||||
* `(スペース)` ... マス無し
|
||||
* `-` ... マス
|
||||
* `b` ... 初期配置される黒石
|
||||
* `w` ... 初期配置される白石
|
||||
|
||||
例えば、4*4の次のような単純なマップがあるとします:
|
||||
```text
|
||||
+---+---+---+---+
|
||||
| | | | |
|
||||
+---+---+---+---+
|
||||
| | ○ | ● | |
|
||||
+---+---+---+---+
|
||||
| | ● | ○ | |
|
||||
+---+---+---+---+
|
||||
| | | | |
|
||||
+---+---+---+---+
|
||||
```
|
||||
|
||||
この場合、マップデータはこのようになります:
|
||||
```javascript
|
||||
['----', '-wb-', '-bw-', '----']
|
||||
```
|
||||
|
||||
## ユーザーにフォームを提示して対話可能Botを作成する
|
||||
ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
|
||||
|
||||
フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
|
||||
```javascript
|
||||
{
|
||||
type: 'init-form',
|
||||
body: [フォームコントロールの配列]
|
||||
}
|
||||
```
|
||||
|
||||
フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
|
||||
```javascript
|
||||
{
|
||||
id: 'switch1',
|
||||
type: 'switch',
|
||||
label: 'Enable hoge',
|
||||
value: false
|
||||
}
|
||||
```
|
||||
`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
|
||||
|
||||
### フォームの操作を受け取る
|
||||
ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
|
||||
```javascript
|
||||
{
|
||||
id: 'switch1',
|
||||
value: true
|
||||
}
|
||||
```
|
||||
|
||||
### フォームコントロールの種類
|
||||
#### スイッチ
|
||||
type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
|
||||
|
||||
##### プロパティ
|
||||
`label` ... スイッチに表記するテキスト。
|
||||
|
||||
#### ラジオボタン
|
||||
type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
|
||||
|
||||
##### プロパティ
|
||||
`items` ... ラジオボタンの選択肢。例:
|
||||
```javascript
|
||||
items: [{
|
||||
label: '弱',
|
||||
value: 1
|
||||
}, {
|
||||
label: '中',
|
||||
value: 2
|
||||
}, {
|
||||
label: '強',
|
||||
value: 3
|
||||
}]
|
||||
```
|
||||
|
||||
#### スライダー
|
||||
type: `slider` スライダーを表示します。
|
||||
|
||||
##### プロパティ
|
||||
`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
|
||||
|
||||
#### テキストボックス
|
||||
type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
|
||||
|
||||
## ユーザーにメッセージを表示する
|
||||
設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
|
||||
```javascript
|
||||
{
|
||||
type: 'message',
|
||||
body: {
|
||||
text: 'メッセージ内容',
|
||||
type: 'メッセージの種類'
|
||||
}
|
||||
}
|
||||
```
|
||||
メッセージの種類: `success`, `info`, `warning`, `error`。
|
||||
|
||||
## 投了する
|
||||
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
|
@ -1,54 +0,0 @@
|
||||
# シェアページ
|
||||
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
|
||||
|
||||
## クエリ文字列一覧
|
||||
### 文字
|
||||
|
||||
<dl>
|
||||
<dt>title</dt>
|
||||
<dd>タイトルです。本文の先頭に[ … ]と挿入されます。</dd>
|
||||
<dt>text</dt>
|
||||
<dd>本文です。</dd>
|
||||
<dt>url</dt>
|
||||
<dd>URLです。末尾に挿入されます。</dd>
|
||||
</dl>
|
||||
|
||||
### リプライ情報
|
||||
以下のいずれか
|
||||
|
||||
<dl>
|
||||
<dt>replyId</dt>
|
||||
<dd>リプライ先のノートid</dd>
|
||||
<dt>replyUri</dt>
|
||||
<dd>リプライ先のUrl(リモートのノートオブジェクトを指定)</dd>
|
||||
</dl>
|
||||
|
||||
### Renote情報
|
||||
以下のいずれか
|
||||
|
||||
<dl>
|
||||
<dt>renoteId</dt>
|
||||
<dd>Renote先のノートid</dd>
|
||||
<dt>renoteUri</dt>
|
||||
<dd>Renote先のUrl(リモートのノートオブジェクトを指定)</dd>
|
||||
</dl>
|
||||
|
||||
### 公開範囲
|
||||
※specifiedに相当する値はvisibility=specifiedとvisibleAccts/visibleUserIdsで指定する
|
||||
|
||||
<dl>
|
||||
<dt>visibility</dt>
|
||||
<dd>公開範囲 ['public' | 'home' | 'followers' | 'specified']</dd>
|
||||
<dt>localOnly</dt>
|
||||
<dd>0(false) or 1(true)</dd>
|
||||
<dt>visibleUserIds</dt>
|
||||
<dd>specified時のダイレクト先のユーザーid カンマ区切りで</dd>
|
||||
<dt>visibleAccts</dt>
|
||||
<dd>specified時のダイレクト先のacct(@?username[@host]) カンマ区切りで</dd>
|
||||
</dl>
|
||||
|
||||
### الملفات
|
||||
<dl>
|
||||
<dt>fileIds</dt>
|
||||
<dd>添付したいファイルのid(カンマ区切りで)</dd>
|
||||
</dl>
|
@ -1,350 +0,0 @@
|
||||
# ストリーミングAPI
|
||||
|
||||
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
|
||||
|
||||
## ストリームに接続する
|
||||
|
||||
ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
|
||||
|
||||
以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
|
||||
```
|
||||
%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
|
||||
```
|
||||
|
||||
認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
|
||||
|
||||
<div class="info">ℹ️ 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</div>
|
||||
|
||||
---
|
||||
|
||||
認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
|
||||
|
||||
```
|
||||
%WS_URL%/streaming
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
|
||||
|
||||
**ストリームでのやり取りはすべてJSONです。**
|
||||
|
||||
## チャンネル
|
||||
MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
|
||||
|
||||
ひとつのストリーム上で、同時に複数のチャンネルに接続することができます。
|
||||
|
||||
### チャンネルに接続する
|
||||
チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'connect',
|
||||
body: {
|
||||
channel: 'xxxxxxxx',
|
||||
id: 'foobar',
|
||||
params: {
|
||||
...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
|
||||
* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
|
||||
* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
|
||||
|
||||
<div class="info">ℹ️ IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</div>
|
||||
|
||||
### チャンネルからのメッセージを受け取る
|
||||
例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
|
||||
|
||||
チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
|
||||
```json
|
||||
{
|
||||
type: 'channel',
|
||||
body: {
|
||||
id: 'foobar',
|
||||
type: 'something',
|
||||
body: {
|
||||
some: 'thing'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
|
||||
* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
|
||||
* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
|
||||
|
||||
### チャンネルに向けてメッセージを送信する
|
||||
チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
|
||||
|
||||
チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
|
||||
```json
|
||||
{
|
||||
type: 'channel',
|
||||
body: {
|
||||
id: 'foobar',
|
||||
type: 'something',
|
||||
body: {
|
||||
some: 'thing'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
|
||||
* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
|
||||
* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
|
||||
|
||||
### チャンネルから切断する
|
||||
チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'disconnect',
|
||||
body: {
|
||||
id: 'foobar'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
|
||||
|
||||
## ストリームを経由してAPIリクエストする
|
||||
|
||||
ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
|
||||
|
||||
ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
|
||||
```json
|
||||
{
|
||||
type: 'api',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
endpoint: 'notes/create',
|
||||
data: {
|
||||
text: 'yee haw!'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
|
||||
* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
|
||||
* `data`には、エンドポイントのパラメータを含めます。
|
||||
|
||||
<div class="info">ℹ️ APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</div>
|
||||
|
||||
### レスポンスの受信
|
||||
|
||||
APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'api:xxxxxxxxxxxxxxxx',
|
||||
body: {
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
|
||||
* `body`には、レスポンスが含まれています。
|
||||
|
||||
## 投稿のキャプチャ
|
||||
|
||||
Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
|
||||
|
||||
例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
|
||||
|
||||
しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
|
||||
|
||||
この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
|
||||
|
||||
### 投稿をキャプチャする
|
||||
|
||||
投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'subNote',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`にキャプチャしたい投稿の`id`を設定します。
|
||||
|
||||
このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
|
||||
|
||||
例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'reacted',
|
||||
body: {
|
||||
reaction: 'like',
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
|
||||
* `body`内の`type`に、イベントの種類が設定されます。
|
||||
* `body`内の`body`に、イベントの詳細が設定されます。
|
||||
|
||||
#### イベントの種類
|
||||
|
||||
##### `reacted`
|
||||
その投稿にリアクションがされた時に発生します。
|
||||
|
||||
* `reaction`に、リアクションの種類が設定されます。
|
||||
* `userId`に、リアクションを行ったユーザーのIDが設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'reacted',
|
||||
body: {
|
||||
reaction: 'like',
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### `deleted`
|
||||
その投稿が削除された時に発生します。
|
||||
|
||||
* `deletedAt`に、削除日時が設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'deleted',
|
||||
body: {
|
||||
deletedAt: '2018-10-22T02:17:09.703Z'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### `pollVoted`
|
||||
その投稿に添付されたアンケートに投票された時に発生します。
|
||||
|
||||
* `choice`に、選択肢IDが設定されます。
|
||||
* `userId`に、投票を行ったユーザーのIDが設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'pollVoted',
|
||||
body: {
|
||||
choice: 2,
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 投稿のキャプチャを解除する
|
||||
|
||||
その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
|
||||
|
||||
次のメッセージを送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'unsubNote',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`にキャプチャを解除したい投稿の`id`を設定します。
|
||||
|
||||
このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
|
||||
|
||||
# チャンネル一覧
|
||||
## `main`
|
||||
アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `renote`
|
||||
自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
|
||||
|
||||
#### `mention`
|
||||
誰かからメンションされたときに発生するイベントです。
|
||||
|
||||
#### `readAllNotifications`
|
||||
自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
|
||||
|
||||
#### `meUpdated`
|
||||
自分の情報が更新されたことを表すイベントです。
|
||||
|
||||
#### `follow`
|
||||
自分が誰かをフォローしたときに発生するイベントです。
|
||||
|
||||
#### `unfollow`
|
||||
自分が誰かのフォローを解除したときに発生するイベントです。
|
||||
|
||||
#### `followed`
|
||||
自分が誰かにフォローされたときに発生するイベントです。
|
||||
|
||||
## `homeTimeline`
|
||||
ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
タイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `localTimeline`
|
||||
ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `hybridTimeline`
|
||||
ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `globalTimeline`
|
||||
グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
@ -1,4 +0,0 @@
|
||||
# AiScript
|
||||
|
||||
## وظائف
|
||||
デフォルトで値渡しです。
|
@ -1,58 +0,0 @@
|
||||
# Misskey API
|
||||
|
||||
MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
|
||||
|
||||
APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
|
||||
|
||||
## アクセストークンの取得
|
||||
基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
|
||||
|
||||
* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
|
||||
* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
|
||||
|
||||
### 自分自身のアクセストークンを手動発行する
|
||||
「設定 > API」で、自分のアクセストークンを発行できます。
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
### アプリケーション利用者にアクセストークンの発行をリクエストする
|
||||
アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
|
||||
|
||||
#### Step 1
|
||||
|
||||
UUIDを生成する。以後これをセッションIDと呼びます。
|
||||
|
||||
> このセッションIDは毎回生成し、使いまわさないようにしてください。
|
||||
|
||||
#### Step 2
|
||||
|
||||
`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
|
||||
> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
|
||||
|
||||
表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
|
||||
* `name` ... アプリケーション名
|
||||
* > 例: `MissDeck`
|
||||
* `icon` ... アプリケーションのアイコン画像URL
|
||||
* > 例: `https://missdeck.example.com/icon.png`
|
||||
* `callback` ... 認証が終わった後にリダイレクトするURL
|
||||
* > 例: `https://missdeck.example.com/callback`
|
||||
* リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
|
||||
* `permission` ... アプリケーションが要求する権限
|
||||
* > 例: `write:notes,write:following,read:drive`
|
||||
* 要求する権限を`,`で区切って列挙します
|
||||
* どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
|
||||
|
||||
#### Step 3
|
||||
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
|
||||
|
||||
レスポンスに含まれるプロパティ:
|
||||
* `token` ... ユーザーのアクセストークン
|
||||
* `user` ... ユーザーの情報
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
## APIの使い方
|
||||
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
|
||||
|
||||
* [APIリファレンス](/api-doc)
|
||||
* [ストリーミングAPI](./stream)
|
@ -1,74 +0,0 @@
|
||||
# プラグインの作成
|
||||
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
|
||||
|
||||
## البيانات الوصفية
|
||||
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
|
||||
|
||||
### name
|
||||
プラグイン名
|
||||
|
||||
### author
|
||||
プラグイン作者
|
||||
|
||||
### version
|
||||
プラグインバージョン。数値を指定してください。
|
||||
|
||||
### description
|
||||
プラグインの説明
|
||||
|
||||
### permissions
|
||||
プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
|
||||
|
||||
### config
|
||||
プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
|
||||
|
||||
#### type
|
||||
設定値の種類を表す文字列。以下から選択します。 string number boolean
|
||||
|
||||
#### label
|
||||
ユーザーに表示する設定名
|
||||
|
||||
#### description
|
||||
設定の説明
|
||||
|
||||
#### default
|
||||
設定のデフォルト値
|
||||
|
||||
## APIリファレンス
|
||||
AiScript標準で組み込まれているAPIは掲載しません。
|
||||
|
||||
### Mk:dialog(title text type)
|
||||
ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
|
||||
|
||||
### Mk:confirm(title text type)
|
||||
確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
|
||||
|
||||
### Mk:api(endpoint params)
|
||||
Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
|
||||
|
||||
### Mk:save(key value)
|
||||
任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
|
||||
|
||||
### Mk:load(key)
|
||||
Mk:saveで永続化した指定の名前の値を読み取ります。
|
||||
|
||||
### Plugin:register_post_form_action(title fn)
|
||||
投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_action(title fn)
|
||||
ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_user_action(title fn)
|
||||
ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_view_interruptor(fn)
|
||||
UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:register_note_post_interruptor(fn)
|
||||
ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:open_url(url)
|
||||
第一引数に渡されたURLをブラウザの新しいタブで開きます。
|
||||
|
||||
### Plugin:config
|
||||
プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
|
@ -1,2 +0,0 @@
|
||||
# إيموجي مخصص
|
||||
カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
|
@ -1,18 +0,0 @@
|
||||
# デッキ
|
||||
|
||||
デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
|
||||
|
||||
## カラムの追加
|
||||
デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
|
||||
|
||||
## カラムの移動
|
||||
カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
|
||||
|
||||
## カラムの水平分割
|
||||
カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
|
||||
|
||||
## カラムの設定
|
||||
カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
|
||||
|
||||
## デッキの設定
|
||||
デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
|
@ -1,4 +0,0 @@
|
||||
# الهوائيات
|
||||
アンテナは、自由に条件を設定して、合致するノートを自動で収集することができる機能です。
|
||||
|
||||
条件を設定したアンテナが作成された状態で、条件に合致するノートが投稿されると、リアルタイムでそのアンテナのタイムラインにノートが追加されます。
|
@ -1,2 +0,0 @@
|
||||
# إيموجي مخصص
|
||||
カスタム絵文字は、インスタンスで用意された画像を絵文字のように使える機能です。 ノート、リアクション、チャット、自己紹介、名前などの場所で使うことができます。 カスタム絵文字をそれらの場所で使うには、絵文字ピッカーボタン(ある場合)を押すか、`:`を入力して絵文字サジェストを表示します。 テキスト内に`:foo:`のような形式の文字列が見つかると、`foo`の部分がカスタム絵文字名と解釈され、表示時には対応したカスタム絵文字に置き換わります。
|
@ -1,18 +0,0 @@
|
||||
# デッキ
|
||||
|
||||
デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。
|
||||
|
||||
## カラムの追加
|
||||
デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。
|
||||
|
||||
## カラムの移動
|
||||
カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。
|
||||
|
||||
## カラムの水平分割
|
||||
カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。
|
||||
|
||||
## カラムの設定
|
||||
カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。
|
||||
|
||||
## デッキの設定
|
||||
デッキに関する設定は、[settings/deck](/settings/deck)で行えます。
|
@ -1,17 +0,0 @@
|
||||
# قرص التخرين
|
||||
ドライブは、Misskey上でファイルを管理できる機能です。
|
||||
|
||||
[ドライブのページ](/my/drive)から任意のファイルをアップロードできるほか、アバターに設定した画像や、ノートに添付したファイルなどもすべてドライブにアップロードされます。
|
||||
|
||||
<div class="warn">⚠️ ドライブからファイルを削除すると、そのファイルが添付されたノートも消えます。</div>
|
||||
|
||||
ドライブにアップロードされたファイルは、いつでもダウンロードすることができるほか、ノート作成時に「ドライブからファイルを添付」することでファイルを再利用することもできます。
|
||||
|
||||
ドライブ内にフォルダを作り、複数のファイルをまとめて整理することもできます。
|
||||
|
||||
## 閲覧注意 (NSFW)
|
||||
<div class="info">ℹ️ この項目が閲覧注意なわけではありません</div>
|
||||
|
||||
閲覧注意またはNSFW (Not safe for work) は、ドライブのファイルに設定することができるフラグです。 閲覧注意フラグを設定されたファイルは、表示される際に閲覧者の操作なしには表示されなくなります。 このフラグは、例えば職場や公共の場で閲覧するのに適切でないと思われる画像などに設定し、そのような画像が突然表示されてしまうことを防ぐ目的で使われます。
|
||||
|
||||
このフラグは手動でオンオフを切り替えられるほか、モデレーターの判断で設定される場合もあります。
|
@ -1,4 +0,0 @@
|
||||
# إضافة إلى المفضلة
|
||||
[ノート](./node)をお気に入りとして登録できる機能です。 お気に入り登録したノートは、[お気に入りページ](./my/favorites)で一覧することができます。 お気に入りに登録したことは相手に通知されず、お気に入りは自分しか見ることができません。
|
||||
|
||||
ノートをお気に入り登録するには、ノートメニューの「お気に入り」を押します。お気に入り解除するには、ノートメニューの「お気に入り解除」を押します。
|
@ -1,2 +0,0 @@
|
||||
# المتابَعون
|
||||
ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
|
@ -1,66 +0,0 @@
|
||||
# キーボードショートカット
|
||||
|
||||
## الشامل
|
||||
これらのショートカットは基本的にどこでも使えます。
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
|
||||
<tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
|
||||
<tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
|
||||
<tr><td><kbd class="key">S</kbd></td><td>البحث</td><td><b>S</b>earch</td></tr>
|
||||
<tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 投稿にフォーカスされた状態
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
|
||||
<tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
|
||||
<tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
|
||||
<tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
|
||||
<tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
|
||||
<tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
|
||||
<tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Renoteフォーム
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## リアクションフォーム
|
||||
デフォルトで「👍」にフォーカスが当たっている状態です。
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
@ -1,12 +0,0 @@
|
||||
# MFM
|
||||
MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
|
||||
|
||||
## MFMが使用可能な場所の例
|
||||
- ノート本文
|
||||
- CW注釈
|
||||
- ユーザーの名前
|
||||
- ユーザーの自己紹介
|
||||
|
||||
## 開発者向け情報
|
||||
MFMのパーサー実装はライブラリとして公開されており、簡単にクライアントにMFMを組み込むことが可能です。
|
||||
- [misskey-dev/mfm.js](https://github.com/misskey-dev/mfm.js) - JavaScriptパーサー実装
|
@ -1,41 +0,0 @@
|
||||
# تم كتمها / تم حجبها
|
||||
好みではないユーザーがいる場合は、ミュートを行うことでそのユーザーが自分から見えないようにすることができます。 また、より強力な措置として、ブロックを行うことでそのユーザーから自分のコンテンツが見えないようになるほか、自分に対して関わることができないようにすることができます。 ミュートされていることは相手は分かりませんが、ブロックされていることは相手に分かります。どちらを選ぶかはご自身の判断で行ってください。
|
||||
|
||||
<div class="info">ℹ️ ミュートとブロックは併用できます。</div>
|
||||
|
||||
<div class="warn">⚠️ 利用規約に違反するような、迷惑なユーザーがいる場合は運営者に報告することも検討してください。</div>
|
||||
|
||||
設定>ミュートとブロック から、自分がミュートまたはブロックしているユーザー一覧を確認することができます。
|
||||
|
||||
## اكتم
|
||||
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
|
||||
|
||||
- タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
|
||||
- そのユーザーからの通知
|
||||
- メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
|
||||
- など
|
||||
|
||||
ユーザーをミュートするには、対象のユーザーのユーザーページのメニューを開き、「ミュート」ボタンを押します。
|
||||
|
||||
<div class="info">ℹ️ ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。</div>
|
||||
|
||||
## احجب
|
||||
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
|
||||
|
||||
- フォローする
|
||||
- ユーザーリストに追加する
|
||||
- 返信する、Renoteする
|
||||
- リアクションする、アンケートに投票する
|
||||
- メッセージを送信する
|
||||
- など
|
||||
|
||||
また、
|
||||
|
||||
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。
|
||||
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。
|
||||
|
||||
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。
|
||||
|
||||
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>
|
||||
|
||||
<div class="warn">⚠️ 相手から自分のコンテンツが見えなくなりますが、相手がアカウントを切り替えたりログアウト状態になれば見ることができます。あくまで簡易的、補助的なものとしてお考えください。</div>
|
@ -1,13 +0,0 @@
|
||||
# اكتم
|
||||
|
||||
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
|
||||
|
||||
* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
|
||||
* そのユーザーからの通知
|
||||
* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
|
||||
|
||||
ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
|
||||
|
||||
ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
|
||||
|
||||
設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
|
@ -1,54 +0,0 @@
|
||||
# الملاحظات
|
||||
ノートは、Misskeyに投稿される、文章、ファイル、アンケートなどを含むコンテンツで、Misskeyの中心的概念です。また、そのノートを作成する行為自体もノートと呼ばれます。
|
||||
|
||||
ノートが作成されると、[タイムライン](./timeline)に追加され、自分の[フォロワー](./follow)やサーバーのユーザーが見れるようになります。
|
||||
|
||||
ノートには、[リアクション](./reaction)を行うことができます。また、返信や引用もできます。
|
||||
|
||||
ノートを[お気に入り](./favorite)登録することで、後で簡単に見返すことができます。
|
||||
|
||||
## ノートを作成する
|
||||
ノートを作成するには、画面上にある鉛筆マークのボタンを押して、作成フォームを開きます。作成フォームに内容を入力し、「ノート」ボタンを押すことでノートが作成されます。 ノートには、画像、動画など任意のファイルや、[アンケート](./poll)を添付することができます。また、本文中には[MFM](./mfm)が使用でき、[メンション](./mention)や[ハッシュタグ](./hashtag)を含めることもできます。 他にも、CWや公開範囲といった設定も行えます(詳細は後述)。
|
||||
<div class="info">ℹ️ コンピューターのクリップボードに画像データがある状態で、フォーム内のテキストボックスにペーストするとその画像を添付することができます。</div>
|
||||
<div class="info">ℹ️ テキストボックス内で<kbd class="key">Ctrl + Enter</kbd>を押すことでも投稿できます。</div>
|
||||
|
||||
## Renote
|
||||
既にあるノートを引用、もしくはそのノートを新しいノートとして共有する行為、またそれによって作成されたノートをRenoteと呼びます。 自分がフォローしているユーザーの、気に入ったノートを自分のフォロワーに共有したい場合や、過去の自分のノートを再度共有したい場合に使います。 同じノートに対して無制限にRenoteを行うことができますが、あまり連続して使用すると迷惑になる場合もあるので、注意しましょう。
|
||||
<div class="warn">⚠️ 公開範囲がフォロワーやダイレクトのノートはRenoteできません</div>
|
||||
|
||||
Renoteを削除するには、Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。
|
||||
|
||||
## CW
|
||||
Contents Warningの略で、ノートの内容を、閲覧者の操作なしには表示しないようにできる機能です。主に長大な内容を隠すためや、ネタバレ防止などに使うことができます。 設定するには、フォームの「内容を隠す」ボタン(目のアイコン)を押します。すると新しい入力エリアが表れるので、そこに内容の要約を記入します。
|
||||
|
||||
## 公開範囲
|
||||
ノートごとに、そのノートが公開される範囲を設定することができます。フォームの「ノート」ボタンの左にあるアイコンを押すと公開範囲を以下から選択できます。
|
||||
|
||||
### للعامة
|
||||
全ての人に対してノートが公開されるほか、サーバーの全てのタイムライン(ホームタイムライン、ローカルタイムライン、ソーシャルタイムライン、グローバルタイムライン)にノートが流れます。
|
||||
<div class="warn">⚠️ アカウントが<a href="./silence">サイレンス</a>状態の時は、この公開範囲は使用できません。</div>
|
||||
|
||||
### الرئيسي
|
||||
全ての人に対してノートが公開されますが、フォロワー以外のローカルタイムライン、ソーシャルタイムライン、グローバルタイムラインにはノートは流れません。
|
||||
|
||||
### المتابِعين
|
||||
自分のフォロワーに対してのみノートを公開します。フォロワーの全てのタイムラインに流れます。
|
||||
|
||||
### مباشرة
|
||||
指定したユーザーに対してのみノートを公開します。指定したユーザーの全てのタイムラインに流れます。
|
||||
|
||||
### 「ローカルのみ」オプション
|
||||
このオプションを有効にすると、リモートにノートを連合しなくなります。
|
||||
|
||||
### 公開範囲の比較
|
||||
<table>
|
||||
<tr><th></th><th>للعامة</th><th>الرئيسي</th><th>المتابِعين</th><th>مباشرة</th></tr>
|
||||
<tr><th>フォロワーのLTL/STL/GTL</th><td>✔</td><td>✔</td><td>✔</td><td></td></tr>
|
||||
<tr><th>非フォロワーのLTL/STL/GTL</th><td>✔</td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
## دبّسها على الصفحة الشخصية
|
||||
ノートをピン留めすると、ユーザーページに常にそのノートを表示しておくことができます。 ノートのメニューを開き、「ピン留め」を選択してピン留めできます。 複数のノートをピン留めできます。
|
||||
|
||||
## راقب
|
||||
ノートをウォッチすると、自分以外のノートへのリアクションや返信などの通知を受け取ることができます。 ノートのメニューを開き、「ウォッチ」を選択してウォッチできます。
|
@ -1,10 +0,0 @@
|
||||
# Pages
|
||||
|
||||
## 変数
|
||||
変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
|
||||
|
||||
変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
|
||||
|
||||
ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
|
||||
|
||||
関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
|
@ -1,11 +0,0 @@
|
||||
# تفاعل
|
||||
他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
|
||||
|
||||
## リアクションピッカーのカスタマイズ
|
||||
ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
|
||||
|
||||
## リモート投稿へのリアクションについて
|
||||
リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。
|
||||
|
||||
## リモートからのリアクションについて
|
||||
リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
|
@ -1,6 +0,0 @@
|
||||
# اكتم
|
||||
サイレンスは、アカウントに設定される状態のひとつです。
|
||||
|
||||
アカウントがサイレンス状態になると、ノートの公開範囲をパブリックにできなくなります。 ホーム、フォロワー、ダイレクトは選択可能なため、サイレンスを受けた場合でもフォロワーやあなたのユーザーページを直接訪れた場合は投稿を閲覧できますが、GTL(連合タイムライン)やLTL(ローカルタイムライン)には投稿が流れません。
|
||||
|
||||
アカウントのサイレンス状態は、サーバーのモデレーターによって有効化/無効化されます。
|
@ -1,68 +0,0 @@
|
||||
# المظهر
|
||||
|
||||
テーマを設定して、Misskeyクライアントの見た目を変更できます。
|
||||
|
||||
## テーマの設定
|
||||
設定 > テーマ
|
||||
|
||||
## テーマを作成する
|
||||
テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
|
||||
``` js
|
||||
{
|
||||
id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
|
||||
|
||||
name: 'Danboard',
|
||||
author: 'syuilo',
|
||||
|
||||
base: 'light',
|
||||
|
||||
props: {
|
||||
accent: 'rgb(218, 141, 49)',
|
||||
bg: 'rgb(218, 212, 190)',
|
||||
fg: 'rgb(115, 108, 92)',
|
||||
panel: 'rgb(236, 232, 220)',
|
||||
renote: 'rgb(100, 152, 106)',
|
||||
link: 'rgb(100, 152, 106)',
|
||||
mention: '@accent',
|
||||
hashtag: 'rgb(100, 152, 106)',
|
||||
header: 'rgba(239, 227, 213, 0.75)',
|
||||
navBg: 'rgb(216, 206, 182)',
|
||||
inputBorder: 'rgba(0, 0, 0, 0.1)',
|
||||
},
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
* `id` ... テーマの一意なID。UUIDをおすすめします。
|
||||
* `name` ... テーマ名
|
||||
* `author` ... テーマの作者
|
||||
* `desc` ... テーマの説明(オプション)
|
||||
* `base` ... 明るいテーマか、暗いテーマか
|
||||
* `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
|
||||
* テーマはここで設定されたベーステーマを継承します。
|
||||
* `props` ... テーマのスタイル定義。これから説明します。
|
||||
|
||||
### テーマのスタイル定義
|
||||
`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
|
||||
|
||||
#### バリューで使える構文
|
||||
* 16進数で表された色
|
||||
* 例: `#00ff00`
|
||||
* `rgb(r, g, b)`形式で表された色
|
||||
* 例: `rgb(0, 255, 0)`
|
||||
* `rgb(r, g, b, a)`形式で表された透明度を含む色
|
||||
* 例: `rgba(0, 255, 0, 0.5)`
|
||||
* 他のキーの値の参照
|
||||
* `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
|
||||
* 例: `@panel`
|
||||
* 定数(後述)の参照
|
||||
* `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
|
||||
* 例: `$main`
|
||||
* 関数(後述)
|
||||
* `:{関数名}<{引数}<{色}`
|
||||
|
||||
#### 定数
|
||||
「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
|
||||
|
||||
#### 関数
|
||||
wip
|
@ -1,31 +0,0 @@
|
||||
# الخيط الزمني
|
||||
タイムラインは、[ノート](./note)が時系列で表示される機能です。 タイムラインには以下で示す種類があり、種類によって表示されるノートも異なります。 なお、タイムラインの種類によってはサーバーにより無効になっている場合があります。
|
||||
|
||||
## الرئيسي
|
||||
自分のフォローしているユーザーの投稿が流れます。HTLと略されます。
|
||||
|
||||
## المحلي
|
||||
全てのローカルユーザーの「ホーム」指定されていない投稿が流れます。LTLと略されます。
|
||||
|
||||
## الاجتماعي
|
||||
自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿が流れます。STLと略されます。
|
||||
|
||||
## الشامل
|
||||
全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿が流れます。GTLと略されます。
|
||||
|
||||
## مقارنة
|
||||
| ソース | | | الخيط الزمني | | |
|
||||
| ------------ | ---------- | ------- | ------------ | --------- | ------ |
|
||||
| المستخدمون | الظهور | الرئيسي | المحلي | الاجتماعي | الشامل |
|
||||
| ローカル (フォロー) | 公開 | ✔ | ✔ | ✔ | ✔ |
|
||||
| | الرئيسي | ✔ | | ✔ | |
|
||||
| | المتابِعين | ✔ | ✔ | ✔ | ✔ |
|
||||
| リモート (フォロー) | 公開 | ✔ | | ✔ | ✔ |
|
||||
| | الرئيسي | ✔ | | ✔ | |
|
||||
| | المتابِعين | ✔ | | ✔ | ✔ |
|
||||
| ローカル (未フォロー) | 公開 | | ✔ | ✔ | ✔ |
|
||||
| | الرئيسي | | | | |
|
||||
| | المتابِعين | | | | |
|
||||
| リモート (未フォロー) | 公開 | | | | ✔ |
|
||||
| | الرئيسي | | | | |
|
||||
| | المتابِعين | | | | |
|
@ -1,7 +0,0 @@
|
||||
# ウィジェット
|
||||
ウィジェットは、MisskeyのUI上に設置できる小型の情報表示、操作が行えるパーツです。
|
||||
|
||||
ウィジェットを編集するには、ウィジェット編集モードに切り替えます。切り替え方法はUIによって異なります。 ウィジェット編集モードでは、ウィジェットの追加、削除、並び替え、およびそれぞれのウィジェットの設定を行えます。
|
||||
|
||||
## 利用可能なウィジェット一覧
|
||||
todo
|
@ -1,20 +0,0 @@
|
||||
# ワードミュート
|
||||
ワードミュートの設定をすると、条件に合致したノートが表示されなくなります。
|
||||
|
||||
ワードミュートには、ソフトワードミュートとハードワードミュートの2種類があります。それぞれについて設定の方法と挙動を説明します。
|
||||
|
||||
## ソフトワードミュート
|
||||
ソフトワードミュートは、クライアント(アプリ)側でミュートを判断するワードミュートです。
|
||||
|
||||
ノートが設定した条件に合致すると、「(ユーザー名)が何かを言いました」という表示で隠れます。
|
||||
クリックすると元の通りに表示されます。
|
||||
|
||||
## ハードワードミュート
|
||||
ハードワードミュートは、アンテナのようにサーバーが新しいノートの本文に対して条件に合致するかどうか判断し、タイムラインから対象となったノートを除外します。
|
||||
|
||||
つまり、ハードワードミュートには、以下のような特徴があります。
|
||||
|
||||
* 条件設定後、新しい投稿のみがミュートの対象になります。
|
||||
* 条件を変更しても、過去にハードミュートされたノートはミュートされたままになります。
|
||||
* 「○○が何かを言いました」でタイムラインが埋まることがありません。
|
||||
* ソフトミュートに非対応のアプリでも、ハードミュートは適用されます。
|
@ -1,2 +0,0 @@
|
||||
# المتابَعون
|
||||
ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。
|
@ -1,6 +0,0 @@
|
||||
# サードパーティアプリのリスト
|
||||
## العملاء
|
||||
todo
|
||||
|
||||
## الخدمات المترابطة
|
||||
todo
|
@ -1,5 +0,0 @@
|
||||
# 更新履歴
|
||||
<div class="info">ℹ️ このサーバーの更新履歴です。Misskeyの最新のリリースについては、<a href="https://github.com/misskey-dev/misskey/blob/master/CHANGELOG.md" target="_blank">GitHub</a>をご確認ください。</div>
|
||||
|
||||
<!-- For translators: Do not edit these comments. -->
|
||||
<!--[CHANGELOG]-->
|
@ -1,28 +0,0 @@
|
||||
# よくある質問
|
||||
ここでは利用上のよくある質問について掲載しています。 Misskeyのプロジェクト自体についてのよくある質問は[こちら](./misskey)に掲載されています。
|
||||
|
||||
## iOS/Androidのアプリはありますか?
|
||||
公式にはそういったOSのネイティブアプリを開発していませんが、サードパーティ製のアプリがいくつかあります。 詳しくは[こちら](./apps)をご覧ください。
|
||||
|
||||
ただ、サードパーティ製アプリはどうしても機能への対応が遅れてしまうため、とくに拘りがなければ公式のWebクライアントの利用をおすすめします。 なお、MisskeyのWebクライアントはPWAに対応しているので、ネイティブアプリのように動作させることも可能です。 詳しくは[こちら](todo)をご覧ください。
|
||||
|
||||
## Mastodonクライアントでログインできないのですが?
|
||||
MisskeyはMastodonのAPIと互換性がないため、一部を除きMastodonクライアントでMisskeyを利用することはできません。
|
||||
|
||||
## 他のサーバーのユーザーをフォローするときは?
|
||||
メニューから検索を選び、ユーザー名をホスト込みで入力します。例: `@syuilo@misskey.io`
|
||||
|
||||
## Renoteを削除するには?
|
||||
Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。 Renoteについては[こちら](../features/note)をご確認ください。
|
||||
|
||||
## URLのプレビューを表示させたくない
|
||||
MFMには、そのURLのプレビューを無効にする構文があります。詳細は[MFMチートシート](/mfm-cheat-sheet)をご確認ください。
|
||||
|
||||
## カスタム絵文字を追加したい
|
||||
運営者のみがカスタム絵文字を追加、編集、削除できます。それらを希望する場合は運営者に依頼してください。
|
||||
|
||||
## Botを開発したい
|
||||
Misskey APIを利用してBotの開発が可能です。[こちら](../advanced/develop-bot)をご確認ください。
|
||||
|
||||
## ノートの翻訳機能はどのサービスを使用していますか?
|
||||
[DeepL](https://www.deepl.com/)を使用しています。
|
@ -1,89 +0,0 @@
|
||||
# 用語集
|
||||
Misskeyに関する用語集です。
|
||||
|
||||
## ActivityPub
|
||||
(読み: あくてぃびてぃぱぶ) 分散型を実現するために用いられるプロトコル(仕様)。このプロトコルに則ってサーバー同士通信を行うことで、連合が行われ、Fediverseを形成しています。
|
||||
|
||||
## AiScript
|
||||
(読み: あいすくりぷと) Misskey上で使用できるプログラミング言語です。詳細は[こちら。](../advanced/aiscript)
|
||||
|
||||
## API
|
||||
(読み: えーぴーあい) Misskeyのサーバーが公開している、プログラムからMisskeyを扱うためのインターフェース。詳細は[こちら。](../advanced/api)
|
||||
|
||||
## Bot
|
||||
(読み: ぼっと) プログラムによって動作しているアカウント。
|
||||
|
||||
## CW
|
||||
(読み: こんてんつわーにんぐ) Contents Warningの略。ノートの内容を、操作なしには表示しないようにできる機能。主に長大な内容を隠すためや、ネタバレ防止などに使われます。
|
||||
|
||||
## Fediverse
|
||||
(読み: ふぇでぃばーす) Misskeyを含む様々な分散型ソフトウェアのサーバーで構成されたネットワーク。
|
||||
|
||||
## GTL
|
||||
グローバルタイムライン(Global TimeLine)の略。タイムラインの詳細は[こちら。](../features/timeline)
|
||||
|
||||
## HTL
|
||||
ホームタイムライン(Home TimeLine)の略。タイムラインの詳細は[こちら。](../features/timeline)
|
||||
|
||||
## LTL
|
||||
ローカルタイムライン(Local TimeLine)の略。タイムラインの詳細は[こちら。](../features/timeline)
|
||||
|
||||
## MFM
|
||||
(読み: えむえふえむ) Misskey Flavored Markdownの略で、Misskey上で使用できるマークアップ言語です。詳細は[こちら。](../features/mfm)
|
||||
|
||||
## NSFW
|
||||
(読み: のっとせーふふぉーわーく) Not Safe For Workの略。画像を「閲覧注意」扱いにし、操作なしには表示しないようにすることができる機能。
|
||||
|
||||
## Renote
|
||||
(読み: りのーと) 既にあるノートを引用、もしくはそのノートを新しいノートとして共有する行為、またそれによって作成されたノート。詳細は[こちら。](../features/note)
|
||||
|
||||
## STL
|
||||
ソーシャルタイムライン(Social TimeLine)の略。タイムラインの詳細は[こちら。](../features/timeline)
|
||||
|
||||
## 藍
|
||||
(読み: あい) Misskeyの看板娘(公式キャラクター)です。
|
||||
|
||||
## アクティブユーザー
|
||||
インスタンスにアカウントを作っているユーザーのうち、現在も実際にサービスを利用しているユーザーのこと。
|
||||
|
||||
## مثيل الخادم
|
||||
todo
|
||||
|
||||
## إيموجي مخصص
|
||||
サーバーで用意された絵文字。カスタム絵文字ではない通常の絵文字は「Unicode絵文字」と区別して呼ばれる。
|
||||
|
||||
## コントロールパネル
|
||||
インスタンスの設定画面のこと。
|
||||
|
||||
## サーバー
|
||||
todo
|
||||
|
||||
## اكتم
|
||||
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。詳細は[こちら。](../features/silence)
|
||||
|
||||
## قائمة الانتظار
|
||||
アクティビティ配送などを順番に行うためのシステム。
|
||||
|
||||
## علِق
|
||||
アカウントが使用不可に設定されている状態。
|
||||
|
||||
## قرص التخرين
|
||||
Misskeyにアップロードしたファイルを管理する機能。詳細は[こちら。](../features/drive)
|
||||
|
||||
## الملاحظات
|
||||
Misskeyに投稿される、文章、ファイル、アンケートなどを含めることができるコンテンツ。詳細は[こちら。](../features/note)
|
||||
|
||||
## ミスキスト
|
||||
Misskeyを使う人のこと。
|
||||
|
||||
## مشرِف
|
||||
スパムの凍結およびサイレンスや不適切な投稿の削除など、コミュニティ運営に関する権限を持つユーザー。
|
||||
|
||||
## بُعدي
|
||||
他サーバーのことを指します。リモートユーザーといったように接頭辞としても使われます。ローカルの逆です。
|
||||
|
||||
## الفديرالية
|
||||
サーバー上で作成された情報が他のサーバーに伝わること。
|
||||
|
||||
## المحلي
|
||||
自サーバーのことを指します。ローカルユーザー、ローカルタイムラインといったように接頭辞としても使われます。リモートの逆です。
|
@ -1,12 +0,0 @@
|
||||
# リンク集
|
||||
|
||||
## Webサイト
|
||||
- [Official Discord](https://discord.gg/Wp8gVStHW3) - Misskey公式Discordサーバー
|
||||
- [Misskey Forum](https://forum.misskey.io/) - Misskeyに関する話題を扱うフォーラム
|
||||
|
||||
## アカウント
|
||||
- [@repo@misskey.io](https://misskey.io/@repo) - Misskeyのリポジトリの更新を投稿するbot
|
||||
|
||||
## ライブラリ
|
||||
- [misskey-dev/misskey.js](https://github.com/misskey-dev/misskey.js) - JavaScriptのMisskey SDK
|
||||
- [misskey-dev/mfm.js](https://github.com/misskey-dev/mfm.js) - JavaScriptのMFMパーサー実装
|
@ -1,87 +0,0 @@
|
||||
# عن Misskey
|
||||
|
||||
Misskeyはオープンソースの分散型マイクロブログプラットフォームプロジェクトです。 開発は日本でsyuiloによって2014年から開始されました。 ドライブ、リアクションなどの豊富な機能や、高いカスタマイズ性を備えたUIを持つことが特徴です。
|
||||
|
||||
## 歴史
|
||||
開発当初は掲示板がメインのサービスでしたが、ユーザーが短文を投稿し、それを時系列で流れるタイムライン機能を追加したところ人気が高まり、徐々にそれがメインとして開発が進むようになりました。 当初は分散型ではありませんでしたが、2018年にActivityPubを実装し分散型になったことで、より多くの方に認知され利用されるサービスになり、現在に至ります。
|
||||
<div class="info">ℹ️ Misskeyという名前は、syuiloが当時聴いていたMay'nというアーティストの楽曲、Brain Diverの歌詞に由来します。</div>
|
||||
|
||||
誰でも開発に参加することができ、現在でも活発に開発が続いています。
|
||||
|
||||
## 分散型とは何か?
|
||||
|
||||
<b>分散(distributed)型</b>とは、<b>非中央集権(decentralized)</b>とも呼ばれ、コミュニティが多数のサーバーに分散して存在し、それらが相互に<b>通信(連合、federation)</b>することでコンテンツ共有<b>ネットワーク(Fediverse)</b>を形成していることが特徴のサービスです。 単一のサーバーしか存在しない、もしくは複数存在しても互いに独立している場合は中央集権なサービスと言われ、例えばTwitterやFacebookなどほとんどのサービスがそれに該当します。 分散型のメリットは、自分に合った運営者やテーマのサーバーを選択できることです。自分でサーバーを作成することもできます。連合するおかげで、どのサーバーを選んでも、同じコミュニティにアクセスできます。
|
||||
|
||||
## 常にオープンソース
|
||||
Misskeyはこれまでもこれからも、オープンソースであり続けます。オープンソースとは、簡単に言うと<b>ソフトウェアのソースコード(プログラム)が公開されている</b>ことです。ソースコードの修正や再配布が可能であることを定義に含めることもあります。 Misskeyのすべてのソースコードは[AGPL](https://github.com/misskey-dev/misskey/blob/develop/LICENSE)というオープンソースライセンスの下に[公開](https://github.com/misskey-dev)されていて、誰でも自由に閲覧、使用、修正、改変、再配布をすることができます。 オープンソースは、自分で好きなように変えたり、有害な処理が含まれていないことを確認することができたり、誰でも開発に参加できるなどの、様々なメリットがあります。 上述の分散型を実現するためにも、オープンソースであるということは必要不可欠な要素です。 再び引き合いに出しますが、TwitterやFacebookなどの利益を得ているほとんどのサービスはオープンソースではありません。
|
||||
|
||||
<div class="info">ℹ️ 技術的に言うと、MisskeyのソースコードはGitで管理されていて、リポジトリは<a href="https://github.com/misskey-dev" target="_blank">GitHub上でホスティングされています。</a></div>
|
||||
|
||||
## 開発に参加する、プロジェクトを支援する
|
||||
Misskeyを気に入っていただけたら、ぜひプロジェクトを支援してください。プロジェクトに貢献するには、以下で紹介するようにいろいろな方法があります。方法によっては開発のスキルは不要なので、誰でも気軽に参加し貢献することができます。いつでもお待ちしています。
|
||||
|
||||
### 機能を追加したり、バグを修正する
|
||||
ソフトウェアエンジニアのスキルをお持ちの方であれば、ソースコードを編集する形でプロジェクトに貢献することができます。 貢献についてのガイドは[こちら](https://github.com/misskey-dev/misskey/blob/develop/CONTRIBUTING.md)です。
|
||||
|
||||
### 議論に参加する
|
||||
新しい機能、または既存の機能について意見を述べたり、不具合を報告したりすることでも貢献できます。 そのようなディスカッションは[GitHub](https://github.com/misskey-dev)上か、[フォーラム](https://forum.misskey.io/)等で行われます。
|
||||
|
||||
### テキストを翻訳する
|
||||
Misskeyは様々な言語に対応しています(i18n -internationalizationの略- と呼ばれます)。元の言語は基本的に日本語ですが、有志によって他の言語へと翻訳されています。 その翻訳作業に加わっていただくことでもMisskeyに貢献できます。 Misskeyは[Crowdinというサービスを使用して翻訳の管理を行っています。](https://crowdin.com/project/misskey)
|
||||
|
||||
### 感想を投稿する
|
||||
不具合報告等だけではなく、Misskeyの良い点、楽しい点といったポジティブな意見もぜひ共有してください。開発の励みになり、それは間接的ですがプロジェクトへの貢献です。
|
||||
|
||||
### ミスキストを増やす
|
||||
ミスキストとは、Misskeyを使用する人のことです。 知り合いに紹介するなどしてMisskeyを広めていただければ、ミスキストが増え開発のモチベーションが上がります。
|
||||
|
||||
### 寄付をする
|
||||
Misskeyはビジネスではなく、利用は無料であるため、収益は皆様からの寄付のみです。(インスタンスによっては広告収入を得ているような場合もありますが、それは運営者の収入であり直接開発者への収入にはなりません) 寄付をしていただければ、今後も開発を続けることが可能になり、プロジェクトへの貢献になります。 寄付は基本的には[Patreon](https://www.patreon.com/syuilo)で受け付けています。 一定額寄付していただけると、Misskeyの[情報ページ](/about-misskey)に名前を記載することができます。
|
||||
|
||||
また、サーバーの運営者も、基本的には収益を得ていません。サーバーの運営にはコストがかかるので、運営者の支援をすることもご検討ください。 開発には直接関係しませんが、サーバーがあってこそのプロジェクトなので、運営が維持されるというのは開発と同じくらい重要なことです。
|
||||
|
||||
## クレジット
|
||||
Misskeyの開発者や、Misskeyに寄付をしてくださった方の一覧は[こちら](/about-misskey)で見ることができます。
|
||||
|
||||
## よくある質問
|
||||
### プロジェクトは何を目指していますか?
|
||||
強いて言うと、漠然的になりますが広く使われる汎用的なプラットフォームになることを目指しています。 Misskeyは他のプロジェクトとは違い、何らかの思想(例えば、反中央集権)やビジョンに基づいて開発が行われているわけではなく、その点ではフラットです。 それが逆に、特定の方向性に縛られないフレキシブルさを生み出すことに繋がっていると感じています。
|
||||
<!-- TODO: ここにロードマップへのリンク -->
|
||||
|
||||
### 企業によって開発されていますか?
|
||||
いいえ。Misskeyの開発は個人で行われており、商業的でもないため、特定の企業の関りはありません。 開発メンバーも基本的にはボランティアです。 また、開発に対し企業のスポンサーがつくこともありますが、その場合でもやはり開発は個人のコミュニティが主体です。
|
||||
|
||||
### 誰が運営していますか?
|
||||
Misskeyは分散型なため、各サーバーにそれぞれ異なった運営者がいます。従って、特定の個人や企業によって、Misskeyの全てが運営されているわけではありません。 また、開発チームが運営を行うわけでもないため、運営に関する連絡は、お使いのサーバーの運営者に行ってください。 サーバーの運営者は、[このページ](/about)で確認することができます。 あなたがサーバーを作成すれば、あなたが運営者になります。
|
||||
|
||||
### どのサーバーを選べばいいですか?
|
||||
[サーバー一覧が公開されています。](https://join.misskey.page/ja-JP/instances) サーバーによってコミュニティのテーマ(特定のこと、ものが好き 等)が決められている場合があるので、自分に合ったテーマのサーバーがあれば、そこを選ぶと良いかもしれません。 他にも、サーバーの規模、ユーザー層、国および言語、運営者が信頼できるかどうか、などの観点があります。 なお、Misskey公式のサーバーというものはありません。自身で新しくサーバーを作成するという選択肢もあります。
|
||||
|
||||
基本的にどのサーバーを選んだとしても、他の全てのサーバーのユーザーと繋がることができます。
|
||||
|
||||
### サーバーを建てるにはどうしたらいいですか?
|
||||
Misskeyサーバーの作成に興味を持っていただきありがとうございます。 2021年現在、Misskeyのホスティングサービスは存在しないため、サーバーの作成にはある程度の知識が必要です。 サーバーの作成方法については[こちら](todo)をご覧ください。
|
||||
|
||||
### どのような技術を使用していますか?
|
||||
Misskeyは開発が進むにつれ使用する技術も大きく変わってきました。開発当初はMySQL + PHP + jQueryといった構成でしたが、現在は以下のようになっています。
|
||||
- サーバーサイド: Node.js
|
||||
- データベース: PostgreSQL、Redis
|
||||
- UIフレームワーク: Vue.js
|
||||
- プログラミング言語: TypeScript
|
||||
|
||||
また、MFMやAiScriptなどの、Misskeyから派生して独自の技術も開発しています。
|
||||
|
||||
### Mastodonのフォークですか?
|
||||
いいえ。MisskeyはMastodonやその他のプロジェクトとは全く別のプロジェクトです。 開発に関しても、Misskeyの方が昔から開発されています。ただし、分散型になったのはMastodonの登場より後です。 同じActivityPubという分散のためのプロトコルを実装しているという点以外、両者に特に関りがあるわけでもありません。
|
||||
|
||||
### iOS/Androidのアプリはありますか?
|
||||
公式にはそういったOSのネイティブアプリを開発していませんが、サードパーティ製のアプリがいくつかあります。 詳しくは[こちら](./apps)をご覧ください。
|
||||
|
||||
ただ、サードパーティ製アプリはどうしても機能への対応が遅れてしまうため、とくに拘りがなければ公式のWebクライアントの利用をおすすめします。 なお、MisskeyのWebクライアントはPWAに対応しているので、ネイティブアプリのように動作させることも可能です。 詳しくは[こちら](todo)をご覧ください。
|
||||
|
||||
### Misskeyのロゴ、アイコンはどこで入手できますか?
|
||||
(準備中)
|
||||
|
||||
### 時折目にする猫耳の可愛い女の子は?
|
||||
Misskeyの守り神、藍ちゃんです。アイチャンカワイイヤッター!
|
||||
<div class="info">ℹ️ 藍ちゃんについては<a href="https://xn--931a.moe/" target="_blank">こちら</a>です。</div>
|
@ -1,8 +0,0 @@
|
||||
# 不具合の報告
|
||||
不具合と思われる状況に遭遇したときは、まず[トラブルシューティング](./troubleshooting)をご一読ください。 それでも問題が解決しないときは、以下の情報を含めて[フォーラム](https://forum.misskey.io/)に投稿してください。 投稿することで、解決策が見つかったり、不具合と判断されれば開発チームによって修正が行われます。
|
||||
|
||||
## 含める情報
|
||||
- Misskeyのバージョン([情報ページ](/about)で確認できます)
|
||||
- お使いのブラウザの種類とバージョン
|
||||
- お使いのOSの種類とバージョン
|
||||
- 問題の再現手順
|
@ -1,40 +0,0 @@
|
||||
# トラブルシューティング
|
||||
<div class="info">ℹ️ <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
|
||||
|
||||
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。
|
||||
|
||||
## クライアントが起動しない
|
||||
ほとんどの場合、お使いのブラウザまたはOSのバージョンが古いことが原因です。 ブラウザおよびOSのバージョンを最新のものに更新してから、再度試してみてください。
|
||||
|
||||
これは稀ですが、それでも起動しない場合は、キャッシュが原因の場合があります。ブラウザのキャッシュをクリアして、再度試してみてください。
|
||||
|
||||
## ページが読み込めない
|
||||
クライアントが起動するもののページが読み込めないというエラーが出る場合は、ネットワークに問題がないか確認してください。また、サーバーがダウンしていないか確認してください。
|
||||
|
||||
これは稀ですが、キャッシュが原因の場合があります。ブラウザのキャッシュをクリアして、再度試してみてください。
|
||||
|
||||
まだ問題がある場合は、サーバーの問題と思われるのでサーバーの管理者に連絡してください。
|
||||
|
||||
## クライアントの動作が遅い
|
||||
以下を試してみてください:
|
||||
|
||||
- クライアント設定で「UIのアニメーションを減らす」を有効にする
|
||||
- クライアント設定で「モーダルにぼかし効果を使用」を無効にする
|
||||
- お使いのブラウザの設定でハードウェアアクセラレーションを有効にする
|
||||
- お使いのデバイスのスペックを上げる
|
||||
|
||||
## UIの一部の表示がおかしい(背景が透明になっている等)
|
||||
アップデートによりUIの改修が行われたときに、テーマのキャッシュシステムの影響でそのような表示になることがあります。 クライアントの設定の「キャッシュをクリア」すると直ります。
|
||||
<div class="warn">⚠️ 「クライアントの」キャッシュクリアです。「ブラウザの」キャッシュクリアは行わないでください。</div>
|
||||
|
||||
## 通知やアンテナ等の点滅が消えない
|
||||
点滅は、未読のコンテンツがあることを示しています。通常点滅が消えない場合は、コンテンツを遡ると未読なコンテンツが残っています。 すべて既読にしたと思われるのに、それでもなお点滅が続く場合(おそらく不具合と思われます)は設定から強制的にすべて既読扱いにすることができます。
|
||||
|
||||
## Renoteができない
|
||||
フォロワー限定のノートはRenoteすることはできません。
|
||||
|
||||
## UI上で特定の要素が表示されない
|
||||
広告ブロッカーを使用しているとそのような不具合が発生することがあります。Misskeyではオフにしてご利用ください。
|
||||
|
||||
## UI上で未翻訳の部分がある
|
||||
ほとんどの場合、単に翻訳が間に合っていないだけで、不具合ではありません。翻訳が終わるまでお待ちください。 [翻訳に参加](./misskey)していただくことも可能です。
|
@ -1,68 +0,0 @@
|
||||
# キーボードショートカット
|
||||
|
||||
## الشامل
|
||||
これらのショートカットは基本的にどこでも使えます。
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr>
|
||||
<tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr>
|
||||
<tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr>
|
||||
<tr><td><kbd class="key">S</kbd></td><td>البحث</td><td><b>S</b>earch</td></tr>
|
||||
<tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 投稿にフォーカスされた状態
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr>
|
||||
<tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr>
|
||||
<tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr>
|
||||
<tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr>
|
||||
<tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr>
|
||||
<tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr>
|
||||
<tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Renoteフォーム
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## リアクションフォーム
|
||||
デフォルトで「👍」にフォーカスが当たっている状態です。
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>ショートカット</th><th>効果</th><th>由来</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr>
|
||||
<tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr>
|
||||
</tbody>
|
||||
</table>
|
@ -1,2 +0,0 @@
|
||||
# MFM
|
||||
MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。
|
@ -1,13 +0,0 @@
|
||||
# اكتم
|
||||
|
||||
ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります:
|
||||
|
||||
* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote)
|
||||
* そのユーザーからの通知
|
||||
* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴
|
||||
|
||||
ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。
|
||||
|
||||
ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。
|
||||
|
||||
設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。
|
@ -1,10 +0,0 @@
|
||||
# Pages
|
||||
|
||||
## 変数
|
||||
変数を使うことで動的なページを作成できます。テキスト内で <b>{ 変数名 }</b> と書くとそこに変数の値を埋め込めます。例えば <b>Hello { thing } world!</b> というテキストで、変数(thing)の値が <b>ai</b> だった場合、テキストは <b>Hello ai world!</b> になります。
|
||||
|
||||
変数の評価(値を算出すること)は上から下に行われるので、ある変数の中で自分より下の変数を参照することはできません。例えば上から <b>A、B、C</b> と3つの変数を定義したとき、<b>C</b>の中で<b>A</b>や<b>B</b>を参照することはできますが、<b>A</b>の中で<b>B</b>や<b>C</b>を参照することはできません。
|
||||
|
||||
ユーザーからの入力を受け取るには、ページに「ユーザー入力」ブロックを設置し、「変数名」に入力を格納したい変数名を設定します(変数は自動で作成されます)。その変数を使ってユーザー入力に応じた動作を行えます。
|
||||
|
||||
関数を使うと、値の算出処理を再利用可能な形にまとめることができます。関数を作るには、「関数」タイプの変数を作成します。関数にはスロット(引数)を設定することができ、スロットの値は関数内で変数として利用可能です。また、関数を引数に取る関数(高階関数と呼ばれます)も存在します。関数は予め定義しておくほかに、このような高階関数のスロットに即席でセットすることもできます。
|
@ -1,11 +0,0 @@
|
||||
# تفاعل
|
||||
他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。
|
||||
|
||||
## リアクションピッカーのカスタマイズ
|
||||
ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。
|
||||
|
||||
## リモート投稿へのリアクションについて
|
||||
リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。
|
||||
|
||||
## リモートからのリアクションについて
|
||||
リモートから「Like」アクティビティを受信したとき、Misskeyでは「👍」のリアクションとして解釈されます。
|
@ -1,160 +0,0 @@
|
||||
# MisskeyリバーシBotの開発
|
||||
Misskeyのリバーシ機能に対応したBotの開発方法をここに記します。
|
||||
|
||||
1. `games/reversi`ストリームに以下のパラメータを付けて接続する:
|
||||
* `i`: botアカウントのAPIキー
|
||||
|
||||
2. 対局への招待が来たら、ストリームから`invited`イベントが流れてくる
|
||||
* イベントの中身に、`parent`という名前で対局へ誘ってきたユーザーの情報が含まれている
|
||||
|
||||
3. `games/reversi/match`へ、`user_id`として`parent`の`id`が含まれたリクエストを送信する
|
||||
|
||||
4. 上手くいくとゲーム情報が返ってくるので、`games/reversi-game`ストリームへ、以下のパラメータを付けて接続する:
|
||||
* `i`: botアカウントのAPIキー
|
||||
* `game`: `game`の`id`
|
||||
|
||||
5. この間、相手がゲームの設定を変更するとその都度`update-settings`イベントが流れてくるので、必要であれば何かしらの処理を行う
|
||||
|
||||
6. 設定に満足したら、`{ type: 'accept' }`メッセージをストリームに送信する
|
||||
|
||||
7. ゲームが開始すると、`started`イベントが流れてくる
|
||||
* イベントの中身にはゲーム情報が含まれている
|
||||
|
||||
8. 石を打つには、ストリームに`{ type: 'set', pos: <位置> }`を送信する(位置の計算方法は後述)
|
||||
|
||||
9. 相手または自分が石を打つと、ストリームから`set`イベントが流れてくる
|
||||
* `color`として石の色が含まれている
|
||||
* `pos`として位置情報が含まれている
|
||||
|
||||
## 位置の計算法
|
||||
8x8のマップを考える場合、各マスの位置(インデックスと呼びます)は次のようになっています:
|
||||
```
|
||||
+--+--+--+--+--+--+--+--+
|
||||
| 0| 1| 2| 3| 4| 5| 6| 7|
|
||||
+--+--+--+--+--+--+--+--+
|
||||
| 8| 9|10|11|12|13|14|15|
|
||||
+--+--+--+--+--+--+--+--+
|
||||
|16|17|18|19|20|21|22|23|
|
||||
...
|
||||
```
|
||||
|
||||
### X,Y座標 から インデックス に変換する
|
||||
```
|
||||
pos = x + (y * mapWidth)
|
||||
```
|
||||
`mapWidth`は、ゲーム情報の`map`から、次のようにして計算できます:
|
||||
```
|
||||
mapWidth = map[0].length
|
||||
```
|
||||
|
||||
### インデックス から X,Y座標 に変換する
|
||||
```
|
||||
x = pos % mapWidth
|
||||
y = Math.floor(pos / mapWidth)
|
||||
```
|
||||
|
||||
## マップ情報
|
||||
マップ情報は、ゲーム情報の`map`に入っています。 文字列の配列になっており、ひとつひとつの文字がマス情報を表しています。 それをもとにマップのデザインを知る事が出来ます:
|
||||
* `(スペース)` ... マス無し
|
||||
* `-` ... マス
|
||||
* `b` ... 初期配置される黒石
|
||||
* `w` ... 初期配置される白石
|
||||
|
||||
例えば、4*4の次のような単純なマップがあるとします:
|
||||
```text
|
||||
+---+---+---+---+
|
||||
| | | | |
|
||||
+---+---+---+---+
|
||||
| | ○ | ● | |
|
||||
+---+---+---+---+
|
||||
| | ● | ○ | |
|
||||
+---+---+---+---+
|
||||
| | | | |
|
||||
+---+---+---+---+
|
||||
```
|
||||
|
||||
この場合、マップデータはこのようになります:
|
||||
```javascript
|
||||
['----', '-wb-', '-bw-', '----']
|
||||
```
|
||||
|
||||
## ユーザーにフォームを提示して対話可能Botを作成する
|
||||
ユーザーとのコミュニケーションを行うため、ゲームの設定画面でユーザーにフォームを提示することができます。 例えば、Botの強さをユーザーが設定できるようにする、といったシナリオが考えられます。
|
||||
|
||||
フォームを提示するには、`reversi-game`ストリームに次のメッセージを送信します:
|
||||
```javascript
|
||||
{
|
||||
type: 'init-form',
|
||||
body: [フォームコントロールの配列]
|
||||
}
|
||||
```
|
||||
|
||||
フォームコントロールの配列については今から説明します。 フォームコントロールは、次のようなオブジェクトです:
|
||||
```javascript
|
||||
{
|
||||
id: 'switch1',
|
||||
type: 'switch',
|
||||
label: 'Enable hoge',
|
||||
value: false
|
||||
}
|
||||
```
|
||||
`id` ... コントロールのID。 `type` ... コントロールの種類。後述します。 `label` ... コントロールと一緒に表記するテキスト。 `value` ... コントロールのデフォルト値。
|
||||
|
||||
### フォームの操作を受け取る
|
||||
ユーザーがフォームを操作すると、ストリームから`update-form`イベントが流れてきます。 イベントの中身には、コントロールのIDと、ユーザーが設定した値が含まれています。 例えば、上で示したスイッチをユーザーがオンにしたとすると、次のイベントが流れてきます:
|
||||
```javascript
|
||||
{
|
||||
id: 'switch1',
|
||||
value: true
|
||||
}
|
||||
```
|
||||
|
||||
### フォームコントロールの種類
|
||||
#### スイッチ
|
||||
type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。
|
||||
|
||||
##### プロパティ
|
||||
`label` ... スイッチに表記するテキスト。
|
||||
|
||||
#### ラジオボタン
|
||||
type: `radio` ラジオボタンを表示します。選択肢を提示するのに有用です。例えば、Botの強さを設定させるなどです。
|
||||
|
||||
##### プロパティ
|
||||
`items` ... ラジオボタンの選択肢。例:
|
||||
```javascript
|
||||
items: [{
|
||||
label: '弱',
|
||||
value: 1
|
||||
}, {
|
||||
label: '中',
|
||||
value: 2
|
||||
}, {
|
||||
label: '強',
|
||||
value: 3
|
||||
}]
|
||||
```
|
||||
|
||||
#### スライダー
|
||||
type: `slider` スライダーを表示します。
|
||||
|
||||
##### プロパティ
|
||||
`min` ... スライダーの下限。 `max` ... スライダーの上限。 `step` ... 入力欄で刻むステップ値。
|
||||
|
||||
#### テキストボックス
|
||||
type: `textbox` テキストボックスを表示します。ユーザーになにか入力させる一般的な用途に利用できます。
|
||||
|
||||
## ユーザーにメッセージを表示する
|
||||
設定画面でユーザーと対話する、フォーム以外のもうひとつの方法がこれです。ユーザーになにかメッセージを表示することができます。 例えば、ユーザーがBotの対応していないモードやマップを選択したとき、警告を表示するなどです。 メッセージを表示するには、次のメッセージをストリームに送信します:
|
||||
```javascript
|
||||
{
|
||||
type: 'message',
|
||||
body: {
|
||||
text: 'メッセージ内容',
|
||||
type: 'メッセージの種類'
|
||||
}
|
||||
}
|
||||
```
|
||||
メッセージの種類: `success`, `info`, `warning`, `error`。
|
||||
|
||||
## 投了する
|
||||
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
|
@ -1,354 +0,0 @@
|
||||
# ストリーミングAPI
|
||||
|
||||
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
|
||||
|
||||
## ストリームに接続する
|
||||
|
||||
ストリーミングAPIを利用するには、まずMisskeyサーバーに**websocket**接続する必要があります。
|
||||
|
||||
以下のURLに、`i`というパラメータ名で認証情報を含めて、websocket接続してください。例:
|
||||
```
|
||||
%WS_URL%/streaming?i=xxxxxxxxxxxxxxx
|
||||
```
|
||||
|
||||
認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。
|
||||
|
||||
<div class="ui info">
|
||||
<p><i class="fas fa-info-circle"></i> 認証情報の取得については、<a href="./api">こちらのドキュメント</a>をご確認ください。</p>
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:
|
||||
|
||||
```
|
||||
%WS_URL%/streaming
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述する**チャンネル**に接続する必要があります。
|
||||
|
||||
**ストリームでのやり取りはすべてJSONです。**
|
||||
|
||||
## チャンネル
|
||||
MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。
|
||||
|
||||
### チャンネルに接続する
|
||||
チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'connect',
|
||||
body: {
|
||||
channel: 'xxxxxxxx',
|
||||
id: 'foobar',
|
||||
params: {
|
||||
...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `channel`には接続したいチャンネル名を設定します。チャンネルの種類については後述します。
|
||||
* `id`にはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
|
||||
* `params`はチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。
|
||||
|
||||
<div class="ui info">
|
||||
<p><i class="fas fa-info-circle"></i> IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。</p>
|
||||
</div>
|
||||
|
||||
### チャンネルからのメッセージを受け取る
|
||||
例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。
|
||||
|
||||
チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:
|
||||
```json
|
||||
{
|
||||
type: 'channel',
|
||||
body: {
|
||||
id: 'foobar',
|
||||
type: 'something',
|
||||
body: {
|
||||
some: 'thing'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
|
||||
* `type`にはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
|
||||
* `body`にはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。
|
||||
|
||||
### チャンネルに向けてメッセージを送信する
|
||||
チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。
|
||||
|
||||
チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:
|
||||
```json
|
||||
{
|
||||
type: 'channel',
|
||||
body: {
|
||||
id: 'foobar',
|
||||
type: 'something',
|
||||
body: {
|
||||
some: 'thing'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
|
||||
* `type`にはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
|
||||
* `body`にはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。
|
||||
|
||||
### チャンネルから切断する
|
||||
チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'disconnect',
|
||||
body: {
|
||||
id: 'foobar'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には前述したそのチャンネルに接続する際に設定したIDを設定します。
|
||||
|
||||
## ストリームを経由してAPIリクエストする
|
||||
|
||||
ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。
|
||||
|
||||
ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:
|
||||
```json
|
||||
{
|
||||
type: 'api',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
endpoint: 'notes/create',
|
||||
data: {
|
||||
text: 'yee haw!'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`には、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
|
||||
* `endpoint`には、あなたがリクエストしたいAPIのエンドポイントを指定します。
|
||||
* `data`には、エンドポイントのパラメータを含めます。
|
||||
|
||||
<div class="ui info">
|
||||
<p><i class="fas fa-info-circle"></i> APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。</p>
|
||||
</div>
|
||||
|
||||
### レスポンスの受信
|
||||
|
||||
APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'api:xxxxxxxxxxxxxxxx',
|
||||
body: {
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `xxxxxxxxxxxxxxxx`の部分には、リクエストの際に設定された`id`が含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
|
||||
* `body`には、レスポンスが含まれています。
|
||||
|
||||
## 投稿のキャプチャ
|
||||
|
||||
Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。
|
||||
|
||||
例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。
|
||||
|
||||
しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。
|
||||
|
||||
この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。
|
||||
|
||||
### 投稿をキャプチャする
|
||||
|
||||
投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'subNote',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`にキャプチャしたい投稿の`id`を設定します。
|
||||
|
||||
このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。
|
||||
|
||||
例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'reacted',
|
||||
body: {
|
||||
reaction: 'like',
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `body`内の`id`に、イベントを発生させた投稿のIDが設定されます。
|
||||
* `body`内の`type`に、イベントの種類が設定されます。
|
||||
* `body`内の`body`に、イベントの詳細が設定されます。
|
||||
|
||||
#### イベントの種類
|
||||
|
||||
##### `reacted`
|
||||
その投稿にリアクションがされた時に発生します。
|
||||
|
||||
* `reaction`に、リアクションの種類が設定されます。
|
||||
* `userId`に、リアクションを行ったユーザーのIDが設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'reacted',
|
||||
body: {
|
||||
reaction: 'like',
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### `deleted`
|
||||
その投稿が削除された時に発生します。
|
||||
|
||||
* `deletedAt`に、削除日時が設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'deleted',
|
||||
body: {
|
||||
deletedAt: '2018-10-22T02:17:09.703Z'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### `pollVoted`
|
||||
その投稿に添付されたアンケートに投票された時に発生します。
|
||||
|
||||
* `choice`に、選択肢IDが設定されます。
|
||||
* `userId`に、投票を行ったユーザーのIDが設定されます。
|
||||
|
||||
例:
|
||||
```json
|
||||
{
|
||||
type: 'noteUpdated',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx',
|
||||
type: 'pollVoted',
|
||||
body: {
|
||||
choice: 2,
|
||||
userId: 'yyyyyyyyyyyyyyyy'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 投稿のキャプチャを解除する
|
||||
|
||||
その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。
|
||||
|
||||
次のメッセージを送信します:
|
||||
|
||||
```json
|
||||
{
|
||||
type: 'unsubNote',
|
||||
body: {
|
||||
id: 'xxxxxxxxxxxxxxxx'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ここで、
|
||||
* `id`にキャプチャを解除したい投稿の`id`を設定します。
|
||||
|
||||
このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。
|
||||
|
||||
# チャンネル一覧
|
||||
## `main`
|
||||
アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `renote`
|
||||
自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。
|
||||
|
||||
#### `mention`
|
||||
誰かからメンションされたときに発生するイベントです。
|
||||
|
||||
#### `readAllNotifications`
|
||||
自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。
|
||||
|
||||
#### `meUpdated`
|
||||
自分の情報が更新されたことを表すイベントです。
|
||||
|
||||
#### `follow`
|
||||
自分が誰かをフォローしたときに発生するイベントです。
|
||||
|
||||
#### `unfollow`
|
||||
自分が誰かのフォローを解除したときに発生するイベントです。
|
||||
|
||||
#### `followed`
|
||||
自分が誰かにフォローされたときに発生するイベントです。
|
||||
|
||||
## `homeTimeline`
|
||||
ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
タイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `localTimeline`
|
||||
ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `hybridTimeline`
|
||||
ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
||||
|
||||
## `globalTimeline`
|
||||
グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。
|
||||
|
||||
### 流れてくるイベント一覧
|
||||
|
||||
#### `note`
|
||||
グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。
|
@ -1,68 +0,0 @@
|
||||
# المظهر
|
||||
|
||||
テーマを設定して、Misskeyクライアントの見た目を変更できます。
|
||||
|
||||
## テーマの設定
|
||||
設定 > テーマ
|
||||
|
||||
## テーマを作成する
|
||||
テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。
|
||||
``` js
|
||||
{
|
||||
id: '17587283-dd92-4a2c-a22c-be0637c9e22a',
|
||||
|
||||
name: 'Danboard',
|
||||
author: 'syuilo',
|
||||
|
||||
base: 'light',
|
||||
|
||||
props: {
|
||||
accent: 'rgb(218, 141, 49)',
|
||||
bg: 'rgb(218, 212, 190)',
|
||||
fg: 'rgb(115, 108, 92)',
|
||||
panel: 'rgb(236, 232, 220)',
|
||||
renote: 'rgb(100, 152, 106)',
|
||||
link: 'rgb(100, 152, 106)',
|
||||
mention: '@accent',
|
||||
hashtag: 'rgb(100, 152, 106)',
|
||||
header: 'rgba(239, 227, 213, 0.75)',
|
||||
navBg: 'rgb(216, 206, 182)',
|
||||
inputBorder: 'rgba(0, 0, 0, 0.1)',
|
||||
},
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
* `id` ... テーマの一意なID。UUIDをおすすめします。
|
||||
* `name` ... テーマ名
|
||||
* `author` ... テーマの作者
|
||||
* `desc` ... テーマの説明(オプション)
|
||||
* `base` ... 明るいテーマか、暗いテーマか
|
||||
* `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。
|
||||
* テーマはここで設定されたベーステーマを継承します。
|
||||
* `props` ... テーマのスタイル定義。これから説明します。
|
||||
|
||||
### テーマのスタイル定義
|
||||
`props`下にはテーマのスタイルを定義します。 キーがCSSの変数名になり、バリューで中身を指定します。 なお、この`props`オブジェクトはベーステーマから継承されます。 ベーステーマは、このテーマの`base`が`light`なら[_light.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_light.json5)で、`dark`なら[_dark.json5](https://github.com/misskey-dev/misskey/blob/develop/src/client/themes/_dark.json5)です。 つまり、このテーマ内の`props`に`panel`というキーが無くても、そこにはベーステーマの`panel`があると見なされます。
|
||||
|
||||
#### バリューで使える構文
|
||||
* 16進数で表された色
|
||||
* 例: `#00ff00`
|
||||
* `rgb(r, g, b)`形式で表された色
|
||||
* 例: `rgb(0, 255, 0)`
|
||||
* `rgb(r, g, b, a)`形式で表された透明度を含む色
|
||||
* 例: `rgba(0, 255, 0, 0.5)`
|
||||
* 他のキーの値の参照
|
||||
* `@{キー名}`と書くと他のキーの値の参照になります。`{キー名}`は参照したいキーの名前に置き換えます。
|
||||
* 例: `@panel`
|
||||
* 定数(後述)の参照
|
||||
* `${定数名}`と書くと定数の参照になります。`{定数名}`は参照したい定数の名前に置き換えます。
|
||||
* 例: `$main`
|
||||
* 関数(後述)
|
||||
* `:{関数名}<{引数}<{色}`
|
||||
|
||||
#### 定数
|
||||
「CSS変数として出力はしたくないが、他のCSS変数の値として使いまわしたい」値があるときは、定数を使うと便利です。 キー名を`$`で始めると、そのキーはCSS変数として出力されません。
|
||||
|
||||
#### 関数
|
||||
wip
|
@ -1,15 +0,0 @@
|
||||
# مقارنة الجدول الزمني
|
||||
|
||||
https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing
|
||||
|
||||
## الواجهة الرئيسية
|
||||
مشاركات المستخدمين الذين تتابعهم
|
||||
|
||||
## المحلي
|
||||
جميع مشاركات المستخدمين المحليين التي لم يتم وضع علامة عليها على أنها "صفحة رئيسية فقط "
|
||||
|
||||
## إجتماعي
|
||||
مشاركات المستخدمين الذين تتابعهم بالإضافة إلى جميع مشاركات المستخدمين المحليين التي لم يتم وضع علامة عليها كـ "الصفحة الرئيسية فقط"
|
||||
|
||||
## عالمي
|
||||
全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿
|
@ -1,8 +0,0 @@
|
||||
# LTL/STL/GTLの無効化
|
||||
Misskeyでは、LTL/STL/GTLをそれぞれ無効化することができます。有効/無効を切り替えるには、インスタンスコントロールパネルで設定します。
|
||||
|
||||
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。
|
||||
|
||||
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します。</div>
|
||||
|
||||
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です。
|
@ -1,5 +0,0 @@
|
||||
# よくある質問
|
||||
ここでは、サーバー管理者向けのよくある質問を掲載しています。
|
||||
|
||||
## デフォルトテーマを設定したい
|
||||
現在、デフォルトテーマ設定機能は実装されていません。
|
@ -1,7 +0,0 @@
|
||||
# AiScript
|
||||
AiScriptは、Misskeyで使用できるスクリプト言語です。
|
||||
|
||||
<div class="info">ℹ️ AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されています。</a></div>
|
||||
|
||||
## 使い方
|
||||
AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されています。
|
@ -1,58 +0,0 @@
|
||||
# Misskey API
|
||||
|
||||
MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です。
|
||||
|
||||
APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します。
|
||||
|
||||
## アクセストークンの取得
|
||||
基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります。
|
||||
|
||||
* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む
|
||||
* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む
|
||||
|
||||
### 自分自身のアクセストークンを手動発行する
|
||||
「設定 > API」で、自分のアクセストークンを発行できます。
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
### アプリケーション利用者にアクセストークンの発行をリクエストする
|
||||
アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします。
|
||||
|
||||
#### Step 1
|
||||
|
||||
UUIDを生成する。以後これをセッションIDと呼びます。
|
||||
|
||||
> このセッションIDは毎回生成し、使いまわさないようにしてください。
|
||||
|
||||
#### Step 2
|
||||
|
||||
`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください。
|
||||
> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
|
||||
|
||||
表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます:
|
||||
* `name` ... アプリケーション名
|
||||
* > 例: `MissDeck`
|
||||
* `icon` ... アプリケーションのアイコン画像URL
|
||||
* > 例: `https://missdeck.example.com/icon.png`
|
||||
* `callback` ... 認証が終わった後にリダイレクトするURL
|
||||
* > 例: `https://missdeck.example.com/callback`
|
||||
* リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
|
||||
* `permission` ... アプリケーションが要求する権限
|
||||
* > 例: `write:notes,write:following,read:drive`
|
||||
* 要求する権限を`,`で区切って列挙します
|
||||
* どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
|
||||
|
||||
#### Step 3
|
||||
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
|
||||
|
||||
レスポンスに含まれるプロパティ:
|
||||
* `token` ... ユーザーのアクセストークン
|
||||
* `user` ... ユーザーの情報
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
|
||||
## APIの使い方
|
||||
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
|
||||
|
||||
* [APIリファレンス](/api-doc)
|
||||
* [ストリーミングAPI](./stream)
|
@ -1,74 +0,0 @@
|
||||
# プラグインの作成
|
||||
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
|
||||
|
||||
## Metadata
|
||||
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
|
||||
|
||||
### name
|
||||
プラグイン名
|
||||
|
||||
### author
|
||||
プラグイン作者
|
||||
|
||||
### version
|
||||
プラグインバージョン。数値を指定してください。
|
||||
|
||||
### description
|
||||
プラグインの説明
|
||||
|
||||
### permissions
|
||||
プラグインが要求する権限。MisskeyAPIにリクエストする際に用いられます。
|
||||
|
||||
### config
|
||||
プラグインの設定情報を表すオブジェクト。 キーに設定名、値に以下のプロパティを含めます。
|
||||
|
||||
#### type
|
||||
設定値の種類を表す文字列。以下から選択します。 string number boolean
|
||||
|
||||
#### label
|
||||
ユーザーに表示する設定名
|
||||
|
||||
#### description
|
||||
設定の説明
|
||||
|
||||
#### default
|
||||
設定のデフォルト値
|
||||
|
||||
## APIリファレンス
|
||||
AiScript標準で組み込まれているAPIは掲載しません。
|
||||
|
||||
### Mk:dialog(title text type)
|
||||
ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると info になります。
|
||||
|
||||
### Mk:confirm(title text type)
|
||||
確認ダイアログを表示します。typeには以下の値が設定できます。 info success warn error question 省略すると question になります。 ユーザーが"OK"を選択した場合は true を、"キャンセル"を選択した場合は false が返ります。
|
||||
|
||||
### Mk:api(endpoint params)
|
||||
Misskey APIにリクエストします。第一引数にエンドポイント名、第二引数にパラメータオブジェクトを渡します。
|
||||
|
||||
### Mk:save(key value)
|
||||
任意の値に任意の名前を付けて永続化します。永続化した値は、AiScriptコンテキストが終了しても残り、Mk:loadで読み取ることができます。
|
||||
|
||||
### Mk:load(key)
|
||||
Mk:saveで永続化した指定の名前の値を読み取ります。
|
||||
|
||||
### Plugin:register_post_form_action(title fn)
|
||||
投稿フォームにアクションを追加します。第一引数にアクション名、第二引数にアクションが選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に投稿フォームオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_action(title fn)
|
||||
ノートメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_user_action(title fn)
|
||||
ユーザーメニューに項目を追加します。第一引数に項目名、第二引数に項目が選択された際のコールバック関数を渡します。 コールバック関数には、第一引数に対象のユーザーオブジェクトが渡されます。
|
||||
|
||||
### Plugin:register_note_view_interruptor(fn)
|
||||
UIに表示されるノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:register_note_post_interruptor(fn)
|
||||
ノート投稿時にノート情報を書き換えます。 コールバック関数には、第一引数に対象のノートオブジェクトが渡されます。 コールバック関数の返り値でノートが書き換えられます。
|
||||
|
||||
### Plugin:open_url(url)
|
||||
第一引数に渡されたURLをブラウザの新しいタブで開きます。
|
||||
|
||||
### Plugin:config
|
||||
プラグインの設定が格納されるオブジェクト。プラグイン定義のconfigで設定したキーで値が入ります。
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user