BT.BadChan.tcl 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  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-script ##
  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. set getset [setting:get $chan badchan-floodcontrol]
  292. if {$getset == ""} { set getset $black(badchan:join:seconds) }
  293. set num_control [scan $getset %\[^:\]]
  294. set time_control [scan $getset %*\[^:\]:%s]
  295. if {[info exists black(floodcontrol:act:$chan)]} {
  296. set current_time [unixtime]
  297. set dif [expr $current_time - $black(floodcontrol:act:$chan)]
  298. if {$dif >= 30} {
  299. badchan:joinflood:unset:act $chan
  300. } else {
  301. return
  302. }
  303. }
  304. foreach tmr [utimers] {
  305. if {[string match "*badchan:joinflood:unset $chan*" [join [lindex $tmr 1]]]} {
  306. killutimer [lindex $tmr 2]
  307. }
  308. }
  309. if {![info exists black(badchan_floodcontrol:$chan)]} {
  310. set black(badchan_floodcontrol:$chan) 0
  311. }
  312. incr black(badchan_floodcontrol:$chan)
  313. utimer $time_control [list badchan:joinflood:unset $chan]
  314. if {$black(badchan_floodcontrol:$chan) >= "$num_control"} {
  315. set black(floodcontrol:act:$chan) [unixtime]
  316. return
  317. }
  318. utimer 5 [list putserv "WHOIS $nick"]
  319. bind RAW - 319 badchan:execute
  320. }
  321. }
  322. proc badchan:joinflood:unset {chan} {
  323. global black
  324. if {[info exists black(badchan_floodcontrol:$chan)]} {
  325. unset black(badchan_floodcontrol:$chan)
  326. }
  327. }
  328. proc badchan:joinflood:unset:act {chan} {
  329. global black
  330. if {[info exists black(floodcontrol:act:$chan)]} {
  331. unset black(floodcontrol:act:$chan)
  332. }
  333. }
  334. proc badchan:scantimer {channels} {
  335. global black
  336. set badchanscan_list ""
  337. foreach chan $channels {
  338. if {[validchan $chan]} {
  339. foreach nick [chanlist $chan] {
  340. set hand [nick2hand $nick]
  341. if {[isbotnick $nick]} { continue }
  342. if {[matchattr $hand $black(exceptflags) $chan]} {
  343. continue
  344. }
  345. set bl_protect [blacktools:protect $nick $chan]
  346. if {$bl_protect == "1"} { continue }
  347. set position [lsearch -exact [string tolower $badchanscan_list] "[string tolower $nick]:[string tolower $chan]"]
  348. if {$position < 0} {
  349. lappend badchanscan_list "$nick:$chan"
  350. }
  351. }
  352. }
  353. }
  354. if {$badchanscan_list != ""} {
  355. badchan:scan $badchanscan_list
  356. }
  357. }
  358. proc badchan:scan {badchanlist} {
  359. global black
  360. if {![info exists black(badchan:scan:counter)]} {
  361. set black(badchan:scan:counter) 0
  362. }
  363. set person [lindex $badchanlist $black(badchan:scan:counter)]
  364. if {$person == ""} {
  365. unset black(badchan:scan:counter)
  366. return
  367. }
  368. set black(badchan:scan:counter) [expr $black(badchan:scan:counter) + 1]
  369. set split_person [split $person ":"]
  370. set nick [lindex $split_person 0]
  371. set channel [lindex $split_person 1]
  372. set ::bad_chan $channel
  373. putserv "WHOIS $nick"
  374. bind RAW - 319 badchan:execute
  375. utimer 10 [list badchan:scan $badchanlist]
  376. }
  377. proc badchan:execute {from keyword arguments } {
  378. global botnick badchan black
  379. set chan $::bad_chan
  380. set cmd "badchan"
  381. set file_found 0
  382. set chan1 $chan
  383. set arguments [split $arguments]
  384. set nick [string tolower [lindex $arguments 1]]
  385. set show_nick [lindex $arguments 1]
  386. set channels [string tolower [lrange $arguments 2 end]]
  387. set text [join [check:badchan:except $channels $chan]]
  388. set banmask [return_mask [return_host_num $cmd $chan [getchanhost $nick $chan]] [getchanhost $nick $chan] $nick]
  389. set getlang [string tolower [setting:get $chan lang]]
  390. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  391. if {![onchan $nick $chan]} {
  392. return
  393. }
  394. set bl_protect [blacktools:protect $nick $chan]
  395. if {$bl_protect == "1"} { return }
  396. set file [open $black(add_file) r]
  397. set size [file size $black(add_file)]
  398. set data [split [read $file $size] \n]
  399. close $file
  400. foreach line $data {
  401. set mainchan [lindex [split $line] 0]
  402. set read_type [lindex [split $line] 1]
  403. if {([string equal -nocase $chan $mainchan] || [string equal -nocase "GLOBAL" $mainchan]) && [string equal -nocase $read_type "BADCHAN"]} {
  404. set readchan [lindex [split $line] 3]
  405. set encoded [encoding convertfrom utf-8 $readchan]
  406. foreach c $text {
  407. set ch [string trimleft $c ":~@+"]
  408. if {[string match -nocase $encoded $ch]} {
  409. set file_found 1
  410. set reason [lrange [split $line] 4 end]
  411. set badchan($banmask:$chan) $reason
  412. set badchan(channels:$banmask:$chan) $ch
  413. break
  414. }
  415. }
  416. }
  417. }
  418. if {$file_found == "0"} {
  419. foreach defchan $black(badcchannels) {
  420. set encoded [encoding convertfrom utf-8 $defchan]
  421. foreach c $text {
  422. set ch [string trimleft $c ":@+"]
  423. set ch [check:except $ch $chan $black(badcchannels) $black(exceptchannels) "BADCHAN"]
  424. if {[string match -nocase $encoded $ch]} {
  425. set badchan(channels:$banmask:$chan) $ch
  426. set badchan($banmask:$chan) $black(say.$getlang.badchan.5)
  427. break
  428. }
  429. }
  430. }
  431. }
  432. if {[info exists badchan($banmask:$chan)]} {
  433. if {[string equal -nocase $badchan($banmask:$chan) $black(say.$getlang.badchan.5)]} {
  434. if {[setting:get $chan badchan-reason] != ""} {
  435. set getreason [join [setting:get $chan badchan-reason]]
  436. } else {
  437. set getreason $black(say.$getlang.badchan.5)
  438. }
  439. } else {
  440. set getreason [join $badchan($banmask:$chan)]
  441. }
  442. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  443. if {[info exists badchan($banmask:$chan)]} {
  444. blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0"
  445. who:chan $chan
  446. if {[setting:get $chan showbadchan]} {
  447. set replace(%nick%) $show_nick
  448. set replace(%chans%) $badchan(channels:$banmask:$chan)
  449. set mes [string map [array get replace] $black(say.$getlang.badchan.44)]
  450. putserv "NOTICE @$chan :$mes"
  451. }
  452. unset badchan(checkagain:$banmask:$chan)
  453. unset badchan($banmask:$chan)
  454. unset badchan(channels:$banmask:$chan)
  455. return
  456. }
  457. unset badchan(checkagain:$banmask:$chan)
  458. return
  459. }
  460. }
  461. if {[info exists badchan($banmask:$chan)]} {
  462. if {[setting:get $chan badchan-bmethod] == "0" || [setting:get $chan badchan-bmethod] == ""} {
  463. set bmethod $black(badcbanmethod)
  464. } else { set bmethod [setting:get $chan badchan-bmethod] }
  465. if {$bmethod == "2"} {
  466. blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0"
  467. who:chan $chan
  468. if {[setting:get $chan showbadchan]} {
  469. set replace(%nick%) $nick
  470. set replace(%chans%) $badchan(channels:$banmask:$chan)
  471. set text [black:color:set "" $black(say.$getlang.badchan.44)]
  472. set text [join $text]
  473. set mes [string map [array get replace] $text]
  474. putserv "NOTICE @$chan :$mes"
  475. }
  476. unset badchan($banmask:$chan)
  477. unset badchan(channels:$banmask:$chan)
  478. return
  479. }
  480. set replace(%badchans%) [join $badchan(channels:$banmask:$chan) ", "]
  481. set text [black:color:set "" $black(say.$getlang.badchan.40)]
  482. set reply [join $text]
  483. if {[setting:get $chan badchan-banwait] == ""} {
  484. set wait_time $black(badcbanwait)
  485. utimer $black(badcbanwait) [list badchan:check:again $nick $chan]
  486. } else {
  487. set wait_time [setting:get $chan badchan-banwait]
  488. utimer $wait_time [list badchan:check:again $nick $chan]
  489. }
  490. set replace(%time%) $wait_time
  491. set message [string map [array get replace] $reply]
  492. putquick "PRIVMSG $nick :\[$chan\] $message"
  493. unset badchan($banmask:$chan)
  494. unset badchan(channels:$banmask:$chan)
  495. set badchan(checkagain:$banmask:$chan) 1
  496. } else {
  497. if {[info exists badchan(checkagain:$banmask:$chan]} {
  498. unset badchan(checkagain:$banmask:$chan
  499. }
  500. if {[info exists badchan($banmask:$chan)]} {
  501. unset badchan($banmask:$chan)
  502. }
  503. if {[info exists badchan(channels:$banmask:$chan)]} {
  504. unset badchan(channels:$banmask:$chan)
  505. }
  506. }
  507. unbind RAW - 319 badchan:execute
  508. }
  509. proc badchan:check:again {nick chan} {
  510. global black badchan
  511. putserv "WHOIS $nick"
  512. set ::bad_chan $chan
  513. bind RAW - 319 badchan:execute
  514. }
  515. proc badchan:nickchange {nick host hand chan newnick} {
  516. global badchan
  517. set found_time 0
  518. set current_time ""
  519. foreach tmr [utimers] {
  520. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  521. set current_time [get:timer:time $nick $chan]
  522. set found_time 1
  523. killutimer [lindex $tmr 2]
  524. }
  525. }
  526. if {$found_time == "1"} {
  527. utimer $current_time [list badchan:check:again $newnick $chan]
  528. }
  529. }
  530. proc badchan:split {nick host hand chan args} {
  531. global badchan
  532. badchan:part $nick $host $hand $chan "none"
  533. }
  534. proc badchan:kick {nick host hand chan kicked reason} {
  535. global badchan
  536. badchan:part $kicked $host $hand $chan "none"
  537. }
  538. proc badchan:part {nick host hand chan arg} {
  539. global badchan
  540. if {![validchan $chan]} { return }
  541. set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1]
  542. foreach tmr [utimers] {
  543. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  544. killutimer [lindex $tmr 2]
  545. }
  546. }
  547. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  548. unset badchan(checkagain:$banmask:$chan)
  549. }
  550. if {[info exists badchan($banmask:$chan)]} {
  551. unset badchan($banmask:$chan)
  552. }
  553. if {[info exists badchan(channels:$banmask:$chan)]} {
  554. unset badchan(channels:$banmask:$chan)
  555. }
  556. }
  557. proc get:timer:time {nick chan} {
  558. global black
  559. set time_left 0
  560. foreach tmr [utimers] {
  561. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  562. set time_left [lindex $tmr 0]
  563. }
  564. }
  565. return $time_left
  566. }
  567. proc check:badchan:except {text chan} {
  568. global black
  569. set counter_word 0
  570. set counter_except 0
  571. set found_it 0
  572. foreach word $text {
  573. set w [string trimleft $word ":@+"]
  574. foreach ex $black(exceptchannels) {
  575. if {[string match -nocase $ex $w] || [string match -nocase $w $ex]} {
  576. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  577. if {$position > -1} {
  578. set text [lreplace $text $position $position]
  579. }
  580. }
  581. }
  582. }
  583. set file [open $black(add_file) r]
  584. set size [file size $black(add_file)]
  585. set data [split [read $file $size] \n]
  586. close $file
  587. foreach line $data {
  588. if {$line != ""} {
  589. set channel [lindex [split $line] 0]
  590. set getype [lindex [split $line] 1]
  591. set badchan [lindex [split $line] 3]
  592. if {[string equal -nocase "BADCHAN" $getype] && [regexp {^[+]} $badchan]} {
  593. if {[string equal -nocase $channel $chan] } {
  594. set badchan [string map {"+" ""} $badchan]
  595. foreach word $text {
  596. set w [string trimleft $word ":@+"]
  597. if {[string match -nocase $badchan $w] || [string match -nocase $w $badchan]} {
  598. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  599. if {$position > -1} {
  600. set text [lreplace $text $position $position]
  601. }
  602. }
  603. }
  604. }
  605. }
  606. }
  607. }
  608. return $text
  609. }
  610. ##############
  611. #########################################################################
  612. ## END ##
  613. #########################################################################