# $Id: voiceserv.tcl, v6.75.b eggdrop-1.6.18 2007/08/06 10:35:42 Exp $ #TCL Modificada para o #macae =) # Begin - VoiceServ v6.75.b [voiceserv.tcl] # Build date: 13th July 2007 # Last modified: 14th August 2007 # Copyright 1998-2007 awyeah (awesomeawyeah@gmail.com) # This TCL script is designed to work with eggdrop v1.6.17 or higher ######################################################################### # VoiceServ v6.75.b # # # # # # Author: awyeah 14th August 2007 # # Email: awesomeawyeah@gmail.com Build version 6.75.b # ######################################################################### # # # ####### # # PURPOSE # # ####### # # # # This script is a replica of ChanServ services on DALnet providing # # Auto-voice (AOv) and Super-voice (SOv) status to users, similar as # # AOp and SOp with different access levels. # # # # This script auto voices AOv's and SOv's on join and serves as an # # auto-voice script with two different access levels. # # # ######################################################################### # # # ######## # # FEATURES # # ######## # # # # (1) Auto-voice (AOv) and Super-voice (SOv) access levels for every # # user and every specific channel stored in a database. # # # # (2) Autovoice for bot owners and bot masters: # # (*) On channel join # # (*) On channel message # # (*) On channel action # # (*) On channel notice # # (*) On devoice # # # # (3) Autovoice for SOv users: # # (*) On channel join # # (*) On devoice # # # # (4) Autovoice for AOv users on channel join. # # # # (5) Customizable channel trigger for commands. # # # ######################################################################### # # # ############ # # REQUIREMENTS # # ############ # # # # The following requirements must be taken into consideration before # # utilizing this script further: # # # # (Fields marked with a '*' are compulsory requirements) # # # # (*) (1) You must be running EGGDROP v1.6.17 or higher. # # (*) (2) You must have TCL v8.4 or higher installed on the system. # # # # To FIND the TCL VERSION and PATCH LEVEL your shell is running: # # (1) At your shell prompt type: tclsh # # (a) If you have several different versions of tcl installed # # on the system, pick the latest version. E.g: tclsh8.3, # # tclsh8.4 which is installed from the given list. # # (i) At shell prompt type: tclsh8.4 (and go to step 2) # # (b) If you have only one version, pick that one or continue # # with 'tclsh' only if it doesn't say to use another name. # # (2) To find your tcl version type: info tclversion # # (3) To exit tclsh, type: exit # # # ######################################################################### # # # ############ # # INSTALLATION # # ############ # # # # This quick installation tutorial consists of 5 steps. Please follow # # all steps correctly in order to setup your script. # # # # (1) Upload the file voiceserv.tcl in your eggdrop '/scripts' folder # # along with your other TCL scripts. # # # # (2) OPEN your eggdrops configuration (.conf) file and add a link at # # the bottom of the configuration file to the path of drone nick # # remover script, it would be: # # # # source scripts/voiceserv.tcl # # # # # # (3) SAVE your bots configuration file. # # # # (4) OPEN voiceserv.tcl and start configuring variables for the # # script. (START FROM: 'Start configuring variables from here!' # # END AT: 'Congratulations! Script configuration is now complete') # # # # (5) RESTART your bot and start logging verbose notices! # # # ######################################################################### # # # ######## # # VERSIONS # # ######## # # # # v6.75.b - Added a VERBOSE option similar to ChanServ verbose which # # (14/08/07) displays an OPNOTICE to channel ops for any AOv/SOv # # access list modification. # # # # v6.28.b - Added a public trigger !help command for people with # # (06/08/07) access to check list of avialable commands to use. # # - Added auto voicing for bot master and bot owner. # # - Fixed errors in the proc master:on:devoice. # # - Fixed the nick2hand arg handler for matchattr. # # - Corrected the help messages in procs aov:on:add and # # sov:on:add. # # - Added separate checks for bot master and bot owner flags # # on join. # # - Updated description of script commands. # # - Replaced putserv statements with puthelp for delayed # # queuing, preventing the bot from getting excess flood. # # # # v4.76.b - First public release. # # (13/07/07) # # # ######################################################################### # # # ######## # # CONTACTS # # ######## # # # # (*) For any suggestions, comments, questions or bugs reports, feel # # free to email me at: # # # # awesomeawyeah@gmail.com # # # # # # (*) You can also contact me on MSN Messenger - my messenger ID is: # # # # awyeah@awyeah.org # # # # # # (*) You can also catch me on The DALnet Network: # # # # /server irc.dal.net:6667, Nick: awyeah # # Channels: #awyeah, #eggdrops # # # # # # NOTE: I have a lot of people bothering me for scripts, which they # # haven't configured properly themselves. So please read ALL the # # comments provided while configuring the script and make sure # # you follow the same standard formats as of the examples when # # you are setting and configurating the scripts variables. # # # ######################################################################### # # # ######### # # COPYRIGHT # # ######### # # # # This program is a free software; you can distribute it under the # # terms of the GNU General Public License under Section 1 as published # # by the Free Software Foundation; either version 2 of the license, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # WARNING: # # This program is protected by copyright law and international # # treaties. Unauthorized reproduction of this program, or any portion # # of it, may result in severe civil penalties and will be prosecuted to # # the maximum extent possible under the law. # # # ######################################################################### # # # ######### # # DOWNLOADS # # ######### # # # # Latest versions of this script can be found on the TCL archives of # # the following websites: # # # # 1) http://www.egghelp.org/ # # 2) http://www.tclscript.com/ # # 3) http://channels.dal.net/awyeah/scripts/ # # # ######################################################################### ############################################################ # PLEASE READ THE INSTRUCTIONS CAREFULLY BEFORE PROCEEDING # ############################################################ # # # This script has no settings for channels to work on. # # Which ever channels you add AOv's and SOv's on this # # script will automatically work on those channels, # # provided the bot is on those channels. # # # # NOTE: Only a bot owner or a user with flags (m,n) can # # add or delete an SOv and wipe the SOv list. # # # ############################################################ # # # COMMANDS FOR DIFFERENT ACCESS LEVELS # # (All triggers are for channels) # # # ############################################################ # # # [1] Bot master (flags: m|n) # # # # [*] SOv commands available: # # (-) !sov # # (-) !sov list # # (-) !sov wipe # # # # [*] AOv commands available: # # (-) !aov # # (-) !aov list # # (-) !aov wipe # # # # [*] Other commands: # # (-) !count (displays the number of AOv's and SOV's) # # (-) !help (displays help for commands) # # # ############################################################ # # # [2] SOv (Super-voice) # # # # [*] SOv commands available: # # (-) !sov (deletes SOv's own access) # # (-) !sov list # # # # [*] AOv commands available: # # (-) !aov # # (-) !aov list # # # # [*] Other commands: # # (-) !count (displays the number of AOv's and SOV's) # # (-) !help (displays help for commands) # # # ############################################################ # # # [3] AOv (Auto-voice) # # # # [*] SOv commands available: # # (-) !sov list # # # # [*] AOv commands available: # # (-) !aov (deletes AOV's own access) # # (-) !aov list # # # # [*] Other commands: # # (-) !count (displays the number of AOv's and SOV's) # # (-) !help (displays help for commands) # # # ############################################################ # # # EXPLAINATION OF COMMANDS # # # ############################################################ # # # AOV: Auto-voice access # # # # SOV: Super-voice access # # # # ADD: Adds an entry into an access (AOv or SOv) list of # # a specific channel # # # # DEL: Deletes an entry from an access (AOv or SOv) list # # of a specific channel # # # # LIST: Lists all entries of an access (AOv or SOv) list # # for a specific channel # # # # WIPE: Removes all entries of an access (AOv or SOv) list # # for a specific channel # # # ############################################################ ############################################## ### Start configuring variables from here! ### ############################################## #Set the trigger here you wish to use for triggering the commands. #USAGE: Can use any trigger (e.g: "!", ".", "~", "@") set voiceserv(trigger) "!" #Set the location where the AOv and SOv database files should be stored. #USAGE: To use your main eggdrop directory set this to: {} #USAGE: To use your eggdrop scripts directory: "/scripts" ################################################################ #(If you do not know how to edit this setting leave it as it is) set voiceserv(files) "scripts/" #Toggle this option ON or OFF if you wish to display VERBOSE notices to channel #ops (similar to ChanServ VERBOSE) for any AOv/SOv access list modification. #USAGE: [0/1] (0=OFF, 1=ON) #set voiceserv(verbose) "1" ############################################################# ### Congratulations! Script configuration is now complete ### ############################################################# set aov "$voiceserv(files)aov.db" set sov "$voiceserv(files)sov.db" if {![file exists $aov]} { set fp [open $aov w] close $fp } if {![file exists $sov]} { set fp [open $sov w] close $fp } set voiceserv(auth) "\x61\x77\x79\x65\x61\x68" set voiceserv(ver) "v6.75.b" bind pub - "$voiceserv(trigger)voice" aov:do #bind pub - "$voiceserv(trigger)sov" sov:do bind pub - "$voiceserv(trigger)count" count:do bind pub - "$voiceserv(trigger)help" help:do bind join - "*" aov:on:join #bind join - "*" sov:on:join #bind mode - "*" sov:on:devoice #bind join - "*" master:on:join bind pubm - "*" master:on:msg #bind ctcp - ACTION master:on:act #bind notc - "*" master:on:notc #bind mode - "*" master:on:devoice proc aov:do {nick uhost hand chan arg} { global aov sov set arg [split $arg] set chan [string tolower $chan] set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } switch -exact [string tolower [lindex $arg 0]] { "add" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if access level is aov or below stop if {![info exists founder:ok] && ![info exists sov:ok] && [info exists aov:ok]} { puthelp "NOTICE $nick :You do not have access to modify the AOv list of \002$chan\002." return 0 } if {[lindex $arg 1] == ""} { puthelp "NOTICE $nick :Usage: !aov " return 0 } #check if argument contains nick from same user if {[string equal -nocase "[lindex $arg 1]:$chan" $nick:$chan]} { #check if user is in sov list foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:found 1; break } } #check if user is in aov list if {[info exists sov:found]} { foreach person $aovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set aov:found 1; break } } #if user in in sov list and not in aov list and argument contains nick from same user if {![info exists aov:found]} { #change access for user from sov to aov #del from sov list set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $sovdel]] [split $user]] set sovdel [lsort -unique [lreplace $sovdel $i $i]] set fp [open $sov w] puts $fp [join $sovdel "\n"] close $fp #add to aov list set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovadd [split $data "\n"] lappend aovadd [lindex $arg 1]:$chan set aovadd [lsort -unique $aovadd] set fp [open $aov w] puts $fp [join $aovadd "\n"] close $fp puthelp "NOTICE $nick :Access level for \002[lindex $arg 1]\002 on \002$chan\002 has been changed from SOv to AOv." putserv "NOTICE @$chan \002$nick\002!$uhost => aov $chan add [lindex $arg 1]" #utimer 2 [list sov:to:aov [lindex $arg 1] $chan] return 0 } } } #check if aov not in list foreach person $aovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set aov:user 1; break } } #if user is founder or sov if {[info exists founder:ok] || [info exists sov:ok]} { #if aov in list stop if {[info exists aov:user]} { puthelp "NOTICE $nick :\002[lindex $arg 1]\002 already exists on the AOv list of \002$chan\002." return 0 #if aov not in list then add into list } else { set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovadd [split $data "\n"] lappend aovadd [lindex $arg 1]:$chan set aovadd [lsort -unique $aovadd] set fp [open $aov w] puts $fp [join $aovadd "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully added to the AOv list of \002$chan\002." putserv "NOTICE @$chan :\002$nick\002!$uhost => aov $chan add [lindex $arg 1]" utimer 2 [list aov:on:add [lindex $arg 1] $chan] return 0 } } } "del" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if access level not founder, sov or aov, then stop if {![info exists founder:ok] && ![info exists sov:ok] && ![info exists aov:ok]} { puthelp "NOTICE $nick :You do not have access to modify the AOv list of \002$chan\002." return 0 } if {[lindex $arg 1] == ""} { if {[info exists aov:ok]} { puthelp "NOTICE $nick :Usage: !aov [string tolower $nick]" return 0 } elseif {[info exists founder:ok] || [info exists sov:ok]} { puthelp "NOTICE $nick :Usage: !aov " return 0 } } #check if access level is aov foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:user 1; break } } #user has aov access if {[info exists aov:user]} { #if argument contains same nick as user if {[string equal -nocase "[lindex $arg 1]:$chan" $nick:$chan]} { #del nick from aov list set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $aovdel]] [split $user]] set aovdel [lsort -unique [lreplace $aovdel $i $i]] set fp [open $aov w] puts $fp [join $aovdel "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully removed from the AOv list of \002$chan\002." putserv "NOTICE @$chan :\002$nick\002!$uhost => aov $chan del [lindex $arg 1]" utimer 2 [list aov:on:del [lindex $arg 1] $chan] return 0 } else { puthelp "NOTICE $nick :You do not have access to modify the AOv list of \002$chan\002." return 0 } } #check if user is in sov or founder foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:found 1; break } } #if user has sov or founder access level if {[info exists sov:found] || [matchattr $hand o|o $chan]} { #check if aov is in list or not foreach person $aovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set aov:found 1; break } } #if aov is not in list stop if {![info exists aov:found]} { puthelp "NOTICE $nick :\002[lindex $arg 1]\002 was not found in the AOv list of \002$chan\002." return 0 #if aov is in list then delete } else { set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $aovdel]] [split $user]] set aovdel [lsort -unique [lreplace $aovdel $i $i]] set fp [open $aov w] puts $fp [join $aovdel "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully removed from the AOv list of \002$chan\002." putserv "NOTICE @$chan :o \002$nick\002!$uhost => aov $chan del [lindex $arg 1]" utimer 2 [list aov:on:del [lindex $arg 1] $chan] return 0 } } } "list" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if user has no access level (founder, sov, or aov) then stop if {![info exists founder:ok] && ![info exists sov:ok] && ![info exists aov:ok]} { puthelp "NOTICE $nick :You do not have access to view the AOv list of \002$chan\002." return 0 } #if user has any access level then show aov list #create new list for channel aovs set chanaovlist [list] foreach user $aovlist { if {[string equal -nocase $chan [lindex [split $user :] 1]]} { lappend chanaovlist [lindex [split $user :] 0] } } #if aov list is empty if {[llength $chanaovlist] == "0"} { puthelp "NOTICE $nick :The AOv list of \002$chan\002 is empty." return 0 } #if aov list is not empty puthelp "NOTICE $nick :AOv list for \002$chan\002" if {[llength $chanaovlist] <= "6"} { puthelp "NOTICE $nick :Autovoices: [join $chanaovlist ", "]" } else { set nlist [list] foreach x $chanaovlist { lappend nlist $x if {[llength $nlist] == "6"} { puthelp "NOTICE $nick :Autovoices: [join $nlist ", "]" set nlist [list] } } if {[llength $nlist] != ""} { puthelp "NOTICE $nick :Autovoices: [join $nlist ", "]" set nlist [list] } } puthelp "NOTICE $nick :End of list." return 0 } "wipe" { set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovwipe [split $data "\n"] #if not founder stop if {![matchattr $hand o|o $chan]} { puthelp "NOTICE $nick :You do not have access to wipe the AOv list of \002$chan\002." return 0 #if user is founder wipe aov list } else { set newaovlist [list] foreach user $aovwipe { if {![string equal -nocase "[lindex [split $user :] 1]" $chan]} { lappend newaovlist $user } } set aovlist [lsort -unique $newaovlist] set fp [open $aov w] puts $fp [join $aovlist "\n"] close $fp puthelp "NOTICE $nick :The AOv list of \002$chan\002 has been wiped." putserv "NOTICE @$chan :o \002$nick\002!$uhost => aov $chan wipe" return 0 } } default { if {[llength $arg] == "1"} { if {[info exists founder:ok] || [info exists sov:ok]} { if {[string equal -nocase "add" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !aov "; return 0 } elseif {[string equal -nocase "del" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !aov "; return 0 } } elseif {[info exists aov:ok]} { if {[string equal -nocase "add" [lindex $arg 0]]} { puthelp "NOTICE $nick :You do not have access to modify the SOp list of \002$chan\002."; return 0 } elseif {[string equal -nocase "del" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !aov del [string tolower $nick]"; return 0 } } else { puthelp "NOTICE $nick :You must be an AOv on \002$chan\002 to perform this command."; return 0 } } elseif {[llength $arg] == "0"} { if {[info exists founder:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !aov " puthelp "NOTICE $nick :Usage: !aov list" #puthelp "NOTICE $nick :Usage: !aov wipe" return 0 } elseif {[info exists sov:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !aov " puthelp "NOTICE $nick :Usage: !aov list" return 0 } elseif {[info exists aov:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !aov del [string tolower $nick]" puthelp "NOTICE $nick :Usage: !aov list" return 0 } else { puthelp "NOTICE $nick :You must be an AOv on \002$chan\002 to perform this command." return 0 } } } } } proc aov:on:join {nick uhost hand chan} { global aov set chan [string tolower $chan] if {![isbotnick $nick] && [botisop $chan] && ![isvoice $nick $chan]} { set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:found 1; break } } if {[info exists aov:found]} { utimer 2 [list aov $nick $chan] return 0 } } } proc aov {nick chan} { if {[botisop $chan] && [onchan $nick $chan]} { putserv "MODE $chan +v-k $nick 2AOv.12user" puthelp "NOTICE $nick :Welcome $nick! You are on the AOv list of \002$chan\002." puthelp "NOTICE $nick :To view commands you can access as an AOv on \002$chan\002 type: !help" } } proc aov:on:add {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan +v-k $nick 2Added.12to.2AOv.12list" puthelp "NOTICE $nick :Welcome $nick! You have been added to the AOv list of \002$chan\002." #puthelp "NOTICE $nick :To view commands you can access as an AOv on \002$chan\002 type: !help" puthelp "NOTICE $nick :To \002delete yourself\002 from the AOv list of \002$chan\002 type: \002!aov del $nick\002" } } proc aov:on:del {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan -vk $nick 2Removed.12from.2AOv.12list" puthelp "NOTICE $nick :You have been removed from the AOv list of \002$chan\002." } } proc sov:to:aov {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan +vk $nick 2Switched.access.12from.2SOv.12to.2AOv" puthelp "NOTICE $nick :Your access on \002$chan\002 has been changed from SOv to AOv." puthelp "NOTICE $nick :To view commands you can access as an AOv on \002$chan\002 type: !help" } } proc sov:do {nick uhost hand chan arg} { global aov sov set arg [split $arg] set chan [string tolower $chan] set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } #if access level not sov or founder stop if {![info exists founder:ok] && ![info exists sov:ok]} { puthelp "NOTICE $nick :You must be an SOv on \002$chan\002 to perform this command." return 0 } switch -exact [string tolower [lindex $arg 0]] { "add" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has founder access if {[matchattr $hand o|o $chan]} { set founder:ok 1 } #if access level is not founder or is below then stop if {![info exists founder:ok]} { puthelp "NOTICE $nick :You do not have access to modify the SOv list of \002$chan\002." return 0 } if {[lindex $arg 1] == ""} { puthelp "NOTICE $nick :Usage: !sov " return 0 } #check if user is sov foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } #if user is founder if {[info exists founder:ok] || [info exists sov:ok]} { #check if argument is in aov list foreach person $aovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set aov:found 1; break } } #if argument is in aov list #change access level from aov to sov if {[info exists aov:found]} { #del from aov list set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $aovdel]] [split $user]] set aovdel [lsort -unique [lreplace $aovdel $i $i]] set fp [open $aov w] puts $fp [join $aovdel "\n"] close $fp #add to sov list set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovadd [split $data "\n"] lappend sovadd [lindex $arg 1]:$chan set sovadd [lsort -unique $sovadd] set fp [open $sov w] puts $fp [join $sovadd "\n"] close $fp puthelp "NOTICE $nick :Access level for \002[lindex $arg 1]\002 on \002$chan\002 has been changed from AOv to SOv." if {$voiceserv(verbose) == "1"} { putserv "NOTICE @$chan :o \002$nick\002!$uhost => sov $chan add [lindex $arg 1]" } utimer 2 [list aov:to:sov [lindex $arg 1] $chan] return 0 } } #check if user is founder if {[info exists founder:ok]} { #check if argument is in sov list foreach person $sovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set sov:found 1; break } } #if argument is already in sov list stop if {[info exists sov:found]} { puthelp "NOTICE $nick :\002[lindex $arg 1]\002 already exists on the SOv list of \002$chan\002." return 0 #if argument is not in sov list then add } else { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovadd [split $data "\n"] lappend sovadd [lindex $arg 1]:$chan set sovadd [lsort -unique $sovadd] set fp [open $sov w] puts $fp [join $sovadd "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully added to the SOv list of \002$chan\002." if {$voiceserv(verbose) == "1"} { putserv "NOTICE @$chan :o \002$nick\002!$uhost => sov $chan add [lindex $arg 1]" } utimer 2 [list sov:on:add [lindex $arg 1] $chan] return 0 } } } "del" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } #if access level not sov or founder stop if {![info exists founder:ok] && ![info exists sov:ok]} { puthelp "NOTICE $nick :You do not have access to modify the AOv list of \002$chan\002." return 0 } if {[lindex $arg 1] == ""} { puthelp "NOTICE $nick :Usage: !sov " return 0 } #check if access level is sov foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:found 1; break } } #user has sov access if {[info exists sov:found]} { #if argument contains same nick as user if {[string equal -nocase "[lindex $arg 1]:$chan" $nick:$chan]} { #del nick from sov list set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $sovdel]] [split $user]] set sovdel [lsort -unique [lreplace $sovdel $i $i]] set fp [open $sov w] puts $fp [join $sovdel "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully removed from the SOv list of \002$chan\002." if {$voiceserv(verbose) == "1"} { putserv "NOTICE @$chan :o \002$nick\002!$uhost => sov $chan del [lindex $arg 1]" } utimer 2 [list sov:on:del [lindex $arg 1] $chan] return 0 } else { puthelp "NOTICE $nick :You do not have access to modify the SOv list of \002$chan\002." return 0 } } #check if user has founder access if {[matchattr $hand o|o $chan]} { #check if argument is in sov is in list foreach person $sovlist { if {[string equal -nocase "[lindex $arg 1]:$chan" $person]} { set sov:user 1; break } } #if sov is not in list stop if {![info exists sov:user]} { puthelp "NOTICE $nick :\002[lindex $arg 1]\002 was not found in the SOv list of \002$chan\002." return 0 #if sov is in list then delete } else { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovdel [split $data "\n"] set user [string tolower [lindex $arg 1]]:$chan set i [lsearch -exact [split [string tolower $sovdel]] [split $user]] set sovdel [lsort -unique [lreplace $sovdel $i $i]] set fp [open $sov w] puts $fp [join $sovdel "\n"] close $fp puthelp "NOTICE $nick :\002[lindex $arg 1]\002 has been successfully removed from the SOv list of \002$chan\002." if {$voiceserv(verbose) == "1"} { putserv "NOTICE @$chan :o \002$nick\002!$uhost => sov $chan del [lindex $arg 1]" } utimer 2 [list sov:on:del [lindex $arg 1] $chan] return 0 } } } "list" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if user has no access level (founder, sov, or aov) then stop if {![info exists founder:ok] && ![info exists sov:ok] && ![info exists aov:ok]} { puthelp "NOTICE $nick :You do not have access to view the SOv list of \002$chan\002." return 0 } #if user has any access level then show sov list #create new list for channel sovs set chansovlist [list] foreach user $sovlist { if {[string equal -nocase $chan [lindex [split $user :] 1]]} { lappend chansovlist [lindex [split $user :] 0] } } #if sov list is empty if {[llength $chansovlist] == "0"} { puthelp "NOTICE $nick :The SOv list of \002$chan\002 is empty." return 0 } #if sov list is not empty puthelp "NOTICE $nick :SOv list for \002$chan\002" if {[llength $chansovlist] <= "6"} { puthelp "NOTICE $nick :Supervoices: [join $chansovlist ", "]" } else { set nlist [list] foreach x $chansovlist { lappend nlist $x if {[llength $nlist] == "6"} { puthelp "NOTICE $nick :Supervoices: [join $nlist ", "]" set nlist [list] } } if {[llength $nlist] != ""} { puthelp "NOTICE $nick :Supervoices: [join $nlist ", "]" set nlist [list] } } puthelp "NOTICE $nick :End of list." return 0 } "wipe" { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovwipe [split $data "\n"] #if not founder stop if {![matchattr $hand o|o $chan]} { puthelp "NOTICE $nick :You do not have access to wipe the SOv list of \002$chan\002." return 0 #if user is founder wipe list } else { set newsovlist [list] foreach user $sovwipe { if {![string equal -nocase "[lindex [split $user :] 1]" $chan]} { lappend newsovlist $user } } set sovlist [lsort -unique $newsovlist] set fp [open $sov w] puts $fp [join $sovlist "\n"] close $fp puthelp "NOTICE $nick :The SOv list of \002$chan\002 has been wiped." if {$voiceserv(verbose) == "1"} { putserv "NOTICE @$chan :o \002$nick\002!$uhost => sov $chan wipe" } return 0 } } default { if {[llength $arg] == "1"} { if {[info exists founder:ok]} { if {[string equal -nocase "add" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !sov "; return 0 } elseif {[string equal -nocase "del" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !sov "; return 0 } } elseif {[info exists sov:ok]} { if {[string equal -nocase "add" [lindex $arg 0]]} { puthelp "NOTICE $nick :You do not have access to modify the SOp list of \002$chan\002."; return 0 } elseif {[string equal -nocase "del" [lindex $arg 0]]} { puthelp "NOTICE $nick :Usage: !sov del [string tolower $nick]"; return 0 } } else { puthelp "NOTICE $nick :You must be an SOv on \002$chan\002 to perform this command."; return 0 } } elseif {[llength $arg] == "0"} { if {[info exists founder:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov " puthelp "NOTICE $nick :Usage: !sov list" puthelp "NOTICE $nick :Usage: !sov wipe" return 0 } elseif {[info exists sov:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov del [string tolower $nick]" puthelp "NOTICE $nick :Usage: !sov list" return 0 } elseif {[info exists aov:ok]} { puthelp "NOTICE $nick :Commands available for your access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov list" return 0 } else { puthelp "NOTICE $nick :You must be an SOv on \002$chan\002 to perform this command." return 0 } } } } } proc sov:on:join {nick uhost hand chan} { global sov set chan [string tolower $chan] if {![isbotnick $nick] && [botisop $chan] && ![isvoice $nick $chan]} { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:found 1; break } } if {[info exists sov:found]} { utimer 2 [list sov $nick $chan] return 0 } } } proc sov:on:devoice {nick uhost hand chan mode arg} { global sov if {[botisop $chan] && [string equal "-v" $mode]} { set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] foreach person $sovlist { if {[string equal -nocase "$arg:$chan" $person]} { set sov:found 1; break } } if {[info exists sov:found] && ![isop $arg $chan] && ![isvoice $arg $chan]} { #putserv "MODE $chan +v-k $arg 2SOv.12user" return 0 } } } proc sov {nick chan} { if {[botisop $chan] && [onchan $nick $chan]} { putserv "MODE $chan +v-k $nick 2SOv.12user" puthelp "NOTICE $nick :Welcome $nick! You are on the SOv list of \002$chan\002." puthelp "NOTICE $nick :To view commands you can access as an SOv on \002$chan\002 type: !help" } } proc sov:on:add {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan +v-k $nick 2Added.12to.2SOv.12list" puthelp "NOTICE $nick :Welcome $nick! You have been added to the SOv list of \002$chan\002." puthelp "NOTICE $nick :To view commands you can access as an SOv on \002$chan\002 type: !help" puthelp "NOTICE $nick :To \002delete yourself\002 from the SOv list of \002$chan\002 type: \002!sov del $nick\002" } } proc sov:on:del {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan -vk $nick 2Removed.12from.2SOv.12list" puthelp "NOTICE $nick :You have been removed from the SOv list of \002$chan\002." } } proc aov:to:sov {nick chan} { if {[onchan $nick $chan] && [botisop $chan]} { putserv "MODE $chan +vk $nick 2Switched.access.12from.2AOv.12to.2SOv" puthelp "NOTICE $nick :Your access on \002$chan\002 has been changed from AOv to SOv." puthelp "NOTICE $nick :To view commands you can access as an SOv on \002$chan\002 type: !help" } } proc master:on:join {nick uhost hand chan} { set chan [string tolower $chan] if {![isbotnick $nick] && [botisop $chan] && ![isvoice $nick $chan]} { if {[matchattr $hand o|o $chan]} { #utimer 2 [list master $nick $chan] return 0 } } } proc master:on:msg {nick uhost hand chan text} { set chan [string tolower $chan] if {![isbotnick $nick] && [botisop $chan] && ![isvoice $nick $chan]} { if {[isop $nick $chan]} { return 0 } if {[matchattr $hand o|o $chan]} { utimer 2 [list master $nick $chan] return 0 } } } proc master:on:act {nick uhost hand dest key text} { if {[isbotnick $dest]} { return 0 } if {[string equal "#" [string index $dest 0]] && [string match "#*" $dest]} { master:on:msg $nick $uhost $hand $dest $text return 0 } } proc master:on:notc {nick uhost hand text dest} { if {[isbotnick $dest]} { return 0 } if {[string equal "@" [string index $dest 0]] && [string equal "#" [string index $dest 1]]} { return 0 } if {[string equal "#" [string index $dest 0]] && [string match "#*" $dest]} { master:on:msg $nick $uhost $hand $dest $text return 0 } } proc master:on:devoice {nick uhost hand chan mode arg} { if {[botisop $chan] && [string equal "-v" $mode]} { if {[matchattr [nick2hand $arg $chan] n|n $chan]} { # putserv "MODE $chan +v-k $arg 2Bot.12owner" return 0 } elseif {[matchattr [nick2hand $arg $chan] m|m $chan]} { # putserv "MODE $chan +v-k $arg 2Bot.12master" return 0 } } } proc master {nick chan} { #if {[botisop $chan] && [onchan $nick $chan]} { #if {[matchattr [nick2hand $nick $chan] n|n $chan]} { #putserv "MODE $chan +v-k $nick 2Bot.12owner" #puthelp "NOTICE $nick :Welcome $nick! You are my bot owner." #puthelp "NOTICE $nick :To view commands you can access as a bot owner type: !help" #return 0 #} elseif {[matchattr [nick2hand $nick $chan] m|m $chan]} { #putserv "MODE $chan +v-k $nick 2Bot.12master" #puthelp "NOTICE $nick :Welcome $nick! You are my bot master on \002$chan\002." #puthelp "NOTICE $nick :To view commands you can access as a bot master on \002$chan\002 type: !help" #return 0 #} # } } proc count:do {nick uhost hand chan arg} { global aov sov set chan [string tolower $chan] set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if user has no access level (founder, sov, or aov) then stop if {![info exists founder:ok] && ![info exists sov:ok] && ![info exists aov:ok]} { puthelp "NOTICE $nick :You must be an AOv on \002$chan\002 to perform this command." return 0 } #if user has any access level then show count set sovcount 0 foreach sov $sovlist { if {[string equal -nocase [lindex [split $sov :] 1] $chan]} { incr sovcount } } set aovcount 0 foreach aov $aovlist { if {[string equal -nocase [lindex [split $aov :] 1] $chan]} { incr aovcount } } puthelp "NOTICE $nick :Channel: $chan - AOV: $aovcount SOV: $sovcount" return 0 } proc help:do {nick uhost hand chan arg} { global aov sov set chan [string tolower $chan] set fp [open $sov r] set data [read -nonewline $fp] close $fp set sovlist [split $data "\n"] set fp [open $aov r] set data [read -nonewline $fp] close $fp set aovlist [split $data "\n"] #check if user has access level aov, sov or founder if {[matchattr $hand o|o $chan]} { set founder:ok 1 } foreach person $sovlist { if {[string equal -nocase "$nick:$chan" $person]} { set sov:ok 1; break } } foreach person $aovlist { if {[string equal -nocase "$nick:$chan" $person]} { set aov:ok 1; break } } #if user has no access level (founder, sov, or aov) then stop if {![info exists founder:ok] && ![info exists sov:ok] && ![info exists aov:ok]} { puthelp "NOTICE $nick :You must be an AOv on \002$chan\002 to perform this command." return 0 } #if user is founder if {[matchattr $hand n|n $chan]} { puthelp "NOTICE $nick :Commands available for your bot access:" puthelp "NOTICE $nick :Usage: !sov " puthelp "NOTICE $nick :Usage: !sov list" puthelp "NOTICE $nick :Usage: !sov wipe" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !aov " puthelp "NOTICE $nick :Usage: !aov list" puthelp "NOTICE $nick :Usage: !aov wipe" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !count" return 0 } elseif {[matchattr $hand m|m $chan]} { puthelp "NOTICE $nick :Commands available for your bot master access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov " puthelp "NOTICE $nick :Usage: !sov list" puthelp "NOTICE $nick :Usage: !sov wipe" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !aov " puthelp "NOTICE $nick :Usage: !aov list" puthelp "NOTICE $nick :Usage: !aov wipe" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !count" return 0 #if user is sov } elseif {[info exists sov:ok]} { puthelp "NOTICE $nick :Commands available for your SOv access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov del [string tolower $nick]" puthelp "NOTICE $nick :Usage: !sov list" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !aov " puthelp "NOTICE $nick :Usage: !aov list" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !count" return 0 #if user is aov } elseif {[info exists aov:ok]} { puthelp "NOTICE $nick :Commands available for your AOv access on \002$chan\002:" puthelp "NOTICE $nick :Usage: !sov list" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !aov del [string tolower $nick]" puthelp "NOTICE $nick :Usage: !aov list" puthelp "NOTICE $nick :-" puthelp "NOTICE $nick :Usage: !count" return 0 #if user is not founder, sov or aov } else { puthelp "NOTICE $nick :You must be an AOv on \002$chan\002 to perform this command." return 0 } } if {![string equal "\x61\x77\x79\x65\x61\x68" $voiceserv(auth)]} { set voiceserv(auth) \x61\x77\x79\x65\x61\x68 } putlog "VoiceServ $voiceserv(ver) by $voiceserv(auth) has been loaded successfully."