私の問題は、最初のセットの戻り値が $sub1 をドロップしてから、文字列の一致で使用できるようになるため、スクリプトが続行されないことです。最初のセット リターン内に残りのスクリプトを含めようとしましたが、機能しますが...ユーザーに複数のメッセージが表示され、他の 2 セット リターンのチャネルが返されます。
とにかく、「foreach サブ」の for each サブが pm ユーザーと pm チャネルの行を生成しているため、ユーザーとチャネルに複数のメッセージを送信しないように修正します。データベース内の一致数に応じて、200 件のメッセージ。
bind pubm - * bind_pubm
proc bind_pubm {nick uhost handle channel text} {
global SQL; sql:start
set regexp {^!sub (.*) *$}
if {[regexp -nocase -- $regexp $text -> subscription]} {
if {[string match -nocase *HDTV* $subscription] || [string match -nocase *S??E??* $subscription]} {
set return [mysqlsel $SQL(conn) "select sub from DB_Subs where category='TV'" -list]
foreach {sub} $return { ; # Lists all the subs in the DB for matching.
regsub -all -- {%} $sub "*" sub1 ; # Replaces % in SQL to * for the String match later.
}
if {[string match -nocase $sub1* $subscription]} { ; # Matches if a sub in the previous list matches the regexp subscription fromthe beginging of proc.
set return [mysqlsel $SQL(conn) "select user from DB_Subs where sub LIKE '[mysqlescape $sub]%' AND category='TV'" -list]
foreach line $return {
foreach {user} $line break
if {[onchan $user $beta]} { ; # If the user is on the channel it PM each user.
putnow "PRIVMSG $nick : Subscription found matching your request."
} else {
}
}
set return [mysqlsel $SQL(conn) "select count(DISTINCT user) from DB_Subs where sub LIKE '[mysqlescape $sub]%' AND category='TV'" -flatlist] ; # Counts the users for the Channel message.
foreach {users} $return break
putnow "PRIVMSG $beta :SUBSCRIPTION: $users Users With Subscriptions for $subscription"
} else {
}
} else {
}
}
}
正確に何を達成しようとしているのかを説明するのは難しいです。
結局、私が到達しようとしている結果は...
- 正規表現から $subscription を設定します
- DB 内のすべてのサブを一覧表示する
- DB のサブ内のすべての % を次の Match の * に変換します
- サブを $subscription に一致させてみてください
- 一致する場合は、次の SELECT に進みます
- サブが %sub% のような DB からすべての「USERS」を選択します
- 次に、選択に一致するメッセージを各ユーザーに送信します
- 最後のセットの戻り値は、選択に一致するユーザーの数をカウントし、チャネルにメッセージを送信します
ドナルが提案した解決策を使用した後。小さな問題が 1 つありますが、すべてが正常に機能しているようです。コードの [string match -nocase [get_subscription $SQL(conn)]* $subscription] 部分は、チェック対象の変数としてそれぞれを保存していません。最初に表示された行が代わりに使用され、リストを終了する代わりに停止して、さらに一致するものがあるかどうかを確認します。一部のエントリは異なる方法で追加されますが、同じ結果が得られるはずです。たとえば、一部のエントリは The.TV.Show.S01 または The%TV%Show%S01 として追加されます。これは、両方のセクションに一致し、正確なカウントとユーザーを取得する必要があることを意味します。