ご指摘ありがとうございます、@NateDhaliwal
いいえ、URLをスニッフィングして特定の文字列を検索し、その文字列が見つかった場合に、いくつかのテンプレートのいずれかでコンポーザーを事前入力するだけです。
Docusプラグインはその機能の1つとしてその文字列をURLに入れますが、このコンポーネントは誰かが使用したい任意の文字列や配信メカニズムで機能するため、単独で動作します。その旨をREADMEに追記します。
例えば、「/tag/introductions」を検索するように指示すると、タグテンプレートコンポーネントになります。あるいは、私が使用しているように、タグの交差部分にそのテンプレートを挿入するために使用することもできます。例:tags/intersection/introductions/webdevs
検索する文字列を管理セクションに移動して、コードを掘り下げなくても他の人が変更して使用しやすくします。
正直なところ、ここ数日バグに悩まされていて(残りのわずかな髪の毛を)引き抜いており、まだ共有すべきではなかったかもしれません。文字列が見つかると、必ずテンプレートが挿入されます。
文字列が見つかるたびに挿入したい場合もあれば、他のスレッドがまだ存在しない場合にのみ挿入したい場合もあれば、特定のユーザーがその場所でまだスレッドを作成していない場合にのみ挿入したい場合もあります。
現在の状況:
イニシャライザはURL内のタグ/文字列を監視し、一致するものが見つかるとDiscourseで自動的にテンプレートを開きます。これは、常にテンプレートを開きたい場合にはうまく機能しますが、「トピックが既に存在する場合は開かない」や「このユーザーが既に投稿している場合は開かない」といった条件が必要な場合にはうまくいかなくなります。
試したこと:
settings.auto_open_check_user_onlyフラグを導入しました。これがオンの場合、コードはtags:tag1+tag2 @usernameを検索し、オフの場合、tags:tag1+tag2のみ検索します。目標は、「任意のトピックが存在する」場合と「このユーザーのトピックが存在する」場合を区別することでした。- Discourseの自動保存との競合を避けるため、ドラフト保存を再度有効にする前に500ミリ秒の遅延を追加しました。
- 自動オープンがいつトリガーされるかを確認できるように、基本的な情報(トリガーID、テンプレート名)のロギングを開始しました。
問題の原因と思われる点:
- Discourseの検索APIは、検索インデックスが更新される前に結果を返すため、ユーザーが投稿した直後でもシステムは「トピックは存在しない」と考え続けます。
@usernameでフィルタリングしても、ユーザー名が正確に一致しないか、タグがテンプレート設定と一致しない場合、役に立ちません。- Discourseの保留中のドラフトタイマーをキャンセルしないため、500ミリ秒間保存をブロックしても、キューに入れられた保存は後で実行され、ドラフト/コンポーザーが元に戻ってしまいます。
現在試みていること:
deleteDraftを呼び出した後、古いドラフトが再表示されないように、直ちにDiscourseの_saveDraftのデバウンスをキャンセルします。- 検索インデックスの遅延をカバーするために、「このタグでトピックを既に作成した」ことを記憶する短命のキャッシュを作成します。
- 管理セクションで選択できる3つのモードを作成します。
always
タグが一致するたびにテンプレートを開きます。検索もチェックも行わず、単にコンポーザーを開きます。
ifNoTopics
Discourseの検索を使用して、「これらのタグを持つトピックは既に存在しますか?」と尋ねます。
- はい → 開かない。
- いいえ → 開く。
「トピックが1つだけ存在すべき」状況に最適です。
ifUserHasNoTopic
「この特定のユーザーは既にこれらのタグを持つトピックを作成しましたか?」を検索します。
- はい → 開かない。
- いいえ → 開く。
各ユーザーが独自の個人スレッドを持つべき場合に便利です。
これらの設定を作成する方法について、何か提案があればぜひお聞かせください。