オープンソース · AGPL-3.0

あなたの Discord サーバーに、応募・BAN 異議申し立て・チケットを。

Appealy は、スタッフ募集の応募、BAN 異議申し立て、チケットに対応する オープンソースの Discord ボットです。Web ダッシュボードが付属します。メンバーはパネルの ボタンか /apply からフォームに回答します。スタッフはキューに並んだ応募を 審査し、結果を選ぶだけ。ロールの付与も、DM も、BAN 解除も、そのワンクリックで実行されます。

多くのボットの BAN メッセージは「この決定は最終的なものです」で終わります。上のマークが開いた扉なのは、Appealy ではどの BAN にも戻る道を用意できるからです。

Discord の認証済みボットがスラッシュコマンドに返信している画面。英語で「You are banned from using the bot. This decision is final and cannot be appealed.」と表示されている。
Discord の認証済みボットが実際に送った BAN メッセージです。言い換えではなく、そのままの引用です。
この考え方は brand/README.md に、採用されなかった 3 つの案と一緒にまとめてあります。

ここが違います

このカテゴリの Discord ボットの多くがやっていない、5 つのこと。

これらを先に挙げるのは、聞こえがいいからではなく、本当に違う点だからです。どれも リポジトリで確認できます。

  • 完全にオープンソース

    ゲートウェイボット、API、ダッシュボード、Terraform、そして請求額を決める料金計算まで。 ライセンスは AGPL-3.0 です。あなたの上限を適用しているコードそのものを読めます。

  • 無料でセルフホストできます

    ライセンスキーも機能制限もありません。.env.example には DEPLOYMENT_MODE=self が入っています。課金は無効、決済情報は一切 読み込まれず、上限はあなたのハードウェア上の CAP_* の値で決まります。

  • 全機能をすべてのティアで

    有料プランが上げるのは 9 つの処理上限です。違いはそれだけ。ドロップダウン形式のパネル、 カスタム審査結果、マネージャーへの権限委任、BAN 異議申し立て、トランスクリプト — すべて無料ティアでも使えます。

  • 完全なエクスポート、囲い込みなし

    /export は、そのサーバーのフォーム、質問、パネル、応募、チケット、 ギブアウェイ、設定、委任をすべて含む JSON ファイルを 1 つ書き出します。セルフホスト 環境にインポートして、そのまま離れられます。

  • 無制限ティアはどこにもありません

    自分で設定するものも含め、すべての上限にハードリミットがあります。上限のない設定は 最悪ケースのコストを見積もる術を奪い、悪用のコストをゼロにします。だから設計として 用意していません。

  • テレメトリなし

    文章で約束するのではなく、shared/config/deployment.ts に TELEMETRY_ENABLED = false として書いてあります。変更すれば diff に 現れます。

機能の全体像

応募フォームだけのボットではありません。

18 個のスラッシュコマンドと、その挙動を設定するダッシュボード。以下のサブシステムは すべて無料ティアで使えます。

  • 応募とフォーム

    • 最大 5 つのフォームボタンを置けるパネル、または最大 25 項目のドロップダウン
    • /apply はパネルのボタンとまったく同じ処理を通るため、制限の挙動がずれません
    • テキスト質問と選択式質問。Discord のモーダルはテキスト入力しか扱えないため、選択式は 2 段階で尋ねます
    • 質問が 5 問を超えるフォームは複数のモーダルに分割されます。5 つというのは Discord の上限ですが、6 問目を捨てるのはその制限への受け入れられる対処ではありません
    • 質問ごとの任意の正規表現チェックと、最小・最大文字数の指定
    • ロール制限、クールダウン、ユーザーごとの提出回数制限
    • まだチャンネルが見えない人のための DM 応募
  • スタッフ審査

    • 回答、応募者、メンション先に指定したロールをまとめた審査メッセージ
    • カスタム審査結果 —「研修スタッフとして承認」「モデレーターとして承認」など、それぞれに固有のロール、メッセージ、ログチャンネルを設定できます
    • 結果ごとの最低スタッフレベル。審査者は自分の最上位ロールと同等以上のロールを付与できません
    • 却下理由。却下時のロール付与と剥奪は、承認時の処理とは別に設定します
    • 審査前に応募者がサーバーを抜けた場合の自動却下。すでにいない人でキューが埋まりません
    • マネージャーへの委任:管理者権限を渡さずに、審査と管理だけを任せられます
  • 異議申し立て

    • BAN・タイムアウト・制限ロールの付与と同時に、異議申し立てボタンを DM で送信
    • 異議を承認すると、自動で元に戻せます(BAN 解除、タイムアウト解除、ロールの削除)
    • 異議申し立てフォームは必ず DM で配信されます。BAN やタイムアウト中のメンバーはパネルにも /apply にも届かないためです
    • 設定ページには、有効にしても何も起きなくなるパターンをすべて明記しています
  • チケット

    • プライベートチャンネル、プライベートスレッド、公開スレッド — サーバー単位ではなく、チケット種別ごとに選べます
    • 担当ボタンとクローズボタン。クローズ時にトランスクリプトをチャンネルへ投稿することもできます
    • クローズ後、開設者に 1〜5 段階の評価を DM で尋ねる任意機能
    • 開設者が退出したときの挙動を設定可能:何もしない、クローズする、通知する
  • ギブアウェイ

    • リアクションではなく、ボタンで参加
    • フォームと同じ形のロール制限に加えて、ロールごとの追加エントリー(任意)
    • 終了時刻の予約
    • 当選済みの人を除外した再抽選
  • 投票

    • /poll は作成してそのまま投稿します。既定では Discord 標準の投票機能を使うため、埋め込みで似せたものではなく、本物の投票ボタン、リアルタイムのカウントダウン、結果表示が使えます
    • 締め切りを尋ねられたら、チャンネルでそのまま答えます:1h 20m、10 hours 50 minutes、july 10 3pm
    • タイムゾーンは普段の言い方のままで構いません — 3pm EST、3pm UTC+5:30、3pm india、3pm tokyo、3pm Asia/Kolkata — サマータイムは今日ではなく、その投票が実際に締め切られる日付で判定されます
    • 2 か所を指しうる表記は、推測せずに拒否します。IST はインド、アイルランド、イスラエルのいずれでもありえますし、4 時間早く締め切られる投票は質問されるより厄介です。タイムゾーンを書かなければ UTC として読み、いずれの場合も投稿前にあなたのタイムゾーンで読み上げて確認します
    • Discord の投票も入力した時刻ちょうど(分単位)に締め切られます。engine: Legacy embed を選べば従来の埋め込みのまま、SQL で集計できる結果を残せます(Discord の投票は結果を取り出せません)
    • ダッシュボードから、投稿と締め切りを後の時刻に予約できます
    • 選択肢は最大 9 個。複数選択も任意で有効にできます
  • 認証とウェルカム

    • ボタン 1 つの認証、またはコードを入力させるチャレンジ
    • 参加時に付与して認証時に外す「未認証ロール」(任意)。最後まで進まないメンバーを自動キックするタイマーも設定できます
    • ウェルカム機能:参加メッセージ、参加時の DM、自動ロール付与、退出メッセージ
    • 自分で付け外しできるロールのためのロールメニュー
  • アンチレイド

    • 自分で決めたしきい値と時間枠による、参加速度の検知
    • スタッフへの通知、またはロックダウン中の参加制限
    • さかのぼっての処理も、一斉 BAN も行いません。 公開招待が急に広まっただけの誤検知は、本物のレイドに対して控えめすぎた場合よりも大きな被害を生みます
  • AutoMod

    • Discord 公式の AutoMod を、スマホから設定。 Discord のアプリでは、モバイルから AutoMod のルールを変更できません。ダッシュボードならできます
    • ワードリスト、Discord が用意する定番の禁止ワード、スパム、メンションスパム、名前に含まれる禁止ワード。Discord のデスクトップ版の設定でできることは、すべてできます
    • 制限は Discord 自身のものだけです。ワードリストは 6 つまで、それぞれ最大 1,000 語。どのティアでも同じです
    • メンバーをタイムアウトするルールは、そのままタイムアウトの異議申し立てにつながります
    • ルールは Discord 側にあるため、Appealy が止まっていても動き続けます。必要な「サーバー管理」権限は、この機能を使い始めるときにだけ求めます
  • スタッフ用ユーティリティ

    • クイックレスポンス:カテゴリ分けして保存できる定型返信
    • 固定メッセージ:流れの速いチャンネルの一番下に、1 つのメッセージを保ち続けます
    • /reset-cooldown、/forms、/botstats
  • データの持ち出し

    • /export — 完全な JSON ダンプ。委任された管理者が実行できないよう、意図的にオーナー限定にしています
    • /import-appealy — 同じ設定を別のサーバーに立ち上げます。チャンネルとロールの参照はすべて振り直され、解決できなかったものはレポートで返ります
    • /import-appy — Appy から応募履歴を引き継ぎます
    • /export_applications — 条件に一致した応募の CSV を、Discord の添付ファイルとして出力します

これだけは単独で書いておきます。 インポート時にロール制限が失われた フォームは、無効の状態でインポートされます。新しいサーバーでは意味をなさないロールを 参照していたスタッフ募集フォームは、そのままでは「壊れている」のではなく 誰でも応募できる状態で届いてしまうからです。開いたままのスタッフ募集は、 フォームが無いことよりも悪い結果です。

使い始める

3 ステップです。

  1. ボットを追加する

    招待は 1 回、権限は 10 個、どれも必要なものです。審査結果でロールを付与するための ロール権限、チケットのためのチャンネル権限、異議申し立てによる BAN 解除と認証の タイムアウトのための BAN・キック権限、そして承認された異議に応じてタイムアウトを 解除するための「メンバーをタイムアウト」。1 つでも欠けた招待は、何も言わずに動かない 機能を生みます。

  2. フォームを作り、パネルを公開する

    ダッシュボードから、またはサーバー内の /panel create から。質問、 制限、結果ごとに付与するロール、スタッフが審査するチャンネルを設定します。

  3. 審査する

    応募は審査チャンネルと、ダッシュボードのキューに届きます。結果を選べば、ロール、 DM、ログ、BAN 解除がそれに従って実行されます。

料金

支払うのは処理量か、ホスティングか。機能に対してではありません。

独立した 2 つの軸があり、それぞれが加算されます。無料の処理量のまま専用インスタンスを 使うことも、共有ボットのまま有料の処理量ティアを使うこともでき、組み合わせは自由です。 セット割引はなく、その予定もありません。

  • 無料

    $0

    試用期間ではなく、ずっと無料

    • 1 日 100 件の応募
    • 1 日 50 件のチケット
    • 1 日 500 件のギブアウェイ参加
    • フォーム 5 個、パネル 5 個
    • 履歴 30 日
  • ティア1

    $60 /年

    月あたり $5.00 相当、年 1 回の請求

    • 1 日 500 件の応募
    • 1 日 250 件のチケット
    • 1 日 2,500 件のギブアウェイ参加
    • フォーム 50 個、パネル 50 個
    • 履歴 365 日
  • ティア2

    $180 /年

    月あたり $15.00 相当、年 1 回の請求

    • 1 日 2,000 件の応募
    • 1 日 1,000 件のチケット
    • 1 日 10,000 件のギブアウェイ参加
    • フォーム 100 個、パネル 100 個
    • 履歴 730 日
  • カスタム

    従量制

    チェックアウト前にその場で価格表示

    • 9 つの上限を自分で設定できます
    • 数値を変えるたびに、ダッシュボードが再計算します
    • 「お問い合わせください」の手順はありません
    • どの項目にも上限値があります

請求は年額のみです。月額の選択肢は、どこにも、意図的に用意していません。 カード決済の手数料はおおよそ 2.9% + 1 件あたり $0.30 で、この金額帯では固定の 30 セントが 重くのしかかります。月額 $5 のティアを毎月請求すると、年間の売上の約 9% が手数料に 消えます。同じティアを $60 の 1 回払いにすれば約 3% です。このサイトの月額表示は比較の ために年額から計算したもので、選べる請求サイクルではありません。

すべての上限、上限値、カスタムの単価はこちら →

セルフホスト

自分で動かせば、費用はかかりません。

出し惜しみはありません

セルフホストしたインスタンスは、同じ機能を備えた同じボットです。課金は無効、決済情報は 読み込まれず、上限はあなたの CAP_* の値で決まります。上げるのも自由です — あなたのハードウェアなのですから。

決済アカウントなしで起動します

以前はそこが詰まりどころでした。決済情報が無条件に必須だったため、オープンソースの プロジェクトをクローンしても、決済アカウントを求めて起動時に落ちていたのです。今は 違います。

Docker が動く場所ならどこでも

VPS でも、Raspberry Pi でも、ノート PC でも。./setup.sh が必要な ツールを確認し、手で入力すべきでない秘密鍵を生成し、Discord のポータルでの手順を 案内してコンテナを起動します。何度実行しても安全です。

よくある質問

実際に届く質問。

答えが「できません」になる場合も含めて、率直に書いています。製品の得意なことしか並んで いない FAQ は、疑問符を付けた広告です。

  • 自分でホストする必要はありますか?

    いいえ。Appealy はホスト型のボットです。ワンクリックでサーバーに追加し、 ダッシュボードから設定するだけで、インストールや運用は不要です。セルフホストは、データを 自分のマシンに置きたい人のための選択肢であって、必須ではありません。

  • 応募者は Discord から離れる必要がありますか?

    いいえ。すべてのフォームは外部サイトではなく Discord の中で回答します。サーバー内では Discord 標準のポップアップフォームで、DM では 1 問ずつ回答します。BAN 異議申し立ては 常に DM を使います。BAN されたユーザーはサーバーを見られなくなるためです。

  • 上限に達したらどうなりますか?

    その操作は拒否され、操作した人にはどの上限に達したのか、いつリセットされるのかが 伝えられます。何も削除されず、黙って捨てられることもありません — 1 日の上限を 超える応募は、いったん受け付けてから破棄するのではなく、最初から受け付けません。 応募できたと思っているのに実は届いていない人は、断られた人よりも不利益を被るからです。

  • ボットにはどの権限が必要ですか?

    付与するロールのための「ロールの管理」(制限ロールの異議申し立てでは削除にも使います)、 チケットのための「チャンネルの管理」、BAN 異議申し立てを使う場合のみ「メンバーをBAN」、 タイムアウトの異議申し立てを使う場合のみ「メンバーをタイムアウト」、ダッシュボードから AutoMod を管理する場合のみ「サーバー管理」(招待リンクには含まれず、AutoMod ページで 求めます)、それに通常の閲覧と送信です。Discord 自身のロール階層はそのまま適用されます。ボットは自分より上位のロールを付与できない ため、ダッシュボードはそれに当たるロールをすべての選択欄で示します。実際に必要に なった瞬間に失敗させることはしません。

  • 支払いをやめるとデータは失われますか?

    いいえ。無料ティアに下がると上限は下がりますが、フォーム、応募、チケットが削除される ことはありません。何かを削除する上限は履歴の保持期間だけで、それも保持期間を過ぎた 審査済みの応募に限られます。未処理の応募が消されることは決してありません — それは誰かのキューにある、進行中の作業だからです。

  • 別のサーバーへ、あるいは他のサービスへ移せますか?

    どちらもできます。/export がすべてを含む JSON ファイルを 1 つ書き出し、 インポーターが別の場所で再構築します — チャンネルとロールを振り直し、解決 できなかったものは報告します。安全に引き継げない設定は慎重な側に倒して失敗し、その旨を 伝えます。設定済みに見えて実は違う、という状態でインポートすることはありません。

  • 応募データは何かの学習に使われますか?

    いいえ。テレメトリも分析パイプラインもありません。この主張はここの文章ではなく shared/config/deployment.ts の定数として存在するため、変更すれば diff に 現れます。それでも信用しきれない場合、セルフホストモードは私たちと一切通信しません。

  • まだ無いものは何ですか?

    はっきり書いておきます。モバイルアプリはなく、ボットとダッシュボードは英語のみで 他言語へのローカライズはまだなく、ホスティングサービスに SLA もありません。セルフ ホストにサポート契約もありません — あるのはソースコード、セットアップガイド、 そして issue トラッカーです。

サポート

どこで聞けるのか、何を期待してよいのか。

これはサポート窓口を持つ企業ではなく、小さなプロジェクトです。誰も待機していない応答 時間をほのめかすより、そう書いておくほうが誠実です。

  • Discord で聞く

    コミュニティサーバーが、たいていの質問には 一番早い窓口です。目の前の現象がバグなのか設定なのか分からないときにも適しています。 同じボットを運用している人たちもいます。

  • 動かなくなった

    issue トラッカーに issue を立ててください。何をして、何が起きたか、特定のサーバーでだけ起きるならその サーバー ID を書いてください — この 3 つがあるかどうかが、修正になるか会話で 終わるかの分かれ目です。

  • こちらの問題か、障害か

    ステータスページはアプリ自身の サーバーとは別に Cloudflare 上でホストされているため、アプリが落ちていても応答します。 まずそこを見てください。Discord サーバーの中からでは、障害と設定ミスは見分けがつきません。

  • 自分でセットアップする

    SETUP.md がホスティング版の手順を、 SELF_HOSTING.md がスタンドアロンの手順を、どちらのモードになるかを決める環境変数も含めて説明しています。 セットアップに関する質問のほとんどは、この 2 つのファイルのどちらかに答えがあります。

  • セキュリティの問題

    悪用できる問題については、公開の issue を立てないでください。代わりに GitHub の 非公開の脆弱性報告を 使ってください。詳細を公開せずに、メンテナーに届きます。

  • 請求と支払い

    決済は、記録上の販売者である Creem が処理します。そのため返金や支払い方法の問題は、 注文番号を添えて Creem のサポートへお願いします。プランで何ができるようになるかは 別の話で — そちらは issue トラッカー、あるいは pricing.ts を 直接読めば分かります。

  • プラットフォームから BAN された

    それには専用の窓口があり、issue トラッカーは通りません。サインインすると、BAN 画面に 理由とフォームが表示されます — これは人間が読みます。試行回数を使い切っても 閉じるのではなく一時停止し、「最終決定」と書かれることは決してありません。

有料のサポートティアはなく、作る予定もありません。処理上限を上げても回答が早くなることは ありません。サービスの中身がリポジトリで読める数値の集合である以上、それを売るのは奇妙な 話です。

サーバーに追加する。

無料ティアはカウントダウンではなく、上限の集合です。期限切れはなく、動かす前にカードを 求めることもありません。