BT.BadChan.tcl 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  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. bind RAW - 319 badchan:execute
  17. bind RAW - 401 badchan:nosuchnick
  18. ###
  19. proc badchanpublic:join {nick host hand chan} {
  20. global black badchan
  21. if {![validchan $chan]} { return }
  22. if {[setting:get $chan antibadchan]} {
  23. if {[matchattr $hand $black(exceptflags) $chan]} {
  24. return
  25. }
  26. if {[isbotnick $nick]} { return }
  27. if {(![botisop $chan]) && (![setting:get $chan xonly])} { return }
  28. set flood_protect [badchan:flood:prot $chan $host]
  29. if {$flood_protect == "1"} {
  30. return
  31. }
  32. set banmask [return_mask [return_host_num "badchan" $chan [getchanhost $nick $chan]] [getchanhost $nick $chan] $nick]
  33. if {[info exists badchan(checkagain:$banmask:$chan)]} {return}
  34. putserv "WHOIS $nick"
  35. set ::badchan($nick) $chan
  36. set black(badchan:check:$nick:$chan) [list $chan $banmask]
  37. }
  38. }
  39. ###
  40. proc badchan:check:again {nick chan banmask} {
  41. global black badchan
  42. putserv "WHOIS $nick"
  43. set black(badchan:check:$nick:$chan) [list $chan $banmask]
  44. set ::badchan($nick) $chan
  45. }
  46. ###
  47. proc badchan:unset {nick chan banmask} {
  48. global black badchan
  49. if {[info exists black(badchan:check:$nick:$chan)]} {
  50. unset black(badchan:check:$nick:$chan)
  51. }
  52. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  53. unset badchan(checkagain:$banmask:$chan)
  54. }
  55. if {[info exists badchan($banmask:$chan)]} {
  56. unset badchan($banmask:$chan)
  57. }
  58. if {[info exists badchan(channels:$banmask:$chan)]} {
  59. unset badchan(channels:$banmask:$chan)
  60. }
  61. if {[info exists black(badchan:check:$nick:$chan)]} {
  62. unset black(badchan:check:$nick:$chan)
  63. }
  64. if {[info exists ::badchan($nick)]} {
  65. unset ::badchan($nick)
  66. }
  67. }
  68. ###
  69. proc badchan:nosuchnick {from keyword arguments} {
  70. global black badchan
  71. set nick [lindex [split $arguments] 1]
  72. if {![info exists ::badchan($nick)]} {
  73. return
  74. }
  75. set chan $::badchan($nick)
  76. if {[info exists black(badchan:check:$nick:$chan)]} {
  77. set banmask [lindex $black(badchan:check:$nick:$chan) 1]
  78. badchan:unset $nick $chan $banmask
  79. }
  80. }
  81. ###
  82. proc badchan:execute {from keyword arguments} {
  83. global botnick badchan black
  84. set cmd "badchan"
  85. set arguments [split $arguments]
  86. set nick [lindex $arguments 1]
  87. if {![info exists ::badchan($nick)]} {
  88. return
  89. }
  90. set chan $::badchan($nick)
  91. set file_found 0
  92. if {[info exists black(badchan:check:$nick:$chan)]} {set banmask [lindex $black(badchan:check:$nick:$chan) 1]} else {return}
  93. if {![validchan $chan]} {return}
  94. if {![onchan $nick $chan]} {
  95. badchan:unset $nick $chan $banmask
  96. return
  97. }
  98. set chan1 $chan
  99. set show_nick [lindex $arguments 1]
  100. set channels [string tolower [lrange $arguments 2 end]]
  101. set text [join [check:badchan:except $channels $chan]]
  102. set getlang [string tolower [setting:get $chan lang]]
  103. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  104. set bl_protect [blacktools:protect $nick $chan]
  105. if {$bl_protect == "1"} {
  106. badchan:unset $nick $chan $banmask
  107. return
  108. }
  109. set file [open $black(add_file) r]
  110. set size [file size $black(add_file)]
  111. set data [split [read $file $size] \n]
  112. close $file
  113. foreach line $data {
  114. set mainchan [lindex [split $line] 0]
  115. set read_type [lindex [split $line] 1]
  116. if {([string equal -nocase $chan $mainchan] || [string equal -nocase "GLOBAL" $mainchan]) && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
  117. set readchan [lindex [split $line] 3]
  118. set encoded [encoding convertfrom utf-8 $readchan]
  119. foreach c $text {
  120. set ch [string trimleft $c ":~@+"]
  121. if {[string match -nocase $encoded $ch] && [string equal -nocase $read_type "BADCHAN"]} {
  122. set file_found 1
  123. set reason [lrange [split $line] 4 end]
  124. set badchan($banmask:$chan) $reason
  125. set badchan(channels:$banmask:$chan) $ch
  126. break
  127. } elseif {[string equal -nocase $read_type "BADCHAN:REGEX"]} {
  128. if {[regexp "$readchan" $ch]} {
  129. set file_found 1
  130. set reason [lrange [split $line] 4 end]
  131. set badchan($banmask:$chan) $reason
  132. set badchan(channels:$banmask:$chan) $ch
  133. break
  134. }
  135. }
  136. }
  137. }
  138. }
  139. if {$file_found == "0"} {
  140. foreach defchan $black(badcchannels) {
  141. set encoded [encoding convertfrom utf-8 $defchan]
  142. foreach c $text {
  143. set ch [string trimleft $c ":@+"]
  144. set ch [check:except $ch $chan $black(badcchannels) $black(exceptchannels) "BADCHAN"]
  145. if {[string match -nocase $encoded $ch]} {
  146. set badchan(channels:$banmask:$chan) $ch
  147. set badchan($banmask:$chan) $black(say.$getlang.badchan.5)
  148. break
  149. }
  150. }
  151. }
  152. }
  153. if {[info exists badchan($banmask:$chan)]} {
  154. if {[string equal -nocase $badchan($banmask:$chan) $black(say.$getlang.badchan.5)]} {
  155. if {[setting:get $chan badchan-reason] != ""} {
  156. set getreason [join [setting:get $chan badchan-reason]]
  157. } else {
  158. set getreason $black(say.$getlang.badchan.5)
  159. }
  160. } else {
  161. set getreason [join $badchan($banmask:$chan)]
  162. }
  163. if {[info exists badchan(checkagain:$banmask:$chan)]} {
  164. if {[info exists badchan($banmask:$chan)]} {
  165. blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
  166. who:chan $chan
  167. if {[setting:get $chan showbadchan]} {
  168. set replace(%nick%) $show_nick
  169. set replace(%chans%) $badchan(channels:$banmask:$chan)
  170. set mes [string map [array get replace] $black(say.$getlang.badchan.44)]
  171. putserv "NOTICE @$chan :$mes"
  172. }
  173. badchan:unset $nick $chan $banmask
  174. return
  175. }
  176. badchan:unset $nick $chan $banmask
  177. return
  178. }
  179. }
  180. if {[info exists badchan($banmask:$chan)]} {
  181. if {[setting:get $chan badchan-bmethod] == "0" || [setting:get $chan badchan-bmethod] == ""} {
  182. set bmethod $black(badcbanmethod)
  183. } else { set bmethod [setting:get $chan badchan-bmethod] }
  184. if {$bmethod == "2"} {
  185. blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
  186. who:chan $chan
  187. if {[setting:get $chan showbadchan]} {
  188. set replace(%nick%) $nick
  189. set replace(%chans%) $badchan(channels:$banmask:$chan)
  190. set text [black:color:set "" $black(say.$getlang.badchan.44)]
  191. set text [join $text]
  192. set mes [string map [array get replace] $text]
  193. putserv "NOTICE @$chan :$mes"
  194. }
  195. badchan:unset $nick $chan $banmask
  196. return
  197. }
  198. set replace(%badchans%) [join $badchan(channels:$banmask:$chan) ", "]
  199. set text [black:color:set "" $black(say.$getlang.badchan.40)]
  200. set reply [join $text]
  201. if {[setting:get $chan badchan-banwait] == ""} {
  202. set wait_time $black(badcbanwait)
  203. utimer $black(badcbanwait) [list badchan:check:again $nick $chan $banmask]
  204. } else {
  205. set wait_time [setting:get $chan badchan-banwait]
  206. utimer $wait_time [list badchan:check:again $nick $chan $banmask]
  207. }
  208. set replace(%time%) $wait_time
  209. set message [string map [array get replace] $reply]
  210. putquick "PRIVMSG $nick :\[$chan\] $message"
  211. badchan:unset $nick $chan $banmask
  212. set badchan(checkagain:$banmask:$chan) 1
  213. } else {
  214. badchan:unset $nick $chan $banmask
  215. }
  216. }
  217. ###
  218. proc badchan:getlist {nick host hand chan chan1 type next} {
  219. global black
  220. set userlang [getuser $hand XTRA OUTPUT_LANG]
  221. if {$userlang == ""} { set userlang "[string tolower $black(default_lang)]" }
  222. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  223. set temp "$black(tempdir)/badchan_temp.$timestamp"
  224. array set badchanlist [list]
  225. set file [open $black(add_file) r]
  226. set size [file size $black(add_file)]
  227. set data [split [read $file $size] \n]
  228. close $file
  229. foreach line $data {
  230. set read_chan [lindex [split $line] 0]
  231. set enc_chan [encoding convertfrom utf-8 $read_chan]
  232. set read_type [lindex [split $line] 1]
  233. if {[string match -nocase $enc_chan $chan] && ([string match -nocase $read_type "BADCHAN"] || [string match -nocase $read_type "BADCHAN:REGEX"])} {
  234. set msg_num [lindex [split $line] 2]
  235. set bdchan [lindex [split $line] 3]
  236. if {[regexp {^[+]} $bdchan]} {
  237. set text [black:color:set $hand $black(say.$userlang.gl.protexcept)]
  238. lappend badchanlist($msg_num) [string map {"+" ""} $bdchan] \[$text\]
  239. } elseif {$read_type == "BADCHAN:REGEX"} {
  240. set text [black:color:set $hand $black(say.$userlang.badchan.46)]
  241. lappend badchanlist($msg_num) $bdchan \[$text\]
  242. } else {
  243. lappend badchanlist($msg_num) $bdchan
  244. }
  245. }
  246. }
  247. set tempwrite [open $temp w]
  248. foreach msg [lsort -integer -increasing [array names badchanlist]] {
  249. puts $tempwrite "$msg [join $badchanlist($msg)]"
  250. }
  251. close $tempwrite
  252. set file [open $temp r]
  253. set w [read -nonewline $file]
  254. close $file
  255. set data [split $w "\n"]
  256. file delete $temp
  257. if {[string equal -nocase $chan "GLOBAL"]} {
  258. module:getinfo $nick $host $hand $chan $chan1 $type $data "badchan" "1" $next
  259. } else {
  260. module:getinfo $nick $host $hand $chan $chan1 $type $data "badchan" "0" $next
  261. }
  262. }
  263. ###
  264. proc badchan:delchan {nick host hand chan chan1 number} {
  265. global black
  266. if {![regexp {^[0-9]} $number]} {
  267. if {$type == "0"} {
  268. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  269. }
  270. if {$type == "1"} {
  271. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  272. }
  273. return
  274. }
  275. set ret [badchan:exists $chan $number]
  276. if {$ret == 0} {
  277. blacktools:tell $nick $host $hand $chan $chan1 badchan.17 $number
  278. return
  279. }
  280. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  281. set temp "$black(tempdir)/badchan_temp.$timestamp"
  282. set file [open $black(add_file) r]
  283. set size [file size $black(add_file)]
  284. set data [split [read $file $size] \n]
  285. close $file
  286. set tempwrite [open $temp w]
  287. foreach line $data {
  288. if {$line != ""} {
  289. set read_num [lindex [split $line] 2]
  290. set read_chan [lindex [split $line] 0]
  291. set read_type [lindex [split $line] 1]
  292. set enc_chan [encoding convertfrom utf-8 $read_chan]
  293. if {[string equal $number $read_num] && [string equal -nocase $chan $enc_chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
  294. continue
  295. } else {
  296. puts $tempwrite $line
  297. }
  298. }
  299. }
  300. close $tempwrite
  301. file rename -force $temp $black(add_file)
  302. if {[string equal -nocase $chan "GLOBAL"]} {
  303. blacktools:tell $nick $host $hand $chan $chan1 badchan.19 $number
  304. } else {
  305. blacktools:tell $nick $host $hand $chan $chan1 badchan.18 $number
  306. }
  307. }
  308. ###
  309. proc badchan:exists {chan num} {
  310. global black
  311. set found_it 0
  312. set file [open $black(add_file) r]
  313. while {[gets $file line] != -1} {
  314. set read_chan [lindex [split $line] 0]
  315. set read_type [lindex [split $line] 1]
  316. set read_num [lindex [split $line] 2]
  317. set enc_chan [encoding convertfrom utf-8 $read_chan]
  318. if {[string equal -nocase $enc_chan $chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"]) && [string equal $read_num $num]} {
  319. set found_it 1
  320. break
  321. }
  322. }
  323. close $file
  324. return $found_it
  325. }
  326. ###
  327. proc badchan:find:num {chan} {
  328. global black
  329. set nums ""
  330. set file [open $black(add_file) r]
  331. while {[gets $file line] != -1} {
  332. set read_chan [lindex [split $line] 0]
  333. set read_type [lindex [split $line] 1]
  334. set read_num [lindex [split $line] 2]
  335. set enc_chan [encoding convertfrom utf-8 $read_chan]
  336. if {[string equal -nocase $enc_chan $chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
  337. lappend nums $read_num
  338. }
  339. }
  340. close $file
  341. if {$nums != ""} {
  342. set sort [blacktools:quicksort [join $nums]]
  343. return [expr [lindex $sort end] + 1]
  344. } else {
  345. return 1
  346. }
  347. }
  348. ###
  349. proc badchan:process {nick host hand chan chan1 why bdchan type1 type reason} {
  350. global botnick black
  351. set cmd_status [btcmd:status $chan $hand "badchan" 0]
  352. if {$cmd_status == "1"} {
  353. return
  354. }
  355. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  356. return
  357. }
  358. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  359. return
  360. }
  361. set show_bdchan $bdchan
  362. set cmd "badchan"
  363. set getlang [string tolower [setting:get $chan lang]]
  364. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  365. switch $why {
  366. on {
  367. setting:set $chan +antibadchan ""
  368. blacktools:tell $nick $host $hand $chan $chan1 badchan.6 none
  369. if {[setting:get $chan badchan-scantime] != ""} {
  370. set time [setting:get $chan badchan-scantime]
  371. } else {
  372. set time $black(badchan:scantime)
  373. }
  374. set scan_time [time_return_minute $time]
  375. set black(badchan:$chan:timer_start) $scan_time
  376. }
  377. off {
  378. setting:set $chan -antibadchan ""
  379. blacktools:tell $nick $host $hand $chan $chan1 badchan.8 none
  380. if {[info exists black(badchan:$chan:timer_start)]} {
  381. unset black(badchan:$chan:timer_start)
  382. }
  383. if {[info exists black(badchan:counter:$chan)]} {
  384. unset black(badchan:counter:$chan)
  385. }
  386. }
  387. regex {
  388. if {![validchan $chan] && ![string equal -nocase $type "global"]} {
  389. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  390. return
  391. }
  392. if {![regexp {^[&#]} $bdchan]} {
  393. switch $type1 {
  394. 0 {
  395. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  396. }
  397. 1 {
  398. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  399. }
  400. 2 {
  401. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  402. }
  403. }
  404. return
  405. }
  406. set findchan [prot:findbadchan $chan $bdchan]
  407. if {$findchan == "1"} {
  408. blacktools:tell $nick $host $hand $chan $chan1 badchan.1 $show_bdchan
  409. return
  410. }
  411. if {$reason == ""} {
  412. set reason "$black(say.$getlang.badchan.5)"
  413. }
  414. set reason [join [encoding convertto utf-8 $reason]]
  415. if {[matchattr $hand mn] && [string equal -nocase $type "global"]} {
  416. set findchan [prot:findbadchan "GLOBAL" $bdchan]
  417. if {$findchan == "1"} {
  418. blacktools:tell $nick $host $hand $chan $chan1 badchan.42 $show_bdchan
  419. return
  420. }
  421. set num [badchan:find:num "GLOBAL"]
  422. set file [open $black(add_file) a]
  423. puts $file "GLOBAL BADCHAN:REGEX $num $bdchan $reason"
  424. close $file
  425. blacktools:tell $nick $host $hand $chan $chan1 badchan.47 "$show_bdchan $num"
  426. return
  427. }
  428. set num [badchan:find:num $chan]
  429. set encoded [encoding convertto utf-8 $bdchan]
  430. set enc_chan [encoding convertto utf-8 $chan]
  431. set file [open $black(add_file) a]
  432. puts $file "$enc_chan BADCHAN:REGEX $num $encoded $reason"
  433. close $file
  434. blacktools:tell $nick $host $hand $chan $chan1 badchan.48 "$bdchan $num"
  435. }
  436. add {
  437. if {![validchan $chan] && ![string equal -nocase $type "global"]} {
  438. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  439. return
  440. }
  441. if {![regexp {^[+&#]} $bdchan]} {
  442. switch $type1 {
  443. 0 {
  444. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  445. }
  446. 1 {
  447. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  448. }
  449. 2 {
  450. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  451. }
  452. }
  453. return
  454. }
  455. set findchan [prot:findbadchan $chan $bdchan]
  456. if {$findchan == "1"} {
  457. blacktools:tell $nick $host $hand $chan $chan1 badchan.1 $show_bdchan
  458. return
  459. }
  460. if {$reason == ""} {
  461. set reason "$black(say.$getlang.badchan.5)"
  462. }
  463. set reason [join [encoding convertto utf-8 $reason]]
  464. if {[matchattr $hand mn] && [string equal -nocase $type "global"]} {
  465. set findchan [prot:findbadchan "GLOBAL" $bdchan]
  466. if {$findchan == "1"} {
  467. blacktools:tell $nick $host $hand $chan $chan1 badchan.42 $show_bdchan
  468. return
  469. }
  470. set num [badchan:find:num "GLOBAL"]
  471. set file [open $black(add_file) a]
  472. puts $file "GLOBAL BADCHAN $num $bdchan $reason"
  473. close $file
  474. blacktools:tell $nick $host $hand $chan $chan1 badchan.11 "$show_bdchan $num"
  475. return
  476. }
  477. set num [badchan:find:num $chan]
  478. set encoded [encoding convertto utf-8 $bdchan]
  479. set enc_chan [encoding convertto utf-8 $chan]
  480. set file [open $black(add_file) a]
  481. puts $file "$enc_chan BADCHAN $num $encoded $reason"
  482. close $file
  483. if {[regexp {^[+]} $bdchan]} {
  484. blacktools:tell $nick $host $hand $chan $chan1 badchan.45 "[string map {"+" ""} $bdchan] $num"
  485. } else {
  486. blacktools:tell $nick $host $hand $chan $chan1 badchan.12 "$bdchan $num"
  487. }
  488. }
  489. list {
  490. if {![validchan $chan] && ![string equal -nocase $bdchan "global"]} {
  491. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  492. return
  493. }
  494. if {[string equal -nocase $bdchan "global"] && [matchattr $hand nm]} {
  495. badchan:getlist $nick $host $hand "GLOBAL" $chan1 $type1 $type
  496. return
  497. }
  498. badchan:getlist $nick $host $hand $chan $chan1 $type1 $bdchan
  499. }
  500. del {
  501. if {![validchan $chan] && ![string equal -nocase $type "global"]} {
  502. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  503. return
  504. }
  505. if {![regexp {^[0-9]} $bdchan]} {
  506. switch $type1 {
  507. 0 {
  508. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  509. }
  510. 1 {
  511. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  512. }
  513. 2 {
  514. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  515. }
  516. }
  517. return
  518. }
  519. if {[string equal -nocase $type "global"] && [matchattr $hand nm]} {
  520. badchan:delchan $nick $host $hand "GLOBAL" $chan1 $bdchan
  521. return
  522. }
  523. badchan:delchan $nick $host $hand $chan $chan1 $bdchan
  524. }
  525. default {
  526. switch $type1 {
  527. 0 {
  528. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
  529. }
  530. 1 {
  531. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
  532. }
  533. 2 {
  534. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
  535. }
  536. }
  537. return
  538. }
  539. }
  540. }
  541. ###
  542. proc prot:findbadchan {chan word} {
  543. global black
  544. set found_it 0
  545. set file [open $black(add_file) r]
  546. set size [file size $black(add_file)]
  547. set data [split [read $file $size] \n]
  548. close $file
  549. foreach line $data {
  550. set read_chan [lindex [split $line] 0]
  551. set enc_chan [encoding convertfrom utf-8 $read_chan]
  552. set read_type [lindex [split $line] 1]
  553. set b [lindex [split $line] 3]
  554. set enc_bchan [encoding convertfrom utf-8 $b]
  555. if {[string match -nocase $enc_chan $chan] && ([string match -nocase $read_type "BADCHAN"] || [string match -nocase $read_type "BADCHAN:REGEX"]) && [string equal -nocase $word $enc_bchan] && ![regexp {^[+]} $read_chan] && ![regexp {^[+]} $word]} {
  556. set found_it 1
  557. } elseif {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && [regexp {^[+]} $read_chan] && [regexp {^[+]} $word]} {
  558. set found_it 1
  559. }
  560. }
  561. return $found_it
  562. }
  563. ###
  564. proc badchan:flood:prot {chan host} {
  565. global badchan black
  566. set number [scan $black(badchan:join:seconds) %\[^:\]]
  567. set timer [scan $black(badchan:join:seconds) %*\[^:\]:%s]
  568. if {[info exists badchan(flood:$host:$chan:act)]} {
  569. return 1
  570. }
  571. foreach tmr [utimers] {
  572. if {[string match "*badchan:remove:flood $host $chan*" [join [lindex $tmr 1]]]} {
  573. killutimer [lindex $tmr 2]
  574. }
  575. }
  576. if {![info exists badchan(flood:$host:$chan)]} {
  577. set badchan(flood:$host:$chan) 0
  578. }
  579. incr badchan(flood:$host:$chan)
  580. utimer $timer [list badchan:remove:flood $host $chan]
  581. if {$badchan(flood:$host:$chan) >= $number} {
  582. set badchan(flood:$host:$chan:act) 1
  583. utimer [expr $black(badchan:floodprot:time) * 60] [list badchan:expire:flood $host $chan]
  584. return 1
  585. } else {
  586. return 0
  587. }
  588. }
  589. ###
  590. proc badchan:remove:flood {host chan} {
  591. global badchan
  592. if {[info exists badchan(flood:$host:$chan)]} {
  593. unset badchan(flood:$host:$chan)
  594. }
  595. }
  596. ###
  597. proc badchan:expire:flood {host chan} {
  598. global badchan
  599. if {[info exists badchan(flood:$host:$chan:act)]} {
  600. unset badchan(flood:$host:$chan:act)
  601. }
  602. }
  603. ###
  604. proc badchan:scantimer {channels} {
  605. global black badchan
  606. set badchanscan_list ""
  607. foreach chan $channels {
  608. if {[validchan $chan]} {
  609. foreach nick [chanlist $chan] {
  610. set host [getchanhost $nick $chan]
  611. set hand [nick2hand $nick]
  612. if {[isbotnick $nick]} { continue }
  613. if {[matchattr $hand $black(exceptflags) $chan]} {
  614. continue
  615. }
  616. if {[info exists badchan(flood:$host:$chan:act)]} {
  617. continue
  618. }
  619. set banmask [return_mask [return_host_num "badchan" $chan $host] $host $nick]
  620. if {[info exists badchan(checkagain:$banmask:$chan)]} {continue}
  621. set bl_protect [blacktools:protect $nick $chan]
  622. if {$bl_protect == "1"} { continue }
  623. set position [lsearch -exact [string tolower $badchanscan_list] "[string tolower $nick]:[string tolower $chan]:$banmask"]
  624. if {$position < 0} {
  625. lappend badchanscan_list "$nick:$chan:$banmask"
  626. }
  627. }
  628. }
  629. }
  630. if {$badchanscan_list != ""} {
  631. badchan:scan $badchanscan_list
  632. }
  633. }
  634. ###
  635. proc badchan:scan {badchanlist} {
  636. global black badchan
  637. if {![info exists black(badchan:scan:counter)]} {
  638. set black(badchan:scan:counter) 0
  639. }
  640. set person [lindex $badchanlist $black(badchan:scan:counter)]
  641. if {$person == ""} {
  642. unset black(badchan:scan:counter)
  643. return
  644. }
  645. incr black(badchan:scan:counter)
  646. set split_person [split $person ":"]
  647. set nick [lindex $split_person 0]
  648. set chan [lindex $split_person 1]
  649. set banmask [lindex $split_person 2]
  650. if {![info exists black(badchan:check:$nick:$chan)]} {
  651. set black(badchan:check:$nick:$chan) [list $chan $banmask]
  652. putserv "WHOIS $nick"
  653. set ::badchan($nick) $chan
  654. }
  655. utimer 10 [list badchan:scan $badchanlist]
  656. }
  657. ###
  658. proc badchan:nickchange {nick host hand chan newnick} {
  659. global badchan
  660. set found_time 0
  661. set current_time ""
  662. foreach tmr [utimers] {
  663. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  664. set current_time [get:timer:time $nick $chan]
  665. set found_time 1
  666. killutimer [lindex $tmr 2]
  667. }
  668. }
  669. if {$found_time == "1"} {
  670. utimer $current_time [list badchan:check:again $newnick $chan]
  671. }
  672. }
  673. ###
  674. proc get:timer:time {nick chan} {
  675. global black
  676. set time_left 0
  677. foreach tmr [utimers] {
  678. if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
  679. set time_left [lindex $tmr 0]
  680. }
  681. }
  682. return $time_left
  683. }
  684. ###
  685. proc check:badchan:except {text chan} {
  686. global black
  687. set counter_word 0
  688. set counter_except 0
  689. set found_it 0
  690. foreach word $text {
  691. set w [string trimleft $word ":@+"]
  692. foreach ex $black(exceptchannels) {
  693. if {[string match -nocase $ex $w] || [string match -nocase $w $ex]} {
  694. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  695. if {$position > -1} {
  696. set text [lreplace $text $position $position]
  697. }
  698. }
  699. }
  700. }
  701. set file [open $black(add_file) r]
  702. set size [file size $black(add_file)]
  703. set data [split [read $file $size] \n]
  704. close $file
  705. foreach line $data {
  706. if {$line != ""} {
  707. set channel [lindex [split $line] 0]
  708. set getype [lindex [split $line] 1]
  709. set badchan [lindex [split $line] 3]
  710. if {[string equal -nocase "BADCHAN" $getype] && [regexp {^[+]} $badchan]} {
  711. if {[string equal -nocase $channel $chan] } {
  712. set badchan [string map {"+" ""} $badchan]
  713. foreach word $text {
  714. set w [string trimleft $word ":@+"]
  715. if {[string match -nocase $badchan $w] || [string match -nocase $w $badchan]} {
  716. set position [lsearch -exact [string tolower $text] [string tolower $word]]
  717. if {$position > -1} {
  718. set text [lreplace $text $position $position]
  719. }
  720. }
  721. }
  722. }
  723. }
  724. }
  725. }
  726. return $text
  727. }
  728. ##############
  729. #########################################################################
  730. ## END ##
  731. #########################################################################