bind pub * "!c" conoops
proc conoops {nick uhost hand chan text} {
if {$chan eq "#archivebot"} {
if {[isvoice $nick $chan] || [isop $nick $chan]} {
putserv "PRIVMSG $chan :oops, $nick! try !con :c"
} else {
putserv "PRIVMSG #fire-trail :\[atmisc\] ignored \"!c $text\" from $nick!$uhost in $chan - not a voice or an op"
}
}
}
bind pub * "!statussy" statussy
# the following three for systwi
bind pub * "!statys" statussy
bind pub * "!statis" statussy
bind pub * "!s" statussy
proc statussy {nick uhost hand chan text} {
if {$chan eq "#archivebot"} {
if {[isvoice $nick $chan] || [isop $nick $chan]} {
putserv "PRIVMSG $chan :!status $text"
} else {
putserv "PRIVMSG #fire-trail :\[atmisc\] ignored \"!statussy/!statys/!statis/!s $text\" from $nick!$uhost in $chan - not a voice or an op"
}
}
}
bind pub * "!help" abhelp
proc abhelp {nick uhost hand chan text} {
if {$chan eq "#archivebot"} {
putserv "PRIVMSG $chan :$nick: see https://archivebot.readthedocs.io/"
}
}
bind pub * "!ignores" ignores
bind pub * "!igs" ignores
proc ignores {nick uhost hand chan text} {
if {$chan eq "#archivebot"} {
if {[isvoice $nick $chan] || [isop $nick $chan]} {
putserv "PRIVMSG $chan :$nick: http://archivebot.com/ignores/$text?compact=true"
} else {
putserv "PRIVMSG #fire-trail :\[atmisc\] ignored \"!ignores/!igs $text\" from $nick!$uhost in $chan - not a voice or an op"
}
}
}
package require uri
proc loadPublicSuffixList {filename} {
set publicSuffixList [dict create]
set file [open $filename]
while {[gets $file line] >= 0} {
if {[string trim $line] eq "" || [string index $line 0] eq "/" || [string index $line 0] eq "!"} {
continue
}
# Normalize the line for processing
set line [string map {"*." ""} $line]
dict set publicSuffixList $line 1
}
close $file
return $publicSuffixList
}
proc extractRegistrableDomain {domain publicSuffixList} {
set parts [split $domain "."]
set partCount [llength $parts]
for {set i 0} {$i < $partCount} {incr i} {
set suffix [join [lrange $parts $i end] "."]
if {[dict exists $publicSuffixList $suffix]} {
if {$i > 0} {
return [join [lrange $parts [expr {$i - 1}] end] "."]
} else {
return $domain
}
}
}
return $domain
}
set PSLfilename "public_suffix_list.dat"
set thePSL [loadPublicSuffixList $PSLfilename]
proc igDomain {nick uhost hand chan text reStart reEnd} {
if {$chan eq "#archivebot"} {
if {[isvoice $nick $chan] || [isop $nick $chan]} {
global thePSL
set components [uri::split $text]
set hostname [dict get $components "host"]
set registrableDomain [extractRegistrableDomain $hostname $thePSL]
set escapedDomain [string map { "." "\\." } $registrableDomain]
putserv "PRIVMSG $chan :$nick: $reStart$escapedDomain$reEnd"
} else {
putserv "PRIVMSG #fire-trail :\[atmisc\] ignored \"!igd $text\" from $nick!$uhost in $chan - not a voice or an op"
}
}
}
bind pub * "!igd" igd
proc igd {nick uhost hand chan text} {
igDomain $nick $uhost $hand $chan $text "^(http|ftp)s?://(\[^/\]*\[@.\])?" "\\.?(:\\d+)?/"
}
bind pub * "!ignd" ignd
proc ignd {nick uhost hand chan text} {
igDomain $nick $uhost $hand $chan $text "^(http|ftp)s?://(?!(\[^/\]*\[@.\])?" "\\.?(:\\d+)?/)"
}
bind pub * "!b" bmeme
proc bmeme {nick uhost hand chan text} {
if {$chan eq "#jseater"} {
return
}
putserv "PRIVMSG $chan :🅱️"
}
bind pub * "!ping" pingcmd
proc pingcmd {nick uhost hand chan text} {
if {$text eq ""} {
putserv "PRIVMSG $chan :$nick: pong!"
} else {
putserv "PRIVMSG $chan :$nick: pong ($text)!"
}
}
bind pub * "!ß" punycode
proc punycode {nick uhost hand chan text} {
putserv "PRIVMSG $chan :...scheiße!"
putserv "PRIVMSG $chan :UnicodeError: ('IDNA does not round-trip', b'xn--scheie-fta', b'scheisse')"
}
bind pub * !z utctime
bind pub * !utc utctime
proc utctime {nick uhost hand chan text} {
set now [clock seconds]
set iso_time [clock format $now -format "%Y-%m-%dT%H:%M:%SZ" -gmt true]
putserv "PRIVMSG $chan :$iso_time"
}