529 lines
15 KiB
Tcl
529 lines
15 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"
|
|
|
|
# -----
|
|
# 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 <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
|
|
}
|
|
|
|
### 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> <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
|
|
}
|
|
|
|
### 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
|
|
}
|
|
} |