Adding a cleanup function required storing last-seen times which required a whole mess of things. I try to keep it as accurate as possible by tracking join, part, disconnect, and exit events. Right now it's set to delete anyone that hasn't been seen in 5 days time.

In general to get points you use $get.pts(#,$nick) and to set use /add.pts # $nick %points. It's a bit of a misnomer but there is already support for negative points, so you can /add.pts somechan somenick -20.

And if you take nothing else, note I've made a correction to the load.pts alias.

Code:
on !*:join:#:{
  $+(.timerpoints.,#,.,$nick) 0 1800 add.pts # $nick

  set.login # $nick
}

on !*:part:#:{
  $+(.timerpoints.,#,.,$nick) off

  set.login # $nick
}

on me:*:join:#:{
  noop $hash.load(login. $+ #,Login.ini,#)
  noop $load.pts(points. $+ #,Points.ini,#)
}

on me:*:part:#:{
  set.login.channel #
}

on *:disconnect:{
  var %i = 1
  while ($chan(%i)) {
    var %chan = $v1, %table = points. $+ %chan

    if ($hget(%table) != $null) {
      set.login.channel %chan
    }
    inc %i
  }
}

on *:exit:{
  save.pts
}

alias clean.pts {
  var %chan = $$1, %login.table = login. $+ %chan, %points.table = points. $+ %chan
  var %login.file = Login.ini, %points.file = Points.ini
  var %limit = 432000, %i = 1
  var %threshold = $ctime - %limit

  noop $hash.load(%login.table,%login.file,%chan)
  noop $load.pts(%points.table,%points.file,%chan)

  while ($hget(%points.table,%i).item) {
    var %nick = $v1, %login = $hget(%login.table,%nick)

    if (%nick ison %chan) || (%login == $null) {
      set.login %chan %nick $ctime
    }
    elseif (%login < %threshold) {
      hdel %login.table %nick
      hdel %points.table %nick
    }

    inc %i
  }

  hsave -i %login.table %login.file %chan
  hsave -i %points.table %points.file %chan
}

alias -l set.login {
  var %chan = $$1, %nick = $$2, %time = $iif($3,$3,$ctime), %table = login. $+ %chan, %file = Login.ini

  if (!$get.pts(%chan,%nick)) return

  noop $hash.load(%table,%file,%chan)

  hadd -m %table %nick %time

  .timerset.login $+ %chan 1 5 hsave -i %table %file %chan
}

alias -l set.login.channel {
  var %chan = $1, %table = login. $+ %chan, %file = Login.ini, %i = 1
  while ($nick(%chan,%i)) {
    set.login %chan $v1 $ctime
    inc %i
  }

  hsave -i %table %file %chan
}

alias -l hash.load {
  var %table = $1, %file = $2, %topic = $3

  if (!$hget(%table)) {
    hmake %table
    if ($ini(%file,%topic)) hload -i %table %file %topic
  }
}

alias -l add.pts {
  var %chan = $$1, %nick = $$2, %points = $3, %table = points. $+ %chan, %file = Points.ini

  noop $load.pts(%table,%file,%chan)

  hinc %table %nick %points

  .timeradd.pts. $+ %chan 1 5 hsave -i %table %file %chan
}

alias -l get.pts {
  var %chan = $$1, %nick = $$2, %table = points. $+ %chan, %file = Points.ini

  noop $load.pts(%table,%file,%chan)

  return $hget(%table,%nick)
}

alias -l load.pts {
  var %table = $1, %file = $2, %topic = $3

  if (!$hget(%table)) {
    hmake %table
    hadd -m points.meta %table %topic
    hsave -i points.meta %file meta

    if ($ini(%file,%topic)) hload -i %table %file %topic
  }
}

alias -l save.pts {
  var %file = Points.ini, %i = 1

  while ($hget(points.meta,%i).item) {
    var %table = $v1, %topic = $hget(points.meta,%table)

    hsave -i %table %file %topic

    inc %i
  }
}