refactor: ⚡ make identicons and server metrics optional
Co-authored-by: Kainoa Kanter <kainoa@t1c.dev>
This commit is contained in:
parent
7ab8021a9d
commit
0cac6f018d
11 changed files with 122 additions and 28 deletions
|
@ -1112,6 +1112,8 @@ isModerator: "Moderator"
|
||||||
isAdmin: "Administrator"
|
isAdmin: "Administrator"
|
||||||
isPatron: "Calckey Patron"
|
isPatron: "Calckey Patron"
|
||||||
reactionPickerSkinTone: "Preferred emoji skin tone"
|
reactionPickerSkinTone: "Preferred emoji skin tone"
|
||||||
|
enableServerMachineStats: "Enable server hardware statistics"
|
||||||
|
enableIdenticonGeneration: "Enable Identicon generation"
|
||||||
|
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "Reduces the effort of server moderation through automatically recognizing
|
description: "Reduces the effort of server moderation through automatically recognizing
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
_lang_: "日本語"
|
_lang_: "日本語"
|
||||||
headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀"
|
headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀"
|
||||||
introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\
|
introMisskey: "ようこそ!Firefishは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\
|
||||||
「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀"
|
「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀"
|
||||||
monthAndDay: "{month}月 {day}日"
|
monthAndDay: "{month}月 {day}日"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
|
@ -146,7 +146,7 @@ settingGuide: "おすすめ設定"
|
||||||
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
cacheRemoteFiles: "リモートのファイルをキャッシュする"
|
||||||
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
|
||||||
flagAsBot: "Botとして設定"
|
flagAsBot: "Botとして設定"
|
||||||
flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。"
|
flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いがBotに合ったものになります。"
|
||||||
flagAsCat: "あなたは…猫?😺"
|
flagAsCat: "あなたは…猫?😺"
|
||||||
flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。"
|
flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。"
|
||||||
flagSpeakAsCat: "猫語で話す"
|
flagSpeakAsCat: "猫語で話す"
|
||||||
|
@ -213,7 +213,7 @@ noInstances: "サーバーがありません"
|
||||||
editProfile: "プロフィールを編集"
|
editProfile: "プロフィールを編集"
|
||||||
noteDeleteConfirm: "この投稿を削除しますか?"
|
noteDeleteConfirm: "この投稿を削除しますか?"
|
||||||
pinLimitExceeded: "これ以上ピン留めできません"
|
pinLimitExceeded: "これ以上ピン留めできません"
|
||||||
intro: "Calckeyのインストールが完了しました!管理者アカウントを作成しましょう。"
|
intro: "Firefishのインストールが完了しました!管理者アカウントを作成しましょう。"
|
||||||
done: "完了"
|
done: "完了"
|
||||||
processing: "処理中"
|
processing: "処理中"
|
||||||
preview: "プレビュー"
|
preview: "プレビュー"
|
||||||
|
@ -396,7 +396,7 @@ exploreFediverse: "Fediverseを探索"
|
||||||
popularTags: "人気のタグ"
|
popularTags: "人気のタグ"
|
||||||
userList: "リスト"
|
userList: "リスト"
|
||||||
about: "情報"
|
about: "情報"
|
||||||
aboutMisskey: "Calckeyについて"
|
aboutMisskey: "Firefishについて"
|
||||||
administrator: "管理者"
|
administrator: "管理者"
|
||||||
token: "トークン"
|
token: "トークン"
|
||||||
twoStepAuthentication: "二段階認証"
|
twoStepAuthentication: "二段階認証"
|
||||||
|
@ -543,7 +543,7 @@ sort: "ソート"
|
||||||
ascendingOrder: "昇順"
|
ascendingOrder: "昇順"
|
||||||
descendingOrder: "降順"
|
descendingOrder: "降順"
|
||||||
scratchpad: "スクラッチパッド"
|
scratchpad: "スクラッチパッド"
|
||||||
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Calckeyと対話するコードの記述、実行、結果の確認ができます。"
|
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Firefishと対話するコードの記述、実行、結果の確認ができます。"
|
||||||
output: "出力"
|
output: "出力"
|
||||||
script: "スクリプト"
|
script: "スクリプト"
|
||||||
disablePagesScript: "ページのスクリプトを無効にする"
|
disablePagesScript: "ページのスクリプトを無効にする"
|
||||||
|
@ -672,7 +672,7 @@ createNewClip: "新しいクリップを作成"
|
||||||
unclip: "クリップ解除"
|
unclip: "クリップ解除"
|
||||||
confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?"
|
confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?"
|
||||||
public: "公開"
|
public: "公開"
|
||||||
i18nInfo: "Calckeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。"
|
i18nInfo: "Firefishは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。"
|
||||||
manageAccessTokens: "アクセストークンの管理"
|
manageAccessTokens: "アクセストークンの管理"
|
||||||
accountInfo: "アカウント情報"
|
accountInfo: "アカウント情報"
|
||||||
notesCount: "投稿の数"
|
notesCount: "投稿の数"
|
||||||
|
@ -723,7 +723,7 @@ onlineUsersCount: "{n}人がオンライン"
|
||||||
nUsers: "{n}ユーザー"
|
nUsers: "{n}ユーザー"
|
||||||
nNotes: "{n}投稿"
|
nNotes: "{n}投稿"
|
||||||
sendErrorReports: "エラーリポートを送信"
|
sendErrorReports: "エラーリポートを送信"
|
||||||
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。\n\
|
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がFirefishに共有され、ソフトウェアの品質向上に役立てられます。\n\
|
||||||
エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
|
エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
|
||||||
myTheme: "マイテーマ"
|
myTheme: "マイテーマ"
|
||||||
backgroundColor: "背景"
|
backgroundColor: "背景"
|
||||||
|
@ -824,7 +824,7 @@ hashtags: "ハッシュタグ"
|
||||||
troubleshooting: "トラブルシューティング"
|
troubleshooting: "トラブルシューティング"
|
||||||
useBlurEffect: "UIにぼかし効果を使用"
|
useBlurEffect: "UIにぼかし効果を使用"
|
||||||
learnMore: "詳しく"
|
learnMore: "詳しく"
|
||||||
misskeyUpdated: "Calckeyが更新されました!"
|
misskeyUpdated: "Firefishが更新されました!"
|
||||||
whatIsNew: "更新情報を見る"
|
whatIsNew: "更新情報を見る"
|
||||||
translate: "翻訳"
|
translate: "翻訳"
|
||||||
translatedFrom: "{x}から翻訳"
|
translatedFrom: "{x}から翻訳"
|
||||||
|
@ -944,7 +944,7 @@ customMOTDDescription: "ユーザがページをロード/リロードするた
|
||||||
customSplashIcons: "カスタムスプラッシュスクリーンアイコン"
|
customSplashIcons: "カスタムスプラッシュスクリーンアイコン"
|
||||||
customSplashIconsDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたカスタムスプラッシュスクリーンアイコンの
|
customSplashIconsDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたカスタムスプラッシュスクリーンアイコンの
|
||||||
URL。画像は静的なURLで、できればすべて192x192にリサイズしてください。"
|
URL。画像は静的なURLで、できればすべて192x192にリサイズしてください。"
|
||||||
showUpdates: "Calckeyの更新時にポップアップを表示する"
|
showUpdates: "Firefishの更新時にポップアップを表示する"
|
||||||
recommendedInstances: "おすすめサーバー"
|
recommendedInstances: "おすすめサーバー"
|
||||||
recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。`https://`は書かず、ドメインのみを入力してください。"
|
recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。`https://`は書かず、ドメインのみを入力してください。"
|
||||||
caption: "自動キャプション"
|
caption: "自動キャプション"
|
||||||
|
@ -952,7 +952,7 @@ splash: "スプラッシュスクリーン"
|
||||||
updateAvailable: "アップデートがありますよ!"
|
updateAvailable: "アップデートがありますよ!"
|
||||||
swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする"
|
swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする"
|
||||||
logoImageUrl: "ロゴのURL"
|
logoImageUrl: "ロゴのURL"
|
||||||
showAdminUpdates: "新しいCalckeyのバージョンが利用可能なときに通知する(管理者のみ)"
|
showAdminUpdates: "新しいFirefishのバージョンが利用可能なときに通知する(管理者のみ)"
|
||||||
replayTutorial: "もう一度チュートリアルを見る"
|
replayTutorial: "もう一度チュートリアルを見る"
|
||||||
migration: "アカウントの引っ越し"
|
migration: "アカウントの引っ越し"
|
||||||
moveTo: "このアカウントを新しいアカウントに引っ越す"
|
moveTo: "このアカウントを新しいアカウントに引っ越す"
|
||||||
|
@ -977,7 +977,9 @@ customKaTeXMacroDescription: "数式入力を楽にするためのマクロを
|
||||||
enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする"
|
enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする"
|
||||||
preventAiLearning: "AIによる学習を防止"
|
preventAiLearning: "AIによる学習を防止"
|
||||||
preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。"
|
preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。"
|
||||||
noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。"
|
noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Firefishの動作を妨げるため、無効にしてください。"
|
||||||
|
enableServerMachineStats: "サーバーのマシン情報を公開する"
|
||||||
|
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||||
|
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。"
|
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。"
|
||||||
|
@ -1054,12 +1056,12 @@ _registry:
|
||||||
domain: "ドメイン"
|
domain: "ドメイン"
|
||||||
createKey: "キーを作成"
|
createKey: "キーを作成"
|
||||||
_aboutMisskey:
|
_aboutMisskey:
|
||||||
about: "Calckeyは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。"
|
about: "Firefishは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。"
|
||||||
contributors: "主なコントリビューター"
|
contributors: "主なコントリビューター"
|
||||||
allContributors: "全てのコントリビューター"
|
allContributors: "全てのコントリビューター"
|
||||||
source: "ソースコード"
|
source: "ソースコード"
|
||||||
translation: "Calckeyを翻訳"
|
translation: "Firefishを翻訳"
|
||||||
donate: "Calckeyに寄付"
|
donate: "Firefishに寄付"
|
||||||
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます! 🥰"
|
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます! 🥰"
|
||||||
patrons: "支援者"
|
patrons: "支援者"
|
||||||
_nsfw:
|
_nsfw:
|
||||||
|
@ -1068,8 +1070,8 @@ _nsfw:
|
||||||
force: "常にメディアを隠す"
|
force: "常にメディアを隠す"
|
||||||
_mfm:
|
_mfm:
|
||||||
cheatSheet: "MFMチートシート"
|
cheatSheet: "MFMチートシート"
|
||||||
intro: "MFMは、MisskeyやCalckey、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。"
|
intro: "MFMは、MisskeyやFirefish、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。"
|
||||||
dummy: "CalckeyでFediverseの世界が広がります"
|
dummy: "FirefishでFediverseの世界が広がります"
|
||||||
mention: "メンション"
|
mention: "メンション"
|
||||||
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。"
|
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。"
|
||||||
hashtag: "ハッシュタグ"
|
hashtag: "ハッシュタグ"
|
||||||
|
@ -1291,7 +1293,7 @@ _time:
|
||||||
hour: "時間"
|
hour: "時間"
|
||||||
day: "日"
|
day: "日"
|
||||||
_tutorial:
|
_tutorial:
|
||||||
title: "Calckeyの使い方"
|
title: "Firefishの使い方"
|
||||||
step1_1: "ようこそ!"
|
step1_1: "ようこそ!"
|
||||||
step1_2: "使い始める前に、いくつか設定を済ませましょう。すぐできますよ!"
|
step1_2: "使い始める前に、いくつか設定を済ませましょう。すぐできますよ!"
|
||||||
step2_1: "最初に、あなたのプロフィールを作りましょう。"
|
step2_1: "最初に、あなたのプロフィールを作りましょう。"
|
||||||
|
@ -1309,8 +1311,8 @@ _tutorial:
|
||||||
step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするサーバーの投稿を見られます。"
|
step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするサーバーの投稿を見られます。"
|
||||||
step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。"
|
step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。"
|
||||||
step6_1: "じゃあ、ここはどんな場所なの?"
|
step6_1: "じゃあ、ここはどんな場所なの?"
|
||||||
step6_2: "実は、あなたはただCalckeyに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。"
|
step6_2: "実は、あなたはただFirefishに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。"
|
||||||
step6_3: "それぞれのサーバーでは必ずしもCalckeyが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。"
|
step6_3: "それぞれのサーバーでは必ずしもFirefishが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。"
|
||||||
step6_4: "これで完了です。お楽しみください!"
|
step6_4: "これで完了です。お楽しみください!"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "既に設定は完了しています。"
|
alreadyRegistered: "既に設定は完了しています。"
|
||||||
|
@ -1889,7 +1891,7 @@ apps: "アプリ"
|
||||||
_experiments:
|
_experiments:
|
||||||
title: 試験的な機能
|
title: 試験的な機能
|
||||||
postImportsCaption:
|
postImportsCaption:
|
||||||
ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。
|
ユーザーが過去の投稿をFirefish・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。
|
||||||
enablePostImports: 投稿のインポートを有効にする
|
enablePostImports: 投稿のインポートを有効にする
|
||||||
sendModMail: モデレーション通知を送る
|
sendModMail: モデレーション通知を送る
|
||||||
deleted: 削除済み
|
deleted: 削除済み
|
||||||
|
@ -1904,7 +1906,7 @@ accessibility: アクセシビリティ
|
||||||
jumpToPrevious: 前に戻る
|
jumpToPrevious: 前に戻る
|
||||||
cw: 閲覧注意
|
cw: 閲覧注意
|
||||||
silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。
|
silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。
|
||||||
searchPlaceholder: Calckeyを検索
|
searchPlaceholder: Firefishを検索
|
||||||
channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません
|
channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません
|
||||||
listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。
|
listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。
|
||||||
antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。"
|
antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。"
|
||||||
|
@ -1929,4 +1931,4 @@ video: 動画
|
||||||
isBot: このアカウントはBotです
|
isBot: このアカウントはBotです
|
||||||
isLocked: このアカウントのフォローは承認制です
|
isLocked: このアカウントのフォローは承認制です
|
||||||
isAdmin: 管理者
|
isAdmin: 管理者
|
||||||
isPatron: Calckey 後援者
|
isPatron: Firefish 後援者
|
||||||
|
|
BIN
packages/backend/assets/avatar.png
Normal file
BIN
packages/backend/assets/avatar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
21
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
21
packages/backend/migration/1688280713783-add-meta-options.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
export class AddMetaOptions1688280713783 {
|
||||||
|
name = "AddMetaOptions1688280713783";
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import si from "systeminformation";
|
import si from "systeminformation";
|
||||||
import Xev from "xev";
|
import Xev from "xev";
|
||||||
import * as osUtils from "os-utils";
|
import * as osUtils from "os-utils";
|
||||||
|
import { fetchMeta } from "@/misc/fetch-meta.js";
|
||||||
import meilisearch from "../db/meilisearch.js";
|
import meilisearch from "../db/meilisearch.js";
|
||||||
|
|
||||||
const ev = new Xev();
|
const ev = new Xev();
|
||||||
|
@ -20,6 +21,9 @@ export default function () {
|
||||||
ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50));
|
ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const meta = fetchMeta();
|
||||||
|
if (!meta.enableServerMachineStats) return;
|
||||||
|
|
||||||
async function tick() {
|
async function tick() {
|
||||||
const cpu = await cpuUsage();
|
const cpu = await cpuUsage();
|
||||||
const memStats = await mem();
|
const memStats = await mem();
|
||||||
|
|
|
@ -546,4 +546,14 @@ export class Meta {
|
||||||
default: {},
|
default: {},
|
||||||
})
|
})
|
||||||
public experimentalFeatures: Record<string, unknown>;
|
public experimentalFeatures: Record<string, unknown>;
|
||||||
|
|
||||||
|
@Column("boolean", {
|
||||||
|
default: false,
|
||||||
|
})
|
||||||
|
public enableServerMachineStats: boolean;
|
||||||
|
|
||||||
|
@Column("boolean", {
|
||||||
|
default: true,
|
||||||
|
})
|
||||||
|
public enableIdenticonGeneration: boolean;
|
||||||
}
|
}
|
||||||
|
|
|
@ -481,6 +481,16 @@ export const meta = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
enableServerMachineStats: {
|
||||||
|
type: "boolean",
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
enableIdenticonGeneration: {
|
||||||
|
type: "boolean",
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => {
|
||||||
enableIpLogging: instance.enableIpLogging,
|
enableIpLogging: instance.enableIpLogging,
|
||||||
enableActiveEmailValidation: instance.enableActiveEmailValidation,
|
enableActiveEmailValidation: instance.enableActiveEmailValidation,
|
||||||
experimentalFeatures: instance.experimentalFeatures,
|
experimentalFeatures: instance.experimentalFeatures,
|
||||||
|
enableServerMachineStats: instance.enableServerMachineStats,
|
||||||
|
enableIdenticonGeneration: instance.enableIdenticonGeneration,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,11 +2,13 @@ import * as os from "node:os";
|
||||||
import si from "systeminformation";
|
import si from "systeminformation";
|
||||||
import define from "../define.js";
|
import define from "../define.js";
|
||||||
import meilisearch from "@/db/meilisearch.js";
|
import meilisearch from "@/db/meilisearch.js";
|
||||||
|
import { fetchMeta } from "@/misc/fetch-meta.js";
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
requireCredentialPrivateMode: true,
|
requireCredentialPrivateMode: true,
|
||||||
|
allowGet: true,
|
||||||
|
cacheSec: 30,
|
||||||
tags: ["meta"],
|
tags: ["meta"],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const instanceMeta = await fetchMeta();
|
||||||
|
if (!instanceMeta.enableServerMachineStats) {
|
||||||
|
return {
|
||||||
|
machine: 'Not specified',
|
||||||
|
cpu: {
|
||||||
|
model: 'Not specified',
|
||||||
|
cores: 0,
|
||||||
|
},
|
||||||
|
mem: {
|
||||||
|
total: 0,
|
||||||
|
},
|
||||||
|
fs: {
|
||||||
|
total: 0,
|
||||||
|
used: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
machine: os.hostname(),
|
machine: os.hostname(),
|
||||||
cpu: {
|
cpu: {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import { IsNull } from "typeorm";
|
||||||
import config from "@/config/index.js";
|
import config from "@/config/index.js";
|
||||||
import Logger from "@/services/logger.js";
|
import Logger from "@/services/logger.js";
|
||||||
import { UserProfiles, Users } from "@/models/index.js";
|
import { UserProfiles, Users } from "@/models/index.js";
|
||||||
|
import { fetchMeta } from "@/misc/fetch-meta.js";
|
||||||
import { genIdenticon } from "@/misc/gen-identicon.js";
|
import { genIdenticon } from "@/misc/gen-identicon.js";
|
||||||
import { createTemp } from "@/misc/create-temp.js";
|
import { createTemp } from "@/misc/create-temp.js";
|
||||||
import { publishMainStream } from "@/services/stream.js";
|
import { publishMainStream } from "@/services/stream.js";
|
||||||
|
@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get("/identicon/:x", async (ctx) => {
|
router.get("/identicon/:x", async (ctx) => {
|
||||||
|
const meta = await fetchMeta();
|
||||||
|
if (meta.enableIdenticonGeneration) {
|
||||||
const [temp, cleanup] = await createTemp();
|
const [temp, cleanup] = await createTemp();
|
||||||
await genIdenticon(ctx.params.x, fs.createWriteStream(temp));
|
await genIdenticon(ctx.params.x, fs.createWriteStream(temp));
|
||||||
ctx.set("Content-Type", "image/png");
|
ctx.set("Content-Type", "image/png");
|
||||||
ctx.body = fs.createReadStream(temp).on("close", () => cleanup());
|
ctx.body = fs.createReadStream(temp).on("close", () => cleanup());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ctx.redirect("/static-assets/avatar.png")
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mastoRouter.get("/oauth/authorize", async (ctx) => {
|
mastoRouter.get("/oauth/authorize", async (ctx) => {
|
||||||
|
|
|
@ -343,6 +343,17 @@
|
||||||
</template>
|
</template>
|
||||||
</FormSection>
|
</FormSection>
|
||||||
|
|
||||||
|
<FormSection>
|
||||||
|
<template #label>Server Performance</template>
|
||||||
|
<FormSwitch v-model="enableServerMachineStats">
|
||||||
|
<template #label>{{ i18n.ts.enableServerMachineStats }}</template>
|
||||||
|
</FormSwitch>
|
||||||
|
|
||||||
|
<FormSwitch v-model="enableIdenticonGeneration">
|
||||||
|
<template #label>{{ i18n.ts.enableIdenticonGeneration }}</template>
|
||||||
|
</FormSwitch>
|
||||||
|
</FormSection>
|
||||||
|
|
||||||
<FormSection>
|
<FormSection>
|
||||||
<template #label>DeepL Translation</template>
|
<template #label>DeepL Translation</template>
|
||||||
|
|
||||||
|
@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref("");
|
||||||
let libreTranslateApiKey: string = $ref("");
|
let libreTranslateApiKey: string = $ref("");
|
||||||
let defaultReaction: string = $ref("");
|
let defaultReaction: string = $ref("");
|
||||||
let defaultReactionCustom: string = $ref("");
|
let defaultReactionCustom: string = $ref("");
|
||||||
|
let enableServerMachineStats: boolean = $ref(false);
|
||||||
|
let enableIdenticonGeneration: boolean = $ref(false);
|
||||||
|
|
||||||
async function init() {
|
async function init() {
|
||||||
const meta = await os.api("admin/meta");
|
const meta = await os.api("admin/meta");
|
||||||
|
@ -482,6 +495,8 @@ async function init() {
|
||||||
defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction)
|
defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction)
|
||||||
? ""
|
? ""
|
||||||
: meta.defaultReaction;
|
: meta.defaultReaction;
|
||||||
|
enableServerMachineStats = meta.enableServerMachineStats;
|
||||||
|
enableIdenticonGeneration = meta.enableIdenticonGeneration;
|
||||||
}
|
}
|
||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
|
@ -521,6 +536,8 @@ function save() {
|
||||||
libreTranslateApiUrl,
|
libreTranslateApiUrl,
|
||||||
libreTranslateApiKey,
|
libreTranslateApiKey,
|
||||||
defaultReaction,
|
defaultReaction,
|
||||||
|
enableServerMachineStats,
|
||||||
|
enableIdenticonGeneration,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
fetchInstance();
|
fetchInstance();
|
||||||
});
|
});
|
||||||
|
|
|
@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager(
|
||||||
|
|
||||||
const meta = ref(null);
|
const meta = ref(null);
|
||||||
|
|
||||||
os.api("server-info", {}).then((res) => {
|
os.apiGet("server-info", {}).then((res) => {
|
||||||
meta.value = res;
|
meta.value = res;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue