3

私の問題は、最初のセットの戻り値が $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 として追加されます。これは、両方のセクションに一致し、正確なカウントとユーザーを取得する必要があることを意味します。

4

1 に答える 1

1

ワンピースが多すぎるので難しいかもしれません。明確に定義されたタスクを実行する小さな部分にコードを分割してみてください。これはリファクタリングと呼ばれ、コードを理解しやすくするための重要な部分です。

ここにいくつかの提案されたリファクタリングがあります:

proc get_subscription {conn} {
    set return [mysqlsel $conn "select sub from DB_Subs where category='TV'" -list] 
    foreach {sub} $return {
        regsub -all -- {%} $sub "*" sub1
    }
    return $sub1
}

proc notify_subscription_user {conn nick sub beta} {
    set return [mysqlsel $conn "select user from DB_Subs where sub LIKE '[mysqlescape $sub]%' AND category='TV'" -list]
    foreach line $return {
        lassign $line user
        if {[onchan $user $beta]} {
            putnow "PRIVMSG $nick : Subscription found matching your request."
        }
    }
}

proc send_subscription_message {conn sub beta subscription_text} {
    set return [mysqlsel $conn "select count(DISTINCT user) from DB_Subs where sub LIKE '[mysqlescape $sub]%' AND category='TV'" -flatlist]
    lassign $return users
    putnow "PRIVMSG $beta :SUBSCRIPTION: $users Users With Subscriptions for $subscription_text"
}

これらを使用して、残りのコードを次のように書き直すことができます(空のelse 句を削除し、式を行に分割し、ネストされたifテストを組み合わせます。すべての基本的なもの)。

bind pubm - * bind_pubm
proc bind_pubm {nick uhost handle channel text} {
    global SQL; sql:start

    if {
        [regexp -nocase -- {^!sub (.*) *$} $text -> subscription]
        && ([string match -nocase *HDTV* $subscription]
            || [string match -nocase *S??E??* $subscription])
        && [string match -nocase [get_subscription $SQL(conn)]* $subscription]
    } then {
        notify_subscription_user $SQL(conn) $nick $sub $beta
        send_subscription_message $SQL(conn) $sub $beta $subscription
    }
}

これで問題は解決しますか?わかりませんが、それはあなたに出発点としてはるかに良い基盤を与えるはずです。

于 2013-03-05T09:47:02.540 に答える