From 92c67edbe7b1e8e6c126520095303e30956f8393 Mon Sep 17 00:00:00 2001 From: Teh PeGaSuS Date: Thu, 5 Mar 2026 14:41:07 +0100 Subject: [PATCH] Update Chanban/cmgmt.tcl --- Chanban/cmgmt.tcl | 233 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) diff --git a/Chanban/cmgmt.tcl b/Chanban/cmgmt.tcl index 95fbbef..b39b5e8 100644 --- a/Chanban/cmgmt.tcl +++ b/Chanban/cmgmt.tcl @@ -39,6 +39,10 @@ namespace eval cmgmt { # 9 nick!*@*.host variable banMask "2" + # Mask type to be used when adding an op. Same types as above + # We advise to use 1, as it's more secure + variable addOpMask "1" + # Masks to protect from bans, always on the format *!ident@hostname variable protectMasks { *!*@services.ptirc.org @@ -70,6 +74,9 @@ namespace eval cmgmt { bind pub * ${::cmgmt::trigger}banlist ::cmgmt::banlist_pub bind pub * ${::cmgmt::trigger}autoadd ::cmgmt::autoban_pub bind pub * ${::cmgmt::trigger}opcmds ::cmgmt::opcmds_pub + bind pub * ${::cmgmt::trigger}addop ::cmgmt::addop_pub + bind pub * ${::cmgmt::trigger}delop ::cmgmt::delop_pub + bind pub * ${::cmgmt::trigger}ops ::cmgmt::chanops_pub ### Private bind msg * addban ::cmgmt::addban_msg @@ -82,6 +89,9 @@ namespace eval cmgmt { bind msg * banlist ::cmgmt::banlist_msg bind msg * autoadd ::cmgmt::autoban_msg bind msg * opcmds ::cmgmt::opcmds_msg + bind msg * addop ::cmgmt::addop_msg + bind msg * delop ::cmgmt::delop_msg + bind msg * ops ::cmgmt::chanops_msg # ---------- # Auto add bans @@ -509,6 +519,100 @@ namespace eval cmgmt { return 0 } + ### Pub Addop + proc addop_pub {nick uhost hand chan text} { + set target [lindex [split $text] 0] + + if {![matchattr $hand n]} { + putserv "NOTICE $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [::msgcat::mc error.syntax] $::cmgmt::trigger]addop " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $chan :[format [::msgcat::mc not.on.chan] $target $chan]" + return 0 + } + + if {$target eq "$::botnick"} { + return 0 + } + + set opMask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::addOpMask] + + if {[validuser $target]} { + if {[matchattr [nick2hand $target] mno|o $chan]} { + putserv "PRIVMSG $chan :[format [::msgcat::mc got.oflag] $target $chan]" + return 0 + } else { + chattr $target |+o $chan + putserv "PRIVMSG $chan :[format [::msgcat::mc added.chanop] $target $chan]" + return 0 + } + } + + adduser $target $opMask + chattr $target |+o $chan + putserv "PRIVMSG $chan :[format [::msgcat::mc added.chanop] $target $chan]" + return 0 + } + + ### Pub Delop + proc delop_pub {nick uhost hand chan text} { + set visop 0 + + if {![matchattr $hand n]} { + putserv "NOTICE $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 0] + + if {$target eq ""} { + putserv "PRIVMSG $chan :[format [::msgcat::mc error.syntax] $::cmgmt::trigger]delop " + return 0 + } + + if {![validuser $target]} { + putserv "PRIVMSG $chan :[format [::msgcat::mc inexistent.user] $target]" + return 0 + } + + set user [nick2hand $target] + chattr $user |-o $chan + + foreach tc [channels] { + if {[matchattr $user |o $tc]} { + incr visop + } + } + + if {$visop == 0 && ![matchattr $user mno]} { + deluser $user + putserv "PRIVMSG $chan :[format [::msgcat::mc op.deleted] $target $chan]" + putserv "NOTICE $nick :[format [::msgcat::mc db.user.deleted] $target]" + return 0 + } else { + putserv "PRIVMSG $chan :[format [::msgcat::mc op.deleted] $target $chan]" + return 0 + } + } + + # Pub Ops + proc chanops_pub {nick uhost hand chan text} { + if {![matchattr $hand n]} { + putserv "NOTICE $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + putserv "PRIVMSG $chan :[format [::msgcat::mc chanop.list] $chan] [join [userlist |o $chan] {, }]" + return 0 + } + # ---------- # Private procs # ---------- @@ -999,6 +1103,135 @@ namespace eval cmgmt { return 0 } + ### PM Addop + proc addop_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[::msgcat::mc pm.error.syntax] addop <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand n]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[format [::msgcat::mc error.syntax] $::cmgmt::trigger]addop <#chan> " + return 0 + } + + if {![onchan $target $chan]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc not.on.chan] $target $chan]" + return 0 + } + + if {$target eq "$::botnick"} { + return 0 + } + + set opMask [maskhost ${target}![getchanhost $target $chan] $::cmgmt::addOpMask] + + if {[validuser $target]} { + if {[matchattr [nick2hand $target] mno|o $chan]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc got.oflag] $target $chan]" + return 0 + } else { + chattr $target |+o $chan + putserv "PRIVMSG $nick :[format [::msgcat::mc added.chanop] $target $chan]" + return 0 + } + } + + adduser $target $opMask + chattr $target |+o $chan + putserv "PRIVMSG $nick :[format [::msgcat::mc added.chanop] $target $chan]" + return 0 + } + + ### PM Delop + proc delop_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + set visop 0 + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[::msgcat::mc pm.error.syntax] delop <#chan> " + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand n]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + set target [lindex [split $text] 1] + + if {$target eq ""} { + putserv "PRIVMSG $nick :[format [::msgcat::mc error.syntax] $::cmgmt::trigger]delop <#chan> " + return 0 + } + + if {![validuser $target]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc inexistent.user] $target]" + return 0 + } + + set user [nick2hand $target] + chattr $user |-o $chan + + foreach tc [channels] { + if {[matchattr $user |o $tc]} { + incr visop + } + } + + if {$visop == 0 && ![matchattr $user mno]} { + deluser $user + putserv "PRIVMSG $nick :[format [::msgcat::mc op.deleted] $target $chan]" + putserv "PRIVMSG $nick :[format [::msgcat::mc db.user.deleted] $target]" + return 0 + } else { + putserv "PRIVMSG $nick :[format [::msgcat::mc op.deleted] $target $chan]" + return 0 + } + } + + # PM Ops + proc chanops_msg {nick uhost hand text} { + set chan [lindex [split $text] 0] + + if {![matchstr "#*" $chan]} { + putserv "PRIVMSG $nick :[::msgcat::mc pm.error.syntax] ops <#chan>" + return 0 + } + + if {![validchan $chan]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc bot.not.onchan] $chan]" + return 0 + } + + if {![matchattr $hand n]} { + putserv "PRIVMSG $nick :[format [::msgcat::mc error.no.access] $nick]" + return 0 + } + + putserv "PRIVMSG $nick :[format [::msgcat::mc chanop.list] $chan] [join [userlist |o $chan] {, }]" + return 0 + } + # ---------- DON'T TOUCH UNLESS YOU KNOW WHAT YOU'RE DOING ---------- # # ---------- # Auto add bans