BT.BadChan.tcl 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. #########################################################################
  2. ## BlackTools - The Ultimate Channel Control Script ##
  3. ## One TCL. One smart Eggdrop ##
  4. #########################################################################
  5. ########################### BADCHAN TCL #############################
  6. #########################################################################
  7. ## ##
  8. ## BlackTools : http://blacktools.tclscripts.net ##
  9. ## Bugs report : http://www.tclscripts.net/ ##
  10. ## GitHub page : https://github.com/tclscripts/BlackToolS-TCL ##
  11. ## Online Help : irc://irc.undernet.org/tcl-help ##
  12. ## #TCL-HELP / UnderNet ##
  13. ## You can ask in english or romanian ##
  14. ## ##
  15. #########################################################################
  16. proc badchan:getlist {nick host hand chan chan1 type next} {
  17. global black
  18. set userlang [getuser $hand XTRA OUTPUT_LANG]
  19. if {$userlang == ""} { set userlang "[string tolower $black(default_lang)]" }
  20. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  21. set temp "$black(tempdir)/badchan_temp.$timestamp"
  22. array set badchanlist [list]
  23. set file [open $black(add_file) r]
  24. set size [file size $black(add_file)]
  25. set data [split [read $file $size] \n]
  26. close $file
  27. foreach line $data {
  28. set read_chan [lindex [split $line] 0]
  29. set enc_chan [encoding convertfrom utf-8 $read_chan]
  30. set read_type [lindex [split $line] 1]
  31. if {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"]} {
  32. set msg_num [lindex [split $line] 2]
  33. set bdchan [lindex [split $line] 3]
  34. if {[regexp {^[+]} $bdchan]} {
  35. set text [black:color:set $hand $black(say.$userlang.gl.protexcept)]
  36. lappend badchanlist($msg_num) [string map {"+" ""} $bdchan] \[$text\]
  37. } else {
  38. lappend badchanlist($msg_num) $bdchan
  39. }
  40. }
  41. }
  42. set tempwrite [open $temp w]
  43. foreach msg [lsort -integer -increasing [array names badchanlist]] {
  44. puts $tempwrite "$msg [join $badchanlist($msg)]"
  45. }
  46. close $tempwrite
  47. set file [open $temp r]
  48. set w [read -nonewline $file]
  49. close $file
  50. set data [split $w "\n"]
  51. file delete $temp
  52. if {[string equal -nocase $chan "GLOBAL"]} {
  53. module:getinfo $nick $host $hand $chan $chan1 $type $data "badchan" "1" $next
  54. } else {
  55. module:getinfo $nick $host $hand $chan $chan1 $type $data "badchan" "0" $next
  56. }
  57. }
  58. proc badchan:delchan {nick host hand chan chan1 number} {
  59. global black
  60. if {![regexp {^[0-9]} $number]} {
  61. if {$type == "0"} {
  62. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  63. }
  64. if {$type == "1"} {
  65. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  66. }
  67. return
  68. }
  69. set ret [find:num $number $chan "BADCHAN"]
  70. if {$ret == 0} {
  71. blacktools:tell $nick $host $hand $chan $chan1 badchan.17 $number
  72. return
  73. }
  74. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  75. set temp "$black(tempdir)/badchan_temp.$timestamp"
  76. set file [open $black(add_file) r]
  77. set size [file size $black(add_file)]
  78. set data [split [read $file $size] \n]
  79. close $file
  80. set tempwrite [open $temp w]
  81. foreach line $data {
  82. if {$line != ""} {
  83. set read_num [lindex [split $line] 2]
  84. set read_chan [lindex [split $line] 0]
  85. set read_type [lindex [split $line] 1]
  86. set enc_chan [encoding convertfrom utf-8 $read_chan]
  87. if {[string equal $number $read_num] && [string equal -nocase $chan $enc_chan] && [string equal -nocase $read_type "BADCHAN"]} {
  88. continue
  89. } else {
  90. puts $tempwrite $line
  91. }
  92. }
  93. }
  94. close $tempwrite
  95. file rename -force $temp $black(add_file)
  96. if {[string equal -nocase $chan "GLOBAL"]} {
  97. blacktools:tell $nick $host $hand $chan $chan1 badchan.19 $number
  98. } else {
  99. blacktools:tell $nick $host $hand $chan $chan1 badchan.18 $number
  100. }
  101. }
  102. proc badchan:process {nick host hand chan chan1 why bdchan type1 type reason} {
  103. global botnick black
  104. set cmd_status [btcmd:status $chan $hand "badchan" 0]
  105. if {$cmd_status == "1"} {
  106. return
  107. }
  108. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  109. return
  110. }
  111. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  112. return
  113. }
  114. set show_bdchan $bdchan
  115. set cmd "badchan"
  116. set num 0
  117. set temp_num 0
  118. set gl 0
  119. set getlang [string tolower [setting:get $chan lang]]
  120. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  121. switch $why {
  122. on {
  123. setting:set $chan +antibadchan ""
  124. blacktools:tell $nick $host $hand $chan $chan1 badchan.6 none
  125. if {[setting:get $chan badchan-scantime] != ""} {
  126. set time [setting:get $chan badchan-scantime]
  127. } else {
  128. set time $black(badchan:scantime)
  129. }
  130. set scan_time [time_return_minute $time]
  131. set black(badchan:$chan:timer_start) $scan_time
  132. }
  133. off {
  134. setting:set $chan -antibadchan ""
  135. blacktools:tell $nick $host $hand $chan $chan1 badchan.8 none
  136. if {[info exists black(badchan:$chan:timer_start)]} {
  137. unset black(badchan:$chan:timer_start)
  138. }
  139. if {[info exists black(badchan:counter:$chan)]} {
  140. unset black(badchan:counter:$chan)
  141. }
  142. }
  143. add {
  144. if {![validchan $chan] && ![string equal -nocase $type "global"]} {
  145. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  146. return
  147. }
  148. if {![regexp {^[+&#]} $bdchan]} {
  149. switch $type1 {
  150. 0 {
  151. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  152. }
  153. 1 {
  154. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  155. }
  156. 2 {
  157. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  158. }
  159. }
  160. return
  161. }
  162. set findchan [prot:findbadchan $chan $bdchan]
  163. if {$findchan == "1"} {
  164. blacktools:tell $nick $host $hand $chan $chan1 badchan.1 $show_bdchan
  165. return
  166. }
  167. if {$reason == ""} {
  168. set reason "$black(say.$getlang.badchan.5)"
  169. }
  170. set reason [join [encoding convertto utf-8 $reason]]
  171. if {[matchattr $hand mn] && [string equal -nocase $type "global"]} {
  172. set findchan [prot:findbadchan "GLOBAL" $bdchan]
  173. if {$findchan == "1"} {
  174. blacktools:tell $nick $host $hand $chan $chan1 badchan.42 $show_bdchan
  175. return
  176. }
  177. while {$temp_num == 0} {
  178. set get [find:num $num "GLOBAL" "BADCHAN"]
  179. if {$get == "$num"} {
  180. set num [expr $num + 1]
  181. } else { set temp_num 1 }
  182. }
  183. set file [open $black(add_file) a]
  184. puts $file "GLOBAL BADCHAN $num $bdchan $reason"
  185. close $file
  186. set gl 1
  187. blacktools:tell $nick $host $hand $chan $chan1 badchan.11 "$show_bdchan $num"
  188. return
  189. }
  190. while {$temp_num == 0} {
  191. set get [find:num $num $chan "BADCHAN"]
  192. if {$get == "$num"} {
  193. set num [expr $num + 1]
  194. } else { set temp_num 1 }
  195. }
  196. set encoded [encoding convertto utf-8 $bdchan]
  197. set enc_chan [encoding convertto utf-8 $chan]
  198. set file [open $black(add_file) a]
  199. puts $file "$enc_chan BADCHAN $num $encoded $reason"
  200. close $file
  201. set gl 0
  202. if {[regexp {^[+]} $bdchan]} {
  203. blacktools:tell $nick $host $hand $chan $chan1 badchan.45 "[string map {"+" ""} $bdchan] $num"
  204. } else {
  205. blacktools:tell $nick $host $hand $chan $chan1 badchan.12 "$bdchan $num"
  206. }
  207. }
  208. list {
  209. if {![validchan $chan] && ![string equal -nocase $bdchan "global"]} {
  210. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  211. return
  212. }
  213. if {[string equal -nocase $bdchan "global"] && [matchattr $hand nm]} {
  214. badchan:getlist $nick $host $hand "GLOBAL" $chan1 $type1 $type
  215. return
  216. }
  217. badchan:getlist $nick $host $hand $chan $chan1 $type1 $bdchan
  218. }
  219. del {
  220. if {![validchan $chan] && ![string equal -nocase $type "global"]} {
  221. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  222. return
  223. }
  224. if {![regexp {^[0-9]} $bdchan]} {
  225. switch $type1 {
  226. 0 {
  227. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  228. }
  229. 1 {
  230. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  231. }
  232. 2 {
  233. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  234. }
  235. }
  236. return
  237. }
  238. if {[string equal -nocase $type "global"] && [matchattr $hand nm]} {
  239. badchan:delchan $nick $host $hand "GLOBAL" $chan1 $bdchan
  240. return
  241. }
  242. badchan:delchan $nick $host $hand $chan $chan1 $bdchan
  243. }
  244. default {
  245. switch $type1 {
  246. 0 {
  247. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  248. }
  249. 1 {
  250. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  251. }
  252. 2 {
  253. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  254. }
  255. }
  256. return
  257. }
  258. }
  259. }
  260. proc prot:findbadchan {chan word} {
  261. global black
  262. set found_it 0
  263. set file [open $black(add_file) r]
  264. set size [file size $black(add_file)]
  265. set data [split [read $file $size] \n]
  266. close $file
  267. foreach line $data {
  268. set read_chan [lindex [split $line] 0]
  269. set enc_chan [encoding convertfrom utf-8 $read_chan]
  270. set read_type [lindex [split $line] 1]
  271. set b [lindex [split $line] 3]
  272. set enc_bchan [encoding convertfrom utf-8 $b]
  273. if {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && ![regexp {^[+]} $read_chan] && ![regexp {^[+]} $word]} {
  274. set found_it 1
  275. } elseif {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && [regexp {^[+]} $read_chan] && [regexp {^[+]} $word]} {
  276. set found_it 1
  277. }
  278. }
  279. return $found_it
  280. }
  281. proc badchanpublic:join {nick host hand chan} {
  282. global black
  283. set ::bad_chan $chan
  284. if {![validchan $chan]} { return }
  285. if {[setting:get $chan antibadchan]} {
  286. if {[matchattr $hand $black(exceptflags) $chan]} {
  287. return
  288. }
  289. if {[isbotnick $nick]} { return }
  290. if {(![botisop $chan]) && (![setting:get $chan xonly])} { return }
  291. utimer 5 [list putserv "WHOIS $nick"]
  292. bind RAW - 319 badchan:execute
  293. }
  294. }
  295. proc badchan:joinflood:unset {chan} {
  296. global black
  297. if {[info exists black(badchan_floodcontrol:$chan)]} {
  298. unset black(badchan_floodcontrol:$chan)
  299. }
  300. }
  301. proc badchan:joinflood:unset:act {chan} {
  302. global black
  303. if {[info exists black(floodcontrol:act:$chan)]} {
  304. unset black(floodcontrol:act:$chan)
  305. }
  306. }
  307. proc badchan:scantimer {channels} {
  308. global black
  309. set badchanscan_list ""
  310. foreach chan $channels {
  311. if {[validchan $chan]} {
  312. foreach nick [chanlist $chan] {
  313. set hand [nick2hand $nick]
  314. if {[isbotnick $nick]} { continue }
  315. if {[matchattr $hand $black(exceptflags) $chan]} {
  316. continue
  317. }
  318. set bl_protect [blacktools:protect $nick $chan]
  319. if {$bl_protect == "1"} { continue }
  320. set position [lsearch -exact [string tolower $badchanscan_list] "[string tolower $nick]:[string tolower $chan]"]
  321. if {$position < 0} {
  322. lappend badchanscan_list "$nick:$chan"
  323. }
  324. }
  325. }
  326. }
  327. if {$badchanscan_list != ""} {
  328. badchan:scan $badchanscan_list
  329. }
  330. }
  331. proc badchan:scan {badchanlist} {
  332. global black
  333. if {![info exists black(badchan:scan:counter)]} {
  334. set black(badchan:scan:counter) 0
  335. }
  336. set person [lindex $badchanlist $black(badchan:scan:counter)]
  337. if {$person == ""} {
  338. unset black(badchan:scan:counter)
  339. return
  340. }
  341. set black(badchan:scan:counter) [expr $black(badchan:scan:counter) + 1]
  342. set split_person [split $person ":"]
  343. set nick [lindex $split_person 0]
  344. set channel [lindex $split_person 1]
  345. set ::bad_chan $channel
  346. putserv "WHOIS $nick"
  347. bind RAW - 319 badchan:execute
  348. utimer 10 [list badchan:scan $badchanlist]
  349. }
  350. proc badchan:execute {from keyword arguments } {
  351. global botnick badchan black
  352. set chan $::bad_chan
  353. set cmd "badchan"
  354. set file_found 0
  355. set chan1 $chan
  356. set arguments [split $arguments]
  357. set nick [string tolower [lindex $arguments 1]]
  358. set show_nick [lindex $arguments 1]
  359. set channels [string tolower [lrange $arguments 2 end]]
  360. set text [join [check:badchan:except $channels $chan]]
  361. set banmask [return_mask [return_host_num $cmd $chan [getchanhost $nick $chan]] [getchanhost $nick $chan] $nick]
  362. set getlang [string tolower [setting:get $chan lang]]
  363. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  364. if {![onchan $nick $chan]} {
  365. return
  366. }
  367. set bl_protect [blacktools:protect $nick $chan]
  368. if {$bl_protect == "1"} { return }
  369. set file [open $black(add_file) r]
  370. set size [file size $black(add_file)]
  371. set data [split [read $file $size] \n]
  372. close $file
  373. foreach line $data {
  374. set mainchan [lindex [split $line] 0]
  375. set read_type [lindex [split $line] 1]
  376. if {([string equal -nocase $chan $mainchan] || [string equal -nocase "GLOBAL" $mainchan]) && [string equal -nocase $read_type "BADCHAN"]} {
  377. set readchan [lindex [split $line] 3]
  378. set encoded [encoding convertfrom utf-8 $readchan]
  379. foreach c $text {
  380. set ch [string trimleft $c ":~@+"]
  381. if {[string match -nocase $encoded $ch]} {
  382. set file_found 1
  383. set reason [lrange [split $line] 4 end]
  384. set badchan($banmask:$chan) $reason
  385. set badchan(channels:$banmask:$chan) $ch
  386. break
  387. }
  388. }
  389. }
  390. }
  391. if {$file_found == "0"} {
  392. foreach defchan $black(badcchannels) {
  393. set encoded [encoding convertfrom utf-8 $defchan]
  394. foreach c $text {
  395. set ch [string trimleft $c ":@+"]
  396. set ch [check:except $ch $chan $black(badcchannels) $black(exceptchannels) "BADCHAN"]
  397. if {[string match -nocase $encoded $ch]} {
  398. set badchan(channels:$banmask:$chan) $ch
  399. set badchan($banmask:$chan) $black(say.$getlang.badchan.5)
  400. break
  401. }
  402. }
  403. }
  404. }
  405. if {[info exists badchan($banmask:$chan)]} {
  406. if {[string equal -nocase $badchan($banmask:$chan) $black(say.$getlang.badchan.5)]} {
  407. if {[setting:get $chan badchan-reason] != ""} {
  408. set getreason [join [setting:get $chan badchan-reason]]
  409. } else {
  410. set getreason $black(say.$getlang.badchan.5)
  411. }
  412. } else {
  413. set getreason [join $badchan($banmask:$chan)]
  414. }
  415. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  416. if {[info exists badchan($banmask:$chan)]} {
  417. #blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0"
  418. putlog "ban $nick"
  419. who:chan $chan
  420. if {[setting:get $chan showbadchan]} {
  421. set replace(%nick%) $show_nick
  422. set replace(%chans%) $badchan(channels:$banmask:$chan)
  423. set mes [string map [array get replace] $black(say.$getlang.badchan.44)]
  424. putserv "NOTICE @$chan :$mes"
  425. }
  426. unset badchan(checkagain:$banmask:$chan)
  427. unset badchan($banmask:$chan)
  428. unset badchan(channels:$banmask:$chan)
  429. return
  430. }
  431. unset badchan(checkagain:$banmask:$chan)
  432. return
  433. }
  434. }
  435. if {[info exists badchan($banmask:$chan)]} {
  436. if {[setting:get $chan badchan-bmethod] == "0" || [setting:get $chan badchan-bmethod] == ""} {
  437. set bmethod $black(badcbanmethod)
  438. } else { set bmethod [setting:get $chan badchan-bmethod] }
  439. if {$bmethod == "2"} {
  440. blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0"
  441. who:chan $chan
  442. if {[setting:get $chan showbadchan]} {
  443. set replace(%nick%) $nick
  444. set replace(%chans%) $badchan(channels:$banmask:$chan)
  445. set text [black:color:set "" $black(say.$getlang.badchan.44)]
  446. set text [join $text]
  447. set mes [string map [array get replace] $text]
  448. putserv "NOTICE @$chan :$mes"
  449. }
  450. unset badchan($banmask:$chan)
  451. unset badchan(channels:$banmask:$chan)
  452. return
  453. }
  454. set replace(%badchans%) [join $badchan(channels:$banmask:$chan) ", "]
  455. set text [black:color:set "" $black(say.$getlang.badchan.40)]
  456. set reply [join $text]
  457. if {[setting:get $chan badchan-banwait] == ""} {
  458. set wait_time $black(badcbanwait)
  459. utimer $black(badcbanwait) [list badchan:check:again $nick $chan]
  460. } else {
  461. set wait_time [setting:get $chan badchan-banwait]
  462. utimer $wait_time [list badchan:check:again $nick $chan]
  463. }
  464. set replace(%time%) $wait_time
  465. set message [string map [array get replace] $reply]
  466. putquick "PRIVMSG $nick :\[$chan\] $message"
  467. unset badchan($banmask:$chan)
  468. unset badchan(channels:$banmask:$chan)
  469. set badchan(checkagain:$banmask:$chan) 1
  470. } else {
  471. if {[info exists badchan(checkagain:$banmask:$chan]} {
  472. unset badchan(checkagain:$banmask:$chan
  473. }
  474. if {[info exists badchan($banmask:$chan)]} {
  475. unset badchan($banmask:$chan)
  476. }
  477. if {[info exists badchan(channels:$banmask:$chan)]} {
  478. unset badchan(channels:$banmask:$chan)
  479. }
  480. }
  481. unbind RAW - 319 badchan:execute
  482. }
  483. proc badchan:check:again {nick chan} {
  484. global black badchan
  485. putserv "WHOIS $nick"
  486. set ::bad_chan $chan
  487. bind RAW - 319 badchan:execute
  488. }
  489. proc badchan:nickchange {nick host hand chan newnick} {
  490. global badchan
  491. set found_time 0
  492. set current_time ""
  493. foreach tmr [utimers] {
  494. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  495. set current_time [get:timer:time $nick $chan]
  496. set found_time 1
  497. killutimer [lindex $tmr 2]
  498. }
  499. }
  500. if {$found_time == "1"} {
  501. utimer $current_time [list badchan:check:again $newnick $chan]
  502. }
  503. }
  504. proc badchan:split {nick host hand chan args} {
  505. global badchan
  506. badchan:part $nick $host $hand $chan "none"
  507. }
  508. proc badchan:kick {nick host hand chan kicked reason} {
  509. global badchan
  510. badchan:part $kicked $host $hand $chan "none"
  511. }
  512. proc badchan:part {nick host hand chan arg} {
  513. global badchan
  514. if {![validchan $chan]} { return }
  515. set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1]
  516. foreach tmr [utimers] {
  517. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  518. killutimer [lindex $tmr 2]
  519. }
  520. }
  521. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  522. unset badchan(checkagain:$banmask:$chan)
  523. }
  524. if {[info exists badchan($banmask:$chan)]} {
  525. unset badchan($banmask:$chan)
  526. }
  527. if {[info exists badchan(channels:$banmask:$chan)]} {
  528. unset badchan(channels:$banmask:$chan)
  529. }
  530. }
  531. proc get:timer:time {nick chan} {
  532. global black
  533. set time_left 0
  534. foreach tmr [utimers] {
  535. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  536. set time_left [lindex $tmr 0]
  537. }
  538. }
  539. return $time_left
  540. }
  541. proc check:badchan:except {text chan} {
  542. global black
  543. set counter_word 0
  544. set counter_except 0
  545. set found_it 0
  546. foreach word $text {
  547. set w [string trimleft $word ":@+"]
  548. foreach ex $black(exceptchannels) {
  549. if {[string match -nocase $ex $w] || [string match -nocase $w $ex]} {
  550. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  551. if {$position > -1} {
  552. set text [lreplace $text $position $position]
  553. }
  554. }
  555. }
  556. }
  557. set file [open $black(add_file) r]
  558. set size [file size $black(add_file)]
  559. set data [split [read $file $size] \n]
  560. close $file
  561. foreach line $data {
  562. if {$line != ""} {
  563. set channel [lindex [split $line] 0]
  564. set getype [lindex [split $line] 1]
  565. set badchan [lindex [split $line] 3]
  566. if {[string equal -nocase "BADCHAN" $getype] && [regexp {^[+]} $badchan]} {
  567. if {[string equal -nocase $channel $chan] } {
  568. set badchan [string map {"+" ""} $badchan]
  569. foreach word $text {
  570. set w [string trimleft $word ":@+"]
  571. if {[string match -nocase $badchan $w] || [string match -nocase $w $badchan]} {
  572. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  573. if {$position > -1} {
  574. set text [lreplace $text $position $position]
  575. }
  576. }
  577. }
  578. }
  579. }
  580. }
  581. }
  582. return $text
  583. }
  584. ##############
  585. #########################################################################
  586. ## END ##
  587. #########################################################################