BT.BanCmds.tcl 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800
  1. #########################################################################
  2. ## BlackTools - The Ultimate Channel Control Script ##
  3. ## One TCL. One smart Eggdrop ##
  4. #########################################################################
  5. ############################ BANCMDS 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. ################################ Commands ###################################
  16. ################################ troll #####################################
  17. proc trollpublic {nick host hand chan arg} {
  18. global botnick black lastbind
  19. set tr [lindex [split $arg] 0]
  20. set chan1 "$chan"
  21. set type "0"
  22. if {[regexp {^[&#]} $tr] && [matchattr $hand nmo|MAO $tr]} {
  23. set chan "$tr"
  24. set tr [lindex [split $arg] 1]
  25. }
  26. set return [blacktools:mychar $lastbind $hand]
  27. if {$return == "0"} {
  28. return
  29. }
  30. foreach c [channels] {
  31. set backchan [join [setting:get $c backchan]]
  32. if {[string match -nocase $chan $backchan]} {
  33. set chan "$c"
  34. }
  35. }
  36. userhost:act $tr $nick $hand $host $chan $chan1 $type "1440" "troll" "" "0"
  37. }
  38. ################################## vr #######################################
  39. proc vrpublic {nick host hand chan arg} {
  40. global botnick black lastbind
  41. set vr [lindex [split $arg] 0]
  42. set chan1 "$chan"
  43. set type "0"
  44. if {[regexp {^[&#]} $vr] && [matchattr $hand nmo|MAO $vr]} {
  45. set chan "$vr"
  46. set vr [lindex [split $arg] 1]
  47. }
  48. set return [blacktools:mychar $lastbind $hand]
  49. if {$return == "0"} {
  50. return
  51. }
  52. foreach c [channels] {
  53. set backchan [join [setting:get $c backchan]]
  54. if {[string match -nocase $chan $backchan]} {
  55. set chan "$c"
  56. }
  57. }
  58. userhost:act $vr $nick $hand $host $chan $chan1 $type $black(vr:bantime) "vr" "" "0"
  59. }
  60. ################################# bot #####################################
  61. proc botpublic {nick host hand chan arg} {
  62. global botnick black lastbind
  63. set bot [lindex [split $arg] 0]
  64. set type 0
  65. set chan1 "$chan"
  66. if {[regexp {^[&#]} $bot] && [matchattr $hand nmo|MAO $bot]} {
  67. set chan "$bot"
  68. set bot [lindex [split $arg] 1]
  69. }
  70. set return [blacktools:mychar $lastbind $hand]
  71. if {$return == "0"} {
  72. return
  73. }
  74. foreach c [channels] {
  75. set backchan [join [setting:get $c backchan]]
  76. if {[string match -nocase $chan $backchan]} {
  77. set chan "$c"
  78. }
  79. }
  80. userhost:act $bot $nick "$hand:bot" $host $chan $chan1 $type $black(bot:bantime) "bot" "" "0"
  81. }
  82. #################################### n #################################
  83. proc npublic {nick host hand chan arg} {
  84. global botnick black lastbind
  85. set badnick [lindex [split $arg] 0]
  86. set type 0
  87. set chan1 "$chan"
  88. set return [blacktools:mychar $lastbind $hand]
  89. if {$return == "0"} {
  90. return
  91. }
  92. foreach c [channels] {
  93. set backchan [join [setting:get $c backchan]]
  94. set nextbackchan [join [setting:get $c next-backchan]]
  95. if {[string match -nocase $chan $backchan]} {
  96. set chan "$c"
  97. } else {
  98. if {[string match -nocase $chan $nextbackchan]} {
  99. if {[setting:get $c nextshortcmd]} {
  100. set chan "$c"
  101. }
  102. }
  103. }
  104. }
  105. if {[setting:get $chan nextshortcmd]} {
  106. nextpublic:process $nick $host $hand $chan $chan1 $badnick
  107. return
  108. }
  109. if {[regexp {^[&#]} $badnick] && [matchattr $hand nmo|MAO $badnick]} {
  110. set chan "$badnick"
  111. set badnick [lindex [split $arg] 1]
  112. }
  113. if {[regexp {\*} $badnick]} {
  114. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "n"
  115. return
  116. }
  117. if {$badnick == ""} {
  118. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "n"
  119. return
  120. }
  121. bancmds:process $badnick $badnick $nick $hand $host $chan $chan1 $type $black(n:bantime) "n" "" "0"
  122. }
  123. ################################## dr #######################################
  124. proc drpublic {nick host hand chan arg} {
  125. global botnick black lastbind
  126. set drone [lindex [split $arg] 0]
  127. set chan1 "$chan"
  128. set type "0"
  129. if {[regexp {^[&#]} $drone] && [matchattr $hand nmo|MAO $drone]} {
  130. set chan "$drone"
  131. set drone [lindex [split $arg] 1]
  132. }
  133. set return [blacktools:mychar $lastbind $hand]
  134. if {$return == "0"} {
  135. return
  136. }
  137. foreach c [channels] {
  138. set backchan [join [setting:get $c backchan]]
  139. if {[string match -nocase $chan $backchan]} {
  140. set chan "$c"
  141. }
  142. }
  143. userhost:act $drone $nick $hand $host $chan $chan1 $type $black(dr:bantime) "dr" "" "0"
  144. }
  145. ################################## id #################################
  146. proc idpublic {nick host hand chan arg} {
  147. global botnick black lastbind
  148. set badident [lindex [split $arg] 0]
  149. set type 0
  150. set chan1 "$chan"
  151. if {[regexp {^[&#]} $badident] && [matchattr $hand nmo|MAO $badident]} {
  152. set chan "$badident"
  153. set badident [lindex [split $arg] 1]
  154. }
  155. set return [blacktools:mychar $lastbind $hand]
  156. if {$return == "0"} {
  157. return
  158. }
  159. foreach c [channels] {
  160. set backchan [join [setting:get $c backchan]]
  161. if {[string match -nocase $chan $backchan]} {
  162. set chan "$c"
  163. }
  164. }
  165. userhost:act $badident $nick $hand $host $chan $chan1 $type $black(id:bantime) "id" "" "0"
  166. }
  167. ############################### spam ##################################
  168. proc spampublic {nick host hand chan arg} {
  169. global botnick black lastbind
  170. set spammer [lindex [split $arg] 0]
  171. set chan1 "$chan"
  172. set type 0
  173. set mask [lindex [split $arg] 0]
  174. set handle [nick2hand $spammer]
  175. if {[regexp {^[&#]} $spammer] && [matchattr $hand nmo|MAO $spammer]} {
  176. set chan "$spammer"
  177. set spammer [lindex [split $arg] 1]
  178. set mask [lindex [split $arg] 1]
  179. }
  180. set return [blacktools:mychar $lastbind $hand]
  181. if {$return == "0"} {
  182. return
  183. }
  184. foreach c [channels] {
  185. set backchan [join [setting:get $c backchan]]
  186. if {[string match -nocase $chan $backchan]} {
  187. set chan "$c"
  188. }
  189. }
  190. userhost:act $spammer $nick $hand $host $chan $chan1 $type $black(spam:bantime) "spam" "" "0"
  191. }
  192. ################################## bw #################################
  193. proc bwpublic {nick host hand chan arg} {
  194. global botnick black lastbind
  195. set badw [lindex [split $arg] 0]
  196. set type 0
  197. set chan1 "$chan"
  198. if {[regexp {^[&#]} $badw] && [matchattr $hand nmo|MAO $badw]} {
  199. set chan "$badw"
  200. set badw [lindex [split $arg] 1]
  201. }
  202. set return [blacktools:mychar $lastbind $hand]
  203. if {$return == "0"} {
  204. return
  205. }
  206. foreach c [channels] {
  207. set backchan [join [setting:get $c backchan]]
  208. if {[string match -nocase $chan $backchan]} {
  209. set chan "$c"
  210. }
  211. }
  212. userhost:act $badw $nick $hand $host $chan $chan1 $type $black(bw:bantime) "bw" "" "0"
  213. }
  214. ############################### black #################################
  215. proc blackpublic {nick host hand chan arg} {
  216. global botnick black lastbind
  217. set blackb [lindex [split $arg] 0]
  218. set reason [join [lrange [split $arg] 1 end]]
  219. set type 0
  220. set chan1 "$chan"
  221. if {[regexp {^[&#]} $blackb] && [matchattr $hand nmo|MA $blackb]} {
  222. set chan "$blackb"
  223. set blackb [lindex [split $arg] 1]
  224. set reason [join [lrange [split $arg] 2 end]]
  225. }
  226. set return [blacktools:mychar $lastbind $hand]
  227. if {$return == "0"} {
  228. return
  229. }
  230. foreach c [channels] {
  231. set backchan [join [setting:get $c backchan]]
  232. if {[string match -nocase $chan $backchan]} {
  233. set chan "$c"
  234. }
  235. }
  236. userhost:act $blackb $nick $hand $host $chan $chan1 $type "0" "black" $reason "0"
  237. }
  238. ################################ b #####################################
  239. proc bpublic {nick host hand chan arg} {
  240. global botnick black lastbind
  241. set type 0
  242. set gl 0
  243. set link 0
  244. set chan1 "$chan"
  245. set level ""
  246. set b [lindex [split $arg] 0]
  247. set tm [lindex [split $arg] 1]
  248. set global [lindex [split $arg] 2]
  249. set reason [join [lrange [split $arg] 3 end]]
  250. set return [blacktools:mychar $lastbind $hand]
  251. if {$return == "0"} {
  252. return
  253. }
  254. set return_time [time_return_minute $tm]
  255. if {$return_time == "-1"} {
  256. set global [lindex [split $arg] 1]
  257. set reason [join [lrange [split $arg] 2 end]]
  258. }
  259. if {[regexp {^[&#]} $b] && [matchattr $hand nmo|MAO $b]} {
  260. set chan $b
  261. set b [lindex [split $arg] 1]
  262. set tm [lindex [split $arg] 2]
  263. set global [lindex [split $arg] 3]
  264. set reason [join [lrange [split $arg] 4 end]]
  265. set return [blacktools:mychar $lastbind $hand]
  266. set return_time [time_return_minute $tm]
  267. if {$return_time == "-1"} {
  268. set global [lindex [split $arg] 2]
  269. set reason [join [lrange [split $arg] 3 end]]
  270. }
  271. if {[regexp {^[-]} $tm]} {
  272. set level [blacktools:check:levelban $hand $chan $tm]
  273. set reason [join [lrange [split $arg] 4 end]]
  274. set tm [lindex [split $arg] 3]
  275. set return_time [time_return_minute $tm]
  276. if {$return_time == "-1"} {
  277. set tm [lindex [split $arg] 2]
  278. set reason [join [lrange [split $arg] 3 end]]
  279. }
  280. } elseif {[string equal -nocase "$global" "global"] && [matchattr $hand nm]} {
  281. set gl 1
  282. set tm [lindex [split $arg] 2]
  283. set reason [join [lrange [split $arg] 4 end]]
  284. set return_time [time_return_minute $tm]
  285. if {$return_time == "-1"} {
  286. set reason [join [lrange [split $arg] 3 end]]
  287. }
  288. } else {
  289. if {$return_time == "-1"} {
  290. set reason [join [lrange [split $arg] 2 end]]
  291. } else {
  292. set reason [join [lrange [split $arg] 3 end]]
  293. }
  294. }
  295. } else {
  296. if {[regexp {^[-]} $tm]} {
  297. set level [blacktools:check:levelban $hand $chan $tm]
  298. set reason [join [lrange [split $arg] 3 end]]
  299. set tm [lindex [split $arg] 2]
  300. set return_time [time_return_minute $tm]
  301. if {$return_time == "-1"} {
  302. set tm [lindex [split $arg] 1]
  303. set reason [join [lrange [split $arg] 2 end]]
  304. }
  305. } elseif {[string equal -nocase "$global" "global"] && [matchattr $hand nm]} {
  306. set gl 1
  307. set tm [lindex [split $arg] 1]
  308. set reason [join [lrange [split $arg] 3 end]]
  309. set return_time [time_return_minute $tm]
  310. if {$return_time == "-1"} {
  311. set reason [join [lrange [split $arg] 2 end]]
  312. }
  313. } elseif {[string equal -nocase "$global" "link"] && [matchattr $hand nm]} {
  314. set link 1
  315. set tm [lindex [split $arg] 1]
  316. set reason [join [lrange [split $arg] 3 end]]
  317. set return_time [time_return_minute $tm]
  318. if {$return_time == "-1"} {
  319. set reason [join [lrange [split $arg] 2 end]]
  320. }
  321. } else {
  322. if {$return_time == "-1"} {
  323. set reason [join [lrange [split $arg] 1 end]]
  324. } else {
  325. set reason [join [lrange [split $arg] 2 end]]
  326. }
  327. }
  328. }
  329. foreach c [channels] {
  330. set backchan [join [setting:get $c backchan]]
  331. set nextbackchan [join [setting:get $c next-backchan]]
  332. if {[string match -nocase $chan $backchan]} {
  333. set chan "$c"
  334. } else {
  335. if {[string match -nocase $chan $nextbackchan]} {
  336. if {[setting:get $c nextshortcmd]} {
  337. set chan "$c"
  338. }
  339. }
  340. }
  341. }
  342. if {[setting:get $chan nextshortcmd]} {
  343. noidlepublic:process $nick $host $hand $chan $chan1 $b 0
  344. return
  345. }
  346. if {($return_time > "20160" || $return_time == "0") && [matchattr $hand -|OS $chan]} {
  347. blacktools:tell $nick $host $hand $chan $chan1 b.6 none
  348. return
  349. }
  350. if {$return_time == "-1"} {
  351. set return_time $black(b:bantime)
  352. }
  353. if {[llength $level] > "1"} {
  354. blacktools:tell $nick $host $hand $chan $chan1 gl.invalidlevel [string map {"0" ""} $level]
  355. return
  356. }
  357. if {$level != ""} {
  358. userhost:act $b $nick "$hand:$level" $host $chan $chan1 $type $return_time "b" $reason $gl
  359. } else {
  360. if {$link == "1"} {
  361. foreach c [link:chan:get $chan] {
  362. userhost:act $b $nick "$hand" $host $c $chan1 $type $return_time "b" $reason "2"
  363. }
  364. userhost:act $b $nick "$hand" $host $chan $chan1 $type $return_time "b" $reason "2"
  365. return
  366. }
  367. userhost:act $b $nick "$hand" $host $chan $chan1 $type $return_time "b" $reason $gl
  368. }
  369. }
  370. ############################### stick #################################
  371. proc stickpublic {nick host hand chan arg} {
  372. global botnick black lastbind
  373. set stickb [lindex [split $arg] 0]
  374. set tm [lindex [split $arg] 1]
  375. set return [blacktools:mychar $lastbind $hand]
  376. if {$return == "0"} {
  377. return
  378. }
  379. set return_time [time_return_minute $tm]
  380. if {$return_time == "-1"} {
  381. set reason [join [lrange [split $arg] 1 end]]
  382. } else {
  383. set tm [lindex [split $arg] 2]
  384. set reason [join [lrange [split $arg] 2 end]]
  385. }
  386. set type 0
  387. set chan1 "$chan"
  388. if {[regexp {^[&#]} $stickb] && [matchattr $hand nmo|MA $stickb]} {
  389. set chan "$stickb"
  390. set stickb [lindex [split $arg] 1]
  391. set tm [lindex [split $arg] 2]
  392. set return_time [time_return_minute $tm]
  393. if {$return_time == "-1"} {
  394. set reason [join [lrange [split $arg] 2 end]]
  395. } else {
  396. set tm [lindex [split $arg] 2]
  397. set reason [join [lrange [split $arg] 2 end]]
  398. }
  399. }
  400. foreach c [channels] {
  401. set backchan [join [setting:get $c backchan]]
  402. if {[string match -nocase $chan $backchan]} {
  403. set chan "$c"
  404. }
  405. }
  406. if {($return_time > "20160" || $return_time == "0") && [matchattr $hand -|OS $stickb]} {
  407. blacktools:tell $nick $host $hand $chan $chan1 b.6 none
  408. return
  409. }
  410. if {$return_time == "-1"} {
  411. set return_time $black(stick:bantime)
  412. }
  413. userhost:act $stickb $nick $hand $host $chan $chan1 $type $return_time "stick" $reason "0"
  414. }
  415. ################################ ub ###################################
  416. proc ubpublic {nick host hand chan arg} {
  417. global botnick black lastbind
  418. set ban [lindex [split $arg] 0]
  419. set why [lindex [split $arg] 1]
  420. set type 0
  421. set chan1 "$chan"
  422. if {[regexp {^[&#]} $ban] && [matchattr $hand nmo|MAO $ban]} {
  423. set chan "$ban"
  424. set ban [lindex [split $arg] 1]
  425. set why [lindex [split $arg] 2]
  426. }
  427. set return [blacktools:mychar $lastbind $hand]
  428. if {$return == "0"} {
  429. return
  430. }
  431. foreach c [channels] {
  432. set backchan [join [setting:get $c backchan]]
  433. if {[string match -nocase $chan $backchan]} {
  434. set chan "$c"
  435. }
  436. }
  437. if {[regexp {^[0-9]} $ban]} {
  438. set cmd "ub:id"
  439. } else {
  440. set cmd "ub"
  441. }
  442. if {[string equal -nocase $why "global"] && [matchattr $hand nm]} {
  443. ub:process $ban $ban $nick $hand $host $chan $chan1 $type "1" $cmd "" ""
  444. } elseif {[string equal -nocase $why "link"] && [matchattr $hand nm]} {
  445. ub:process $ban $ban $nick $hand $host $chan $chan1 $type "" "ub" "" "1"
  446. } else {
  447. ub:process $ban $ban $nick $hand $host $chan $chan1 $type "" $cmd "" ""
  448. }
  449. }
  450. proc ub:link {mask} {
  451. global black
  452. set chanban 0
  453. set chanlink 0
  454. foreach chan [link:get] {
  455. set chanlink [expr $chanlink + 1]
  456. foreach b [blacktools:banlist $chan] {
  457. set bhost [lindex [split $b] 3]
  458. set real_bhost [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $bhost]
  459. if {[string match -nocase $mask $real_bhost] || [string match -nocase $real_bhost $mask]} {
  460. set chanban [expr $chanban + 1]
  461. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  462. putserv "PRIVMSG $black(chanserv) :unban $chan $bhost"
  463. } else {
  464. pushmode $chan -b $bhost
  465. }
  466. blacktools:delban $real_bhost $chan "0" "0"
  467. }
  468. }
  469. }
  470. return "$chanlink $chanban"
  471. }
  472. proc ub:process {user mask nick hand host chan chan1 type gl cmd whois link} {
  473. global black
  474. set split_cmd [split $cmd ":"]
  475. set id [lindex $split_cmd 1]
  476. set cmd [lindex $split_cmd 0]
  477. set cmd_status [btcmd:status $chan $hand "$cmd" 0]
  478. if {$cmd_status == "1"} {
  479. return
  480. }
  481. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  482. return
  483. }
  484. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  485. return
  486. }
  487. if {$user == ""} {
  488. switch $type {
  489. 0 {
  490. blacktools:tell $nick $host $hand $chan $chan1 gl.instr $cmd
  491. }
  492. 1 {
  493. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick $cmd
  494. }
  495. 2 {
  496. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv $cmd
  497. }
  498. }
  499. return
  500. }
  501. if {![validchan $chan] && $link != "1" && $gl != "1"} {
  502. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  503. return
  504. }
  505. if {$link != "1" && $gl != "1"} {
  506. if {![botisop $chan] && ![setting:get $chan xonly]} {
  507. blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
  508. return
  509. }
  510. }
  511. set show_mask $mask
  512. set total_b 0
  513. set rem_b 0
  514. if {![regexp {\*} $mask] && $whois != "1" && $id != "id"} {
  515. putserv "USERHOST :$user"
  516. bind RAW - 302 ub:get:host
  517. set ::uuser $user
  518. set ::unick $nick
  519. set ::uhand $hand
  520. set ::uhost $host
  521. set ::uchan $chan
  522. set ::uchan1 $chan1
  523. set ::utype $type
  524. set ::ugl $gl
  525. set ::ucmd $cmd
  526. set ::ulink $link
  527. return
  528. }
  529. if {$link == "1"} {
  530. set return [ub:link $mask]
  531. set chanlink [lindex $return 0]
  532. set chanban [lindex $return 1]
  533. blacktools:tell $nick $host $hand $chan $chan1 ub.7 "$chanban $chanlink"
  534. return
  535. }
  536. if {$gl != "1"} {
  537. if {[onchan $user $chan]} {
  538. set mask "$user![getchanhost $user $chan]"
  539. }
  540. }
  541. if {$gl != "1"} {
  542. if {(($mask == "*") || ($mask == "*!*@*")) && [matchattr $hand -|OA $chan]} {
  543. blacktools:tell $nick $host $hand $chan $chan1 ub.5 none
  544. return
  545. }
  546. foreach b [blacktools:banlist $chan] {
  547. set bhost [lindex [split $b] 3]
  548. set real_bhost [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $bhost]
  549. set btime [lindex [split $b] 5]
  550. set num [lindex [split $b] 1]
  551. if {[string match -nocase $mask $real_bhost] || [string match -nocase $real_bhost $mask] || [string match -nocase $mask $num]} {
  552. set bywho [lindex [split $b] 4]
  553. set read_tr [lindex [split $b] 7]
  554. set total_b [expr $total_b + 1]
  555. set split_bywho [split $bywho ":"]
  556. set level [lindex $split_bywho 1]
  557. set check [blacktools:check:levelub $hand $chan $level]
  558. if {$check == "-1"} {
  559. blacktools:tell $nick $host $hand $chan $chan1 gl.nounban $bhost
  560. continue
  561. }
  562. if {$btime == "0" && [matchattr $hand -|O $chan]} {
  563. continue
  564. }
  565. if {([blacktools:sticky $mask $chan] == "1") && [matchattr $hand -|OA $chan]} {
  566. continue
  567. }
  568. set rem_b [expr $rem_b + 1]
  569. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  570. putserv "PRIVMSG $black(chanserv) :unban $chan $bhost"
  571. } else {
  572. pushmode $chan -b $bhost
  573. }
  574. blacktools:delban $real_bhost $chan "0" "0"
  575. if {$read_tr == "2"} {
  576. troll:del $real_bhost $chan
  577. }
  578. continue
  579. }
  580. }
  581. foreach b [banlist $chan] {
  582. set bhost [lindex $b 0]
  583. set btime [lindex $b 2]
  584. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  585. set total_b [expr $total_b + 1]
  586. if {$btime == "0" && [matchattr $hand -|O $chan]} {
  587. continue
  588. }
  589. if {[isbansticky $bhost] && [matchattr $hand -|OA $chan]} {
  590. continue
  591. }
  592. set rem_b [expr $rem_b + 1]
  593. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  594. putserv "PRIVMSG $black(chanserv) :unban $chan $bhost"
  595. } else {
  596. putserv "MODE $chan -b $bhost"
  597. }
  598. killchanban $chan $bhost
  599. }
  600. }
  601. if {$total_b == "0"} {
  602. if {[ischanban $mask $chan]} {
  603. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  604. putserv "PRIVMSG $black(chanserv) :unban $chan $mask"
  605. } else {
  606. putserv "MODE $chan -b $mask"
  607. }
  608. blacktools:tell $nick $host $hand $chan $chan1 ub.6 none
  609. return
  610. }
  611. if {$id == "id"} {
  612. blacktools:tell $nick $host $hand $chan $chan1 ub.8 $show_mask
  613. } else {
  614. blacktools:tell $nick $host $hand $chan $chan1 ub.1 $show_mask
  615. }
  616. } else {
  617. if {$id == "id"} {
  618. blacktools:tell $nick $host $hand $chan $chan1 ub.9 "$rem_b $total_b $show_mask"
  619. } else {
  620. blacktools:tell $nick $host $hand $chan $chan1 ub.2 "$rem_b $total_b $show_mask"
  621. }
  622. }
  623. } else {
  624. foreach b [blacktools:banlist:gl] {
  625. set bhost [lindex [split $b] 3]
  626. set num [lindex [split $b] 1]
  627. set real_bhost [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $bhost]
  628. set btime [lindex [split $b] 4]
  629. if {[string match -nocase $mask $real_bhost] || [string match -nocase $real_bhost $mask] || [string match -nocase $mask $num]} {
  630. set total_b [expr $total_b + 1]
  631. set rem_b [expr $rem_b + 1]
  632. blacktools:delban $real_bhost $chan "1" "0"
  633. if {$gl == "1"} {
  634. blacktools:ub:global $real_bhost [channels] 0
  635. }
  636. continue
  637. }
  638. }
  639. foreach b [banlist] {
  640. set bhost [lindex $b 0]
  641. set btime [lindex $b 2]
  642. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  643. set total_b [expr $total_b + 1]
  644. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  645. putserv "PRIVMSG $black(chanserv) :unban $chan $bhost"
  646. } else {
  647. putserv "MODE $chan -b $bhost"
  648. }
  649. killban $bhost
  650. }
  651. }
  652. if {$total_b == "0"} {
  653. if {$id == "id"} {
  654. blacktools:tell $nick $host $hand $chan $chan1 ub.11 $show_mask
  655. } else {
  656. blacktools:tell $nick $host $hand $chan $chan1 ub.3 $show_mask
  657. }
  658. } else {
  659. if {$id == "id"} {
  660. blacktools:tell $nick $host $hand $chan $chan1 ub.10 "$total_b $show_mask"
  661. } else {
  662. blacktools:tell $nick $host $hand $chan $chan1 ub.4 "$total_b $show_mask"
  663. }
  664. }
  665. }
  666. }
  667. proc blacktools:ub:global {bhost channels num} {
  668. global black
  669. set chan [lindex $channels $num]
  670. set incnum [expr $num + 1]
  671. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  672. putserv "PRIVMSG $black(chanserv) :unban $chan $bhost"
  673. } else {
  674. putserv "MODE $chan -b $bhost"
  675. }
  676. if {[lindex $channels $incnum] != ""} {
  677. blacktools:ub:global $bhost $channels $incnum
  678. }
  679. }
  680. ################################ sb ###################################
  681. proc sbpublic {nick host hand chan arg} {
  682. global botnick black lastbind
  683. set bhost [lindex [split $arg] 0]
  684. set what [lindex [split $arg] 1]
  685. set chan1 "$chan"
  686. set type 0
  687. if {[regexp {^[&#]} $bhost] && [matchattr $hand nmo|AOM $bhost]} {
  688. set chan "$bhost"
  689. set bhost [lindex [split $arg] 1]
  690. set what [lindex [split $arg] 2]
  691. }
  692. set return [blacktools:mychar $lastbind $hand]
  693. if {$return == "0"} {
  694. return
  695. }
  696. foreach c [channels] {
  697. set backchan [join [setting:get $c backchan]]
  698. if {[string match -nocase $chan $backchan]} {
  699. set chan "$c"
  700. }
  701. }
  702. if {$bhost != ""} {
  703. if {[regexp {^[0-9]} $bhost]} {
  704. sb:process $bhost $what $nick $hand $host $chan $chan1 $type "sb" "2"
  705. return
  706. }
  707. if {![validchan $chan]} {
  708. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  709. return
  710. }
  711. if {[onchan $bhost $chan]} {
  712. set bhost "$bhost![getchanhost $bhost $chan]"
  713. sb:process $bhost $what $nick $hand $host $chan $chan1 $type "sb" "1"
  714. return
  715. }
  716. if {[regexp {\*} $bhost]} {
  717. sb:process $bhost $what $nick $hand $host $chan $chan1 $type "sb" "1"
  718. return
  719. }
  720. sb:process $bhost $what $nick $hand $host $chan $chan1 $type "sb" ""
  721. } else { sb:process $bhost $what $nick $hand $host $chan $chan1 $type "sb" ""}
  722. }
  723. proc sb:process {bhost what nick hand host chan chan1 type cmd entry} {
  724. global botnick black tcldir
  725. set cmd_status [btcmd:status $chan $hand "sb" 0]
  726. if {$cmd_status == "1"} {
  727. return
  728. }
  729. set gl_bans 0
  730. set local_bans 0
  731. set total_bans 0
  732. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  733. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  734. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  735. return
  736. }
  737. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  738. return
  739. }
  740. if {$bhost == ""} {
  741. switch $type {
  742. 0 {
  743. blacktools:tell $nick $host $hand $chan $chan1 gl.instr $cmd
  744. }
  745. 1 {
  746. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick $cmd
  747. }
  748. 2 {
  749. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv $cmd
  750. }
  751. }
  752. return 0
  753. }
  754. if {$bhost == "-"} {
  755. blacktools:tell $nick $host $hand $chan $chan1 gl.hostnotexist "none"
  756. return
  757. }
  758. if {($bhost != "") && ($entry == "")} {
  759. putserv "USERHOST :$bhost"
  760. bind RAW - 302 sb:get:host
  761. set ::suser $bhost
  762. set ::snick $nick
  763. set ::shand $hand
  764. set ::shost $host
  765. set ::schan $chan
  766. set ::schan1 $chan1
  767. set ::stype $type
  768. set ::scmd $cmd
  769. return
  770. }
  771. if {[matchattr $hand mn]} {
  772. sb:search $nick $host $hand $chan $chan1 $bhost "1" $entry
  773. return
  774. }
  775. sb:search $nick $host $hand $chan $chan1 $bhost "0" $entry
  776. }
  777. proc sb:search {nick host hand chan chan1 bhost gl entry} {
  778. global black
  779. set show_bhost $bhost
  780. set gl_bans 0
  781. set local_bans 0
  782. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  783. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  784. foreach b [blacktools:banlist $chan] {
  785. set mask [lindex [split $b] 3]
  786. set id [lindex [split $b] 1]
  787. set real_mask [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $mask]
  788. if {[string match -nocase $real_mask $bhost] || [string match -nocase $bhost $real_mask] || $bhost == $id} {
  789. set local_bans [expr $local_bans + 1]
  790. }
  791. }
  792. if {$gl == "1"} {
  793. foreach b [blacktools:banlist:gl] {
  794. set mask [lindex [split $b] 3]
  795. set id [lindex [split $b] 1]
  796. set real_mask [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $mask]
  797. if {[string match -nocase $real_mask $bhost] || [string match -nocase $bhost $real_mask] || $bhost == $id} {
  798. set gl_bans [expr $gl_bans + 1]
  799. }
  800. }
  801. }
  802. if {$gl_bans > "0"} {
  803. foreach b [blacktools:banlist:gl] {
  804. set mask [lindex [split $b] 3]
  805. set id [lindex [split $b] 1]
  806. set real_mask [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $mask]
  807. if {[string match -nocase $real_mask $bhost] || [string match -nocase $bhost $real_mask] || $bhost == $id} {
  808. set mask [lindex [split $b] 3]
  809. set id [lindex [split $b] 1]
  810. set expire [lindex [split $b] 5]
  811. set created [lindex [split $b] 6]
  812. set created [clock format $created -format %D-%H:%M:%S]
  813. set breason [lrange [split $b] 9 end]
  814. set breason [join [encoding convertfrom utf-8 $breason]]
  815. set bywho [lindex [split $b] 4]
  816. if {$expire != "0"} {
  817. set expire [return_time_2 $getlang [expr $expire - [unixtime]]]
  818. blacktools:tell $nick $host $hand $chan $chan1 sb.3 "$id $mask $bywho $created $expire $breason"
  819. } else {
  820. set expire $black(say.$getlang.banlist.13)
  821. blacktools:tell $nick $host $hand $chan $chan1 sb.10 "$id $mask $bywho $created $expire $breason"
  822. }
  823. }
  824. }
  825. }
  826. if {$local_bans > "0"} {
  827. foreach b [blacktools:banlist $chan] {
  828. set mask [lindex [split $b] 3]
  829. set id [lindex [split $b] 1]
  830. set real_mask [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $mask]
  831. if {[string match -nocase $real_mask $bhost] || [string match -nocase $bhost $real_mask] || $bhost == $id} {
  832. set mask [lindex [split $b] 3]
  833. set id [lindex [split $b] 1]
  834. set expire [lindex [split $b] 5]
  835. set created [lindex [split $b] 6]
  836. set created [clock format $created -format %D-%H:%M:%S]
  837. set breason [lrange [split $b] 9 end]
  838. set breason [join [encoding convertfrom utf-8 $breason]]
  839. set bywho [lindex [split $b] 4]
  840. set split_bywho [split $bywho ":"]
  841. set handle [lindex $split_bywho 0]
  842. set type [lindex $split_bywho 1]
  843. if {$type != "" && $type != "bot"} {
  844. set bywho "$handle\([encoding convertfrom utf-8 $type]\)"
  845. } else {
  846. set bywho $handle
  847. }
  848. if {$expire != "0"} {
  849. set expire [return_time_2 $getlang [expr $expire - [unixtime]]]
  850. blacktools:tell $nick $host $hand $chan $chan1 sb.4 "$id $mask $bywho $created $expire $breason"
  851. } else {
  852. set expire $black(say.$getlang.banlist.13)
  853. blacktools:tell $nick $host $hand $chan $chan1 sb.9 "$id $mask $bywho $created $expire $breason"
  854. }
  855. }
  856. }
  857. }
  858. if {[expr $local_bans + $gl_bans] > 0} {
  859. return
  860. } else {
  861. set gl_bans 0
  862. set local_bans 0
  863. }
  864. foreach b [banlist $chan] {
  865. set mask [lindex $b 0]
  866. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  867. set local_bans [expr $local_bans + 1]
  868. }
  869. }
  870. if {$gl == "1"} {
  871. foreach b [banlist] {
  872. set mask [lindex $b 0]
  873. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  874. set gl_bans [expr $gl_bans + 1]
  875. }
  876. }
  877. if {[expr $local_bans + $gl_bans] == "0"} {
  878. if {$entry == "2"} {
  879. blacktools:tell $nick $host $hand $chan $chan1 sb.11 $show_bhost
  880. } else {
  881. blacktools:tell $nick $host $hand $chan $chan1 sb.2 $show_bhost
  882. }
  883. return
  884. }
  885. if {[expr $local_bans + $gl_bans] > 10} {
  886. blacktools:tell $nick $host $hand $chan $chan1 sb.5 "none"
  887. return
  888. }
  889. } else {
  890. if {$local_bans == "0"} {
  891. if {$entry == "2"} {
  892. blacktools:tell $nick $host $hand $chan $chan1 sb.11 $show_bhost
  893. } else {
  894. blacktools:tell $nick $host $hand $chan $chan1 sb.2 $show_bhost
  895. }
  896. return
  897. }
  898. if {$local_bans > 10} {
  899. blacktools:tell $nick $host $hand $chan $chan1 sb.5 "none"
  900. return
  901. }
  902. }
  903. if {$gl_bans > "0"} {
  904. foreach b [banlist] {
  905. set mask [lindex $b 0]
  906. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  907. set mask [lindex $b 0]
  908. set expire [lindex $b 2]
  909. set created [lindex $b 3]
  910. set breason [split [lindex $b 1]]
  911. set bywho [split [lindex $b 5]]
  912. set created [clock format $created -format %D-%H:%M:%S]
  913. if {$expire != "0"} {
  914. set expire [return_time_2 $getlang [expr $expire - [unixtime]]]
  915. blacktools:tell $nick $host $hand $chan $chan1 sb.3 "- $mask $bywho $created $expire $breason"
  916. } else {
  917. set expire "NEVER"
  918. blacktools:tell $nick $host $hand $chan $chan1 sb.10 "- $mask $bywho $created $expire $breason"
  919. }
  920. }
  921. }
  922. }
  923. if {$local_bans > "0"} {
  924. foreach b [banlist $chan] {
  925. set mask [lindex $b 0]
  926. if {[string match -nocase $mask $bhost] || [string match -nocase $bhost $mask]} {
  927. set mask [lindex $b 0]
  928. set expire [lindex $b 2]
  929. set created [lindex $b 3]
  930. set breason [split [lindex $b 1]]
  931. set bywho [split [lindex $b 5]]
  932. set created [clock format $created -format %D-%H:%M:%S]
  933. if {$expire != "0"} {
  934. set expire [return_time_2 $getlang [expr $expire - [unixtime]]]
  935. blacktools:tell $nick $host $hand $chan $chan1 sb.4 "- $mask $bywho $created $expire $breason"
  936. } else {
  937. set expire "NEVER"
  938. blacktools:tell $nick $host $hand $chan $chan1 sb.9 "- $mask $bywho $created $expire $breason"
  939. }
  940. }
  941. }
  942. }
  943. }
  944. ################################### banlist ###################################
  945. proc banlistpublic {nick host hand chan arg} {
  946. global botnick black lastbind
  947. set user [lindex [split $arg] 0]
  948. set next [lindex [split $arg] 1]
  949. set type 0
  950. set chan1 "$chan"
  951. if {[regexp {^[&#]} $user] && [matchattr $hand nmo|MAO $user]} {
  952. set chan "$user"
  953. set user [lindex [split $arg] 1]
  954. set next [lindex [split $arg] 2]
  955. }
  956. set return [blacktools:mychar $lastbind $hand]
  957. if {$return == "0"} {
  958. return
  959. }
  960. foreach c [channels] {
  961. set backchan [join [setting:get $c backchan]]
  962. if {[string match -nocase $chan $backchan]} {
  963. set chan "$c"
  964. }
  965. }
  966. banlist:process $nick $host $hand $chan $chan1 $user $type "banlist" $next
  967. }
  968. proc banlist:process {nick host hand chan chan1 user type cmd next} {
  969. global botnick black
  970. set cmd_status [btcmd:status $chan $hand "banlist" 0]
  971. if {$cmd_status == "1"} {
  972. return
  973. }
  974. set i 0
  975. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  976. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  977. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  978. return
  979. }
  980. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  981. return
  982. }
  983. if {$user == ""} {
  984. switch $type {
  985. 0 {
  986. blacktools:tell $nick $host $hand $chan $chan1 gl.instr $cmd
  987. }
  988. 1 {
  989. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick $cmd
  990. }
  991. 2 {
  992. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv $cmd
  993. }
  994. }
  995. return 0
  996. }
  997. if {[matchattr $hand nm] && [string equal -nocase "global" $user]} {
  998. set gl "1"
  999. banlist:getbans $nick $host $hand $chan $chan1 $user "" $type $next $gl [blacktools:banlist:gl] ""
  1000. return
  1001. }
  1002. if {[string match -nocase "all" $user]} {
  1003. set gl ""
  1004. set user ""
  1005. banlist:getbans $nick $host $hand $chan $chan1 $user "" $type $next $gl [blacktools:banlist $chan] ""
  1006. return
  1007. }
  1008. if {[string match -nocase "other" $user]} {
  1009. set gl ""
  1010. set user ""
  1011. banlist:getbans $nick $host $hand $chan $chan1 $user "" $type $next $gl [banlist $chan] ""
  1012. return
  1013. }
  1014. if {[onchan $user $chan] && ![validuser $user]} {
  1015. set handle $user
  1016. set user [nick2hand $user]
  1017. } else {
  1018. set handle ""
  1019. }
  1020. if {![validuser $user] && (![string equal -nocase "all" $user])} {
  1021. blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
  1022. return
  1023. }
  1024. if {![matchattr $user nmo|OASMN $chan] && (![string equal -nocase "all" $user])} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none
  1025. return
  1026. }
  1027. set gl ""
  1028. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  1029. set file_temp "temp.$timestamp"
  1030. if {![file exists $file_temp]} {
  1031. set file [open $file_temp w]
  1032. close $file
  1033. }
  1034. set file [open $file_temp a]
  1035. foreach b [blacktools:banlist $chan] {
  1036. set bywho [lindex [split $b] 4]
  1037. set split_bywho [split $bywho ":"]
  1038. set handz [join [lindex [split $split_bywho] 0]]
  1039. set type [lindex [split $split_bywho] 1]
  1040. if {[string equal -nocase $handz $user]} {
  1041. set id [lindex [split $b] 1]
  1042. set mask [lindex [split $b] 3]
  1043. set expire [lindex [split $b] 5]
  1044. set created [lindex [split $b] 6]
  1045. set breason [lrange [split $b] 9 end]
  1046. if {$type != ""} {
  1047. puts $file "$id $mask $expire $created $bywho [join $breason]"
  1048. } else {
  1049. puts $file "$id $mask $expire $created $bywho [join $breason]"
  1050. }
  1051. }
  1052. }
  1053. close $file
  1054. set file [open $file_temp r]
  1055. set w [read -nonewline $file]
  1056. close $file
  1057. set data [split $w "\n"]
  1058. banlist:getbans $nick $host $hand $chan $chan1 $user $handle $type $next $gl $data "1"
  1059. file delete $file_temp
  1060. }
  1061. proc banlist:remain {nick hand count chan chan1 type gl user userb prv} {
  1062. global black lastbind botnick
  1063. if {$count == "0"} { return }
  1064. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  1065. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1066. set split_lastbind [split $lastbind ""]
  1067. set charbind [lindex $split_lastbind 0]
  1068. if {[string equal $lastbind "*"]} { set charbind "" }
  1069. if {[string equal -nocase "**" $lastbind]} { set charbind "$botnick " }
  1070. set replace(%char%) $charbind
  1071. set replace(%counter%) $count
  1072. set replace(%user%) $user
  1073. set replace(%chan%) $chan
  1074. if {$gl == "1"} {
  1075. set msg [black:color:set $hand $black(say.$getlang.banlist.3)]
  1076. }
  1077. if {$userb == "1"} {
  1078. set msg [black:color:set $hand $black(say.$getlang.banlist.8)]
  1079. }
  1080. if {$user == ""} {
  1081. set msg [black:color:set $hand $black(say.$getlang.banlist.14)]
  1082. }
  1083. if {$prv == "prv"} {
  1084. set msg [black:color:set $hand $black(say.$getlang.banlist.14)]
  1085. if {$gl == "1"} {
  1086. set msg [black:color:set $hand $black(say.$getlang.banlist.3)]
  1087. }
  1088. putserv "PRIVMSG $nick :[string map [array get replace] $msg]"
  1089. return
  1090. }
  1091. switch $type {
  1092. 0 {
  1093. putserv "NOTICE $nick :[string map [array get replace] $msg]"
  1094. }
  1095. 1 {
  1096. putserv "PRIVMSG $chan1 :[string map [array get replace] $msg]"
  1097. }
  1098. 2 {
  1099. putserv "PRIVMSG $nick :[string map [array get replace] $msg]"
  1100. }
  1101. }
  1102. }
  1103. proc banlist:getbans {nick host hand chan chan1 user handle type next gl banlist userb} {
  1104. global black
  1105. set show_user $user
  1106. set show_handle $handle
  1107. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  1108. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1109. set getmethod [getuser $hand XTRA OUTPUT_TYPE]
  1110. if {$getmethod == ""} { set getmethod "0" }
  1111. if {[string equal -nocase $next "-next"]} {
  1112. if {[info exists black(morebans:$chan:$hand)]} {
  1113. if {$black(morebans:$chan:$hand) >= $black(modul:nr:entries)} {
  1114. for {set i $black(showbans:$chan:$hand)} { $i < [expr $black(showbans:$chan:$hand) + $black(modul:nr:entries)] } { incr i } {
  1115. set current_ban [lindex $banlist $i]
  1116. show:bans $nick $host $hand $chan $chan1 $gl $current_ban $userb
  1117. }
  1118. set black(morebans:$chan:$hand) [expr $black(morebans:$chan:$hand) - $black(modul:nr:entries)]
  1119. banlist:remain $nick $hand $black(morebans:$chan:$hand) $chan $chan1 $getmethod $gl $user $userb $host
  1120. set black(showbans:$chan:$hand) [expr $black(showbans:$chan:$hand) + $black(modul:nr:entries)]
  1121. } else {
  1122. if {$black(morebans:$chan:$hand) < 1} {
  1123. return
  1124. }
  1125. for {set i $black(showbans:$chan:$hand)} { $i <= [expr $black(showbans:$chan:$hand) + $black(morebans:$chan:$hand)]} { incr i } {
  1126. set current_ban [lindex $banlist $i]
  1127. show:bans $nick $host $hand $chan $chan1 $gl $current_ban $userb
  1128. }
  1129. set black(morebans:$chan:$hand) [expr $black(morebans:$chan:$hand) - $black(showbans:$chan:$hand)]
  1130. }
  1131. foreach tmr [utimers] {
  1132. if {[string match -nocase "*banlist:unset:more $chan $hand*" [join [lindex $tmr 1]]]} {
  1133. killutimer [lindex $tmr 2]
  1134. }
  1135. }
  1136. utimer 30 [list banlist:unset:more $chan $hand]
  1137. if {$black(morebans:$chan:$hand) < 1} {
  1138. blacktools:tell $nick $host $hand $chan $chan1 banlist.4 none
  1139. }
  1140. }
  1141. return
  1142. }
  1143. set black(cbanlist:$chan:$hand) [llength $banlist]
  1144. set black(showbans:$chan:$hand) 0
  1145. if {$black(cbanlist:$chan:$hand) > $black(modul:nr:entries)} {
  1146. if {$gl == "1"} {
  1147. blacktools:tell $nick $host $hand $chan $chan1 banlist.2 "$black(cbanlist:$chan:$hand)"
  1148. }
  1149. if {$user == ""} {
  1150. blacktools:tell $nick $host $hand $chan $chan1 banlist.6 "$black(cbanlist:$chan:$hand)"
  1151. }
  1152. if {$userb == "1" && $handle != ""} {
  1153. blacktools:tell $nick $host $hand $chan $chan1 banlist.7 "$black(cbanlist:$chan:$hand) $show_user\($show_handle\)"
  1154. }
  1155. if {$userb == "1" && $handle == ""} {
  1156. blacktools:tell $nick $host $hand $chan $chan1 banlist.7 "$black(cbanlist:$chan:$hand) $show_user"
  1157. }
  1158. set black(morebans:$chan:$hand) [expr $black(cbanlist:$chan:$hand) - $black(modul:nr:entries)]
  1159. for {set i 0} { $i < $black(modul:nr:entries) } { incr i } {
  1160. set current_ban [lindex $banlist $i]
  1161. show:bans $nick $host $hand $chan $chan1 $gl $current_ban $userb
  1162. }
  1163. set black(showbans:$chan:$hand) [expr $black(showbans:$chan:$hand) + $black(modul:nr:entries)]
  1164. if {$black(morebans:$chan:$hand) > 0} {
  1165. banlist:remain $nick $hand $black(morebans:$chan:$hand) $chan $chan1 $getmethod $gl $user $userb $host
  1166. }
  1167. foreach tmr [utimers] {
  1168. if {[string match -nocase "*banlist:unset:more $chan $hand*" [join [lindex $tmr 1]]]} {
  1169. killutimer [lindex $tmr 2]
  1170. }
  1171. }
  1172. utimer 60 [list banlist:unset:more $chan $hand]
  1173. } else {
  1174. if {$gl == "1"} {
  1175. blacktools:tell $nick $host $hand $chan $chan1 banlist.2 "$black(cbanlist:$chan:$hand)"
  1176. }
  1177. if {$user == ""} {
  1178. blacktools:tell $nick $host $hand $chan $chan1 banlist.6 "$black(cbanlist:$chan:$hand)"
  1179. }
  1180. if {$userb == "1" && $handle != ""} {
  1181. blacktools:tell $nick $host $hand $chan $chan1 banlist.7 "$black(cbanlist:$chan:$hand) $show_user\($show_handle\)"
  1182. }
  1183. if {$userb == "1" && $handle == ""} {
  1184. blacktools:tell $nick $host $hand $chan $chan1 banlist.7 "$black(cbanlist:$chan:$hand) $show_user"
  1185. }
  1186. for {set i 0} { $i < $black(modul:nr:entries) } { incr i } {
  1187. set current_ban [lindex $banlist $i]
  1188. show:bans $nick $host $hand $chan $chan1 $gl $current_ban $userb
  1189. }
  1190. blacktools:tell $nick $host $hand $chan $chan1 banlist.4 none
  1191. }
  1192. }
  1193. proc banlist:unset:more {chan hand} {
  1194. global black
  1195. if {[info exists black(morebans:$chan:$hand)]} {
  1196. unset black(morebans:$chan:$hand)
  1197. }
  1198. if {[info exists black(cbanlist:$chan:$hand)]} {
  1199. unset black(cbanlist:$chan:$hand)
  1200. }
  1201. if {[info exists black(showbans:$chan:$hand)]} {
  1202. unset black(showbans:$chan:$hand)
  1203. }
  1204. }
  1205. proc show:bans {nick host hand chan chan1 gl b userb} {
  1206. global black
  1207. if {$b == ""} { return }
  1208. set never_expire 0
  1209. set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
  1210. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1211. if {$userb == "1"} {
  1212. set id [lindex [split $b] 0]
  1213. set mask [lindex [split $b] 1]
  1214. set expire [lindex [split $b] 2]
  1215. set created [lindex [split $b] 3]
  1216. set bywho [lindex [split $b] 4]
  1217. set breason [lrange [split $b] 5 end]
  1218. set breason [join [encoding convertfrom utf-8 $breason]]
  1219. } else {
  1220. set id [lindex [split $b] 1]
  1221. set mask [lindex [split $b] 3]
  1222. set expire [lindex [split $b] 5]
  1223. set bywho [lindex [split $b] 4]
  1224. set created [lindex [split $b] 6]
  1225. set breason [lrange [split $b] 9 end]
  1226. set breason [join [encoding convertfrom utf-8 $breason]]
  1227. }
  1228. set split_bywho [split $bywho ":"]
  1229. set handle [lindex $split_bywho 0]
  1230. set type [lindex $split_bywho 1]
  1231. if {$type != ""} {
  1232. set type "BAN([join [encoding convertfrom utf-8 $type]])"
  1233. set bywho "$handle"
  1234. } else {
  1235. set bywho $handle
  1236. set type "BAN"
  1237. }
  1238. if {$expire != "0"} {
  1239. set expire [return_time_2 $getlang [expr $expire - [unixtime]]]
  1240. } else {
  1241. set expire $black(say.$getlang.banlist.13)
  1242. set never_expire 1
  1243. }
  1244. set created [clock format $created -format %D-%H:%M:%S]
  1245. if {$never_expire == "0"} {
  1246. if {$userb == "1"} {
  1247. blacktools:tell $nick $host $hand $chan $chan1 banlist.9 "$id $type $mask $created $expire $breason"
  1248. return
  1249. }
  1250. blacktools:tell $nick $host $hand $chan $chan1 banlist.5 "$id $type $mask $bywho $created $expire $breason"
  1251. } else {
  1252. if {$userb == "1"} {
  1253. blacktools:tell $nick $host $hand $chan $chan1 banlist.12 "$id $type $mask $created $expire $breason"
  1254. return
  1255. }
  1256. blacktools:tell $nick $host $hand $chan $chan1 banlist.11 "$id $type $mask $bywho $created $expire $breason"
  1257. }
  1258. }
  1259. ################################ w ####################################
  1260. proc wpublic {nick host hand chan arg} {
  1261. global botnick black lastbind
  1262. set wnick [lindex [split $arg] 0]
  1263. set type 0
  1264. set handle [nick2hand $wnick]
  1265. set chan1 "$chan"
  1266. if {[regexp {^[&#]} $wnick] && [matchattr $hand nmo|MAO $wnick]} {
  1267. set chan "$wnick"
  1268. set wnick [lindex [split $arg] 1]
  1269. }
  1270. set return [blacktools:mychar $lastbind $hand]
  1271. if {$return == "0"} {
  1272. return
  1273. }
  1274. foreach c [channels] {
  1275. set backchan [join [setting:get $c backchan]]
  1276. if {[string match -nocase $chan $backchan]} {
  1277. set chan "$c"
  1278. }
  1279. }
  1280. if {$wnick != ""} {
  1281. w:process $wnick $nick $hand $host $chan $chan1 $type
  1282. } else { w:process $wnick $nick $hand $host $chan $chan1 $type }
  1283. }
  1284. proc w:process {wnick nick hand host chan chan1 type} {
  1285. global botnick black
  1286. set cmd_status [btcmd:status $chan $hand "w" 0]
  1287. if {$cmd_status == "1"} {
  1288. return
  1289. }
  1290. set handle [nick2hand $wnick]
  1291. set show_wnick $wnick
  1292. set getlang [string tolower [setting:get $chan lang]]
  1293. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1294. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  1295. return
  1296. }
  1297. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  1298. return
  1299. }
  1300. if {$wnick == ""} {
  1301. switch $type {
  1302. 0 {
  1303. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "w"
  1304. }
  1305. 1 {
  1306. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "w"
  1307. }
  1308. 2 {
  1309. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "w"
  1310. }
  1311. }
  1312. return 0
  1313. }
  1314. if {![validchan $chan]} {
  1315. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  1316. return
  1317. }
  1318. if {![botisop $chan] && ![setting:get $chan xonly]} {
  1319. blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
  1320. return
  1321. }
  1322. if {![onchan $wnick $chan]} {
  1323. blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan $show_wnick
  1324. return
  1325. }
  1326. if {![onchan $botnick $chan]} {
  1327. blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
  1328. return
  1329. }
  1330. if {[isbotnick $wnick]} {
  1331. return
  1332. }
  1333. if {[matchattr $handle $black(exceptflags) $chan]} {
  1334. blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
  1335. return
  1336. }
  1337. set getreason [setting:get $chan w-reason]
  1338. if {$getreason == ""} {
  1339. set getlang [string tolower [setting:get $chan lang]]
  1340. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1341. set getreason $black(say.$getlang.w.5)
  1342. set len [llength $getreason]
  1343. set random [expr int(rand()*$len)]
  1344. set getreason [lindex $getreason $random]
  1345. }
  1346. if {[setting:get $chan showhandle]} {
  1347. set reason "($hand) $getreason"
  1348. } else { set reason "$getreason"
  1349. }
  1350. set getcount [setting:get $chan kickcount]
  1351. set kcount [expr $getcount +1]
  1352. setting:set $chan kickcount $kcount
  1353. set counts [getuser $hand XTRA KICKS($chan)]
  1354. if {$counts == ""} { set counts 0 }
  1355. set counts [expr $counts + 1]
  1356. setuser $hand XTRA KICKS($chan) $counts
  1357. set counts [getuser $hand XTRA KICKS_TODAY($chan)]
  1358. if {$counts == ""} { set counts 0 }
  1359. set counts [expr $counts + 1]
  1360. setuser $hand XTRA KICKS_TODAY($chan) $counts
  1361. if {[setting:get $chan showcount]} {
  1362. set reason "$reason - $kcount -"
  1363. } else {
  1364. set reason "$reason"
  1365. }
  1366. if {[setting:get $chan xtools] || [setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  1367. putserv "PRIVMSG $black(chanserv) :kick $chan $wnick $reason"
  1368. } else {
  1369. putserv "KICK $chan $wnick :$reason"
  1370. }
  1371. puthelp "PRIVMSG $wnick :[black:color:set $hand $black(say.$getlang.w.6)]"
  1372. }
  1373. ################################### k #################################
  1374. proc k:process {knick nick hand host reason chan chan1 type} {
  1375. global botnick black
  1376. set cmd_status [btcmd:status $chan $hand "k" 0]
  1377. if {$cmd_status == "1"} {
  1378. return
  1379. }
  1380. set handle [nick2hand $knick]
  1381. set found_host ""
  1382. set kick_host 0
  1383. set found_access ""
  1384. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  1385. return
  1386. }
  1387. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  1388. return
  1389. }
  1390. if {$knick == ""} {
  1391. switch $type {
  1392. 0 {
  1393. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "k"
  1394. }
  1395. 1 {
  1396. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "k"
  1397. }
  1398. 2 {
  1399. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "k"
  1400. }
  1401. }
  1402. return
  1403. }
  1404. if {![validchan $chan]} {
  1405. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  1406. return
  1407. }
  1408. if {![botisop $chan] && ![setting:get $chan xonly]} {
  1409. blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
  1410. return
  1411. }
  1412. if {![onchan $botnick $chan]} {
  1413. blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
  1414. return
  1415. }
  1416. if {[string match -nocase "*!*" $knick]} {
  1417. set kick_host 1
  1418. set finduser [finduser $knick]
  1419. foreach user [chanlist $chan] {
  1420. set gethand [nick2hand $user]
  1421. set gethost "$user![getchanhost $user $chan]"
  1422. if {[string match -nocase $knick $gethost]} {
  1423. if {[matchattr $gethand $black(exceptflags) $chan]} {
  1424. lappend found_access $user
  1425. continue
  1426. }
  1427. lappend found_host $user
  1428. }
  1429. }
  1430. }
  1431. if {[matchattr $handle $black(exceptflags) $chan]} {
  1432. blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
  1433. return
  1434. }
  1435. if {$found_access != ""} {
  1436. blacktools:tell $nick $host $hand $chan $chan1 k.2 $found_access
  1437. return
  1438. }
  1439. if {![onchan $knick $chan] && $kick_host == "0"} {
  1440. blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan $knick
  1441. return
  1442. }
  1443. if {$kick_host == "1"} {
  1444. if {$found_host == ""} {
  1445. blacktools:tell $nick $host $hand $chan $chan1 k.1 none
  1446. return
  1447. }
  1448. }
  1449. if {[isbotnick $knick]} {
  1450. return
  1451. }
  1452. if {$reason == ""} {
  1453. if {[setting:get $chan k-reason] != ""} {
  1454. set reason [join [setting:get $chan k-reason]]
  1455. }
  1456. }
  1457. if {$reason == ""} {
  1458. set getlang [string tolower [setting:get $chan lang]]
  1459. if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
  1460. set reason1 "$black(say.$getlang.k.5)"
  1461. set len [llength $reason1]
  1462. set random [expr int(rand()*$len)]
  1463. set reason1 [lindex $reason1 $random]
  1464. } else { set reason1 "$reason" }
  1465. if {[setting:get $chan showhandle]} {
  1466. set reason "($hand) $reason1"
  1467. } else { set reason "$reason1"
  1468. }
  1469. set getcount [setting:get $chan kickcount]
  1470. set kcount [expr $getcount +1]
  1471. setting:set $chan kickcount $kcount
  1472. set counts [getuser $hand XTRA KICKS($chan)]
  1473. if {$counts == ""} { set counts 0 }
  1474. set counts [expr $counts + 1]
  1475. setuser $hand XTRA KICKS($chan) $counts
  1476. set counts [getuser $hand XTRA KICKS_TODAY($chan)]
  1477. if {$counts == ""} { set counts 0 }
  1478. set counts [expr $counts + 1]
  1479. setuser $hand XTRA KICKS_TODAY($chan) $counts
  1480. if {[setting:get $chan showcount]} {
  1481. set reason "$reason - $kcount -"
  1482. } else {
  1483. set reason "$reason"
  1484. }
  1485. if {[setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
  1486. if {$found_host != ""} {
  1487. foreach f $found_host {
  1488. putserv "PRIVMSG $black(chanserv) :kick $chan $f $reason"
  1489. }
  1490. } else {
  1491. putserv "PRIVMSG $black(chanserv) :kick $chan $knick $reason"
  1492. }
  1493. } else {
  1494. if {$found_host != ""} {
  1495. foreach f $found_host {
  1496. putserv "KICK $chan $f :$reason"
  1497. }
  1498. } else {
  1499. putserv "KICK $chan $knick :$reason"
  1500. }
  1501. }
  1502. }
  1503. proc kpublic {nick host hand chan arg} {
  1504. global botnick black lastbind
  1505. set knick [lindex [split $arg] 0]
  1506. set type 0
  1507. set reason [join [lrange [split $arg] 1 end]]
  1508. set handle [nick2hand $knick]
  1509. set chan1 "$chan"
  1510. if {[regexp {^[&#]} $knick] && [matchattr $hand nmo|MAO $knick]} {
  1511. set chan "$knick"
  1512. set knick [lindex [split $arg] 1]
  1513. set reason [join [lrange [split $arg] 2 end]]
  1514. }
  1515. set return [blacktools:mychar $lastbind $hand]
  1516. if {$return == "0"} {
  1517. return
  1518. }
  1519. foreach c [channels] {
  1520. set backchan [join [setting:get $c backchan]]
  1521. if {[string match -nocase $chan $backchan]} {
  1522. set chan "$c"
  1523. }
  1524. }
  1525. if {$knick != ""} {
  1526. k:process $knick $nick $hand $host $reason $chan $chan1 $type
  1527. } else {k:process $knick $nick $hand $host $reason $chan $chan1 $type}
  1528. }
  1529. ################################## BanSTATS ################################
  1530. proc banstats:module {nick host hand chan arg} {
  1531. global black lastbind
  1532. set next [lindex [split $arg] 0]
  1533. set cmd ""
  1534. set type 0
  1535. set chan1 "$chan"
  1536. set return [blacktools:mychar $lastbind $hand]
  1537. if {$return == "0"} {
  1538. return
  1539. }
  1540. if {[string equal -nocase $next "reset"] && [matchattr $hand nmo|M $chan]} {
  1541. set cmd "reset"
  1542. }
  1543. if {[string equal -nocase $next "total"]} {
  1544. set next [lindex [split $arg] 1]
  1545. set cmd "total"
  1546. }
  1547. if {[regexp {^[&#]} $next] && [matchattr $hand nmo|MAO $next]} {
  1548. set chan $next
  1549. set next [lindex [split $arg] 1]
  1550. if {[string equal -nocase $next "reset"] && [matchattr $hand nmo|M $next]} {
  1551. set cmd "reset"
  1552. }
  1553. if {[string equal -nocase $next "total"]} {
  1554. set next [lindex [split $arg] 2]
  1555. set cmd "total"
  1556. }
  1557. }
  1558. foreach c [channels] {
  1559. set backchan [join [setting:get $c backchan]]
  1560. if {[string match -nocase $chan $backchan]} {
  1561. set chan "$c"
  1562. }
  1563. }
  1564. banstats:process $nick $host $hand $chan $chan1 $cmd $type $next
  1565. }
  1566. proc topbans:reset {chan} {
  1567. global black
  1568. if {![validchan $chan]} { return }
  1569. foreach user [userlist] {
  1570. set counts [getuser $user XTRA BANS($chan)]
  1571. set counts_k [getuser $user XTRA KICKS($chan)]
  1572. if {$counts == ""} {
  1573. continue
  1574. } else {
  1575. setuser $user XTRA BANS($chan) 0
  1576. setuser $user XTRA BANS_TODAY($chan) 0
  1577. }
  1578. if {$counts_k == ""} {
  1579. continue
  1580. } else {
  1581. setuser $user XTRA KICKS($chan) 0
  1582. setuser $user XTRA KICKS_TODAY($chan) 0
  1583. }
  1584. }
  1585. foreach user [userlist $chan] {
  1586. set counts [getuser $user XTRA BANS($chan)]
  1587. set counts_k [getuser $user XTRA KICKS($chan)]
  1588. if {$counts == ""} {
  1589. continue
  1590. } else {
  1591. setuser $user XTRA BANS($chan) 0
  1592. setuser $user XTRA BANS_TODAY($chan) 0
  1593. }
  1594. if {$counts_k == ""} {
  1595. continue
  1596. } else {
  1597. setuser $user XTRA KICKS($chan) 0
  1598. setuser $user XTRA KICKS_TODAY($chan) 0
  1599. }
  1600. }
  1601. }
  1602. proc banstats:process {nick host hand chan chan1 cmd type next} {
  1603. global botnick black
  1604. set counter 0
  1605. set cmd_status [btcmd:status $chan $hand "banstats" 0]
  1606. if {$cmd_status == "1"} {
  1607. return
  1608. }
  1609. if {[matchattr $hand q]} { blacktools:tell $nick $host $hand $chan $chan1 gl.glsuspend none
  1610. return
  1611. }
  1612. if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
  1613. return
  1614. }
  1615. if {$chan == ""} {
  1616. if {$type == "0"} {
  1617. blacktools:tell $nick $host $hand $chan $chan1 gl.instr "banstats"
  1618. }
  1619. if {$type == "1"} {
  1620. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "banstats"
  1621. }
  1622. if {$type == "2"} {
  1623. blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "banstats"
  1624. }
  1625. }
  1626. if {![validchan $chan]} {
  1627. blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
  1628. return
  1629. }
  1630. if {$cmd == "total"} {
  1631. set bans "BANS($chan)"
  1632. } else {
  1633. set bans "BANS_TODAY($chan)"
  1634. }
  1635. set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
  1636. set temp "$black(tempdir)/topbans_temp.$timestamp"
  1637. if {[string equal -nocase $cmd "reset"]} {
  1638. set reset [topbans:reset $chan]
  1639. blacktools:tell $nick $host $hand $chan $chan1 topbans.8 none
  1640. return
  1641. }
  1642. array set topbanslist [list]
  1643. foreach u [userlist] {
  1644. set totalbans [getuser $u XTRA $bans]
  1645. if {$totalbans != "" && $totalbans != "0"} {
  1646. lappend topbanslist($totalbans) $u
  1647. }
  1648. }
  1649. foreach u [userlist $chan] {
  1650. if {[matchattr $u $black(localflags) $chan]} {
  1651. set totalbans [getuser $u XTRA $bans]
  1652. if {$totalbans != "" && $totalbans != "0"} {
  1653. lappend topbanslist($totalbans) $u
  1654. }
  1655. }
  1656. }
  1657. set tempwrite [open $temp w]
  1658. foreach u [lsort -integer -decreasing [array names topbanslist]] {
  1659. set counter [expr $counter + 1]
  1660. puts $tempwrite "[join $topbanslist($u) ","] $u $counter"
  1661. }
  1662. close $tempwrite
  1663. set file [open $temp "r"]
  1664. set w [read -nonewline $file]
  1665. close $file
  1666. set data [split $w "\n"]
  1667. file delete $temp
  1668. if {$data == ""} {
  1669. if {$cmd == "total"} {
  1670. blacktools:tell $nick $host $hand $chan $chan1 topbans.10 none
  1671. } else {
  1672. blacktools:tell $nick $host $hand $chan $chan1 topbans.14 none
  1673. }
  1674. return
  1675. }
  1676. if {$cmd == "total"} {
  1677. module:getinfo $nick $host $hand $chan $chan1 $type $data "topbans:total" "0" $next
  1678. } else {
  1679. module:getinfo $nick $host $hand $chan $chan1 $type $data "topbans" "0" $next
  1680. }
  1681. }
  1682. ##############
  1683. #########################################################################
  1684. ## END ##
  1685. #########################################################################