Posted to tcl by sauk at Tue Aug 24 22:06:58 GMT 2021view pretty
# --- protection v1.4 beta # --- contact information # Alexander Martin # # E-Mail: bugs@dev.alex.ip-am.de # Homepage: http://fat.egg.irc.ag:1337 {http://dev.alex.ip-am.de} # # #xela on iRC.ag {/server -m de.irc.ag 6667 -j #xela} # __ _ _ _ __ # __ _ _ __ ___ / /| || |___ _____| | __ \ \ # / _` | '_ ` _ \ | |_ .. _\ \/ / _ \ |/ _` | | # | (_| | | | | | | < <|_ _|> < __/ | (_| |> > # \__,_|_| |_| |_| | | |_||_| /_/\_\___|_|\__,_| | # \_\ /_/ # --- copyright # # I made this script, not you, wish to touch the copyright? fuck off :) # # This software is copyrighted (c) 2005 by Alexander Martin 'am' #xela. # All rights reserved. The following terms apply to all files associated with # the software unless explicitly disclaimed in individual files or # directories. # # The authors hereby grant permission to use, copy, modify, distribute, # and license this software for any purpose, provided that existing # copyright notices are retained in all copies and that this notice is # included verbatim in any distributions. No written agreement, license, # or royalty fee is required for any of the authorized uses. # Modifications to this software may be copyrighted by their authors and # need not follow the licensing terms described here, provided that the # new terms are clearly indicated on the first page of each file where # they apply. # # IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY # DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE # IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE # NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR # MODIFICATIONS. # # GOVERNMENT USE: If you are acquiring this software on behalf of the # U.S. government, the Government shall have only "Restricted Rights" # in the software and related documentation as defined in the Federal # Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you # are acquiring the software on behalf of the Department of Defense, the # software shall be classified as "Commercial Computer Software" and the # Government shall have only "Restricted Rights" as defined in Clause # 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the # authors grant the U.S. Government and others acting in its behalf # permission to use and distribute the software in accordance with the # terms specified in this license. # # --- script information # Punish methode 1 and 2 seems to be buggy, no way to fix it >:( # --- changes # 1.4b Bug fixed (Command: access (19.06.2005 12:15)) # 1.3b Bug fixed (Command: access (16.06.2005 19:28)) # --- script settings namespace eval ::protection::settings { # -- variables variable trigger "\?" variable version "1.4b" variable author "Alexander Martin 'am' \{#xela\}" variable levels variable required variable reactions variable available "deopall recover clearchan invite reop unbanall" if {[array exists reactions]} { array unset reactions } array set reactions { "bot-kick" {deopall} "mass-mode" {deopall} "mass-kick" {deopall} "need-invite" {clearchan:invite} "need-key" {clearchan:invite} "need-unban" {unbanall:invite} "need-op" {deopall:reop} } if {[array exists required]} { array unset required } array set required { "mytrigger" {% 3 4 5 6 7 8 9 10} "levels" {% 3 4 5 6 7 8 9 10} "methode" {% 3 4 5 6 7 8 9 10} "protect" {& 5 6 9 10} "topicsave" {& 5 6 9 10} "status" {% 6 10} "reaction" {& 5 6 9 10} "adduser" {% 5 6 9 10} "access" {% 5 6 9 10} "deluser" {% 10} "whois" {% 5 6 9 10} "userlist" {% 5 6 9 10} "remflags" {& 5 6 9 10} "banlist" {% 5 6 9 10} "maxmodes" {& 5 6 9 10} "maxkicks" {& 5 6 9 10} "bitchmode" {& 5 6 9 10} "mode" {% 5 6 9 10} "punish" {& 5 6 9 10} "kickmsg" {% 5 6 9 10} "kick" {% 4 5 6 8 9 10} "ban" {% 5 6 9 10} "unban" {% 5 6 9 10} "autoop" {% 5 6 9 10} "autovoice" {% 5 6 9 10} "autolimit" {% 5 6 9 10} "op" {% 4 5 6 8 9 10} "voice" {% 3 4 5 6 7 8 9 10} "deop" {% 4 5 6 8 9 10} "devoice" {% 3 4 5 6 7 8 9 10} "topic" {% 5 6 9 10} "showcommands" {+ 3 4 5 6 7 8 9 10} "help" {+ 3 4 5 6 7 8 9 10} "commands" {+ 3 4 5 6 7 8 9 10} "modechange" {5 6 9 10} "version" {- 0} "copyright" {- 0} } if {[array exists levels]} { array unset levels } array set levels { "0" {-|-} "1" {-|B} "2" {-|d} "3" {-|v} "4" {-|o} "5" {-|m} "6" {-|n} "7" {v|-} "8" {o|-} "9" {m|-} "10" {n|-} } # -- setudef {flag:string} # - flag setudef flag protection setudef flag onjoin-voice setudef flag onjoin-operator setudef flag bitchmode setudef flag topicsave setudef flag first-use setudef flag service-prot # - string setudef str kick-id setudef str kick-message setudef str protected-modes setudef str channel-topic setudef str punish-methode setudef str remove-flags setudef str maximal-modes setudef str maximal-kicks setudef str autolimit foreach reaction [array names ::protection::settings::reactions] { setudef str reaction-$reaction } # -- required module if {[catch { loadmodule blowfish } error]} { putlog "You can't use this fuckin' nice script dude, blowfish module req. >:(" return } } # --- bindings # -- quakenet service {join:leave} # - leave bind SIGN -|- {*} ::protection::qnet:service:leave bind PART -|- {*} ::protection::qnet:service:leave bind SPLT -|- {*} ::protection::qnet:service:leave:netsplit # - rejoin/join bind JOIN -|- {*} ::protection::qnet:service:join bind REJN -|- {*} ::protection::qnet:service:join # -- incr kick counter bind KICK -|- {*} ::protection::incr:kickcount # -- timers {autolimit} bind TIME -|- {*} ::protection::auto:limit # -- auto mode on join {operator:voice:ban} bind JOIN -|- {*} ::protection::auto:mode # -- public bind PUBM -|- {*} ::protection::parse:public # -- protection # - topic change bind TOPC -|- {*} ::protection::topic:change # - mode change bind MODE -|- {*} ::protection::mode:change # - kick bind KICK -|- {*} ::protection::user:kick # -- need bind NEED -|- {*} ::protection::need:settings # --- script main source namespace eval ::protection { # --- quakenet service {leave:join} # -- join proc qnet:service:join { nickname hostname handle channel } { global reop autoop if {[isbotnick $nickname]} { return } if {[lsearch -exact [userlist |S $channel] $nickname] > -1 && [channel get $channel "protection"]} { putserv "PRIVMSG $channel :\001ACTION [lindex "hugs loves kisses misses" [rand 3]] $nickname \\\\\F4\001" foreach service [userlist |S $channel] { if {$service == ""} { continue } chattr $service |-S $channel } chattr $nickname |+S $channel if {[info exists reop($channel)] && [botisop $channel]} { foreach idler $reop($channel) { if {![onchan $idler $channel]} { continue } pushmode $channel +o $idler } flushmode $channel unset reop($channel) } if {[info exists autoop($channel)]} { unset autoop($channel) putserv "PRIVMSG $channel :Autoop on join enabled once again." channel set $channel +onjoin-operator -onjoin-voice } } } # -- leave proc qnet:service:leave:netsplit { nickname hostname handle channel } { if {[isbotnick $nickname]} { return } if {[lsearch -exact [userlist |S $channel] $nickname] > -1 && [channel get $channel "protection"]} { ::protection::qnet:service:leave $nickname $hostname $handle $channel "" } } proc qnet:service:leave { nickname hostname handle channel reason } { global reop autoop if {[isbotnick $nickname]} { return } if {[lsearch -exact [userlist |S $channel] $nickname] > -1 && [channel get $channel "protection"]} { putserv "PRIVMSG $channel :\001ACTION hates $nickname for this :(\001" if {[channel get $channel "onjoin-operator"]} { putserv "PRIVMSG $channel :Autoop on join temporary disabled." channel set $channel -onjoin-operator +onjoin-voice set autoop($channel) 1 } if {[channel get $channel "service-prot"] && [botisop $channel]} { foreach idler [chanlist $channel] { if {[isbotnick $idler]} { continue } elseif {[matchattr [nick2hand $idler] mno|mno $channel]} { continue } elseif {![isop $idler $channel]} { continue } else { lappend reop($channel) $idler; pushmode $channel -o $idler } } flushmode $channel } } } # --- auto mode on join {operator:voice:ban} # -- panel proc auto:mode { nickname hostname handle channel } { global joins utimer if {![botisop $channel] || [isbotnick $nickname]} { return } if {[::protection::user:level $handle $channel] == "1"} { if {[string match "*users.quakenet.org" $hostname]} { set banmask *!*@[lindex [split $hostname "@"] 1] } else { set banmask [maskhost $hostname] } set reason "You have been BANNED from this channel." putserv "MODE $channel -ov+b $nickname $nickname $banmask" putserv "KICK $channel $nickname :[string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]]" return } if {[channel get $channel "onjoin-operator"] && [::protection::user:level $handle $channel] != "2"} { if {![onchansplit $nickname]} { if {![info exists joins($channel)]} { set joins($channel) 1; utimer 1 [list ::protection::unset:variable joins($channel)] } else { incr joins($channel) 1 if {$joins($channel) == "5"} { foreach {id value} [array get utimer "*:$channel"] { catch { killutimer $utimer($id) }; unset utimer($id) } channel set $channel -onjoin-operator; timer [expr $joins($channel) * 5] [list channel set $channel +onjoin-operator] ::protection::unset:variable joins($channel); ::protection::unset:variable victims($channel) putquick "PRIVMSG $channel :\001ACTION turned the autoop temporary off ...\001" -next return } } } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } set utimer($nickname:$channel) [utimer 2 [list pushmode $channel +o $nickname]] } elseif {[channel get $channel "onjoin-voice"]} { pushmode $channel +v $nickname } } # --- commands # -- parse command {public} # - parse public message proc parse:public { nickname hostname handle channel arguments } { ::protection::parse $nickname $hostname $handle $arguments $channel } # - redirect command to proc proc parse { nickname hostname handle arguments channel } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig lasthost set utrigger [getuser $handle XTRA trigger] if {[llength $utrigger] < 1} { set utrigger [join [string trim $::protection::settings::trigger]] } if {[lsearch -exact "NOTICE PRIVMSG" [string toupper [getuser $handle XTRA methode]]] < 0} { setuser $handle XTRA methode NOTICE } if {[llength $channel] > 0} { if {[string equal -nocase $botnick [lindex [split $arguments] 0]]} { set command [string tolower [lindex [split $arguments] 1]]; set trigger "$botnick $command" if {[string index [lindex [split $arguments] 2] 0] == "#" && [validchan [lindex [split $arguments] 2]]} { set channel [lindex [split $arguments] 2]; set arguments [lrange [split $arguments] 3 end] } else { set arguments [lrange [split $arguments] 2 end] } } elseif {[string equal -nocase [string index [lindex [split $arguments] 0] 0] $utrigger]} { set trigger [lindex [split $arguments] 0]; set command [string tolower [string range [lindex [split $arguments] 0] 1 end]] if {[string index [lindex [split $arguments] 1] 0] == "#" && [validchan [lindex [split $arguments] 1]]} { set channel [lindex [split $arguments] 1]; set arguments [lrange [split $arguments] 2 end] } else { set arguments [lrange [split $arguments] 1 end] } } } else { return } if {![info exists command] || [llength $command] < 1} { return } elseif {![info exists trigger] || [llength $trigger] < 1} { return } elseif {![info exists channel] || ![validchan $channel]} { return } elseif {![validuser $handle]} { return } set lastnick $nickname set lastargs $arguments set lastchan $channel set lastcmd $command set lasttrig $trigger set lasthost $hostname set redirect $command if {[lsearch "op deop voice devoice" $command] > -1} { set redirect usermode } elseif {[lsearch "autoop autovoice" $command] > -1} { set redirect automode } elseif {[lsearch "copyright version" $command] > -1} { set redirect authorinfo } elseif {[lsearch "help commands" $command] > -1} { set redirect showcommands } if {![info exists ::protection::settings::required($command)]} { return } elseif {[lsearch -exact "$::protection::settings::required($command)" 0] < 0 && [lsearch -exact "$::protection::settings::required($command)" [::protection::user:level $handle $channel]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :You are not enough known on this channel \{$channel\} and can't use [string toupper $command]!"; return } elseif {[string index $::protection::settings::required($command) 0] == "&" && ![channel get $channel "protection"]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :In order to use [string toupper $command] you have to enable the protection script on this channel! \{$channel\}"; return } elseif {[lsearch -exact "mode kick usermode topic" $redirect] > -1 && ![botisop $channel]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :In order to use [string toupper $command] the bot requires OP on this channel! \{$channel\}"; return } elseif {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { putserv "PRIVMSG $channel :\001ACTION *thinks* my owner tries to touch teh fuckin' copyright >:)\001"; return } ::protection::missing:settings $channel; ::protection::command:$redirect $command $nickname $hostname $handle $channel $arguments } # -- command levels proc command:levels { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig lastuse foreach level "\{0 Without access\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A05 Channel master\} \{1 Channel auto ban list\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A06 Channel owner\} \{2 Channel auto deop list\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A07 Global auto voice list\} \{3 Channel auto voice list\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A08 Global auto operator list\} \{4 Channel auto operator list\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A09 Global master\} \{10 Global owner\}" { if {[string length [lindex [split $level] 0]] == 1} { set level "\A0$level" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :$level" } } # -- command methode proc command:methode { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig lastuse if {[lsearch -exact "NOTICE PRIVMSG" [string toupper [lindex [split $arguments] 0]]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :You will receive all bot messages via [string toupper [getuser [nick2hand $lastnick] XTRA methode]]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037notice\037|\037privmsg\037" return } setuser $handle XTRA methode [string toupper [lindex [split $arguments] 0]] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Message methode successfully set to [string toupper [getuser [nick2hand $lastnick] XTRA methode]]" } # -- command authorinfo proc command:authorinfo { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig lastuse if {[info exists lastuse($command:$channel)] && [expr [unixtime] - $lastuse($command:$channel)] < 90} { return } set lastuse($command:$channel) [unixtime] putquick "PRIVMSG $channel :\001ACTION protection script v$::protection::settings::version developed by $::protection::settings::author\001" putquick "PRIVMSG $channel :Due to the trouble last time on quakenet, I left to my own network /server -m de.irc.ag 6667 -j #xela :)" } # -- command status proc command:status { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig switch -exact -- [string tolower [lindex [split $arguments] 0]] { "on" { if {[channel get $channel "protection"]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Protection already on." } else { if {![validuser Q]} { adduser Q *!TheQBot@CServe.quakenet.org chattr Q +afmo } if {![validuser L]} { adduser L *!TheLBot@lightweight.quakenet.org chattr L +afmo } if {[onchan Q $channel]} { set service Q } elseif {[onchan L $channel]} { set service L } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Quakenet service bot required." return } chattr $service |+S $channel putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Protection turned on." channel set $channel +protection +autoop +service-prot +autovoice; ::protection::missing:settings $channel set utrigger [getuser $handle XTRA trigger] if {[llength $utrigger] < 1} { set utrigger [join [string trim $::protection::settings::trigger]] } if {![channel get $channel "first-use"]} { channel set $channel +first-use putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Thanks for choosing my protection script, please report bugs to me." putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :To get a complete list with available commands for you please type in: ${utrigger}help" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :---" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :v$::protection::settings::version developed by $::protection::settings::author" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :IRC: /server -m de.irc.ag 6667 -j #xela >:)" } } } "off" { if {![channel get $channel "protection"]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Protection already off." } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Protection turned off." if {[regexp {[0-9]{1,}} [channel get $channel "autolimit"]] && [string match *l* [lindex [getchanmode $channel] 0]]} { putquick "MODE $channel -l"; channel set $channel -autolimit } channel set $channel -protection } } "default" { if {[channel get $channel "protection"]} { set status "Protection is on." } else { set status "Protection is off." } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :$status Please use: $lasttrig \037?#channel?\037 \037on\037|\037off\037" } } } # -- command punish proc command:punish { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {![regexp -- {[1-3]} [lindex [split $arguments] 0]]} { set methode [channel get $channel "punish-methode"] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel punish methode \{$channel\} is: $methode" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 Avaialable methodes are: 1 \{deop\}, 2 \{kick\} and 3 \{kickban\}" return } channel set $channel punish-methode [lindex [split $arguments] 0] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel punish methode \{$channel\} successfully set to: [lindex [split $arguments] 0]" } # -- command reaction proc command:reaction { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set reaction [string tolower [lindex [split $arguments] 0]] set types [string tolower [join [lrange [split $arguments] 1 end]]] if {![info exists ::protection::settings::reactions($reaction)] || $reaction == "" || $types == ""} { if {[info exists ::protection::settings::reactions($reaction)] && [channel get $channel "reaction-$reaction"] != ""} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Reactio\037n\037\002:\002 [string toupper $reaction] \{$channel\} -> [join [split [channel get $channel "reaction-$reaction"] ":"] ", "]"; return } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037[join [array names ::protection::settings::reactions] "\037|\037"]\037 \037?reactions?\037" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 Available reactions are: [join $::protection::settings::available ", "]" return } foreach option $types { if {[lsearch -exact $::protection::settings::available $option] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid reaction specified: [string toupper $option]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 Available reactions are: [join $::protection::settings::available ", "]" return } } channel set $channel reaction-$reaction [join $types ":"] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Reaction for [string toupper $reaction] \{$channel\} successfully set to: [join $types ", "]" } # -- command userlist proc command:userlist { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[string equal -nocase -global [lindex [split $arguments] 0]]} { set global 1; set type Global } else { set global 0; set type $channel } if {$global && [lsearch -exact "9 10" [::protection::user:level $handle $channel]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :You are not enough known and can't view the GLOBAL userlist."; return } foreach user [userlist] { if {!$global && [lsearch -exact "7 8 9 10" [::protection::user:level $user $channel]] > -1} { continue } elseif {$global && [lsearch -exact "7 8 9 10" [::protection::user:level $user $channel]] < 0} { continue } set info #$user set usernicks "" foreach host [getuser $user hosts] { foreach chan [channels] { foreach nicks [chanlist $chan] { if {[string match "*users.quakenet.org" [getchanhost $nicks]]} { set userhost *!*@[lindex [split [getchanhost $nicks] "@"] 1] } else { set userhost [maskhost [getchanhost $nicks]] } if {[string match -nocase $userhost $host] && [lsearch -exact $usernicks $nicks] < 0} { lappend usernicks $nicks } } } } if {[llength $usernicks] < 1} { set usernicks n/a } set info "$info \{[join $usernicks ", "]\}" if {![info exists userlist([::protection::user:level $user $channel])]} { set userlist([::protection::user:level $user $channel]) "" } lappend userlist([::protection::user:level $user $channel]) $info } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Userlisttype: $type" set level 11 set total 0 set owner 0 set master 0 set operator 0 set voice 0 set deop 0 set banned 0 while {$level > 1} { incr level -1 if {![info exists userlist($level)]} { continue } incr total [llength $userlist($level)] if {$level == "10" || $level == "6"} { set type "Owner"; incr owner [llength $userlist($level)] } elseif {$level == "9" || $level == "5"} { set type "Master"; incr master [llength $userlist($level)] } elseif {$level == "8" || $level == "4"} { set type "Operator"; incr operator [llength $userlist($level)] } elseif {$level == "7" || $level == "3"} { set type "Voice"; incr voice [llength $userlist($level)] } elseif {$level == "2"} { set type "Auto Deop"; incr deop [llength $userlist($level)] } elseif {$level == "1"} { set type "Banned"; incr banned [llength $userlist($level)] } else { continue } set list "" foreach user $userlist($level) { if {[llength $list] == "5"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :\{$level\} $type: [join $list ", "]"; set list "" } lappend list $user } if {[llength $list] != "0"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :\{$level\} $type: [join $list ", "]"; set list "" } } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :End of list." putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Total: $total \{owner: $owner, master: $master, operator: $operator, voice: $voice, deop: $deop, ban: $banned\}" if {[lsearch -exact "9 10" [::protection::user:level $handle $channel]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :To view the global userlist please use: $lasttrig \037-global\037" } } # -- command mode proc command:mode { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1 || [string equal -nocase -default [lindex [split $arguments] 0]] && [join [lrange [split $arguments] 1 end]] == ""} { set curmodes [getchanmode $channel] if {$curmodes == ""} { set curmodes n/a } if {[llength [channel get $channel "chanmode"]] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current default channel modes \{$channel\} are: [join [channel get $channel "chanmode"]] \{Channel Modes: $curmodes\}" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?-default?\037 \037clear\037|\037+-modes\037" return } if {[string equal -nocase -default [lindex [split $arguments] 0]]} { if {[string equal -nocase clear [lindex [split $arguments] 1]]} { channel set $channel chanmode "" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Default channel modes \{$channel\} successfully cleared." return } set default [lindex [split $arguments] 1] regsub -all {[cCnNtulikrspmDd\+\-]} $default "" check if {[llength $check] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid channel mode \{$channel\} specified: [join [split $check ""] ", "]"; return } channel set $channel chanmode $default putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Default channel modes \{$channel\} successfully set to: $default" return } if {[string equal -nocase clear [lindex [split $arguments] 0]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Clear option only available for option -default." return } putquick "MODE $channel [join $arguments]" } # -- command topic {resynch:set:clear} proc command:topic { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1} { if {[llength [channel get $channel "channel-topic"]] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current saved channel topic \{$channel\} is: [join [channel get $channel "channel-topic"]]" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037new topic\037|\037resynch\037|\037clear\037|\037save\037" return } if {[string equal -nocase resynch [lindex [split $arguments] 0]]} { if {[llength [channel get $channel "channel-topic"]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :No channel topic saved to resynch."; return } if {[onchan Q $channel]} { putquick "PRIVMSG Q :SETTOPIC $channel [join [channel get $channel "channel-topic"]]" } else { putquick "TOPIC $channel :[join [channel get $channel "channel-topic"]]" } return } elseif {[string equal -nocase clear [lindex [split $arguments] 0]]} { channel set $channel channel-topic "" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel topic cleared. \{$channel\}" if {[onchan Q $channel]} { putquick "PRIVMSG Q :SETTOPIC $channel \A0" } else { putquick "TOPIC $channel :" } return } elseif {[string equal -nocase save [lindex [split $arguments] 0]]} { if {[topic $channel] == ""} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :There is currently no topic set. \{$channel\}"; return } channel set $channel channel-topic [topic $channel] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel topic saved. \{$channel\}" return } channel set $channel channel-topic $arguments putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel topic saved. \{$channel\}" if {[onchan Q $channel]} { putquick "PRIVMSG Q :SETTOPIC $channel [join [channel get $channel "channel-topic"]]" } else { putquick "TOPIC $channel :[join [channel get $channel "channel-topic"]]" } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } } # -- command autolimit proc command:autolimit { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[string equal -nocase off [lindex [split $arguments] 0]]} { channel set $channel autolimit "" if {[botisop $channel] && [string match "*l*" [lindex [split [getchanmode $channel]] 0]]} { putquick "MODE $channel -l" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Autolimit successfully turned OFF in $channel" return } if {[string index [lindex [split $arguments] 0] 0] != "#" || ![regexp {[0-9]{1,}} [string range [lindex [split $arguments] 0] 1 end]] || [expr round([string range [lindex [split $arguments] 0] 1 end])] < 1} { if {[set limit [channel get $channel "autolimit"]] != ""} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel limit \{$channel\} is: +$limit" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037#limit\037|\037off\037" return } channel set $channel autolimit [expr round([string range [lindex [split $arguments] 0] 1 end])] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel limit successfully set to +[expr round([string range [lindex [split $arguments] 0] 1 end])] \{$channel\}" if {![botisop $channel]} { return } set newlimit [expr [llength [chanlist $channel]] + [set autolimit [string range [lindex [split $arguments] 0] 1 end]]] if {[string match "*l*" [lindex [getchanmode $channel] 0]]} { regexp {\S[\s]([0-9]+)} [getchanmode $channel] "" limit } else { set limit 0 } if {($newlimit == "$limit")} { return } if {$newlimit > $limit} { set difference [expr $newlimit - $limit] } elseif {$newlimit < $limit} { set difference [expr $limit - $newlimit] } if {($difference <= [expr round($autolimit * 0.5)]) && ($autolimit > 5)} { return } elseif {($difference < [expr round($autolimit * 0.38)]) && ($autolimit <= 5)} { return } putquick "MODE $channel +l $newlimit" } # -- command kick proc command:kick { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex $arguments 0]] set reason [join [lrange [split $arguments] 1 end]] if {[llength [join $victim]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037|\037hostmask\037 \037?reason?\037"; return } elseif {[regexp -- {\?|\*|\!|\@|\.|\~} [join $victim]] && [lsearch -exact "4 8" [::protection::user:level $handle $channel]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :You are not enough known on this channel \{$channel\} and can't use hostmasks to kick other users."; return } if {[llength $reason] < 1} { set reason "You have been KICKED from this channel." } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } array set disallowed { "4" {4 5 6 7 8 9 10} "5" {5 6 8 9 10} "8" {4 5 6 8 9 10} "9" {10} } set id 1 foreach user [chanlist $channel] { set kick 1 if {![string equal -nocase $user $botnick] && ![string equal -nocase $user $nickname] && ![string match -nocase $victim $botname] && ![string match -nocase $victim $hostname] && ([string equal -nocase [join $victim] $user] || [string map {{*} {}} $victim] != "$victim" && [string match -nocase $victim $user![getchanhost $user]] || [string map {{?} {}} $victim] != "$victim" && [string match -nocase $victim $user])} { foreach {level value} [array get disallowed] { if {[::protection::user:level $handle $channel] == "$level" && [lsearch -exact "$value" [::protection::user:level [nick2hand $user] $channel]] > -1} { set kick 0 } } if {$kick} { set counter [expr [channel get $channel "kick-id"] + $id] putquick "KICK $channel $user :[string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"$counter\"" [join [channel get $channel "kick-message"]]]" incr id 1 } } } } # -- command mytrigger proc command:mytrigger { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig array set triggers { "1" {$} "2" {!} "3" {?} "4" {.} "5" {-} "6" {\B2} "7" {%} "8" {&} "9" {*} "10" {:} } if {![info exists triggers([string range [lindex [split $arguments] 0] 1 end])]} { if {[llength [set trigger [getuser $handle XTRA trigger]]] < 1} { set trigger "[string trim $::protection::settings::trigger] \{default\}" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current personal trigger is: $trigger" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#id?\037" set list "" set id 0 while {$id < 10} { incr id 1 lappend list "#$id ($triggers($id))" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Available triggers are: [join $list ", "]" return } setuser $handle XTRA trigger $triggers([string range [lindex [split $arguments] 0] 1 end]) putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Your personal trigger has been successfully set to: [getuser $handle XTRA trigger]" } # -- command protect proc command:protect { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig regsub -all {[cCnNbturkilmsDdp\+\-]} $arguments "" check if {[string match "*o*" [split $arguments]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :If you wish to protect deop's and/or op's please use the bitchmode option." } if {[llength [split $arguments]] < 1 || $check != ""} { set positiv ""; set negativ "" if {[lindex [channel get $channel "protected-modes"] 0] != ""} { set positiv +[lindex [channel get $channel "protected-modes"] 0] } if {[lindex [channel get $channel "protected-modes"] 1] != ""} { set negativ -[lindex [channel get $channel "protected-modes"] 1] } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current protected mode changes \{$channel\} are: $positiv$negativ" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037+-modes\037 \{example: +birks-bCtu\}" return } set positiv ""; set negativ ""; set lastmode "" foreach mode [string trim [split [lindex [split $arguments] 0] ""]] { if {$mode == "o"} { continue } elseif {$mode == "+" || $mode == "-"} { set lastmode $mode; continue } if {$lastmode == ""} { continue } if {$lastmode == "+"} { append positiv $mode } elseif {$lastmode == "-"} { append negativ $mode } else { continue } } if {$positiv == ""} { set positiv % } if {$negativ == ""} { set negativ % } if {$positiv == "%" && $negativ == "%"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid modechanges."; return } channel set $channel protected-modes "$positiv $negativ" if {[lindex [channel get $channel "protected-modes"] 0] != "%" && [lindex [channel get $channel "protected-modes"] 0] != ""} { set positiv +[lindex [channel get $channel "protected-modes"] 0] } else { set positiv "" } if {[lindex [channel get $channel "protected-modes"] 1] != "%" && [lindex [channel get $channel "protected-modes"] 1] != ""} { set negativ -[lindex [channel get $channel "protected-modes"] 1] } else { set negativ "" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Protected mode changes \{$channel\} set to: $positiv$negativ" } # -- command showcommands proc command:showcommands { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set utrigger [getuser $handle XTRA trigger] if {[llength $utrigger] < 1} { set utrigger [join [string trim $::protection::settings::trigger]] } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Available commands for userlevel \{[::protection::user:level $handle $channel]\}" foreach overview "\{+help commands\} \{%general commands\} \{&protection commands (+protection req.)\} \{-free for all users\}" { set available 0 set list "" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :\A0\037[string range $overview 1 end]:\037" foreach cmd [lsort -dictionary [array names ::protection::settings::required]] { if {[lsearch -exact "$::protection::settings::required($cmd)" 0] < 0 && [lsearch -exact "$::protection::settings::required($cmd)" [::protection::user:level $handle $channel]] < 0} { continue } elseif {[string equal -nocase modechange $cmd]} { continue } elseif {[string index $::protection::settings::required($cmd) 0] != "[string index $overview 0]"} { continue } if {[llength $list] == "10"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :\A0\A0[join $list ", "]"; set list "" } lappend list $cmd set available 1 } if {!$available} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :No commands available for you." } if {[llength $list] != "0"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :\A0\A0[join $list ", "]" } } } # -- command mode {op:voice:deop:devoice} proc command:usermode { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig switch -exact -- $command { "op" { set mode +o } "voice" { set mode +v } "deop" { set mode -o } "devoice" { set mode -v } } if {[lsearch -exact "3 4 7 8" [::protection::user:level $handle $channel]] > -1 && [llength [split $arguments]] > 0 && ![string equal -nocase $nickname [join $arguments]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :You are not enough known on this channel \{$channel\} and can't [string toupper $command] other users!"; return } if {[llength $arguments] < 1 || [string equal -nocase $nickname [join [split $arguments]]]} { putquick "MODE $channel $mode $nickname"; return } set list "" foreach victim $arguments { set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} $victim] foreach user [chanlist $channel] { if {[llength $list] == "6"} { putquick "MODE $channel [string index $mode 0][string repeat [string index $mode 1] [llength $list]] [join $list]" -next; set list "" } if {([string length $user] != "1") && ![string equal -nocase $user $botnick] && ([string equal -nocase [join $victim] $user] || [string map {{*} {}} $victim] != "$victim" && [string match -nocase $victim $user![getchanhost $user]] || [string map {{?} {}} $victim] != "$victim" && [string match -nocase $victim $user])} { if {$mode == "+o" && [isop $user $channel] || [lsearch -exact "1 2" [::protection::user:level [nick2hand $user] $channel]] > -1} { continue } elseif {$mode == "-o" && (![isop $user $channel] || [lsearch -exact "4 5 6 8 9 10" [::protection::user:level [nick2hand $user] $channel]] > -1)} { continue } elseif {$mode == "-v" && (![isvoice $user $channel] || [lsearch -exact "3 4 5 6 7 8 9 10" [::protection::user:level [nick2hand $user] $channel]] > -1)} { continue } elseif {$mode == "+v" && [isvoice $user $channel]} { continue } lappend list $user } } } if {[llength $list] > 0} { putquick "MODE $channel [string index $mode 0][string repeat [string index $mode 1] [llength $list]] [join $list]" } } # -- command kickmsg {set:default} proc command:kickmsg { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel kick message \{$channel\} is: [join [channel get $channel "kick-message"]]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?kick message?\037" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 You can use :nickname:, :reason: and :counter: in the kick message too." return } channel set $channel kick-message $arguments putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel kick message \{$channel\} has been successfully set to: [join [channel get $channel "kick-message"]]" } # -- command banlist proc command:banlist { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set id 1 if {[string equal -nocase "-global" [lindex [split $arguments] 0]]} { if {[lsearch -exact "9 10" [::protection::user:level $handle $channel]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :You are not enough known to view the GLOBAL BANLIST!"; return } foreach ban [banlist] { if {[::protection::user:level $handle $channel] != 10 && ![string equal -nocase [lindex $ban 5] $handle] && [::protection::user:level [lindex $ban 5] $channel] >= [::protection::user:level $handle $channel]} { continue } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :#$id [lindex $ban 0] set by [lindex $ban 5] \{[expr {([expr [lindex $ban 2] - [unixtime]] > 0) ? "auto expire ([duration [expr [lindex $ban 2] - [unixtime]]])" : "perm. banned" }]\}" incr id 1 } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :End of global banlist. \{Total of [llength [banlist]] [expr {([llength [banlist]] == 1) ? "Ban" : "Bans" }]\}" return } foreach ban [banlist $channel] { if {[::protection::user:level $handle $channel] != 10 && ![string equal -nocase [lindex $ban 5] $handle] && [::protection::user:level [lindex $ban 5] $channel] >= [::protection::user:level $handle $channel]} { continue } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :#$id [lindex $ban 0] set by [lindex $ban 5] \{[expr {([expr [lindex $ban 2] - [unixtime]] > 0) ? "auto expire ([duration [expr [lindex $ban 2] - [unixtime]]])" : "perm. banned" }]\}" incr id 1 } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :End of $channel banlist. \{Total of [llength [banlist $channel]] [expr {([llength [banlist $channel]] == 1) ? "Ban" : "Bans" }]\}" if {[lsearch -exact "9 10" [::protection::user:level $handle $channel]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :To view the global banlist please use: $lasttrig \037-global\037" } } # -- command whois # - raw result proc command:whois:raw:end { server raw arguments } { catch { unbind RAW -|- {318} ::protection::command:whois:raw:end } catch { unbind RAW -|- {330} ::protection::command:whois:raw:authname } catch { unbind RAW -|- {311} ::protection::command:whois:raw:hostname } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global whoismask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {![info exists whoismask([string tolower [join [join $victim]]])] && [string index [join [join $victim]] 0] != "#"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } elseif {[string index [join [join $victim]] 0] == "#"} { set handle [string range [join [join $victim]] 1 end] } else { foreach user [userlist] { foreach hostname [getuser $user hosts] { foreach whoishost $whoismask([string tolower [join [join $victim]]]) { if {[string match -nocase $whoishost $hostname]} { set handle $user } } } } } if {![info exists handle]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Who on earth is that?" if {[info exists whoismask([string tolower [join [join $victim]]])]} { unset whoismask([string tolower [join [join $victim]]]) } return } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Information for account $handle" set nicknames "" foreach chan [channels] { foreach idler [chanlist $chan] { foreach hosts [getuser $handle hosts] { if {[string match -nocase $hosts $idler![getchanhost $idler]] && [lsearch -exact $nicknames $idler] < 0} { lappend nicknames $idler } } } } if {$nicknames == ""} { set nicknames "\{seems to be not online\}" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Account [expr {([llength $nicknames] == 1) ? "nickname" : "nicknames" }]: [join $nicknames ", "]" if {[matchattr $handle n]} { set global "bot owner"; set level 10 } elseif {[matchattr $handle m]} { set global "bot master"; set level 9 } elseif {[matchattr $handle o]} { set global "operator"; set level 8 } elseif {[matchattr $handle v]} { set global "voice"; set level 7 } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Known with [llength [getuser $handle hosts]] [expr {([llength [getuser $handle hosts]] == 1) ? "hostname" : "hostnames" }] \{[join [getuser $handle hosts] ", "]\}" if {[info exists global]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Known as global $global \{Level: $level\}" } foreach chan [channels] { if {![matchattr [nick2hand $lastnick] mn|mn $chan]} { continue } elseif {[lindex [split [chattr $handle - $chan] "|"] 1] == "-"} { continue } elseif {[matchattr $handle |S $chan]} { continue } if {[matchattr $handle |n $chan]} { set level 6 } elseif {[matchattr $handle |m $chan]} { set level 5 } elseif {[matchattr $handle |o $chan]} { set level 4 } elseif {[matchattr $handle |v $chan]} { set level 3 } elseif {[matchattr $handle |B $chan]} { set level 2 } elseif {[matchattr $handle |d $chan]} { set level 1 } else { continue } if {![info exists access($level)]} { set access($level) $chan } else { lappend access($level) $chan } } set curlevel 6 while {$curlevel > 0} { if {[info exists access($curlevel)]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Access level $curlevel on [join $access($curlevel) ", "]" } incr curlevel -1 } if {[info exists whoismask([string tolower [join [join $victim]]])]} { unset whoismask([string tolower [join [join $victim]]]) } } proc command:whois:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global whoismask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists whoismask([string tolower [join [join $victim]]])]} { set whoismask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend whoismask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:whois:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global whoismask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set whoismask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } # - panel proc command:whois { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037|\037#handle\037"; return } set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] bind RAW -|- {311} ::protection::command:whois:raw:hostname bind RAW -|- {330} ::protection::command:whois:raw:authname bind RAW -|- {318} ::protection::command:whois:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command unban # - raw result proc command:unban:raw:end { server raw arguments } { catch { unbind RAW -|- {330} ::protection::command:unban:raw:authname } catch { unbind RAW -|- {311} ::protection::command:unban:raw:hostname } catch { unbind RAW -|- {318} ::protection::command:unban:raw:end } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global unbanmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {![info exists unbanmask([string tolower [join [join $victim]]])] && ![regexp -- {\?|\*|\!|\@|\.|\~|\#} [join [join $victim]]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } if {[info exists unbanmask([string tolower [join [join $victim]]])] && ![string equal -nocase "all" [join [join $victim]]]} { set temp $unbanmask([string tolower [join [join $victim]]]); unset unbanmask([string tolower [join [join $victim]]]); set victim $temp } else { if {[info exists unbanmask([string tolower [join [join $victim]]])]} { unset unbanmask([string tolower [join [join $victim]]]) } set victim [join $victim] } set unbanned 0; set id 1 if {[string equal -nocase "-global" [lindex [split $lastargs] 1]]} { if {[lsearch -exact "9 10" [::protection::user:level [nick2hand $lastnick] $lastchan]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :You are not enough known to remove GLOBAL BANS!"; return } foreach ban [banlist] { if {[::protection::user:level [nick2hand $lastnick] $lastchan] != 10 && ![string equal -nocase [lindex $ban 5] [nick2hand $lastnick]] && [::protection::user:level [lindex $ban 5] $lastchan] >= [::protection::user:level [nick2hand $lastnick] $lastchan]} { continue } if {[string equal -nocase "all" $victim]} { killban [lindex $ban 0]; incr unbanned 1 } elseif {[string index $victim 0] == "#" && [string range $victim 1 end] == "$id"} { killban [lindex $ban 0]; incr unbanned 1 } else { foreach unban $victim { if {[string match -nocase $unban [lindex $ban 0]]} { killban [lindex $ban 0]; incr unbanned 1 } } } incr id 1 } } else { foreach ban [banlist $lastchan] { if {[::protection::user:level [nick2hand $lastnick] $lastchan] != 10 && ![string equal -nocase [lindex $ban 5] [nick2hand $lastnick]] && [::protection::user:level [lindex $ban 5] $lastchan] >= [::protection::user:level [nick2hand $lastnick] $lastchan]} { continue } if {[string equal -nocase "all" $victim]} { killchanban $lastchan [lindex $ban 0]; incr unbanned 1 } elseif {[string index $victim 0] == "#" && [string range $victim 1 end] == "$id"} { killchanban $lastchan [lindex $ban 0]; incr unbanned 1 } else { foreach unban $victim { if {[string match -nocase $unban [lindex $ban 0]]} { killchanban $lastchan [lindex $ban 0]; incr unbanned 1 } } } incr id 1 } } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$unbanned [expr {($unbanned == 1) ? "Ban" : "Bans" }] removed." } proc command:unban:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global unbanmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists unbanmask([string tolower [join [join $victim]]])]} { set unbanmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend unbanmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:unban:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global unbanmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set unbanmask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } # - panel proc command:unban { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037all\037|\037nickname\037|\037hostmask\037|\037#number\037 \037?-global?\037"; return } set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] bind RAW -|- {311} ::protection::command:unban:raw:hostname bind RAW -|- {330} ::protection::command:unban:raw:authname bind RAW -|- {318} ::protection::command:unban:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command ban # - raw result proc command:ban:raw:end { server raw arguments } { catch { unbind RAW -|- {313} ::protection::command:ban:raw:operator } catch { unbind RAW -|- {318} ::protection::command:ban:raw:end } catch { unbind RAW -|- {311} ::protection::command:ban:raw:hostname } catch { unbind RAW -|- {330} ::protection::command:ban:raw:authname } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global banmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {![info exists banmask([string tolower [join [join $victim]]])] && ![regexp -- {\?|\*|\!|\@|\.|\~|\#} [join [join $victim]]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } if {[info exists banmask([string tolower [join [join $victim]]])]} { set temp $banmask([string tolower [join [join $victim]]]); unset banmask([string tolower [join [join $victim]]]); set victim $temp } else { set victim [join $victim] } if {[string equal -nocase "-global" [lindex [split $lastargs] 1]]} { set global 1 } else { set global 0 } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } if {$global} { if {[lsearch -exact "9 10" [::protection::user:level [nick2hand $lastnick] $lastchan]] < 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :You are not enough known to set up GLOBAL BANS!"; return } if {[string index [lindex [split $lastargs] 2] 0] == "%"} { set duration [string range [lindex [split $lastargs] 2] 1 end]; set reason [join [lrange [split $lastargs] 3 end]] } else { set duration 1h; set reason [join [lrange [split $lastargs] 2 end]] } } else { if {[string index [lindex [split $lastargs] 1] 0] == "%"} { set duration [string range [lindex [split $lastargs] 1] 1 end]; set reason [join [lrange [split $lastargs] 2 end]] } else { set duration 1h; set reason [join [lrange [split $lastargs] 1 end]] } } if {$duration != "0"} { set temporary 0 array set variables { "y" {525600} "w" {10080} "d" {1440} "h" {60} "m" {1} } foreach {variable minutes} [array get variables] { if {![regexp -nocase "(\[0-9\]{1,})$variable" $duration incr]} { continue } incr temporary [expr [string trimright $incr $variable] * $minutes] } if {$temporary == "0"} { set temporary 60 } set duration $temporary } if {[string index $victim 0] == "#"} { set victim *!*@[string range $victim 1 end].users.quakenet.org } if {$duration == "0" || [duration [expr $duration * 60]] == "0 seconds"} { set result "\{Permanent Banned\}"; set duration 0 } else { set result "\{Temporary Banned, auto expire in [duration [expr $duration * 60]]. ([strftime "%A, %d.%m.%y - %H:%M:%S" [expr $duration * 60 + [unixtime]]])\}" } if {[llength [join $reason]] < 1} { if {$global} { if {$duration == "0"} { set reason "You have been GLOBAL PERM BANNED from all channels." } else { set reason "You have been GLOBAL BANNED for [duration [expr $duration * 60]] from all channels." } } else { if {$duration == "0"} { set reason "You have been PERM BANNED from this channel. ($lastchan)" } else { set reason "You have been BANNED from this channel ($lastchan) for [duration [expr $duration * 60]]." } } } set error 0 set banmasks $victim set nickname $lastnick set channel $lastchan set reason [join $reason] set counter [expr [channel get $channel "kick-id"] + 1] foreach bmask $banmasks { if {[string map {{*} {} {?} {} {.} {}} $bmask] == "!@" || ![regexp -- {^.+!.+@.+$} $bmask]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$bmask is a invalid banmask. \{nickname!ident@hostname\}"; return } elseif {[string match -nocase $bmask $botname]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$bmask would match my hostname."; return } foreach handle [userlist mno|mno $channel] { if {[lsearch [string tolower [getuser $handle hosts]] [string tolower $bmask]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :$bmask would match one of my users. \{$handle\}"; return } } if {$global} { newban $bmask [nick2hand $lastnick] [string map "\":nickname:\" \"$lastnick\" \":reason:\" \"$reason\" \":counter:\" \"$counter\"" [join [channel get $channel "kick-message"]]] $duration } else { if {![regexp -- {\?|\*|\!|\@|\.|\~|\#} [join [lindex [split $arguments] 1]]] && [onchan [join [lindex [split $arguments] 1]] $lastchan]} { putquick "KICK $channel [join [lindex [split $arguments] 1]] :[string map "\":nickname:\" \"$lastnick\" \":reason:\" \"$reason\" \":counter:\" \"$counter\"" [join [channel get $channel "kick-message"]]]" putquick "MODE $channel [string repeat "b" [llength [join $banmasks]]] [join $banmasks]" } newchanban $lastchan $bmask [nick2hand $lastnick] [string map "\":nickname:\" \"$lastnick\" \":reason:\" \"$reason\" \":counter:\" \"$counter\"" [join [channel get $channel "kick-message"]]] $duration } } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[expr {([llength $banmasks] == 1) ? "Banmask" : "Banmasks" }] '[join $banmasks ", "]' [expr {([llength $banmasks] == 1) ? "has" : "have" }] been successfully set. $result" -next } proc command:ban:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global banmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists banmask([string tolower [join [join $victim]]])]} { set banmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend banmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:ban:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global banmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set banmask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } proc command:ban:raw:operator { server raw arguments } { catch { unbind RAW -|- {313} ::protection::command:ban:raw:operator } catch { unbind RAW -|- {330} ::protection::command:ban:raw:authname } catch { unbind RAW -|- {311} ::protection::command:ban:raw:hostname } catch { unbind RAW -|- {318} ::protection::command:ban:raw:end } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :You are not allowed to BAN an IRC Operator/Helper/Service. \{[join [join $victim]]\}" if {[info exists banmask([string tolower [join [join $victim]]])]} { unset banmask([string tolower [join [join $victim]]]) } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "*Copyright miss* >:(" } } # - panel proc command:ban { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037|\037#authname\037|\037hostmask\037 \037?-global?\037 \037?%duration?\037 \037?reason?\037"; return } set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] bind RAW -|- {311} ::protection::command:ban:raw:hostname bind RAW -|- {330} ::protection::command:ban:raw:authname bind RAW -|- {313} ::protection::command:ban:raw:operator bind RAW -|- {318} ::protection::command:ban:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command adduser # - raw result proc command:adduser:raw:end { server raw arguments } { catch { unbind RAW -|- {318} ::protection::command:adduser:raw:end } catch { unbind RAW -|- {311} ::protection::command:adduser:raw:hostname } catch { unbind RAW -|- {330} ::protection::command:adduser:raw:authname } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {![info exists hostmask([string tolower [join [join $victim]]])]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } foreach handle [userlist] { foreach addhost $hostmask([string tolower [join [join $victim]]]) { foreach hostname [getuser $handle hosts] { if {[string match -nocase $addhost $hostname]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Already recognizing [string trim [lindex [split $arguments] 1]] as $handle"; return } } } } adduser [lindex [split $lastargs] 1] switch -exact -- [lindex [split $lastargs] 2] { "10" { chattr [lindex [split $lastargs] 1] +amnov; set level "[lindex [split $lastargs] 2] 'Bot Owner'"; foreach channel [channels] { pushmode $channel +o [string trim [lindex [split $arguments] 1]] } } "9" { chattr [lindex [split $lastargs] 1] +amov; set level "[lindex [split $lastargs] 2] 'Bot Master'"; foreach channel [channels] { pushmode $channel +o [string trim [lindex [split $arguments] 1]] } } "8" { chattr [lindex [split $lastargs] 1] +aov; set level "[lindex [split $lastargs] 2] 'Global Operator'"; foreach channel [channels] { pushmode $channel +o [string trim [lindex [split $arguments] 1]] } } "7" { chattr [lindex [split $lastargs] 1] +av; set level "[lindex [split $lastargs] 2] 'Global Voice'"; foreach channel [channels] { pushmode $channel +v [string trim [lindex [split $arguments] 1]] } } "6" { chattr [lindex [split $lastargs] 1] |+amnov $lastchan; set level "[lindex [split $lastargs] 2] 'Channel Owner'"; pushmode $lastchan +o [string trim [lindex [split $arguments] 1]] } "5" { chattr [lindex [split $lastargs] 1] |+amov $lastchan; set level "[lindex [split $lastargs] 2] 'Channel Master'"; pushmode $lastchan +o [string trim [lindex [split $arguments] 1]] } "4" { chattr [lindex [split $lastargs] 1] |+aov $lastchan; set level "[lindex [split $lastargs] 2] 'Channel Operator'"; pushmode $lastchan +o [string trim [lindex [split $arguments] 1]] } "3" { chattr [lindex [split $lastargs] 1] |+av $lastchan; set level "[lindex [split $lastargs] 2] 'Channel Voice'"; pushmode $lastchan +v [string trim [lindex [split $arguments] 1]] } "2" { chattr [lindex [split $lastargs] 1] |+d $lastchan; set level "[lindex [split $lastargs] 2] 'Autodeop'"; pushmode $lastchan -o [string trim [lindex [split $arguments] 1]] } "1" { chattr [lindex [split $lastargs] 1] |+B $lastchan; set level "[lindex [split $lastargs] 2] 'Banned from channel'" set reason "You have been BANNED from this channel." set counter [expr [channel get $lastchan "kick-id"] + 1] if {[onchan [string trim [lindex [split $arguments] 1]] $lastchan]} { putquick "KICK $lastchan [string trim [lindex [split $arguments] 1]] :[string map "\":nickname:\" \"$lastnick\" \":reason:\" \"$reason\" \":counter:\" \"$counter\"" [join [channel get $lastchan "kick-message"]]]" putquick "MODE $lastchan [string repeat "b" [llength [join $hostmask([string tolower [join [join $victim]]])]]] [join $hostmask([string tolower [join [join $victim]]])]" } } } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "READD TEH FUCKIN' COPYRIGHT..." } foreach hostname $hostmask([string tolower [join [join $victim]]]) { setuser [lindex [split $lastargs] 1] hosts [join $hostname] } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :[string trim [lindex [split $arguments] 1]] \{[join $hostmask([string tolower [join [join $victim]]]) ", "]\} successfully added with handle #[lindex [split $lastargs] 1] and level $level to the userlist." unset hostmask([string tolower [join [join $victim]]]) } proc command:adduser:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists hostmask([string tolower [join [join $victim]]])]} { set hostmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend hostmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:adduser:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set hostmask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } # - panel proc command:adduser { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig array set levels { "10" {1 2 3 4 5 6 7 8 9 10} "9" {1 2 3 4 5 6 7 8} "6" {2 3 4 5 6} "5" {2 3 4} } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Touching teh copyright sucks as much as life >:(" } set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] regsub -nocase -all {[A\D6\DC\E4\F6\FCA-Za-z0-9\s]} [join [lindex [split $arguments] 1]] "" check if {[llength [split $arguments]] < 3 || [lsearch -exact $levels([::protection::user:level $handle $channel]) [lindex [split $arguments] 2]] < 0 || [string length [lindex [split $arguments] 1]] > $::handlen} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037 \037handle\037 \{max. $::handlen characters\} \037level\037 \{[join $levels([::protection::user:level $handle $channel]) ", "]\}"; return } elseif {[validuser [lindex [split $arguments] 1]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Handle '[lindex [split $arguments] 1]' already in use."; return } elseif {[string length $check] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid handle characters specified: [join [split $check ""] ", "]"; return } elseif {[isbotnick [join [join $victim]]]} { putquick "PRIVMSG $channel :\001ACTION slaps $nickname with a fish\001"; return } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "OMG, WTF?!?!? XD" } bind RAW -|- {311} ::protection::command:adduser:raw:hostname bind RAW -|- {330} ::protection::command:adduser:raw:authname bind RAW -|- {318} ::protection::command:adduser:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command access # - raw result proc command:access:raw:end { server raw arguments } { catch { unbind RAW -|- {318} ::protection::command:access:raw:end } catch { unbind RAW -|- {330} ::protection::command:access:raw:authname } catch { unbind RAW -|- {311} ::protection::command:access:raw:hostname } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global levelmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {![info exists levelmask([string tolower [join [join $victim]]])] && [string index [join [join $victim]] 0] != "#"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } elseif {[string index [join [join $victim]] 0] == "#"} { set handle [string range [join [join $victim]] 1 end] } else { foreach user [userlist] { foreach hostname [getuser $user hosts] { foreach whoishost $levelmask([string tolower [join [join $victim]]]) { if {[string match -nocase $whoishost $hostname]} { set handle $user } } } } } if {![info exists handle]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Who on earth is that?" if {[info exists levelmask([string tolower [join [join $victim]]])]} { unset levelmask([string tolower [join [join $victim]]]) } return } if {![regexp -- {[0-9]{1,}} [lindex [split $lastargs] 1]]} { if {[string equal -nocase clear [lindex [split $lastargs] 1]]} { if {![string equal -nocase -global [lindex [split $lastargs] end]]} { if {[::protection::user:level [nick2hand $lastnick] $lastchan] == "6" && [lsearch -exact "6 7" [::protection::user:level $handle $lastchan]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle is known with an higher or equal level." } else { if {[::protection::user:level $handle $lastchan] > 5} { chattr $handle |-amnov $lastchan } else { chattr $handle |-aov $lastchan } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Access level cleared." } } else { if {[::protection::user:level [nick2hand $lastnick] $lastchan] == "9" && [lsearch -exact "9 10" [::protection::user:level $handle $lastchan]] > -1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle is known with an higher or equal level." } else { if {[::protection::user:level $handle $lastchan] > 8} { chattr $handle -amnov } else { chattr $handle -aov } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Access level cleared." } } } elseif {[string equal -nocase -global [lindex [split $lastargs] end]]} { if {![matchattr $handle mnov]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle is not known with any global access." } else { if {[matchattr $handle n]} { set access "owner"; set lvl 10 } elseif {[matchattr $handle m]} { set access "master"; set lvl 9 } elseif {[matchattr $handle o]} { set access "operator"; set lvl 8 } elseif {[matchattr $handle v]} { set access "voice"; set lvl 7 } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle global access level is: $lvl \{$access\}" } } else { if {![matchattr $handle |mnoBSdv $lastchan]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle is not known with any access on $lastchan." } else { if {[matchattr $handle |S $lastchan]} { set access "quakenet service"; set lvl "" } elseif {[matchattr $handle |n $lastchan]} { set access "owner"; set lvl 6 } elseif {[matchattr $handle |m $lastchan]} { set access "master"; set lvl 5 } elseif {[matchattr $handle |o $lastchan]} { set access "opera"; set lvl 4 } elseif {[matchattr $handle |v $lastchan]} { set access "voice"; set lvl 3 } elseif {[matchattr $handle |B $lastchan]} { set access "banned"; set lvl 2 } elseif {[matchattr $handle |d $lastchan]} { set access "auto deop"; set lvl 1 } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$handle access level on $lastchan is: $lvl \{$access\}" } } } else { if {[::protection::user:level [nick2hand $lastnick] $lastchan] != "10" && [lindex [split $lastargs] 1] >= [::protection::user:level [nick2hand $lastnick] $lastchan]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :You are not enough known to add this level." } else { switch -exact -- [lindex [split $lastargs] 1] { "10" { chattr $handle +amnov; set level "[lindex [split $lastargs] 1] 'Bot Owner'" } "9" { chattr $handle -n+amov; set level "[lindex [split $lastargs] 1] 'Bot Master'" } "8" { chattr $handle -nm+aov; set level "[lindex [split $lastargs] 1] 'Global Operator'" } "7" { chattr $handle -nmo+av; set level "[lindex [split $lastargs] 1] 'Global Voice'" } "6" { chattr $handle |+amnov $lastchan; set level "[lindex [split $lastargs] 1] 'Channel Owner'" } "5" { chattr $handle |+amov-n $lastchan; set level "[lindex [split $lastargs] 1] 'Channel Master'" } "4" { chattr $handle |+aov-nm $lastchan; set level "[lindex [split $lastargs] 1] 'Channel Operator'" } "3" { chattr $handle |+av-nmo $lastchan; set level "[lindex [split $lastargs] 1] 'Channel Voice'"} "2" { chattr $handle |+d-nmova $lastchan; set level "[lindex [split $lastargs] 1] 'Autodeop'" } "1" { chattr $handle |+B-nmova $lastchan; set level "[lindex [split $lastargs] 1] 'Banned from channel'" } } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Level successfully set to $level" } } if {[info exists levelmask([string tolower [join [join $victim]]])]} { unset levelmask([string tolower [join [join $victim]]]) } } proc command:access:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global levelmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists levelmask([string tolower [join [join $victim]]])]} { set levelmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend levelmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:access:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global levelmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set levelmask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } # - panel proc command:access { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] regsub -nocase -all {[A\D6\DC\E4\F6\FCA-Za-z0-9#\s]} [join [join $victim]] "" check if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037|\037#handle\037 ?\037level\037|\037clear\037? \037?-global?\037"; return } elseif {[string index [join [join $victim]] 0] == "#" && [string length $check] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid handle characters specified: [join [split $check ""] ", "]"; return } bind RAW -|- {311} ::protection::command:access:raw:hostname bind RAW -|- {330} ::protection::command:access:raw:authname bind RAW -|- {318} ::protection::command:access:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command deluser # - raw result proc command:deluser:raw:end { server raw arguments } { catch { unbind RAW -|- {318} ::protection::command:deluser:raw:end } catch { unbind RAW -|- {311} ::protection::command:deluser:raw:hostname } catch { unbind RAW -|- {330} ::protection::command:deluser:raw:authname } global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [string trim [lindex [split $arguments] 1]]] if {[string index [join [join $victim]] 0] != "#" && ![info exists hostmask([string tolower [join [join $victim]]])]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is currently not online."; return } if {[string index [join [join $victim]] 0] == "#"} { if {![validuser [string range [join [join $victim]] 1 end]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Unknown handle specified. \{[string range [join [join $victim]] 1 end]\}"; return } elseif {[string equal -nocase [string range [join [join $victim]] 1 end] [nick2hand $lastnick]] || [matchattr [string range [join [join $victim]] 1 end] |S $lastchan]} { putquick "PRIVMSG $lastchan :\001ACTION slaps $lastnick XD\001"; return } if {[deluser [string range [join [join $victim]] 1 end]]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :[join [join $victim]] has been successfully deleted." } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Unknown error." } return } set found "" foreach handle [userlist] { if {[string equal -nocase [nick2hand $lastnick] $handle]} { continue } foreach addhost $hostmask([string tolower [join [join $victim]]]) { foreach hostname [getuser $handle hosts] { if {[string match -nocase $addhost $hostname] && [lsearch -exact $found $handle] < 0} { lappend found $handle } } } } unset hostmask([string tolower [join [join $victim]]]) if {[llength $found] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :Seems like that [string trim [lindex [split $arguments] 1]] is not known to me."; return } set deleted 0 foreach handle $found { if {[::protection::user:level [nick2hand $lastnick] $lastchan] == "9" && [lsearch -exact "6 9 10" [::protection::user:level $handle $lastchan]] > -1} { continue } elseif {[::protection::user:level [nick2hand $lastnick] $lastchan] == "5" && [lsearch -exact "6 7 8 9 10" [::protection::user:level $handle $lastchan]] > -1} { continue } if {[deluser $handle]} { incr deleted 1 } } putserv "[getuser [nick2hand $lastnick] XTRA methode] $lastnick :$deleted of [llength $found] [expr {([llength $found] == 1) ? "handle" : "handles" }] for [string trim [lindex [split $arguments] 1]] were deleted." } proc command:deluser:raw:authname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![info exists hostmask([string tolower [join [join $victim]]])]} { set hostmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } else { lappend hostmask([string tolower [join [join $victim]]]) *!*@[lindex [split $arguments] 2].users.quakenet.org } } proc command:deluser:raw:hostname { server raw arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig global hostmask set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 1]] if {![string match "*users.quakenet.org" [lindex [split $arguments] 2]@[lindex [split $arguments] 3]]} { set hostmask([string tolower [join [join $victim]]]) [maskhost [lindex [split $arguments] 2]@[lindex [split $arguments] 3]] } } # - panel proc command:deluser { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig set victim [string map {"\{" "\\\{" "\\" "\\\\" "\}" "\\\}" "\[" "\\\[" "\]" "\\\]"} [lindex [split $arguments] 0]] regsub -nocase -all {[A\D6\DC\E4\F6\FCA-Za-z0-9\s]} [join [lindex [split $arguments] 1]] "" check if {[llength [split $arguments]] < 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037nickname\037|\037#handle\037"; return } elseif {[string length $check] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid handle characters specified: [join [split $check ""] ", "]"; return } elseif {[isbotnick [join [join $victim]]] || [string equal -nocase [join [join $victim]] $nickname] || [string equal -nocase [join [join $victim]] $handle]} { putquick "PRIVMSG $channel :\001ACTION slaps $nickname with a fish\001"; return } elseif {[matchattr [join [join $victim]] |S $channel] || [string length [join [join $victim]]] == 1} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Not allowed."; return } bind RAW -|- {311} ::protection::command:deluser:raw:hostname bind RAW -|- {330} ::protection::command:deluser:raw:authname bind RAW -|- {318} ::protection::command:deluser:raw:end putquick "WHOIS [join [join $victim]]" -next } # -- command bitchmode proc command:bitchmode { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[lsearch -exact "on off" [string tolower [lindex [split $arguments] 0]]] < 0} { if {[channel get $channel "bitchmode"]} { set status "enabled \{Maximal [lindex [split [channel get $channel "maximal-modes"] ":"] 0] [expr {([lindex [split [channel get $channel "maximal-modes"] ":"] 0] == 1) ? "mode" : "modes" }] in [duration [lindex [split [channel get $channel "maximal-modes"] ":"] 1]] allowed\}" } else { set status "disabled" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel bitchmode status \{$channel\} is: [string toupper [lindex $status 0]] [lrange $status 1 end]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?on\037|\037off?\037" return } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } if {[string equal -nocase on [lindex [split $arguments] 0]]} { channel set $channel +bitchmode } else { channel set $channel -bitchmode } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel bitchmode status \{$channel\} successfully turned [string toupper [lindex [split $arguments] 0]]" } # -- command topicsave proc command:topicsave { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[lsearch -exact "on off" [string tolower [lindex [split $arguments] 0]]] < 0} { if {[channel get $channel "topicsave"]} { set status enabled } else { set status disabled } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel topicsave status \{$channel\} is: [string toupper $status]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?on\037|\037off?\037" return } if {[string equal -nocase on [lindex [split $arguments] 0]]} { channel set $channel +topicsave if {[topic $channel] != ""} { channel set $channel channel-topic [topic $channel] } } else { channel set $channel -topicsave; channel set $channel channel-topic "" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel topicsave status \{$channel\} successfully turned [string toupper [lindex [split $arguments] 0]]" } # -- command maximal modes proc command:maxmodes { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {![regexp -- {[0-9]{1,}:[0-9]{1,}} [lindex [split $arguments] 0]] || [lindex [split [lindex [split $arguments] 0] ":"] 0] > 12 || [lindex [split [lindex [split $arguments] 0] ":"] 0] == "0" || [lindex [split [lindex [split $arguments] 0] ":"] 1] == "0"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel maximal modes \{$channel\} [expr {([lindex [split [channel get $channel "maximal-modes"] ":"] 0] == 1) ? "is" : "are" }]: [lindex [split [channel get $channel "maximal-modes"] ":"] 0] [expr {([lindex [split [channel get $channel "maximal-modes"] ":"] 0] == 1) ? "mode" : "modes" }] in [duration [lindex [split [channel get $channel "maximal-modes"] ":"] 1]]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?modes:seconds?\037 \{maximal modes are 12\}" return } channel set $channel maximal-modes [lindex [split $arguments] 0] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel maximal modes \{$channel\} successfully set up to: [lindex [split [channel get $channel "maximal-modes"] ":"] 0] [expr {([lindex [split [channel get $channel "maximal-modes"] ":"] 0] == 1) ? "mode" : "modes" }] in [duration [lindex [split [channel get $channel "maximal-modes"] ":"] 1]]" } # -- command maximal kicks proc command:maxkicks { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {![regexp -- {[0-9]{1,}:[0-9]{1,}} [lindex [split $arguments] 0]] || [lindex [split [lindex [split $arguments] 0] ":"] 0] > 5 || [lindex [split [lindex [split $arguments] 0] ":"] 0] == "0" || [lindex [split [lindex [split $arguments] 0] ":"] 1] == "0"} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current channel maximal kicks \{$channel\} [expr {([lindex [split [channel get $channel "maximal-kicks"] ":"] 0] == 1) ? "is" : "are" }]: [lindex [split [channel get $channel "maximal-kicks"] ":"] 0] [expr {([lindex [split [channel get $channel "maximal-kicks"] ":"] 0] == 1) ? "kick" : "kicks" }] in [duration [lindex [split [channel get $channel "maximal-kicks"] ":"] 1]]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?kicks:seconds?\037 \{maximal kicks are 5\}" return } channel set $channel maximal-kicks [lindex [split $arguments] 0] putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel maximal kicks \{$channel\} successfully set up to: [lindex [split [channel get $channel "maximal-kicks"] ":"] 0] [expr {([lindex [split [channel get $channel "maximal-kicks"] ":"] 0] == 1) ? "kick" : "kicks" }] in [duration [lindex [split [channel get $channel "maximal-kicks"] ":"] 1]]" } # -- command remove flags proc command:remflags { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {[llength [set flags [string tolower [lindex [split $arguments] 0]]]] < 1 || ![regexp -- {\+|\-} $flags] && ![string equal -nocase none $flags]} { if {[llength [set flags [channel get $channel "remove-flags"]]] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Current flags to remove \{$channel\} are: $flags" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?+-flags?\037|\037none\037" return } if {[string equal -nocase none $flags]} { channel set $channel remove-flags "" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Bot won't remove any flags. \{$channel\}" return } if {[onchan Q $channel]} { regsub -all {[amnotvb\+\-]} $flags "" check } elseif {[onchan L $channel]} { regsub -all {[aomnvg\+\-]} $flags "" check } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :There is currently no Quakenet Service \{Q|L\} in $channel"; return } if {[llength $check] > 0} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Invalid flags specified \{$channel\}: [join [split $check ""] ", "]"; return } channel set $channel remove-flags $flags putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Channel flags to remove \{$channel\} set to: $flags" if {[string match "*m*" $flags]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 In order to remove the requested flags it's required to add me OWNER status in $channel \{ /MSG [join [userlist |S $channel] ","] CHANLEV $channel $botnick +n \}" } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Informatio\037n\037\002:\002 In order to remove the requested flags it's required to add me MASTER status in $channel \{ /MSG [join [userlist |S $channel] ","] CHANLEV $channel $botnick +amo \}" } } # -- command automode {operator:voice} proc command:automode { command nickname hostname handle channel arguments } { global botnick botname global lastnick lastchan lastargs lastcmd lasttrig if {$command == "autoop"} { set flag onjoin-operator; set other onjoin-voice } else { set flag onjoin-voice; set other onjoin-operator } set option [string tolower [lindex [split $arguments] 0]] switch -exact -- $option { "off" { if {![channel get $channel $flag]} { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[string toupper [string index $command 0]][string tolower [string range $command 1 end]] status \{$channel\} should be already [string toupper $option]" } else { channel set $channel -$flag; putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[string toupper [string index $command 0]][string tolower [string range $command 1 end]] status \{$channel\} successfully turned [string toupper $option]" } } "on" { if {![channel get $channel $flag]} { channel set $channel +$flag -$other; putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[string toupper [string index $command 0]][string tolower [string range $command 1 end]] status \{$channel\} successfully turned [string toupper $option]" } else { putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[string toupper [string index $command 0]][string tolower [string range $command 1 end]] status \{$channel\} should be already [string toupper $option]" } } "default" { if {![channel get $channel $flag]} { set status "off" } else { set status "on" } putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :[string toupper [string index $command 0]][string tolower [string range $command 1 end]] status \{$channel\} is: [string toupper $status]" putserv "[getuser [nick2hand $lastnick] XTRA methode] $nickname :Please use: $lasttrig \037?#channel?\037 \037?on\037|\037off?\037" } } } # --- remove Delay join +D # -- raw result # - end proc clear:delay:end { server raw arguments } { catch { unbind RAW -|- {355} ::protection::clear:delay } catch { unbind RAW -|- {366} ::protection::clear:delay:end } if {[info exists ::cleared([lindex [split $arguments] 1])]} { putserv "PRIVMSG [lindex [split $arguments] 1] :\001ACTION welcome back you hidden users ... \\\\\F4\001"; unset ::cleared([lindex [split $arguments] 1]) } } # - input proc clear:delay { server raw arguments } { set channel [lindex [split $arguments] 2] set victims [lrange [split $arguments] 3 end] if {[string index $victims 0] == ":"} { set victims [string range $victims 1 end] } set list "" foreach victim $victims { if {[llength $list] == "6"} { set ::cleared($channel) 1 putserv "MODE $channel +vvvvvv [join $list]" if {![channel get $channel "onjoin-voice"]} { utimer 1 [list putserv "MODE $channel -vvvvvv [join $list]"] } set list "" } lappend list $victim } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "You did this nice script? don't think so ;)" } if {[llength $list] != "0"} { set ::cleared($channel) 1 putserv "MODE $channel +[string repeat "v" [llength [join $list]]] [join $list]" if {![channel get $channel "onjoin-voice"]} { utimer 1 [list putserv "MODE $channel -[string repeat "v" [llength [join $list]]] [join $list]"] } } } # --- protection {topic:mode:kick} # -- topic change proc topic:change { nickname hostname handle channel topic } { global flags if {![channel get $channel "topicsave"] || $topic == "[join [channel get $channel "channel-topic"]]"} { return } elseif {[::protection::mode:change:abort $nickname $hostname $handle $channel] && $topic != ""} { channel set $channel channel-topic $topic; return } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" } if {[onchan Q $channel]} { puthelp "PRIVMSG Q :SETTOPIC $channel [join [channel get $channel "channel-topic"]]" } else { puthelp "TOPIC $channel :[join [channel get $channel "channel-topic"]]" } set reason "Don't abuse your operator privileges!" if {[channel get $channel "remove-flags"] != "" && ![info exists flags(removed:$hostname:$channel)]} { putquick "PRIVMSG $service :CHANLEV $channel $nickname [channel get $channel "remove-flags"]" -next set flags(removed:$hostname:$channel) 1 utimer 5 [list ::protection::unset:variable flags(removed:$hostname:$channel)] } if {[string match "*users.quakenet.org" $hostname]} { set banmask *!*@[lindex [split $hostname "@"] 1] } else { set banmask [maskhost $hostname] } switch -exact -- [channel get $channel "punish-methode"] { "1" { if {![botisop $channel]} { return }; putquick "MODE $channel -o $nickname" -next } "2" { if {![onchan $nickname $channel]} { return }; putquick "KICK $channel $nickname :[string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]]" } "3" { newchanban $channel $banmask #xela [string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]] 15 } } } # -- mode change proc mode:change { nickname hostname handle channel mode victim } { global botnick botname global modes victims after operator last if {[info exists after($hostname:$channel)]} { after cancel $after($hostname:$channel); unset after($hostname:$channel) } if {![channel get $channel "protection"]} { return } set service [join [userlist |S $channel] ","] if {![info exists modes($hostname:$channel)]} { set modes($hostname:$channel) "" } if {![info exists victims($hostname:$channel)]} { set victims($hostname:$channel) "" } lappend modes($hostname:$channel) $mode if {$victim != ""} { lappend victims($hostname:$channel) $victim } if {$mode == "+b" && $nickname == "Q" && [string match -nocase $victim $botname]} { clearqueue all putquick "PRIVMSG Q :BANDEL $channel $victim" -next if {[botonchan $channel] && [botisop $channel]} { putquick "MODE $channel -b $victim" -next } else { putquick "JOIN $channel" -next } if {[info exists after($hostname:$channel)]} { after cancel $after($hostname:$channel); unset after($hostname:$channel) } if {[info exists modes($hostname:$channel)]} { unset modes($hostname:$channel) } if {[info exists victims($hostname:$channel)]} { unset victims($hostname:$channel) } return } if {![::protection::mode:change:abort $nickname $hostname $handle $channel] && [string index $mode 1] == "o" && [lsearch -exact "4 5 6 8 9 10" [::protection::user:level [nick2hand $victim] $channel]] < 0} { if {![info exists operator($channel)]} { set operator($channel) 1; utimer [lindex [split [channel get $channel "maximal-modes"] ":"] 1] [list ::protection::unset:variable operator($channel)] } else { incr operator($channel) 1 } if {[info exists operator($channel)] && $operator($channel) == "[lindex [split [channel get $channel "maximal-modes"] ":"] 0]"} { ::protection::unset:variable operator($channel) clearqueue all if {[info exists after($hostname:$channel)]} { after cancel $after($hostname:$channel); unset after($hostname:$channel) } if {[info exists modes($hostname:$channel)]} { unset modes($hostname:$channel) } if {[info exists victims($hostname:$channel)]} { unset victims($hostname:$channel) } if {[info exists last(service:$channel)] && [expr [unixtime] - $last(service:$channel)] < 1} { return } foreach option [split [channel get $channel "reaction-mass-mode"] ":"] { if {[string equal -nocase "reop" $option]} { if {![botisop $channel]} { putquick "PRIVMSG $service :OP $channel" -next } } else { if {[string equal -nocase "invite" $option] && ![botonchan $channel]} { putquick "PRIVMSG $service :$option $channel" -next } elseif {[string equal -nocase "unbanall" $option] && $service == "Q"} { putquick "PRIVMSG $service :BANCLEAR $channel" -next } else { putquick "PRIVMSG $service :$option $channel" -next } } } set last(service:$channel) [unixtime] return } } if {[llength $victims($hostname:$channel)] >= 6} { set delay 1 } else { set delay 0 } set after($hostname:$channel) [after $delay [list ::protection::mode:change:parse $nickname $hostname $handle $channel $modes($hostname:$channel) $victims($hostname:$channel)]] } proc mode:change:parse { nickname hostname handle channel modechg victim } { global botnick botname global modes victims after start flags set service [join [userlist |S $channel] ","] if {[llength $hostname] > 0} { if {[string match "*users.quakenet.org" $hostname]} { set banmask *!*@[lindex [split $hostname "@"] 1] } else { set banmask [maskhost $hostname] } } if {[info exists victims($hostname:$channel)]} { unset victims($hostname:$channel) } if {[info exists modes($hostname:$channel)]} { unset modes($hostname:$channel) } set mode-change "" set mode-last "+" set mode-string "0" set punish "0" foreach mode [split $modechg ""] { if {$mode == "+" || $mode == "-"} { set mode-last $mode; continue } if {[lsearch -exact "o b k v" $mode] > -1 || ${mode-last} == "+" && $mode == "l"} { lappend mode-change "${mode-last}${mode} [lindex $victim ${mode-string}]"; incr mode-string 1 } else { lappend mode-change "${mode-last}${mode}" } } set punish-methode [channel get $channel "punish-methode"] set negativ-mode "-" set positiv-mode "+" set negativ-victim "" set positiv-victim "" set punish "0" set reason "Don't abuse your operator privileges!" if {${punish-methode} != "2"} { append negativ-mode o; set negativ-victim $nickname } if {${punish-methode} == "3"} { append positiv-mode b; set positiv-victim $banmask if {[isvoice $nickname $channel]} { append negativ-mode v; lappend negativ-victim $nickname } } foreach mode ${mode-change} { set victim [lindex $mode 1] set mode [lindex $mode 0] if {[string index $mode 1] == ""} { continue } set total [expr [llength ${negativ-victim}] + [llength ${positiv-victim}]] if {$total == "6" && $punish && [botonchan $channel] && [botisop $channel]} { if {[channel get $channel "remove-flags"] != "" && ![info exists flags(removed:$hostname:$channel)]} { putquick "PRIVMSG $service :CHANLEV $channel $nickname [channel get $channel "remove-flags"]" -next set flags(removed:$hostname:$channel) 1 utimer 5 [list ::protection::unset:variable flags(removed:$hostname:$channel)] } putquick "MODE $channel ${negativ-mode}${positiv-mode} [join "${negativ-victim} ${positiv-victim}"]" -next set negativ-mode "-"; set positiv-mode "+"; set negativ-victim ""; set positiv-victim "" } if {$mode == "+o" && [string equal -nocase $botnick [join $victim]]} { continue } elseif {$mode == "-D" && [isbotnick $nickname]} { bind RAW -|- {355} ::protection::clear:delay bind RAW -|- {366} ::protection::clear:delay:end putserv "NAMES -d $channel" } elseif {$mode == "-o" && [string equal -nocase $botnick [join $victim]]} { if {![::protection::mode:change:abort $nickname $hostname $handle $channel]} { set punish 1 if {![info exists last(service:$channel)] || [info exists last(service:$channel)] && [expr [unixtime] - $last(service:$channel)] > 1} { foreach option [split [channel get $channel "reaction-need-op"] ":"] { if {[string equal -nocase "reop" $option]} { if {![botisop $channel]} { putquick "PRIVMSG $service :OP $channel" -next } } else { if {[string equal -nocase "invite" $option] && ![botonchan $channel]} { putquick "PRIVMSG $service :$option $channel" -next } elseif {[string equal -nocase "unbanall" $option] && $service == "Q"} { putquick "PRIVMSG $service :BANCLEAR $channel" -next } else { putquick "PRIVMSG $service :$option $channel" -next } } } set last(service:$channel) [unixtime] } } continue } elseif {$mode == "-o" && [lsearch -exact "4 5 6 8 9 10" [::protection::user:level [nick2hand [join $victim]] $channel]] > -1} { if {[::protection::mode:change:abort $nickname $hostname $handle $channel] == "0"} { set punish 1 } append positiv-mode [string index $mode 1]; lappend positiv-victim $victim; continue } elseif {$mode == "-o" && [string equal -nocase $nickname [join $victim]]} { continue } elseif {$mode == "+b" && [string match -nocase $hostname [join $victim]]} { continue } elseif {$mode == "+o" && [lsearch -exact "4 5 6 8 9 10" [::protection::user:level [nick2hand [join $victim]] $channel]] > -1} { continue } elseif {[string index $mode 1] == "o" && ![channel get $channel "bitchmode"]} { continue } elseif {[string index $mode 1] == "o" && [channel get $channel "bitchmode"]} { if {[::protection::mode:change:abort $nickname $hostname $handle $channel] == "1"} { continue } set punish 1 if {[string index $mode 0] == "+"} { append negativ-mode [string index $mode 1]; lappend negativ-victim $victim } continue } elseif {$mode == "-v" && [lsearch -exact "3 4 5 6 7 8 9 10" [::protection::user:level [nick2hand [join $victim]] $channel]] > -1} { if {[::protection::mode:change:abort $nickname $hostname $handle $channel] == "0" && [string match *[string index $mode 1]* [lindex [channel get $channel "protected-modes"] 1]]} { set punish 1 } append positiv-mode [string index $mode 1]; lappend positiv-victim $victim; continue } elseif {$mode == "-v" && [lsearch -exact "3 4 5 6 7 8 9 10" [::protection::user:level [nick2hand [join $victim]] $channel]] < 0} { continue } elseif {$mode == "-b"} { if {[::protection::mode:change:abort $nickname $hostname $handle $channel] < 1} { foreach ban [banlist $channel] { if {[string match -nocase [lindex $ban 0] [join $victim]]} { set punish 1; append positiv-mode [string index $mode 1]; lappend positiv-victim $victim } } foreach ban [banlist] { if {[string match -nocase [lindex $ban 0] [join $victim]]} { set punish 1; append positiv-mode [string index $mode 1]; lappend positiv-victim $victim } } } continue } elseif {$mode == "+l" && $victim > [llength [chanlist $channel]]} { continue } elseif {[string index $mode 1] == ""} { continue } elseif {[string index $mode 0] == "+" && ![string match *[string index $mode 1]* [lindex [channel get $channel "protected-modes"] 0]]} { continue } elseif {[string index $mode 0] == "-" && ![string match *[string index $mode 1]* [lindex [channel get $channel "protected-modes"] 1]]} { continue } if {[::protection::mode:change:abort $nickname $hostname $handle $channel] < 1} { set punish 1 } if {[string index $mode 0] == "-"} { append positiv-mode [string index $mode 1] if {$victim != ""} { lappend positiv-victim $victim } } elseif {[string index $mode 0] == "+"} { append negativ-mode [string index $mode 1] if {$victim != "" && [string index $mode 1] != "l"} { lappend negativ-victim $victim } } } if {${negativ-mode} == "-"} { set negativ-mode "" } if {${positiv-mode} == "+"} { set positiv-mode "" } if {$punish && ![::protection::mode:change:abort $nickname $hostname $handle $channel]} { if {[channel get $channel "remove-flags"] != "" && ![info exists flags(removed:$hostname:$channel)]} { putquick "PRIVMSG $service :CHANLEV $channel $nickname [channel get $channel "remove-flags"]" -next set flags(removed:$hostname:$channel) 1 utimer 5 [list ::protection::unset:variable flags(removed:$hostname:$channel)] } if {${positiv-mode} != "" || ${negativ-mode} != "" && [botonchan $channel] && [botisop $channel]} { putquick "MODE $channel ${negativ-mode}${positiv-mode} [join "${negativ-victim} ${positiv-victim}"]" } if {${punish-methode} > 1} { if {[onchan $nickname $channel] && ${punish-methode} == "2"} { putquick "KICK $channel $nickname :[string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]]" } if {${punish-methode} > 2} { newchanban $channel $banmask #xela [string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]] 15 } } set negativ-mode "-"; set positiv-mode "+"; set negativ-victim ""; set positiv-victim "" } } proc mode:change:abort { nickname hostname handle channel } { if {[llength $nickname] < 1} { return 1 } elseif {[string length $nickname] == "1"} { return 1 } elseif {![channel get $channel "protection"]} { return 1 } elseif {[llength $hostname] < 1} { return 1 } elseif {[string match *.* $nickname]} { return 1 } elseif {[lsearch -exact $::protection::settings::required(modechange) [::protection::user:level $handle $channel]] > -1} { return 1 } elseif {[matchattr $handle b] || [islinked $handle]} { return 1 } elseif {[isbotnick $nickname]} { return 1 } else { return 0 } } # --- user kick proc user:kick { nickname hostname handle channel victim reason } { global botnick botname flags kicks last if {[::protection::mode:change:abort $nickname $hostname $handle $channel] || [string equal -nocase $victim $nickname]} { return } set service [join [userlist |S $channel] ","] if {[isbotnick $victim]} { foreach option [split [channel get $channel "reaction-bot-kick"] ":"] { if {[string equal -nocase "invite" $option] && ![botonchan $channel]} { putquick "PRIVMSG $service :$option $channel" -next } elseif {[string equal -nocase "unbanall" $option] && $service == "Q"} { putquick "PRIVMSG $service :BANCLEAR $channel" -next } else { putquick "PRIVMSG $service :$option $channel" -next } } } if {![info exists kicks($channel)]} { set kicks($channel) 1; utimer [lindex [split [channel get $channel "maximal-kicks"] ":"] 1] [list ::protection::unset:variable kicks($channel)] } else { incr kicks($channel) 1 if {$kicks($channel) == "[lindex [split [channel get $channel "maximal-kicks"] ":"] 0]"} { ::protection::unset:variable kicks($channel) set punish 1 if {![info exists last(service:$channel)] || [info exists last(service:$channel)] && [expr [unixtime] - $last(service:$channel)] > 1} { foreach option [split [channel get $channel "reaction-mass-kick"] ":"] { if {[string equal -nocase "reop" $option]} { if {![botisop $channel]} { putquick "PRIVMSG $service :OP $channel" -next } } else { if {[string equal -nocase "invite" $option] && ![botonchan $channel]} { putquick "PRIVMSG $service :$option $channel" -next } elseif {[string equal -nocase "unbanall" $option] && $service == "Q"} { putquick "PRIVMSG $service :BANCLEAR $channel" -next } else { putquick "PRIVMSG $service :$option $channel" -next } } } set last(service:$channel) [unixtime] } } } if {[matchattr [nick2hand $victim] mno|mno $channel] && [botisop $channel]} { putserv "INVITE $victim $channel" } set reason "Don't abuse your operator privileges!" if {[channel get $channel "remove-flags"] != "" && ![info exists flags(removed:$hostname:$channel)]} { putquick "PRIVMSG $service :CHANLEV $channel $nickname [channel get $channel "remove-flags"]" -next set flags(removed:$hostname:$channel) 1 utimer 5 [list ::protection::unset:variable flags(removed:$hostname:$channel)] } if {[string match "*users.quakenet.org" $hostname]} { set banmask *!*@[lindex [split $hostname "@"] 1] } else { set banmask [maskhost $hostname] } switch -exact -- [channel get $channel "punish-methode"] { "1" { if {![botisop $channel]} { return }; putquick "MODE $channel -o $nickname" -next } "2" { if {![onchan $nickname $channel]} { return }; putquick "KICK $channel $nickname :[string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]]" } "3" { newchanban $channel $banmask #xela [string map "\":nickname:\" \"$nickname\" \":reason:\" \"$reason\" \":counter:\" \"[expr [channel get $channel "kick-id"] + 1]\"" [join [channel get $channel "kick-message"]]] 15 } } } # --- need settings proc need:settings { channel need } { set need [string tolower $need] if {![validchan $channel] || ![channel get $channel "protection"] || [set service [join [userlist |S $channel] ","]] == ""} { return } clearqueue all putlog "\{#xela (protection v$::protection::settings::version)\} bot requires $need in $channel ($service)" if {$need == "op"} { putquick "PRIVMSG $service :OP $channel" -next; return } foreach option [split [channel get $channel "reaction-need-$need"] ":"] { if {[string equal -nocase "reop" $option]} { if {![botisop $channel]} { putquick "PRIVMSG $service :OP $channel" -next } } else { if {[string equal -nocase "invite" $option] && ![botonchan $channel]} { putquick "PRIVMSG $service :$option $channel" -next } elseif {[string equal -nocase "unbanall" $option] && $service == "Q"} { putquick "PRIVMSG $service :BANCLEAR $channel" -next } else { putquick "PRIVMSG $service :$option $channel" -next } } } } # --- get user level proc user:level { handle channel } { set return 0 if {![validuser $handle]} { return $return } set level 0 while {$level <= 10} { if {[info exists ::protection::settings::levels($level)] && [matchattr $handle $::protection::settings::levels($level) $channel]} { set return $level } incr level 1 } return $return } # --- incr kick counter proc incr:kickcount { nickname hostname handle channel victim reason } { global botnick if {[isbotnick $nickname]} { channel set $channel kick-id [expr [channel get $channel "kick-id"] + 1] } } # --- unset variable proc unset:variable { variable } { if {![info exists ::${variable}]} { return } unset ::${variable} } # --- autolimit # -- set up new channel limit proc auto:limit { minute hour day month year } { foreach channel [channels] { if {![botisop $channel] || ![regexp {[0-9]{1,}} [channel get $channel "autolimit"]]} { continue } set newlimit [expr [llength [chanlist $channel]] + [channel get $channel "autolimit"]] if {[string match *l* [lindex [getchanmode $channel] 0]]} { regexp {\S[\s]([0-9]+)} [getchanmode $channel] -> limit } else { set limit 0 } if {($newlimit == "$limit")} { continue } if {$newlimit > $limit} { set difference [expr $newlimit - $limit] } elseif {$newlimit < $limit} { set difference [expr $limit - $newlimit] } if {($difference <= [expr round([channel get $channel "autolimit"] * 0.5)]) && ([channel get $channel "autolimit"] > 5)} { continue } elseif {($difference < [expr round([channel get $channel "autolimit"] * 0.38)]) && ([channel get $channel "autolimit"] <= 5)} { continue } pushmode $channel +l $newlimit } } # --- set up default channel settings proc missing:settings { channel } { if {![regexp -- {[0-9]{1,}} [channel get $channel "kick-id"]]} { channel set $channel kick-id "1" } if {![regexp -- {[0-9]{1,}:[0-9]{1,}} [channel get $channel "maximal-modes"]] || [lindex [split [channel get $channel "maximal-modes"] ":"] 0] > 12 || [lindex [split [channel get $channel "maximal-modes"] ":"] 0] == "0" || [lindex [split [channel get $channel "maximal-modes"] ":"] 1] == "0"} { channel set $channel maximal-modes "6:30" } if {![regexp -- {[0-9]{1,}:[0-9]{1,}} [channel get $channel "maximal-kicks"]] || [lindex [split [channel get $channel "maximal-kicks"] ":"] 0] > 5 || [lindex [split [channel get $channel "maximal-kicks"] ":"] 0] == "0" || [lindex [split [channel get $channel "maximal-kicks"] ":"] 1] == "0"} { channel set $channel maximal-kicks "3:10" } if {![regexp {[1-3]} [channel get $channel "punish-methode"]]} { channel set $channel punish-methode "3" } if {[channel get $channel "protected-modes"] == ""} { channel set $channel protected-modes "iksprDlb bCnNt" } if {[channel get $channel "chanmode"] == ""} { channel set $channel chanmode "+CnNtu-rkspmiDd" } if {[channel get $channel "kick-message"] == ""} { channel set $channel kick-message "Kicked (*.xela.development (:nickname: (:reason: (ID: :counter:))))" } if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "WEEEE COPYRIGHT ABUSER WEE :D" } foreach {reaction value} [array get ::protection::settings::reactions] { if {[channel get $channel "reaction-$reaction"] == ""} { channel set $channel reaction-$reaction $value } } } } # --- copyright information putlog "protectio\037n\037\002:\002 v$::protection::settings::version developed by $::protection::settings::author" if {![info exists ::protection::settings::author] || [info exists ::protection::settings::author] && ![string equal 1pr/X1lH0dx0oJYDZ/pNsjV.xLysJ/N77mt.ew3xD.lSY/w/ [encrypt xela $::protection::settings::author]]} { die "Uh, Oh, Yeah, you really think you can use my script without my copyright ???? :D" }