Files
tclscripts/Chanban/chanban.tcl
T
2026-02-28 23:16:04 +01:00

685 lines
20 KiB
Tcl

# ----------
# 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"
# Command to upload the file
# Be aware that we are doing `cat $filename |` so you must account for that
variable upCommand "curl -s -F file=@- https://x0.at/"
# 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"
# Channel flag to auto add bans to the bot ban list
setudef flag addBans
# Nicks to ignore for auto adding bans
variable noAddNicks {
"ChanServ"
"NickServ"
"ChanBot"
}
# Masks to ignore for auto adding bans
variable noAddMasks {
"*!*@services.network.tld"
}
# ----------
# 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}autoadd ::cmgmt::autoadd_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 * autoadd ::cmgmt::autoadd_msg
bind msg * opcmds ::cmgmt::opcmds_msg
# ----------
# Auto add bans
# ----------
bind mode * * ::cmgmt::abans
# ----------
# 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.
# ----------
variable scriptName "Channel Management v1.1 by PeGaSuS"
# ----------
# Auto add bans
# ----------
proc abans {nick uhost hand chan mode target} {
set hostmask [maskhost ${nick}![getchanhost $nick $chan] 2]
set banReason "$::cmgmt::banReason \(auto-added\)"
if {$mode eq "+b" && [channel get $chan addBans]} {
if {$nick ne $::botnick && $nick ni $::cmgmt::noAddNicks && $hostmask ni $::cmgmt::noAddMasks && ![matchstr "~*" $target] && ![isban $target $chan]} {
newchanban $chan $target $nick $banReason 0
putserv "PRIVMSG $chan :$target auto-added to ${chan}'s ban list."
return 0
} else {
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 <nick>"
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 <nick>"
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 <nick>"
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 <mask>"
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 <banmask>"
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 autoadd_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 <on/off/status>"
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> <nick>"
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> <nick>"
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> <nick>"
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> <nick>"
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: kick <#chan> <nick>"
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> <nick>"
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::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> <nick>"
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> <mask>"
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> <nick>"
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 <banmask>"
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 autoadd_pub {nick uhost hand text} {
set chan [lindex [split $text] 0]
if {![matchstr "#*" $chan]} {
putserv "PRIVMSG $nick :ERROR! Syntax: autoadd <#chan> <on/off/status>"
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> <on/off/status>"
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"
return 0
}
putlog "-= $::cmgmt::scriptName loaded =-"
}