view feeds.tcl @ 0:1c4e2814cd41

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 21 Sep 2010 13:12:49 +0300
parents
children 51e6b16a7601
line wrap: on
line source

############################################################################
#
# FeedCheck v0.7 by ccr/TNSP <ccr@tnsp.org>
# (C) Copyright 2008-2010 Tecnic Software productions (TNSP) 
#
# Requires get_feeds.tcl to be run as a cronjob, for example
# 15 * * * *     /absolute/path/to/get_feeds.tcl
#
# This script is freely distributable under GNU GPL (version 2) license.
#
############################################################################

# Datafile, MUST be set to same as in get_feeds.tcl
set feeds_datafile "/home/niinuska/bot/data.feeds"

# Set channels and feed filters here:
# "channel" "feedname|feedname2"
# feednames can use matching, e.g. "mtv3*" would match all beginning with "mtv3"
array set feeds_channels {
  "mazmlame" "the adventurers|oots|mestari|blastwave"
  "fireball" "mestari"
  "tnsp" "the adventurers|oots|mestari"
}


set feeds_preferredmsg "PRIVMSG"


############################################################################
# No need to look below this line
############################################################################
set feeds_name "FeedCheck"
set feeds_message "$feeds_name v0.7 by ccr/TNSP"

putlog "$feeds_message"
bind pub - !feeds feeds_pubfetch
bind pub - !last feeds_publast


# -------------------------------------------------------------------------
proc feeds_smsg {uchan umsg} {
  global feeds_preferredmsg
  putserv "$feeds_preferredmsg $uchan :$umsg"
}

proc feeds_log {umsg} {
  global feeds_name
  putlog "$feeds_name: $umsg"
}

proc feeds_msg {urec} {
  global feeds_channels
  set uname [string tolower [lindex $urec 1]]
  foreach {uchan ufilter} [array get feeds_channels] {
    foreach umatch [split [string tolower $ufilter] "|"] {
      if {[string match $umatch $uname]} {
        feeds_smsg "#$uchan" "[lindex $urec 1]: \002[lindex $urec 3]\002 -- [lindex $urec 2]"
      }
    }
  }
}

proc feeds_ctime {utime} {
  if {$utime == "" || $utime == "*"} {
    set utime 0
  }
  return [clock format $utime -format "%d.%m.%Y %H:%M"]
}


# -------------------------------------------------------------------------  
proc feeds_check {} {
  global feeds_datafile
  
  set results {}
  
  # Otetaan aika
  set newtime [clock seconds]
  
  # Haetaan edellinen
  set oldtime 0
  if {![catch {set ufile [open "$feeds_datafile.time" r 0600]} uerrmsg]} {
    gets $ufile oldtime
    close $ufile
  } else {
    feeds_log "Could not open timefile: $uerrmsg"
  }
  
  # Tarkistetaan
  if {![catch {set ufile [open "$feeds_datafile" r 0600]} uerrmsg]} {
    while {![eof $ufile]} {
      gets $ufile uline
      set urec [split $uline "½"]
      if {[llength $urec] == 4 && [lindex $urec 0] > $oldtime} {
        lappend results $urec
      }
    }
    close $ufile
  } else {
    feeds_log "Could not open datafile: $uerrmsg"
  }
  
  # Talletetaan
  if {[llength $results] > 0} {
    if {![catch {set ufile [open "$feeds_datafile.time" w 0600]} uerrmsg]} {
      puts $ufile $newtime
      close $ufile
    }
  }
  
  return $results
}

# -------------------------------------------------------------------------  
proc feeds_exec {} {
  feeds_log "Checking for new entries."
  set uresult [feeds_check]
  set nresult [llength $uresult]
  if {$nresult >= 20} {
    feeds_log "$nresult entries, probably broken datafile. Ignoring."
  } else {
    foreach urec $uresult { feeds_msg $urec }
  }
  timer 5 feeds_exec
}

if {![info exists feeds_running]} {
  feeds_log "Starting timed feed check."
  timer 5 feeds_exec
  set feeds_running 1
}

# -------------------------------------------------------------------------
proc feeds_pubfetch {unick uhost uhand uchan utext} {
  feeds_log "Manual check invoked on $uchan."
  set uresult [feeds_check]
  set nresult [llength $uresult]
  if {$nresult > 0} {
    if {$nresult >= 20} {
      feeds_smsg $uchan "$nresult uutta, tod. näk. epäsynkissä. Ignoorataan."
    } else {
      foreach urec $uresult { feeds_msg $urec }
      feeds_smsg $uchan "$nresult uutta."
    }
  } else {
    feeds_smsg $uchan "Ei uusia."
  }
  
}


# -------------------------------------------------------------------------  
proc feeds_checklast {ufeed} {
  global feeds_datafile
  
  set result ""
  set oldtime 0
  set matsi [string tolower "*$ufeed*"]
  
  # Tarkistetaan
  if {![catch {set ufile [open "$feeds_datafile" r 0600]} uerrmsg]} {
    while {![eof $ufile]} {
      gets $ufile uline
      set urec [split $uline "½"]
      if {[llength $urec] == 4 && [lindex $urec 0] >= $oldtime} {
        if {[string match $matsi [string tolower [lindex $urec 1]]]} {
          set result $urec
          set oldtime [lindex $urec 0]
        }
      }
    }
    close $ufile
  } else {
    feeds_log "Could not open datafile: $uerrmsg"
  }
  
  return $result
}


proc feeds_publast {unick uhost uhand uchan utext} {
  set uresult [feeds_checklast $utext]
  if {$uresult != ""} {
    feeds_smsg $uchan "Uusin '[lindex $uresult 1]' / [feeds_ctime [lindex $uresult 0]]: [lindex $uresult 3] -- [lindex $uresult 2]"
  } else {
    feeds_smsg $uchan "Ei osumia haulla '$utext'."
  }
  
}