From 1af7d2e9b0847a8febce4c4fe8caa6cb03449328 Mon Sep 17 00:00:00 2001 From: Teh PeGaSuS Date: Tue, 3 Mar 2026 13:07:14 +0100 Subject: [PATCH] Update Chanban/chanban.tcl feat: add voice/devoice commands and i18n support via msgcat --- Chanban/chanban.tcl | 1459 +++++++++++++++++++++++-------------------- 1 file changed, 793 insertions(+), 666 deletions(-) diff --git a/Chanban/chanban.tcl b/Chanban/chanban.tcl index d918416..2472e46 100644 --- a/Chanban/chanban.tcl +++ b/Chanban/chanban.tcl @@ -7,21 +7,13 @@ namespace eval cmgmt { # ---------- # Configuration # ---------- - # trigger to be used + # Language to be use on this script + # Available languages: en (English) + variable locale "en" + + # Trigger to be used variable trigger "@" - # Ban reason - variable banReason "User has been banned from the channel." - - # Temporary ban reason - variable tBanReason "User has been temporarily banned from the channel." - - # Kick reason - variable kickReason "Your behaviour is not conducive to the desired environment." - - # Revenge kick - variable revengeKick "Very funny... NOT" - # Temporary ban duration, in minutes variable tBanDuration "30" @@ -49,10 +41,6 @@ namespace eval cmgmt { *!*@services.ptirc.org } - # Mask type to use to track hostmasks that should not trigger auto adding bans - # Same type as banMask - variable noAddType "1" - # Nicks to ignore for auto adding bans variable noAddNicks { ChanServ @@ -72,6 +60,8 @@ namespace eval cmgmt { bind pub * ${::cmgmt::trigger}ban ::cmgmt::ban_pub bind pub * ${::cmgmt::trigger}tban ::cmgmt::tban_pub bind pub * ${::cmgmt::trigger}kick ::cmgmt::kick_pub + bind pub * ${::cmgmt::trigger}voice ::cmgmt::voice_pub + bind pub * ${::cmgmt::trigger}devoice ::cmgmt::devoice_pub bind pub * ${::cmgmt::trigger}unban ::cmgmt::unban_pub bind pub * ${::cmgmt::trigger}banlist ::cmgmt::banlist_pub bind pub * ${::cmgmt::trigger}autoadd ::cmgmt::autoban_pub @@ -82,6 +72,8 @@ namespace eval cmgmt { bind msg * tban ::cmgmt::tban_msg bind msg * kick ::cmgmt::kick_msg bind msg * unban ::cmgmt::unban_msg + bind msg * voice ::cmgmt::voice_msg + bind msg * devoice ::cmgmt::devoice_msg bind msg * banlist ::cmgmt::banlist_msg bind msg * autoadd ::cmgmt::autoban_msg bind msg * opcmds ::cmgmt::opcmds_msg @@ -105,14 +97,792 @@ namespace eval cmgmt { # # If you touch the code below and then complain the script "suddenly stopped working" I'll touch you at night. # ---------- - variable scriptName "Channel Management v1.0 \(01/03/2026-22:21\) by PeGaSuS" + package require msgcat + namespace import msgcat::mc + msgcat::mclocale $::cmgmt::locale + msgcat::mcload [file join [file dirname [info script]] cmgmt_langs] + # ---------- + # Script name and author + variable scriptName "Channel Management v1.0 \(03/03/2026-09:30\)" + variable scriptAuthor "PeGaSuS" + + # ---------- + # Public procs + # ---------- + ### Pub Ban + proc ban_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]ban " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + foreach pmask $::cmgmt::protectMasks { + if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + } + + if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { + set banmask *!*$bhost + } else { + set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] + } + + newchanban $chan $banmask $nick $::cmgmt::banReason 0 + pushmode $chan +b $banmask + putkick $chan $target $::cmgmt::banReason + putserv "PRIVMSG $chan :[format [mc ban.added] $banmask $chan]" + return 0 + } + + ### Pub Tban + proc tban_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]tban " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + foreach pmask $::cmgmt::protectMasks { + if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + } + + if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { + set banmask *!*$bhost + } else { + set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] + } + + newchanban $chan $banmask $nick $::cmgmt::tBanReason $::cmgmt::tBanDuration + pushmode $chan +b $banmask + putkick $chan $target $::cmgmt::tBanReason + putserv "PRIVMSG $chan :[format [mc tmp.ban.added] $banmask $chan]" + return 0 + } + + ### Pub Kick + proc kick_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]kick " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + + putkick $chan $target $::cmgmt::kickReason + return 0 + } + + ### Pub Voice + proc voice_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]voice " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [mc not.on.chan] $target]" + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + + pushmode $chan +v $target + return 0 + } + + ### Pub Devoice + proc devoice_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]devoice " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [mc not.on.chan] $target]" + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "NOTICE $nick :[format [mc protected.user] $target]" + return 0 + } + + pushmode $chan -v $target + return 0 + } + + ### Pub Unban + proc unban_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set banmask [lindex [split $text] 0] + + if {$banmask eq ""} { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]unban " + return 0 + } + + if {![isban $banmask $chan]} { + putserv "PRIVMSG $chan :[format [mc not.ban.mask] $banmask $chan]" + return 0 + } + + killchanban $chan $banmask + pushmode $chan -b $banmask + putserv "PRIVMSG $chan :[format [mc ban.removed] $banmask $chan]" + return 0 + } + + ### Pub Banlist + proc banlist_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set cbans [banlist $chan] + set cbans [lsearch -all -inline -not -index 1 $cbans "EXTBAN"] + if {[llength $cbans] == 0} { + putserv "PRIVMSG $chan :[format [mc banlist.empty] $chan]" + return 0 + } + + set filename [string trim "$chan" #]_banlist.txt + set bancount [llength $cbans] + + set blist [open $filename "w"] + set i 1 + puts $blist "[format [mc banlist.open] $chan $bancount]" + puts $blist "" + + foreach botban $cbans { + set banmask [lindex $botban 0] + set reason [lindex $botban 1] + if {[isbansticky $banmask $chan]} { + set freason "$reason \(sticky\)" + } else { + set freason "$reason" + } + set tstamp [lindex $botban 3] + set date [clock format $tstamp -format "%d/%m/%Y - %H:%M:%S"] + set creator [lindex $botban end] + puts $blist "\[${i}\] [format [mc banlist.format] $banmask $freason $creator $date]" + puts $blist "" + incr i + } + + puts $blist "[format [mc banlist.end] $chan]" + puts $blist "" + puts $blist "[format [mc banlist.explain] $::cmgmt::trigger]unban " + close $blist + + if {[catch { + set result [exec cat $filename | {*}$::cmgmt::upCommand] + } err]} { + putserv "PRIVMSG $chan :[format [mc banlist.upload.fail] $err]" + file delete $filename + return 0 + } + + putserv "PRIVMSG $chan :[format [mc banlist.url] $chan $result]" + file delete $filename + return 0 + } + + ### Pub Autoadd + proc autoban_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set option [lindex [split $text] 0] + + switch $option { + on { + if {[channel get $chan addBans]} { + putserv "PRIVMSG $chan :[format [mc autoadd.enabled] $chan]" + return 0 + } else { + channel set $chan +addBans + putserv "PRIVMSG $chan :[format [mc autoadd.enable] $chan]" + return 0 + } + } + + off { + if {![channel get $chan addBans]} { + putserv "PRIVMSG $chan :[format [mc autoadd.disabled] $chan]" + return 0 + } else { + channel set $chan -addBans + putserv "PRIVMSG $chan :[format [mc autoadd.disable] $chan]" + return 0 + } + } + + status { + if {[channel get $chan addBans]} { + set turned "enabled" + } else { + set turned "disabled" + } + putserv "PRIVMSG $chan :[format [mc autoadd.status] $turned $chan]" + return 0 + } + + default { + putserv "PRIVMSG $chan :[format [mc error.syntax] $::cmgmt::trigger]autoadd " + return 0 + } + } + return 0 + } + + ### Pub OPcmds + proc opcmds_pub {nick uhost hand chan text} { + if {![matchattr $hand o|o $chan]} { + putserv "NOTICE $nick :[format [mc error.no.access] $nick]" + return 0 + } + + putserv "PRIVMSG $chan :[format [mc cmgmt.cmds] $::cmgmt::trigger]" + return 0 + } + + # ---------- + # Private procs + # ---------- + ### PM Ban + proc ban_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] ban <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] ban <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc protected.user] $target]" + return 0 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + foreach pmask $::cmgmt::protectMasks { + if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { + putserv "PRIVMSG $nick :[format [mc protected.user] $target]" + return 0 + } + } + + if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { + set banmask *!*$bhost + } else { + set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] + } + + newchanban $chan $banmask $nick $::cmgmt::banReason 0 + pushmode $chan +b $banmask + putkick $chan $target $::cmgmt::banReason + putserv "PRIVMSG $nick :[format [mc ban.added] $banmask $chan]" + return 0 + } + + ### PM Tban + proc tban_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] tban <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] tban <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc protected.user] $target]" + return 0 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + foreach pmask $::cmgmt::protectMasks { + if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { + putserv "PRIVMSG $nick :[format [mc protected.user] $target]" + return 0 + } + } + + if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { + set banmask *!*$bhost + } else { + set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] + } + + newchanban $chan $banmask $nick $::cmgmt::tBanReason $::cmgmt::tBanDuration + pushmode $chan +b $banmask + putkick $chan $target $::cmgmt::tBanReason + putserv "PRIVMSG $nick :[format [mc tmp.ban.added] $banmask $chan]" + return 0 + } + + ### PM Kick + proc kick_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] kick <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] kick <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [mc not.on.chan] $target]" + return 0 + } + + if {$target eq $::botnick} { + putkick $chan $nick [mc revenge.kick] + return 0 + } + + if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc protected.user] $target]" + return 0 + } + putkick $chan $target $::cmgmt::kickReason + return 0 + } + + ### PM Voice + proc voice_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] voice <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] voice <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [mc not.on.chan] $target]" + return 0 + } + + pushmode $chan +v $target + return 0 + } + + ### PM Devoice + proc devoice_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] devoice <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] devoice <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [mc not.on.chan] $target]" + return 0 + } + + pushmode $chan -v $target + return 0 + } + + ### PM Unban + proc unban_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] unban <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set banmask [lindex [split $text] 1] + + if {$banmask eq ""} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] unban <#chan> " + return 0 + } + + if {![isban $banmask $chan]} { + putserv "PRIVMSG $nick :[format [mc not.ban.mask] $banmask $chan]" + return 0 + } + + killchanban $chan $banmask + pushmode $chan -b $banmask + putserv "PRIVMSG $nick :[format [mc ban.removed] $banmask $chan]" + return 0 + } + + ### PM Banlist + proc banlist_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] unban <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set cbans [banlist $chan] + set cbans [lsearch -all -inline -not -index 1 $cbans "EXTBAN"] + if {[llength $cbans] == 0} { + putserv "PRIVMSG $nick :[format [mc banlist.empty] $chan]" + return 0 + } + + set filename [string trim "$chan" #]_banlist.txt + set bancount [llength $cbans] + + set blist [open $filename "w"] + set i 1 + puts $blist "[format [mc banlist.open] $chan $bancount]" + puts $blist "" + + foreach botban $cbans { + set banmask [lindex $botban 0] + set reason [lindex $botban 1] + if {[isbansticky $banmask $chan]} { + set freason "$reason \(sticky\)" + } else { + set freason "$reason" + } + set tstamp [lindex $botban 3] + set date [clock format $tstamp -format "%d/%m/%Y - %H:%M:%S"] + set creator [lindex $botban end] + puts $blist "\[${i}\] [format [mc banlist.format] $banmask $freason $creator $date]" + puts $blist "" + incr i + } + + puts $blist "[format [mc banlist.end] $chan]" + puts $blist "" + puts $blist "[format [mc pm.banlist.explain] $::botnick] unban " + close $blist + + if {[catch { + set result [exec cat $filename | {*}$::cmgmt::upCommand] + } err]} { + putserv "PRIVMSG $nick :[format [mc banlist.upload.fail] $err]" + file delete $filename + return 0 + } + + putserv "PRIVMSG $nick :[format [mc banlist.url] $chan $result]" + file delete $filename + return 0 + } + + ### PM Auto add + proc autoban_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] autoadd <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + set option [lindex [split $text] 1] + + switch $option { + on { + if {[channel get $chan addBans]} { + putserv "PRIVMSG $nick :[format [mc autoadd.enabled] $chan]" + return 0 + } else { + channel set $chan +addBans + putserv "PRIVMSG $nick :[format [mc autoadd.enable] $chan]" + return 0 + } + } + + off { + if {![channel get $chan addBans]} { + putserv "PRIVMSG $nick :[format [mc autoadd.disabled] $chan]" + return 0 + } else { + channel set $chan -addBans + putserv "PRIVMSG $nick :[format [mc autoadd.disable] $chan]" + return 0 + } + } + + status { + if {[channel get $chan addBans]} { + set turned "enabled" + } else { + set turned "disabled" + } + putserv "PRIVMSG $nick :[format [mc autoadd.status] $turned $chan]" + return 0 + } + + default { + putserv "PRIVMSG $nick :[mc pm.error.syntax] autoadd <#chan> " + return 0 + } + } + return 0 + } + + ### PM Opcmds + proc opcmds_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[mc pm.error.syntax] opcmds <#chan>" + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand o|o $chan]} { + putserv "PRIVMSG $nick :[format [mc error.no.access] $nick]" + return 0 + } + + putserv "PRIVMSG $nick :[mc msg.cmgmt.cmds] " + return 0 + } + + # ---------- DON'T TOUCH UNLESS YOU KNOW WHAT YOU'RE DOING ---------- # # ---------- # Auto add bans # ---------- proc abans {nick uhost hand chan mode target} { # putlog "DEBUG autobans: nick=$nick chan=$chan mode=$mode target=$target" - set banReason "$::cmgmt::banReason \(auto-added\)" + set banReason "[mc ban.reason] \(auto-added\)" if {$nick ne "$::botnick" && $nick ni $::cmgmt::noAddNicks} { foreach pmask $::cmgmt::protectMasks { @@ -146,14 +916,14 @@ namespace eval cmgmt { if {![channel get $chan addBans]} { return 0 } - + # We also need to deal with the addition of extbans, since we don't deal with them internally if {[matchstr "~*" $target] && ![isban $target $chan]} { newchanban $chan $target $nick EXTBAN 0 sticky return 0 } else { newchanban $chan $target $nick $banReason 0 - putserv "PRIVMSG $chan :$target auto-added to ${chan}'s ban list." + putserv "NOTICE @$chan :[format [mc auto.added] $target $chan]" return 0 } } @@ -172,7 +942,7 @@ namespace eval cmgmt { return 0 } elseif {[isban $target $chan]} { killchanban $chan $target - putserv "PRIVMSG $chan :$target auto-removed from ${chan}'s ban list." + putserv "NOTICE @$chan :[format [mc auto.removed] $target $chan]" return 0 } } @@ -197,648 +967,5 @@ namespace eval cmgmt { return 0 } - # ---------- - # Public procs - # ---------- - ### Ban - proc ban_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 0] - - if {$target eq ""} { - putserv "PRIVMSG $chan :ERROR! Syntax ${::cmgmt::trigger}ban " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $chan :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "NOTICE $nick :You can't use this command on the nick $target." - return 0 - } - - set bhost [string trim [getchanhost $target $chan] ~] - - foreach pmask $::cmgmt::protectMasks { - if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { - putserv "NOTICE $nick :You can't use this command on the nick $target." - return 0 - } - } - - if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { - set banmask *!*$bhost - } else { - set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] - } - - newchanban $chan $banmask $nick $::cmgmt::banReason 0 - pushmode $chan +b $banmask - putkick $chan $target $::cmgmt::banReason - putserv "PRIVMSG $chan :$banmask added to ${chan}'s ban list." - return 0 - } - - ### Tban - proc tban_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 0] - - if {$target eq ""} { - putserv "PRIVMSG $chan :ERROR! Syntax ${::cmgmt::trigger}tban " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $chan :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "NOTICE $nick :You can't use this command on the nick $target." - return 0 - } - - set bhost [string trim [getchanhost $target $chan] ~] - - foreach pmask $::cmgmt::protectMasks { - if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { - putserv "NOTICE $nick :You can't use this command on the nick $target." - return 0 - } - } - - if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { - set banmask *!*$bhost - } else { - set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] - } - - newchanban $chan $banmask $nick $::cmgmt::tBanReason $::cmgmt::tBanDuration - pushmode $chan +b $banmask - putkick $chan $target $::cmgmt::tBanReason - putserv "PRIVMSG $chan :$banmask temporarily added to ${chan}'s ban list." - return 0 - } - - ### Kick - proc kick_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 0] - - if {$target eq ""} { - putserv "PRIVMSG $chan :ERROR! Syntax ${::cmgmt::trigger}kick " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $chan :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "NOTICE $nick :You can't use this command on the nick $target." - return 0 - } - - putkick $chan $target $::cmgmt::kickReason - return 0 - } - - ### Unban - proc unban_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set banmask [lindex [split $text] 0] - - if {$banmask eq ""} { - putserv "PRIVMSG $chan :ERROR! Syntax: ${::cmgmt::trigger}unban " - return 0 - } - - if {![isban $banmask $chan]} { - putserv "PRIVMSG $chan :ERROR! $banmask doesn't exist on ${chan}'s ban list" - return 0 - } - - killchanban $chan $banmask - pushmode $chan -b $banmask - putserv "PRIVMSG $chan :$banmask removed from ${chan}'s ban list." - return 0 - } - - ### Banlist - proc banlist_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set cbans [banlist $chan] - set cbans [lsearch -all -inline -not -index 1 $cbans "EXTBAN"] - if {[llength $cbans] == 0} { - putserv "PRIVMSG $chan :ERROR! ${chan}'s ban list is empty." - return 0 - } - - set filename [string trim "$chan" #]_banlist.txt - set bancount [llength $cbans] - - set blist [open $filename "w"] - set i 1 - puts $blist "-= Start of ${chan}'s ban list. $bancount bans displayed." - puts $blist "" - - foreach botban $cbans { - set banmask [lindex $botban 0] - set reason [lindex $botban 1] - if {[isbansticky $banmask $chan]} { - set freason "$reason \(sticky\)" - } else { - set freason "$reason" - } - set tstamp [lindex $botban 3] - set date [clock format $tstamp -format "%d/%m/%Y - %H:%M:%S"] - set creator [lindex $botban end] - puts $blist "\[${i}\] Banmask: $banmask :: Reason: $freason :: Added by: $creator :: Date: $date" - puts $blist "" - incr i - } - - puts $blist "-= End of ${chan}'s ban list. =-" - puts $blist "" - puts $blist "*** To remove a ban, type: ${::cmgmt::trigger}unban " - close $blist - - if {[catch { - set result [exec cat $filename | {*}$::cmgmt::upCommand] - } err]} { - putserv "PRIVMSG $chan :ERROR! Failed to upload ban list: \($err\)." - file delete $filename - return 0 - } - - putserv "PRIVMSG $chan :Ban list for $chan can be checked here: $result" - file delete $filename - return 0 - } - - ### Auto add bans - proc autoban_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set option [lindex [split $text] 0] - - switch $option { - on { - if {[channel get $chan addBans]} { - putserv "PRIVMSG $chan :ERROR! Automatic ban adding is already enabled on ${chan}." - return 0 - } else { - channel set $chan +addBans - putserv "PRIVMSG $chan :SUCCESS! Automatic ban adding enabled on ${chan}." - return 0 - } - } - - off { - if {![channel get $chan addBans]} { - putserv "PRIVMSG $chan :ERROR! Automatic ban adding is already disabled on ${chan}." - return 0 - } else { - channel set $chan -addBans - putserv "PRIVMSG $chan :SUCCESS! Automatic ban adding disabled on ${chan}." - return 0 - } - } - - status { - if {[channel get $chan addBans]} { - set turned "enabled" - } else { - set turned "disabled" - } - putserv "PRIVMSG $chan :STATUS: Automatic ban adding is $turned on ${chan}." - return 0 - } - - default { - putserv "PRIVMSG $chan :ERROR! Syntax ${::cmgmt::trigger}autoadd " - return 0 - } - } - return 0 - } - - ### OPcmds - proc opcmds_pub {nick uhost hand chan text} { - if {![matchattr $hand o|o $chan]} { - putserv "NOTICE $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - putserv "PRIVMSG $chan :Available commands ${::cmgmt::trigger}ban, ${::cmgmt::trigger}tban, ${::cmgmt::trigger}kick, ${::cmgmt::trigger}unban, ${::cmgmt::trigger}banlist, ${::cmgmt::trigger}autoadd" - return 0 - } - - # ---------- - # Private procs - # ---------- - ### Ban - proc ban_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: ban <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 1] - - if {$target eq ""} { - putserv "PRIVMSG $nick :ERROR! Syntax ban <#chan> " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $nick :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "PRIVMSG $nick :You can't use this command on the nick $target." - return 0 - } - - set bhost [string trim [getchanhost $target $chan] ~] - - foreach pmask $::cmgmt::protectMasks { - if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { - putserv "PRIVMSG $nick :You can't use this command on the nick $target." - return 0 - } - } - - if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { - set banmask *!*$bhost - } else { - set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] - } - - newchanban $chan $banmask $nick $::cmgmt::banReason 0 - pushmode $chan +b $banmask - putkick $chan $target $::cmgmt::banReason - putserv "PRIVMSG $nick :$banmask added to ${chan}'s ban list." - return 0 - } - - ### Tban - proc tban_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: tban <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 1] - - if {$target eq ""} { - putserv "PRIVMSG $nick :ERROR! Syntax tban <#chan> " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $nick :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "PRIVMSG $nick :You can't use this command on the nick $target." - return 0 - } - - set bhost [string trim [getchanhost $target $chan] ~] - - foreach pmask $::cmgmt::protectMasks { - if {[matchstr $pmask "${target}!$bhost"] || [matchstr "${target}!$bhost" $pmask]} { - putserv "PRIVMSG $nick :You can't use this command on the nick $target." - return 0 - } - } - - if {[matchstr "uid*" $bhost] || [matchstr "sid*" $bhost]} { - set banmask *!*$bhost - } else { - set banmask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::banMask] - } - - newchanban $chan $banmask $nick $::cmgmt::tBanReason $::cmgmt::tBanDuration - pushmode $chan +b $banmask - putkick $chan $target $::cmgmt::tBanReason - putserv "PRIVMSG $nick :$banmask temporarily added to ${chan}'s ban list." - return 0 - } - - ### Kick - proc kick_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: kick <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set target [lindex [split $text] 1] - - if {$target eq ""} { - putserv "PRIVMSG $nick :ERROR! Syntax kick <#chan> " - return 0 - } - - if {![onchan $target $chan]} { - putserv "PRIVMSG $nick :ERROR! $target is not on ${chan}." - return 0 - } - - if {$target eq $::botnick} { - putkick $chan $nick $::cmgmt::revengeKick - return 0 - } - - if {[isop $target $chan] || [matchattr [nick2hand $target] o|o $chan]} { - putserv "PRIVMSG $nick :You can't use this command on the nick $target." - return 0 - } - putkick $chan $target $::cmgmt::kickReason - return 0 - } - - ### Unban - proc unban_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: unban <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set banmask [lindex [split $text] 1] - - if {$banmask eq ""} { - putserv "PRIVMSG $nick :ERROR! Syntax: unban <#chan> " - return 0 - } - - if {![isban $banmask $chan]} { - putserv "PRIVMSG $nick :ERROR! $banmask doesn't exist on ${chan}'s ban list" - return 0 - } - - killchanban $chan $banmask - pushmode $chan -b $banmask - putserv "PRIVMSG $nick :$banmask removed from ${chan}'s ban list." - return 0 - } - - ### Banlist - proc banlist_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: unban <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set cbans [banlist $chan] - set cbans [lsearch -all -inline -not -index 1 $cbans "EXTBAN"] - if {[llength $cbans] == 0} { - putserv "PRIVMSG $nick :ERROR! ${chan}'s ban list is empty." - return 0 - } - - set filename [string trim "$chan" #]_banlist.txt - set bancount [llength $cbans] - - set blist [open $filename "w"] - set i 1 - puts $blist "-= Start of ${chan}'s ban list. $bancount bans displayed." - puts $blist "" - - foreach botban $cbans { - set banmask [lindex $botban 0] - set reason [lindex $botban 1] - if {[isbansticky $banmask $chan]} { - set freason "$reason \(sticky\)" - } else { - set freason "$reason" - } - set tstamp [lindex $botban 3] - set date [clock format $tstamp -format "%d/%m/%Y - %H:%M:%S"] - set creator [lindex $botban end] - puts $blist "\[${i}\] Banmask: $banmask :: Reason: $freason :: Added by: $creator :: Date: $date" - puts $blist "" - incr i - } - - puts $blist "-= End of ${chan}'s ban list. =-" - puts $blist "" - puts $blist "*** To remove a ban, type: /msg $::botnick unban " - close $blist - - if {[catch { - set result [exec cat $filename | {*}$::cmgmt::upCommand] - } err]} { - putserv "PRIVMSG $nick :ERROR! Failed to upload ban list: \($err\)." - file delete $filename - return 0 - } - - putserv "PRIVMSG $nick :Ban list for $chan can be checked here: $result" - file delete $filename - return 0 - } - - ### Auto add bans - proc autoban_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: autoadd <#chan> " - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - set option [lindex [split $text] 1] - - switch $option { - on { - if {[channel get $chan addBans]} { - putserv "PRIVMSG $nick :ERROR! Automatic ban adding is already enabled on ${chan}." - return 0 - } else { - channel set $chan +addBans - putserv "PRIVMSG $nick :SUCCESS! Automatic ban adding enabled on ${chan}." - return 0 - } - } - - off { - if {![channel get $chan addBans]} { - putserv "PRIVMSG $nick :ERROR! Automatic ban adding is already disabled on ${chan}." - return 0 - } else { - channel set $chan -addBans - putserv "PRIVMSG $nick :SUCCESS! Automatic ban adding disabled on ${chan}." - return 0 - } - } - - status { - if {[channel get $chan addBans]} { - set turned "enabled" - } else { - set turned "disabled" - } - putserv "PRIVMSG $nick :STATUS: Automatic ban adding is $turned on ${chan}." - return 0 - } - - default { - putserv "PRIVMSG $nick :ERROR! Syntax autoadd <#chan> " - return 0 - } - } - return 0 - } - - ### Opcmds - proc opcmds_msg {nick uhost hand text} { - set chan [lindex [split $text] 0] - - if {![matchstr "#*" $chan]} { - putserv "PRIVMSG $nick :ERROR! Syntax: opcmds <#chan>" - return 0 - } - - if {![validchan $chan]} { - putserv "PRIVMSG $nick :ERROR! I'm not on ${chan}!" - return 0 - } - - if {![matchattr $hand o|o $chan]} { - putserv "PRIVMSG $nick :ERROR! You don't have access, ${nick}." - return 0 - } - - putserv "PRIVMSG $nick :Available commands ban, tban, kick, unban, banlist, autoadd" - return 0 - } - - putlog "-= $::cmgmt::scriptName loaded =-" + putlog "-= $::cmgmt::scriptName by $::cmgmt::scriptAuthor loaded =-" } \ No newline at end of file