refactor: make identicons and server metrics optional

Co-authored-by: Kainoa Kanter <kainoa@t1c.dev>
This commit is contained in:
Syuilo 2023-07-02 16:20:40 -07:00 committed by ThatOneCalculator
parent 1d23f3c904
commit 12a8e6d91f
11 changed files with 125 additions and 28 deletions

View file

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

View file

@ -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 (Stored with Git LFS) Normal file

Binary file not shown.

View 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"`,
);
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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