JTech Tools:JTech Forumsを支える1つのプラグイン(whispers、REQ-PM、Dumbcourse、Telegramブリッジ、テーマ)

:information_source: 概要 JTech Forums のすべては、Discourse 上で動作する 1 つのプラグインに集約されています。モデレーターツール、特定ユーザーへのウィスパー、REQ-PM、Dumbcourse、Telegram ブリッジ、販売スレッドのリスト表示、スマート検索、ポップアップ、そして私たちのテーマ全体です。各機能には個別のオン/オフスイッチがあります。
:hammer_and_wrench: リポジトリ GitHub - TripleU613/JtechTools: The plugin behind JTech Forums: moderator tools and whispers, REQ-PM, Dumbcourse for flip phones, a Telegram bridge, sale-thread listings, smart search, pop-ups and the JTech theme. Every module has its own switch. · GitHub
:question: インストールガイド Discourse にプラグインをインストールする方法

皆さん、こんにちは。

この中には、すでに Meta で断片的に共有されていたものもあります。Dumbcourse は 2 月に独自のトピックを持ち、@ars18 が 4 月に Mini-mod を投稿し、8 月には Dumbcourse スレッドで長文の返信をして、1 つのプラグインに詰め込んだ他のすべての機能をリストアップしました。その内容は 38 番目の投稿に埋もれるのはもったいないので、ここに正式なバージョンを掲載します。今回は多くの画像付きです。

JTech はテクノロジーフォーラムで、主にスマートフォン、折りたたみ式電話、フィルター、ROM について扱っています。多くのメンバーが意図的にキーパッド付き電話を使用しています。ここにあるすべてのツールは、私たちのフォーラム自身がそれを必要としたために存在しています。

「なぜ 1 つのプラグインなのですか?」

merefield さんが Dumbcourse スレッドでこの質問をしており、それは正当な疑問なので、先に回答を述べます。

  • 各モジュールには独自のオン/オフスイッチがあります。 いくつかは初期状態でオンになっています(Dumbcourse、REQ-PM、モデレーターツール)、他のものは待機状態です(Mini-mod、スマート検索、Disteleplus、Another SMTP)。また、「オン」になっているもののいくつかは、カテゴリやトピックを指定するまで何もしません。インストール後にタブを確認し、不要なものをオフにしてください。
  • jtech_enabled は一度にすべてを停止します。 権限の変更やバックグラウンドジョブも含みます。@satonotdead さん、Mini-mod のトピックでバンドルをオフにしても Mini-mod が動き続けた理由を尋ねていましたが、その通りでした。コアにパッチを当てたコードとスケジュールされたジョブは、自身のスイッチのみを確認していたためです。これは 9 月 24 日以降修正されています。現在、すべてのモジュールがマスタースイッチも確認します。
  • 機能をオフにしても、何も漏洩しません。 例えば、ウィスパーをオフにしても、既存のウィスパーが公開されることはありません。
  • 各モジュールは内部で独立して管理されています: sub_plugins/ 内の独自のファイル、独自の設定タブ、独自のドキュメントページ。1 つの機能のみが必要であれば、フォークして切り出すことも可能です。従来のスタンドアロンの Mini-mod リポジトリはアーカイブされており、現在はここでメンテナンスされています。

中身

それぞれが折りたたまれているので、興味があるものを開いてください。すべての画像は、特に記載がない限り、私たちのフォーラムからの実際のスクリーンショットです。プライベートな情報(スタッフチャット、連絡先詳細、モデレーターメモ)はぼかしてあります。

Dumbcourse: 折りたたみ式電話でのフォーラム全体

/dumb でフォーラム全体を提供し、折りたたみ式電話、KaiOS、および通常のサイトを動作できない古い Android ブラウザ向けです。電話のアプリのように D-pad とキーパッドで操作でき、タッチやマウスでも動作します。

  • 閲覧: 最新、新規、未読、トップ、ホット、カテゴリ、タグ。↑↓ で読み進める(長い投稿はフォーカスが移動する前にスクロールします)、←→ でタブを切り替え、未読トピックは最初の未読投稿から開き、Back ボタンで正確に元の場所に戻れます。
  • 操作: 投稿で OK を押すと、いいね、リアクション、返信、引用、ブックマーク、編集、フラグ、リンクコピー、投稿内のすべてのリンク、ネタバレ、画像が開きます。メンション、絵文字、アップロード、プレビュー、オプションのスペルチェック(LanguageTool)を備えた全画面コンポーザーがあります。
  • キー: * メニュー、# 検索、0 ヘルプ、3 返信、5 いいね、2/8 ページアップ/ダウン。ソフトキーの名称が独特な電話は、設定でキーを割り当て直すことができます。
  • キーパッドでパスワードを入力せずにログイン: すでにログインしているデバイスから電話を承認するか、メールで送られたリンクやコードを使用します。ソーシャルログインと 2FA も動作します。
  • 古いブラウザは自動的にそれを見つけます。 フルフォーラムを動作できないブラウザは、Dumbcourse の対応ページにリダイレクトされます(メール内のリンクからも)。検索エンジンはリダイレクトされません。
  • 純粋な ES5 で、CI が Chrome 30、Firefox 30、Android 4.4 で引き続き動作することをチェックします。

前回名前が挙がったので:パスは設定(dumbcourse_base_path)なので、/simple や /lite に変更するのは 1 つの設定変更だけです。

また、キーパッド付き電話向けに Dumbcourse をラップし、プッシュ通知を備えた Android アプリ もあります。私たちのフォーラム用に設定されていますが、自分のものを作るためのコードはそこにあります。メンバーはアプリスレッド(450 以上の返信)と最近の大規模なリフレッシュでそれを酷使してきました。

モデレーターツール: 特定ユーザーへのウィスパー、プライベートメモ、スタッフアラート


中央行のウィスパーとメモはドキュメントからのもの(架空のユーザー)です。残りは実際の UI です。

特定の人々へのウィスパー。 何年もの間、Meta でこの機能が求められてきました(投稿者にウィスパーを表示させる、スタッフ以外のグループへのウィスパー)。トピック内で、少数のユーザー、グループ、またはバッジを持つ全員にのみ返信できます。スタッフ、投稿者、およびその人々だけがそれを見ることができます。他のどこにも表示されません:検索、アクティビティ、メール、通知、リンクプレビュー、RSS、Dumbcourse、Telegram ブリッジには表示されません。ウィスパーへの返信は自動的に同じ人々の間でプライベートに保たれ、ウィスパーは他の誰かのトピックを上げません。スタッフは既存の投稿をウィスパーに変えたり、元に戻したりでき、すべての変更はスタッフログに記録されます。

プライベートメモ。 トピックへのスタッフ専用のメモで、返信スレッドと「確認済み」行があります。新しいメモはベルとユーザーメニューのシールドタブに表示されますが、そのトピックを実際に閲覧できるスタッフのみです。

スタッフアラート。 他のスタッフが投稿を削除、キューイングされた投稿を承認または却下、またはユーザーやフラグにメモを追加したときに通知を受け取ります。各タイプには独自のスイッチがあります。

チェックリストとトピックツール。 初回投稿前に新メンバーがチェックするチェックリスト(どのバージョンが誰によって承認されたかのログ付き)、特定のユーザーを対象にしたチェックリスト、または 1 つのトピックに添付されたチェックリスト、トピック下のフッターメッセージ、下部にコピーされた固定投稿、単一トピックの返信承認、カテゴリごとの「投稿前に」メモ、バッジを持つ全員を PM に追加するためのバッジピッカー。

これらすべてのルール:モデレーターはすべてを見ません。ツールはコアが表示しない PM や制限カテゴリをモデレーターに表示せず、アラートは対象を開けるスタッフのみ宛てに送信されます。

REQ-PM: プライベートメッセージではなく連絡先詳細

私たちのフォーラムには意図的にプライベートメッセージがありません。では、2 人のメンバーはどうやって連絡を取り合うのか? 互いに連絡先詳細を求めます。(私たちのローンチスレッドで、メンバーがそれを受け入れた様子を見ることができます。)

  • ユーザーカードで REQ-PM を押します。希望するもの(電話、WhatsApp、メール、Telegram、Signal など)にチェックを入れて送信します。テキストボックスがないため、メッセージの裏口になることはありません。
  • 相手は、あなたが受け取る詳細を正確にチェックします。どちらの側も、いつでも静かに共有したものを取り消すことができます。拒否も静かです:尋ねた人は「待機中」を見て、その後「期限切れ」を見ます。
  • /reqpm は、あなたのリクエスト、連絡先(通話/テキスト/チャットボタン付き)、あなたのカード、および誰と共有したかを表示します。
  • プライバシー: 値は静止時に暗号化され(AES-256-GCM)、所有者と所有者が選んだ人々のみが返されます。管理画面はなく、エンドポイントは API キーとなりすましを拒否します。
リスト形式: 整然と保たれる販売スレッド


私たちの「電話とコンピュータ販売」スレッドからの実際のリスト。

私たちは 1 つの大きな「電話とコンピュータ販売」スレッドを持っており、以前は「まだありますか?」「DM してください」の混在でした。現在、選択したトピックでは、すべての投稿がスレッドの形式に従ったリストでなければならず、そうでない場合は保存前に(理由を付けて)拒否されます。

  • メンバーは返信の代わりに リスト作成 ボタンを受け取ります。これは各セクション(アイテム、数量、状態、仕様、受取または配送)のボックス、状態を選択するための選択肢、画像とメモのための通常のエディタを含むフォームを開きます。
  • リストは上記のようなカードとして表示されます。売り手(またはスタッフ)は 1 つを販売済みとしてマークでき、その後それはフェードアウトして取り消し線が引かれます。
  • 他のサイトへのリンクは不可。電話番号やメールは問題ありませんが、買い手は返信する代わりに売り手の REQ-PM ボタンを使用します。
  • スタッフは免除され、古い投稿はそのままにされます。
Disteleplus: Telegram と双方向にブリッジされたスタッフチャット

これは大きなものになりました。私たちのスタッフ全員が(または望んで)WhatsApp を持っていたわけではなく、Telegram を持っていたわけでもありません。そこで:Discourse 内の 1 ルームのチャットを、Telegram グループと双方向にミラーリングします。

  • Discourse 内: 返信、編集、リアクション、音声メモ、投票、ファイル、メンション、検索、リンクプレビュー、入力インジケーターを備えたドロワーまたは全ページ。メッセージテキストはデータベース内で暗号化されます。公式の Chat プラグインは必要ありません。
  • Telegram 内: リンクした人はフォーラムアカウントとして投稿し、他の人は Telegram 名で表示されます。オプションで、新しいフォーラム投稿をグループに告知したり、レビューキューを 承認/却下 ボタンがスタッフにとってそこで動作する Reports トピックにミラーリングしたりできます。
  • セットアップは約 5 分かかります:@BotFather でボットを作成し、グループに管理者として追加し、トークンを貼り付け、Webhook を登録します。

Discourse Chat チャンネルを Telegram にブリッジしたい場合は、代わりに Discourse-Telegram chat bridge または Discourse Chat Bridge (Telegram) を参照してください。私たちのものは Chat を使わない 1 つのスタッフルームです。

JTech テーマ(プラグインに同梱)

私たちのフォーラム独自のテーマが、今やプラグインに同梱されています。再構築でインストールされ、最新に保たれますが、デフォルトには決して設定されません。Customize → Themes で自分でオンにしてください。

黒と白で、ヘアーラインの境界線、角丸、Geist フォント。ライトとダークは正確な反対色で、OLED の黒がきついと感じる人のための柔らかい JTech Dim もあります。

  • トピックカードはテーブル行の代わりに、タイトル横に最初の画像、リストから離れずにトピックを読むための クイックルック。
  • ⌘K / Ctrl+K でページ、カテゴリ、トピック、人物にジャンプするコマンドメニュー、各コマンドの横にキーボードショートカットがリストされます。
  • フロントページのバナーには、回転し、マウスを追いかけ、デバイスにモーション軽減を要求する人にとっては静止する点の惑星があります。さらに、再設計されたヘッダー、サイドバー、プロフィール、ユーザーカード、ログインページ、概要ページ。
  • 約 12 のテーマコンポーネントを置き換えますが、それぞれが設定になります:リーダーモード、ガイドのための目次、印刷/PDF ボタン、Share 内の QR コード、コンポーザーからの音声メッセージ、投稿バッジ、Markdown としてコピーボタン、返信フィルター、選択テキストからの検索、クローズトピックの返信警告など。私たちのフォーラムは現在、テーマコンポーネントゼロで動作しています。
  • アクセシビリティには馬鹿げたほどの時間を費やしました:3 つのパレットすべてでグレーのテキストの WCAG AA コントラスト、すべてのコントロールで実際に見えるフォーカスリング、スマートフォンでの大きなタップターゲット、Windows の高コントラストモード、右から左への言語、幅 320px のスマートフォン。
小さなものたち: Mini-mod、Dislike、スマート検索、ポップアップ、Another SMTP、翻訳


デスクトップのポップアップ(ドキュメントから、架空のユーザー)。

  • Mini-mod. 1 つのカテゴリをグループを通じてモデレートする人々のためのいくつかの追加権限:カテゴリの作成と編集、トピックの移動、タグ。各権限には独自のスイッチがあり、その人がすでに閲覧できる範囲を超えていません。また、権限を取り除くこともできます(例:クローズトピックの再オープン)。@ars18 さんの元のトピックにはさらに詳しくあり、ここがそれが回答するタイプのリクエストです。
  • Dislike. 選択したカテゴリでは、いいねのカウントが停止します:通知なし、「受信いいね」履歴なし、リーダーボードにカウントされません。ボタンを完全に非表示にすることも、特定のグループのみがいいねできるようにすることもできます。
  • スマート検索。 検索がほとんど何も見つけなかった場合、同義語で静かに再試行するため、「k8s」は「kubernetes」を見つけ、「js」は「javascript」を見つけます。WordNet と小さな技術用語リストを使用し、API キーなしでプロセス内で実行され、すべてのフィルターと権限を保持し、問題があれば通常の検索にフォールバックします。
  • デスクトップポップアップ。 通知が来るとコーナーに小さなカードが表示されます。各メンバーがオプトインし、おやすみモード中は静かで、キーボードとスクリーンリーダーで動作します。
  • Another SMTP. app.yml のものとは異なるメールサーバー経由でフォーラムメールを送信し、管理画面から設定します。
  • 翻訳の調整。 古い discourse-translator プラグインと Google を使用しているサイトのために:そのリクエストを独自のプロキシに向けます。

インストール

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/TripleU613/JtechTools.git jtech-tools

フォルダ名 jtech-tools は小文字のままにしてください。Discourse はそこからスタイルシートの URL を構築します。

その後、再構築し、Admin → Plugins → Jtech Tools に移動します。モジュールごとに 1 つのタブがあり、各モジュールのドキュメントページには最初に設定すべきことが記載されています。

Discourse 2026.8 以降で main を追跡し、.discourse-compatibility が古いバージョンを固定します。CHANGELOG に変更点と、更新後に確認すべき事項が記載されています。

正直に話すと

私たちはフォーラムの管理チームであり、Discourse のショップではありません。この中のかなりの部分は AI の助けを借りて構築されました。それを共有して問題ないと感じるのは、ガードレールがあるためです:リポジトリ内のルール(権限が最優先、コアが許可する範囲を超えない、コアがすでにやっていることはしない)、すべての PR で実行される 119 のスペックファイルにわたる約 1,700 のテスト、そしてその大部分が私たちのフォーラムで毎日動作していること。まだバグや奇妙なエッジケースがあるでしょう。見つけたら教えてください。

Issues と PR は GitHub で大歓迎です。セキュリティの問題は SECURITY.md 経由で非公開でお願いします。

私と一緒にこの大部分を構築してくれた @ars18 さんと Shalom Karr さん、バグを報告し、未完成のものを試してくれた JTech の全員、そして Dumbcourse と Mini-mod スレッドで質問を通じてそれを良くしてくれた人々に感謝します。

楽しんでください :lion:

「いいね!」 5