####################################################
# by wiebe @ QuakeNet
#
# when bans expire, all the info (creator, reason, etc) is lost
# this script logs that just before a ban expires
#
# script can use ircconsole when available
#
####################################################


####################################################
# expirebans:time
#
# check all bans and channel bans, log bans that expire in the next 10m
#
####################################################
bind time -|- "?0 * * * *" expirebans:time
proc expirebans:time { n h d m y } {
# global bans
  set n [clock seconds]; set z ""
  foreach b [banlist] {
    set e [lindex $b 2]; set a [lindex $b 3]; set m [lindex $b 0]; set r [lindex $b 1]
    if {$e >= [expr $n + 600]} { continue }
    if {[expr $e - $a] < 14460} { continue }
    set l [lindex $b 4]; set h [lindex $b 5]; lappend z $m
    set a [expirebans:dur $a]; set e [expirebans:dur $e]
    if {[string equal $l 0]} { set l never } else { set l [expirebans:dur $l] }
    putloglev k * "ban: EXPIRE $m   $a/$l/$e   $h: $r"
  }
  if {![string equal $z ""] && ![string equal [info procs ircconsole] ""]} {
    ircconsole * E EXPIRE "ban [join $z "  "]"
  }
# channel bans
  foreach c [channels] {
    set z ""
    foreach b [banlist $c] {
      set e [lindex $b 2]; set a [lindex $b 3]; set m [lindex $b 0]; set r [lindex $b 1]
      if {$e >= [expr $n + 600]} { continue }
      if {[expr $e - $a] < 14460} { continue }
      set l [lindex $b 4]; set h [lindex $b 5]; lappend z $m
      set a [expirebans:dur $a]; set e [expirebans:dur $e]
      if {[string equal $l 0]} { set l never } else { set l [expirebans:dur $l] }
      putloglev k $c "ban: EXPIRE $c $m   $a/$l/$e   $h: $r"
    }
    if {![string equal $z ""] && ![string equal [info procs ircconsole] ""]} {
      ircconsole $c e EXPIRE "ban [join $z "  "]"
    }
  }
}


####################################################
# expirebans:dur
# give ts, returns XyXwXhXmXs
####################################################
proc expirebans:dur { t } {
  if {![string is digit $t]} { return 0 }
  set t [expr $t - [clock seconds]]
  if {$t < 0} { set t [expr $t * -1] }
  set t [duration $t]
  set t [string map "seconds s second s minutes m minute m hours h hour h" $t]
  set t [string map "days d day d weeks w week w years y year y" $t]
  return [join [lrange [split $t] 0 1] ""]
}


set scriptdb(expirebans) {
  "logs bans and their complete info when they are about to expire, allow info about expired bans to be looked up in the log"
}

