BT.BadChan.tcl 18 KB

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