From d2c6ca665fda2728a8e6085f473b0f580769f337 Mon Sep 17 00:00:00 2001 From: Teh PeGaSuS Date: Sat, 28 Feb 2026 00:43:11 +0100 Subject: [PATCH] Add Chanban/chanban.tcl --- Chanban/chanban.tcl | 526 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 526 insertions(+) create mode 100644 Chanban/chanban.tcl diff --git a/Chanban/chanban.tcl b/Chanban/chanban.tcl new file mode 100644 index 0000000..de7a607 --- /dev/null +++ b/Chanban/chanban.tcl @@ -0,0 +1,526 @@ +# ------------------ +# Channel Management +# ------------------ +namespace eval cmgmt { + # ------------- + # Configuration + # ------------- + # 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" + + # Set the banmask to use in banning the user + # Available types are: + # 0 *!user@host + # 1 *!*user@host + # 2 *!*@host + # 3 *!*user@*.host + # 4 *!*@*.host + # 5 nick!user@host + # 6 nick!*user@host + # 7 nick!*@host + # 8 nick!*user@*.host + # 9 nick!*@*.host + variable banMask "2" + + # ----- + # Binds + # ----- + ### Public + 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}unban ::cmgmt::unban_pub + bind pub * ${::cmgmt::trigger}banlist ::cmgmt::banlist_pub + bind pub * ${::cmgmt::trigger}opcmds ::cmgmt::opcmds_pub + + ### Private + bind msg * ban ::cmgmt::ban_msg + bind msg * tban ::cmgmt::tban_msg + bind msg * kick ::cmgmt::kick_msg + bind msg * unban ::cmgmt::unban_msg + bind msg * banlist ::cmgmt::banlist_msg + bind msg * opcmds ::cmgmt::opcmds_msg + # -------------------- + # End of configuration + # -------------------- + + # ---------- + # DON'T TOUCH ANYTHING BELOW UNLESS YOU KNOW WHAT YOU ARE DOING + # + # If you touch the code below and then complain the script "suddenly stopped working" I'll touch you at night. + # ---------- + + # ------------ + # 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 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + 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 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + 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 + } + + 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] + if {$cbans eq ""} { + 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 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 :: 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 | curl -s -F file=@- http://hotpaste.0bin.xyz/] + } 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 + } + + ### 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" + 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 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + 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 + } + + set bhost [string trim [getchanhost $target $chan] ~] + + 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: 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 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 + } + putkick $chan $target $::cmgmt::tBanReason + 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 chan 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] + if {$cbans eq ""} { + 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 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 :: 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 | curl -s -F file=@- http://hotpaste.0bin.xyz/] + } 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 + } + + ### 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" + return 0 + } +} \ No newline at end of file