BT.BadChan.tcl 16 KB

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