###########################################################################
#                      ® BLaCkShaDoW ProductionS ®                        #
#                                                                         # 
#                               Presents                                  # 
                                                                     
####   #        ####    #####   #   #  #####  #####    ####   #      #####                  
#   #  #       #    #   #       #  #     #   #     #  #    #  #      # 
#   #  #       #    #   #       # #      #   #     #  #    #  #      #
## #   #       ######   #       ##       #   #     #  #    #  #      #####
#   #  #       #    #   #       # #      #   #     #  #    #  #          #
#   #  #       #    #   #       #  #     #   #     #  #    #  #          #
####   #####   #    #   #####   #   #    #    #####    ####   #####  #####
              
#                                                                         # 
#                                                                         #
#                          #####   #####                                  #
#                              #       #                                  #         
#                              #       #                                  #
#                          ####    #####                                  #
#                          #           #                                  #
#                          #           #                                  #       
#                          ##### # #####                                  # 
#                                                                         #  
#                                                                         #
#                   THE    NEXT    GENERATION    TCL                      #
#                                                                         #
#            - #TCL-HELP @ UNDERNET - WwW.TclScripts.Net -                #  
###########################################################################
#A Next Generation Channel Control Script that contains a lot of commands #
#modules, and protections that make`s your life easy for you and for your #
#                              Eggdrop.                                   #
###########################################################################
#                                                                         #
#      Many thanks for without this script wouldn't got this far to:      #
#                                                                         #  
#                      Time2Go@Oradea(#Bihor Admin)                       #
#                                                                         #
#        Offcourse i thanks all the users who participate with ideas,     #
# opinions, which took the script to this version.                        #                                                                                                                                                                                    
#                                                                         #
#      cola @ #Tcl-Help                          btw @ #ialomita          #                    
#                                                                         #                                
#      Cacique @ #mures                          bandyt @ #bandyt         #
#                                                                         #
###########################################################################
#
#Please specify the folder name that contains the BlackTools.tcl and the lang
#folder (Default "scripts")
#
set black(dirname) "scripts"
#
###########################################################################                
#First Char ( "- . !" ) - ( "none" ) (for no char)
#
set black(cmdchar) ". !"
#                           
###########################################################################       
                            
#-------------------------- Default Language -----------------------------#

#Default language ( RO / EN )

set black(default_lang) "RO" 

#-------------------------------------------------------------------------#

#----------------------------- Max Handle --------------------------------#

#Max Handle ( 1 - for handle < 9 ; 0 - for handle > 9 )

set black(maxhand) "0"

#-------------------------------------------------------------------------#


#######################################################################
#                                                                     #
#        Command Help              - h -          Command Help        #
#                                                                     #
#######################################################################

#---------------------------------------------------------------------#

#######################################################################
#                             Chanserv Name
#
set black(chanserv) "X"
#
#######################################################################

#---------------------------------------------------------------------#

#######################################################################
#                                                                     #
#---------------------------------------------------------------------#
#                                                                     #
####################################################################### 
 
#------------------------- Chanserv Login ----------------------------#             

#Login On Connect ( 1 - ON ; 0 - OFF)

set black(logonconect) "1" 
                                                                     
#------------------------- Chanserv User ----------------------------## 
                                   
set black(username) "username"                      
                                                                     
#------------------------- Chanserv Pass ----------------------------## 
                        
set black(password) "password"

#------------------------- Login Command ----------------------------##

set black(login) "PRIVMSG x@channels.undernet.org :login $black(username) $black(password)"

                                                                     
#--------------------------- Login Mode ------------------------------##                                                   
                                                                     
set black(xmod) "+x"                                                    
                                                                     
#######################################################################
#                                                                     #
#---------------------------------------------------------------------#
#                                                                     #
#######################################################################

#---------------------------------------------------------------------#

################################# add #################################
#
#       add <level> <user> (level : manager,admin,senior,op voice)
#
#######################################################################

#Default Hostname for - add <user> command -

set black(hostadd) "*!*@%user%.users.undernet.org"


#######################################################################
#
#
#                           Protection
#
#
#
#######################################################################

#Op Protect (1 - ON ; 0 - OFF)

set black(vprotect) "1"


#VOICE Protect (1 - ON ; 0 - OFF)

set black(oprotect) "1"

#######################################################################
#
#                        Antipub Protection
#
#
#
#######################################################################


#Ban-Time

set black(antipubbantime) "2880"

#Words

set black(antipubword) {
"*#*"
 "*www.*"
 "*http://*"
 "*.ro"
 "*.com"
 "*/server*"
}

#Ban-Mode

set black(antipubmode) "m"

#Ban-mode Time (Seconds)

set black(antipubsecunde) "5"

#######################################################################
#
#                      AntiNotice Protection
#
#
#######################################################################

#Ban-Time

set black(antinoticebantime) "2880"

#Ban-Mode

set black(antinoticemode) "mr"

#Ban-mode Time (Seconds)

set black(antinoticesecunde) "7"

#######################################################################
#
#                         AntiCTCP Protection
#
#
#######################################################################

#Ban-Time

set black(antictcpbantime) "2880"

#Ban-Mode

set black(antictcpmode) "mr"

#Ban-mode Time (Seconds)

set black(antictcpsecunde) "8"

#######################################################################
#
#                       AntiBadWord Protection
#
#
#######################################################################


#Ban-Time

set black(antibadwordbantime) "360"

#Words

set black(antibadword) {
"*pula*"
 "*pizda*"
 "*muie*"
 "*sugi"
 "mwie"
 "*pwla*"
 "*muisti*"
 "*fut*"
 "*fwt*"
 "tarfa"


}

#######################################################################
#
#                        AntiLongText Protection
#
#
#######################################################################

#Char length

set black(longchar) "400"

#Ban-Time

set black(longbantime) "30"

#Ban-Mode

set black(longmode) "mr"

#Ban-mode Time (Seconds)

set black(longtimemode) "10"

#######################################################################
#
#                       AntiBAdQuitPart Protection
#
#
#######################################################################

#Ban-Time

set black(badquitparttime) "60"

#Words

set black(badquitpartwords) {
"*www.*"
"*http://*"
"*#*"

}

#Ban on COLORS (1 - ON ; 0 - OFF)

set black(badquitpartcolour) "1"

#######################################################################
#
#                       Protectia AntiJoinPart
#
#
#######################################################################

#Ban-Time

set black(joinpartbantime) "30"

#Stay-Time

set black(joinparttime) "2"

#Ban-Mode

set black(joinpartmode) "mr"

#Ban-Mode Time (Seconds)

set black(joinparttimemode) "10"

#######################################################################
#
#                       AntiSpam Protection
#
#
#######################################################################


#Ban-Time

set black(spamban) "2880"

#Words

set black(spamword) {
"*#*"
 "*www.*"
 "*http://*"
}

#Cycle-Time

set black(spamcycle) "30"

#ON-JOIN Message ( 1 - ON ; 0 - OFF)

set black(spamreq) "1"

#Part Message

set black(spammsgcycle) "Checking for spam.."

#######################################################################
#
#                       AntiRepeat Protection
#
#
#######################################################################

#Repeat Setting (number repeats:seconds)

set black(repeats) "3:5"

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(antirepeattype) "1"

#Ban-Time

set black(antirepeatbantime) "10"

#######################################################################
# 
#                          Anticolor Protection
# 
#
#######################################################################

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(anticolortype) "1"

#Ban-Time

set black(anticolorbantime) "10"

#######################################################################
# 
#                          AntiBold Protection
# 
#
#######################################################################

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(antiboldtype) "1"

#Ban-Time

set black(antiboldbantime) "10"

#######################################################################
# 
#                          AntiUnderline Protection
# 
#
#######################################################################

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(antiunderlinetype) "1"

#Ban-Time

set black(antiunderlinebantime) "10"

#######################################################################
# 
#                          AntiCaps Protection
# 
#
#######################################################################

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(anticapstype) "1"

#Caps Char Length

set black(anticapscount) "40"

#Ban-Time

set black(anticapsbantime) "10"

#######################################################################
# 
#                          BadFullName Protection
# 
#
#######################################################################

#Ban-Time

set black(badfbantime) "60"

#Words

set black(badfwords) {
"*www.*"
"*#*"
"*http://*"

}

#######################################################################
# 
#                          BadNick Protection
# 
#
#######################################################################

#Ban-Time

set black(badnickbantime) "60"

#Words

set black(badnickwords) {

"*pula*"
"*muie *"
"pwla*"
"pizda*"
"laba*"

}


#######################################################################
# 
#                          BadIdent Protection
# 
#
#######################################################################

#Ban-Time

set black(badidentbantime) "60"

#Words

set black(badidentwords) {

"*pula*"
"*muie *"
"pwla*"
"pizda*"
"laba*"

}


#######################################################################
# 
#                          AntiJoinFlood Protection
# 
#
#######################################################################

#Join-Mode

set black(modes) "mir"


#Join-Mode Time (Seconds)

set black(nomodetime) "15"


#Op ALERT (1 - ON ; 0 - OFF)

set black(fjoinhow) "1"

#######################################################################
# 
#                          AntiChanFlood Protection
# 
#
#######################################################################

#Ban-Type (1 - KICK -> BAN ; 0 - BAN )

set black(antifloodchantype) "1"

#Ban-Time

set black(antifloodchanbantime) "10"

#######################################################################
# 
#                                Module
# 
#
#######################################################################


#######################################################################
# 
#                            Topic refresh
#
#
#######################################################################

#Refresh Time

set black(topic_time) "60"

#Standard Topic

set black(topics) "Reloading topic..."


########################################################################
#
#                                 Count
#
#                  count <on> / <off> / <display> / <reset>
#
#######################################################################

#MSg Type ( 1 - NOTICE ; 0 - PRIVMSG )

set black(counthow) "1"


#######################################################################
# 
#                               BadChan
#
#              badchan | <on> | <off> | add | del | | list |
#
#######################################################################

#Ban-Time

set black(badcbantime) "360"

#User Message ( 1 - ON ; 0 - OFF)

set black(badcwhyreason) "1"

########################################################################
#
#                                 Anunt
#
#                  Anunt <on> | <off> | <add> | <list> | <del>
#
#######################################################################

#Anunt Time ( 60 min max )

set black(anunttime) "45"

#MSg Type ( 1 - ACTION ; 0 - PRIVMSG )

set black(anunthow) "0"

########################################################################
#
#                             AutoBroadcast
#
#                  bt <on> | <off> | <add> | <list> | <del>
#
#######################################################################


#BRoadcast Time

set black(bttime) "60"

#MSg Type ( 1 - ACTION ; 0 - PRIVMSG )

set black(bthow) "1"


#######################################################################
# 
#                               CloneScan
#
#
#######################################################################

#Max Clones

set black(maxclone) "2"

#Ban-Type ( 0 - OP Message ; 1 - Ban )

set black(what) "0"

#Ban-Time

set black(clonebtime) "180"

#######################################################################
# 
#                               AntiBoTidle
#
#
#######################################################################

#Random Object

set black(noobject) "blacky:P"

#Max Idle

set black(noidlemax) "10"

#######################################################################
#                            
#                                Seen
#
#                         seen <host> / <nick>
#
#######################################################################

#Flood-Protection (searches : seconds)

set black(seenflood) "4:5"

#MSg Type ( 1 - NOTICE ; 0 - PRIVMSG )

set black(seenmet) "1"


########################################################################
#
#                                 Greet
#
#                  greet <on> | <off> | <add> | <list> | <del>
#
#######################################################################

#MSg Type ( 1 - NOTICE ; 0 - PRIVMSG )

set black(howgreet) "1"


########################################################################
#
#                                 Leave
#
#                  leave <on> | <off> | <add> | <list> | <del>
#
#######################################################################

#MSg Type ( 1 - NOTICE ; 0 - PRIVMSG )

set black(howleave) "0"

########################################################################
#
#                                 idle
#
#                
#  idle <on> | <off> | voice <on>/<off> | op <on>/<off> | add <nick> 
#
#######################################################################

#Idle Scan Time

set black(idleinterval) "60"

#Op max idle

set black(idleopmax) "30"

#Voice idle Max

set black(idlevoicemax) "60"

########################################################################
#
#                                Private
#
#                
#          private <on> | <off> | <add> <user> | <list> | del <nume>
#
#######################################################################

#Ban-Time

set black(privatebantime) "10"


#######################################################################
# 
#                           
#                               Commands
#
#
#######################################################################


#######################################################################
#
#                              dr <nick> / <host>
#
#######################################################################

#Ban-Time

set black(drtime) "20160"

#######################################################################
#
#                              bot <nick> / <host>
#
#######################################################################

#Ban-Time

set black(bottime) "10160"


########################################################################
#       
#                              b <nick> / <host>
#
#######################################################################

#Ban-Time

set black(btime) "2880"


#######################################################################
#
#                                 n <nick>
#
#######################################################################

#Ban-Time

set black(ntime) "120"

######################################################################
#
#                                 id <nick> 
#
######################################################################

#Ban-Time

set black(idtime) "120"


######################################################################
#
#                   spam <nick> / <host> (pentru spammeri)
#
######################################################################

#Ban-Time

set black(spamtime) "10080"


######################################################################
#
#                          k <nick> <reason>
#
######################################################################


#Access Except ( 1 - ON ; 0 - OFF )

set black(kaccess) "1"


#######################################################################
#
#                    bw <nick> / <host> ( bad word)
#
#######################################################################

#Ban-Time

set black(bwtime) "360"

########################################################################
#
#              stick <nick> / <host> <timp> <motiv>
#
########################################################################

#Ban-Time

set black(dfstickbantime) "5040"

########################################################################
#
#                           l <seconds>                            
#
########################################################################

#Mode Type

set black(lmode) "m"

########################################################################
#
#                               ul                             
#
########################################################################

#Mode Type

set black(ulmodes) "mir"

########################################################################
#
#
#                            This is the END !
#
#
########################################################################


set black(exceptflags) "nm|HAMOVSo"

setudef flag antipub
setudef flag antinotice
setudef flag antictcp
setudef flag antilongtext
setudef flag antibadword
setudef flag antijoinpart
setudef flag antispam
setudef flag antirepeat
setudef flag badquitpart
setudef flag anticolor
setudef flag antibold
setudef flag antiunderline
setudef flag anticaps
setudef flag badfullname
setudef flag badnick
setudef flag badident
setudef flag antijoinflood
setudef flag antichanflood
setudef flag xtools
setudef flag topicrefresh
setudef flag count
setudef flag antibadchan
setudef flag anunt
setudef flag limit
setudef flag refresh
setudef flag clonescan
setudef flag seen
setudef flag antidle
setudef flag antividle
setudef flag antididle
setudef flag autoop
setudef flag autovoice
setudef flag leave
setudef flag chanreport
setudef flag topwords
setudef flag xban
setudef flag protectop
setudef flag protectvoice
setudef flag dontop
setudef flag dontdeop
setudef flag private
setudef flag silent
setudef flag showtime
setudef flag showhandle
setudef flag showcount

setudef int idlevoicemax
setudef int idleopmax
setudef int countnumber
setudef int kickcount
setudef int xbantime
setudef int xbanlevel
setudef int blacklimit
setudef str backchan


#Motive / Bantime

#Protection

setudef str antipub-reason
setudef int antipub-bantime
setudef str antinotice-reason
setudef int antinotice-bantime
setudef str antictcp-reason
setudef int antictcp-bantime
setudef str antibadword-reason
setudef int antibadword-bantime
setudef str antilongtext-reason
setudef int antilongtext-bantime
setudef str antibadquitpart-reason
setudef int antibadquitpart-bantime
setudef str antijoinpart-reason
setudef int antijoinpart-bantime
setudef str antispam-reason
setudef int antispam-bantime
setudef str antispam-message
setudef str antirepeat-reason
setudef int antirepeat-bantime
setudef str anticolor-reason
setudef int anticolor-bantime
setudef str antibold-reason
setudef int antibold-bantime
setudef str antiunderline-reason
setudef int antiunderline-bantime
setudef str anticaps-reason
setudef int anticaps-bantime
setudef str badfullname-reason
setudef int badfullname-bantime
setudef str badnick-reason
setudef int badnick-bantime
setudef str badident-reason
setudef int badident-bantime
setudef str antichanflood-reason
setudef int antichanflood-bantime
setudef str joinflood
setudef str chanflood
setudef int private-bantime
setudef str private-reason
setudef int antilongtextmax
setudef str antirepeat-setting

#commands

setudef str dr-reason
setudef int dr-bantime
setudef str n-reason
setudef int n-bantime
setudef int b-bantime
setudef str id-reason
setudef int id-bantime
setudef str w-reason
setudef str spam-reason
setudef int spam-bantime
setudef str bw-reason
setudef int bw-bantime
setudef int bot-bantime
setudef str bot-reason

#module

setudef str badchan-reason
setudef int badchan-bantime
setudef str count-message
setudef str lang

if {$black(logonconect) == "1"} {
bind evnt - init-server loginpublic
}

bind pubm - * topwordspublic
bind pubm - * antipub:protect
bind ctcp - ACTION antipub:protect:me
bind notc - * antinotice:protect
bind ctcp - * antictcp:protect

bind pubm - * antibadword:protect
bind ctcp - ACTION antibadword:protect:me
bind pubm - * antilongtext:protect
bind ctcp - ACTION antilongtext:protect:me
bind part - * antipubpart:protect
bind sign - * antipubsign:protect
bind part - * anticolorpart:protect
bind sign - * anticolorquit:protect
bind part - * antijoinpart:protect
bind join - * antispam:protect:msg
bind msgm - * antispam:protect
bind time - * antispam:protect:cycle
bind time - "30 * * * *" clonescanner
bind time - "* * * * *" limit:timer
bind pubm - * antirepeat:protect
bind pubm - * antifloodchan:protect
bind ctcp - version blackreply
bind ctcp - ACTION antirepeat:protect:me
bind ctcp - ACTION antifloodchan:protect:me
bind pubm - * anticolor:protect
bind ctcp - ACTION anticolor:protect:me
bind pubm - * antibold:protect
bind ctcp - ACTION antibold:protect:me
bind pubm - * antiunderline:protect
bind ctcp - ACTION antiunderline:protect:me
bind pubm - * anticaps:protect
bind ctcp - ACTION anticaps:protect:me
bind join - * badfullname:protect:join
bind join - * badnick:protect:join
bind join - * badident:protect:join
bind nick - * badnick:protect:change
bind mode - "*+b*" protectpublic
bind join - * joinflood:protect
bind join - * rebanpublic
bind need - * toolspublic
bind join - * countpublic:join
bind join - * badchanpublic:join
bind join - * seen:join
bind part - * seen:part
bind sign - * seen:sign
bind kick - * seen:kick
bind splt - * seen:split
bind nick - * seen:changenick
bind join - * greetpublic:join
bind part - * leavepublic:part
bind time - * idlewhoispublic
bind evnt - init-server setaway
bind join - * autovonjoin
bind join - * autoponjoin
bind join - * addopjoin
bind join - * addvoicejoin
bind join - * private:module
bind join - * timeban:module
bind ctcr mn|MOSAV PING pingpublic
bind ctcr - VERSION ctcpvers
bind mode - *+o* dontoppublic
bind mode - *-o* dontdeoppublic



bind pubm nm|MmvVNnoOSA * comand:pubme 
foreach black(char) $black(cmdchar) {
if {[string match -nocase "$black(char)" "none"]} {
set black(char) ""
}
bind pub nm|MAS $black(char)clonescan scannerpublic
bind pub nm|MASO $black(char)r refreshpublic
bind pub nm|M $black(char)count countpublic
bind pub nm|M $black(char)badchan badchanpublic
bind pub nm|M $black(char)badword antibadword:command:public
bind pub nm|M $black(char)anunt anuntpublic
bind pub nm|M $black(char)limit limitpublic
bind pub nm|M $black(char)topic topicpublic
bind pub -|- $black(char)seen seenpublic
bind pub nm|M $black(char)greet greetpublic
bind pub nm|M $black(char)leave leavepublic
bind pub nm|M $black(char)idle antidlepublic
bind pub nm|OSMA $black(char)dr drpublic
bind pub nm|OSMA $black(char)bot botpublic
bind pub nm|OSMA $black(char)b bpublic
bind pub nm|OSMA $black(char)n npublic
bind pub nm|OSMA $black(char)id idpublic
bind pub nm|SMA $black(char)black blackpublic
bind pub nm|SMA $black(char)bl blackpublic
bind pub nm|VOSMA $black(char)w wpublic
bind pub nm|OSMA $black(char)spam spampublic
bind pub nm|VOSMA $black(char)k kpublic
bind pub nm|OSMA $black(char)bw bwpublic
bind pub nm|OSMA $black(char)ub ubpublic
bind pub nm|VOSMA $black(char)sb sbpublic
bind pub nm|SMA $black(char)d dpublic
bind pub nm|SMA $black(char)stick stickpublic
bind pub nm|VOSMA $black(char)t tpublic
bind pub nm|M $black(char)show showpublic
bind pub nm|- $black(char)status statuspublic
bind pub nm|- $black(char)channels channelspublic
bind pub nm|- $black(char)chat chatpublic
bind pub nm|- $black(char)uptime uptimepublic
bind pub nm|VOSMA $black(char)i ipublic
bind pub nm|VOSMA $black(char)addinfo addinfopublic
bind pub nm|VOSMA $black(char)v vpublic
bind pub nm|VOSMA $black(char)myset mysetpublic
bind pub nm|OSMA $black(char)o opublic
bind pub nm|VOSMA $black(char)l lpublic
bind pub nm|VOSMA $black(char)ul ulpublic
bind pub nm|SMA $black(char)say saypublic
bind pub nm|SMA $black(char)act actpublic
bind pub nm|- $black(char)broadcast broadcastpublic
bind pub nm|OSMA $black(char)check checkpublic
bind pub nm|VOSMA $black(char)version versionpublic
bind pub nm|OSMA $black(char)cycle cyclepublic
bind pub nm|- $black(char)away awaypublic
bind pub nm|M $black(char)private privatepublic
bind pub nm|OSMA $black(char)mode modepublic
bind pub nm|M $black(char)set setpublic
bind pub nm|- $black(char)silence silencepublic
bind pub nm|- $black(char)msg msgpublic
bind pub nm|MA $black(char)add publicadd
bind pub nm|MA $black(char)adduser adduserpublic
bind pub nm|MA $black(char)delacc delaccpublic
bind pub nm|- $black(char)del delpublic
bind pub nm|- $black(char)ignore ignorepublic
bind pub nm|- $black(char)botidle botidlepublic
bind pub nm|M $black(char)addhost addhostpublic
bind pub nm|M $black(char)delhost delhostpuplic
bind pub nm|OSMA $black(char)banlist banlistpublic
bind pub nm|M $black(char)purge purgepublic
bind pub nm|M $black(char)chuser chuserpublic
bind pub nm|MASOV $black(char)userlist publicuserlist
bind pub nm|MASOV $black(char)info infopublic
bind pub nm|MA $black(char)s spublic
bind pub nm|MA $black(char)us uspublic
bind pub nm|MAOSV $black(char)ping pings
bind pub nm|MASOV $black(char)time timepublic
bind pub nm|MAOSV $black(char)vers verspublic
bind pub nm|MAOSV $black(char)whois whoispublic
bind pub nm|MAOS $black(char)gag gagpublic
bind pub nm|M $black(char)reset resetpublic
bind pub nm|M $black(char)clear clearpublic
bind pub nm|- $black(char)addbot addbotpublic
bind pub nm|M $black(char)addop addoppublic
bind pub nm|M $black(char)addvoice addvoicepublic
bind pub nm|M $black(char)delop deloppublic
bind pub nm|M $black(char)delvoice delvoicepublic
bind pub nm|- $black(char)addmyhost addmyhostpublic
bind pub nm|- $black(char)delmyhost delmyhostpublic
bind pub nm|VOSAM $black(char)activ activpublic
bind pub nm|MASOV $black(char)h hpublic
bind pub nm|MASO $black(char)cc ccpublic
bind pub nm|MAOSV $black(char)top toppublic
bind pub nm|M $black(char)secure securepublic
bind pub nm|- $black(char)bt broadcastpublic:module
bind pub nm|- $black(char)login publiclogin:Cmd
bind pub nm|MASO $black(char)stats statspublic
}
bind msg nm|- addchan addchanpublic
bind msg nm|- delchan delchanpublic
bind msg nm|- suspend suspendpublic
bind msg nm|- unsuspend unsuspendpublic
bind msg nm|- nick nickpublic
bind msg nm|- rehash rehashme
bind msg nm|- restart restartme
bind msg nm|- save saveme
bind msg nm|- jump jumpme
bind msg nm|- die dieme
bind msg nm|OSAM op oppublic
bind msg nm|OSAM deop deoppublic
bind msg nm|OSAM voice voicepublic
bind msg nm|OSAM devoice devoicepublic
bind msg nm|OSAM invite invitepublic


##########################################################################
#
#
#         Dont try to modify if you dont know what are you doing !
#
#
#########################################################################


set black(name) "BlackToolS"
set black(author) "BLaCkShaDoW"
set black(vers) "2.3"
set black(site) "WwW.TclScripts.Net"
set sdir "$username.status.txt"
set wdir "$username.away.txt"
set seendir "$username.Seen.db"
set statsdir "$username.stats.db"
set bwordir "$username.bword.db"

set black(loader_error) [catch {source $black(dirname)/lang/loader.tcl} black(loader_error_stats)]

if {$black(loader_error) == "1"} {
die "4BlackTools :I didnt find the 12loader.tcl in the 12lang folder. This file contains the language for the script.PLease load it."
}

if {![info exists anuntpublic:show_running]} { 
timer $black(anunttime) anuntpublic:show
set anuntpublic:show_running 1
}

if {![info exists times_topic_running]} { 
timer $black(topic_time) times_topic
set times_topic_running 1
}


if {![file exists $seendir]} {
set file [open $seendir w]
close $file
}

if {![file exists $sdir]} {
set file [open $sdir w]
close $file
}

if {![file exists $wdir]} {
set file [open $wdir w]
close $file
}

if {![file exists $bwordir]} {
set file [open $bwordir w]
close $file
}


if {![file exists $statsdir]} {
set file [open $statsdir w]
close $file
}

if {![info exists antibotidle:module_running]} {
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
if {$data != ""} {
foreach line $data {
set type [lindex [split $line] 0]
set stats [lindex [split $line] 1]
if {($type == "antibotidle:module") && ($stats == "ON")} {
timer $black(noidlemax) antibotidle:module
}
}
}
set antibotidle:module_running 1
}

if {![info exists broadcastpublic:show_running]} {
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
if {$data != ""} {
foreach line $data {
set type [lindex [split $line] 0]
set stats [lindex [split $line] 1]
if {($type == "broadcastpublic:show") && ($stats == "ON")} {
timer $black(bttime) broadcastpublic:show
}
}
}
set broadcastpublic:show_running 1
}

proc blacktools:tell:prv {nick host hand type arg} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set replace(%botnick%) $botnick
set replace(%char%) $char(p)
set replace(%msg%) [lrange [split $arg] 0 end]
set replace(%msg.1%) [lindex [split $arg] 0]
set replace(%msg.2%) [lindex [split $arg] 1]
set replace(%msg.3%) [lindex [split $arg] 2]
set replace(%msg.4%) [lrange [split $arg] 1 end]
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
if {[info exists black(say.$getlang.$type)]} {
set reply [string map [array get replace] $black(say.$getlang.$type)]
puthelp "PRIVMSG $nick :$reply"
}
}

proc blacktools:tell {nick host hand chan chan1 type arg} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set replace(%botnick%) $botnick
set replace(%char%) $char(p)
set replace(%chan%) $chan
set replace(%msg%) [lrange $arg 0 end]
set replace(%msg.set%) [lrange $arg 1 end]
set replace(%msg.1%) [lindex $arg 0]
set replace(%msg.2%) [lindex $arg 1]
set replace(%msg.3%) [lindex $arg 2]
set replace(%msg.4%) [lindex $arg 3]
set replace(%msg.5%) [lrange $arg 4 end]
set replace(%msg.6%) [lrange $arg 3 end]
set replace(%msg.7%) [lrange $arg 2 end]
set replace(%msg.8%) [lrange $arg 1 end]
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
set getmethod [getuser $hand XTRA OUTPUT_TYPE]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
if {$getmethod == ""} { set getmethod "1" }
if {[info exists black(say.$getlang.$type)]} {
set reply [string map [array get replace] $black(say.$getlang.$type)]
if {$getmethod == "1"} {
putserv "NOTICE $nick :$reply"
} else {
putserv "PRIVMSG $chan1 :$reply"
}
}
}

proc blacktools:banner:1 {banmask botnick chan reason mode timer bantime} {
global black
if {[channel get $chan xban]} {
set getcount [channel get $chan kickcount]
set getxtime [channel get $chan xbantime]
set getxlevel [channel get $chan xbanlevel]
if {$getxlevel == "0"} { set getxlevel "100"}
if {$getxtime == "0"} { set getxtime "1" }
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "MODE $chan +$mode" -next ;utimer $timer [list putquick "MODE $chan -$mode"]
putquick "PRIVMSG $black(chanserv) :ban $chan $banmask $getxtime $getxlevel $reason"
newchanban $chan $banmask $botnick $reason $bantime
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
if {[info exists black($chan:anounce)]} {
return 0
}
set black($chan:anounce) 1
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $banmask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
} else {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" } else {
set reason "$reason" }
putquick "MODE $chan +$mode" -next ;utimer $timer [list putquick "MODE $chan -$mode"]
newchanban $chan $banmask $botnick $reason $bantime
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
if {[info exists black($chan:anounce)]} {
return 0
}
set black($chan:anounce) 1
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $banmask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
}
utimer 5 [list unset black($chan:anounce)]
}

proc blacktools:banner:2 {banmask botnick chan reason bantime} {
global black
if {[channel get $chan xban]} {
set getcount [channel get $chan kickcount]
set getxtime [channel get $chan xbantime]
if {$getxtime == "0"} { set getxtime "1" }
set getxlevel [channel get $chan xbanlevel]
if {$getxlevel == "0"} { set getxlevel "100"}
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "PRIVMSG $black(chanserv) :ban $chan $banmask $getxtime $getxlevel $reason"
newchanban $chan $banmask $botnick $reason $bantime
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}

if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}

if {[info exists black($chan:anounce)]} {
return 0
}

set black($chan:anounce) 1
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $banmask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"

} else {

set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" } else {
set reason "$reason" }
newchanban $chan $banmask $botnick $reason $bantime
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}

if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
if {[info exists black($chan:anounce)]} {
return 0
}
set black($chan:anounce) 1
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $banmask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
}
utimer 5 [list unset black($chan:anounce)]
}


proc blacktools:banner:3 {mask hand chan reason bantime type} {
global black botnick
if {[channel get $chan xban]} {
set getcount [channel get $chan kickcount]
set getxtime [channel get $chan xbantime]
if {$getxtime == "0"} { set getxtime "1" }
set getxlevel [channel get $chan xbanlevel]
if {$getxlevel == "0"} { set getxlevel "100"}
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA $type]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA $type $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $reason"
utimer 1 [list newchanban $chan $mask $hand $reason $bantime]
putquick "MODE $chan +b $mask"
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $mask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
} else {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA $type]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA $type $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" } else {
set reason "$reason" }
newchanban $chan $mask $hand $reason $bantime
putquick "MODE $chan +b $mask"
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $mask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
}
}

proc blacktools:banner:4 {mask hand chan reason bantime type} {
global black botnick
if {[channel get $chan xban]} {
set getcount [channel get $chan kickcount]
set getxtime [channel get $chan xbantime]
if {$getxtime == "0"} { set getxtime "1" }
set getxlevel [channel get $chan xbanlevel]
if {$getxlevel == "0"} { set getxlevel "100"}
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA $type]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA $type $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $reason"
utimer 1 [list newchanban $chan $mask $hand $reason $bantime sticky]
putquick "MODE $chan +b $mask"
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $mask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
} else {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA $type]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA $type $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" } else {
set reason "$reason" }
newchanban $chan $mask $hand $reason $bantime sticky
putquick "MODE $chan +b $mask"
if {![channel get $chan chanreport]} {
return 0
}
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replace(%banmask%) $mask
set replace(%bantime%) $bantime
set replace(%reason%) $reason
set replace(%chan%) $chan
puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
}
}

################################ antipub ###########################


proc antipub:filter {str} {
  regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
  return $str
}

proc antipub:protect {nick host hand chan arg} {
global black botnick
set text [antipub:filter $arg]
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antipub-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antipub.1)
}
set getbantime [channel get $chan antipub-bantime]
if {$getbantime == "0"} { set getbantime $black(antipubbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 } 
if { [channel get $chan antipub] } {
foreach antipub [string tolower $black(antipubword)] {
if {[string match -nocase $antipub $arg]} {
blacktools:banner:1 $banmask $botnick $chan $reason $black(antipubmode) $black(antipubsecunde) $getbantime
}
}
}
}

proc antipub:protect:me {nick host hand chan keyword arg} {
global black
antipub:protect $nick $host $hand $chan $arg
}


############################### antinotice #############################

proc antinotice:protect {nick host hand arg chan} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antinotice-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antinotice.1)
}
set getbantime [channel get $chan antinotice-bantime]
if {$getbantime == "0"} { set getbantime $black(antinoticebantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set banmask *!*@[lindex [split $host @] 1]
set reason "$protectreason"
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {$chan == $botnick} { return 0 }
if { [channel get $chan antinotice] } {
blacktools:banner:1 $banmask $botnick $chan $reason $black(antinoticemode) $black(antinoticesecunde) $getbantime
}
}

############################## antictcp ################################


proc antictcp:protect {nick host hand chan keyword arg} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antictcp-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antictcp.1)
}
set getbantime [channel get $chan antictcp-bantime]
if {$getbantime == "0"} { set getbantime $black(antictcpbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
if {[string equal -nocase "action" $keyword] || [string equal -nocase "chat" $keyword]} {return 0}
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 }
if { [channel get $chan antictcp] } {
blacktools:banner:1 $banmask $botnick $chan $reason $black(antictcpmode) $black(antictcpsecunde) $getbantime
}
}

############################## antibadword ################################

proc antibadword:filter {str} {
  regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
  return $str
}


proc antibadword:protect {nick host hand chan arg} {
global black botnick bwordir
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antibadword-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antibadword.1)
}
set getbantime [channel get $chan antibadword-bantime]
if {$getbantime == "0"} { set getbantime $black(antibadwordbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set text [antibadword:filter $arg]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {[channel get $chan antibadword]} {
set file [open $bwordir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
foreach word $lines {
set c [lindex [split $word] 0]
set w [lrange [split $word] 1 end]
if {[string match -nocase $c $chan]} { 
if {[string match -nocase $w $text]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
foreach antibadword [string tolower $black(antibadword)] {
if {[string match -nocase $antibadword $text]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}

proc antibadword:protect:me {nick host hand chan keyword arg} {
global black
antibadword:protect $nick $host $hand $chan $arg
}

################################ badword ##################################

proc antibadword:command:public {nick host hand chan arg} {
global black botnick
set why [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set bdword [lrange [split $arg] 1 end]
set bdnumber [lindex [split $arg] 1]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
set bdnumber [lindex [split $arg] 2]
set bdword [lrange [split $arg] 2 end]
}
antibadword:command:process $nick $host $hand $chan $chan1 $why $bdword $bdnumber $type
}

proc antibadword:command:process {nick host hand chan chan1 why bdword bdnumber type} {
global black bwordir botnick
set i 0
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 badword.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 badword.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 badword.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 badword.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
switch -exact -- [string tolower $why] {

add {
set file [open $bwordir a]
puts $file "$chan $bdword"
close $file
blacktools:tell $nick $host $hand $chan $chan1 badword.5 $bdword
}

list {
set file [open $bwordir "r"]
set why [read -nonewline $file]
close $file
set data [split $why "\n"]
if {$data == ""} { 
blacktools:tell $nick $host $hand $chan $chan1 badword.6 none
blacktools:tell $nick $host $hand $chan $chan1 badword.7 none
return 0
}
foreach word $data {
set c [lindex [split $word] 0]
set word [lrange [split $word] 1 end]
if {[string match -nocase $chan $c]} {
set foundchan 1
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 badword.6 none
blacktools:tell $nick $host $hand $chan $chan1 badword.8 "4 $i. 12$word"
}
if {![info exists foundchan]} {
blacktools:tell $nick $host $hand $chan $chan1 badword.6 none
blacktools:tell $nick $host $hand $chan $chan1 badword.7 none
}

}
}

del {
if {![regexp {^[0-9]} $bdnumber]} {
blacktools:tell $nick $host $hand $chan $chan1 badword.9 $bdword
return 0
}
set file [open $bwordir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
foreach word $lines {
set c [lindex [split $word] 0]
if {[string match -nocase $c $chan]} { 
set i [expr $bdnumber - 1]
set delete [lreplace $lines $i $i]
set file [open $bwordir "w"]
puts $file [join $delete "\n"]
close $file
}
}
set file [open $bwordir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $bwordir "w"]
close $files
}
blacktools:tell $nick $host $hand $chan $chan1 badword.10 $bdnumber
}
}
}

############################## AntiLongText ################################

proc antilongtext:protect {nick uhost hand chan arg} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antilongtext-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antilongtext.1)
}
set getbantime [channel get $chan antilongtext-bantime]
if {$getbantime == "0"} { set getbantime $black(longbantime) }
set getlongchar [channel get $chan antilongtextmax]
if {$getlongchar == "0"} { set getlongchar "$black(longchar)" }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set banmask "*!*@[lindex [split $uhost @] 1]"
set reason "$protectreason"
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 } 
if {[string length $arg] >= $getlongchar} {
if {[channel get $chan antilongtext]} {
blacktools:banner:1 $banmask $botnick $chan $reason $black(longmode) $black(longtimemode) $getbantime
}
}
}

proc antilongtext:protect:me {nick host hand chan keyword arg} {
global black
antilongtext:protect $nick $host $hand $chan $arg
}

############################ AntiBAdQuitPart ##############################

set black(badcolors) {

"*\x03*"
"*\037*"
"*\002*"

}

proc antipubpart:protect {nick host hand chan arg} {
global botnick black
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antibadquitpart-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antibadquitpart.1)
}
set getbantime [channel get $chan antibadquitpart-bantime]
if {$getbantime == "0"} { set getbantime $black(badquitparttime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set banmask "*!*@[lindex [split $host @] 1]"
set reason "$protectreason"
if {[channel get $chan badquitpart]} {
foreach word $black(badquitpartwords) {
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {[string match -nocase $word $arg]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}

proc antipubsign:protect {nick host hand chan arg} {
antipubpart:protect $nick $host $hand $chan $arg
}


proc anticolorpart:protect {nick host hand chan arg} {
global botnick black
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antibadquitpart-reason]
if {$getreason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antibadquitpart.1)
}
set getbantime [channel get $chan antibadquitpart-bantime]
if {$getbantime == "0"} { set getbantime $black(badquitparttime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set banmask "*!*@[lindex [split $host @] 1]"
set reason "$protectreason"
if {[channel get $chan badquitpart]} {
foreach color $black(badcolors) {
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {($black(badquitpartcolour) == "1") && [string match -nocase $color $arg]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}

proc anticolorquit:protect {nick host hand chan arg} {
anticolorpart:protect $nick $host $hand $chan $arg
}

########################### AntiJoinPart #############################

proc antijoinpart:protect {nick host hand chan arg} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antijoinpart-reason]
if {$getreason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antijoinpart.1)
}
set getbantime [channel get $chan antijoinpart-bantime]
if {$getbantime == "0"} { set getbantime $black(joinpartbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set banmask "*!*@[lindex [split $host @] 1]"
set reason "$protectreason"
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {$chan == $botnick} { return 0 }
if {[channel get $chan antijoinpart]} {
if {[getchanjoin $nick $chan] >= [expr {[clock seconds]-$black(joinparttime)}]} {
blacktools:banner:1 $banmask $botnick $chan $reason $black(joinpartmode) $black(joinparttimemode) $getbantime
}
}
}

proc spam:filter {str} {
  regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
  return $str
}

############################# AntiSpam ##############################

proc antispam:protect {nick uhost hand arg} {
global botnick black
set text [spam:filter $arg]
set handle [nick2hand $nick]
foreach spammer [string tolower $black(spamword)] { 
if {[string match -nocase $spammer $arg]} {
foreach chans [channels] {
if {![validchan $chans]} { return 0 }
set getreason [channel get $chans antispam-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chans lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antispam.1)
}
set getbantime [channel get $chans antispam-bantime]
if {$getbantime == "0"} { set getbantime $black(spamban) }
if {[onchan $nick $chans]} {
if {[channel get $chans antispam]} {
if {![botisop $chans]} { return 0 }
if {[isbotnick $nick]} { return 0 }
set banmask *!*@[lindex [split $uhost @] 1]
set replace(%chan%) $chans
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
if {[matchattr $handle $black(exceptflags) $chans]} { return 0 }
if {[isvoice $nick $chans] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chans] && ($black(oprotect) == "1")} { return 0 }
blacktools:banner:2 $banmask $botnick $chans $reason $getbantime
}
}
}
}
}
}
proc antispam:protect:msg {nick host hand chan } {
global black
if {![validchan $chan]} { return 0 }
if {[channel get $chan antispam]} {
if {[isbotnick $nick]} { return 0 }
if {$black(spamreq) == "1"} {
set getmsg [channel get $chan antispam-message]
if {$getmsg == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getmsg $black(say.$getlang.antispam.2)
}
set replace(%nick%) $nick
set replace(%chan%) $chan
set spamsg [string map [array get replace] $getmsg]
puthelp "PRIVMSG $nick :$spamsg"
} 
}
}


proc antispam:protect:cycle {min hour day mon year} {
global black
if {([scan $min %d]+([scan $hour %d]*60)) % $black(spamcycle) == 0} { 
foreach chan [channels] {
if { [channel get $chan antispam]} {
putserv "PART $chan :$black(spammsgcycle)"; putserv "JOIN $chan"
}
}
}
}

############################## AntiRepeat ###############################

proc antirepeat:protect {nick host hand chan arg} {
global black botnick count
set arg [join [split $arg]]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antirepeat-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antirepeat.1)
}
set getbantime [channel get $chan antirepeat-bantime]
if {$getbantime == "0"} { set getbantime $black(antirepeatbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set repeatset [channel get $chan antirepeat-setting]
if {$repeatset == ""} { set repeatset "$black(repeats)" }
set number [scan $repeatset %\[^:\]]
set time [scan $repeatset %*\[^:\]:%s]
set banmask *!*@[lindex [split $host @] 1]
set handle [nick2hand $nick]
foreach tmr [utimers] {
if {[string match "*count(repeat:$host:$chan:$arg)*" [join [lindex $tmr 1]]]} {
killutimer [lindex $tmr 2]
}
}
if {[channel get $chan antirepeat]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }

if {![info exists count(repeat:$host:$chan:$arg)]} { 
set count(repeat:$host:$chan:$arg) 0 
}

if {![info exists count(repeat:$host:$chan)]} { 
set count(repeat:$host:$chan) 0 
}

incr count(repeat:$host:$chan:$arg)
utimer $time [list unset count(repeat:$host:$chan:$arg)]

if {$count(repeat:$host:$chan:$arg) >= $number} {
if {$black(antirepeattype) == "0"} { set count(repeat:$host:$chan) 2 } 
incr count(repeat:$host:$chan)
if {$count(repeat:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(repeat:$host:$chan) >= 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(repeat:$host:$chan)
}
}
}
}


proc antirepeat:protect:me {nick host hand chan keyword arg} {
antirepeat:protect $nick $host $hand $chan $arg
}


############################# AntiColor ################################

proc anticolor:protect {nick host hand chan arg} {
global black botnick count
set arg [join [split $arg]]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan anticolor-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.anticolor.1)
}
set getbantime [channel get $chan anticolor-bantime]
if {$getbantime == "0"} { set getbantime $black(anticolorbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
set handle [nick2hand $nick]
if {[channel get $chan anticolor]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {![info exists count(color:$host:$chan)]} { 
set count(color:$host:$chan) 0 
}
if {[string match *\003* $arg]} {
incr count(color:$host:$chan)
if {$black(anticolortype) == "0" } { set count(color:$host:$chan) 2 }
if {$count(color:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(color:$host:$chan) == 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(color:$host:$chan)
}
}
}
}

proc anticolor:protect:me {nick host hand chan keyword arg} {
anticolor:protect $nick $host $hand $chan $arg
}

############################# AntiBold ################################

proc antibold:protect {nick host hand chan arg} {
global black botnick count
set arg [split $arg]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antibold-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antibold.1)
}
set getbantime [channel get $chan antibold-bantime]
if {$getbantime == "0"} { set getbantime $black(antiboldbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
set handle [nick2hand $nick]
if {[channel get $chan antibold]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {![info exists count(bold:$host:$chan)]} { 
set count(bold:$host:$chan) 0 
}
if {[string match *\002* $arg]} {
incr count(bold:$host:$chan)
if {$black(antiboldtype) == "0" } { set count(bold:$host:$chan) 2 }
if {$count(bold:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(bold:$host:$chan) == 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(bold:$host:$chan)
}
}
}
}

proc antibold:protect:me {nick host hand chan keyword arg} {
antibold:protect $nick $host $hand $chan $arg
}

############################ AntiUnderline ###############################

proc antiunderline:protect {nick host hand chan arg} {
global black botnick count
set arg [split $arg]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antiunderline-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antiunderline.1)
}
set getbantime [channel get $chan antiunderline-bantime]
if {$getbantime == "0"} { set getbantime $black(antiunderlinebantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
set handle [nick2hand $nick]
if {[channel get $chan antiunderline]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {![info exists count(underline:$host:$chan)]} { 
set count(underline:$host:$chan) 0 
}
if {[string match *\037* $arg]} {
incr count(underline:$host:$chan)
if {$black(antiunderlinetype) == "0" } { set count(underline:$host:$chan) 2 }
if {$count(underline:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(underline:$host:$chan) == 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(underline:$host:$chan)
}
}
}
}

proc antiunderline:protect:me {nick host hand chan keyword arg} {
antiunderline:protect $nick $host $hand $chan $arg
}

############################## AntiCaps #################################

proc anticaps:protect {nick host hand chan arg} {
global black botnick count
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan anticaps-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.anticaps.1)
}
set getbantime [channel get $chan anticaps-bantime]
if {$getbantime == "0"} { set getbantime $black(anticapsbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask *!*@[lindex [split $host @] 1]
if {![info exists count(caps:$host:$chan)]} { 
set count(caps:$host:$chan) 0 
}
if {[channel get $chan anticaps]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }

set caps($nick:$host) 0
foreach word [split $arg {}] {
if [string match \[A-Z\] $word] {
incr caps($nick:$host)
}

}

if {$caps($nick:$host) == 0} {
  return 0
}
  if {[string length $arg] < 20} {return 0}
  set capchar [string length $arg]
  set number $caps($nick:$host)/$capchar
  if {[expr 100 * $caps($nick:$host) / $capchar] > $black(anticapscount)} {
incr count(caps:$host:$chan)
if {$black(anticapstype) == "0" } { set count(caps:$host:$chan) 2 }
if {$count(caps:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(caps:$host:$chan) == 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(caps:$host:$chan)
}
}
}
}

proc anticaps:protect:me {nick host hand chan keyword arg} {
anticaps:protect $nick $host $hand $chan $arg
}

################################ BadIdent #################################

proc badident:protect:join {nick host hand chan} {
global black botnick
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan badident-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.badident.1)
}
set getbantime [channel get $chan badident-bantime]
if {$getbantime == "0"} { set getbantime $black(badidentbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set ident "[string trimleft [string tolower [lindex [split $host "@"] 0]] "~"]"
set banmask "*!*$ident@*"
if {![validchan $chan]} { return 0 }
if {[channel get $chan badident]} {
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[matchattr $hand $black(exceptflags) $chan]} { return 0 }
foreach bit $black(badidentwords) {
if {[string match -nocase $bit $ident]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}


############################## BadFullname ###############################

proc badfullname:protect:join {nick host hand chan} {
global botnick black
set ::cchan $chan
set ::nnick $nick
set ::hhost $host
set handle [nick2hand $nick]
if { [channel get $chan badfullname] } {
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[onchan $nick $chan]} {
putquick "WHOIS $nick $nick"
bind RAW - 311 badfullname:protect
}
}
}

proc badfullname:protect { from keyword arguments } {
global botnick black
set chan $::cchan
set nick $::nnick
set host $::hhost
set getreason [channel get $chan badfullname-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.badfullname.1)
}
set getbantime [channel get $chan badfullname-bantime]
if {$getbantime == "0"} { set getbantime $black(badfbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set fullname [string range [join [lrange $arguments 5 end]] 1 end]
if {[onchan $nick $chan]} {
set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1] 
}
  foreach realname $black(badfwords) {
if {[string match -nocase $realname $fullname]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
unbind RAW - 311 badfullname:protect
}

################################ BadNick #################################

proc badnick:protect:join {nick host hand chan} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan badnick-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.badnick.1)
}
set getbantime [channel get $chan badnick-bantime]
if {$getbantime == "0"} { set getbantime $black(badnickbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask "$nick*!*@*"
if {![validchan $chan]} { return 0 }
if {[channel get $chan badnick]} {
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
foreach badnick [string tolower $black(badnickwords)] {
if {[string match $badnick [string tolower $nick]]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}

proc badnick:protect:change {nick host hand chan newnick} {
global black botnick
set handle [nick2hand $nick]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan badnick-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.badnick.1)
}
set getbantime [channel get $chan badnick-bantime]
if {$getbantime == "0"} { set getbantime $black(badnickbantime) }
set replace(%chan%) $chan
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set banmask "$newnick*!*@*"
if {![validchan $chan]} { return 0 }
if {[channel get $chan badnick]} {
if {![botisop $chan]} { return 0 }
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
foreach badnick [string tolower $black(badnickwords)] {
if {[string match $badnick [string tolower $newnick]]} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
}
}
}
}



########################### AntiJoinFlood ################################

proc joinflood:protect {nick host hand chan} {
global black count
if {[channel get $chan antijoinflood]} {
set getset [channel get $chan joinflood]
if {$getset == ""} { set getset "4 5" }
set number [lindex [split $getset] 0]
set time [lindex [split $getset] 1]
set replace(%chan%) $chan
foreach tmr [utimers] {
if {[string match "*count(joinflood:$chan)*" [join [lindex $tmr 1]]]} {
killutimer [lindex $tmr 2]
}
}
if {![info exists count(joinflood:$chan)]} { 
set count(joinflood:$chan) 0 
}

incr count(joinflood:$chan)
utimer $time [list unset count(joinflood:$chan)]

if {$count(joinflood:$chan) >= "$number"} {
if {![botisop $chan]} { return 0 }
putquick "MODE $chan +$black(modes)" ; utimer $black(nomodetime) [list putquick "MODE $chan -$black(modes)"]
if {$black(fjoinhow) == "1"} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getmessage $black(say.$getlang.antijoinflood.1)
set message [string map [array get replace] $getmessage]
puthelp "NOTICE @$chan :$message"
}
}
}
}


########################## Login ###############################

proc loginpublic {my} {
     global botnick black
        putquick "$black(login)"   
        putquick "MODE $botnick :$black(xmod)"
        
}


proc publiclogin:Cmd {nick host hand chan arg} {
global botnick black
putquick "$black(login)"
putquick "MODE $botnick :$black(xmod)"
blacktools:tell:prv $nick $host $hand login.1 $black(chanserv)
}

########################### User Protection ################################

proc protectpublic {nick host hand chan args} {
global black
set bans [lindex $args 1]
if {![botisop $chan]} { return 0 }
if {$bans == "*!*@*"} { putquick "MODE $chan -b $bans"
return 0
}
set list [userlist $black(exceptflags) $chan]
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $bans $host]} {
putquick "MODE $chan -b $bans"
if {[onchan $black(chanserv) $chan]} {
putquick "PRIVMSG $black(chanserv) :unban $chan $bans"
}
}
}
}
}

############################## AntiChanFlood ###############################

proc antifloodchan:protect {nick host hand chan arg} {
global black botnick count
set arg [split $arg]
if {![validchan $chan]} { return 0 }
set getreason [channel get $chan antichanflood-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.antichanflood.1)
}
set getbantime [channel get $chan antichanflood-bantime]
if {$getbantime == "0"} { set getbantime $black(antifloodchanbantime) }
set replace(%chan%) $chan
set getset [channel get $chan chanflood]
if {$getset == ""} { set getset "4 5" }
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set number [lindex [split $getset] 0]
set time [lindex [split $getset] 1]
set banmask *!*@[lindex [split $host @] 1]
set handle [nick2hand $nick]
foreach tmr [utimers] {
if {[string match "*count(repeat:$host:$chan:flood)*" [join [lindex $tmr 1]]]} {
killutimer [lindex $tmr 2]
}
}
if {[channel get $chan antichanflood]} {
if {[isvoice $nick $chan] && ($black(vprotect) == "1")} { return 0 }
if {[isop $nick $chan] && ($black(oprotect) == "1")} { return 0 }
if {![botisop $chan]} { return 0 }
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }

if {![info exists count(repeat:$host:$chan:flood)]} { 
set count(repeat:$host:$chan:flood) 0 
}

if {![info exists count(repeat:$host:$chan)]} { 
set count(repeat:$host:$chan) 0 
}

incr count(repeat:$host:$chan:flood)
utimer $time [list unset count(repeat:$host:$chan:flood)]

if {$count(repeat:$host:$chan:flood) >= $number} {
if {$black(antifloodchantype) == "0"} { set count(repeat:$host:$chan) 2 } 
incr count(repeat:$host:$chan)
if {$count(repeat:$host:$chan) == 1} {
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $nick :$reason"
}
if {$count(repeat:$host:$chan) >= 2} {
blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
unset count(repeat:$host:$chan)
}
}
}
}

proc antifloodchan:protect:me {nick host hand chan keyword arg} {
antirepeat:protect $nick $host $hand $chan $arg
}

################################# reban ################################

proc rebanpublic {nick host hand chan} {
global black
if {[channel get $chan xban]} {
set host "$nick![getchanhost $nick $chan]"
set getxtime [channel get $chan xbantime]
set getxlevel [channel get $chan xbanlevel]
if {$getxlevel == "0"} { set getxlevel "100" } 
if {$getxtime == "0"} { set getxtime "1" }
foreach ban [banlist $chan] {
set reason "[lindex $ban 1]"
if {[string match -nocase [string tolower [lindex $ban 0]] $host]} {
putquick "PRIVMSG $black(chanserv) :ban $chan [lindex $ban 0] $getxtime $getxlevel $reason"
}
}
}
}

################################# XTOOLS ################################

proc toolspublic {chan type} {
global botnick black
if {![channel get $chan xtools]} {
return 0
}
if {$type == "op"} {
if  {![onchan "$black(chanserv)" $chan] && ![botisop $chan]} {
return 0
}
putquick "PRIVMSG $black(chanserv) :unban $chan $botnick"
putquick "PRIVMSG $black(chanserv) :op $chan $botnick"
return 0
}
if {$type == "unban"} {
putquick "PRIVMSG $black(chanserv) :unban $chan $botnick"
return 0
}
if {$type == "invite" || $type == "limit"} {
putquick "PRIVMSG $black(chanserv) :invite $chan $botnick"
return 0
}
}


################################# Clone Scan ###################################



proc scannerpublic {nick host hand chan arg} {
global black count
set c [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
scanner:process $nick $host $hand $chan $chan1
}

proc scanner:process {nick host hand chan chan1} {
global botnick black
array set clones [list]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

blacktools:tell $nick $host $hand $chan $chan1 clonescan.4 none
foreach user [chanlist $chan] {
set host [string tolower [lindex [split [getchanhost $user $chan] @] 1]]
if {![string match "*.undernet.org*" $host]} {
if {!($black(maxclone) >= "2")} { return 0 }
if {![info exists c($host:$chan)]} {
set c($host:$chan) 0
}
set c($host:$chan) [expr $c($host:$chan) +1]
lappend clones($user) $host
if {$c($host:$chan) >= $black(maxclone)} {
foreach clon [lsort -unique [array names clones]] {
set hosts [string tolower [lindex [split [getchanhost $clon $chan] @] 1]]
if {$host == $hosts} {
lappend clona($host) [join $clon " , "]
} 
}
blacktools:tell $nick $host $hand $chan $chan1 clonescan.1 "$c($host:$chan) $host [lsort -unique $clona($host)]"
}
utimer 3 [list blacktools:tell $nick $host $hand $chan $chan1 clonescan.2 none]
}
} 
}

proc clonescanner {minute hour day month year} {
global black botnick
foreach chan [channels] {
set replace(%chan%) $chan
if {[channel get $chan clonescan]} {
putlog "Scaning for clones on $chan.."
foreach user [chanlist $chan] {
set host [string tolower [lindex [split [getchanhost $user $chan] @] 1]]
set replace(%host%) $host
if {![info exists c($host:$chan)]} {
set c($host:$chan) 0
}
array set clones [list]
if {![string match "*.undernet.org*" $host]} {
if {!($black(maxclone) >= "2")} { return 0 }
set c($host:$chan) [expr $c($host:$chan) +1]
lappend clones($user) $host
if {$c($host:$chan) >= $black(maxclone)} {
foreach clon [array names clones] {
set hosts [string tolower [lindex [split [getchanhost $clon $chan] @] 1]]
if {$host == $hosts} {
lappend clona($host) [join $clon " , "]
} 
}
set replace(%num%) $c($host:$chan)
set replace(%clone%) [lsort -unique $clona($host)]
if {$black(what) == "0"} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
putserv "NOTICE @$chan :[string map [array get replace] $black(say.$getlang.clonescan.3)]"
}
if {$black(what) == "1"} {
set banmask *!*@[lindex [split $host @] 1]
set reason [string map [array get replace] $black(reason)]
blacktools:banner:2 $banmask $botnick $chan $reason $black(clonebtime)
}
}
}
}
}
}
}



############################# Topic refresh #########################

proc refreshpublic {nick host hand chan arg} {
global botnick black
set thetopic [topic $chan]
puthelp "TOPIC $chan :$black(topics)"
puthelp "TOPIC $chan :$thetopic"
}


proc times_topic {} {
 global black
foreach chan [channels] {
if {[channel get $chan topicrefresh] } {
set thetopic [topic $chan]
   puthelp "TOPIC $chan :$black(topics)"
   puthelp "TOPIC $chan :$thetopic"

}
}
timer $black(topic_time) times_topic
 return 1
}



################################ count ####################################

proc countpublic {nick host hand chan arg} {
global black
set type 0
set chan1 "$chan"
set why [lindex [split $arg] 0]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
}
count:process $nick $host $hand $chan $chan1 $why $type
}


proc count:process {nick host hand chan chan1 why type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 count.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 count.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 count.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 count.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
if { [channel get $chan count] } { set countstats "on" } else { set countstats "off"}
if {($countstats == "on") && ($why == "on")} { blacktools:tell $nick $host $hand $chan $chan1 count.5 none
return 0
}
if {($countstats == "off") && ($why == "off")} { blacktools:tell $nick $host $hand $chan $chan1 count.6 none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|on|off|display|reset)} $why tmp counter]) && (![regexp -nocase -- {\S#} $why])} {
    switch $counter {

on {
channel set $chan +count
blacktools:tell $nick $host $hand $chan $chan1 count.7 none
}

off {
channel set $chan -count
blacktools:tell $nick $host $hand $chan $chan1 count.8 none
}

display {
set stats [channel get $chan countnumber]
blacktools:tell $nick $host $hand $chan $chan1 count.9 $stats
}

reset {
channel set $chan countnumber 0
blacktools:tell $nick $host $hand $chan $chan1 count.10 none

}
} 
} 
}


proc countpublic:join {nick host hand chan} {
global black
if {[isbotnick $nick]} { return 0}
if {[channel get $chan count]} {
set stats [channel get $chan countnumber]
set counting [expr $stats +1]
channel set $chan countnumber $counting
set replace(%num%) $counting
set replace(%chan%) $chan
set countmes [channel get $chan count-message]
if {$countmes == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set countmessage [string map [array get replace] $black(say.$getlang.count.11)]
}
putquick "NOTICE $nick :$countmessage"
}
}


############################### Private ##########################

proc privatepublic {nick host hand chan arg} {
global black
set type 0
set chan1 "$chan"
set why [lindex [split $arg] 0]
set user [lindex [split $arg] 1]
set host [lindex [split $arg] 2]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
set user [lindex [split $arg] 2]
set host [lindex [split $arg] 3]
}
private:process $nick $host $hand $chan $chan1 $why $user $host $type
}

proc private:process {nick host hand chan chan1 why user host type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flags "-|f"
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 private.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 private.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 private.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 private.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $why tmp privat]) && (![regexp -nocase -- {\S#} $why])} {
    switch $privat {
on {
     channel set $chan +private
blacktools:tell $nick $host $hand $chan $chan1 private.5 none
}

off {
     channel set $chan -private
blacktools:tell $nick $host $hand $chan $chan1 private.6 none
}

add {

if {[validuser $user]} { 
chattr $user $flags $chan
blacktools:tell $nick $host $hand $chan $chan1 private.7 $user
return 0
}
adduser $user $host
chattr $user $flags $chan
blacktools:tell $nick $host $hand $chan $chan1 private.8 "$user $host"
}


del {

if {[validuser $user]} {
chattr $user -|-f $chan
blacktools:tell $nick $host $hand $chan $chan1 private.9 $user
} else { blacktools:tell $nick $host $hand $chan $chan1 private.10 $user
return 0
}
}

list {
set list [userlist $flags $chan]
blacktools:tell $nick $host $hand $chan $chan1 private.11 $list
}

}
}
}



proc private:module {nick host hand chan} {
global black botnick
set getreason [channel get $chan private-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.private.12)
}
set getbantime [channel get $chan private-bantime]
if {$getbantime == "0"} { set getbantime $black(privatebantime) }
set handle [nick2hand $nick]
set mask "*!*@[lindex [split $host @] 1]"
if {[channel get $chan private]} {
if {[matchattr $handle nm|oMASOVf $chan]} { 
return 0 
}
newchanban $chan $mask $botnick $getreason $getbantime
}
}


############################### BadChan ###########################

proc badchanpublic {nick host hand chan arg} {
global black
set why [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set bdchan [join [lindex [split $arg] 1]]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
set bdchan [join [lindex [split $arg] 2]]
}
badchan:process $nick $host $hand $chan $chan1 $why $bdchan $type
}

proc badchan:process {nick host hand chan chan1 why bdchan type} {
global botnick black
set flag "antibadchan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/badchan($chan).txt"
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 badchan.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 badchan.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 badchan.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 badchan.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $why tmp bc]) && (![regexp -nocase -- {\S#} $why])} {
    switch $bc {
on {
channel set $chan +$flag
blacktools:tell $nick $host $hand $chan $chan1 badchan.5 none
}
off {
channel set $chan -$flag
blacktools:tell $nick $host $hand $chan $chan1 badchan.6 none

}

add {
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $bdchan
close $file
blacktools:tell $nick $host $hand $chan $chan1 badchan.7 $bdchan
}

list {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set dir "logs/badchan($chan).txt"
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 badchan.8 none
return 0
}
foreach cc $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 badchan.9 none
blacktools:tell $nick $host $hand $chan $chan1 badchan.10 "$i. $cc"
}
}

del {
if {![regexp {^[0-9]} $bdchan]} {
blacktools:tell $nick $host $hand $chan $chan1 badchan.11 none
return 0
}

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"] 
set i [expr $bdchan - 1]
set delete [lreplace $lines $i $i]
set file [open $dir "w"]
puts $file [join $delete "\n"]
close $file
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}
blacktools:tell $nick $host $hand $chan $chan1 badchan.12 $bdchan
blacktools:tell $nick $host $hand $chan $chan1 badchan.13 none
}


}
}
}



proc badchanpublic:join {nick host hand chan} {
global black
set handle [nick2hand $nick]
set ::ccchan $chan
if {![validchan $chan]} {
return 0
}
if {[matchattr $handle nm|MASoOVv $chan]} { return 0 }
if {![botisop $chan]} { return 0 }
if {[isbotnick $nick]} { return 0 }
if {[channel get $chan antibadchan]} {
if {[onchan $nick $chan]} {
utimer 5 [list putquick "WHOIS $nick $nick"]
bind RAW - 319 badchanpublic:ban
}
}
}

proc badchanpublic:ban {from keyword arguments } {
global botnick black
set chan $::ccchan
set arguments [join $arguments]
set nick [string tolower [lindex $arguments 1]] 
set replace(%chan%) $chan
set replace(%nick%) $nick
set handle [nick2hand $nick]
set args [join $arguments]
set getreason [channel get $chan badchan-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.badchan.14)
}
set getbantime [channel get $chan badchan-bantime]
if {$getbantime == "0"} { set getbantime $black(badcbantime) }
if {[channel get $chan antibadchan]} {
if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
set protectreason [string map [array get replace] $getreason]
set reason "$protectreason"
set channels [string tolower [lrange $args 2 end]]
set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1]
set dir "logs/badchan($chan).txt"
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set bchan [split $w "\n"]
if {$w == ""} { return 0 }
foreach badchan $bchan {
set replace(%bchan%) $badchan
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set protectmsg [string map [array get replace] $black(say.$getlang.badchan.15)]
foreach c $channels {
set ch [string trimleft $c ":@+"]
if {[string match -nocase $badchan $ch]} {
blacktools:banner:2 $banmask $botnick $chan $getreason $getbantime
putserv "PRIVMSG $nick :$protectmsg"
}
}
}
}
}


################################# Antitake ##################################


proc dontdeoppublic {nick host hand chan args} {
global black botnick
set dnick [lindex $args 1]
set handle [nick2hand $nick]
if {[channel get $chan dontdeop] } {
if {[string match -nocase $nick $botnick]} {
return 0
}
if {![matchattr $handle $black(exceptflags) $chan]} {
putquick "MODE $chan -o $nick"
putquick "MODE $chan +o $dnick"
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
puthelp "NOTICE $nick :$black(say.$getlang.antitake.1)"
}
}
}
 
proc dontoppublic {nick host hand chan args} {
global black botnick
set onick [lindex $args 1]
set handle [nick2hand $nick]
if {[channel get $chan dontop]} {
if {[string match -nocase $nick $botnick]} { 
return 0
}
if {[string match -nocase $onick $botnick]} {
return 0
}
if {![matchattr $handle $black(exceptflags) $chan]} {
putquick "MODE $chan -o $nick"
putquick "MODE $chan -o $onick"
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
puthelp "NOTICE $nick :$black(say.$getlang.antitake.2)"
}
}
}


################################# Anunt ###################################


proc anuntpublic {nick host hand chan arg} {
global black
set type 0
set chan1 "$chan"
set who [lindex [split $arg] 0]
set message [join [lrange [split $arg] 1 end]]
set number [lindex [split $arg] 1]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 1]
set message [join [lrange [split $arg] 2 end]]
set number [lindex [split $arg] 2]
}
anunt:process $nick $host $hand $chan $chan1 $who $message $number $type
}

proc anunt:process {nick host hand chan chan1 who message number type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/anunt($chan).txt"
if {[matchattr $hand nm|- $chan]} {
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 anunt.1 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 anunt.2 none
return 0
}
}
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 anunt.3 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 anunt.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $who tmp a]) && (![regexp -nocase -- {\S#} $who])} {
    switch $a {
on {
channel set $chan +anunt
blacktools:tell $nick $host $hand $chan $chan1 anunt.5 none
}

off {
channel set $chan -anunt
blacktools:tell $nick $host $hand $chan $chan1 anunt.6 none
}

add {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $message
close $file
blacktools:tell $nick $host $hand $chan $chan1 anunt.7 none
blacktools:tell $nick $host $hand $chan $chan1 anunt.8 $message
}

list {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 anunt.9 none
return 0
}
foreach mes $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 anunt.10 none
blacktools:tell $nick $host $hand $chan $chan1 anunt.8 "$i. $mes"
}
}

del {

if {![regexp {^[0-9]} $number]} {
blacktools:tell $nick $host $hand $chan $chan1 anunt.11 none
return 0
}

set dir "logs/anunt($chan).txt"
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set i [expr $number - 1]
set delete [lreplace $lines $i $i]
set files [open $dir "w"]
puts $files [join $delete "\n"]
close $files
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}

blacktools:tell $nick $host $hand $chan $chan1 anunt.12 $number
blacktools:tell $nick $host $hand $chan $chan1 anunt.13 none
}

}
}
}

proc anuntpublic:show {} {
global black count
foreach chan [channels] {
if {[validchan $chan]} {
set dir "logs/anunt($chan).txt"
if {[channel get $chan anunt]} {
if {![info exists count(anunt:$chan)]} {
set count(anunt:$chan) 0
}
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set line [lindex $lines $count(anunt:$chan)]
incr count(anunt:$chan)
if {$line == ""} {
unset count(anunt:$chan)
}
if {$black(anunthow) == "1"} {
puthelp "PRIVMSG $chan :\001ACTION $line\001"
} else { 
puthelp "PRIVMSG $chan :$line"
}
}
}
}
timer $black(anunttime) anuntpublic:show
return 1
}

################################## TimeBan #############################


proc timeban:module {nick host hand chan} {
global botnick
if {[channel get $chan showtime]} {
set host "$nick![getchanhost $nick $chan]"
foreach ban [banlist $chan] {
if {[string match -nocase [string tolower [lindex $ban 0]] $host]} {
set reason "[lindex $ban 1]"
set bantime "[lindex $ban 2]"
set totalday [expr $bantime - [unixtime]]
if {$totalday >= 86400} {
set daysfull [expr $totalday/86400]
set days [expr int($daysfull)]
set dayssub [expr 86400*$days]
set totalhour [expr $totalday - $dayssub]
}
if {$totalday < 86400} {
set totalhour $totalday
set days 0
}
if {$totalhour >= 3600} {
set hoursfull [expr $totalhour/3600]
set hours [expr int($hoursfull)]
set hourssub [expr 3600*$hours]
set totalmin [expr $totalhour - $hourssub]
}
if {$totalhour < 3600} {
set totalmin $totalhour
set hours 0
}
if {$totalmin >= 60} {
set minsfull [expr $totalmin/60]
set mins [expr int($minsfull)]
}
if {$totalmin < 60} {
set mins 0
}
if {$days < 1} {set zi "0 zile, "} elseif {$days == 1} {set zi "$days zi, "} {set zi "$days zile, "}
if {$hours < 1} {set ora "0"} else { set ora "$hours" }
set minut "$mins"
set re "$reason Expire :$zi$ora:$minut"
if {[lindex $ban 2] == 0} {
set expire "Expire :Perm Ban"
set re "$reason $expire"
}
putquick "MODE $chan +b [lindex $ban 0]"
putquick "KICK $chan $nick :$re"
}
}
}
}



############################### AutoBroadcast ############################

proc broadcastpublic:module {nick host hand chan arg} {
global black sdir
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set chan1 "$chan"
set who [lindex [split $arg] 0]
set message [join [lrange [split $arg] 1 end]]
set number [lindex [split $arg] 1]
if {$who == ""} { blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.1 none
return 0
}
broadcast:process $nick $host $hand $chan $chan1 $who $message $number
}




proc broadcast:process {nick host hand chan chan1 who message number} {
global botnick black sdir
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/broadcast.txt"
set lin 0

if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $who tmp a]) && (![regexp -nocase -- {\S#} $who])} {
    switch $a {

on {
set type "broadcastpublic:show ON"
foreach tmr [timers] {
if {[string match "*broadcastpublic:show*" [join [lindex $tmr 1]]]} {
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.3 none
return 0
}
}
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.4 none
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set who [lindex  [split $line] 0]
set stats [lindex [split $line] 1]
if {[string match -nocase "broadcastpublic:show" $who]} {
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $sdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $sdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $sdir "w"]
close $files
}
set file [open $sdir "a"]
puts $file "$type"
close $file
timer $black(bttime) broadcastpublic:show
}

off {
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.5 none
set type "broadcastpublic:show OFF"
foreach tmr [timers] {
if {[string match -nocase "*broadcastpublic:show*" [join [lindex $tmr 1]]]} {
killtimer [lindex $tmr 2]
}
}
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set who [lindex  [split $line] 0]
set stats [lindex [split $line] 1]
if {[string match -nocase "broadcastpublic:show" $who]} {
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $sdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $sdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $sdir "w"]
close $files
}
set file [open $sdir "a"]
puts $file "$type"
close $file
}

add {
if {[file exists $dir] == 0} {
set file [open $dir a]
close $file
}
set file [open $dir a]
puts $file $message
close $file
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.6 none
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.7 $message
}

list {
if {[file exists $dir] == 0} {
set file [open $dir a]
close $file
}
set dir "logs/broadcast.txt"
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.8 none
return 0
}
foreach mes $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.9 none
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.7 "$i. $mes"
}
}

del {

if {![regexp {^[0-9]} $number]} {
blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.10 none
return 0
}

set dir "logs/broadcast.txt"
if {[file exists $dir] == 0} {
set file [open $dir a]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set i [expr $number - 1]
set delete [lreplace $lines $i $i]
set files [open $dir "w"]
puts $files [join $delete "\n"]
close $files
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}

blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.11 $number
}

}
}
}


proc broadcastpublic:show {} {
global black
set dir "logs/broadcast.txt"
if {[file exists $dir] == 0} {
set file [open $dir a]
close $file
}
foreach chan [channels] {
if {[isdynamic $chan] && (![channel get $chan silent])} {
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set numlines [llength $lines]
set random [rand $numlines]
set randomline [lindex $lines $random]
if {$black(bthow) == "1"} {
puthelp "PRIVMSG $chan :\001ACTION 1(BROADCAST) $randomline\001"
} else { 
puthelp "PRIVMSG $chan :1(BROADCAST) $randomline"
}
}
}
timer $black(bttime) broadcastpublic:show
return 1
}


################################# Limit ###################################


proc limitpublic {nick host hand chan arg} {
global black 
set why [lindex [split $arg] 0]
set lm [lindex [split $arg] 1]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
set lm [lindex [split $arg] 2]
}
limit:process $nick $host $hand $chan $chan1 $why $lm $type
}

proc limit:process {nick host hand chan chan1  why lm type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 limit.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 limit.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 limit.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 limit.4 none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

set usersnum [llength [chanlist $chan]]
set setnum [channel get $chan blacklimit]

if {([regexp -nocase -- {(#[0-9]+|on|off|set|on|off)} $why tmp lmt]) && (![regexp -nocase -- {\S#} $why])} {
    switch $lmt {

on {
set limt [channel get $chan blacklimit]
channel set $chan +limit
blacktools:tell $nick $host $hand $chan $chan1 limit.5 none
if {($limt != "0")} {
putserv "MODE $chan +l [expr $usersnum + $limt]"
} else {
putserv "MODE $chan +l [expr $usersnum + 10]"
channel set $chan blacklimit 10
blacktools:tell $nick $host $hand $chan $chan1 limit.6 none
}
}
off {
channel set $chan -limit
blacktools:tell $nick $host $hand $chan $chan1 limit.7 none
putquick "MODE $chan -l"
}

set {
if {![regexp {^[0-9]} $lm]} {
blacktools:tell $nick $host $hand $chan $chan1 limit.8 none
return 0
}
if {$lm < 2} { blacktools:tell $nick $host $hand $chan $chan1 limit.9 none
channel set $chan blacklimit 2
putserv "MODE $chan +l [expr $usersnum + $lm]"
blacktools:tell $nick $host $hand $chan $chan1 limit.10 none
return 0
}
if {$lm > 500} { blacktools:tell $nick $host $hand $chan $chan1 limit.11 none
return 0
}

channel set $chan blacklimit $lm
blacktools:tell $nick $host $hand $chan $chan1 limit.12 $lm
putserv "MODE $chan +l [expr $usersnum + $lm]"
}

}
}
}

proc limit:timer {min hour day mon year} {
global black
foreach chan [channels] {
if {[channel get $chan limit]} {
set usersnum [llength [chanlist $chan]]
set setnum [channel get $chan blacklimit]
if {$setnum == "0"} { set setnum "10" }
if {![botisop $chan]} { return 0 }
set chanmode [getchanmode $chan]
if {[string match "*l*" "$chanmode"]} {
set lim [lindex $chanmode 1]
} else { set lim "0" }
if {$usersnum > $lim} { set dif [expr $usersnum - $lim] } else { set dif [expr $lim - $usersnum] }
if {($dif >= $setnum) || ($dif <= $setnum)} {
putserv "MODE $chan +l [expr $usersnum + $setnum]"
}

}
}
}





################################# Topic ###################################

proc topicpublic {nick host hand chan arg} {
global black
set nop [lindex [split $arg] 0]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set type 0
set chan1 "$chan"
set tp [join [lrange [split $arg] 1 end]]
set number [lindex [split $arg] 1]
if {[regexp {^[\\+!#&]} $nop] && [matchattr $hand nm|- $chan]} {
set chan "$nop"
set nop [lindex [split $arg] 1]
set tp [join [lrange [split $arg] 2 end]]
set number [lindex [split $arg] 2]
}
topic:process $nick $host $hand $chan $chan1 $nop $tp $number $type
}



proc topic:process {nick host hand chan chan1 nop tp number type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/topic($chan).txt"
if {[matchattr $hand nm|- $chan]} {
if {($nop == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 topic.1 none
return 0
}
if {($nop == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 topic.2 none
return 0
}
}
if {($nop == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 topic.3 none
return 0
}
if {($nop == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 topic.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


 if {([regexp -nocase -- {(#[0-9]+|save|list|add|del|set)} $nop tmp topc]) && (![regexp -nocase -- {\S#} $nop])} {
    switch $topc {

 save {
set t [join [topic $chan]]
if {$t == ""} { blacktools:tell $nick $host $hand $chan $chan1 topic.5 none
return 0
}

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $t
close $file
blacktools:tell $nick $host $hand $chan $chan1 topic.6 none
}

add {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $tp
close $file
blacktools:tell $nick $host $hand $chan $chan1 topic.7 none
}

list {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 topic.8 none
return 0
}
foreach ts $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 topic.9 none
blacktools:tell $nick $host $hand $chan $chan1 topic.10 "$i. $ts"
}
}

del {

if {![regexp {^[0-9]} $number]} {
blacktools:tell $nick $host $hand $chan $chan1 topic.11 none
return 0
}

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set i [expr $number - 1]
set delete [lreplace $lines $i $i]
set files [open $dir "w"]
puts $files [join $delete "\n"]
close $files
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}
blacktools:tell $nick $host $hand $chan $chan1 topic.12 $number
}

set {
if {$number == ""} { blacktools:tell $nick $host $hand $chan $chan1 topic.13 none
return 0
}
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set num [expr $number - 1]
set line [lindex $lines $num]
putquick "TOPIC $chan :Setting topic.."
puthelp "TOPIC $chan :$line"
blacktools:tell $nick $host $hand $chan $chan1 topic.14 $number
}

}
}
}


################################# Seen ###################################


proc seen:save:2 {nick chan host type time staytimer reason} {
global seendir
set lin 0
set j 0
set who "$type $chan $nick $host $time $staytimer $reason"
set file [open $seendir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set userentry [lindex  [split $line] 2]
set chanentry [lindex [split $line] 1]
if {[string equal -nocase $userentry $nick] && [string match -nocase $chanentry $chan]} {
set joined [lindex [split $line] 0]
if {$joined == "JOIN"} {
set j [lindex [split $line] 4]
if {![regexp {^[0-9]} $j] || ($j == "")} {
set j 0
}
}
set who "$type $chan $nick $host $time $j $reason"
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $seendir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $seendir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $seendir "w"]
close $files
}
set file [open $seendir "a"]
puts $file "$who"
close $file
}

proc seen:save:1 {nick chan host type time staytimer} {
global seendir
set lin 0
set who "$type $chan $nick $host $time $staytimer"
set file [open $seendir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set userentry [lindex  [split $line] 2]
set chanentry [lindex [split $line] 1]
if {[string equal -nocase $userentry $nick] && [string match -nocase $chanentry $chan]} {
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $seendir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $seendir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $seendir "w"]
close $files
}
set file [open $seendir "a"]
puts $file "$who"
close $file
}


proc seen:join {nick host hand chan} {
global seendir botnick
if {![channel get $chan seen]} {
return 0
}
if {[isbotnick $nick]} { return 0 }
set time [unixtime]
set host "*!$host"
set type "JOIN"
set staytimer "0"
seen:save:1 $nick $chan $host $type $time $staytimer
}


proc seen:part {nick host hand chan arg} {
global seendir botnick
if {![validchan $chan]} { return 0 }
if {![channel get $chan seen]} {
return 0
}
set time [unixtime]
set staytimer "0"
set type "PART"
set reason [join [lrange [split $arg] 0 end]]
if {$reason == ""} { set reason "No Reason" }
set host "*!$host"
if {[isbotnick $nick]} { return 0 }
seen:save:2 $nick $chan $host $type $time $staytimer $reason
}

proc seen:sign {nick host hand chan arg} {
global seendir botnick
if {![validchan $chan]} { return 0 }
if {![channel get $chan seen]} {
return 0
}
set time [unixtime]
set staytimer "0"
set type "SIGN"
set host "*!$host"
set reason [join [lrange [split $arg] 0 end]]
if {$reason == ""} { set reason "No Reason" }
if {[isbotnick $nick]} { return 0 }
seen:save:2 $nick $chan $host $type $time $staytimer $reason
}


proc seen:kick {nick host hand chan kicked reason} {
global seendir botnick
if {![validchan $chan]} { return 0 }
if {![channel get $chan seen]} {
return 0
}
set lin 0
set j 0
set time [unixtime]
set hosted [getchanhost $kicked $chan]
set hosted "*!$hosted"
set reason [join [lrange [split $reason] 1 end]]
if {$reason == ""} { set reason "No Reason" }
if {[isbotnick $kicked]} { return 0 }
set who "KICK $chan $kicked $hosted $time 0 $reason"
set file [open $seendir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set userentry [lindex [split $line] 2]
set chanentry [lindex [split $line] 1]
if {[string equal -nocase $kicked $userentry] && [string match -nocase $chanentry $chan]} {
set joined [lindex [split $line] 0]
if {$joined == "JOIN"} {
set j [lindex [split $line] 4]
if {![regexp {^[0-9]} $j] || ($j == "")} {
set j 0
}
}
set who "KICK $chan $kicked $hosted $time $j $reason"
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $seendir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $seendir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $seendir "w"]
close $files
}
set file [open $seendir "a"]
puts $file "$who"
close $file
}


proc seen:split {nick host hand chan args} {
global seendir botnick
if {![validchan $chan]} { return 0 }
if {![channel get $chan seen]} {
return 0
}
set time [unixtime]
set staytimer "0"
set type "SPLIT"
set host "*!$host"
set reason [join [lrange [split $args] 0 end]]
if {[isbotnick $nick]} { return 0 }
seen:save:2 $nick $chan $host $type $time $staytimer $reason
}


proc seen:changenick {nick host hand chan newnick} {
global seendir botnick
if {![channel get $chan seen]} {
return 0
}
set time [unixtime]
set host "*!$host"
set staytimer "0"
set type "NICKCHANGE"
if {[isbotnick $nick]} { return 0 }
seen:save:2 $nick $chan $host $type $time $staytimer $newnick
}

proc seenpublic {nick host hand chan arg} {
global black
if {![channel get $chan seen]} {
return 0
}
set type 0
set chan1 "$chan"
set what [lindex [split $arg] 0]
if {[regexp {^[\\+!#&]} $what] && [matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set chan "$what"
set what [lindex [split $arg] 1]
}
seen:process $nick $host $hand $chan $chan1 $what $type
}



proc seen:process {nick host hand chan chan1 what type} {
global seendir black count botnick
set number [scan $black(seenflood) %\[^:\]]
set timer [scan $black(seenflood) %*\[^:\]:%s]
set i 0
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($what == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 seen.1 none
return 0
}
if {($what == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 seen.2 none
return 0
}
}
if {($what == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 seen.3 none
return 0
}
if {($what == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 seen.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
foreach tmr [utimers] {
if {[string match "*count(flood:$host:$chan)*" [join [lindex $tmr 1]]]} {
killutimer [lindex $tmr 2]
}
}
if {![info exists count(flood:$host:$chan)]} { 
set count(flood:$host:$chan) 0 
}
incr count(flood:$host:$chan)
utimer $timer [list unset count(flood:$host:$chan)]

if {$count(flood:$host:$chan) == "$number"} {
blacktools:tell $nick $host $hand $chan $chan1 seen.5 none
return 0
}

if {[string match -nocase $what $nick]} { blacktools:tell $nick $host $hand $chan $chan1 seen.6 $nick
return 0
}
if {[onchan $what $chan]} { blacktools:tell $nick $host $hand $chan $chan1 seen.7 $what
return 0
}

set file [open $seendir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set userentry [lindex [split $line] 2]
set chanentry [lindex [split $line] 1]
set host [lindex [split $line] 3]
set tm [lindex [split $line] 4]
set jointime [lindex [split $line] 5]
set newnick [lindex [split $line] 6]
set reason [lrange [split $line] 6 end]
if {!([regexp {^[0-9]} $jointime]) || ($jointime == "")} {
set jointime 0
set reason [lrange [split $line] 5 end]
}
if {$reason == ""} { set reason "No Reason" }
set output [duration [expr [unixtime] - $tm]]
set staytime [expr [unixtime] - $jointime]
set staytime [duration [expr $tm - $jointime]]

set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }

set date [clock format $tm -format %d.%m.]
set hour [clock format $tm -format %H:%M]

if {$what == "*!*@*"} { return 0 }
if {([string equal -nocase $userentry $what] || [string match -nocase $what $userentry] || [string match -nocase $what $host]) && [string match -nocase $chanentry $chan]} {
set i [expr $i +1]
set host [string trim $host "*!~"]
if {$i < 6} {
lappend entry $userentry
}
set seenfound 1
set entry [lsort -unique $entry]
set replace(%entry%) "[join $entry ","]"
set replace(%host%) "$host"
set replace(%output%) "$output"
set replace(%date%) "($date $hour)"
set replace(%newnick%) "$newnick"
set replace(%userentry%) "$userentry"
set replace(%chan%) "$chan"
set replace(%reason%) "$reason"
set replace(%staytime%) "$staytime"
if {$jointime == "0"} { set staymsg "[string map [array get replace] $black(say.$getlang.seen.8)]"
set replace(%staymsg%) "$staymsg"
} else {
 set staymsg "[string map [array get replace] $black(say.$getlang.seen.9)]"
set replace(%staymsg%) "$staymsg"
}
if {[lindex [split $line] 0] == "PART"} {
set reply "[string map [array get replace] $black(say.$getlang.seen.12)]"
}
if {[lindex [split $line] 0] == "SIGN"} {
set reply "[string map [array get replace] $black(say.$getlang.seen.13)]"
}
if {[lindex [split $line] 0] == "JOIN"} {
if {[onchan $userentry $chan]} { 
set nowon "[string map [array get replace] $black(say.$getlang.seen.10)]"
set replace(%nowon%) "$nowon"
} else { 
set nowon "[string map [array get replace] $black(say.$getlang.seen.11)]"
set replace(%nowon%) "$nowon"
}
set reply "[string map [array get replace] $black(say.$getlang.seen.14)]"
}
if {[lindex [split $line] 0] == "SPLIT"} {
set reply "[string map [array get replace] $black(say.$getlang.seen.15)]"
}
if {[lindex [split $line] 0] == "KICK"} {
set reply "[string map [array get replace] $black(say.$getlang.seen.16)]"
}
if {[lindex [split $line] 0] == "NICKCHANGE"} {
if {[onchan $newnick $chan]} { 
set nowon "[string map [array get replace] $black(say.$getlang.seen.10)]"
set replace(%nowon%) "$nowon"
} else {
set nowon "[string map [array get replace] $black(say.$getlang.seen.11)]"
set replace(%nowon%) "$nowon"
}
set reply "[string map [array get replace] $black(say.$getlang.seen.17)]"
}
}

if {$black(seenmet) == "1"} {
set method "NOTICE"
set onwho "$nick"
} else { 
set method "PRIVMSG"
set onwho "$chan1"
}
}
if {[info exists reply]} {
puthelp "$method $onwho :$reply"
}

if {![info exists seenfound]} {
blacktools:tell $nick $host $hand $chan $chan1 seen.18 $what
}
}

############################### Greet #####################################


proc greetpublic {nick host hand chan arg} {
global black
set who [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set greet [join [lrange [split $arg] 1 end]]
set number [lindex [split $arg] 1]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 1]
set greet [join [lrange [split $arg] 2 end]]
set number [lindex [split $arg] 2]
}
greet:process $who $greet $number $type $nick $host $hand $chan $chan1
}

proc greet:process {who greet number type nick host hand chan chan1} {
global botnick black
set dir "logs/greet($chan).txt"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 greet.1 none
blacktools:tell $nick $host $hand $chan $chan1 greet.2 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 greet.3 none
blacktools:tell $nick $host $hand $chan $chan1 greet.4 none
return 0
}
}
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 greet.5 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 greet.6 none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $who tmp a]) && (![regexp -nocase -- {\S#} $who])} {
    switch $a {
on {
channel set $chan +greet
blacktools:tell $nick $host $hand $chan $chan1 greet.7 none
}

off {
channel set $chan -greet
blacktools:tell $nick $host $hand $chan $chan1 greet.8 none
}

add {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $greet
close $file
blacktools:tell $nick $host $hand $chan $chan1 greet.9 none
blacktools:tell $nick $host $hand $chan $chan1 greet.10 $greet
}

list {

if {[file exists $dir] == 0} {
set file [open $dir a]
close $file
}
set dir "logs/greet($chan).txt"
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 greet.11 none
return 0
}
foreach mes $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 greet.12 none
blacktools:tell $nick $host $hand $chan $chan1 greet.10 "$i. $mes"
}
}

del {

if {![regexp {^[0-9]} $number]} {
blacktools:tell $nick $host $hand $chan $chan1 greet.13 none
return 0
}

set dir "logs/greet($chan).txt"
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set i [expr $number - 1]
set delete [lreplace $lines $i $i]
set files [open $dir "w"]
puts $files [join $delete "\n"]
close $files
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}

blacktools:tell $nick $host $hand $chan $chan1 greet.14 $number
blacktools:tell $nick $host $hand $chan $chan1 greet.15 none
}

}
}
}


proc greetpublic:join {nick host hand chan} {
global black
set dir "logs/greet($chan).txt"
if {![validchan $chan]} { return 0 }
if {[channel get $chan greet]} {
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
if {[isbotnick $nick]} { return 0 }
set replace(%nick%) $nick
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} { return 0 }
set lines [split $data "\n"]
set numlines [llength $lines]
set random [rand $numlines]
set randomline [lindex $lines $random]
set message [string map [array get replace] $randomline]
if {$black(howgreet) == "1"} {
puthelp "NOTICE $nick :$message"
} else { puthelp "PRIVMSG $nick :$message" }
}
}

################################ Leave ###################################

proc leave:process {who leave number type nick host hand chan chan1} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/leave($chan).txt"
if {[matchattr $hand nm|- $chan]} {
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 leave.1 none
blacktools:tell $nick $host $hand $chan $chan1 leave.2 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 leave.3 none
blacktools:tell $nick $host $hand $chan $chan1 leave.4 none
return 0
}
}
if {($who == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 leave.5 none
return 0
}
if {($who == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 leave.6 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|on|off|add|list|del)} $who tmp a]) && (![regexp -nocase -- {\S#} $who])} {
    switch $a {
on {
channel set $chan +leave
blacktools:tell $nick $host $hand $chan $chan1 leave.7 none
}

off {
channel set $chan -leave
blacktools:tell $nick $host $hand $chan $chan1 leave.8 none
}

add {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set file [open $dir a]
puts $file $leave
close $file
blacktools:tell $nick $host $hand $chan $chan1 leave.9 none
blacktools:tell $nick $host $hand $chan $chan1 leave.10 $leave
}

list {

if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
set dir "logs/leave($chan).txt"
set file [open $dir "r"]
set w [read -nonewline $file]
close $file
set data [split $w "\n"]
set i 0
if {$data == ""} { blacktools:tell $nick $host $hand $chan $chan1 leave.11 none
return 0
}
foreach mes $data {
set i [expr $i +1]
blacktools:tell $nick $host $hand $chan $chan1 leave.12 none
blacktools:tell $nick $host $hand $chan $chan1 leave.10 "$i. $mes"
}
}

del {
if {![regexp {^[0-9]} $number]} {
blacktools:tell $nick $host $hand $chan $chan1 leave.13 none
return 0
}

set dir "logs/leave($chan).txt"
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}

set file [open $dir "r"]
set data [read -nonewline $file]
close $file
set lines [split $data "\n"]
set i [expr $number - 1]
set delete [lreplace $lines $i $i]
set files [open $dir "w"]
puts $files [join $delete "\n"]
close $files
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $dir "w"]
close $files
}

blacktools:tell $nick $host $hand $chan $chan1 leave.14 $number
blacktools:tell $nick $host $hand $chan $chan1 leave.15 none
}

}
}
}



proc leavepublic {nick host hand chan arg} {
global black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set dir "logs/leave($chan).txt"
set type 0
set chan1 "$chan"
set who [lindex [split $arg] 0]
set leave [join [lrange [split $arg] 1 end]]
set number [lindex [split $arg] 1]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 1]
set leave [join [lrange [split $arg] 2 end]]
set number [lindex [split $arg] 2]
}
leave:process $who $leave $number $type $nick $host $hand $chan $chan1
}



proc leavepublic:part {nick host hand chan args} {
global black
set dir "logs/leave($chan).txt"
if {![validchan $chan]} { return 0 }
if {[channel get $chan leave]} {
if {[file exists $dir] == 0} {
set file [open $dir w]
close $file
}
if {[isbotnick $nick]} { return 0 }
set replace(%nick%) $nick
set file [open $dir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} { return 0 }
set lines [split $data "\n"]
set numlines [llength $lines]
set random [rand $numlines]
set randomline [lindex $lines $random]
set message [string map [array get replace] $randomline]
if {$black(howleave) == "1"} {
puthelp "NOTICE $nick :$message"
} else { puthelp "PRIVMSG $nick :$message" }
}
}

################################ Idle ###################################


proc antidlepublic {nick host hand chan arg} {
global black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set type1 0
set chan1 "$chan"
set why [lindex [split $arg] 0]
set type [lindex [split $arg] 1]
set user [lindex [split $arg] 1]
set host [lindex [split $arg] 2]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
set type [lindex [split $arg] 2]
set user [lindex [split $arg] 2]
set host [lindex [split $arg] 3]
}
antidle:process $why $type $type1 $user $host $nick $hand $chan $chan1
}

proc antidle:process {why type type1 user host nick hand chan chan1} {
global botnick black
set flag "-|f"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $user]
if {[matchattr $hand nm|- $chan]} {
if {($why == "") && ($type1 == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 idle.1 none
blacktools:tell $nick $host $hand $chan $chan1 idle.2 none
return 0
}
if {($why == "") && ($type1 == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 idle.3 none
blacktools:tell $nick $host $hand $chan $chan1 idle.4 none
return 0
}
}
if {($why == "") && ($type1 == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 idle.5 none
return 0
}
if {($why == "") && ($type1 == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 idle.6 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|op|voice|add|on|off)} $why tmp idler]) && (![regexp -nocase -- {\S#} $why])} {
    switch $idler {
on {
 channel set $chan +antidle
blacktools:tell $nick $host $hand $chan $chan1 idle.7 none
}
off {

 channel set $chan -antidle
blacktools:tell $nick $host $hand $chan $chan1 idle.8 none
}

op {
 if {$type == ""} { blacktools:tell $nick $host $hand $chan $chan1 idle.9 none
return 0
}
if {[string match -nocase $type "on"]} {
if {[channel get $chan antidle]} { set antidle "on" } else { set antidle "off"}
if {$antidle == "off"} { blacktools:tell $nick $host $hand $chan $chan1 idle.10 none
return 0
}
channel set $chan +antididle
blacktools:tell $nick $host $hand $chan $chan1 idle.11 none
}

if {[string match -nocase $type "off"]} {
if {[channel get $chan antidle]} { set antidle "on" } else { set antidle "off"}
if {$antidle == "off"} { blacktools:tell $nick $host $hand $chan $chan1 idle.10 none
return 0
}
channel set $chan -antididle
blacktools:tell $nick $host $hand $chan $chan1 idle.12 none
}
}

voice {
 if {$type == ""} { blacktools:tell $nick $host $hand $chan $chan1 idle.13 none
return 0
}

if {[string match -nocase $type "on"]} {

if {[channel get $chan antidle]} { set antidle "on" } else { set antidle "off"}
if {$antidle == "off"} { blacktools:tell $nick $host $hand $chan $chan1 idle.10 none
return 0
}
channel set $chan +antividle
blacktools:tell $nick $host $hand $chan $chan1 idle.14 none
}

if {[string match -nocase $type "off"]} {
if {[channel get $chan antidle]} { set antidle "on" } else { set antidle "off"}
if {$antidle == "off"} { blacktools:tell $nick $host $hand $chan $chan1 idle.10 none
return 0
}

channel set $chan -antividle
blacktools:tell $nick $host $hand $chan $chan1 idle.15 none
}
}

add {

if {$user == ""} { blacktools:tell $nick $host $hand $chan $chan1 idle.16 none
return 0
}

if {(![onchan $user $chan]) && (![validuser $user])} { blacktools:tell $nick $host $hand $chan $chan1 idle.17 $user
return 0
}

if {[validuser $user]} { 
chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 idle.18 $user
} else {
set hosts [getchanhost $user $chan]
set uhost "*!*@[lindex [split $hosts @] 1]"
adduser $user $uhost
chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 idle.19 "$user $uhost"
}
}

}
}
}



proc idlewhoispublic {min hour day mon year} {
global black botnick
if {([scan $min %d]+([scan $hour %d]*60)) % $black(idleinterval) == 0} {
foreach chan [channels] {
if {[channel get $chan antidle]} {
foreach user [chanlist $chan] { 
set user [split $user]
set handle [nick2hand $user]
if {[isop $user $chan] || [isvoice $user $chan]} { 
if {$user != $botnick} { putserv "WHOIS $user $user" }
} 
} 
} 
}
}

bind raw - 317 idleprocespublic
}

proc idleprocespublic {nick int arg} {
global black
set nick [string tolower [lindex $arg 1]]
set handle [nick2hand $nick]
set idler [string tolower [lindex $arg 2]]
set minutesidle [expr $idler / 60]
foreach chan [channels] {
set replace(%chan%) $chan
set idlevoicetime [channel get $chan idlevoicemax]
if {$idlevoicetime == "0"} { set idlevoicetime "$black(idlevoicemax)" }
set idleoptime [channel get $chan idleopmax]
if {$idleoptime == "0"} { set idleoptime "$black(idleopmax)" }
if {[channel get $chan antividle]} {
if {[isvoice $nick $chan] && ![matchattr $handle -|f $chan]} {
if {$minutesidle > $idlevoicetime} {
putserv "MODE $chan -v $nick"
}
}
}
if {[channel get $chan antididle]} {
if {[isop $nick $chan] && ![matchattr $handle -|f $chan]} {
if {$minutesidle > $idleoptime} {
putserv "MODE $chan -o $nick"
}
}
}

}
}


######################################### AntiBotIdle #############################


proc botidlepublic {nick host hand chan arg} {
global black botnick sdir
set what [lindex [split $arg] 0]
set lin 0
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {$what == ""} { blacktools:tell $nick $host $hand $chan $chan1 antibotidle.1 none
return 0
}
botidle:process $nick $host $hand $chan $chan1 $what
}

proc botidle:process {nick host hand chan chan1 what} {
global botnick black sdir
set lin 0
switch -exact -- [string tolower $what] {
on {
set type "antibotidle:module ON"
foreach tmr [timers] {
if {[string match "*antibotidle:module*" [join [lindex $tmr 1]]]} {
blacktools:tell $nick $host $hand $chan $chan1 antibotidle.3 none
return 0
}
}
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set who [lindex  [split $line] 0]
set stats [lindex [split $line] 1]
if {[string match -nocase "antibotidle:module" $who]} {
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $sdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $sdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $sdir "w"]
close $files
}
set file [open $sdir "a"]
puts $file "$type"
close $file
blacktools:tell $nick $host $hand $chan $chan1 antibotidle.4 none
timer $black(noidlemax) antibotidle:module
}

off {
blacktools:tell $nick $host $hand $chan $chan1 antibotidle.5 none
set type "antibotidle:module OFF"
foreach tmr [timers] {
if {[string match "*antibotidle:module*" [join [lindex $tmr 1]]]} {
killtimer [lindex $tmr 2]
}
}
set file [open $sdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1]
set who [lindex  [split $line] 0]
set stats [lindex [split $line] 1]
if {[string match -nocase "antibotidle:module" $who]} {
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $sdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $sdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $sdir "w"]
close $files
}
set file [open $sdir "a"]
puts $file "$type"
close $file
}

}
}


proc antibotidle:module {} {
global black
putquick "PRIVMSG $black(noobject) :"
timer $black(noidlemax) antibotidle:module
return 1
}

######################################## Comenzi #####################################

proc drpublic {nick host hand chan arg} {
global botnick black
set drone [lindex [split $arg] 0]
set chan1 "$chan"
set mask [lindex [split $arg] 0]
set type "0"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[#&]} $drone] && [matchattr $hand nm|- $chan]} {
set chan "$drone"
set drone [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
}
dr:process $drone $mask $nick $hand $host $chan $chan1 $type
}


proc dr:process {drone mask nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $drone]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
set getreason [channel get $chan dr-reason]
if {$getreason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.dr.5)
}
if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason" 
}
set getbantime [channel get $chan dr-bantime]
if {$getbantime == "0"} { set getbantime $black(drtime) }
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[isbotnick $drone]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[onchan $drone $chan]} {
set mask *!*@[lindex [split [getchanhost $drone $chan] "@"] 1] 
}
if {[matchattr $hand nm|- $chan]} {
if {($drone == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 dr.1 none
return 0
}
if {($drone == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 dr.2 none
return 0
}
}
if {($drone == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 dr.3 none
return 0
}
if {($drone == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 dr.4 none
return 0
}

blacktools:banner:3 $mask $hand $chan $reason $getbantime DR($chan)
}



proc botpublic {nick host hand chan arg} {
global botnick black
set bot [lindex [split $arg] 0]
set mask [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bot] && [matchattr $hand nm|- $chan]} {
set chan "$bot"
set bot [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
}
bot:process $bot $mask $nick $hand $host $chan $chan1 $type
}

proc bot:process {bot mask nick hand host chan chan1 type} {
global black botnick
set handle [nick2hand $bot]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
set getreason [channel get $chan bot-reason]
if {$getreason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.bot.5)
}
if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason" 
}
set getbantime [channel get $chan bot-bantime]
if {$getbantime == "0"} { set getbantime $black(bottime) }
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[isbotnick $bot]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[onchan $bot $chan]} {
set mask *!*@[lindex [split [getchanhost $bot $chan] "@"] 1] 
}
if {[matchattr $hand nm|- $chan]} {
if {($bot == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 bot.1 none
return 0
}
if {($bot == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 bot.2 none
return 0
}
}
if {($bot == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 bot.3 none
return 0
}
if {($bot == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 bot.4 none
return 0
}
blacktools:banner:3 $mask $hand $chan $reason $getbantime bot($chan)
}


proc b:local {bnick mask time nick reason hand host chan chan1 type} {
global botnick black
set handle [nick2hand $bnick]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$reason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set reason1 $black(say.$getlang.b.9)
 } else { set reason1 "$reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}

if {[isbotnick $bnick]} {
  return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
 return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[onchan $bnick $chan]} {
set mask *!*@[lindex [split [getchanhost $bnick $chan] "@"] 1] 
}

if {[matchattr $hand nm|- $chan]} {
if {($bnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 b.1 none
blacktools:tell $nick $host $hand $chan $chan1 b.2 none
return 0
}
if {($bnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 b.3 none
blacktools:tell $nick $host $hand $chan $chan1 b.4 none
return 0
}
}
if {($bnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 b.5 none
return 0
}
if {($bnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 b.6 none
return 0
}

blacktools:banner:3 $mask $hand $chan $reason $time b($chan)
if {$time == "0"} { set reply "Permanent" } else { set reply "$time minute" }
blacktools:tell $nick $host $hand $chan $chan1 b.7 "$mask $reply"
}


proc bpublic {nick host hand chan arg} {
global botnick black
set bnick [lindex [split $arg] 0]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set type 0
set chan1 "$chan"
set mask [lindex [split $arg] 0]
set time [lindex [split $arg] 1]
set type1 [lindex [split $arg] 1]
set type2 [lindex [split $arg] 2]
set reason [join [lrange [split $arg] 2 end]] 
set handle [nick2hand $bnick]
if {[string match -nocase "global" $type1] || [string match -nocase "global" $type2]  && [matchattr $hand nm|- $chan]} {
if {[string match -nocase $type1 "global"]} {
set reason [join [lrange [split $arg] 2 end]]
}
if {[string match -nocase $type2 "global"]} {
set reason [join [lrange [split $arg] 3 end]]
}
set list [userlist nm|-]
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}
if {[matchattr $handle nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {![regexp {^[0-9]} $time]} {
set reason [join [lrange [split $arg] 2 end]]
set time "$black(btime)"
}
if {$reason == ""} {set reason1 "(GLOBAL) $black(dfreason)"
 } else { set reason1 "(GLOBAL) $reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}

if {[isbotnick $bnick]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {$mask == "*!*@*"} {
 return 0
}
if {[onchan $bnick $chan]} {
set mask *!*@[lindex [split [getchanhost $bnick $chan] "@"] 1] 
}
newban $mask $hand $reason $time
if {$time == "0"} { set reply "Permanent" } else { set reply "$time" }
blacktools:tell $nick $host $hand $chan $chan1 b.8 "$mask $reply"
return 0
}
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bnick] && [matchattr $hand nm|- $chan]} {
set chan "$bnick"
set bnick [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
set time [lindex [split $arg] 2]
set reason [join [lrange [split $arg] 3 end]]
if {![regexp {^[0-9]} $time]} {
set reason [join [lrange [split $arg] 2 end]]
set time "$black(btime)"
}
}
if {![regexp {^[0-9]} $time]} {
set time "$black(btime)"
set reason [join [lrange [split $arg] 1 end]] 
}
b:local $bnick $mask $time $nick $reason $hand $host $chan $chan1 $type
}

################################### n #################################

proc n:process {bnick nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $bnick]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
set getreason [channel get $chan n-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.n.5)
}
if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason" 
}
set getbantime [channel get $chan n-bantime]
if {$getbantime == "0"} { set getbantime $black(ntime) }

if {[isbotnick $bnick]} {
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($bnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 n.1 none
return 0
}
if {($bnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 n.2 none
return 0
}
}
if {($bnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 n.3 none
return 0
}
if {($bnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 n.4 none
return 0
}

if {[onchan $bnick $chan]} {
set mask "$bnick*!*@*"
} else {
blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan "$bnick"
return 0
}
blacktools:banner:3 $mask $hand $chan $reason $getbantime n($chan)
}


proc npublic {nick host hand chan arg} {
global botnick black
set bnick [lindex [split $arg] 0]
set type 0
set handle [nick2hand $bnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bnick] && [matchattr $hand nm|- $chan]} {
set chan "$bnick"
set bnick [lindex [split $arg] 1]
}
n:process $bnick $nick $hand $host $chan $chan1 $type
}

################################## id #################################

proc idpublic {nick host hand chan arg} {
global botnick black
set idnick [lindex [split $arg] 0]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $idnick]
set type 0
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $idnick] && [matchattr $hand nm|- $chan]} {
set chan "$idnick"
set idnick [lindex [split $arg] 1]
}
id:process $idnick $nick $hand $host $chan $chan1 $type
}

proc id:process {idnick nick hand host chan chan1 type} {
global botnick black
set handle [nick2hand $idnick]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set uhost [getchanhost $idnick $chan]
set ident "[string trimleft [string tolower [lindex [split $uhost "@"] 0]] "~"]"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
set getreason [channel get $chan id-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.id.5)
}

if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason"
}

set getbantime [channel get $chan id-bantime]
if {$getbantime == "0"} { set getbantime $black(idtime) }

if {[isbotnick $idnick]} {
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($idnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 id.1 none
return 0
}
if {($idnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 id.2 none
return 0
}
}
if {($idnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 id.3 none
return 0
}
if {($idnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 id.4 none
return 0
}

if {[onchan $idnick $chan]} {
    		set mask "*!*$ident@*"
	} else { blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan "$idnick"
return 0
}
blacktools:banner:3 $mask $hand $chan $getreason $getbantime id($chan)
}


############################### black #################################

proc black:process {blnick nick mask hand host chan chan1 reason type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $blnick]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

set list [userlist $black(exceptflags) $chan]
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$reason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set reason1 "BlackListed: $black(say.$getlang.black.5)"
 } else { set reason1 "BlackListed: $reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}


if {[isbotnick $blnick]} {
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[onchan $blnick $chan]} {
set mask *!*@[lindex [split [getchanhost $blnick $chan] "@"] 1] 
}

if {[matchattr $hand nm|- $chan]} {
if {($blnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 black.1 none
return 0
}
if {($blnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 black.2 none
return 0
}
}
if {($blnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 black.3 none
return 0
}
if {($blnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 black.4 none
return 0
}
 

blacktools:banner:3 $mask $hand $chan $reason 0 Black($chan)
}


proc blackpublic {nick host hand chan arg} {
global botnick black
set blnick [lindex [split $arg] 0]
set mask [lindex [split $arg] 0]
set type 0
set reason [join [lrange [split $arg] 1 end]]
set handle [nick2hand $blnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $blnick] && [matchattr $hand nm|- $chan]} {
set chan "$blnick"
set blnick [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 2 end]]
}
black:process $blnick $nick $mask $hand $host $chan $chan1 $reason $type
}


################################ w ####################################

proc wpublic {nick host hand chan arg} {
global botnick black
set wnick [lindex [split $arg] 0]
set type 0
set handle [nick2hand $wnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $wnick] && [matchattr $hand nm|- $chan]} {
set chan "$wnick"
set wnick [lindex [split $arg] 1]
}
w:process $wnick $nick $hand $host $chan $chan1 $type
}

proc w:process {wnick nick hand host chan chan1 type} {
global botnick black
set handle [nick2hand $wnick]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}


if {[isbotnick $wnick]} {
return 0
}
if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
set getreason [channel get $chan w-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.w.5)
}

if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason"
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($wnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 w.1 none
return 0
}
if {($wnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 w.2 none
return 0
}
}
if {($wnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 w.3 none
return 0
}
if {($wnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 w.4 none
return 0
}

set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA w($chan)]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA w($chan) $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $wnick :$reason"
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
puthelp "PRIVMSG $wnick :$black(say.$getlang.w.6)"
}

############################### spam ##################################

proc spam:process {spammer mask nick hand host chan chan1 type} {
global botnick black
set handle [nick2hand $spammer]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
set getreason [channel get $chan spam-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.spam.5)
}
if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason" 
}
set getbantime [channel get $chan spam-bantime]
if {$getbantime == "0"} { set getbantime $black(spamtime) }

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[isbotnick $spammer]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[onchan $spammer $chan]} {
set mask *!*@[lindex [split [getchanhost $spammer $chan] "@"] 1] 
}

if {[matchattr $hand nm|- $chan]} {
if {($spammer == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 spam.1 none
return 0
}
if {($spammer == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 spam.2 none
return 0
}
}
if {($spammer == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 spam.3 none
return 0
}
if {($spammer == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 spam.4 none
return 0
}

blacktools:banner:3 $mask $hand $chan $reason $getbantime spam($chan)
}


proc spampublic {nick host hand chan arg} {
global botnick black
set spammer [lindex [split $arg] 0]
set chan1 "$chan"
set type 0
set mask [lindex [split $arg] 0]
set handle [nick2hand $spammer]
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $spammer] && [matchattr $hand nm|- $chan]} {
set chan "$spammer"
set spammer [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
}
spam:process $spammer $mask $nick $hand $host $chan $chan1 $type
}



################################### k #################################

proc k:process {knick nick hand host reason chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $knick]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[isbotnick $knick]} {
return 0
}


if {[matchattr $handle $black(exceptflags) $chan] && ($black(kaccess) == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {$reason == ""} {

set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set reason1 "$black(say.$getlang.k.5)"
 } else { set reason1 "$reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}


if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($knick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 k.1 none
return 0
}
if {($knick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 k.2 none
return 0
}
}
if {($knick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 k.3 none
return 0
}
if {($knick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 k.4 none
return 0
}

if {![onchan $knick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan "$knick"
return 0
}
set getcount [channel get $chan kickcount]
set kcount [expr $getcount +1]
channel set $chan kickcount $kcount
set countz [getuser $hand XTRA k($chan)]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA k($chan) $counts
if {[channel get $chan showcount]} {
set reason "$reason - $kcount -" 
} else {
set reason "$reason" 
}
putquick "KICK $chan $knick :$reason"
}


proc kpublic {nick host hand chan arg} {
global botnick black
set knick [lindex [split $arg] 0]
set type 0
set reason [join [lrange [split $arg] 1 end]]
set handle [nick2hand $knick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $knick] && [matchattr $hand nm|- $chan]} {
set chan "$knick"
set knick [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 2 end]]
}
k:process $knick $nick $hand $host $reason $chan $chan1 $type
}





################################### gag ###############################

proc gag:process {gagger nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $gagger]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($gagger == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 gag.1 none
return 0
}
if {($gagger == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 gag.2 none
return 0
}
}
if {($gagger == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 gag.3 none
return 0
}
if {($gagger == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 gag.4 none
return 0
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {[isbotnick $gagger]} {
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {[onchan $gagger $chan]} {
    		set mask *!*@[lindex [split [getchanhost $gagger $chan] "@"] 1] 
} else { blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan "$gagger"
return 0
}
putquick "MODE $chan +b $mask"
blacktools:tell $gagger $host $hand $chan $chan1 gag.5 "$gagger"
}



proc gagpublic {nick host hand chan arg} {
global black
set gagger [lindex [split $arg] 0]
set type 0
set handle [nick2hand $gagger]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $gagger] && [matchattr $hand nm|- $chan]} {
set chan "$gagger"
set gagger [lindex [split $arg] 1]
}
gag:process $gagger $nick $hand $host $chan $chan1 $type
}



################################## bw #################################

proc bw:process {abuser mask nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $abuser]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
set getreason [channel get $chan bw-reason]
if {$getreason == ""} { 
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getreason $black(say.$getlang.bw.5)
}
if {[channel get $chan showhandle]} {
set reason "($hand) $getreason"
} else { set reason "$getreason" 
}
set getbantime [channel get $chan bw-bantime]
if {$getbantime == "0"} { set getbantime $black(bwtime) }
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[isbotnick $abuser]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[onchan $abuser $chan]} {
set mask *!*@[lindex [split [getchanhost $abuser $chan] "@"] 1] 
}

if {[matchattr $hand nm|- $chan]} {
if {($abuser == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 bw.1 none
return 0
}
if {($abuser == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 bw.2 none
return 0
}
}
if {($abuser == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 bw.3 none
return 0
}
if {($abuser == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 bw.4 none
return 0
}

blacktools:banner:3 $mask $hand $chan $reason $getbantime bw($chan) 
}


proc bwpublic {nick host hand chan arg} {
global botnick black
set abuser [lindex [split $arg] 0]
set mask [lindex [split $arg] 0]
set type 0
set handle [nick2hand $abuser]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $abuser] && [matchattr $hand nm|- $chan]} {
set chan "$abuser"
set abuser [lindex [split $arg] 1]
set mask [lindex [split $arg] 1]
}
bw:process $abuser $mask $nick $hand $host $chan $chan1 $type
}





################################ ub ###################################

proc ub:process {ban why nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($ban == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 ub.1 none
return 0
}
if {($ban == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 ub.2 none
return 0
}
}
if {($ban == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 ub.3 none
return 0
}
if {($ban == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 ub.4 none
return 0
}

  
if {$ban == "*!*@*"} { 
return 0 
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
    return 0
  }
 if {[ispermban $ban $chan] && [matchattr $hand -|O $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 ub.5 none
return 0
}

if {($why == "global") && [matchattr $hand nm|- $chan]} {

if {[killban $ban] == "0"} {
set notfound 1
}

killban $ban
if {![info exists notfound]} {
blacktools:tell $nick $host $hand $chan $chan1 ub.6 $ban
return 0
} else { blacktools:tell $nick $host $hand $chan $chan1 ub.7 none
return 0
}

}

if {[killchanban $chan $ban] == "0"} {
set notfound 1
}
 
  killchanban $chan $ban
if {[onchan "X" $chan]} {
putquick "PRIVMSG $black(chanserv) :unban $chan $ban"
}
  putquick "MODE $chan -b $ban"
if {![info exists notfound]} {
blacktools:tell $nick $host $hand $chan $chan1 ub.8 $ban
} else { blacktools:tell $nick $host $hand $chan $chan1 ub.9 none 
return 0
}
 if {[channel get $chan chanreport]} {
set backchan [channel get $chan backchan]
if {$backchan == ""} { 
return 0
}
if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
return 0
}
blacktools:tell $nick $host $hand $chan $backchan ub.10 "$hand $ban"
}

}



proc ubpublic {nick host hand chan arg} {
global botnick black
set ban [lindex [split $arg] 0]
set why [lindex [split $arg] 1]
set type 0
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $ban] && [matchattr $hand nm|- $chan]} {
set chan "$ban"
set ban [lindex [split $arg] 1]
}
ub:process $ban $why $nick $hand $host $chan $chan1 $type
}


################################ sb ###################################   

proc sb:process {bhost what nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($bhost == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 sb.1 none
return 0
}
if {($bhost == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 sb.2 none
return 0
}
}
if {($bhost == "") && ($type == "0")} { 
blacktools:tell $nick $host $hand $chan $chan1 sb.3 none
return 0
}
if {($bhost == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 sb.4 none
return 0
}

if {[string match -nocase $what "global"] && [matchattr $hand mn|- $chan]} {
  
foreach ban [banlist] {

 set expire [clock format [lindex $ban 2] -format %D-%H:%M:%S]
 set created [clock format [lindex $ban 3] -format %D-%H:%M:%S]
 set fban [lindex $ban 0]
 set freason [lindex $ban 1]
 set fbywho [lindex $ban 5]

if {[string match $bhost [string tolower [lindex $ban 0]]]} {
set foundban 1
if {[lindex $ban 2] == 0} {
if {[isbansticky [lindex $ban 0]]} {
blacktools:tell $nick $host $hand $chan $chan1 sb.5 "$fban $fbywho $created 0 $freason"
 } else {
blacktools:tell $nick $host $hand $chan $chan1 sb.6 "$fban $fbywho $created 0 $freason"

}

} else { 
if {[isbansticky [lindex $ban 0]]} { 
blacktools:tell $nick $host $hand $chan $chan1 sb.7 "$fban $fbywho $created $expire $freason"         

} else {
blacktools:tell $nick $host $hand $chan $chan1 sb.8 "$fban $fbywho $created $expire $freason"
          
}
}

}
}
if {![info exists foundban]} {
blacktools:tell $nick $host $hand $chan $chan1 sb.13 none
}
return 0
}

  foreach ban [banlist $chan] {

  set expire [clock format [lindex $ban 2] -format %D-%H:%M:%S]
 set created [clock format [lindex $ban 3] -format %D-%H:%M:%S]
 set fban [lindex $ban 0]
 set freason [lindex $ban 1]
 set fbywho [lindex $ban 5]
if {[string match $bhost [string tolower [lindex $ban 0]]]} {

set foundban 1

if {[lindex $ban 2] == 0} {
if {[isbansticky [lindex $ban 0] $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 sb.9 "$fban $fbywho $created $expire $freason"
} else {
blacktools:tell $nick $host $hand $chan $chan1 sb.10 "$fban $fbywho $created 0 $freason"
}

} else { 
if {[isbansticky [lindex $ban 0] $chan]} {          
blacktools:tell $nick $host $hand $chan $chan1 sb.11 "$fban $fbywho $created $expire $freason"

} else {
blacktools:tell $nick $host $hand $chan $chan1 sb.12 "$fban $fbywho $created $expire $freason"
          
}
}

}
}
if {![info exists foundban]} {
blacktools:tell $nick $host $hand $chan $chan1 sb.13 none
return 0
}
}



proc sbpublic {nick host hand chan arg} {
global botnick black
set bhost [string tolower [lindex [split $arg] 0]]
set what [lindex [split $arg] 1]
set chan1 "$chan"
set type 0
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bhost] && [matchattr $hand nm|- $chan]} {
set chan "$bhost"
set bhost [string tolower [lindex [split $arg] 1]]
set what [lindex [split $arg] 2]
}
sb:process $bhost $what $nick $hand $host $chan $chan1 $type
}




################################# d ###################################


proc d:process {dnick mask days reason nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $dnick]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
set list [userlist $black(exceptflags) $chan]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}


if {[matchattr $hand nm|- $chan]} {
if {($dnick == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 d.1 none
return 0
}
if {($dnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 d.2 none
return 0
}
}
if {($dnick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 d.3 none
return 0
}
if {($dnick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 d.4 none
return 0
}

foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match -nocase $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}

if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {$reason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set reason1 $black(say.$getlang.d.5)
 } else { set reason1 "$reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}


if {[isbotnick $dnick]} {
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {$mask == "*!*@*"} {
 return 0
}

if {[onchan $dnick $chan]} {
    		set mask *!*@[lindex [split [getchanhost $dnick $chan] "@"] 1] 
}

blacktools:banner:3 $mask $hand $chan $reason [expr $days * 1440] d($chan)
}


proc dpublic {nick host hand chan arg} {
global botnick black
set days [lindex [split $arg] 0]
set dnick [lindex [split $arg] 1]
set type 0
set mask [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 2 end]]
set handle [nick2hand $dnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $days] && [matchattr $hand nm|- $chan]} {
set chan "$days"
set days [lindex [split $arg] 1]
set mask [lindex [split $arg] 2]
set dnick [lindex [split $arg] 2]
set reason [join [lrange [split $arg] 3 end]]
if {![regexp {^[0-9]} $days]} {
set days 1
set mask [lindex [split $arg] 1]
set dnick [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 2 end]]
} 
}
if {![regexp {^[0-9]} $days]} {
set days 1
set mask [lindex [split $arg] 0]
set dnick [lindex [split $arg] 0]
set reason [join [lrange [split $arg] 1 end]]
}
d:process $dnick $mask $days $reason $nick $hand $host $chan $chan1 $type
}


############################### stick #################################

proc stick:process {snick mask time reason nick hand host chan chan1 type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $snick]
set list [userlist $black(exceptflags) $chan]
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}


if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}
if {[matchattr $handle nm|AMOVS $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {$reason == ""} {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set reason1 $black(say.$getlang.stick.5)
 } else { set reason1 "$reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}

if {[isbotnick $snick]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {$mask == "*!*@*"} {
 return 0
}
if {[onchan $snick $chan]} {
set mask *!*@[lindex [split [getchanhost $snick $chan] "@"] 1] 
}

if {[matchattr $hand nm|- $chan]} {
if {($snick == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 stick.1 none
return 0
}
if {($snick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 stick.2 none
return 0
}
}
if {($snick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 stick.3 none
return 0
}
if {($snick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 stick.4 none
return 0
}
blacktools:banner:4 $mask $hand $chan $reason $time stick($chan)
}


proc stickpublic {nick host hand chan arg} {
global botnick black
set snick [lindex [split $arg] 0]
set mask [lindex [split $arg] 0]
set chan1 "$chan"
set type 0
set time [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 2 end]]
set handle [nick2hand $snick]
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $snick] && [matchattr $hand nm|- $chan]} {
set chan "$snick"
set time [lindex [split $arg] 2]
set mask [lindex [split $arg] 1]
set snick [lindex [split $arg] 1]
set reason [join [lrange [split $arg] 3 end]]
if {![regexp {^[0-9]} $time]} {
set time "$black(dfstickbantime)"
set reason [join [lrange [split $arg] 2 end]]
}
}
if {![regexp {^[0-9]} $time]} {
set time "$black(dfstickbantime)"
set reason [join [lrange [split $arg] 1 end]]
}
stick:process $snick $mask $time $reason $nick $hand $host $chan $chan1 $type
}





################################### t #################################


proc tpublic {nick host hand chan arg} {
global black
set topics [join [lrange [split $arg] 0 end]]
set c [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set topics [join [lrange [split $arg] 1 end]]
}
t:process $nick $host $hand $chan $chan1 $topics $type
}

proc t:process {nick host hand chan chan1 topics type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($topics == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 t.1 none
return 0
}
if {($topics == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 t.2 none
return 0
}
}
if {($topics == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 t.3 none
return 0
}
if {($topics == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 t.4 none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0

}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {[channel get $chan showhandle]} {
set topics "($hand) $topics"
} else { set topics "$topics" 
}
putquick "TOPIC $chan :$topics"
}

############################## status #################################


proc statuspublic {nick host hand chan arg} {
global botnick server uptime {server-online}
set chan1 "$chan"
regsub -all " " [channels] ", " chans
catch {exec uptime} shelluptime
set up [duration [expr [unixtime] - $uptime]]
set on [duration [expr [unixtime] - ${server-online}]]
blacktools:tell $nick $host $hand $chan $chan1 status.1 $up
blacktools:tell $nick $host $hand $chan $chan1 status.2 $server
blacktools:tell $nick $host $hand $chan $chan1 status.3 $on
blacktools:tell $nick $host $hand $chan $chan1 status.4 $chans
blacktools:tell $nick $host $hand $chan $chan1 status.5 $shelluptime
}

############################## uptime #################################

proc uptimepublic {nick host hand chan arg} {
global botnick uptime {server-online} server
set chan1 "$chan"
set up [duration [expr [unixtime] - $uptime]]
set on [duration [expr [unixtime] - ${server-online}]]
blacktools:tell $nick $host $hand $chan $chan1 status.1 $up
blacktools:tell $nick $host $hand $chan $chan1 status.2 $server
blacktools:tell $nick $host $hand $chan $chan1 status.3 $on
}

################################# i ###################################

proc ipublic {nick host hand chan arg} {
global botnick black
set type 0
set chan1 "$chan"
set inick [lrange [split $arg] 0 end]
set c [lindex [split $arg] 0]
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set inick [join [lrange [split $arg] 1 end]]
}
i:process $nick $host $hand $chan $chan1 $inick $type
}

proc i:process {nick host hand chan chan1 inick type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($inick == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 i.3 none
return 0
}
if {($inick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 i.4 none
return 0
}
}
if {($inick == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 i.5 none
return 0
}
if {($inick == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 i.6 none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

set replace(%nick%) $nick
set replace(%chan%) $chan
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getmsg $black(say.$getlang.i.7)

if {[info exists black(say.$getlang.i.7)]} {
set imessage [string map [array get replace] $getmsg]
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
foreach in $inick {
if {[onchan $in $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 i.1 $in
return 0
}

set countz [getuser $hand XTRA i($chan)]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA i($chan) $counts
putquick "INVITE $in $chan"
putquick "PRIVMSG $in :$imessage"
blacktools:tell $nick $host $hand $chan $chan1 i.2 $in
}
}

############################### addinfo ###############################


proc addinfopublic {nick host hand chan arg} {
global botnick black
set info [join [lrange [split $arg] 0 end]]
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$info == ""} { 
blacktools:tell $nick $host $hand $chan $chan1 addinfo.1 none
return 0
}
addinfo:process $nick $host $hand $chan $chan1 $info
}

proc addinfo:process {nick host hand chan chan1 info} {
global botnick black
if {[string match -nocase "$info" "off"]} {
set infos ""
setuser $hand info $infos
blacktools:tell $nick $host $hand $chan $chan1 addinfo.3 none
return 0
}
setuser $hand info $info
blacktools:tell $nick $host $hand $chan $chan1 addinfo.4 $info 
}

############################### purge ###############################

proc purgepublic {nick host hand chan arg} {
global botnick black
set reason [join [lrange [split $arg] 0 end]]
set chan1 "$chan"
if {$reason == ""} {
blacktools:tell $nick $host $hand $chan $chan1 purge.1 none
return 0
}
purge:process $nick $host $hand $chan $chan1 $reason
}

proc purge:process {nick host hand chan chan1 reason} {
channel remove $chan
delchan:stats $chan $hand $host
blacktools:tell $nick $host $hand $chan $chan1 purge.2 none
putquick "PART $chan :PURGED by $hand :$reason"
}


################################### v #################################


proc vpublic {nick host hand chan arg} {
global botnick black
set c [lindex [split $arg] 0]
set arg [split $arg]
set nick [split $nick]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set arg [lrange $arg 1 end]
}
v:process $nick $host $hand $chan $chan1 $arg
}

proc v:process {nick host hand chan chan1 arg} {
global botnick black
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![botisop $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$arg == ""} {
set arg $nick
}

foreach voicenick $arg {
if {[isbotnick $voicenick]} { return 0 }
if {[isvoice $voicenick $chan]} {putquick "MODE $chan -v $voicenick"} else {putquick "MODE $chan +v $voicenick"}
}

}

################################## o ##################################

proc opublic {nick host hand chan arg} {
global botnick black
set c [lindex [split $arg] 0]
set arg [split $arg]
set nick [split $nick]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set arg [lrange $arg 1 end]
}
o:process $nick $host $hand $chan $chan1 $arg
}


proc o:process {nick host hand chan chan1 arg} {
global botnick black
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![botisop $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
 return 0
}
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {$arg == ""} {
set arg $nick
}


foreach opnick $arg {
if {[isbotnick $opnick]} { return 0 }
if {[isop $opnick $chan]} {putquick "MODE $chan -o $opnick"} else {putquick "MODE $chan +o $opnick"}
}

}


################################# l ###################################

proc lpublic {nick host hand chan arg} {
global black
set times [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $times] && [matchattr $hand nm|- $chan]} {
set chan "$times"
set times [lindex [split $arg] 1]
}
l:process $nick $host $hand $chan $chan1 $times $type
}

proc l:process {nick host hand chan chan1 time type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
}         
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($time == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 l.1 none
return 0
}
if {($time == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 l.2 none
return 0
}
}
if {($time == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 l.3 none
return 0
}
if {($time == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 l.4 none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {$time >= 300} {
blacktools:tell $nick $host $hand $chan $chan1 l.5 none
return 0
}
putserv "MODE $chan +$black(lmode)" ;utimer $time [list putquick "MODE $chan -$black(lmode)"]
blacktools:tell $nick $host $hand $chan $chan1 l.6 "$black(lmode) $time"
}

proc chatpublic {nick host hand chan arg} {
global botnick
*ctcp:CHAT $nick $host $hand $botnick CHAT $arg
blacktools:tell $nick $host $hand $chan $chan1 chat.1 none
} 

################################ ul ###################################

proc ul:process {nick host hand chan chan1} {
global black botnick
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
putquick "MODE $chan -$black(ulmodes)"
blacktools:tell $nick $host $hand $chan $chan1 ul.1 $black(ulmodes)
}


proc ulpublic {nick host hand chan arg} {
global black
set c [lindex [split $arg] 0]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
ul:process $nick $host $hand $chan $chan1
}

################################ say ##################################


proc saypublic {nick host hand chan arg} {
global black
set text [join [lrange [split $arg] 0 end]]
set c [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set text [join [lrange [split $arg] 1 end]]
}
say:process $nick $host $hand $chan $chan1 $text $type
}

proc say:process {nick host hand chan chan1 text type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($text == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 say.1 none
return 0
}
if {($text == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 say.2 none
return 0
}
}
if {($text == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 say.3 none
return 0
}
if {($text == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 say.4 none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

putquick "PRIVMSG $chan :$text"
}

################################ act ##################################

proc actpublic {nick host hand chan arg} {
global black
set text [join [lrange [split $arg] 0 end]]
set c [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set text [join [lrange [split $arg] 1 end]]
}
act:process $nick $host $hand $chan $chan1 $text $type
}

proc act:process {nick host hand chan chan1 text type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($text == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 act.1 none
return 0
}
if {($text == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 act.2 none
return 0
}
}
if {($text == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 act.3 none
return 0
}
if {($text == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 act.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}
putquick "PRIVMSG $chan :\001ACTION $text\001"
}

############################## broadcast ##############################

proc broadcastpublic {nick host hand chan arg} {
global black
set text [join [lrange [split $arg] 0 end]]
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {$text == ""} { 
blacktools:tell $nick $host $hand $chan $chan1 broadcast.1 none
return 0
}
broadcast:cmd:process $nick $host $hand $chan $chan1 $text
}


proc broadcast:cmd:process {nick host hand chan chan1 text} {
global botnick black
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
foreach c [channels] {
if {![channel get $c silent]} {
putquick "PRIVMSG $c :(BROADCAST) $text"
}
}
}

############################### check #################################

proc checkpublic {nick host hand chan arg} {
 global black
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set checked [lindex [split $arg] 0]
if {$checked == ""} { blacktools:tell $nick $host $hand $chan $chan1 check.1 none
return 0
}
check:process $nick $host $hand $chan $chan1 $checked
}

proc check:process {nick host hand chan chan1 checked} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set handle [nick2hand $checked]
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}


if {[matchattr $handle $black(exceptflags) $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {[isbotnick $checked]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
 if {![onchan $checked $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan $checked
return 0
}
if {[onchan $checked $chan]} {
set mask *!*@[lindex [split [getchanhost $checked $chan] "@"] 1] 
}

set countz [getuser $hand XTRA check($chan)]
if {$countz == ""} { set countz 0 }
set counts [expr $countz + 1]
setuser $hand XTRA check($chan) $counts
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getmsg $black(say.$getlang.check.3)
if {[info exists black(say.$getlang.check.3)]} {
putquick "PRIVMSG $checked :$black(say.$getlang.check.3)"
}

}

############################## version ################################

proc versionpublic {nick host hand chan arg} {
global botnick black
set chan1 "$chan"
version:process $nick $host $hand $chan $chan1
}

proc version:process {nick host hand chan chan1} {
global botnick black
blacktools:tell $nick $host $hand $chan $chan1 version.1 none
}

############################### cycle #################################

proc cycle:process {nick host hand chan chan1 reason} {
global black botnick
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {$reason == ""} { set reason "No Reason" }
putquick "PART $chan :$reason"
utimer 5 [list putquick "JOIN $chan"]
}


proc cyclepublic {nick host hand chan arg} {
global black
set reason [join [lrange [split $arg] 0 end]]
set c [lindex [split $arg] 0]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set reason [join [lrange [split $arg] 1 end]]
}
cycle:process $nick $host $hand $chan $chan1 $reason
}

################################ away #################################

proc awaypublic {nick host hand chan arg} {
global black
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set aw [join [lrange [split $arg] 0 end]]
if {$aw == "" } {blacktools:tell $nick $host $hand $chan $chan1 away.1 none
return 0
}
away:process $nick $host $hand $chan $chan1 $aw
}


proc away:process {nick host hand chan chan1 aw} {
global black botnick wdir
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[string match -nocase "$aw" "off"]} { 
blacktools:tell $nick $host $hand $chan $chan1 away.3 none
putquick "AWAY :" 
set type [open $wdir w]
set none ""
puts $type "$none"
close $type

return 0
} else {
blacktools:tell $nick $host $hand $chan $chan1 away.4 $aw ; putquick "AWAY :$aw"
set type [open $wdir w]
puts $type "$aw"
close $type
}
}

proc setaway {my} {
global wdir
if {[file exists $wdir] == 0} {
set file [open $wdir a]
close $file
}
set aways [open $wdir r]
set away "[gets $aways]"
catch {close $aways}
if {$away == ""} {
 return 0 
} else {
putserv "AWAY :"
putserv "AWAY :$away"
}
}


################################### mode ######################################

proc modepublic {nick host hand chan arg} {
global black
set modes [lindex [split $arg] 0]
set chan1 "$chan"
set type 0
if {[regexp {^[#&]} $modes] && [matchattr $hand nm|- $chan]} {
set chan "$modes"
set modes [lindex [split $arg] 1]
}
mode:process $nick $host $hand $chan $chan1 $modes $type
}

proc mode:process {nick host hand chan chan1 modes type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($modes == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 mode.1 none
return 0
}
if {($modes == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 mode.2 none
return 0
}
}
if {($modes == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 mode.3 none
return 0
}
if {($modes == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 mode.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}

if {![regexp {^[+ -]} $modes]} {
blacktools:tell $nick $host $hand $chan $chan1 mode.5 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 mode.6 $modes
putserv "MODE $chan $modes"
}


################################## myset #############################

proc mysetpublic {nick host hand chan arg} {
global black
set chan1 "$chan"
set flags [lindex [split $arg] 0]
set type [lindex [split $arg] 1]
if {$type == ""} {
blacktools:tell $nick $host $hand $chan $chan1 myset.3 none
return 0
}
myset:process $nick $host $hand $chan $chan1 $flags $type
}


proc myset:process {nick host hand chan chan1 flags typez} {
global black
switch -exact -- [string tolower $flags] {
lang {
setuser $hand XTRA OUTPUT_LANG $typez
blacktools:tell $nick $host $hand $chan $chan1 myset.1 $typez
return 0
}

output {
if {[string match -nocase $typez "notice"]} {
setuser $hand XTRA OUTPUT_TYPE 1
blacktools:tell $nick $host $hand $chan $chan1 myset.2 $typez
return 0
}
if {[string match -nocase $typez "chan"]} {
setuser $hand XTRA OUTPUT_TYPE 0
blacktools:tell $nick $host $hand $chan $chan1 myset.2 $typez
return 0
}
}

}
}


################################# set #################################

proc setpublic {nick host hand chan arg} {
global black
set flags [lindex [split $arg] 0]
set type [join [lrange [split $arg] 1 end]]
set chan1 "$chan"
set type1 0
if {[regexp {^[#&]} $flags] && [matchattr $hand nm|- $chan]} {
set chan "$flags"
set flags [lindex [split $arg] 1]
set type [join [lrange [split $arg] 2 end]]
}
set:process $nick $host $hand $chan $chan1 $flags $type $type1
}

proc set:process {nick host hand chan chan1 flags type type1} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($flags == "")  && ($type1 == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 set.1 none
return 0
}
if {($flags == "") && ($type1 == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 set.2 none
return 0
}
}
if {($flags == "") && ($type1 == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 set.3 none
return 0
}
if {($flags == "") && ($type1 == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 set.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


 if {$type == ""} {
set why [catch {channel set $chan $flags} error]
if {$why == "1"} { blacktools:tell $nick $host $hand $chan $chan1 set.5 $flags
return 0
} else {
channel set $chan $flags ; blacktools:tell $nick $host $hand $chan $chan1 set.6 $flags
}
 
} else {
set why [catch {channel set $chan $flags $type} error]
if {!([matchattr $hand mn|- $chan]) && [string match -nocase "backchan" $flags]} {
return 0
}

if {$why == "1"} { blacktools:tell $nick $host $hand $chan $chan1 set.7 "$flags $type"
return 0
} else {
 channel set $chan $flags $type ; blacktools:tell $nick $host $hand $chan $chan1 set.8 "$flags $type" 
}
}
}



proc ignorepublic {nick host hand chan arg} {
global black
set chan1 "$chan"
set what [lindex [split $arg] 0]
set mask [lindex [split $arg] 1]
set time [lindex [split $arg] 2]
set reason [join [lrange [split $arg] 3 end]]
if {$what == ""} { blacktools:tell $nick $host $hand $chan $chan1 ignore.1 none
return 0
}
ignore:process $nick $host $hand $chan $chan1 $what $mask $time $reason
}


proc ignore:process {nick host hand chan chan1 what mask time reason} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
switch -exact -- [string tolower $what] {

list {

if {[llength [ignorelist]] == "0"} { blacktools:tell $nick $host $hand $chan $chan1 ignore.3 none
return 0
}
foreach ig [ignorelist] {
set hostig [lindex $ig 0]
set byig [lindex $ig 4]
set time [lindex $ig 2]
set reasig [lindex $ig 1]
if {$time != "0"} {
set bytime [clock format $time -format %D-%H:%M:%S]
} else { set bytime "-"}
blacktools:tell $nick $host $hand $chan $chan1 ignore.4 "$hostig $byig $bytime $reasig" 
}
}

add {

if {[isignore $mask]} {
blacktools:tell $nick $host $hand $chan $chan1 ignore.5 "$mask"
return 0
}

if {![regexp {^[0-9]} $time]} {
set time "60"
}
if {$reason == ""} { set reason "No Reason" }
newignore $mask $hand $reason $time
blacktools:tell $nick $host $hand $chan $chan1 ignore.6 "$mask $time $reason"
}



delete {
if {$mask == ""} { blacktools:tell $nick $host $hand $chan $chan1 ignore.7 none
return 0
}

if {[isignore $mask]} {
killignore $mask
} else { blacktools:tell $nick $host $hand $chan $chan1 ignore.8 "$mask"
return 0
} 
blacktools:tell $nick $host $hand $chan $chan1 ignore.9 "$mask"
}

}
}


################################# show ################################

proc showpublic {nick host hand chan arg} {
global black
set wich [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $wich] && [matchattr $hand nm|- $chan]} {
set chan "$wich"
set wich [lindex [split $arg] 1]
}
show:process $nick $host $hand $chan $chan1 $wich $type
}

proc show:process {nick host hand chan chan1 wich type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($wich == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 show.1 none
return 0
}
if {($wich == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 show.2 none
return 0
}
}
if {($wich == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 show.3 none
return 0
}
if {($wich == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 show.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


set why [catch {channel get $chan $wich} error]
if {$why == "1"} { blacktools:tell $nick $host $hand $chan $chan1 show.5 $wich
return 0
} else {
set replyinfo [channel get $chan $wich]

if {($replyinfo == "") || ($replyinfo == "0")} {
switch -exact -- [string tolower $wich] {

antipub-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antipub.1)
}

antilongtextmax {
set replyinfo [channel get $chan antilongtextmax]
if {$replyinfo == "0"} {
set replyinfo "$black(longchar)"
}
}


joinflood {
set replyinfo [channel get $chan joinflood]
if {$replyinfo == ""} {
set replyinfo "4 5"
}
}

chanflood {
set replyinfo [channel get $chan chanflood]
if {$replyinfo == ""} {
set replyinfo "4 5"
}
}

idleopmax {
set replyinfo [channel get $chan idleopmax]
if {$replyinfo == "0"} {
set replyinfo "$black(idleopmax)"
}
}

idlevoicemax {
set replyinfo [channel get $chan idlevoicemax]
if {$replyinfo == "0"} {
set replyinfo "$black(idlevoicemax)"
}
}


private-bantime {
set replyinfo "$black(privatebantime)"
}

private-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.private.12)
}

antipub-bantime {
set replyinfo "$black(antipubbantime)"
}

antinotice-bantime {
set replyinfo "$black(antinoticebantime)"
}

antinotice-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antinotice.1)
}

antictcp-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antictcp.1)
}

antictcp-bantime {
set replyinfo "$black(antictcpbantime)"
}

antibadword-bantime {
set replyinfo "$black(antibadwordbantime)"
}

antibadword-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antibadword.1)
}

antilongtext-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antilongtext.1)
}

antilongtext-bantime {
set replyinfo "$black(longbantime)"
}

antibadquitpart-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antibadquitpart.1)
}

antibadquitpart-bantime {
set replyinfo "$black(badquitparttime)"
}

antijoinpart-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antijoinpart.1)
}

antijoinpart-bantime {
set replyinfo "$black(joinpartbantime)"
}

antispam-bantime {
set replyinfo "$black(spamban)"
}

antispam-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antispam.1)
}

antirepeat-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antirepeat.1)
}

antirepeat-setting {
set replyinfo "$black(repeats)"
}

antirepeat-bantime {
set replyinfo "$black(antirepeatbantime)"
}

anticolor-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.anticolor.1)
}

anticolor-bantime {
set replyinfo "$black(anticolorbantime)"
}

antibold-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antibold.1)
}

antibold-bantime {
set replyinfo "$black(antiboldbantime)"
}

antiunderline-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antiunderline.1)
}

antiunderline-bantime {
set replyinfo "$black(antiunderlinebantime)"
}

anticaps-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.anticaps.1)
}

anticaps-bantime {
set replyinfo "$black(anticapsbantime)"
}

badfullname-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.badfullname.1)
}

badfullname-bantime {
set replyinfo "$black(badfbantime)"
}

badnick-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.badnick.1)
}

badnick-bantime {
set replyinfo "$black(badnickbantime)"
}

badident-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.badident.1)
}

badident-bantime {
set replyinfo "$black(badidentbantime)"
}

antichanflood-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.antichanflood.1)
}

antichanflood-bantime {
set replyinfo "$black(antifloodchanbantime)"
}

badchan-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.badchan.15)
}

badchan-bantime {
set replyinfo "$black(badcbantime)"
}

count-message {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.count.11)
}


dr-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.dr.5)
}

dr-bantime {
set replyinfo "$black(drtime)"
}

bot-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.bot.5)
}

bot-bantime {
set replyinfo "$black(bottime)"
}

n-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.n.5)
}

n-bantime {
set replyinfo "$black(ntime)"
}

id-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.id.5)
}

id-bantime {
set replyinfo "$black(idtime)"
}

w-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.w.5)

}

spam-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.spam.5)
}

spam-bantime {
set replyinfo "$black(spamtime)"
}

bw-reason {
set getlang [string tolower [channel get $chan lang]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set replyinfo $black(say.$getlang.bw.5)
}

bw-bantime {
set replyinfo "$black(bwtime)"
}

}
}
blacktools:tell $nick $host $hand $chan $chan1 show.6 "$wich $replyinfo"
}
}


############################## silence ################################

proc silencepublic {nick host hand chan arg} {
global black
set value [lindex [split $arg] 0]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set chan1 "$chan"
if {$value == ""} { blacktools:tell $nick $host $hand $chan $chan1 silence.1 none
return 0
}
silence:process $nick $host $hand $chan $chan1 $value
}

proc silence:process {nick host hand chan chan1 value} {
global botnick black
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|on|off)} $value tmp silents]) && (![regexp -nocase -- {\S#} $value])} {
 switch $silents {
on { blacktools:tell $nick $host $hand $chan $chan1 silence.3 none ; putquick "SILENCE +*!*@*"             
}
off { blacktools:tell $nick $host $hand $chan $chan1 silence.4 none ; putquick "SILENCE -*!*@*"            
}
}
}
}

############################## msg ####################################

proc msgpublic {nick host hand chan arg} {
global black
set nicks [lindex [split $arg] 0]
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set msg [join [lrange [split $arg] 1 end]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$nicks == ""} {blacktools:tell $nick $host $hand $chan $chan1 msg.1 none
return 0
}
if {[isbotnick $nicks]} { 
return 0
}
putquick "PRIVMSG $nicks :$msg"
}


############################### reset #################################

proc resetpublic {nick host hand chan arg} {
global black
set dece [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $dece] && [matchattr $hand nm|- $chan]} {
set chan "$dece"
set dece [lindex [split $arg] 1]
}
reset:process $nick $host $hand $chan $chan1 $dece $type
}



proc reset:process {nick host hand chan chan1 dece type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($dece == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 reset.1 none
return 0
}
if {($dece == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 reset.2 none
return 0
}
}
if {($dece == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 reset.3 none
return 0
}
if {($dece == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 reset.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {[string match -nocase "all" "$dece"]} {
set emptyflag "antipub-reason antinotice-reason antictcp-reason antibadword-reason antilongtext-reason antijoinpart-reason antirepeat-reason antirepeat-setting antispam-reason anticolor-reason antibold-reason antiunderline-reason anticaps-reason badfullname-reason badnick-reason badident-reason antichanflood-reason chanflood joinflood private-reason dr-reason n-reason id-reason spam-reason w-reason bw-reason bot-reason badchan-reason count-message"
foreach eflag $emptyflag {
channel set $chan $eflag ""
}
set zeroflag "antinotice-bantime antipub-bantime antictcp-bantime antibadword-bantime antilongtext-bantime antijoinpart-bantime antispam-bantime idleopmax idlevoicemax antilongtextmax antirepeat-bantime anticolor-bantime antibold-bantime antiunderline-bantime anticaps-bantime badfullname-bantime badnick-bantime badident-bantime antichanflood-bantime private-bantime  dr-bantime n-bantime id-bantime spam-bantime bw-bantime bot-bantime kickcount"
foreach oflag $zeroflag {
channel set $chan $oflag 0
}
blacktools:tell $nick $host $hand $chan $chan1 reset.5 none
return 0
}
set why [catch {channel set $chan $dece ""} error]
if {$why == "1"} { blacktools:tell $nick $host $hand $chan $chan1 reset.6 $dece
} else {
channel set $chan $dece ""
blacktools:tell $nick $host $hand $chan $chan1 reset.7 $dece
}
}


################################### banlist ###################################

proc banlistpublic {nick host hand chan arg} {
global botnick black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
banlist:process $nick $host $hand $chan $chan1 $user $type
}


proc banlist:process {nick host hand chan chan1 user type} {
global botnick black
set i 0
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.1 none
blacktools:tell $nick $host $hand $chan $chan1 banlist.2 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.3 none
blacktools:tell $nick $host $hand $chan $chan1 banlist.4 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.5 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.6 none
return 0
}

if {[matchattr $hand nm|- $chan] && [string match -nocase "global" $user]} {

foreach ban [banlist] {

set i [expr $i +1]
set expire [clock format [lindex $ban 2] -format %D-%H:%M:%S]
set create [clock format [lindex $ban 3] -format %D-%H:%M:%S]
set fban [lindex $ban 0]
set freason [lindex $ban 1]
set fbywho [lindex $ban 5]

if {[lindex $ban 2] == 0} {
set expire "Permanent"
}

blacktools:tell $nick $host $hand $chan $chan1 banlist.9 none
blacktools:tell $nick $host $hand $chan $chan1 banlist.10 "$fban $fbywho $create $expire $freason"
set foundban 1
}

if {![info exists foundban]} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.7 none
} else { blacktools:tell $nick $host $hand $chan $chan1 banlist.8 none }
return 0
}

if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}

if {![matchattr $user nm|OASMN $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none 
return 0
}

foreach ban [banlist $chan] {
set own [lindex $ban 5]
if {[string match -nocase $own $user]} {
set i [expr $i +1]
set expire [clock format [lindex $ban 2] -format %D-%H:%M:%S]
set create [clock format [lindex $ban 3] -format %D-%H:%M:%S]
set fban [lindex $ban 0]
set freason [lindex $ban 1]

if {[lindex $ban 2] == 0} {
set expire "Permanent"
}
blacktools:tell $nick $host $hand $chan $chan1 banlist.11 $user
blacktools:tell $nick $host $hand $chan $chan1 banlist.12 "$fban $create $expire $freason"
set foundban 1
}
}

if {![info exists foundban]} {
blacktools:tell $nick $host $hand $chan $chan1 banlist.11 $user
blacktools:tell $nick $host $hand $chan $chan1 banlist.7 $user
} else { 
blacktools:tell $nick $host $hand $chan $chan1 banlist.8 $user }
}


############################## rehash #################################

proc rehashme {nick host hand arg} {
global black
blacktools:tell:prv $nick $host $hand rehash.1 none
 rehash
}

############################## VERSION ################################

proc blackreply {nick host hand dest key text} {
global ctcp-version
set {ctcp-version} "1Using 4BlackTools 2.3 1by 12BLaCkShaDoW"
}


############################## restart ################################

proc restartme {nick host hand arg} {
global black
blacktools:tell:prv $nick $host $hand restart.1 none
utimer 3 [list restart ]
}

############################### save #################################

proc saveme {nick host hand arg} {
global black
blacktools:tell:prv $nick $host $hand save.1 none
 save
}

############################### jump #################################

proc jumpme {nick host hand arg} {
global black
blacktools:tell:prv $nick $host $hand jump.1 none
 utimer 3 [list jump]
}

############################### die ###################################

proc dieme {nick host hand arg} {
global black
blacktools:tell:prv $nick $host $hand die.1 none
utimer 3 [list die "byeeee" ]
}


############################## nick ###################################

proc nickpublic {altnick host hand arg} {
global nick black
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
set newnick [lindex [split $arg] 0]
if {$newnick == ""} { blacktools:tell:prv $nick $host $hand nick.2 none
return 0
}
blacktools:tell:prv $nick $host $hand nick.1 "$newnick"
set nick $newnick
}

proc nick:process {who newnick host hand chan} {
global black nick
set chan1 "$chan"
if {$newnick == ""} {
blacktools:tell $who $host $hand $chan $chan1 nick.2 none
return 0
}
blacktools:tell $who $host $hand $chan $chan1 nick.1 none
set nick $newnick
}

############################## addchan ################################

proc addchanpublic {nick host hand arg} {
global black
set chans [lindex [split $arg] 0]
if {$chans == ""} {blacktools:tell:prv $nick $host $hand addchan.1 none
return 0 
}

if {![regexp {^[#&]} $chans]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none
return 0
} 

if {[validchan $chans]} {
blacktools:tell:prv $nick $host $hand addchan.2 "$chans"
return 0
} else {
channel add $chans
addchan:stats $chans $hand $host
blacktools:tell:prv $nick $host $hand addchan.3 "$chans"
}
}

proc addchan:stats {chan hand host} {
global black botnick statsdir
set k 0
set time [unixtime]
set file [open $statsdir "r"]
set addfile "$chan ADDED $hand $host $time 0"
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set k [expr $k +1]
set chanentry [lindex [split $line] 0]
set addtype [lindex [split $line] 1]
if {[string equal -nocase "REMOVED" "$addtype"] && [string match -nocase $chanentry $chan]} { 
if {$line != ""} {
set num [expr $k - 1]
set delete [lreplace $data $num $num]
set files [open $statsdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $statsdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $statsdir "w"]
close $files
}
set file [open $statsdir "a"]
puts $file "$addfile"
close $file
}


proc delchan:stats {chan hand host} {
global black botnick statsdir
set k 0
set time [unixtime]
set file [open $statsdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
set addfile "$chan REMOVED $hand $host $time 0 0 none none"
foreach line $data {
set k [expr $k +1]
set chanentry [lindex [split $line] 0]
set addtype [lindex [split $line] 1]
if {[string equal -nocase "REMOVED" "$addtype"] && [string match -nocase $chanentry $chan]} {
if {$line != ""} {
set num [expr $k - 1]
set delete [lreplace $data $num $num]
set files [open $statsdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
if {[string equal -nocase "ADDED" "$addtype"] && [string match -nocase $chanentry $chan]} {
set added [lindex [split $line] 4]
set bywho [lindex [split $line] 2]
set byhost [lindex [split $line] 3]
set addfile "$chan REMOVED $hand $host $time $added $bywho $byhost"
if {$line != ""} {
set num [expr $k - 1]
set delete [lreplace $data $num $num]
set files [open $statsdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $statsdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $statsdir "w"]
close $files
}
set file [open $statsdir "a"]
puts $file "$addfile"
close $file
}





############################## delchan ################################


proc delchanpublic {nick host hand arg} {
global black
set chans [lindex [split $arg] 0]

if {$chans == ""} {blacktools:tell:prv $nick $host $hand delchan.1 none
return 0 
}
if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none
return 0
 } 

if {![validchan $chans]} { blacktools:tell:prv $nick $host $hand delchan.2 $chans
return 0
}
delchan:stats $chans $hand $host
channel remove $chans
blacktools:tell:prv $nick $host $hand delchan.3 $chans
}


############################## suspend ################################

proc suspendpublic {nick host hand arg} {
global black
set chans [lindex [split $arg] 0]

if {$chans == ""} {blacktools:tell:prv $nick $host $hand suspend.1 none
return 0 
}

if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none 
return 0
 }

if {![validchan $chans]} { blacktools:tell:prv $nick $host $hand suspend.2 $chans
return 0
}

if {[channel get $chans inactive]} {
blacktools:tell:prv $nick $host $hand suspend.3 $chans
return 0
}
channel set $chans +inactive
blacktools:tell:prv $nick $host $hand suspend.4 $chans
}

############################# unsuspend ###############################

proc unsuspendpublic {nick host hand arg} {
global black
set chans [lindex [split $arg] 0]

if {$chans == ""} {blacktools:tell:prv $nick $host $hand unsuspend.1 none
return 0 
}

if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none
return 0
 }
 
if {![validchan $chans]} { blacktools:tell:prv $nick $host $hand unsuspend.2 $chans
return 0
}

if {![channel get $chans inactive]} {
blacktools:tell:prv $nick $host $hand unsuspend.3 $chans
return 0
 }
channel set $chans -inactive
blacktools:tell:prv $nick $host $hand unsuspend.4 $chans
}

################################ op ###################################

proc oppublic {nick host hand arg} {
global black
set chan [lindex [split $arg] 0]
set nicks [lrange [split $arg] 1 end]
if {![validchan $chan]} {
blacktools:tell:prv $nick $host $hand gl.nocmem $chan
}

if {[matchattr $hand -|q $chan]} { blacktools:tell:prv $nick $host $hand gl.suspend none
return 0
}
if {$nicks == ""} { set nicks "$nick" }
if {[matchattr $hand nm|OASM $chan]} {
if {![regexp {^[\\+!#&]} $chan]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none 
return 0
} 
if {![botisop $chan]} { blacktools:tell:prv $nick $host $hand gl.noop none
return 0
}

if {![validchan $chan]} { 
blacktools:tell:prv $nick $host $hand op.1 $chan
return 0
}

foreach nickz $nicks {
if {[isop $nickz $chan]} {
blacktools:tell:prv $nick $host $hand op.2 $nickz
return 0
}
putquick "MODE $chan +o $nickz"

}
}
}

############################### deop ##################################

proc deoppublic {nick host hand arg} {
global black
set chan [lindex [split $arg] 0]
set nicks [lrange [split $arg] 1 end]
if {![validchan $chan]} {
blacktools:tell:prv $nick $host $hand gl.nocmem $chan
}

if {[matchattr $hand -|q $chan]} { blacktools:tell:prv $nick $host $hand gl.suspend none
return 0
}
if {$nicks == ""} { set nicks "$nick" }
if {[matchattr $hand nm|OASM $chan]} {
if {![regexp {^[\\+!#&]} $chan]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none 
return 0
 } 
if {![botisop $chan]} { blacktools:tell:prv $nick $host $hand gl.noop none
return 0
}

if {![validchan $chan]} { blacktools:tell:prv $nick $host $hand deop.1 $chan
return 0
}

foreach nickz $nicks {
if {[onchan $nickz $chan]} {
putquick "MODE $chan -o $nickz"

}
}
}
}

############################### voice #################################

proc voicepublic {nick host hand arg} {
global black
set chan [lindex [split $arg] 0]
set nicks [lrange [split $arg] 1 end]

if {![validchan $chan]} {
blacktools:tell:prv $nick $host $hand gl.nocmem $chan
}

if {[matchattr $hand -|q $chan]} { blacktools:tell:prv $nick $host $hand gl.suspend none
return 0
}
if {$nicks == ""} { set nicks "$nick" }
if {[matchattr $hand nm|OASM $chan]} {
if {![regexp {^[\\+!#&]} $chan]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none 
return 0
 } 
if {![botisop $chan]} { blacktools:tell:prv $nick $host $hand gl.noop none
return 0
}

if {![validchan $chan]} { blacktools:tell:prv $nick $host $hand voice.1 $chan
return 0
}

foreach nickz $nicks {
if {[onchan $nickz $chan]} {
if {[isvoice $nickz $chan]} { 
blacktools:tell:prv $nick $host $hand voice.2 $nickz
return 0
}
putquick "MODE $chan +v $nickz"

}
}
}
}

############################## devoice ################################

proc devoicepublic {nick host hand arg} {
global black
set chan [lindex [split $arg] 0]
set nicks [lrange [split $arg] 1 end]
if {![validchan $chan]} {
blacktools:tell:prv $nick $host $hand gl.nocmem $chan
}

if {[matchattr $hand -|q $chan]} { blacktools:tell:prv $nick $host $hand gl.suspend none
return 0
}
if {$nicks == ""} { set nicks "$nick" }
if {[matchattr $hand nm|OASM $chan]} {
if {![regexp {^[\\+!#&]} $chan]} {
blacktools:tell:prv $nick $host $hand gl.novalidchan none 
return 0
 } 
if {![botisop $chan]} { blacktools:tell:prv $nick $host $hand gl.noop none
return 0
}

if {![validchan $chan]} { blacktools:tell:prv $nick $host $hand devoice.1 $chan
return 0
}

foreach nickz $nicks {
if {[onchan $nickz $chan]} {
putquick "MODE $chan -v $nickz"

}
}
}
}

############################## invite #################################

proc invitepublic {nick host hand arg} {
global black
set chan [lindex [split $arg] 0]
set replace(%chan%) $chan
if {![validchan $chan]} {
blacktools:tell:prv $nick $host $hand gl.nocmem $chan
}
if {[matchattr $hand -|q $chan]} { blacktools:tell:prv $nick $host $hand gl.suspend none"
return 0
}
if {[matchattr $hand nm|OASM $chan]} {
if {$chan == ""} { blacktools:tell:prv $nick $host $hand invite.1 none
return 0 
}
putquick "INVITE $nick $chan"
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set getmsg $black(say.$getlang.invite.2)
if {[info exists black(say.$getlang.invite.2)]} {
set getmsg [string map [array get replace] $getmsg]
putquick "PRIVMSG $nick :$getmsg"
}

}
}



##############################add ######################################

proc add:process {args time level hand host chan chan1 nick type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flags "nm|NMOSAV"
if {[matchattr $hand nm|- $chan]} {
if {($level == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 add.1 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 add.2 none
return 0
}
}
if {($level == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 add.3 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 add.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}



foreach user $args {
if {$user != ""} {
set replace(%user%) $user
if {([string length $user]>=10) && ($black(maxhand) == "1")} {
set user [string range $user 0 8]
}

set uhost [string map [array get replace] $black(hostadd)]
if {[userlist] != ""} {
foreach usr [userlist] {
set hst [getuser $usr hosts]
foreach hhost $hst {
if {[string match -nocase $hhost $uhost] && (![string match -nocase $usr $user])} {
blacktools:tell $nick $host $hand $chan $chan1 add.5 $usr
return 0
}
}
}
}
 
if {[matchattr $hand -|A $chan] && ($level == "manager")} {
blacktools:tell $nick $host $hand $chan $chan1 add.6 none
return 0
}
if {[matchattr $hand -|A $chan] && ($level == "admin")} {
blacktools:tell $nick $host $hand $chan $chan1 add.7 none
return 0
}
if {[matchattr $hand -|M $chan] && ($level == "manager")} {
blacktools:tell $nick $host $hand $chan $chan1 add.8 none
return 0
}

if {([regexp -nocase -- {(#[0-9]+|owner|manager|admin|senior|op|voice|protect)} $level tmp access]) && (![regexp -nocase -- {\S#} $level])} {
    switch $access {
       manager { 
          set flags "-|olM"
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.9 $user
} else {
adduser $user $uhost
chattr $user -|-SOAMV $chan
chattr $user $flags $chan
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.9 $user
}
}
     admin {

      set flags "-|olA"
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.11 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.11 $user
}
}

   senior {
     set flags "-|olS"
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} {
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.12 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.12 $user
}
}


owner {
if {[matchattr $hand n|- $chan]} {
 set flags "m|-"
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.16 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.16 $user
}
}
}

op {
 set flags "-|olO"
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.13 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.13 $user
}
}

protect {
 set flags "-|H"
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qHolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.15 $user
} else {
adduser $user $uhost
chattr $user -|-qolHSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.15 $user
}
}



 voice {
 set flags "-|lV"
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.14 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time

blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.14 $user
}
}
}
}
}
}
}



########################## adduser ################################

proc adduserpublic {nick host hand chan arg} {
global black
set level [lindex [split $arg] 0]
set args [lrange [split $arg] 1 end]
set c [lindex [split $arg] 1]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 2 end]
}
adduser:process $nick $host $hand $chan $chan1 $args $level $type
}


proc adduser:process {nick host hand chan chan1 args level type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
set flags "nm|NMOSVA"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($level == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 adduser.1 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 adduser.2 none
return 0
}
}
if {($level == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 adduser.3 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 adduser.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

foreach user $args {
if {$user != ""} {
if {![onchan $user $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.usernotonchan $user
return 0
}

set handle [nick2hand $user]
set hosts [getchanhost $user $chan]
set uhost "*!*@[lindex [split $hosts @] 1]"


if {([string length $user]>=10) && ($black(maxhand) == "1")} {
set user [string range $user 0 8]
}
if {[userlist] != ""} {
foreach usr [userlist] {
set hst [getuser $usr hosts]
foreach hhost $hst {
if {[string match -nocase $hhost $uhost] && (![string match -nocase $usr $user])} {
blacktools:tell $nick $host $hand $chan $chan1 add.5 $usr
return 0
}
}
}
}

if {[matchattr $hand -|A $chan] && ($level == "manager")} {
blacktools:tell $nick $host $hand $chan $chan1 add.6 none
return 0
}
if {[matchattr $hand -|A $chan] && ($level == "admin")} {
blacktools:tell $nick $host $hand $chan $chan1 add.7 none
return 0
}
if {[matchattr $hand -|M $chan] && ($level == "manager")} {
blacktools:tell $nick $host $hand $chan $chan1 add.8 none
return 0
}
if {([regexp -nocase -- {(#[0-9]+|owner|manager|admin|senior|op|voice|protect)} $level tmp access]) && (![regexp -nocase -- {\S#} $level])} {
    switch $access {
       manager { 
          set flags "-|olM"
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.9 $user
} else {
adduser $user $uhost
chattr $user -|-SOAMV $chan
chattr $user $flags $chan
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.9 $user
}
}
     admin {
      set flags "-|olA"
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} {
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.11 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.11 $user
}
}
   senior {
     set flags "-|olS"
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} {
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.12 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.12 $user
}
}

owner {
if {[matchattr $hand n|- $chan]} {
 set flags "m|-"
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.16 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.16 $user
}
}
}

op {
 set flags "-|olO"
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.13 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.13 $user
}
}

protect {
 set flags "-|H"
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qolHSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.15 $user
} else {
adduser $user $uhost
chattr $user -|-qolHSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.15 $user
}
}



 voice {
 set flags "-|lV"
if {[matchattr $handle -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $handle -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $handle n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.14 $user
} else {
adduser $user $uhost
chattr $user -|-qolSOAMV $chan
chattr $user $flags $chan 
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 add.10 "$user $uhost"
blacktools:tell $nick $host $hand $chan $chan1 add.14 $user
}
}
}
}
}
}
}




proc publicadd {nick host hand chan arg} {
global black
set level [lindex [split $arg] 0]
set time [ctime [unixtime]]
set type 0
set chan1 "$chan"
set args [lrange [split $arg] 1 end]
set c [lindex [split $arg] 1]
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 2 end]
}
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
add:process $args $time $level $hand $host $chan $chan1 $nick $type
}


############################## delacc ################################

proc delaccpublic {nick host hand chan arg} {
global black
set args [lrange [split $arg] 0 end]
set type 0
set chan1 "$chan"
set c [lindex [split $arg] 0]
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 1 end]
}
delacc:process $nick $host $hand $chan $chan1 $args $type
}

proc delacc:process {nick host hand chan chan1 args type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($args == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delacc.1 none
return 0
}
if {($args == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delacc.2 none
return 0
}
}
if {($args == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delacc.3 none
return 0
}
if {($args == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delacc.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


foreach user $args {
if {$user != ""} {
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {![matchattr $user nm|aolSOAMV $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none
return 0
}

if {[validuser $user]} { 
chattr $user -|-qaolSOAMV $chan
blacktools:tell $nick $host $hand $chan $chan1 delacc.5 $user
} else { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none }
}
}
}

############################## del #####################################

proc delpublic {nick host hand chan arg} {
global black
set args [lrange [split $arg] 0 end]
set type 0
set chan1 "$chan"
del:process $nick $host $hand $chan $chan1 $args $type
}

proc del:process {nick host hand chan chan1 args type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {($args == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 del.1 none
return 0
}
if {($args == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 del.2 none
return 0
}

foreach user $args {
if {$user != ""} {
if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[validuser $user]} { 
deluser $user
blacktools:tell $nick $host $hand $chan $chan1 del.3 $user
} else { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none }
}
}
}

################################ addhost #############################

proc addhostpublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set hosts [lrange [split $arg] 1 end]
addhost:process $nick $host $hand $chan $chan1 $user $hosts $type
}

proc addhost:process {nick host hand chan chan1 user hosts type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 addhost.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 addhost.2 none
return 0
}


if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} {
set hhost [getuser $user hosts]
foreach hhost $hhost {
if {[string match -nocase $hosts $hhost]} {
blacktools:tell $nick $host $hand $chan $chan1 addhost.3 "$user $hosts"
return 0
}
}
setuser $user HOSTS $hosts
setuser $user XTRA LASTMODIFBY $hand
setuser $user XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 addhost.4 "$user $hosts"
} else { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none }
}


############################### delhost ############################


proc delhostpuplic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set hosts [lrange [split $arg] 1 end]
delhost:process $nick $host $hand $chan $chan1 $user $hosts $type
}


proc delhost:process {nick host hand chan chan1 user hosts type} {
global black botnick
set time [ctime [unixtime]]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delhost.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delhost.2 none
return 0
}


if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} {

set hhost [getuser $user hosts]
foreach hhost $hhost {
if {[string match -nocase $hhost $hosts]} {
set foundhost 1
}
}
if {![info exists foundhost]} {
blacktools:tell $nick $host $hand $chan $chan1 delhost.3 "$user $hosts"
return 0
}

delhost $user $hosts
blacktools:tell $nick $host $hand $chan $chan1 delhost.4 "$user $hosts"
} else { 
blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
 }
}


proc chuserpublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
set chandle [lindex [split $arg] 1]
chuser:process $nick $host $hand $chan $chan1 $user $chandle $type
}

proc chuser:process {nick host hand chan chan1 user chandle type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 chuser.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 chuser.2 none
return 0
}

if {[matchattr $user -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}

if {[matchattr $user -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0
}
if {[matchattr $user n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[validuser $user]} {
chhandle $user $chandle
setuser $chandle XTRA LASTMODIFBY $hand
setuser $chandle XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 chuser.3 "$user $chandle"
} else {blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none }
}

proc userlist:execute {hand host level chan chan1 nick type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($level == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 userlist.1 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 userlist.2 none
return 0
}
}
if {($level == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 userlist.3 none
return 0
}
if {($level == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 userlist.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


if {([regexp -nocase -- {(#[0-9]+|manager|protect|admin|senior|op|voice|all|owner)} $level tmp access]) && (![regexp -nocase -- {\S#} $level])} {
    switch $access {
     manager {
     set flags "-|M"
    set numar [llength [userlist $flags $chan]]
    set list [userlist $flags $chan]
foreach user [wordwrap [join $list "  "] 250 ,] {
    if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.5 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.6 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

admin {
  set flags "-|A"
  set numar [llength [userlist $flags $chan]]
  set list [userlist $flags $chan]
foreach user [wordwrap [join $list " , "] 250 ,] {
if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.8 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.9 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

senior {
set flags "-|S"
    set list [userlist $flags $chan]
    set numar [llength [userlist $flags $chan]]
foreach user [wordwrap [join $list " , "] 250 ,] {
if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.10 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.11 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

protect {
set flags "-|H"
set list [userlist $flags $chan]
    set numar [llength [userlist $flags $chan]]
foreach user [wordwrap [join $list " , "] 250 ,] {
if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.12 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.13 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

op  {
set flags "-|O"
    set list [userlist $flags $chan]
    set numar [llength [userlist $flags $chan]]
foreach user [wordwrap [join $list " , "] 250 ,] {
if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.14 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.15 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

owner {
if {[matchattr $hand nm|- $chan]} {
set bossflags "n|-"
set ownerflags "m|-"
set listbossowner [userlist $bossflags]
set listowner [userlist $ownerflags]
blacktools:tell $nick $host $hand $chan $chan1 userlist.16 $listbossowner
blacktools:tell $nick $host $hand $chan $chan1 userlist.17 $listowner
}
}

voice {
set flags "-|V"
    set numar [llength [userlist $flags $chan]]
    set list [userlist $flags $chan]
foreach user [wordwrap [join $list " , "] 250 ,] {
if {$list == ""} { set user "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.18 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.19 none
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $user
}
}

all {
array set flgc [list]
set flags "-|MNASVO"
set list [userlist $flags $chan]
set numar [llength [userlist $flags $chan]]
foreach user $list {
if {[matchattr $user -|V $chan]} { 
lappend flgc(VOICE) $user

} elseif {[matchattr $user -|O $chan]} {
 
lappend flgc(OP) $user
} elseif {[matchattr $user -|S $chan]} {

lappend flgc(SENIOR) $user

} elseif {[matchattr $user -|A $chan]} {
 
lappend flgc(ADMINISTRATOR) $user

} elseif {[matchattr $user -|M $chan]} {
 
lappend flgc(MANAGER) $user
 
}
}

foreach flw [array names flgc] {
lappend messall [join 4$flgc($flw) " , "] -> 12($flw)
}
if {$list == ""} { set messall "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 userlist.20 $numar
blacktools:tell $nick $host $hand $chan $chan1 userlist.21 none
foreach mes [wordwrap [join $messall] 250] {
blacktools:tell $nick $host $hand $chan $chan1 userlist.7 $mes
}
}

}
}
}

proc wordwrap {str {len 100} {splitChr { }}} { 
   set out [set cur {}]; set i 0 
   foreach word [split [set str][unset str] $splitChr] { 
     if {[incr i [string len $word]]>$len} { 
         lappend out [join $cur $splitChr] 
         set cur [list $word] 
         set i [string len $word] 
      } { 
         lappend cur $word 
      } 
      incr i 
   } 
   lappend out [join $cur $splitChr] 
} 



proc publicuserlist {nick host hand chan arg} {
global black
set level [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $level] && [matchattr $hand nm|- $chan]} {
set chan "$level"
set level [lindex [split $arg] 1]
} 
userlist:execute $hand $host $level $chan $chan1 $nick $type
}


############################### channels ########################

proc channelspublic {nick host hand chan arg} {
global botnick black
set chan1 "$chan"
channels:process $nick $host $hand $chan $chan1
}

proc channels:process {nick host hand chan chan1} {
global botnick black
set num [llength [channels]]
set minusers "5"
array set status [list]
set notonchan "(NoT on ChaN)"
set notenough "(users < $minusers)"
set suspended "(SUSPENDED)"
foreach c [channels] {
set usersnumber [llength [chanlist $c]]
if {[channel get $c inactive]} {
lappend status($c) "4$c $suspended"
} elseif {![onchan $botnick $c]} {
lappend status($c) "4$c $notonchan"
} elseif {[onchan $botnick $c] && (![botisop $c])} {
lappend status($c) "4$c"
} elseif {[onchan $botnick $c] && ($usersnumber < $minusers)} {
lappend status($c) "4$c $notenough"
}
if {![info exists status($c)]} {
lappend status($c) "1@$c"
}

lappend message "[join $status($c) ", "]"

}
blacktools:tell $nick $host $hand $chan $chan1 channels.1 $num
foreach word [wordwrap [join $message] 350 ,] {
blacktools:tell $nick $host $hand $chan $chan1 channels.2 $word
}
}


############################### info ############################

proc infopublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
info:process $nick $host $hand $chan $chan1 $user $type
}

proc info:process {nick host hand chan chan1 user type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
array set flg [list]
if {[matchattr $hand nm|- $chan]} {
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 info.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 info.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 info.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 info.4 none
return 0
}
if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[validuser $user]} {
} else { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none 
return 0
}

if {[matchattr $hand nm|- $chan]} {
foreach c [channels] {
if {[matchattr $user -|V $c]} { 
set fl "VOICE"
lappend flg($fl) $c
} elseif {[matchattr $user -|O $c]} { 
set fl "OP" 
lappend flg($fl) $c
} elseif {[matchattr $user -|S $c]} {
 set fl "SENIOR"
lappend flg($fl) $c
} elseif {[matchattr $user -|A $c]} {
set fl "ADMINISTRATOR" 
lappend flg($fl) $c
} elseif {[matchattr $user -|M $c]} {
set fl "MANAGER" 
lappend flg($fl) $c 
}

}
foreach cf [array names flg] {

lappend exit 1[join $flg($cf) ,] 12($cf) |
}

}

if {![matchattr $user nm|OAHSMNV $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none
if {![info exists exit]} { set exit "1NONE"}
if {[matchattr $hand nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 info.5 "[join $exit]"
if {[getuser $user HOSTS] != ""} {
set hosts [getuser $user hosts]
blacktools:tell $nick $host $hand $chan $chan1 info.6 $hosts
}
set lastseen [getuser $user LASTON $chan]
if {($lastseen == "0") || ($lastseen == "")} {
set seened "1NONE"
} else { set seened [ctime $lastseen] }
blacktools:tell $nick $host $hand $chan $chan1 info.7 $seened
}
return 0
}

set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set suspendat "$black(say.$getlang.info.10)"

set cflags [chattr $user | $chan]
blacktools:tell $nick $host $hand $chan $chan1 info.8 $user
blacktools:tell $nick $host $hand $chan $chan1 info.9 $time
if {[matchattr $user -|V $chan]} { set flags "VOICE" } elseif {[matchattr $user -|O $chan]} { set flags "OP" } elseif {[matchattr $user -|S $chan]} { set flags "SENIOR" } elseif {[matchattr $user -|A $chan]} { set flags "ADMINISTRATOR" } elseif {[matchattr $user -|H $chan]} { set flags "PROTECT"}
if {[matchattr $user -|M $chan]} { set flags "MANAGER" } elseif {[matchattr $user n|- $chan]} { set flags "THE BOSS OWNER" } elseif {[matchattr $user m|- $chan]} { set flags "OWNER" } elseif {$cflags == "-|-"} {puthelp "NOTICE $nick :$user nu are ACCESS pe acest canal !" 
return 0
}


if {[matchattr $user -|q $chan]} {
if {[matchattr $user -|V $chan]} { set flags "VOICE ($suspendat)" } elseif {[matchattr $user -|O $chan]} { set flags "OP ($suspendat)" } elseif {[matchattr $user -|S $chan]} { set flags "SENIOR ($suspendat)" } elseif {[matchattr $user -|A $chan]} { set flags "ADMINISTRATOR ($suspendat)" } elseif {[matchattr $user -|O $chan]} { set flags "PROTECT ($suspendat)"}
if {[matchattr $user -|M $chan]} { set flags "MANAGER ($suspendat)" } elseif {[matchattr $user m|- $chan]} { set flags "OWNER ($suspendat)" } elseif {$cflags == "-|-"} {puthelp "NOTICE $nick :$user 

S pe acest canal !" 
return 0
}
}

blacktools:tell $nick $host $hand $chan $chan1 info.11 "$cflags $flags"
if {[getuser $user INFO] != ""} {
blacktools:tell $nick $host $hand $chan $chan1 info.12 "[getuser $user INFO]"
}

 
set date [getuser $user XTRA LASTMODIFDATE]
if {[matchattr $user n|- $chan]} { set date "No Date" }
if {$date == ""} { set date "No Date" }

 set lastt [getuser $user XTRA LASTMODIFBY]
 if {$lastt == ""} { set lastt "No info" }
 if {[matchattr $user n|- $chan]} { set lastt "NONE" }
blacktools:tell $nick $host $hand $chan $chan1 info.13 "$lastt $date"

if {[getuser $user HOSTS] != ""} {
set hosts [getuser $user hosts]
blacktools:tell $nick $host $hand $chan $chan1 info.6 $hosts
}

if {![info exists exit]} { set exit "NONE"}
if {![matchattr $user nm|- $chan] && [matchattr $hand nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 info.5 "[join $exit]"
}

set lastseen [getuser $user LASTON $chan]
if {($lastseen == "0") || ($lastseen == "")} { 
blacktools:tell $nick $host $hand $chan $chan1 info.14 none
blacktools:tell $nick $host $hand $chan $chan1 info.15 $user
blacktools:tell $nick $host $hand $chan $chan1 info.16 none
return 0
}
set seened [ctime $lastseen]
blacktools:tell $nick $host $hand $chan $chan1 info.17 $seened
blacktools:tell $nick $host $hand $chan $chan1 info.15 $user
blacktools:tell $nick $host $hand $chan $chan1 info.16 none
}


################################# s ###############################

proc spublic {nick host hand chan arg} {
global black
set type 0
set chan1 "$chan"
set users [lindex [split $arg] 0]
if {[regexp {^[#&]} $users] && [matchattr $hand nm|- $chan]} {
set chan "$users"
set users [lindex [split $arg] 1]
}
s:process $nick $host $hand $chan $chan1 $users $type
}

proc s:process {nick host hand chan chan1 users type} {
global botnick black
set flags "-|q"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($users == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 s.1 none
return 0
}
if {($users == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 s.2 none
return 0
}
}
if {($users == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 s.3 none
return 0
}
if {($users == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 s.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


if {[matchattr $users -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 s.5 $users
return 0
}

if {![validuser $users]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}
if {![matchattr $users nm|OASMNV $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none
return 0
}
 

if {[matchattr $users -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $users -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}


chattr $users $flags $chan
setuser $users XTRA LASTMODIFBY $hand
setuser $users XTRA LASTMODIFDATE $time
blacktools:tell $nick $host $hand $chan $chan1 s.6 $users
} 


################################## us ################################

proc uspublic {nick host hand chan arg} {
global black
set type 0
set chan1 "$chan"
set users [lindex [split $arg] 0]
if {[regexp {^[\\+!#&]} $users] && [matchattr $hand nm|- $chan]} {
set chan "$users"
set users [lindex [split $arg] 1]
}
us:process $nick $host $hand $chan $chan1 $users $type
}

proc us:process {nick host hand chan chan1 users type} {
global botnick black
set flags "-|-q"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set time [ctime [unixtime]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($users == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 us.1 none
return 0
}
if {($users == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 us.2 none
return 0
}
}
if {($users == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 us.3 none
return 0
}
if {($users == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 us.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $users]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}
if {![matchattr $users nm|OASMNV $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none
return 0
}

if {![matchattr $users -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 us.5 $users
return 0
}

if {[matchattr $users -|M $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users -|M $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users m|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users m|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

if {[matchattr $users -|A $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}
if {[matchattr $users n|- $chan] && [matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.nomodif none
return 0 
}

setuser $users XTRA LASTMODIFBY $hand
setuser $users XTRA LASTMODIFDATE $time
chattr $users $flags $chan
blacktools:tell $nick $host $hand $chan $chan1 us.6 $users
} 

############################## ping ##################################

proc pings {nick host hand chan arg} {
putquick "PRIVMSG $nick :\001PING [expr {abs([clock clicks -milliseconds])}]\001"
return 0
}

proc pingpublic {nick host hand dest key arg} {
global botnick black
set ping [split $arg "."]
set pingreply [lindex $ping 0]
if {[regexp -- {^-?[0-9]+$} $pingreply]} {
set second "[expr {abs([expr [expr {abs([clock clicks -milliseconds])} - $pingreply] / 1000.000])}]"
blacktools:tell:prv $nick $host $hand ping.1 $second
}
}

############################### time ##################################

proc timepublic {nick host hand chan arg} {
global black
set chan1 "$chan"
set time [ctime [unixtime]]
blacktools:tell $nick $host $hand $chan $chan1 time.1 $time
}

################################### vers ###############################

proc verspublic {nick host hand chan arg} {
global black
set why [lindex [split $arg] 0]
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 vers.1 none
return 0
}
vers:process $nick $host $hand $chan $chan1 $why
}

proc vers:process {nick host hand chan chan1 why} {
global botnick black
set ::verschan $chan
set ::versnick $nick
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {![onchan $why $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan $why
return 0
}
putserv "PRIVMSG $why :\001VERSION\001"

}


proc ctcpvers {nickname hostname handle dest key arg} {
set text [split $arg]
set chan $::verschan
set nick $::versnick
blacktools:tell:prv $nick $hostname $handle vers.3 "$nickname $text"
}

################################### whois ###############################

proc whoispublic {nick host hand chan arg} {
global black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set chan1 "$chan"
set who [lindex [split $arg] 0]
if {$who == ""} { blacktools:tell $nick $host $hand $chan $chan1 whois.1 none
return 0
}
whois:process $nick $host $hand $chan $chan1 $who
}



proc whois:process {nick host hand chan chan1 who} {
global botnick black
set ::wnick $nick
set ::hand $hand
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

putquick "WHOIS $who $who"
bind RAW - 311 winfo
bind RAW - 319 wchannels
bind RAW - 401 nonicks
}

proc winfo { from keyword arguments } {
global black
 set hand $::hand
 set nick $::wnick
 set nickname [lindex [split $arguments] 1]
 set ident [lindex [split $arguments] 2]
 set host [lindex [split $arguments] 3]
 set realname [string range [join [lrange $arguments 5 end]] 1 end]

blacktools:tell:prv $nick hostname $hand whois.3 "$nickname 4host - 12*!*$ident@$host * $realname"

unbind RAW - 311 winfo

}

proc wchannels { from keyword arguments } {
global black
set hand $::hand
set nick $::wnick
set channels [string range [join [lrange $arguments 2 end]] 1 end]
blacktools:tell:prv $nick hostname $hand whois.4 $channels

unbind RAW - 319 wchannels

}

proc nonicks { from keyword arguments } {
global black
set hand $::hand
set nick $::wnick
blacktools:tell:prv $nick hostname $hand whois.5 none
unbind RAW - 401 nonicks
}


################################### clear ###############################


proc clearpublic {nick host hand chan arg} {
global black
set why [lindex [split $arg] 0]
set chan1 "$chan"
set type 0
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 1]
}
clear:process $nick $host $hand $chan $chan1 $why $type
}

proc clear:process {nick host hand chan chan1 why type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($why == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 clear.1 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 clear.2 none
return 0
}
}
if {($why == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 clear.3 none
return 0
}
if {($why == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 clear.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


if {([regexp -nocase -- {(#[0-9]+|banlist|userlist)} $why tmp cleanlist]) && (![regexp -nocase -- {\S#} $why])} {
    switch $cleanlist {
       userlist {
set list [userlist -|AOSV $chan]

foreach user $list {
chattr $user -|-AOVS $chan
}
blacktools:tell $nick $host $hand $chan $chan1 clear.5 none
}

banlist {
set i 0
foreach ban [banlist $chan] {
set theban [lindex $ban 0]
if {[string match "*" $theban]} {
set i [expr $i +1]
killchanban $chan $theban
}
}
blacktools:tell $nick $host $hand $chan $chan1 clear.6 $i
}

}
}
}


################################# addbot ################################


proc addbotpublic {nick host hand chan arg} {
global black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set chan1 "$chan"
set why [lindex [split $arg] 0]
set host [lindex [split $arg] 1]
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 addbot.1 none
return 0
}
addbot:process $nick $host $hand $chan $chan1 $why $host
}


proc addbot:process {nick host hand chan chan1 why host} {
global botnick black
set flags "ao|ao"
if {[validuser $why]} {
blacktools:tell $nick $host $hand $chan $chan1 addbot.3 $why
return 0
}

addbot $why $host
chattr $why $flags $chan
blacktools:tell $nick $host $hand $chan $chan1 addbot.4 "$why $host"
}



proc autovonjoin {nick host hand chan} {
if {[channel get $chan autovoice]} {
pushmode $chan +v $nick
}
}



proc autoponjoin {nick host hand chan} {
if {[channel get $chan autoop]} {
pushmode $chan +o $nick
}
}

############################# addop #################################

proc addoppublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
addop:process $nick $host $hand $chan $chan1 $user $type
}


proc addop:process {nick host hand chan chan1 user type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flag "-|a"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 addop.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 addop.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 addop.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 addop.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}

if {[matchattr $user -|a $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addop.5 $user
return 0
}

chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 addop.6 $user
}

proc addopjoin {nick host hand chan} {
if {[matchattr $hand -|a $chan]} {
pushmode $chan +o $nick
}
}


########################### addvoice ################################

proc addvoicepublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
addvoice:process $nick $host $hand $chan $chan1 $user $type
}

proc addvoice:process {nick host hand chan chan1 user type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flag "-|g"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 addvoice.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 addvoice.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 addvoice.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 addvoice.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}

if {[matchattr $user -|g $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addvoice.5 $user
return 0
}

chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 addvoice.6 $user
}

proc addvoicejoin {nick host hand chan} {
if {[matchattr $hand -|g $chan]} {
pushmode $chan +v $nick
}
}





########################### delop ##################################

proc deloppublic {nick host hand chan arg} {
global black botnick
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
delop:process $nick $host $hand $chan $chan1 $user $type
}

proc delop:process {nick host hand chan chan1 user type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flag "-|-a"
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delop.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delop.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delop.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delop.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {

blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}

if {[matchattr $user -|a $chan]} {
set noautoop 1
}

if {![info exists noautoop]} {
blacktools:tell $nick $host $hand $chan $chan1 delop.5 $user
return 0
}

chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 delop.6 $user
}



############################ delvoice ###############################

proc delvoicepublic {nick host hand chan arg} {
global black
set user [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
delvoice:process $nick $host $hand $chan $chan1 $user $type
}



proc delvoice:process {nick host hand chan chan1 user type} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set flag "-|-g"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}

if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delvoice.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delvoice.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 delvoice.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 delvoice.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}

if {[matchattr $user -|g $chan]} {
set noautovoice 1
}

if {![info exists noautovoice]} {
blacktools:tell $nick $host $hand $chan $chan1 delvoice.5 $user
return 0
}

chattr $user $flag $chan
blacktools:tell $nick $host $hand $chan $chan1 delvoice.6 $user
}



############################## activ ##################################

proc activpublic {nick host hand chan arg} { 
global black
set type 0
set chan1 "$chan"
set user [lindex [split $arg] 0]
if {[regexp {^[#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 1]
}
activ:process $nick $host $hand $chan $chan1 $user $type
}

proc activ:process {nick host hand chan chan1 user type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($user == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 activ.1 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 activ.2 none
return 0
}
}
if {($user == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 activ.3 none
return 0
}
if {($user == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 activ.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}

if {![validuser $user]} { blacktools:tell $nick $host $hand $chan $chan1 gl.nomem none
return 0
}
if {![matchattr $user mn|OAVMS $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.noaccess none 
return 0
}

set dr [getuser $user XTRA DR($chan)]
set ban [getuser $user XTRA b($chan)]
set spam [getuser $user XTRA spam($chan)]
set badnick [getuser $user XTRA n($chan)]
set invite [getuser $user XTRA i($chan)]
set blacks [getuser $user XTRA Black($chan)]
set warn [getuser $user XTRA w($chan)]
set day [getuser $user XTRA d($chan)]
set kick [getuser $user XTRA k($chan)]
set stick [getuser $user XTRA stick($chan)]
set bw [getuser $user XTRA bw($chan)]
set bot [getuser $user XTRA bot($chan)]

if {$ban == ""} { set ban "0" }
if {$dr == ""} { set dr "0" }
if {$spam == ""} { set spam "0" }
if {$badnick == ""} { set badnick "0" }
if {$invite == ""} { set invite "0" }
if {$blacks == ""} { set blacks "0" }
if {$warn == ""} { set warn "0" }
if {$day == ""} { set day "0" }
if {$kick == ""} { set kick "0" }
if {$stick == ""} { set stick "0" }
if {$bw == ""} { set bw "0" }
if {$bot == ""} { set bot "0" }

if {[matchattr $user mn|AMS $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 activ.5 $user
blacktools:tell $nick $host $hand $chan $chan1 activ.6 "12- $char(p)dr - 4($dr) | 12- $char(p)bot - 4($bot) | 12- $char(p)b - 4($ban) | 12- $char(p)spam - 4($spam) | 12- $char(p)n - 4($badnick) | 12- $char(p)i - 4($invite) | 12- $char(p)black - 4($blacks) | 12- $char(p)w - 4($warn) | 12- $char(p)d - 4($day) | 12- $char(p)k - 4($kick) | 12- $char(p)stick - 4($stick) | 12- $char(p)bw - 4($bw) ."
blacktools:tell $nick $host $hand $chan $chan1 activ.7 none
return 0
}
if {[matchattr $user -|O $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 activ.8 $user
blacktools:tell $nick $host $hand $chan $chan1 activ.6 "12- $char(p)dr - 4($dr) | 12- $char(p)bot - 4($bot) | 12- $char(p)b - 4($ban) | 12- $char(p)spam - 4($spam) | 12- $char(p)n - 4($badnick) | 12- $char(p)i - 4($invite) | 12- $char(p)w - 4($warn) | 12- $char(p)k - 4($kick) | 12- $char(p)bw - 4($bw) ."
blacktools:tell $nick $host $hand $chan $chan1 activ.7 none
return 0
}
if {[matchattr $user -|V $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 activ.9 $user
blacktools:tell $nick $host $hand $chan $chan1 activ.6 "12- $char(p)w - 4($warn) | 12- $char(p)k - 4($kick)"
blacktools:tell $nick $host $hand $chan $chan1 activ.7 none
return 0
}
}

proc addmyhostpublic {nick host hand chan arg} {
global black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set chan1 "$chan"
set why [lindex [split $arg] 0]
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 addmyhost.1 none
return 0
}
addmyhost:process $nick $host $hand $chan $chan1 $why
}

proc addmyhost:process {nick host hand chan chan1 why} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set hhost [getuser $hand hosts]
foreach hhost $hhost {
if {[string match -nocase $hhost $why]} {
set foundhost 1
}
}
if {[info exists foundhost]} {
blacktools:tell $nick $host $hand $chan $chan1 addmyhost.3 $why
return 0
}
setuser $hand HOSTS $why
blacktools:tell $nick $host $hand $chan $chan1 addmyhost.4 $why
}

############################## delmyhost ##########################

proc delmyhostpublic {nick host hand chan arg} {
global black
set chan1 "$chan"
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set why [lindex [split $arg] 0]
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 delmyhost.1 none
return 0
}
delmyhost:process $nick $host $hand $chan $chan1 $why
}

proc delmyhost:process {nick host hand chan chan1 why} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set hhost [getuser $hand hosts]
foreach hhost $hhost {
if {[string match -nocase $hhost $why]} {
set foundhost 1
}
}
if {![info exists foundhost]} {
blacktools:tell $nick $host $hand $chan $chan1 delmyhost.3 $why
return 0
}
delhost $hand $why
blacktools:tell $nick $host $hand $chan $chan1 delmyhost.4 $why
}


######################## cc (channel created) #######################

proc createdpublic { from keyword arguments } {
set hand $::hand
set nick $::ccnick
set date [lindex [split $arguments] 2]
set dates [ctime $date]
blacktools:tell:prv $nick host $hand cc.3 $dates
unbind RAW - 329 createdpublic
}

proc nocreatedpublic { from keyword arguments } {
set hand $::hand
set nick $::ccnick
blacktools:tell:prv $nick host $hand cc.4 none
unbind RAW - 403 nocreatedpublic

}

proc ccpublic {nick host hand chan arg} {
global black
set ::ccnick $nick
set ::hand $hand
set chan1 "$chan"
set c [lindex [split $arg] 0]
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {$c == ""} { blacktools:tell $nick $host $hand $chan $chan1 cc.1 none
return 0
}
if {![regexp {^[\\+!#&]} $c]} {
set c #$c
 } 

putquick "MODE $c"
bind raw - 329 createdpublic
bind raw - 403 nocreatedpublic
}

proc statspublic {nick host hand chan arg} {
global botnick black
set c [lindex [split $arg] 0]
set chan1 "$chan"
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
stats:process $nick $host $hand $chan $chan1
}

proc stats:process {nick host hand chan chan1} {
global botnick black statsdir
set ops 0
set numban 0
set voices 0
set numuser 0
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
set time [unixtime]
set file [open $statsdir "r"]
set database [read -nonewline $file]
set data [split $database "\n"]
foreach line $data {
set c [lindex [split $line] 0]
set type [lindex [split $line] 1]
if {[string match "ADDED" "$type"] && [string match -nocase $c $chan]} {
set foundchan 1
set chanadded 1
set awho [lindex [split $line] 2]
set ahost [lindex [split $line] 3]
set a1time [lindex [split $line] 4]
if {[regexp {^[0-9]} $a1time]} { 
set duration [duration [expr [unixtime] - $a1time]]
} else { set duration "NONE" }
if {[regexp {^[0-9]} $a1time]} {
set atime [clock format $a1time -format %D-%H:%M:%S]
} else { set atime "NONE"}
set replace(%ahost%) $ahost
set replace(%atime%) $atime
set replace(%duration%) $duration
set replace(%awho%) $awho
lappend mes "[string map [array get replace] $black(say.$getlang.stats.1)]" 
lappend mes1 "[string map [array get replace] $black(say.$getlang.stats.2)]"
}
if {[string match "REMOVED" "$type"] && [string match -nocase $c $chan]} {
set foundchan 1
set chanremoved 1
set rwho [lindex [split $line] 2]
set rhost [lindex [split $line] 3]
set rtime [lindex [split $line] 4]
set a1time [lindex [split $line] 5]
if {[regexp {^[0-9]} $a1time]} { 
set duration [duration [expr [unixtime] - $a1time]]
} else { set duration "NONE" }
if {[regexp {^[0-9]} $a1time]} {
set atime [clock format $a1time -format %D-%H:%M:%S]
} else { set atime "NONE"}
if {[regexp {^[0-9]} $rtime]} {
set rtime [clock format $rtime -format %D-%H:%M:%S]
} else { set rtime "NONE" }
set awho [lindex [split $line] 6]
set ahost [lindex [split $line] 7]
set replace(%ahost%) $ahost
set replace(%atime%) $atime
set replace(%rtime%) $rtime
set replace(%duration%) $duration
set replace(%awho%) $awho
set replace(%rwho%) $rwho
set replace(%rhost%) $ahost
lappend mes "[string map [array get replace] $black(say.$getlang.stats.1)]"
lappend mes1 "[string map [array get replace] $black(say.$getlang.stats.3)]"
lappend mes2 "[string map [array get replace] $black(say.$getlang.stats.4)]"
}
}
if {![info exists foundchan]} {
blacktools:tell $nick $host $hand $chan $chan1 stats.5 none
return 0
}
if {[validchan $chan] && ([onchan $botnick $chan])} {
set numban [llength [banlist $chan]]
set numuser [llength [chanlist $chan]]
foreach user [chanlist $chan] {
if {[isop $user $chan] && (![isvoice $user $chan])} {
set ops [expr $ops +1]
}
if {[isvoice $user $chan]} {
set voices [expr $voices +1]
}
}
}
if {[info exists chanadded]} {
blacktools:tell $nick $host $hand $chan $chan1 stats.6 none
blacktools:tell $nick $host $hand $chan $chan1 stats.7 "[join $mes]"
if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 stats.9 none 
} else {
blacktools:tell $nick $host $hand $chan $chan1 stats.8 none
}
blacktools:tell $nick $host $hand $chan $chan1 stats.7 "[join $mes1]"
blacktools:tell $nick $host $hand $chan $chan1 stats.10 "$numuser $ops $voices $numban"
blacktools:tell $nick $host $hand $chan $chan1 stats.11 none
}

if {[info exists chanremoved]} {
blacktools:tell $nick $host $hand $chan $chan1 stats.6 none
blacktools:tell $nick $host $hand $chan $chan1 stats.7 "[join $mes]"
blacktools:tell $nick $host $hand $chan $chan1 stats.12 none
blacktools:tell $nick $host $hand $chan $chan1 stats.7 "[join $mes1]"
blacktools:tell $nick $host $hand $chan $chan1 stats.7 "[join $mes2]"
blacktools:tell $nick $host $hand $chan $chan1 stats.11 none
}

}



####################### TopWords ####################################


proc topwordspublic {nick host hand chan arg} {
global black who username
set arg [split $arg]
if {![validchan $chan]} {
return 0
}
if {[channel get $chan topwords]} {
set lin 0
set wordsdir "logs/$username.$chan.words.db"
if {![file exists $wordsdir]} {
set file [open $wordsdir w]
close $file
}
set host "*!*@[lindex [split $host @] 1]"
set len($host) [llength $arg]
set words($host:$chan) $len($host)
if {[isbotnick $nick]} { return 0 }
set who "$chan $nick $host $words($host:$chan)"
set file [open $wordsdir "r"]
set database [read -nonewline $file]
close $file
set data [split $database "\n"]
foreach line $data {
set lin [expr $lin +1] 
set hhost [lindex [split $line] 2]
set hscore [lindex [split $line] 3]
set chanentry [lindex [split $line] 0]
if {[string match -nocase $hhost $host] && [string match -nocase $chanentry $chan]} {
lappend current($hhost:$chan) $hscore
set who "$chan $nick $hhost [expr $words($host:$chan) + $current($hhost:$chan)]"
if {$line != ""} {
set num [expr $lin - 1]
set delete [lreplace $data $num $num]
set files [open $wordsdir "w"]
puts $files [join $delete "\n"]
close $files
}
}
}
set file [open $wordsdir "r"]
set data [read -nonewline $file]
close $file
if {$data == ""} {
set files [open $wordsdir "w"]
close $files
}
set file [open $wordsdir "a"]
puts $file "$who"
close $file
}
}


################################## TOP ################################

proc toppublic {nick host hand chan arg} {
global black
set cmd [lindex [split $arg] 0]
set del [lindex [split $arg] 1]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $cmd] && [matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set chan "$cmd"
set cmd [lindex [split $arg] 1]
set del [lindex [split $arg] 2]
}
top:process $nick $host $hand $chan $chan1 $cmd $type $del
}


proc top:process {nick host hand chan chan1 cmd type del} {
global botnick black username
set max "20"
set i 0
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
set list [userlist nm|OSVAM $chan]
set wordsdir "logs/$username.$chan.words.db"
if {![file exists $wordsdir]} {
set file [open $wordsdir w]
close $file
}

if {[matchattr $hand nm|- $chan]} {
if {($cmd == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 top.1 none
blacktools:tell $nick $host $hand $chan $chan1 top.2 none
return 0
}
if {($cmd == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 top.3 none
blacktools:tell $nick $host $hand $chan $chan1 top.4 none
return 0
}
}
if {($cmd == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 top.5 none
blacktools:tell $nick $host $hand $chan $chan1 top.6 none
return 0
}
if {($cmd == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 top.7 none
blacktools:tell $nick $host $hand $chan $chan1 top.8 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}


 
switch -exact -- [string tolower $cmd] {
       dr {
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA DR($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.10 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

 b {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA b($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.12 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

bot {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA bot($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.13 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

bw {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA bw($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.14 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

black {
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA Black($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.15 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}


spam {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA spam($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.16 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

stick {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA stick($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.17 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

n {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA n($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.18 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}


i {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA i($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.19 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

k {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA k($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.20 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

w {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA w($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.21 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

d {
 
array set blacks [list] 
set list [userlist nm|OSVAM $chan] 
foreach user $list { 
 set b [getuser $user XTRA d($chan)] 
 if {$b == ""} { set b 0 }
if {$b > 0} { 
 lappend blacks($b) $user
}
}

foreach blackq [lsort -integer -decreasing [array names blacks]] {
set i [expr $i +1]
lappend topblack 1- $i - : 1[join $blacks($blackq) ,] 12($blackq) | 
}
if {![info exists topblack]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.22 none
foreach txt [wordwrap [join $topblack " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

words {
array set topw [list]
if {![channel get $chan topwords]} {
blacktools:tell $nick $host $hand $chan $chan1 top.23 none
return 0
}
if {[string match -nocase $del "erase"] && [matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 top.24 none
set file [open $wordsdir "w"]
close $file
return 0
}
set file [open $wordsdir "r"]
set database [read -nonewline $file]
close $file
if {$database == ""} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
set data [split $database "\n"]
foreach line $data {
set hhost [lindex [split $line] 2]
set hentry [lindex [split $line] 1]
set chanentry [lindex [split $line] 0]
set tw [lindex [split $line] 3]
if {[string match -nocase $chanentry $chan]} {
lappend topw($tw) $hentry
}
}
foreach twords [lsort -integer -decreasing [array names topw]] {
set i [expr $i +1]
if {!($i > $max)} {
lappend topwo 1- $i - : 1[join $topw($twords) ,] 12($twords) |
}
}
if {![info exists topwo]} { blacktools:tell $nick $host $hand $chan $chan1 top.9 none
return 0
}
blacktools:tell $nick $host $hand $chan $chan1 top.25 $max
foreach txt [wordwrap [join $topwo " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 top.11 $txt
}
}

}
}

proc securepublic {nick host hand chan arg} {
global black
set what [lindex [split $arg] 0]
set type 0
set chan1 "$chan"
if {[regexp {^[#&]} $what] && [matchattr $hand nm|- $chan]} {
set chan "$what"
set what [lindex [split $arg] 1]
}
secure:process $nick $host $hand $chan $chan1 $what $type
}


proc secure:process {nick host hand chan chan1 what type} {
global botnick black
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
} 
if {[matchattr $hand nm|- $chan]} {
if {($what == "")  && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 secure.1 none
return 0
}
if {($what == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 secure.2 none
return 0
}
}
if {($what == "") && ($type == "0")} {
blacktools:tell $nick $host $hand $chan $chan1 secure.3 none
return 0
}
if {($what == "") && ($type == "1")} {
blacktools:tell $nick $host $hand $chan $chan1 secure.4 none
return 0
}


if {![validchan $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
}

if {![onchan $botnick $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
return 0
}




if {[string match -nocase "$what" "on"]} {
set char(a) "+"
channel set $chan $char(a)antipub ; channel set $chan $char(a)antinotice ; channel set $chan $char(a)antictcp ; channel set $chan $char(a)antibadword ; channel set $chan $char(a)antibadword ; channel set $chan $char(a)antilongtext ; channel set $chan $char(a)badquitpart ; channel set $chan $char(a)antijoinpart ; channel set $chan $char(a)antispam ; channel set $chan $char(a)antirepeat ; channel set $chan $char(a)anticolor ; channel set $chan $char(a)antibold ; channel set $chan $char(a)antiunderline ; channel set $chan $char(a)anticaps ; channel set $chan $char(a)badnick ; channel set $chan $char(a)badfullname ; channel set $chan $char(a)antijoinflood ; channel set $chan $char(a)antichanflood ; channel set $chan $char(a)badident
blacktools:tell $nick $host $hand $chan $chan1 secure.5 none
}
if {[string match -nocase "$what" "off"]} {
set char(a) "-"
channel set $chan $char(a)antipub ; channel set $chan $char(a)antinotice ; channel set $chan $char(a)antictcp ; channel set $chan $char(a)antibadword ; channel set $chan $char(a)antibadword ; channel set $chan $char(a)antilongtext ; channel set $chan $char(a)badquitpart ; channel set $chan $char(a)antijoinpart ; channel set $chan $char(a)antispam ; channel set $chan $char(a)antirepeat ; channel set $chan $char(a)anticolor ; channel set $chan $char(a)antibold ; channel set $chan $char(a)antiunderline ; channel set $chan $char(a)anticaps ; channel set $chan $char(a)badnick ; channel set $chan $char(a)badfullname ; channel set $chan $char(a)antijoinflood ; channel set $chan $char(a)antichanflood ; channel set $chan $char(a)badident
blacktools:tell $nick $host $hand $chan $chan1 secure.6 none
}
}

proc hpublic {nick host hand chan arg} {
global black botnick
set chan1 "$chan"
set command [lindex [split $arg] 0]
h:process $nick $host $hand $chan $chan1 $command
}


proc h:process {nick host hand chan chan1 command} {
global black botnick
set char(p) [lindex $black(cmdchar) 0]
if {[string match -nocase "$char(p)" "none"]} {
set char(p) ""
}
set replace(%chan%) $chan
set replace(%char%) $char(p)
set greeting [getuser $hand XTRA GREET]
set chanlang [string tolower [channel get $chan lang]]
if {$chanlang == ""} { set chanlang "[string tolower $black(default_lang)]" }
if {$greeting == ""} {
putserv "PRIVMSG $nick :[string map [array get replace] $black(say.$chanlang.greeting.1)]"
putserv "PRIVMSG $nick :[string map [array get replace] $black(say.$chanlang.greeting.2)]"
putserv "PRIVMSG $nick :[string map [array get replace] $black(say.$chanlang.greeting.3)]"
putserv "PRIVMSG $nick :[string map [array get replace] $black(say.$chanlang.greeting.4)]"
setuser $hand XTRA GREET 1
return 0
}
set getlang [string tolower [getuser $hand XTRA OUTPUT_LANG]]
set replace(%char%) "$char(p)"
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$command == ""} {
if {[matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.1 none
blacktools:tell $nick $host $hand $chan $chan1 h.2 none
return 0
}
if {[matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.3 none
blacktools:tell $nick $host $hand $chan $chan1 h.4 none
return 0
}
if {[matchattr $hand -|V $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.5 none
blacktools:tell $nick $host $hand $chan $chan1 h.6 none
return 0
}
if {[matchattr $hand -|O $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.7 none
blacktools:tell $nick $host $hand $chan $chan1 h.8 none
return 0
}
if {[matchattr $hand -|S $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.9 none
blacktools:tell $nick $host $hand $chan $chan1 h.10 none
return 0
}
if {[matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.11 none
blacktools:tell $nick $host $hand $chan $chan1 h.12 none
return 0
}
if {[matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 h.13 none
blacktools:tell $nick $host $hand $chan $chan1 h.14 none
return 0
}
return 0
}
switch -exact -- [string tolower $command] {

cmds {
if {[matchattr $hand -|V $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 cmdsvoice none

return 0
}

if {[matchattr $hand -|O $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdsop)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand -|S $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdsenior)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt

}
return 0
}

if {[matchattr $hand -|A $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdadmin)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
b
}
return 0
}

if {[matchattr $hand -|M $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdmanager)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt

}
return 0
}

if {[matchattr $hand n|- $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdbossowner)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt

}
return 0
}

if {[matchattr $hand m|- $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.cmdowner)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt

}
return 0
}
}

ban {

if {[matchattr $hand -|V $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banvoice)] " "] 450] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand -|O $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banop)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand -|S $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.bansenior)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand -|A $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banadmin)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand -|M $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banmanager)] " "] 300] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand n|- $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banbossowner)] " "] 380] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}

if {[matchattr $hand m|- $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.banowner)] " "] 380] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
return 0
}
}

add {

if {[matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addadmin none
return 0
}

if {[matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addmanager none
return 0
}

if {[matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addbossowner none
return 0
}

if {[matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 addowner none
return 0
}
}


modif {
if {[matchattr $hand -|A $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 modifadmin none
return 0
}

if {[matchattr $hand -|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 modifmanager none
return 0
}

if {[matchattr $hand n|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 modifbossowner none
return 0
}

if {[matchattr $hand m|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 modifowner none
return 0
}
}

owner {
if {[matchattr $hand nm|- $chan]} {
foreach txt [wordwrap [join [string map [array get replace] $black(say.$getlang.howner)] " "] 390] {
blacktools:tell $nick $host $hand $chan $chan1 h.15 $txt
}
}
}

top {
if {[matchattr $hand nm|MASOV $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 htop $nick
}
}

blacktools {
if {[matchattr $hand nm|M $chan]} {
if {[channel get $chan antipub]} { set pubstatus "+antipub" } else { set pubstatus "-antipub" }
if {[channel get $chan antinotice]} { set noticestatus "+antinotice" } else { set noticestatus "-antinotice" }
if {[channel get $chan antictcp]} { set ctcpstatus "+antictcp" } else { set ctcpstatus "-antictcp" }
if {[channel get $chan antibadword]} { set badwordstatus "+antibadword" } else { set badwordstatus "-antibadword" }
if {[channel get $chan antilongtext]} { set longtextstatus "+antilongtext" } else { set longtextstatus "-antilongtext" }
if {[channel get $chan badquitpart]} { set badquitpartstatus "+badquitpart" } else { set badquitpartstatus "-badquitpart" }
if {[channel get $chan antijoinpart]} { set joinpartstatus "+antijoinpart" } else { set joinpartstatus "-antijoinpart" }
if {[channel get $chan antispam]} { set antispamstatus "+antispam" } else { set antispamstatus "-antispam" }
if {[channel get $chan antirepeat]} { set repeatstatus "+antirepeat" } else { set repeatstatus "-antirepeat" }
if {[channel get $chan anticolor]} { set colorstatus "+anticolor" } else { set colorstatus "-anticolor" }
if {[channel get $chan antibold]} { set boldstatus "+antibold" } else { set boldstatus "-antibold" }
if {[channel get $chan antiunderline]} { set underlinestatus "+antiunderline" } else { set underlinestatus "-antiunderline" }
if {[channel get $chan anticaps]} { set capsstatus "+anticaps" } else { set capsstatus "-anticaps" }
if {[channel get $chan badnick]} { set nickstatus "+badnick" } else { set nickstatus "-badnick" }
if {[channel get $chan badfullname]} { set fullnamestatus "+badfullname" } else { set fullnamestatus "-badfullname" }
if {[channel get $chan autoop]} { set opstatus "+autoop" } else { set opstatus "-autoop" }
if {[channel get $chan autovoice]} { set voicestatus "+autovoice" } else { set voicestatus "-autovoice" }
if {[channel get $chan antijoinflood]} { set joinfloodstatus "+antijoinflood" } else { set joinfloodstatus "-antijoinflood" }
if {[channel get $chan antichanflood]} { set chanfloodstatus "+antichanflood" } else { set chanfloodstatus "-antichanflood" }
if {[channel get $chan badident]} { set badidentstatus "+badident" } else { set badidentstatus "-badident" }
set xbantime [channel get $chan xbantime]
if {$xbantime == "0"} { set xbantime 1 }
set xbanlevel [channel get $chan xbanlevel]
if {$xbanlevel == "0"} { set xbanlevel 100 }
blacktools:tell $nick $host $hand $chan $chan1 hblacktools.1 "1$pubstatus | 4$noticestatus | 1$ctcpstatus | 4$badwordstatus | 1$longtextstatus | 4$badquitpartstatus | 1$joinpartstatus | 4$antispamstatus | 1$repeatstatus | 4$colorstatus | 1$boldstatus | 4$underlinestatus | 1$capsstatus | 4$nickstatus | 1$fullnamestatus | 4$opstatus | 1$voicestatus | 4$joinfloodstatus | 1$chanfloodstatus | 4$badidentstatus | 1xbantime $xbantime | 4xbanlevel $xbanlevel."
blacktools:tell $nick $host $hand $chan $chan1 hblacktools.2 none
}
}

standard {
if {[matchattr $hand nm|M $chan]} {
if {[channel get $chan protectops]} { set protectops "+protectops" } else { set protectops "-protectops" }
if {[channel get $chan bitch]} { set bitch "+bitch" } else { set bitch "-bitch" }
if {[channel get $chan enforcebans]} { set enforcebans "+enforcebans" } else { set enforcebans "-enforcebans" }
if {[channel get $chan protecthalfops]} { set protecthalfops "+protecthalfops" } else { set protecthalfops "-protecthalfops" }
if {[channel get $chan protectfriends]} { set protectfriends "+protectfriends" } else { set protectfriends "-protectfriends" }
if {[channel get $chan dynamicbans]} { set dynamicbans "+dynamicbans" } else { set dynamicbans "-dynamicbans" }
if {[channel get $chan dontkickops]} { set dontkickops "+dontkickops" } else { set dontkickops "-dontkickops" }
if {[channel get $chan nodesynch]} { set nodesynch "+nodesynch" } else { set nodesynch "-nodesynch" }
if {[channel get $chan dynamicbans]} { set noticestatus "+dynamicbans" } else { set dynamicbans "-dynamicbans" }
set bantime [channel get $chan ban-time]
set floodchan [channel get $chan flood-chan]
set floodjoin [channel get $chan flood-join]
set floodkick [channel get $chan flood-kick]
set floodctcp [channel get $chan flood-ctcp]
set floodnick [channel get $chan flood-nick]
set flooddeop [channel get $chan flood-deop]
set chanmode [channel get $chan chanmode]
blacktools:tell $nick $host $hand $chan $chan1 hstandard.1 none
blacktools:tell $nick $host $hand $chan $chan1 hstandard.3 "1$protectops 4$bitch 1$enforcebans 4$protecthalfops 1$protectfriends 4$dynamicbans 1$dontkickops 4$nodesynch"
blacktools:tell $nick $host $hand $chan $chan1 hstandard.3 "12Flood-Chan :1 $floodchan  12Flood-join :4 $floodjoin  12Flood-Kick :1 $floodkick  12Flood-Ctcp :4 $floodctcp  12Flood-Nick :1 $floodnick  12Flood-Deop :4 $flooddeop "
blacktools:tell $nick $host $hand $chan $chan1 hstandard.3  "12ChanMode :1$chanmode 12Ban-Time :1 $bantime "
blacktools:tell $nick $host $hand $chan $chan1 hstandard.2 none
}
}




chaninfo {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hchaninfo.1 none
blacktools:tell $nick $host $hand $chan $chan1 hchaninfo.2 none
blacktools:tell $nick $host $hand $chan $chan1 hchaninfo.3 none
blacktools:tell $nick $host $hand $chan $chan1 hchaninfo.4 none
blacktools:tell $nick $host $hand $chan $chan1 hchaninfo.5 none
}
}

module {
if {[matchattr $hand nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hmodule.1 none
} else { blacktools:tell $nick $host $hand $chan $chan1 hmodule.2 none }
blacktools:tell $nick $host $hand $chan $chan1 hmodule.3 none
}


antitake {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantitake.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantitake.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantitake.3 none
blacktools:tell $nick $host $hand $chan $chan1 hantitake.4 none
}
}

private {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hprivate.1 none
blacktools:tell $nick $host $hand $chan $chan1 hprivate.2 none
}
}

language {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hlanguage.1 none
blacktools:tell $nick $host $hand $chan $chan1 hlanguage.2 none
blacktools:tell $nick $host $hand $chan $chan1 hlanguage.3 none
}
}


xban {
set xbantime [channel get $chan xbantime]
if {$xbantime == "0"} { set xbantime 1 }
set xlevel [channel get $chan xbanlevel]
if {$xlevel == "0"} { set xlevel 100 }
if {[matchattr $hand nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hxban.1 none
blacktools:tell $nick $host $hand $chan $chan1 hxban.2 none
blacktools:tell $nick $host $hand $chan $chan1 hxban.3 "$xbantime $xlevel"
}
}

topicrefresh {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 htopicrefresh.1 none
blacktools:tell $nick $host $hand $chan $chan1 htopicrefresh.2 none
}
}

count {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hcount.1 none
blacktools:tell $nick $host $hand $chan $chan1 hcount.2 none
}
}

xtools {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hxtools.1 none
blacktools:tell $nick $host $hand $chan $chan1 hxtools.2 none
}
}

badchan {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadchan.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadchan.2 none
}
}

badword {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadword.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadword.2 none
}
}

anunt {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hanunt.1 $black(anunttime)
blacktools:tell $nick $host $hand $chan $chan1 hanunt.2 none
}
}

autobroadcast {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hautobroadcast.1 $black(bttime)
blacktools:tell $nick $host $hand $chan $chan1 hautobroadcast.2 none
blacktools:tell $nick $host $hand $chan $chan1 hautobroadcast.3 none
}
}

antibotidle {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantibotidle.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantibotidle.2 $black(noidlemax)
}
}

limit {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hlimit.1 none
blacktools:tell $nick $host $hand $chan $chan1 hlimit.2 none
}
}

topic {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 htopic.1 none
blacktools:tell $nick $host $hand $chan $chan1 htopic.2 none
}
}

seen {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hseen.1 none
blacktools:tell $nick $host $hand $chan $chan1 hseen.2 none
}
}

clonescan {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hclonescan.1 none
blacktools:tell $nick $host $hand $chan $chan1 hclonescan.2 none
blacktools:tell $nick $host $hand $chan $chan1 hclonescan.3 none
}
}

greet {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hgreet.1 none
blacktools:tell $nick $host $hand $chan $chan1 hgreet.2 none
}
}
leave {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hleave.1 none
blacktools:tell $nick $host $hand $chan $chan1 hleave.2 none
}
}

idle {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hidle.1 none
blacktools:tell $nick $host $hand $chan $chan1 hidle.2 none
}
}

chanreport {
if {[matchattr $hand nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hchanreport.1 none
blacktools:tell $nick $host $hand $chan $chan1 hchanreport.2 none
blacktools:tell $nick $host $hand $chan $chan1 hchanreport.3 none
}
}

topwords {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 htopwords.1 none
blacktools:tell $nick $host $hand $chan $chan1 htopwords.2 none
blacktools:tell $nick $host $hand $chan $chan1 htopwords.3 none
}
}

settings {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hsettings.1 none
blacktools:tell $nick $host $hand $chan $chan1 hsettings.2 none
blacktools:tell $nick $host $hand $chan $chan1 hsettings.3 none
blacktools:tell $nick $host $hand $chan $chan1 hsettings.4 none
blacktools:tell $nick $host $hand $chan $chan1 hsettings.5 none
blacktools:tell $nick $host $hand $chan $chan1 hsettings.6 none
}
}

reason {
if {[matchattr $hand nm|M $chan]} {
if {[channel get $chan showhandle]} { set showhandle "+showhandle" } else { set showhandle "-showhandle" }
if {[channel get $chan showcount]} { set showcount "+showcount" } else { set showcount "-showcount" }
if {[channel get $chan showtime]} { set showtime "+showtime" } else { set showtime "-showtime" }
blacktools:tell $nick $host $hand $chan $chan1 hreason.1 none
blacktools:tell $nick $host $hand $chan $chan1 hreason.2 "$showhandle $showcount $showtime"
blacktools:tell $nick $host $hand $chan $chan1 hreason.3 none
blacktools:tell $nick $host $hand $chan $chan1 hreason.4 none
blacktools:tell $nick $host $hand $chan $chan1 hreason.5 none
blacktools:tell $nick $host $hand $chan $chan1 hreason.6 none
}
}


extra {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hextra.1 none
blacktools:tell $nick $host $hand $chan $chan1 hextra.2 none
blacktools:tell $nick $host $hand $chan $chan1 hextra.3 none
blacktools:tell $nick $host $hand $chan $chan1 hextra.4 none
blacktools:tell $nick $host $hand $chan $chan1 hextra.5 none
}
}

antipub {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantipub.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantipub.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantipub.3 none
}
}

privat {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hprivat.1 none
blacktools:tell $nick $host $hand $chan $chan1 hprivat.2 none
blacktools:tell $nick $host $hand $chan $chan1 hprivat.3 none
}
}

antidle {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantidle.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantidle.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantidle.3 none
}
}


antinotice {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantinotice.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantinotice.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantinotice.3 none
}
}

antictcp {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantictcp.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantictcp.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantictcp.3 none
}
}

antibadword {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantibadword.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantibadword.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantibadword.3 none
}
}

antilongtext {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantilongtext.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantilongtext.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantilongtext.3 none
}
}
 
antibadquitpart {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantibadquitpart.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantibadquitpart.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantibadquitpart.3 none
}
}

antijoinpart {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantijoinpart.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantijoinpart.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantijoinpart.3 none
}
}

antispam {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantispam.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantispam.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantispam.3 none
}
}

antirepeat {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantirepeat.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantirepeat.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantirepeat.3 none
}
}

anticolor {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hanticolor.1 none
blacktools:tell $nick $host $hand $chan $chan1 hanticolor.2 none
blacktools:tell $nick $host $hand $chan $chan1 hanticolor.3 none
}
}

antibold {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantibold.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantibold.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantibold.3 none
}
}

antiunderline {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantiunderline.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantiunderline.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantiunderline.3 none
}
}

anticaps {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hanticaps.1 none
blacktools:tell $nick $host $hand $chan $chan1 hanticaps.2 none
blacktools:tell $nick $host $hand $chan $chan1 hanticaps.3 none
}
}

badfullname {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadfullname.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadfullname.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbadfullname.3 none
}
}

badnick {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadnick.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadnick.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbadnick.3 none
}
}

badident {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadident.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadident.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbadident.3 none
}
}

antichanflood {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantichanflood.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantichanflood.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantichanflood.3 none
}
}

antijoinflood {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hantijoinflood.1 none
blacktools:tell $nick $host $hand $chan $chan1 hantijoinflood.2 none
blacktools:tell $nick $host $hand $chan $chan1 hantijoinflood.3 none
}
}

dr {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hdr.1 none
blacktools:tell $nick $host $hand $chan $chan1 hdr.2 none
blacktools:tell $nick $host $hand $chan $chan1 hdr.3 none
}
}

bot {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbot.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbot.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbot.3 none
}
}


n {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hn.1 none
blacktools:tell $nick $host $hand $chan $chan1 hn.2 none
blacktools:tell $nick $host $hand $chan $chan1 hn.3 none
}
}

id {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hid.1 none
blacktools:tell $nick $host $hand $chan $chan1 hid.2 none
blacktools:tell $nick $host $hand $chan $chan1 hid.3 none
}
}

w {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hw.1 none
blacktools:tell $nick $host $hand $chan $chan1 hw.2 none
blacktools:tell $nick $host $hand $chan $chan1 hw.3 none
}
}

spam {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hspam.1 none
blacktools:tell $nick $host $hand $chan $chan1 hspam.2 none
blacktools:tell $nick $host $hand $chan $chan1 hspam.3 none
}
}


bw {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbw.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbw.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbw.3 none
}
}

badchannel {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hbadchannel.1 none
blacktools:tell $nick $host $hand $chan $chan1 hbadchannel.2 none
blacktools:tell $nick $host $hand $chan $chan1 hbadchannel.3 none
}
}

counter {
if {[matchattr $hand nm|M $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 hcounter.1 none
blacktools:tell $nick $host $hand $chan $chan1 hcounter.2 none
blacktools:tell $nick $host $hand $chan $chan1 hcounter.3 none
}
}

}
}




proc comand:pubme {nick host hand chan arg} {
global botnick wordsdir wdir sdir black seendir count server uptime {server-online}
set arg [split $arg]
set bnick [lindex [split $arg] 0]
set what [lindex [split $arg] 1]
if {([lsearch -exact [string tolower $bnick] [string tolower $botnick]] == 0)} {
switch -exact -- [string tolower $what] {

clear {
if {[matchattr $hand nm|M $chan]} {
set why [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
}
clear:process $nick $host $hand $chan $chan1 $why $type
}
}


private {
if {[matchattr $hand nm|M $chan]} {
set type 1
set chan1 "$chan"
set why [lindex [split $arg] 2]
set user [lindex [split $arg] 3]
set host [lindex [split $arg] 4]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
set user [lindex [split $arg] 4]
set host [lindex [split $arg] 5]
}
private:process $nick $host $hand $chan $chan1 $why $user $host $type
}
}


login {
if {[matchattr $hand nm|MSOAV $chan]} {
putquick "$black(login)"
putquick "MODE $botnick :$black(xmod)"
blacktools:tell:prv $nick $host $hand login.1 $black(chanserv)
}
}

h {
if {[matchattr $hand nm|MSOAV $chan]} {
set chan1 "$chan"
set command [lindex [split $arg] 2]
h:process $nick $host $hand $chan $chan1 $command
}
}

secure {
if {[matchattr $hand nm|M $chan]} {
set what [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[#&]} $what] && [matchattr $hand nm|- $chan]} {
set chan "$what"
set what [lindex [split $arg] 3]
}
secure:process $nick $host $hand $chan $chan1 $what $type
}
}

ignore {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set what [lindex [split $arg] 2]
set mask [lindex [split $arg] 3]
set time [lindex [split $arg] 4]
set reason [join [lrange [split $arg] 5 end]]
if {$what == ""} { blacktools:tell $nick $host $hand $chan $chan1 ignore.2 none
return 0
}
ignore:process $nick $host $hand $chan $chan1 $what $mask $time $reason
}
}



idle {
if {[matchattr $hand nm|M $chan]} {
set char(p) [lindex $black(cmdchar) 0]
set flag "-|f"
set type1 1
set chan1 "$chan"
set why [lindex [split $arg] 2]
set type [lindex [split $arg] 3]
set user [lindex [split $arg] 3]
set host [lindex [split $arg] 4]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
set type [lindex [split $arg] 4]
set user [lindex [split $arg] 4]
set host [lindex [split $arg] 5]
}
antidle:process $why $type $type1 $user $host $nick $hand $chan $chan1
}
}

version {
if {[matchattr $hand nm|MASOV $chan]} {
set chan1 "$chan"
version:process $nick $host $hand $chan $chan1
}
}

cc {
if {[matchattr $hand nm|MASO $chan]} {
set ::chan $chan
set chan1 "$chan"
set c [lindex [split $arg] 2]
if {$c == ""} { blacktools:tell $nick $host $hand $chan $chan1 cc.2 none
return 0
}
if {![regexp {^[\\+!#&]} $c]} {
set c #$c
 } 

putquick "MODE $c"
bind raw - 329 createdpublic
bind raw - 403 nocreatedpublic
}
}

activ {
if {[matchattr $hand nm|MASOV $chan]} {
set type 1
set chan1 "$chan"
set user [lindex [split $arg] 2]
if {[regexp {^[#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
activ:process $nick $host $hand $chan $chan1 $user $type
}
}

delmyhost {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set why [lindex [split $arg] 2]
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 delmyhost.1 none
return 0
}
delmyhost:process $nick $host $hand $chan $chan1 $why
}
}

addmyhost {
if {[matchattr $hand nm|- $chan]} {
set why [lindex [split $arg] 2]
set chan1 "$chan"
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 addmyhost.2 none
return 0
}
addmyhost:process $nick $host $hand $chan $chan1 $why
}
}


leave {
if {[matchattr $hand nm|M $chan]} {
set dir "logs/leave($chan).txt"
set type 1
set chan1 "$chan"
set who [lindex [split $arg] 2]
set leave [join [lrange [split $arg] 3 end]]
set number [lindex [split $arg] 3]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 3]
set leave [join [lrange [split $arg] 4 end]]
set number [lindex [split $arg] 4]
}
leave:process $who $leave $number $type $nick $host $hand $chan $chan1
}
}


greet {
if {[matchattr $hand nm|M $chan]} {
set who [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set greet [join [lrange [split $arg] 3 end]]
set number [lindex [split $arg] 3]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 3]
set greet [join [lrange [split $arg] 4 end]]
set number [lindex [split $arg] 4]
}
greet:process $who $greet $number $type $nick $host $hand $chan $chan1
}
}

chat {
if {[matchattr $hand nm|- $chan]} {
*ctcp:CHAT $nick $host $hand $botnick CHAT $arg
blacktools:tell $nick $host $hand $chan $chan1 chat.1 none
} 
}

seen {
if {[matchattr $hand -|- $chan]} {
if {![channel get $chan seen]} {
return 0
}
set type 1
set wseen [lindex $arg 2]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $wseen] && [matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set chan "$wseen"
set wseen [lindex $arg 3]
}
seen:process $nick $host $hand $chan $chan1 $wseen $type
}
}

topic {
if {[matchattr $hand nm|M $chan]} {
set nop [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set tp [join [lrange [split $arg] 3 end]]
set number [lindex [split $arg] 3]
if {[regexp {^[\\+!#&]} $nop] && [matchattr $hand nm|- $chan]} {
set chan "$nop"
set nop [lindex [split $arg] 3]
set tp [join [lrange [split $arg] 4 end]]
set number [lindex [split $arg] 4]
}
topic:process $nick $host $hand $chan $chan1 $nop $tp $number $type
}
}

limit {
if {[matchattr $hand nm|M $chan]} {
set why [lindex [split $arg] 2]
set lm [lindex [split $arg] 3]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
set lm [lindex [split $arg] 4]
}
limit:process $nick $host $hand $chan $chan1 $why $lm $type
}
}

anunt {
if {[matchattr $hand nm|M $chan]} {
set type 1
set chan1 "$chan"
set who [lindex [split $arg] 2]
set message [join [lrange [split $arg] 3 end]]
set number [lindex [split $arg] 3]
if {[regexp {^[\\+!#&]} $who] && [matchattr $hand nm|- $chan]} {
set chan "$who"
set who [lindex [split $arg] 3]
set message [join [lrange [split $arg] 4 end]]
set number [lindex [split $arg] 4]
}
anunt:process $nick $host $hand $chan $chan1 $who $message $number $type
}
}

bt {
if {[matchattr $hand nm|- $chan]} {
set who [lindex [split $arg] 2]
set chan1 "$chan"
set message [join [lrange [split $arg] 3 end]]
set number [lindex [split $arg] 3]
if {$who == ""} { blacktools:tell $nick $host $hand $chan $chan1 autobroadcast.2 none
return 0
}
broadcast:process $nick $host $hand $chan $chan1 $who $message $number
}
}

badchan {
if {[matchattr $hand nm|M $chan]} {
set why [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set bdchan [join [lindex [split $arg] 3]]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
set bdchan [join [lindex [split $arg] 4]]
}
badchan:process $nick $host $hand $chan $chan1 $why $bdchan $type
}
}

count {
if {[matchattr $hand nm|M $chan]} {
set why [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
}
count:process $nick $host $hand $chan $chan1 $why $type
}
}

delvoice {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
delvoice:process $nick $host $hand $chan $chan1 $user $type
}

}

delop {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
delop:process $nick $host $hand $chan $chan1 $user $type
}

}

addvoice {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
addvoice:process $nick $host $hand $chan $chan1 $user $type
}
}

addop {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
addop:process $nick $host $hand $chan $chan1 $user $type
}
}


addbot {
if {[matchattr $hand nm|- $chan]} {
set why [lindex [split $arg] 2]
set host [lindex [split $arg] 3]
set chan1 "$chan"
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 addbot.2 none
return 0
}
addbot:process $nick $host $hand $chan $chan1 $why $host
}
}

whois {
if {[matchattr $hand nm|MAOS $chan]} {
set chan1 "$chan"
set who [lindex [split $arg] 2]
if {$who == ""} { blacktools:tell $nick $host $hand $chan $chan1 whois.2 none
return 0
}
whois:process $nick $host $hand $chan $chan1 $who
}
}

vers {
if {[matchattr $hand nm|MAOS $chan]} {
set chan1 "$chan"
set why [lindex [split $arg] 2]
if {$why == ""} { blacktools:tell $nick $host $hand $chan $chan1 vers.2 none
return 0
}
vers:process $nick $host $hand $chan $chan1 $why
}
}

time {
if {[matchattr $hand nm|MAOSV $chan]} {
set chan1 "$chan"
set time [ctime [unixtime]]
blacktools:tell $nick $host $hand $chan $chan1 time.1 $time
}
}

ping {
if {[matchattr $hand nm|MAOSV $chan]} {
putquick "PRIVMSG $nick :\001PING [expr {abs([clock clicks -milliseconds])}]\001"
return 0
}
}

us {
if {[matchattr $hand nm|MA $chan]} {
set type 1
set chan1 "$chan"
set users [lindex [split $arg] 2]
if {[regexp {^[#&]} $users] && [matchattr $hand nm|- $chan]} {
set chan "$users"
set users [lindex [split $arg] 3]
}
us:process $nick $host $hand $chan $chan1 $users $type
}
} 

s {
if {[matchattr $hand nm|MA $chan]} {
set type 1
set chan1 "$chan"
set users [lindex [split $arg] 2]
if {[regexp {^[#&]} $users] && [matchattr $hand nm|- $chan]} {
set chan "$users"
set users [lindex [split $arg] 3]
}
s:process $nick $host $hand $chan $chan1 $users $type
}
}

info {
if {[matchattr $hand nm|MASOV $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
info:process $nick $host $hand $chan $chan1 $user $type
}
}

channels {
if {[matchattr $hand nm|MASOV $chan]} {
set chan1 "$chan"
channels:process $nick $host $hand $chan $chan1
}
}


userlist {
if {[matchattr $hand nm|MASOV $chan]} {
set level [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[#&]} $level] && [matchattr $hand nm|- $chan]} {
set chan "$level"
set level [lindex [split $arg] 3]
} 
userlist:execute $hand $host $level $chan $chan1 $nick $type
}
}

chuser {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set chandle [lindex [split $arg] 3]
chuser:process $nick $host $hand $chan $chan1 $user $chandle $type
}
}


delhost {
if {[matchattr $hand nm|M $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set hosts [lrange [split $arg] 3 end]
delhost:process $nick $host $hand $chan $chan1 $user $hosts $type
}
}

botidle {
if {[matchattr $hand nm|M $chan]} {
set chan1 "$chan"
set what [lindex [split $arg] 2]
if {$what == ""} { blacktools:tell $nick $host $hand $chan $chan1 antibotidle.2 none
return 0
}
botidle:process $nick $host $hand $chan $chan1 $what
}
}

addhost {
if {[matchattr $hand nm|M $chan]} {
set type 1
set chan1 "$chan"
set user [lindex [split $arg] 2]
set hosts [lrange [split $arg] 3 end]
addhost:process $nick $host $hand $chan $chan1 $user $hosts $type
}
}

del {
if {[matchattr $hand nm|- $chan]} {
set args [lrange [split $arg] 2 end]
set type 1
set chan1 "$chan"
del:process $nick $host $hand $chan $chan1 $args $type
}
}


delacc {
if {[matchattr $hand nm|MA $chan]} {
set args [lrange [split $arg] 2 end]
set type 1
set chan1 "$chan"
set c [lindex [split $arg] 2]
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 3 end]
}
delacc:process $nick $host $hand $chan $chan1 $args $type
}
}

adduser {
if {[matchattr $hand nm|MA $chan]} {
set chan1 "$chan"
set level [lindex [split $arg] 2]
set args [lrange [split $arg] 3 end]
set c [lindex [split $arg] 3]
set type 1
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 4 end]
}
adduser:process $nick $host $hand $chan $chan1 $args $level $type
}
}

add {
if {[matchattr $hand nm|MA $chan]} {
set level [lindex [split $arg] 2]
set time [ctime [unixtime]]
set type 1
set chan1 "$chan"
set args [lrange [split $arg] 3 end]
set c [lindex [split $arg] 3]
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set args [lrange [split $arg] 4 end]
}
if {[matchattr $hand -|q $chan]} { 
blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
add:process $args $time $level $hand $host $chan $chan1 $nick $type
}
}

unsuspend {
if {[matchattr $hand nm|- $chan]} {
set chans [lindex [split $arg] 2]
set chan1 "$chan"
if {$chans == ""} {blacktools:tell $nick $host $hand $chan $chan1 unsuspend.5 none
return 0 
}

if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
 }
 
if {![validchan $chans]} { blacktools:tell $nick $host $hand $chan $chan1 unsuspend.2 $chans
return 0
}

if {![channel get $chans inactive]} {
blacktools:tell $nick $host $hand $chan $chan1 unsuspend.3 $chans
return 0
}
channel set $chans -inactive
blacktools:tell $nick $host $hand $chan $chan1 unsuspend.4 $chans
}
}



suspend {
if {[matchattr $hand nm|- $chan]} {
set chans [lindex [split $arg] 2]
set chan1 "$chan"
if {$chans == ""} {blacktools:tell $nick $host $hand $chan $chan1 suspend.5 none
return 0 
}

if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
 }

if {![validchan $chans]} { blacktools:tell $nick $host $hand $chan $chan1 suspend.2 $chans
return 0
}

if { [channel get $chans inactive]} {
blacktools:tell $nick $host $hand $chan $chan1 suspend.3 $chans 
return 0
}
channel set $chans +inactive
blacktools:tell $nick $host $hand $chan $chan1 suspend.4 $chans 
}
}


delchan {
if {[matchattr $hand nm|- $chan]} {
set chans [lindex [split $arg] 2]
set chan1 "$chan"
if {$chans == ""} {blacktools:tell $nick $host $hand $chan $chan1 delchan.4 none
return 0 
}
if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none 
return 0
 } 

if {![validchan $chans]} { blacktools:tell $nick $host $hand $chan $chan1 delchan.2 $chans
return 0
}
channel remove $chans
delchan:stats $chans $hand $host
blacktools:tell $nick $host $hand $chan $chan1 delchan.3 $chans
}
}

addchan {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set chans [lindex [split $arg] 2]
if {$chans == ""} {blacktools:tell $nick $host $hand $chan $chan1 addchan.4 none
return 0 
}

if {![regexp {^[\\+!#&]} $chans]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
return 0
 } 

if {[validchan $chans]} {
blacktools:tell $nick $host $hand $chan $chan1 addchan.2 $chans
return 0
} else {
channel add $chans
addchan:stats $chans $hand $host
blacktools:tell $nick $host $hand $chan $chan1 addchan.3 $chans
}
}
}

die {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
blacktools:tell $nick $host $hand $chan $chan1 die.1 none
utimer 3 [list die "byeeee"]
}
}

jump {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set serv [lindex [split $arg] 2]
blacktools:tell $nick $host $hand $chan $chan1 jump.1 none
utimer 3 [list jump $serv]
}
}


save {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
blacktools:tell $nick $host $hand $chan $chan1 save.1 none
 save
}
}

restart {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
blacktools:tell $nick $host $hand $chan $chan1 restart.1 none
 utimer 3 [list restart]
}
}

rehash {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
blacktools:tell $nick $host $hand $chan $chan1 rehash.1 none
 rehash
}
}

nick {
if {[matchattr $hand nm|- $chan]} {
set who "$nick"
set newnick [lindex [split $arg] 2]
nick:process $who $newnick $host $hand $chan
}
}



msg {
if {[matchattr $hand nm|- $chan]} {
set nicks [lindex [split $arg] 2]
set chan1 "$chan"
set msg [join [lrange [split $arg] 3 end]]
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$nicks == ""} {blacktools:tell $nick $host $hand $chan $chan1 msg.2 none
return 0
}
if {[isbotnick $nicks]} { 
return 0
 }
putquick "PRIVMSG $nicks :$msg"
}
}


silence {
if {[matchattr $hand nm|- $chan]} {
set value [lindex [split $arg] 2]
set chan1 "$chan"
if {$value == ""} { blacktools:tell $nick $host $hand $chan $chan1 silence.2 none
return 0
}
silence:process $nick $host $hand $chan $chan1 $value
}
}

set {
if {[matchattr $hand nm|M $chan]} {
set flags [lindex [split $arg] 2]
set type [join [lrange [split $arg] 3 end]]
set type1 1
set chan1 "$chan"
if {[regexp {^[#&]} $flags] && [matchattr $hand nm|- $chan]} {
set chan "$flags"
set flags [lindex [split $arg] 3]
set type [join [lrange [split $arg] 4 end]]
}
set:process $nick $host $hand $chan $chan1 $flags $type $type1
}
}

mode {
if {[matchattr $hand nm|OSMA $chan]} {
set modes [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[#&]} $modes] && [matchattr $hand nm|- $chan]} {
set chan "$modes"
set modes [lindex [split $arg] 3]
}
mode:process $nick $host $hand $chan $chan1 $modes $type
}
}

away {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set aw [join [lrange [split $arg] 2 end]]
if {$aw == "" } {blacktools:tell $nick $host $hand $chan $chan1 away.2 none
return 0
}
away:process $nick $host $hand $chan $chan1 $aw
}
}

cycle {
if {[matchattr $hand nm|OSMA $chan]} {
set reason [join [lrange [split $arg] 2 end]]
set c [lindex [split $arg] 2]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set reason [join [lrange [split $arg] 3 end]]
}
cycle:process $nick $host $hand $chan $chan1 $reason
}
}


purge {
if {[matchattr $hand nm|M $chan]} {
set reason [join [lrange [split $arg] 2 end]]
set chan1 "$chan"
if {$reason == ""} {
blacktools:tell $nick $host $hand $chan $chan1 purge.1 none
return 0
}
purge:process $nick $host $hand $chan $chan1 $reason
}
}


check {
if {[matchattr $hand nm|OSMA $chan]} {
set chan1 "$chan"
set checked [lindex [split $arg] 2]
if {$checked == ""} { blacktools:tell $nick $host $hand $chan $chan1 check.2 none
return 0
}
check:process $nick $host $hand $chan $chan1 $checked
}
}

broadcast {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set text [join [lrange [split $arg] 2 end]]
if {$text == ""} { 
blacktools:tell $nick $host $hand $chan $chan1 broadcast.2 none
return 0
}
broadcast:cmd:process $nick $host $hand $chan $chan1 $text
}
}

act {
if {[matchattr $hand nm|SMA $chan]} {
set text [join [lrange [split $arg] 2 end]]
set c [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set text [join [lrange [split $arg] 3 end]]
}
act:process $nick $host $hand $chan $chan1 $text $type
}
}


say {
if {[matchattr $hand nm|SMA $chan]} {
set text [join [lrange [split $arg] 2 end]]
set c [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set text [join [lrange [split $arg] 3 end]]
}
say:process $nick $host $hand $chan $chan1 $text $type
}
}

v {
if {[matchattr $hand nm|VOSMA $chan]} {
set voicex [lrange $arg 2 end]
set c [lindex [split $arg] 2]
set nick [split $nick]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set voicex [lrange $arg 3 end]
}
v:process $nick $host $hand $chan $chan1 $voicex
}
}

o {
if {[matchattr $hand nm|OSMA $chan]} {
set opex [lrange $arg 2 end]
set c [lindex [split $arg] 2]
set nick [split $nick]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set opex [lrange $arg 3 end]
}
o:process $nick $host $hand $chan $chan1 $opex
}
}

uptime {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
set up [duration [expr [unixtime] - $uptime]]
set on [duration [expr [unixtime] - ${server-online}]]
blacktools:tell $nick $host $hand $chan $chan1 status.1 $up
blacktools:tell $nick $host $hand $chan $chan1 status.2 $server
blacktools:tell $nick $host $hand $chan $chan1 status.3 $on
}
}

status {
if {[matchattr $hand nm|- $chan]} {
set chan1 "$chan"
regsub -all " " [channels] ", " chans
catch {exec uptime} shelluptime
set up [duration [expr [unixtime] - $uptime]]
set on [duration [expr [unixtime] - ${server-online}]]
blacktools:tell $nick $host $hand $chan $chan1 status.1 $up
blacktools:tell $nick $host $hand $chan $chan1 status.2 $server
blacktools:tell $nick $host $hand $chan $chan1 status.3 $on
blacktools:tell $nick $host $hand $chan $chan1 status.4 $chans
blacktools:tell $nick $host $hand $chan $chan1 status.5 $shelluptime
}
}

t {
if {[matchattr $hand nm|VOSMA $chan]} {
set topics [join [lrange [split $arg] 2 end]]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $topics] && [matchattr $hand nm|- $chan]} {
set chan "$topics"
set topics [join [lrange [split $arg] 3 end]]
}
t:process $nick $host $hand $chan $chan1 $topics $type
}
}

d {
if {[matchattr $hand nm|SMA $chan]} {
set days [lindex [split $arg] 2]
set dnick [lindex [split $arg] 3]
set type 1
set mask [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
set handle [nick2hand $dnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $days] && [matchattr $hand nm|- $chan]} {
set chan "$days"
set days [lindex [split $arg] 3]
set mask [lindex [split $arg] 4]
set dnick [lindex [split $arg] 4]
set reason [join [lrange [split $arg] 5 end]]
if {![regexp {^[0-9]} $days]} {
set days 1
set mask [lindex [split $arg] 3]
set dnick [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
} 
}
if {![regexp {^[0-9]} $days]} {
set days 1
set mask [lindex [split $arg] 2]
set dnick [lindex [split $arg] 2]
set reason [join [lrange [split $arg] 3 end]]
}
d:process $dnick $mask $days $reason $nick $hand $host $chan $chan1 $type
}
}

sb {
if {[matchattr $hand nm|VOSMA $chan]} {
set bhost [string tolower [lindex [split $arg] 2]]
set what [lindex [split $arg] 3]
set type 1
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bhost] && [matchattr $hand nm|- $chan]} {
set chan "$bhost"
set bhost [string tolower [lindex [split $arg] 3]]
set what [lindex [split $arg] 4]
}
sb:process $bhost $what $nick $hand $host $chan $chan1 $type
}
}

ub {
if {[matchattr $hand nm|OSMA $chan]} {
set ban [lindex [split $arg] 2]
set why [lindex [split $arg] 3]
set type 1
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $ban] && [matchattr $hand nm|- $chan]} {
set chan "$ban"
set ban [lindex [split $arg] 3]
}
ub:process $ban $why $nick $hand $host $chan $chan1 $type
}

}

bw {
if {[matchattr $hand nm|OSMA $chan]} {
set abuser [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set handle [nick2hand $abuser]
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $abuser] && [matchattr $hand nm|- $chan]} {
set chan "$abuser"
set abuser [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
}
bw:process $abuser $mask $nick $hand $host $chan $chan1 $type
}
}

stick {
if {[matchattr $hand nm|SMA $chan]} {
set snick [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type 1
set time [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
set handle [nick2hand $snick]
set list [userlist $black(exceptflags) $chan]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $snick] && [matchattr $hand nm|- $chan]} {
set chan "$snick"
set time [lindex [split $arg] 4]
set mask [lindex [split $arg] 3]
set snick [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 5 end]]
if {![regexp {^[0-9]} $time]} {
set time "$black(dfstickbantime)"
set reason [join [lrange [split $arg] 4 end]]
}
}
if {![regexp {^[0-9]} $time]} {
set time "$black(dfstickbantime)"
set reason [join [lrange [split $arg] 3 end]]
}
stick:process $snick $mask $time $reason $nick $hand $host $chan $chan1 $type
}
}


k {
if {[matchattr $hand nm|VOSMA $chan]} {
set knick [lindex [split $arg] 2]
set type 1
set reason [join [lrange [split $arg] 3 end]]
set handle [nick2hand $knick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $knick] && [matchattr $hand nm|- $chan]} {
set chan "$knick"
set knick [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
}
k:process $knick $nick $hand $host $reason $chan $chan1 $type
}
}

spam {
if {[matchattr $hand nm|OSMA $chan]} {
set spammer [lindex [split $arg] 2]
set type 1
set mask [lindex [split $arg] 2]
set handle [nick2hand $spammer]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $spammer] && [matchattr $hand nm|- $chan]} {
set chan "$spammer"
set spammer [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
}
spam:process $spammer $mask $nick $hand $host $chan $chan1 $type
}
}

w {
if {[matchattr $hand nm|OVSMA $chan]} {
set wnick [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set handle [nick2hand $wnick]
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $wnick] && [matchattr $hand nm|- $chan]} {
set chan "$wnick"
set wnick [lindex [split $arg] 3]
}
w:process $wnick $nick $hand $host $chan $chan1 $type
}
}

black {
if {[matchattr $hand nm|SMA $chan]} {
set blnick [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type 1
set reason [join [lrange [split $arg] 3 end]]
set handle [nick2hand $blnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $blnick] && [matchattr $hand nm|- $chan]} {
set chan "$blnick"
set blnick [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
}
black:process $blnick $nick $mask $hand $host $chan $chan1 $reason $type
}
}


bl {
if {[matchattr $hand nm|SMA $chan]} {
set blnick [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set reason [join [lrange [split $arg] 3 end]]
set handle [nick2hand $blnick]
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $blnick] && [matchattr $hand nm|- $chan]} {
set chan "$blnick"
set blnick [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
set reason [join [lrange [split $arg] 4 end]]
}
black:process $blnick $nick $mask $hand $host $chan $chan1 $reason $type
}
}



id {
if {[matchattr $hand nm|OSMA $chan]} {
set idnick [lindex [split $arg] 2]
set handle [nick2hand $idnick]
set type 1
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $idnick] && [matchattr $hand nm|- $chan]} {
set chan "$idnick"
set idnick [lindex [split $arg] 3]
}
id:process $idnick $nick $hand $host $chan $chan1 $type
}
}

bot {
if {[matchattr $hand nm|OSMA $chan]} {
set bot [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bot] && [matchattr $hand nm|- $chan]} {
set chan "$bot"
set bot [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
}
bot:process $bot $mask $nick $hand $host $chan $chan1 $type
}
}

dr {
if {[matchattr $hand nm|OSMA $chan]} {
set drone [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set type "1"
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $drone] && [matchattr $hand nm|- $chan]} {
set chan "$drone"
set drone [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
}
dr:process $drone $mask $nick $hand $host $chan $chan1 $type
}
}

b {
if {[matchattr $hand nm|OSMA $chan]} {
set bnick [lindex [split $arg] 2]
set mask [lindex [split $arg] 2]
set time [lindex [split $arg] 3]
set type 1
set chan1 "$chan"
set type1 [lindex [split $arg] 3]
set type2 [lindex [split $arg] 4]
set reason [join [lrange [split $arg] 4 end]] 
set handle [nick2hand $bnick]
if {[string match -nocase "global" $type1] || [string match -nocase "global" $type2]  && [matchattr $hand nm|- $chan]} {
if {[string match -nocase $type1 "global"]} {
set reason [join [lrange [split $arg] 4 end]]
}
if {[string match -nocase $type2 "global"]} {
set reason [join [lrange [split $arg] 5 end]]
}
set list [userlist nm|-]
foreach user $list {
 set hosts [getuser $user hosts]
foreach host $hosts {
if {[string match $mask $host]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}
}
}
if {[matchattr $handle nm|- $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noban none
 return 0
}

if {![regexp {^[0-9]} $time]} {
set reason [join [lrange [split $arg] 4 end]]
set time "$black(btime)"
}
if {$reason == ""} {set reason1 "(GLOBAL) $black(dfreason)"
 } else { set reason1 "(GLOBAL) $reason" }

if {[channel get $chan showhandle]} {
set reason "($hand) $reason1"
} else { set reason "$reason1" 
}

if {[isbotnick $bnick]} {
return 0
}
if {![botisop $chan]} {
blacktools:tell $nick $host $hand $chan $chan1 gl.noop none
return 0
}
if {$mask == "*!*@*"} {
 return 0
}
if {[onchan $bnick $chan]} {
set mask *!*@[lindex [split [getchanhost $bnick $chan] "@"] 1] 
}
newban $mask $hand $reason $time
if {$time == "0"} { set reply "Permanent" } else { set reply "$time" }
blacktools:tell $nick $host $hand $chan $chan1 b.8 "$mask $reply"
return 0
}
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bnick] && [matchattr $hand nm|- $chan]} {
set chan "$bnick"
set bnick [lindex [split $arg] 3]
set mask [lindex [split $arg] 3]
set time [lindex [split $arg] 4]
set reason [join [lrange [split $arg] 5 end]]
if {![regexp {^[0-9]} $time]} {
set reason [join [lrange [split $arg] 4 end]]
set time "$black(btime)"
}
}
if {![regexp {^[0-9]} $time]} {
set reason [join [lrange [split $arg] 3 end]]
set time "$black(btime)"
}
b:local $bnick $mask $time $nick $reason $hand $host $chan $chan1 $type
}
}


n {
if {[matchattr $hand nm|OSMA $chan]} {
set bnick [lindex [split $arg] 2]
set type 1
set handle [nick2hand $bnick]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $bnick] && [matchattr $hand nm|- $chan]} {
set chan "$bnick"
set bnick [lindex [split $arg] 3]
}
n:process $bnick $nick $hand $host $chan $chan1 $type
}
}

gag {
if {[matchattr $hand nm|OSMA $chan]} {
set gagger [lindex [split $arg] 2]
set type 1
set handle [nick2hand $gagger]
set chan1 "$chan"
foreach c [channels] {
set backchan [channel get $c backchan]
if {[string match -nocase $chan $backchan] && [channel get $c chanreport]} {
set chan "$c"
}
}
if {[regexp {^[\\+!#&]} $gagger] && [matchattr $hand nm|- $chan]} {
set chan "$gagger"
set gagger [lindex [split $arg] 3]
}
gag:process $gagger $nick $hand $host $chan $chan1 $type
}
}

l {
if {[matchattr $hand nm|OSMA $chan]} {
set times [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $times] && [matchattr $hand nm|- $chan]} {
set chan "$times"
set times [lindex [split $arg] 3]
}
l:process $nick $host $hand $chan $chan1 $times $type
}
}

ul {
if {[matchattr $hand nm|OSMA $chan]} {
set c [lindex [split $arg] 0]
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
ul:process $nick $host $hand $chan $chan1
}
}

show {
if {[matchattr $hand nm|OSMA $chan]} {
set wich [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[#&]} $wich] && [matchattr $hand nm|- $chan]} {
set chan "$wich"
set wich [lindex [split $arg] 3]
}
show:process $nick $host $hand $chan $chan1 $wich $type
}
}

reset {
if {[matchattr $hand nm|M $chan]} {
set dece [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[#&]} $dece] && [matchattr $hand nm|- $chan]} {
set chan "$dece"
set dece [lindex [split $arg] 3]
}
reset:process $nick $host $hand $chan $chan1 $dece $type
}
}

clonescan {
if {[matchattr $hand nm|M $chan]} {
set c [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
scanner:process $nick $host $hand $chan $chan1
}
}

top {
if {[matchattr $hand nm|AOSM $chan]} {
set cmd [lindex [split $arg] 2]
set del [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[#&]} $cmd] && [matchattr $hand nm|- $chan]} {
set chan "$cmd"
set cmd [lindex [split $arg] 3]
set del [lindex [split $arg] 3]
}
top:process $nick $host $hand $chan $chan1 $cmd $type $del
}
}

banlist {
if {[matchattr $hand nm|AOSM $chan]} {
set user [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
if {[regexp {^[\\+!#&]} $user] && [matchattr $hand nm|- $chan]} {
set chan "$user"
set user [lindex [split $arg] 3]
}
banlist:process $nick $host $hand $chan $chan1 $user $type
}
}

stats {
if {[matchattr $hand nm|AOSM $chan]} {
set chan1 "$chan"
set c [lindex [split $arg] 2]
if {[regexp {^[#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
}
stats:process $nick $host $hand $chan $chan1
}
}

myset {
if {[matchattr $hand nm|VAOSM $chan]} {
set chan1 "$chan"
set flags [lindex [split $arg] 2]
set type [lindex [split $arg] 3]
if {$type == ""} {
blacktools:tell $nick $host $hand $chan $chan1 myset.4 none
return 0
}
myset:process $nick $host $hand $chan $chan1 $flags $type
}
}

i {
if {[matchattr $hand nm|VAOSM $chan]} {
set type 1
set chan1 "$chan"
set inick [lrange [split $arg] 2 end]
set c [lindex [split $arg] 2]
if {[regexp {^[\\+!#&]} $c] && [matchattr $hand nm|- $chan]} {
set chan "$c"
set inick [join [lrange [split $arg] 3 end]]
}
i:process $nick $host $hand $chan $chan1 $inick $type
}
}

addinfo {
if {[matchattr $hand nm|VAOSM $chan]} {
set info [join [lrange [split $arg] 2 end]]
set chan1 "$chan"
if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan1 gl.suspend none
return 0
}
if {$info == ""} { 
blacktools:tell $nick $host $hand $chan $chan1 addinfo.2 none
return 0
}
addinfo:process $nick $host $hand $chan $chan1 $info
}
}

badword {
if {[matchattr $hand nm|M $chan]} {
set why [lindex [split $arg] 2]
set type 1
set chan1 "$chan"
set bdword [lrange [split $arg] 3 end]
set bdnumber [lindex [split $arg] 3]
if {[regexp {^[\\+!#&]} $why] && [matchattr $hand nm|- $chan]} {
set chan "$why"
set why [lindex [split $arg] 3]
set bdnumber [lindex [split $arg] 4]
set bdword [lrange [split $arg] 4 end]
}
antibadword:command:process $nick $host $hand $chan $chan1 $why $bdword $bdnumber $type
}
}




}
}
}


putlog "$black(name) $black(vers) by $black(author) Loaded -> BLaCkShaDoW ProductionS ®"