我的问题是,第一个集合返回丢掉$sub1之前,它可以在字符串匹配中使用,所以脚本不会继续。我试图包括脚本的其余部分在第一集返回,它的工作原理,但…我向用户获取多条消息,而用于其他2条消息的通道返回。
无论如何要修复它,这样它就不会向用户和通道发送多个消息因为"foreach sub"中的for每个子函数为PM用户和PM通道生成一行,可以是1或2条消息到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 {
}
}
}
很难解释我到底想要完成什么。
最后我想达到的结果是……
- 从正则表达式 设置$订阅
- 列出DB内的所有sub
- 对于以下Match,将DB中子目录中的所有%转换为*
- 尝试将订阅匹配到$subscription
- 如果匹配则继续执行下一个SELECT
- 从DB中选择所有的"USERS",其中sub类似于%sub%
- 然后向每个用户发送与选择 匹配的消息。
- Last set return统计匹配选择并向通道发送消息的用户数量
使用Donal建议的解决方案后。除了一个小问题,一切似乎都很正常。代码的[string match -nocase [get_subscription $SQL(conn)]* $subscription]部分没有将每个都保存为要检查的变量。它使用最先出现的行,并停止而不是完成列表,以查看是否有更多匹配。有些条目以不同的方式添加,但应该提供相同的结果。例如,一些条目被添加为The.TV.Show。S01或%TV%Show%S01这意味着它应该匹配这两个部分,并获得准确的计数和用户。
这可能很难,因为你在一件衣服里装了太多东西。试着把代码分解成更小的部分来完成一个明确定义的任务。这被称为重构,它是使你的代码易于理解的重要组成部分。
下面是一些建议的重构:
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
}
}
这能解决你的问题吗?我不知道,但它应该给你一个更好的开始基础。