Merge branch 'develop' into swn

This commit is contained in:
tamaina 2021-10-23 10:52:48 +09:00
commit 2a747127de
95 changed files with 2030 additions and 665 deletions

View File

@ -10,7 +10,12 @@
--> -->
## 12.x.x (unreleased) ## 12.93.1 (2021/10/23)
### Bugfixes
- クライアント: 通知上でローカルのリアクションが表示されないのを修正
## 12.93.0 (2021/10/23)
### Improvements ### Improvements
- クライアント: コントロールパネルのパフォーマンスを改善 - クライアント: コントロールパネルのパフォーマンスを改善
@ -23,6 +28,7 @@
- API: users/search および users/search-by-username-and-host を強化 - API: users/search および users/search-by-username-and-host を強化
- ミュート及びブロックのインポートを行えるように - ミュート及びブロックのインポートを行えるように
- クライアント: /share のクエリでリプライやファイル等の情報を渡せるように - クライアント: /share のクエリでリプライやファイル等の情報を渡せるように
- チャートのsyncを毎日0時に自動で行うように
### Bugfixes ### Bugfixes
- クライアント: テーマの管理が行えない問題を修正 - クライアント: テーマの管理が行えない問題を修正
@ -30,6 +36,11 @@
- クライアント: リモートノートで意図せずローカルカスタム絵文字が使われてしまうことがあるのを修正 - クライアント: リモートノートで意図せずローカルカスタム絵文字が使われてしまうことがあるのを修正
- ActivityPub: not reacted な Undo.Like がinboxに滞留するのを修正 - ActivityPub: not reacted な Undo.Like がinboxに滞留するのを修正
### Changes
- 連合の考慮に問題があることなどが分かったため、モデレーターをブロックできない仕様を廃止しました
- データベースにログを保存しないようになりました
- ログを永続化したい場合はsyslogを利用してください
## 12.92.0 (2021/10/16) ## 12.92.0 (2021/10/16)
### Improvements ### Improvements

View File

@ -63,6 +63,7 @@ files: "الملفات"
download: "تنزيل" download: "تنزيل"
driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف." driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف."
unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟" unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟"
importRequested: "يستغرق الاستيراد بعض الوقت"
lists: "القوائم" lists: "القوائم"
noLists: "ليس لديك أية قائمة" noLists: "ليس لديك أية قائمة"
note: "ملاحظة" note: "ملاحظة"
@ -76,6 +77,7 @@ error: "خطأ"
somethingHappened: "حدث خطأ" somethingHappened: "حدث خطأ"
retry: "حاول مجددًا" retry: "حاول مجددًا"
pageLoadError: "فشل تحميل الصفحة" pageLoadError: "فشل تحميل الصفحة"
serverIsDead: "الخادم لا يستجيب، حاول بعد قليل"
enterListName: "اسم القائمة" enterListName: "اسم القائمة"
privacy: "الخصوصية" privacy: "الخصوصية"
makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك" makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك"
@ -97,6 +99,7 @@ add: "إضافة"
reaction: "تفاعل" reaction: "تفاعل"
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات" rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
attachCancel: "أزل المرفق" attachCancel: "أزل المرفق"
markAsSensitive: "علّمه كمحتوى حساس"
enterFileName: "ادخل اسم الملف" enterFileName: "ادخل اسم الملف"
mute: "اكتم" mute: "اكتم"
unmute: "إلغاء الكتم" unmute: "إلغاء الكتم"
@ -109,15 +112,20 @@ unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟"
selectList: "اختر قائمة" selectList: "اختر قائمة"
editWidgetsExit: "تم" editWidgetsExit: "تم"
customEmojis: "إيموجي مخصص" customEmojis: "إيموجي مخصص"
emoji: "الوجوه التعبيرية"
emojis: "الوجوه التعبيرية"
emojiName: "اسم الوجه التعبيري"
emojiUrl: "رابط الوجه التعبيري"
addEmoji: "إضافة إيموجي" addEmoji: "إضافة إيموجي"
settingGuide: "الإعدادات المستحسنة"
cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة" cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة"
autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة" autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة"
loginFailed: "فشل الولوج" loginFailed: "فشل الولوج"
showOnRemote: "رؤيته على مثيل الخادم البُعدي" showOnRemote: "رؤيته على مثيل الخادم البُعدي"
general: "الرئيسية" general: "الرئيسية"
wallpaper: "خلفية الشاشة" wallpaper: "الخلفية"
setWallpaper: "استخدم خلفية الشاشة" setWallpaper: "عيّن خلفية"
removeWallpaper: "إزالة خلفية الشاشة" removeWallpaper: "أزل الخلفية"
searchWith: "البحث: {q}" searchWith: "البحث: {q}"
youHaveNoLists: "لا تمتلك أية قائمة" youHaveNoLists: "لا تمتلك أية قائمة"
followConfirm: "أتريد متابعة {name}؟" followConfirm: "أتريد متابعة {name}؟"
@ -182,7 +190,7 @@ removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟" deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
resetAreYouSure: "هل تريد إعادة التعيين؟" resetAreYouSure: "هل تريد إعادة التعيين؟"
saved: "تم حفظه" saved: "تم حفظه"
messaging: "الدردشة" messaging: "المحادثة"
upload: "تحميل" upload: "تحميل"
fromDrive: "من المخزن" fromDrive: "من المخزن"
fromUrl: "من عنوان URL" fromUrl: "من عنوان URL"
@ -194,7 +202,7 @@ explore: "استكشاف"
games: "ألعاب Misskey" games: "ألعاب Misskey"
messageRead: "مقروءة" messageRead: "مقروءة"
noMoreHistory: "لا يوجد المزيد من التاريخ" noMoreHistory: "لا يوجد المزيد من التاريخ"
startMessaging: "ابدأ الدردشة" startMessaging: "ابدأ محادثة"
nUsersRead: "تمت القراءة من {n}" nUsersRead: "تمت القراءة من {n}"
agreeTo: "اوافق على {0}" agreeTo: "اوافق على {0}"
tos: "شروط الخدمة" tos: "شروط الخدمة"
@ -266,7 +274,17 @@ disablingTimelinesInfo: "سيتمكن المسؤولون ومن تعديل دا
registration: "إنشاء حساب" registration: "إنشاء حساب"
enableRegistration: "تفعيل إنشاء الحسابات الجديدة" enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
invite: "دعوة" invite: "دعوة"
driveCapacityPerLocalAccount: "حصة التخزين لكل مستخدم محلي"
driveCapacityPerRemoteAccount: "حصة التخزين لكل مستخدم بعيد"
inMb: "بالميغابايت"
iconUrl: "رابط الأيقونة"
bannerUrl: "رابط صورة اللافتة"
backgroundImageUrl: "رابط صورة الخلفية"
basicInfo: "المعلومات الأساسية " basicInfo: "المعلومات الأساسية "
pinnedUsers: "المستخدمون المثبتون"
pinnedUsersDescription: "قائمة المستخدمين المثبتين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده."
pinnedPages: "الصفحات المثبتة"
pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تثبيتها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده."
pinnedNotes: "ملاحظة مدبسة" pinnedNotes: "ملاحظة مدبسة"
hcaptchaSiteKey: "مفتاح الموقع" hcaptchaSiteKey: "مفتاح الموقع"
hcaptchaSecretKey: "المفتاح السري" hcaptchaSecretKey: "المفتاح السري"
@ -279,12 +297,19 @@ manageAntennas: "إدارة الهوائيات"
name: "الإسم" name: "الإسم"
antennaSource: "مصدر الهوائي" antennaSource: "مصدر الهوائي"
antennaKeywords: "الكلمات المفتاحية للإستقبال" antennaKeywords: "الكلمات المفتاحية للإستقبال"
notifyAntenna: "نبهني بصول ملاحظات جديدة"
withFileAntenna: "ملاحظات تحوي ملفات فقط"
caseSensitive: "حساسية حالة الأحرف"
withReplies: "بالردود" withReplies: "بالردود"
notesAndReplies: "الملاحظات والردود" notesAndReplies: "الملاحظات والردود"
withFiles: "بالمرفقات" withFiles: "بالمرفقات"
silence: "اكتم" silence: "اكتم"
unsilence: "إلغاء الكتم" unsilence: "إلغاء الكتم"
popularUsers: "المستخدمون الشائعون" popularUsers: "المستخدمون الشائعون"
recentlyUpdatedUsers: "أصحاب النشاطات الأخيرة"
recentlyRegisteredUsers: "المستخدمون المنضمون حديثًا"
recentlyDiscoveredUsers: "المستخدمون المكتشفون حديثًا"
exploreUsersCount: "يوجد {count} مستخدم(ا)"
exploreFediverse: "استكشف الفديفرس" exploreFediverse: "استكشف الفديفرس"
popularTags: "الوسوم الرائجة" popularTags: "الوسوم الرائجة"
userList: "القوائم" userList: "القوائم"
@ -297,11 +322,13 @@ moderator: "مشرِف"
nUsersMentioned: "{n} مستخدمين تمت الإشارة إليهم" nUsersMentioned: "{n} مستخدمين تمت الإشارة إليهم"
securityKey: "مفتاح الأمان" securityKey: "مفتاح الأمان"
securityKeyName: "اسم المفتاح" securityKeyName: "اسم المفتاح"
registerSecurityKey: "سجل مفتاح أمان"
lastUsed: "آخر استخدام" lastUsed: "آخر استخدام"
unregister: "إلغاء التسجيل" unregister: "إلغاء التسجيل"
passwordLessLogin: "لِج مِن دون كلمة سرية" passwordLessLogin: "لِج مِن دون كلمة سرية"
resetPassword: "أعد تعيين كلمتك السرية" resetPassword: "أعد تعيين كلمتك السرية"
newPasswordIs: "كلمتك السرية الجديدة هي {password}" newPasswordIs: "كلمتك السرية الجديدة هي {password}"
reduceUiAnimation: "قلص تأثيرات الواجهة"
share: "شارِك" share: "شارِك"
notFound: "غير موجود" notFound: "غير موجود"
cacheClear: "مسح ذاكرة التخزين المؤقت" cacheClear: "مسح ذاكرة التخزين المؤقت"
@ -316,8 +343,8 @@ invites: "دعوة"
groupName: "اسم الفريق" groupName: "اسم الفريق"
members: "الأعضاء" members: "الأعضاء"
transfer: "نقل" transfer: "نقل"
messagingWithUser: "الدردشة مع مستخدم آخر" messagingWithUser: "تحدث مع مستخدم"
messagingWithGroup: "دردشة جماعية" messagingWithGroup: "محادثة جماعية"
title: "العنوان" title: "العنوان"
text: "النص" text: "النص"
enable: "تشغيل" enable: "تشغيل"
@ -362,28 +389,43 @@ total: "المجموع"
weekOverWeekChanges: "أسبوعيا" weekOverWeekChanges: "أسبوعيا"
dayOverDayChanges: "يوميا" dayOverDayChanges: "يوميا"
appearance: "المظهر" appearance: "المظهر"
clientSettings: "إعدادات العميل"
accountSettings: "إعدادات الحساب" accountSettings: "إعدادات الحساب"
promotion: "ترقية" promotion: "ترقية"
promote: "روِّج" promote: "روِّج"
numberOfDays: "عدد الأيام" numberOfDays: "عدد الأيام"
hideThisNote: "إخفاء هذه الملاحظة" hideThisNote: "إخفاء هذه الملاحظة"
objectStorageBaseUrl: "الرابط الأساسي"
objectStoragePrefix: "البادئة"
objectStorageEndpoint: "نقطة النهاية"
objectStorageRegion: "المنطقة"
objectStorageUseSSL: "استخدم SSL"
objectStorageUseProxy: "اتصل عبر وكيل"
serverLogs: "سجلات الخادم"
deleteAll: "حذف الكل" deleteAll: "حذف الكل"
showFixedPostForm: "أظهر نموذج الكتابة في أعلى الصفحة"
newNoteRecived: "هناك ملاحظات جديدة"
sounds: "الرنات" sounds: "الرنات"
listen: "استمع" listen: "استمع"
none: "لا شيء" none: "لا شيء"
showInPage: "اعرض في الصفحة"
volume: "مستوى الصوت" volume: "مستوى الصوت"
details: "التفاصيل" details: "التفاصيل"
chooseEmoji: "اختر إيموجي" chooseEmoji: "اختر إيموجي"
unableToProcess: "يتعذر إكمال العملية"
recentUsed: "المستخدمة مؤخرا" recentUsed: "المستخدمة مؤخرا"
install: "التثبيت" install: "التثبيت"
uninstall: "إلغاء التثبيت" uninstall: "إلغاء التثبيت"
installedApps: "التطبيقات المُخوّلة" installedApps: "التطبيقات المُخوّلة"
nothing: "لا يوجد شيء هنا"
lastUsedDate: "آخر استخدام" lastUsedDate: "آخر استخدام"
state: "الحالة" state: "الحالة"
sort: "ترتيب حسب" sort: "ترتيب حسب"
output: "الخارجة" output: "الخارجة"
updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد" updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد"
deleteAllFiles: "حذف كافة الملفات" deleteAllFiles: "حذف كافة الملفات"
deleteAllFilesConfirm: "أتريد حذف كل الملفات؟"
removeAllFollowing: "ألغ متابعة كل المتابِعين"
userSuspended: "تم تعليق هذا المستخدم." userSuspended: "تم تعليق هذا المستخدم."
userSilenced: "تم إسكات هذا المستخدم." userSilenced: "تم إسكات هذا المستخدم."
addItem: "إضافة عنصر" addItem: "إضافة عنصر"
@ -419,7 +461,40 @@ makeActive: "تفعيل"
display: "المظهر" display: "المظهر"
copy: "نسخ" copy: "نسخ"
metrics: "المقاييس" metrics: "المقاييس"
fileIdOrUrl: "معرف الملف أو رابط"
chatOpenBehavior: "سلوك نفاذة المحادثة عند فتحها"
behavior: "السلوك"
sample: "مثال"
abuseReports: "البلاغات"
reportAbuse: "البلاغات"
reportAbuseOf: "أبلغ عن {name}"
fillAbuseReportDescription: "أكتب بالتفصيل سبب الإبلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها."
abuseReported: "أُرسل البلاغ، شكرًا لك"
send: "أرسل"
abuseMarkAsResolved: "علّم البلاغ كمحلول"
openInNewTab: "افتح في لسان جديد"
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
waitingFor: "في انتظار {x}"
random: "عشوائي"
system: "النظام"
switchUi: "بدّل واجهة المستخدم"
createNew: "أنشِئ جديد"
optional: "اختياري"
public: "للعامة" public: "للعامة"
i18nInfo: "يترجم متطوعون ميسكي إلى عدة لغات، يمكنك المساعدة عبر {link}"
manageAccessTokens: "إدارة رموز الوصول"
accountInfo: "معلومات الحساب"
notesCount: "عدد الملاحظات"
repliesCount: "عدد الردود المرسلة"
repliedCount: "عدد الردود المستلمة"
followingCount: "عدد الحسابات المتابَعة"
followersCount: "عدد المتابِعين"
sentReactionsCount: "عدد الانفعالات المرسلة"
receivedReactionsCount: "عدد الانفعالات المستلمة"
pollVotesCount: "عدد الاستطلاعات المرسلة"
pollVotedCount: "عدد الاستطلاعات المستلمة"
yes: "نعم"
no: "لا"
currentVersion: "الإصدار الحالي" currentVersion: "الإصدار الحالي"
latestVersion: "آخر نسخة مستقرة" latestVersion: "آخر نسخة مستقرة"
usageAmount: "الإستخدام" usageAmount: "الإستخدام"
@ -433,6 +508,7 @@ gallery: "المعرض"
expiration: "ينتهي استطلاع الرأي في" expiration: "ينتهي استطلاع الرأي في"
middle: "متوسط" middle: "متوسط"
global: "الشامل" global: "الشامل"
sent: "أرسل"
_docs: _docs:
admin: "إدارة " admin: "إدارة "
_email: _email:
@ -459,12 +535,12 @@ _theme:
alpha: "الشفافية" alpha: "الشفافية"
keys: keys:
mention: "أشر الى" mention: "أشر الى"
messageBg: "خلفية الدردشة" messageBg: "خلفية المحادثة"
_sfx: _sfx:
note: "الملاحظات" note: "الملاحظات"
noteMy: "ملاحظتي" noteMy: "ملاحظتي"
notification: "الإشعارات" notification: "الإشعارات"
chat: "الدردشة" chat: "المحادثة"
_ago: _ago:
unknown: "مجهول" unknown: "مجهول"
future: "المستقبَل" future: "المستقبَل"

View File

@ -797,6 +797,8 @@ unread: "Ungelesen"
filter: "Filter" filter: "Filter"
controllPanel: "Systemsteuerung" controllPanel: "Systemsteuerung"
manageAccounts: "Benutzerkonten verwalten" manageAccounts: "Benutzerkonten verwalten"
makeReactionsPublic: "Reaktionsverlauf veröffentlichen"
makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktionen einsehen können."
_signup: _signup:
almostThere: "Fast geschafft" almostThere: "Fast geschafft"
emailAddressInfo: "Bitte gib deine Email-Adresse ein." emailAddressInfo: "Bitte gib deine Email-Adresse ein."

View File

@ -797,6 +797,8 @@ unread: "Unread"
filter: "Filter" filter: "Filter"
controllPanel: "Control Panel" controllPanel: "Control Panel"
manageAccounts: "Manage Accounts" manageAccounts: "Manage Accounts"
makeReactionsPublic: "Set reaction history to public"
makeReactionsPublicDescription: "This will make the list of all your past reactions publicly visible."
_signup: _signup:
almostThere: "Almost there" almostThere: "Almost there"
emailAddressInfo: "Please enter your email address." emailAddressInfo: "Please enter your email address."

View File

@ -2,7 +2,7 @@
_lang_: "Esperanto" _lang_: "Esperanto"
headlineMisskey: "Jen la reto konektata de notoj" headlineMisskey: "Jen la reto konektata de notoj"
introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza etbloga servo.\nKreu \"noto\"n por paroli vian penson al iuj ĉirkaŭ vi. 📡\nLa funkcion \"reago\" ebligas esprimi rapide vian senton pri ies noto en Fediverso. 👍\nBonvole esploru novan mondon. 🚀" introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza etbloga servo.\nKreu \"noto\"n por paroli vian penson al iuj ĉirkaŭ vi. 📡\nLa funkcion \"reago\" ebligas esprimi rapide vian senton pri ies noto en Fediverso. 👍\nBonvole esploru novan mondon. 🚀"
monthAndDay: "La {day}-a de la {month}-a monato" monthAndDay: "{{day}}/{{month}}"
search: "Serĉi" search: "Serĉi"
notifications: "Sciigoj" notifications: "Sciigoj"
username: "Uzantnomo" username: "Uzantnomo"
@ -20,10 +20,10 @@ instance: "Nodo"
settings: "Agordoj" settings: "Agordoj"
basicSettings: "Ĝeneralaj agordoj" basicSettings: "Ĝeneralaj agordoj"
otherSettings: "Aliaj agordoj" otherSettings: "Aliaj agordoj"
openInWindow: "Malfermi en nova fenestro" openInWindow: "Malfermi en fenestro"
profile: "Profilo" profile: "Profilo"
timeline: "Templinio" timeline: "Templinio"
noAccountDescription: "Ĉi tiu uzanto ne skribis vivpriskribon." noAccountDescription: "Neniu priskribo"
login: "Ensaluti" login: "Ensaluti"
loggingIn: "Ensalutado…" loggingIn: "Ensalutado…"
logout: "Elsaluti" logout: "Elsaluti"
@ -44,7 +44,7 @@ copyContent: "Kopii enhavon"
copyLink: "Kopii ligilon" copyLink: "Kopii ligilon"
delete: "Forviŝi" delete: "Forviŝi"
deleteAndEdit: "Redakti foriginte" deleteAndEdit: "Redakti foriginte"
deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Tio forviŝos reagojn, notojn plusendintajn, kaj respondojn ĉiujn de ĝi." deleteAndEditConfirm: "Ĉu vi certas, ke vi volas forigi kaj redakti la noton? Tio forviŝos reagojn, plusendojn, kaj respondojn ĉiujn de ĝi."
addToList: "Aldoni al listo" addToList: "Aldoni al listo"
sendMessage: "Sendi mesaĝon" sendMessage: "Sendi mesaĝon"
copyUsername: "Kopii uzantnomon" copyUsername: "Kopii uzantnomon"
@ -89,7 +89,7 @@ renote: "Plusendi la noton"
unrenote: "Malfari plusendadon" unrenote: "Malfari plusendadon"
renoted: "Sukcese plusendita" renoted: "Sukcese plusendita"
cantRenote: "Oni ne povas plusendi la noton." cantRenote: "Oni ne povas plusendi la noton."
cantReRenote: "Plusendado ne estas plusendebla." cantReRenote: "Plusendo de noto ne estas plusendebla."
quote: "Citi" quote: "Citi"
pinnedNote: "Alpinglita noto" pinnedNote: "Alpinglita noto"
pinned: "Alpingli" pinned: "Alpingli"
@ -220,7 +220,7 @@ remoteUserCaution: "Ĉi tiuj infomoj ne estas tute ekzaktaj pro transa uzanto."
activity: "Aktiveco" activity: "Aktiveco"
images: "Bildoj" images: "Bildoj"
birthday: "Naskiĝdato" birthday: "Naskiĝdato"
registeredDate: "Registriĝdato" registeredDate: "Dato de registriĝo"
location: "Loko" location: "Loko"
theme: "Koloraro" theme: "Koloraro"
light: "Luma" light: "Luma"
@ -262,7 +262,7 @@ thisYear: "Ĉi-jare"
thisMonth: "Ĉi-monate" thisMonth: "Ĉi-monate"
today: "Hodiaŭ" today: "Hodiaŭ"
dayX: "{day}a" dayX: "{day}a"
monthX: "{month}" monthX: "La {month}a monato"
yearX: "La jaro {year}" yearX: "La jaro {year}"
pages: "Paĝoj" pages: "Paĝoj"
connectService: "Konekti" connectService: "Konekti"
@ -317,6 +317,7 @@ nUsersMentioned: "{n} uzanto(j) menciis"
securityKey: "Sekureca ŝlosilo" securityKey: "Sekureca ŝlosilo"
securityKeyName: "Nomo de la ŝlosilo" securityKeyName: "Nomo de la ŝlosilo"
lastUsed: "Plej malnove uzita" lastUsed: "Plej malnove uzita"
unregister: "Malregistriĝi"
passwordLessLogin: "Ensaluti sen pasvorto" passwordLessLogin: "Ensaluti sen pasvorto"
resetPassword: "Restarigi pasvorton" resetPassword: "Restarigi pasvorton"
newPasswordIs: "La nova pasvorto estas {password}." newPasswordIs: "La nova pasvorto estas {password}."
@ -516,7 +517,7 @@ clear: "Vakigi"
goBack: "Reiri antaŭ" goBack: "Reiri antaŭ"
addDescription: "Priskribi" addDescription: "Priskribi"
info: "Informoj" info: "Informoj"
userInfo: "La informoj de uzanto" userInfo: "Informoj de uzanto"
unknown: "Nekonata" unknown: "Nekonata"
online: "Surkonektita" online: "Surkonektita"
offline: "Forkonektita" offline: "Forkonektita"
@ -688,13 +689,13 @@ _antennaSources:
all: "Ĉiuj notoj" all: "Ĉiuj notoj"
homeTimeline: "Notoj far uzantoj kiujn vi sekvas" homeTimeline: "Notoj far uzantoj kiujn vi sekvas"
_weekday: _weekday:
sunday: "dimanĉo" sunday: "Dimanĉo"
monday: "lundo" monday: "Lundo"
tuesday: "mardo" tuesday: "Mardo"
wednesday: "merkredo" wednesday: "Merkredo"
thursday: "ĵaŭdo" thursday: "Ĵaŭdo"
friday: "vendredo" friday: "Vendredo"
saturday: "sabato" saturday: "Sabato"
_widgets: _widgets:
notifications: "Sciigoj" notifications: "Sciigoj"
timeline: "Templinio" timeline: "Templinio"

View File

@ -365,7 +365,7 @@ withFiles: "Avec fichiers joints"
silence: "Mettre en sourdine" silence: "Mettre en sourdine"
silenceConfirm: "Êtes-vous sûr·e de vouloir mettre lutilisateur·rice en sourdine ?" silenceConfirm: "Êtes-vous sûr·e de vouloir mettre lutilisateur·rice en sourdine ?"
unsilence: "Annuler la sourdine" unsilence: "Annuler la sourdine"
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cette utilisateur·rice ?" unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cet·te utilisateur·rice ?"
popularUsers: "Utilisateur·rice·s populaires" popularUsers: "Utilisateur·rice·s populaires"
recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment" recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment"
recentlyRegisteredUsers: "Utilisateur·rice·s récemment inscrit·e·s" recentlyRegisteredUsers: "Utilisateur·rice·s récemment inscrit·e·s"
@ -766,6 +766,7 @@ middle: "Moyen"
low: "Basse" low: "Basse"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail." emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio" ratio: "Ratio"
previewNoteText: "Voir l'aperçu"
customCss: "CSS personnalisé" customCss: "CSS personnalisé"
customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement." customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter normalement."
global: "Global" global: "Global"
@ -789,6 +790,8 @@ pubSub: "Comptes Pub/Sub"
lastCommunication: "Dernière communication" lastCommunication: "Dernière communication"
resolved: "Résolu" resolved: "Résolu"
unresolved: "En attente" unresolved: "En attente"
itsOn: "Activé"
itsOff: "Désactivé"
emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte" emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte"
unread: "Non lu" unread: "Non lu"
filter: "Filtre" filter: "Filtre"

View File

@ -0,0 +1,13 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class deleteLog1634902659689 implements MigrationInterface {
name = 'deleteLog1634902659689'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE "log"`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
}
}

View File

@ -1,7 +1,7 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>", "author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.92.0", "version": "12.93.1",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -595,17 +595,17 @@ export default defineComponent({
case 'drive-files': return fetchDriveFilesChart(); case 'drive-files': return fetchDriveFilesChart();
case 'drive-files-total': return fetchDriveFilesTotalChart(); case 'drive-files-total': return fetchDriveFilesTotalChart();
case 'instances-requests': return fetchInstanceRequestsChart(); case 'instance-requests': return fetchInstanceRequestsChart();
case 'instances-users': return fetchInstanceUsersChart(false); case 'instance-users': return fetchInstanceUsersChart(false);
case 'instances-users-total': return fetchInstanceUsersChart(true); case 'instance-users-total': return fetchInstanceUsersChart(true);
case 'instances-notes': return fetchInstanceNotesChart(false); case 'instance-notes': return fetchInstanceNotesChart(false);
case 'instances-notes-total': return fetchInstanceNotesChart(true); case 'instance-notes-total': return fetchInstanceNotesChart(true);
case 'instances-ff': return fetchInstanceFfChart(false); case 'instance-ff': return fetchInstanceFfChart(false);
case 'instances-ff-total': return fetchInstanceFfChart(true); case 'instance-ff-total': return fetchInstanceFfChart(true);
case 'instances-drive-usage': return fetchInstanceDriveUsageChart(false); case 'instance-drive-usage': return fetchInstanceDriveUsageChart(false);
case 'instances-drive-usage-total': return fetchInstanceDriveUsageChart(true); case 'instance-drive-usage-total': return fetchInstanceDriveUsageChart(true);
case 'instances-drive-files': return fetchInstanceDriveFilesChart(false); case 'instance-drive-files': return fetchInstanceDriveFilesChart(false);
case 'instances-drive-files-total': return fetchInstanceDriveFilesChart(true); case 'instance-drive-files-total': return fetchInstanceDriveFilesChart(true);
} }
}; };
fetching.value = true; fetching.value = true;

View File

@ -13,7 +13,8 @@
<i v-else-if="notification.type === 'mention'" class="fas fa-at"></i> <i v-else-if="notification.type === 'mention'" class="fas fa-at"></i>
<i v-else-if="notification.type === 'quote'" class="fas fa-quote-left"></i> <i v-else-if="notification.type === 'quote'" class="fas fa-quote-left"></i>
<i v-else-if="notification.type === 'pollVote'" class="fas fa-poll-h"></i> <i v-else-if="notification.type === 'pollVote'" class="fas fa-poll-h"></i>
<XReactionIcon v-else-if="notification.type === 'reaction'" :reaction="notification.reaction" :custom-emojis="notification.note.emojis" :no-style="true"/> <!-- notification.reaction null になることはまずないがここでoptional chaining使うと一部ブラウザで刺さるので念の為 -->
<XReactionIcon v-else-if="notification.type === 'reaction'" :reaction="notification.reaction ? notification.reaction.replace(/^:(\w+):$/, ':$1@.:') : notification.reaction" :custom-emojis="notification.note.emojis" :no-style="true"/>
</div> </div>
</div> </div>
<div class="tail"> <div class="tail">

View File

@ -1,6 +1,6 @@
<template> <template>
<span class="ceaaebcd" :class="{ isPlus, isMinus, isZero }"> <span class="ceaaebcd" :class="{ isPlus, isMinus, isZero }">
<slot name="before"></slot>{{ isPlus ? '+' : isMinus ? '-' : '' }}{{ number(value) }}<slot name="after"></slot> <slot name="before"></slot>{{ isPlus ? '+' : '' }}{{ number(value) }}<slot name="after"></slot>
</span> </span>
</template> </template>

View File

@ -0,0 +1,212 @@
<template>
<canvas ref="chartEl"></canvas>
</template>
<script lang="ts">
import { defineComponent, onMounted, onUnmounted, ref } from 'vue';
import {
Chart,
ArcElement,
LineElement,
BarElement,
PointElement,
BarController,
LineController,
CategoryScale,
LinearScale,
TimeScale,
Legend,
Title,
Tooltip,
SubTitle,
Filler,
} from 'chart.js';
import number from '@client/filters/number';
import * as os from '@client/os';
import { defaultStore } from '@client/store';
Chart.register(
ArcElement,
LineElement,
BarElement,
PointElement,
BarController,
LineController,
CategoryScale,
LinearScale,
TimeScale,
Legend,
Title,
Tooltip,
SubTitle,
Filler,
);
const alpha = (hex, a) => {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!;
const r = parseInt(result[1], 16);
const g = parseInt(result[2], 16);
const b = parseInt(result[3], 16);
return `rgba(${r}, ${g}, ${b}, ${a})`;
};
export default defineComponent({
props: {
domain: {
type: String,
required: true,
},
connection: {
required: true,
},
},
setup(props) {
const chartEl = ref<HTMLCanvasElement>(null);
const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
//
Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg');
onMounted(() => {
const chartInstance = new Chart(chartEl.value, {
type: 'line',
data: {
labels: [],
datasets: [{
label: 'Process',
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: '#00E396',
backgroundColor: alpha('#00E396', 0.1),
data: []
}, {
label: 'Active',
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: '#00BCD4',
backgroundColor: alpha('#00BCD4', 0.1),
data: []
}, {
label: 'Waiting',
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: '#FFB300',
backgroundColor: alpha('#FFB300', 0.1),
data: []
}, {
label: 'Delayed',
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: '#E53935',
borderDash: [5, 5],
fill: false,
data: []
}],
},
options: {
aspectRatio: 2.5,
layout: {
padding: {
left: 16,
right: 16,
top: 16,
bottom: 8,
},
},
scales: {
x: {
grid: {
display: false,
color: gridColor,
borderColor: 'rgb(0, 0, 0, 0)',
},
ticks: {
display: false,
},
},
y: {
grid: {
color: gridColor,
borderColor: 'rgb(0, 0, 0, 0)',
},
},
},
interaction: {
intersect: false,
},
plugins: {
legend: {
position: 'bottom',
labels: {
boxWidth: 16,
},
},
tooltip: {
mode: 'index',
animation: {
duration: 0,
},
},
},
},
});
const onStats = (stats) => {
chartInstance.data.labels.push('');
chartInstance.data.datasets[0].data.push(stats[props.domain].activeSincePrevTick);
chartInstance.data.datasets[1].data.push(stats[props.domain].active);
chartInstance.data.datasets[2].data.push(stats[props.domain].waiting);
chartInstance.data.datasets[3].data.push(stats[props.domain].delayed);
if (chartInstance.data.datasets[0].data.length > 200) {
chartInstance.data.labels.shift();
chartInstance.data.datasets[0].data.shift();
chartInstance.data.datasets[1].data.shift();
chartInstance.data.datasets[2].data.shift();
chartInstance.data.datasets[3].data.shift();
}
chartInstance.update();
};
const onStatsLog = (statsLog) => {
for (const stats of [...statsLog].reverse()) {
chartInstance.data.labels.push('');
chartInstance.data.datasets[0].data.push(stats[props.domain].activeSincePrevTick);
chartInstance.data.datasets[1].data.push(stats[props.domain].active);
chartInstance.data.datasets[2].data.push(stats[props.domain].waiting);
chartInstance.data.datasets[3].data.push(stats[props.domain].delayed);
if (chartInstance.data.datasets[0].data.length > 200) {
chartInstance.data.labels.shift();
chartInstance.data.datasets[0].data.shift();
chartInstance.data.datasets[1].data.shift();
chartInstance.data.datasets[2].data.shift();
chartInstance.data.datasets[3].data.shift();
}
}
chartInstance.update();
};
props.connection.on('stats', onStats);
props.connection.on('statsLog', onStatsLog);
onUnmounted(() => {
props.connection.off('stats', onStats);
props.connection.off('statsLog', onStatsLog);
});
});
return {
chartEl,
}
},
});
</script>
<style lang="scss" scoped>
</style>

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="ukygtjoj _block" :class="{ naked, hideHeader: !showHeader, scrollable, closed: !showBody }" v-size="{ max: [380] }"> <div class="ukygtjoj _panel" :class="{ naked, thin, hideHeader: !showHeader, scrollable, closed: !showBody }" v-size="{ max: [380] }">
<header v-if="showHeader" ref="header"> <header v-if="showHeader" ref="header">
<div class="title"><slot name="header"></slot></div> <div class="title"><slot name="header"></slot></div>
<div class="sub"> <div class="sub">
@ -36,6 +36,11 @@ export default defineComponent({
required: false, required: false,
default: true default: true
}, },
thin: {
type: Boolean,
required: false,
default: false
},
naked: { naked: {
type: Boolean, type: Boolean,
required: false, required: false,
@ -226,7 +231,7 @@ export default defineComponent({
} }
} }
&.max-width_380px { &.max-width_380px, &.thin {
> header { > header {
> .title { > .title {
padding: 8px 10px; padding: 8px 10px;

View File

@ -120,7 +120,7 @@ export default defineComponent({
> .items { > .items {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
grid-gap: 8px; grid-gap: 8px;
padding: 0 16px; padding: 0 16px;

View File

@ -4,7 +4,7 @@
<div class="title">{{ $ts.misskeyUpdated }}</div> <div class="title">{{ $ts.misskeyUpdated }}</div>
<div class="version">{{ version }}🚀</div> <div class="version">{{ version }}🚀</div>
<MkButton full @click="whatIsNew">{{ $ts.whatIsNew }}</MkButton> <MkButton full @click="whatIsNew">{{ $ts.whatIsNew }}</MkButton>
<MkButton primary full @click="$refs.modal.close()">{{ $ts.gotIt }}</MkButton> <MkButton class="gotIt" primary full @click="$refs.modal.close()">{{ $ts.gotIt }}</MkButton>
</div> </div>
</MkModal> </MkModal>
</template> </template>
@ -54,5 +54,9 @@ export default defineComponent({
> .version { > .version {
margin: 1em 0; margin: 1em 0;
} }
> .gotIt {
margin: 8px 0 0 0;
}
} }
</style> </style>

View File

@ -7,8 +7,8 @@
<img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/> <img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/>
</div> </div>
<MkInfo v-if="noMaintainerInformation" warn class="info">{{ $ts.noMaintainerInformationWarning }} <MkA to="/instance/settings" class="_link">{{ $ts.configure }}</MkA></MkInfo> <MkInfo v-if="noMaintainerInformation" warn class="info">{{ $ts.noMaintainerInformationWarning }} <MkA to="/admin/settings" class="_link">{{ $ts.configure }}</MkA></MkInfo>
<MkInfo v-if="noBotProtection" warn class="info">{{ $ts.noBotProtectionWarning }} <MkA to="/instance/bot-protection" class="_link">{{ $ts.configure }}</MkA></MkInfo> <MkInfo v-if="noBotProtection" warn class="info">{{ $ts.noBotProtectionWarning }} <MkA to="/admin/bot-protection" class="_link">{{ $ts.configure }}</MkA></MkInfo>
<MkSuperMenu :def="menuDef" :grid="page == null"></MkSuperMenu> <MkSuperMenu :def="menuDef" :grid="page == null"></MkSuperMenu>
</div> </div>
@ -93,47 +93,47 @@ export default defineComponent({
items: [{ items: [{
icon: 'fas fa-tachometer-alt', icon: 'fas fa-tachometer-alt',
text: i18n.locale.dashboard, text: i18n.locale.dashboard,
to: '/instance/overview', to: '/admin/overview',
active: page.value === 'overview', active: page.value === 'overview',
}, { }, {
icon: 'fas fa-users', icon: 'fas fa-users',
text: i18n.locale.users, text: i18n.locale.users,
to: '/instance/users', to: '/admin/users',
active: page.value === 'users', active: page.value === 'users',
}, { }, {
icon: 'fas fa-laugh', icon: 'fas fa-laugh',
text: i18n.locale.customEmojis, text: i18n.locale.customEmojis,
to: '/instance/emojis', to: '/admin/emojis',
active: page.value === 'emojis', active: page.value === 'emojis',
}, { }, {
icon: 'fas fa-globe', icon: 'fas fa-globe',
text: i18n.locale.federation, text: i18n.locale.federation,
to: '/instance/federation', to: '/admin/federation',
active: page.value === 'federation', active: page.value === 'federation',
}, { }, {
icon: 'fas fa-clipboard-list', icon: 'fas fa-clipboard-list',
text: i18n.locale.jobQueue, text: i18n.locale.jobQueue,
to: '/instance/queue', to: '/admin/queue',
active: page.value === 'queue', active: page.value === 'queue',
}, { }, {
icon: 'fas fa-cloud', icon: 'fas fa-cloud',
text: i18n.locale.files, text: i18n.locale.files,
to: '/instance/files', to: '/admin/files',
active: page.value === 'files', active: page.value === 'files',
}, { }, {
icon: 'fas fa-broadcast-tower', icon: 'fas fa-broadcast-tower',
text: i18n.locale.announcements, text: i18n.locale.announcements,
to: '/instance/announcements', to: '/admin/announcements',
active: page.value === 'announcements', active: page.value === 'announcements',
}, { }, {
icon: 'fas fa-audio-description', icon: 'fas fa-audio-description',
text: i18n.locale.ads, text: i18n.locale.ads,
to: '/instance/ads', to: '/admin/ads',
active: page.value === 'ads', active: page.value === 'ads',
}, { }, {
icon: 'fas fa-exclamation-circle', icon: 'fas fa-exclamation-circle',
text: i18n.locale.abuseReports, text: i18n.locale.abuseReports,
to: '/instance/abuses', to: '/admin/abuses',
active: page.value === 'abuses', active: page.value === 'abuses',
}], }],
}, { }, {
@ -141,57 +141,57 @@ export default defineComponent({
items: [{ items: [{
icon: 'fas fa-cog', icon: 'fas fa-cog',
text: i18n.locale.general, text: i18n.locale.general,
to: '/instance/settings', to: '/admin/settings',
active: page.value === 'settings', active: page.value === 'settings',
}, { }, {
icon: 'fas fa-cloud', icon: 'fas fa-cloud',
text: i18n.locale.files, text: i18n.locale.files,
to: '/instance/files-settings', to: '/admin/files-settings',
active: page.value === 'files-settings', active: page.value === 'files-settings',
}, { }, {
icon: 'fas fa-envelope', icon: 'fas fa-envelope',
text: i18n.locale.emailServer, text: i18n.locale.emailServer,
to: '/instance/email-settings', to: '/admin/email-settings',
active: page.value === 'email-settings', active: page.value === 'email-settings',
}, { }, {
icon: 'fas fa-cloud', icon: 'fas fa-cloud',
text: i18n.locale.objectStorage, text: i18n.locale.objectStorage,
to: '/instance/object-storage', to: '/admin/object-storage',
active: page.value === 'object-storage', active: page.value === 'object-storage',
}, { }, {
icon: 'fas fa-lock', icon: 'fas fa-lock',
text: i18n.locale.security, text: i18n.locale.security,
to: '/instance/security', to: '/admin/security',
active: page.value === 'security', active: page.value === 'security',
}, { }, {
icon: 'fas fa-bolt', icon: 'fas fa-bolt',
text: 'ServiceWorker', text: 'ServiceWorker',
to: '/instance/service-worker', to: '/admin/service-worker',
active: page.value === 'service-worker', active: page.value === 'service-worker',
}, { }, {
icon: 'fas fa-globe', icon: 'fas fa-globe',
text: i18n.locale.relays, text: i18n.locale.relays,
to: '/instance/relays', to: '/admin/relays',
active: page.value === 'relays', active: page.value === 'relays',
}, { }, {
icon: 'fas fa-share-alt', icon: 'fas fa-share-alt',
text: i18n.locale.integration, text: i18n.locale.integration,
to: '/instance/integrations', to: '/admin/integrations',
active: page.value === 'integrations', active: page.value === 'integrations',
}, { }, {
icon: 'fas fa-ban', icon: 'fas fa-ban',
text: i18n.locale.instanceBlocking, text: i18n.locale.instanceBlocking,
to: '/instance/instance-block', to: '/admin/instance-block',
active: page.value === 'instance-block', active: page.value === 'instance-block',
}, { }, {
icon: 'fas fa-ghost', icon: 'fas fa-ghost',
text: i18n.locale.proxyAccount, text: i18n.locale.proxyAccount,
to: '/instance/proxy-account', to: '/admin/proxy-account',
active: page.value === 'proxy-account', active: page.value === 'proxy-account',
}, { }, {
icon: 'fas fa-cogs', icon: 'fas fa-cogs',
text: i18n.locale.other, text: i18n.locale.other,
to: '/instance/other-settings', to: '/admin/other-settings',
active: page.value === 'other-settings', active: page.value === 'other-settings',
}], }],
}, { }, {
@ -199,13 +199,8 @@ export default defineComponent({
items: [{ items: [{
icon: 'fas fa-database', icon: 'fas fa-database',
text: i18n.locale.database, text: i18n.locale.database,
to: '/instance/database', to: '/admin/database',
active: page.value === 'database', active: page.value === 'database',
}, {
icon: 'fas fa-stream',
text: i18n.locale.logs,
to: '/instance/logs',
active: page.value === 'logs',
}], }],
}]); }]);
const component = computed(() => { const component = computed(() => {
@ -220,7 +215,6 @@ export default defineComponent({
case 'announcements': return defineAsyncComponent(() => import('./announcements.vue')); case 'announcements': return defineAsyncComponent(() => import('./announcements.vue'));
case 'ads': return defineAsyncComponent(() => import('./ads.vue')); case 'ads': return defineAsyncComponent(() => import('./ads.vue'));
case 'database': return defineAsyncComponent(() => import('./database.vue')); case 'database': return defineAsyncComponent(() => import('./database.vue'));
case 'logs': return defineAsyncComponent(() => import('./logs.vue'));
case 'abuses': return defineAsyncComponent(() => import('./abuses.vue')); case 'abuses': return defineAsyncComponent(() => import('./abuses.vue'));
case 'settings': return defineAsyncComponent(() => import('./settings.vue')); case 'settings': return defineAsyncComponent(() => import('./settings.vue'));
case 'files-settings': return defineAsyncComponent(() => import('./files-settings.vue')); case 'files-settings': return defineAsyncComponent(() => import('./files-settings.vue'));

View File

@ -1,15 +1,15 @@
<template> <template>
<FormBase> <FormBase>
<FormSuspense :p="init"> <FormSuspense :p="init">
<FormLink to="/instance/integrations/twitter"> <FormLink to="/admin/integrations/twitter">
<i class="fab fa-twitter"></i> Twitter <i class="fab fa-twitter"></i> Twitter
<template #suffix>{{ enableTwitterIntegration ? $ts.enabled : $ts.disabled }}</template> <template #suffix>{{ enableTwitterIntegration ? $ts.enabled : $ts.disabled }}</template>
</FormLink> </FormLink>
<FormLink to="/instance/integrations/github"> <FormLink to="/admin/integrations/github">
<i class="fab fa-github"></i> GitHub <i class="fab fa-github"></i> GitHub
<template #suffix>{{ enableGithubIntegration ? $ts.enabled : $ts.disabled }}</template> <template #suffix>{{ enableGithubIntegration ? $ts.enabled : $ts.disabled }}</template>
</FormLink> </FormLink>
<FormLink to="/instance/integrations/discord"> <FormLink to="/admin/integrations/discord">
<i class="fab fa-discord"></i> Discord <i class="fab fa-discord"></i> Discord
<template #suffix>{{ enableDiscordIntegration ? $ts.enabled : $ts.disabled }}</template> <template #suffix>{{ enableDiscordIntegration ? $ts.enabled : $ts.disabled }}</template>
</FormLink> </FormLink>

View File

@ -2,20 +2,20 @@
<div> <div>
<MkHeader :info="header"/> <MkHeader :info="header"/>
<div class="edbbcaef"> <div class="edbbcaef" v-size="{ max: [880] }">
<div class="numbers" v-if="stats"> <div v-if="stats" class="cfcdecdf" style="margin: var(--margin)">
<div class="number _panel"> <div class="number _panel">
<div class="label">Users</div> <div class="label">Users</div>
<div class="value _monospace"> <div class="value _monospace">
{{ number(stats.originalUsersCount) }} {{ number(stats.originalUsersCount) }}
<MkNumberDiff v-if="usersComparedToThePrevDay" class="diff" :value="usersComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff> <MkNumberDiff v-if="usersComparedToThePrevDay != null" class="diff" :value="usersComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff>
</div> </div>
</div> </div>
<div class="number _panel"> <div class="number _panel">
<div class="label">Notes</div> <div class="label">Notes</div>
<div class="value _monospace"> <div class="value _monospace">
{{ number(stats.originalNotesCount) }} {{ number(stats.originalNotesCount) }}
<MkNumberDiff v-if="notesComparedToThePrevDay" class="diff" :value="notesComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff> <MkNumberDiff v-if="notesComparedToThePrevDay != null" class="diff" :value="notesComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff>
</div> </div>
</div> </div>
</div> </div>
@ -27,9 +27,22 @@
</div> </div>
</MkContainer> </MkContainer>
<div class="queue">
<MkContainer :foldable="true" :thin="true" class="deliver">
<template #header>Queue: deliver</template>
<MkQueueChart :connection="queueStatsConnection" domain="deliver"/>
</MkContainer>
<MkContainer :foldable="true" :thin="true" class="inbox">
<template #header>Queue: inbox</template>
<MkQueueChart :connection="queueStatsConnection" domain="inbox"/>
</MkContainer>
</div>
<!--<XMetrics/>--> <!--<XMetrics/>-->
<div class="numbers"> <MkFolder style="margin: var(--margin)">
<template #header><i class="fas fa-info-circle"></i> {{ $ts.info }}</template>
<div class="cfcdecdf">
<div class="number _panel"> <div class="number _panel">
<div class="label">Misskey</div> <div class="label">Misskey</div>
<div class="value _monospace">{{ version }}</div> <div class="value _monospace">{{ version }}</div>
@ -51,12 +64,13 @@
<div class="value _monospace">{{ vueVersion }}</div> <div class="value _monospace">{{ vueVersion }}</div>
</div> </div>
</div> </div>
</MkFolder>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, version as vueVersion } from 'vue'; import { computed, defineComponent, markRaw, version as vueVersion } from 'vue';
import FormKeyValueView from '@client/components/debobigego/key-value-view.vue'; import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
import MkInstanceStats from '@client/components/instance-stats.vue'; import MkInstanceStats from '@client/components/instance-stats.vue';
import MkButton from '@client/components/ui/button.vue'; import MkButton from '@client/components/ui/button.vue';
@ -64,6 +78,7 @@ import MkSelect from '@client/components/form/select.vue';
import MkNumberDiff from '@client/components/number-diff.vue'; import MkNumberDiff from '@client/components/number-diff.vue';
import MkContainer from '@client/components/ui/container.vue'; import MkContainer from '@client/components/ui/container.vue';
import MkFolder from '@client/components/ui/folder.vue'; import MkFolder from '@client/components/ui/folder.vue';
import MkQueueChart from '@client/components/queue-chart.vue';
import { version, url } from '@client/config'; import { version, url } from '@client/config';
import bytes from '@client/filters/bytes'; import bytes from '@client/filters/bytes';
import number from '@client/filters/number'; import number from '@client/filters/number';
@ -78,6 +93,8 @@ export default defineComponent({
FormKeyValueView, FormKeyValueView,
MkInstanceStats, MkInstanceStats,
MkContainer, MkContainer,
MkFolder,
MkQueueChart,
XMetrics, XMetrics,
}, },
@ -104,6 +121,7 @@ export default defineComponent({
notesComparedToThePrevDay: null, notesComparedToThePrevDay: null,
fetchJobs: () => os.api('admin/queue/deliver-delayed', {}), fetchJobs: () => os.api('admin/queue/deliver-delayed', {}),
fetchModLogs: () => os.api('admin/show-moderation-logs', {}), fetchModLogs: () => os.api('admin/show-moderation-logs', {}),
queueStatsConnection: markRaw(os.stream.useChannel('queueStats')),
} }
}, },
@ -129,6 +147,17 @@ export default defineComponent({
os.api('admin/server-info', {}).then(serverInfo => { os.api('admin/server-info', {}).then(serverInfo => {
this.serverInfo = serverInfo; this.serverInfo = serverInfo;
}); });
this.$nextTick(() => {
this.queueStatsConnection.send('requestLog', {
id: Math.random().toString().substr(2, 8),
length: 200
});
});
},
beforeUnmount() {
this.queueStatsConnection.dispose();
}, },
methods: { methods: {
@ -153,11 +182,10 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.edbbcaef { .edbbcaef {
> .numbers { .cfcdecdf {
display: grid; display: grid;
grid-gap: 8px; grid-gap: 8px;
grid-template-columns: repeat(auto-fill,minmax(130px,1fr)); grid-template-columns: repeat(auto-fill,minmax(150px,1fr));
margin: 16px;
> .number { > .number {
padding: 12px 16px; padding: 12px 16px;
@ -181,5 +209,34 @@ export default defineComponent({
> .charts { > .charts {
margin: var(--margin); margin: var(--margin);
} }
> .queue {
margin: var(--margin);
display: flex;
> .deliver,
> .inbox {
flex: 1;
width: 50%;
&:not(:first-child) {
margin-left: var(--margin);
}
}
}
&.max-width_800px {
> .queue {
display: block;
> .deliver,
> .inbox {
&:not(:first-child) {
margin-top: var(--margin);
margin-left: 0;
}
}
}
}
} }
</style> </style>

View File

@ -0,0 +1,102 @@
<template>
<div class="_debobigegoItem">
<div class="_debobigegoLabel"><slot name="title"></slot></div>
<div class="_debobigegoPanel pumxzjhg">
<div class="_table status">
<div class="_row">
<div class="_cell"><div class="_label">Process</div>{{ number(activeSincePrevTick) }}</div>
<div class="_cell"><div class="_label">Active</div>{{ number(active) }}</div>
<div class="_cell"><div class="_label">Waiting</div>{{ number(waiting) }}</div>
<div class="_cell"><div class="_label">Delayed</div>{{ number(delayed) }}</div>
</div>
</div>
<div class="">
<MkQueueChart :domain="domain" :connection="connection"/>
</div>
<div class="jobs">
<div v-if="jobs.length > 0">
<div v-for="job in jobs" :key="job[0]">
<span>{{ job[0] }}</span>
<span style="margin-left: 8px; opacity: 0.7;">({{ number(job[1]) }} jobs)</span>
</div>
</div>
<span v-else style="opacity: 0.5;">{{ $ts.noJobs }}</span>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, markRaw, onMounted, onUnmounted, ref } from 'vue';
import number from '@client/filters/number';
import MkQueueChart from '@client/components/queue-chart.vue';
import * as os from '@client/os';
export default defineComponent({
components: {
MkQueueChart
},
props: {
domain: {
type: String,
required: true,
},
connection: {
required: true,
},
},
setup(props) {
const activeSincePrevTick = ref(0);
const active = ref(0);
const waiting = ref(0);
const delayed = ref(0);
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;
});
const onStats = (stats) => {
activeSincePrevTick.value = stats[props.domain].activeSincePrevTick;
active.value = stats[props.domain].active;
waiting.value = stats[props.domain].waiting;
delayed.value = stats[props.domain].delayed;
};
props.connection.on('stats', onStats);
onUnmounted(() => {
props.connection.off('stats', onStats);
});
});
return {
jobs,
activeSincePrevTick,
active,
waiting,
delayed,
number,
};
},
});
</script>
<style lang="scss" scoped>
.pumxzjhg {
> .status {
padding: 16px;
border-bottom: solid 0.5px var(--divider);
}
> .jobs {
padding: 16px;
border-top: solid 0.5px var(--divider);
max-height: 180px;
overflow: auto;
}
}
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<FormBase> <FormBase>
<FormSuspense :p="init"> <FormSuspense :p="init">
<FormLink to="/instance/bot-protection"> <FormLink to="/admin/bot-protection">
<i class="fas fa-shield-alt"></i> {{ $ts.botProtection }} <i class="fas fa-shield-alt"></i> {{ $ts.botProtection }}
<template #suffix v-if="enableHcaptcha">hCaptcha</template> <template #suffix v-if="enableHcaptcha">hCaptcha</template>
<template #suffix v-else-if="enableRecaptcha">reCAPTCHA</template> <template #suffix v-else-if="enableRecaptcha">reCAPTCHA</template>

View File

@ -149,7 +149,7 @@ import * as os from '@client/os';
import number from '@client/filters/number'; import number from '@client/filters/number';
import bytes from '@client/filters/bytes'; import bytes from '@client/filters/bytes';
import * as symbols from '@client/symbols'; import * as symbols from '@client/symbols';
import MkInstanceInfo from '@client/pages/instance/instance.vue'; import MkInstanceInfo from '@client/pages/admin/instance.vue';
export default defineComponent({ export default defineComponent({
components: { components: {

View File

@ -1,97 +0,0 @@
<template>
<div class="_section">
<div class="_inputs">
<MkInput v-model="logDomain" :debounce="true">
<template #label>{{ $ts.domain }}</template>
</MkInput>
<MkSelect v-model="logLevel">
<template #label>Level</template>
<option value="all">All</option>
<option value="info">Info</option>
<option value="success">Success</option>
<option value="warning">Warning</option>
<option value="error">Error</option>
<option value="debug">Debug</option>
</MkSelect>
</div>
<div class="logs">
<code v-for="log in logs" :key="log.id" :class="log.level">
<details>
<summary><MkTime :time="log.createdAt"/> [{{ log.domain.join('.') }}] {{ log.message }}</summary>
<!--<vue-json-pretty v-if="log.data" :data="log.data"></vue-json-pretty>-->
</details>
</code>
</div>
<MkButton @click="deleteAllLogs()" primary><i class="fas fa-trash-alt"></i> {{ $ts.deleteAll }}</MkButton>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import MkButton from '@client/components/ui/button.vue';
import MkInput from '@client/components/form/input.vue';
import MkSelect from '@client/components/form/select.vue';
import MkTextarea from '@client/components/form/textarea.vue';
import * as os from '@client/os';
import * as symbols from '@client/symbols';
export default defineComponent({
components: {
MkButton,
MkInput,
MkSelect,
MkTextarea,
},
emits: ['info'],
data() {
return {
[symbols.PAGE_INFO]: {
title: this.$ts.serverLogs,
icon: 'fas fa-stream'
},
logs: [],
logLevel: 'all',
logDomain: '',
}
},
watch: {
logLevel() {
this.logs = [];
this.fetchLogs();
},
logDomain() {
this.logs = [];
this.fetchLogs();
}
},
created() {
this.fetchLogs();
},
mounted() {
this.$emit('info', this[symbols.PAGE_INFO]);
},
methods: {
fetchLogs() {
os.api('admin/logs', {
level: this.logLevel === 'all' ? null : this.logLevel,
domain: this.logDomain === '' ? null : this.logDomain,
limit: 30
}).then(logs => {
this.logs = logs.reverse();
});
},
deleteAllLogs() {
os.apiWithDialog('admin/delete-logs');
},
}
});
</script>

View File

@ -1,218 +0,0 @@
<template>
<div class="_debobigegoItem">
<div class="_debobigegoLabel"><slot name="title"></slot></div>
<div class="_debobigegoPanel pumxzjhg">
<div class="_table status">
<div class="_row">
<div class="_cell"><div class="_label">Process</div>{{ number(activeSincePrevTick) }}</div>
<div class="_cell"><div class="_label">Active</div>{{ number(active) }}</div>
<div class="_cell"><div class="_label">Waiting</div>{{ number(waiting) }}</div>
<div class="_cell"><div class="_label">Delayed</div>{{ number(delayed) }}</div>
</div>
</div>
<div class="">
<canvas ref="chart"></canvas>
</div>
<div class="jobs">
<div v-if="jobs.length > 0">
<div v-for="job in jobs" :key="job[0]">
<span>{{ job[0] }}</span>
<span style="margin-left: 8px; opacity: 0.7;">({{ number(job[1]) }} jobs)</span>
</div>
</div>
<span v-else style="opacity: 0.5;">{{ $ts.noJobs }}</span>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, markRaw } from 'vue';
import Chart from 'chart.js';
import number from '@client/filters/number';
const alpha = (hex, a) => {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!;
const r = parseInt(result[1], 16);
const g = parseInt(result[2], 16);
const b = parseInt(result[3], 16);
return `rgba(${r}, ${g}, ${b}, ${a})`;
};
import * as os from '@client/os';
export default defineComponent({
props: {
domain: {
required: true
},
connection: {
required: true
},
},
data() {
return {
chart: null,
jobs: [],
activeSincePrevTick: 0,
active: 0,
waiting: 0,
delayed: 0,
}
},
mounted() {
this.fetchJobs();
// TODO: var(--panel)
const gridColor = this.$store.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg');
this.chart = markRaw(new Chart(this.$refs.chart, {
type: 'line',
data: {
labels: [],
datasets: [{
label: 'Process',
pointRadius: 0,
lineTension: 0,
borderWidth: 2,
borderColor: '#00E396',
backgroundColor: alpha('#00E396', 0.1),
data: []
}, {
label: 'Active',
pointRadius: 0,
lineTension: 0,
borderWidth: 2,
borderColor: '#00BCD4',
backgroundColor: alpha('#00BCD4', 0.1),
data: []
}, {
label: 'Waiting',
pointRadius: 0,
lineTension: 0,
borderWidth: 2,
borderColor: '#FFB300',
backgroundColor: alpha('#FFB300', 0.1),
data: []
}, {
label: 'Delayed',
pointRadius: 0,
lineTension: 0,
borderWidth: 2,
borderColor: '#E53935',
borderDash: [5, 5],
fill: false,
data: []
}]
},
options: {
aspectRatio: 3,
layout: {
padding: {
left: 16,
right: 16,
top: 16,
bottom: 12
}
},
legend: {
position: 'bottom',
labels: {
boxWidth: 16,
}
},
scales: {
xAxes: [{
gridLines: {
display: false,
color: gridColor,
zeroLineColor: gridColor,
},
ticks: {
display: false
}
}],
yAxes: [{
position: 'right',
gridLines: {
display: true,
color: gridColor,
zeroLineColor: gridColor,
},
ticks: {
display: false,
}
}]
},
tooltips: {
intersect: false,
mode: 'index',
}
}
}));
this.connection.on('stats', this.onStats);
this.connection.on('statsLog', this.onStatsLog);
},
beforeUnmount() {
this.connection.off('stats', this.onStats);
this.connection.off('statsLog', this.onStatsLog);
},
methods: {
onStats(stats) {
this.activeSincePrevTick = stats[this.domain].activeSincePrevTick;
this.active = stats[this.domain].active;
this.waiting = stats[this.domain].waiting;
this.delayed = stats[this.domain].delayed;
this.chart.data.labels.push('');
this.chart.data.datasets[0].data.push(stats[this.domain].activeSincePrevTick);
this.chart.data.datasets[1].data.push(stats[this.domain].active);
this.chart.data.datasets[2].data.push(stats[this.domain].waiting);
this.chart.data.datasets[3].data.push(stats[this.domain].delayed);
if (this.chart.data.datasets[0].data.length > 200) {
this.chart.data.labels.shift();
this.chart.data.datasets[0].data.shift();
this.chart.data.datasets[1].data.shift();
this.chart.data.datasets[2].data.shift();
this.chart.data.datasets[3].data.shift();
}
this.chart.update();
},
onStatsLog(statsLog) {
for (const stats of [...statsLog].reverse()) {
this.onStats(stats);
}
},
fetchJobs() {
os.api(this.domain === 'inbox' ? 'admin/queue/inbox-delayed' : this.domain === 'deliver' ? 'admin/queue/deliver-delayed' : null, {}).then(jobs => {
this.jobs = jobs;
});
},
number
}
});
</script>
<style lang="scss" scoped>
.pumxzjhg {
> .status {
padding: 16px;
border-bottom: solid 0.5px var(--divider);
}
> .jobs {
padding: 16px;
border-top: solid 0.5px var(--divider);
max-height: 180px;
overflow: auto;
}
}
</style>

View File

@ -70,8 +70,8 @@ const defaultRoutes = [
{ path: '/my/antennas/:antennaId', component: page('my-antennas/edit'), props: true }, { path: '/my/antennas/:antennaId', component: page('my-antennas/edit'), props: true },
{ path: '/my/clips', component: page('my-clips/index') }, { path: '/my/clips', component: page('my-clips/index') },
{ path: '/scratchpad', component: page('scratchpad') }, { path: '/scratchpad', component: page('scratchpad') },
{ path: '/instance/:page(.*)?', component: page('instance/index'), props: route => ({ initialPage: route.params.page || null }) }, { path: '/admin/:page(.*)?', component: page('admin/index'), props: route => ({ initialPage: route.params.page || null }) },
{ path: '/instance', component: page('instance/index') }, { path: '/admin', component: page('admin/index') },
{ path: '/notes/:note', name: 'note', component: page('note'), props: route => ({ noteId: route.params.note }) }, { path: '/notes/:note', name: 'note', component: page('note'), props: route => ({ noteId: route.params.note }) },
{ path: '/tags/:tag', component: page('tag'), props: route => ({ tag: route.params.tag }) }, { path: '/tags/:tag', component: page('tag'), props: route => ({ tag: route.params.tag }) },
{ path: '/user-info/:user', component: page('user-info'), props: route => ({ userId: route.params.user }) }, { path: '/user-info/:user', component: page('user-info'), props: route => ({ userId: route.params.user }) },

View File

@ -5,7 +5,7 @@ import { Fn, HpmlScope } from '.';
import { Expr } from './expr'; import { Expr } from './expr';
import * as seedrandom from 'seedrandom'; import * as seedrandom from 'seedrandom';
/* /* TODO: https://www.chartjs.org/docs/latest/configuration/canvas-background.html#color
// https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs // https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs
Chart.pluginService.register({ Chart.pluginService.register({
beforeDraw: (chart, easing) => { beforeDraw: (chart, easing) => {

View File

@ -25,7 +25,7 @@
</component> </component>
</template> </template>
<div class="divider"></div> <div class="divider"></div>
<MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/instance" v-click-anime> <MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/admin" v-click-anime>
<i class="fas fa-server fa-fw"></i><span class="text">{{ $ts.instance }}</span> <i class="fas fa-server fa-fw"></i><span class="text">{{ $ts.instance }}</span>
</MkA> </MkA>
<button class="item _button" @click="more" v-click-anime> <button class="item _button" @click="more" v-click-anime>

View File

@ -13,7 +13,7 @@
</component> </component>
</template> </template>
<div class="divider"></div> <div class="divider"></div>
<MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/instance" :behavior="settingsWindowed ? 'modalWindow' : null" v-click-anime v-tooltip="$ts.instance"> <MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/admin" :behavior="settingsWindowed ? 'modalWindow' : null" v-click-anime v-tooltip="$ts.instance">
<i class="fas fa-server fa-fw"></i> <i class="fas fa-server fa-fw"></i>
</MkA> </MkA>
<button class="item _button" @click="more" v-click-anime> <button class="item _button" @click="more" v-click-anime>

View File

@ -20,7 +20,7 @@
</component> </component>
</template> </template>
<div class="divider"></div> <div class="divider"></div>
<MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/instance" :behavior="settingsWindowed ? 'modalWindow' : null" v-click-anime> <MkA v-if="$i.isAdmin || $i.isModerator" class="item" active-class="active" to="/admin" :behavior="settingsWindowed ? 'modalWindow' : null" v-click-anime>
<i class="fas fa-server fa-fw"></i><span class="text">{{ $ts.instance }}</span> <i class="fas fa-server fa-fw"></i><span class="text">{{ $ts.instance }}</span>
</MkA> </MkA>
<button class="item _button" @click="more" v-click-anime> <button class="item _button" @click="more" v-click-anime>

View File

@ -8,7 +8,6 @@ import { entities as charts } from '@/services/chart/entities';
import { dbLogger } from './logger'; import { dbLogger } from './logger';
import * as highlight from 'cli-highlight'; import * as highlight from 'cli-highlight';
import { Log } from '@/models/entities/log';
import { User } from '@/models/entities/user'; import { User } from '@/models/entities/user';
import { DriveFile } from '@/models/entities/drive-file'; import { DriveFile } from '@/models/entities/drive-file';
import { DriveFolder } from '@/models/entities/drive-folder'; import { DriveFolder } from '@/models/entities/drive-folder';
@ -144,7 +143,6 @@ export const entities = [
PageLike, PageLike,
GalleryPost, GalleryPost,
GalleryLike, GalleryLike,
Log,
DriveFile, DriveFile,
DriveFolder, DriveFolder,
Poll, Poll,

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -13,10 +13,10 @@
## الشامل ## الشامل
全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿が流れます。GTLと略されます。 全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿が流れます。GTLと略されます。
## 比較 ## مقارنة
| ソース | | | الخيط الزمني | | | | ソース | | | الخيط الزمني | | |
| ------------ | ---------- | ------- | ------------ | --------- | ------ | | ------------ | ---------- | ------- | ------------ | --------- | ------ |
| المستخدمون | 公開範囲 | الرئيسي | المحلي | الاجتماعي | الشامل | | المستخدمون | الظهور | الرئيسي | المحلي | الاجتماعي | الشامل |
| ローカル (フォロー) | 公開 | ✔ | ✔ | ✔ | ✔ | | ローカル (フォロー) | 公開 | ✔ | ✔ | ✔ | ✔ |
| | الرئيسي | ✔ | | ✔ | | | | الرئيسي | ✔ | | ✔ | |
| | المتابِعين | ✔ | ✔ | ✔ | ✔ | | | المتابِعين | ✔ | ✔ | ✔ | ✔ |

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>
### Soubor(ů)
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Text
<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>
### Sichtbarkeit
※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>
### Dateien
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Text
<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>
### Visiblility
※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>
### Files
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -77,13 +77,13 @@ Content which may include text, images, surveys and others that has been posted
Users of Misskey. Users of Misskey.
## Moderator ## Moderator
Users with the authority to to manage the community of a server by deactivating spam accounts, deleting inappropriate posts etc. Users with the authority to manage the community of a server by deactivating spam accounts, silencing users, deleting inappropriate posts, etc.
## Remote ## Remote
Used in context of servers separate from your own.Also used as prefix in other words like "Remote user".The opposite of "Local". Used in context of servers separate from your own.Also used as prefix in other words like "Remote user".The opposite of "Local".
## Federation ## Federation
The act of sharing information created one one's server with other servers. The act of sharing information created on one's server with other servers.
## Local ## Local
Used in context of your own server.Also used as prefix in other words like "Local users", "local timeline".The opposite of "Remote". Used in context of your own server.Also used as prefix in other words like "Local users", "local timeline".The opposite of "Remote".

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>
### Videbleco
※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>
### Dosieroj
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -5,7 +5,7 @@ MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用
- Teksto de notoj - Teksto de notoj
- CW注釈 - CW注釈
- La nomo de uzantoj - La nomo de uzantoj
- La sinprezento de profiloj - Sinprezento en la profilo de la uzanto
## Informoj por programistoj ## Informoj por programistoj
MFMのパーサー実装はライブラリとして公開されており、簡単にクライアントにMFMを組み込むことが可能です。 MFMのパーサー実装はライブラリとして公開されており、簡単にクライアントにMFMを組み込むことが可能です。

View File

@ -22,19 +22,19 @@
## Bloki ## Bloki
ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。 ユーザーをブロックすると、そのユーザーからあなたのコンテンツが見えないようになり、またあなたに対して以下のようなアクションをすることができなくなります。
- フォローする - Eksekvi
- ユーザーリストに追加する - Aldoni al listo de uzantoj
- 返信する、Renoteする - Respondi aŭ plusendi
- リアクションする、アンケートに投票する - Reagi aŭ voĉi
- メッセージを送信する - Senti mesaĝon
- など - k.t.p
また、 また、
- ブロックする際に既にそのユーザーからフォローされていた場合はフォローが解除されます。 - Se la uzanto jam sekvas vin kiam vi blokas, la uzanto ĉesos sekvi.
- ブロックする際に既にそのユーザーがあなたをユーザーリストに入れていた場合はそのリストからあなたが削除されます。 - Se la uzanto jam aldonis vin al listo de uzantoj kiam vi blokas, oni forigos vin de la listo
ユーザーをブロックするには、対象のユーザーのユーザーページのメニューを開き、「ブロック」ボタンを押します。 Por bloki uzanton klaku la butonon "Bloki" el la menuo de uzula paĝo de specifa uzanto.
<div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div> <div class="warn">⚠️ ブロックを行ったこと自体は相手に通知されませんが、フォローを行ったりなどの上記のアクションが行えなくなるので間接的にブロックされていることは分かります。</div>

View File

@ -14,7 +14,7 @@ Notoj estas centraj konceptoj en Misskey kaj enhavoj kiuj konsistas el teksto, b
## Plusendi noton ## Plusendi noton
既にあるートを引用、もしくはそのートを新しいートとして共有する行為、またそれによって作成されたートをRenoteと呼びます。 自分がフォローしているユーザーの、気に入ったノートを自分のフォロワーに共有したい場合や、過去の自分のノートを再度共有したい場合に使います。 同じートに対して無制限にRenoteを行うことができますが、あまり連続して使用すると迷惑になる場合もあるので、注意しましょう。 既にあるートを引用、もしくはそのートを新しいートとして共有する行為、またそれによって作成されたートをRenoteと呼びます。 自分がフォローしているユーザーの、気に入ったノートを自分のフォロワーに共有したい場合や、過去の自分のノートを再度共有したい場合に使います。 同じートに対して無制限にRenoteを行うことができますが、あまり連続して使用すると迷惑になる場合もあるので、注意しましょう。
<div class="warn">⚠️ Se oni sendas notojn nur al sekvantoj aŭ rekte, iliaj ne estas plusendeblaj.</div> <div class="warn">⚠️ Se vi havigas al via noto videblecon ke nur al sekvantoj aŭ ke rekte, iliaj ne estos plusendeblaj.</div>
Renoteを削除するには、Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。 Renoteを削除するには、Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。
@ -51,4 +51,4 @@ Viaj notoj estos senditaj nur al viaj sekvantoj.La noto aperos sur ĉiuj templin
ノートをピン留めすると、ユーザーページに常にそのノートを表示しておくことができます。 ノートのメニューを開き、「ピン留め」を選択してピン留めできます。 複数のノートをピン留めできます。 ノートをピン留めすると、ユーザーページに常にそのノートを表示しておくことができます。 ノートのメニューを開き、「ピン留め」を選択してピン留めできます。 複数のノートをピン留めできます。
## Observi ## Observi
Vi povas ricevi tiuj sciigoj pri reagoj, respondoj, k.t.p al noto kiuj ne apartenas al vi estas ankaŭ ricevebla. Por komenci tion elektu la "Observi" el la menuon kuntekstan de la notoj respektivaj. Per la funkcio Observi vi povas ricevi novajn sciigojn pri reagoj, respondoj, k.t.p al tiu noto kiu ne apartenas al vi. Por observi noton elektu la "Observi" el la menuo kunteksta de la noto respektiva.

View File

@ -12,7 +12,7 @@ MisskeyはMastodonのAPIと互換性がないため、一部を除きMastodonク
## 他のサーバーのユーザーをフォローするときは? ## 他のサーバーのユーザーをフォローするときは?
メニューから検索を選び、ユーザー名をホスト込みで入力します。例: `@syuilo@misskey.io` メニューから検索を選び、ユーザー名をホスト込みで入力します。例: `@syuilo@misskey.io`
## Renoteを削除するには ## "Kiel mi malfari plusendon de noto?"
Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。 Renoteについては[こちら](../features/note)をご確認ください。 Renoteの時刻表示の隣にある「...」を押し、「Renote解除」を選択します。 Renoteについては[こちら](../features/note)をご確認ください。
## URLのプレビューを表示させたくない ## URLのプレビューを表示させたくない

View File

@ -30,8 +30,8 @@
## 通知やアンテナ等の点滅が消えない ## 通知やアンテナ等の点滅が消えない
点滅は、未読のコンテンツがあることを示しています。通常点滅が消えない場合は、コンテンツを遡ると未読なコンテンツが残っています。 すべて既読にしたと思われるのに、それでもなお点滅が続く場合(おそらく不具合と思われます)は設定から強制的にすべて既読扱いにすることができます。 点滅は、未読のコンテンツがあることを示しています。通常点滅が消えない場合は、コンテンツを遡ると未読なコンテンツが残っています。 すべて既読にしたと思われるのに、それでもなお点滅が続く場合(おそらく不具合と思われます)は設定から強制的にすべて既読扱いにすることができます。
## Renoteができない ## Oni ne povas plusendi noton
フォロワー限定のートはRenoteすることはできません。 Notoj nur al sekvantoj ne estas plusendeblaj.
## UI上で特定の要素が表示されない ## UI上で特定の要素が表示されない
広告ブロッカーを使用しているとそのような不具合が発生することがあります。Misskeyではオフにしてご利用ください。 広告ブロッカーを使用しているとそのような不具合が発生することがあります。Misskeyではオフにしてご利用ください。

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Texto
<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>
### Visibilidad
※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>
### Archivos
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -3,5 +3,5 @@ AiScriptは、Misskeyで使用できるスクリプト言語です。
<div class="info"> AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されています。</a></div> <div class="info"> AiScript実装はMisskeyとは別リポジトリで、<a href="https://github.com/syuilo/aiscript" target="_blank">オープンソースで公開されています。</a></div>
## 使い方 ## Utilisation
AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されています。 AiScriptの構文や組み込み関数などのドキュメントは、[こちら](https://github.com/syuilo/aiscript/tree/master/docs)で公開されています。

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Texte
<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>
### Visibilité
※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>
### Fichiers
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -8,7 +8,7 @@ Nom du protocole (procédé technique) utilisé par Misskey pour pouvoir fonctio
Langage de programmation qui peut être utilisé sur Misskey. [Voir ici pour plus d'informations.](../advanced/aiscript) Langage de programmation qui peut être utilisé sur Misskey. [Voir ici pour plus d'informations.](../advanced/aiscript)
## API ## API
(読み: えーぴーあい) Misskeyのサーバーが公開している、プログラムからMisskeyを扱うためのインターフェース。[Voir ici pour plus d'informations. ](../advanced/api) Interface pour permettre à un programme d'utiliser Misskey, disponible publiquement sur le serveur de Misskey. [Voir ici pour plus d'informations. ](../advanced/api)
## Bot ## Bot
Anglicisme désignant un compte géré par un programme informatique (vous le trouverez parfois aussi sous le terme de « robot »). Anglicisme désignant un compte géré par un programme informatique (vous le trouverez parfois aussi sous le terme de « robot »).
@ -59,13 +59,13 @@ Désigne les émojis mis à disposition par votre instance. Par opposition, les
todo todo
## Mettre en sourdine ## Mettre en sourdine
ノートをパブリックな公開範囲で投稿できなくされている状態。モデレーターの判断でユーザーごとに設定されます。[Voir ici pour plus d'informations. ](../features/silence) Désigne le fait de paramétrer un compte pour empêcher ses publications d'être partagées en mode « Public ». Peut être appliqué à des utilisateur·rice·s individuel·le·s à la discrétion des modérateur·rice·s. [Voir ici pour plus d'informations. ](../features/silence)
## File dattente ## File dattente
アクティビティ配送などを順番に行うためのシステム。 Système permettant de distribuer les activités dans un ordre successif.
## Suspendre ## Suspendre
アカウントが使用不可に設定されている状態。 Désigne le fait de paramétrer un compte pour le rendre inutilisable à son/sa propriétaire.
## Drive ## Drive
Fonctionnalité vous permettant de gérer les fichiers que vous avez téléversés sur Misskey. [Voir ici pour plus d'informations. ](../features/drive) Fonctionnalité vous permettant de gérer les fichiers que vous avez téléversés sur Misskey. [Voir ici pour plus d'informations. ](../features/drive)
@ -77,13 +77,13 @@ Nom des publications sur Misskey. Leur contenu peut être du texte, mais aussi d
Désigne les utilisateur·rice·s de Misskey. Désigne les utilisateur·rice·s de Misskey.
## Modérateur·rice·s ## Modérateur·rice·s
スパムの凍結およびサイレンスや不適切な投稿の削除など、コミュニティ運営に関する権限を持つユーザー。 Utilisateur·rice·s chargé·e·s de gérer la communauté d'une instance, ayant autorité pour désactiver les comptes de spam, mettre des utilisateur·rice·s en sourdine, supprimer des publications inappropriées, etc.
## Distant ## Distant
他サーバーのことを指します。リモートユーザーといったように接頭辞としても使われます。ローカルの逆です。 Désigne les autres instances que celle où vous êtes inscrit·e. Peut aussi être utilisé pour qualifier d'autres mots, comme « utilisateur·rice·s distant·e·s ». C'est le contraire de « local ».
## Fédération ## Fédération
サーバー上で作成された情報が他のサーバーに伝わること。 Désigne le fait de partager les informations publiées sur un serveur avec les autres serveurs du réseau.
## Local ## Local
自サーバーのことを指します。ローカルユーザー、ローカルタイムラインといったように接頭辞としても使われます。リモートの逆です。 Désigne l'instance où vous êtes inscrit·e. Peut aussi être utilisé pour qualifier d'autres mots, comme « utilisateur·rice·s locaux·cales » ou « fil local ». C'est le contraire de « distant ».

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Teks
<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>
### Visibilitas
※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>
### Berkas
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Testo
<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>
### Visibilità
※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>
### Allegati
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>
### Ifuyla
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/share`を開くと、共有用の投稿フォームを開くことができます。 ここではシェアページで利用できるクエリ文字列の一覧を示します。
## クエリ文字列一覧
### Tekst
<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>
### Widoczność
※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>
### Pliki
<dl>
<dt>fileIds</dt>
<dd>添付したいファイルのidカンマ区切りで</dd>
</dl>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -0,0 +1,54 @@
# 分享页面
`/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>

View File

@ -0,0 +1,54 @@
# シェアページ
`/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>

View File

@ -1,46 +0,0 @@
import { Entity, PrimaryColumn, Index, Column } from 'typeorm';
import { id } from '../id';
@Entity()
export class Log {
@PrimaryColumn(id())
public id: string;
@Index()
@Column('timestamp with time zone', {
comment: 'The created date of the Log.'
})
public createdAt: Date;
@Index()
@Column('varchar', {
length: 64, array: true, default: '{}'
})
public domain: string[];
@Index()
@Column('enum', {
enum: ['error', 'warning', 'info', 'success', 'debug']
})
public level: string;
@Column('varchar', {
length: 8
})
public worker: string;
@Column('varchar', {
length: 128
})
public machine: string;
@Column('varchar', {
length: 2048
})
public message: string;
@Column('jsonb', {
default: {}
})
public data: Record<string, any>;
}

View File

@ -13,7 +13,6 @@ import { UserRepository } from './repositories/user';
import { NoteRepository } from './repositories/note'; import { NoteRepository } from './repositories/note';
import { DriveFileRepository } from './repositories/drive-file'; import { DriveFileRepository } from './repositories/drive-file';
import { DriveFolderRepository } from './repositories/drive-folder'; import { DriveFolderRepository } from './repositories/drive-folder';
import { Log } from './entities/log';
import { AccessToken } from './entities/access-token'; import { AccessToken } from './entities/access-token';
import { UserNotePining } from './entities/user-note-pining'; import { UserNotePining } from './entities/user-note-pining';
import { SigninRepository } from './repositories/signin'; import { SigninRepository } from './repositories/signin';
@ -108,7 +107,6 @@ export const Signins = getCustomRepository(SigninRepository);
export const MessagingMessages = getCustomRepository(MessagingMessageRepository); export const MessagingMessages = getCustomRepository(MessagingMessageRepository);
export const ReversiGames = getCustomRepository(ReversiGameRepository); export const ReversiGames = getCustomRepository(ReversiGameRepository);
export const ReversiMatchings = getCustomRepository(ReversiMatchingRepository); export const ReversiMatchings = getCustomRepository(ReversiMatchingRepository);
export const Logs = getRepository(Log);
export const Pages = getCustomRepository(PageRepository); export const Pages = getCustomRepository(PageRepository);
export const PageLikes = getCustomRepository(PageLikeRepository); export const PageLikes = getCustomRepository(PageLikeRepository);
export const GalleryPosts = getCustomRepository(GalleryPostRepository); export const GalleryPosts = getCustomRepository(GalleryPostRepository);

View File

@ -1,126 +0,0 @@
import $ from 'cafy';
import define from '../../define';
import { Logs } from '@/models/index';
import { Brackets } from 'typeorm';
export const meta = {
tags: ['admin'],
requireCredential: true as const,
requireModerator: true,
params: {
limit: {
validator: $.optional.num.range(1, 100),
default: 30
},
level: {
validator: $.optional.nullable.str,
default: null
},
domain: {
validator: $.optional.nullable.str,
default: null
}
},
res: {
type: 'array' as const,
optional: false as const, nullable: false as const,
items: {
type: 'object' as const,
optional: false as const, nullable: false as const,
properties: {
id: {
type: 'string' as const,
optional: false as const, nullable: false as const,
format: 'id',
example: 'xxxxxxxxxx',
},
createdAt: {
type: 'string' as const,
optional: false as const, nullable: false as const,
format: 'date-time',
},
domain: {
type: 'array' as const,
optional: false as const, nullable: false as const,
items: {
type: 'string' as const,
optional: true as const, nullable: false as const
}
},
level: {
type: 'string' as const,
optional: false as const, nullable: false as const
},
worker: {
type: 'string' as const,
optional: false as const, nullable: false as const
},
machine: {
type: 'string' as const,
optional: false as const, nullable: false as const,
},
message: {
type: 'string' as const,
optional: false as const, nullable: false as const,
},
data: {
type: 'object' as const,
optional: false as const, nullable: false as const
}
}
}
}
};
export default define(meta, async (ps) => {
const query = Logs.createQueryBuilder('log');
if (ps.level) query.andWhere('log.level = :level', { level: ps.level });
if (ps.domain) {
const whiteDomains = ps.domain.split(' ').filter(x => !x.startsWith('-'));
const blackDomains = ps.domain.split(' ').filter(x => x.startsWith('-')).map(x => x.substr(1));
if (whiteDomains.length > 0) {
query.andWhere(new Brackets(qb => {
for (const whiteDomain of whiteDomains) {
let i = 0;
for (const subDomain of whiteDomain.split('.')) {
const p = `whiteSubDomain_${subDomain}_${i}`;
// SQL is 1 based, so we need '+ 1'
qb.orWhere(`log.domain[${i + 1}] = :${p}`, { [p]: subDomain });
i++;
}
}
}));
}
if (blackDomains.length > 0) {
query.andWhere(new Brackets(qb => {
for (const blackDomain of blackDomains) {
qb.andWhere(new Brackets(qb => {
const subDomains = blackDomain.split('.');
let i = 0;
for (const subDomain of subDomains) {
const p = `blackSubDomain_${subDomain}_${i}`;
// 全体で否定できないのでド・モルガンの法則で
// !(P && Q) を !P || !Q で表す
// SQL is 1 based, so we need '+ 1'
qb.orWhere(`log.domain[${i + 1}] != :${p}`, { [p]: subDomain });
i++;
}
}));
}
}));
}
}
const logs = await query.orderBy('log.createdAt', 'DESC').take(ps.limit!).getMany();
return logs;
});

View File

@ -43,12 +43,6 @@ export const meta = {
code: 'ALREADY_BLOCKING', code: 'ALREADY_BLOCKING',
id: '787fed64-acb9-464a-82eb-afbd745b9614' id: '787fed64-acb9-464a-82eb-afbd745b9614'
}, },
cannotBlockModerator: {
message: 'Cannot block a moderator or an admin.',
code: 'CANNOT_BLOCK_MODERATOR',
id: '8544aaef-89fb-e470-9f6c-385d38b474f5'
}
}, },
res: { res: {
@ -82,12 +76,7 @@ export default define(meta, async (ps, user) => {
throw new ApiError(meta.errors.alreadyBlocking); throw new ApiError(meta.errors.alreadyBlocking);
} }
try {
await create(blocker, blockee); await create(blocker, blockee);
} catch (e) {
if (e.id === 'e42b7890-5e4d-9d9c-d54b-cf4dd30adfb5') throw new ApiError(meta.errors.cannotBlockModerator);
throw e;
}
NoteWatchings.delete({ NoteWatchings.delete({
userId: blocker.id, userId: blocker.id,

View File

@ -12,10 +12,6 @@ import { genId } from '@/misc/gen-id';
import { IdentifiableError } from '@/misc/identifiable-error'; import { IdentifiableError } from '@/misc/identifiable-error';
export default async function(blocker: User, blockee: User) { export default async function(blocker: User, blockee: User) {
if (blockee.isAdmin || blockee.isModerator) {
throw new IdentifiableError('e42b7890-5e4d-9d9c-d54b-cf4dd30adfb5');
}
await Promise.all([ await Promise.all([
cancelRequest(blocker, blockee), cancelRequest(blocker, blockee),
cancelRequest(blockee, blocker), cancelRequest(blockee, blocker),

View File

@ -1,11 +1,7 @@
import * as cluster from 'cluster'; import * as cluster from 'cluster';
import * as os from 'os';
import * as chalk from 'chalk'; import * as chalk from 'chalk';
import * as dateformat from 'dateformat'; import * as dateformat from 'dateformat';
import { envOption } from '../env'; import { envOption } from '../env';
import { getRepository } from 'typeorm';
import { Log } from '@/models/entities/log';
import { genId } from '@/misc/gen-id';
import config from '@/config/index'; import config from '@/config/index';
import * as SyslogPro from 'syslog-pro'; import * as SyslogPro from 'syslog-pro';
@ -95,18 +91,6 @@ export default class Logger {
null as never; null as never;
send.bind(this.syslogClient)(message).catch(() => {}); send.bind(this.syslogClient)(message).catch(() => {});
} else {
const Logs = getRepository(Log);
Logs.insert({
id: genId(),
createdAt: new Date(),
machine: os.hostname(),
worker: worker.toString(),
domain: [this.domain].concat(subDomains).map(d => d.name),
level: level,
message: message.substr(0, 1000), // 1024を超えるとログが挿入できずエラーになり無限ループする
data: data,
} as Log).catch(() => {});
} }
} }
} }