view feeds.tcl @ 435:5edaebbbb7f2

feeds: Also show UNIX timestamp along with translated timestamp.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 09 Jan 2017 04:19:10 +0200
parents 366324c417d8
children 4b6ae9765903
line wrap: on
line source

##########################################################################
#
# FeedCheck v1.1 by Matti 'ccr' Hamalainen <ccr@tnsp.org>
# (C) Copyright 2008-2017 Tecnic Software productions (TNSP)
#
# Requires fetch_feeds.tcl to be run as a cronjob, for example
# 15 * * * *     /absolute/path/to/fetch_feeds.tcl
#
# See also create_feeds_db.tcl OR convert_feeds_db.tcl, as you will
# need to either create a SQLite3 database or convert old text flat
# file to SQLite3.
#
# This script is freely distributable under GNU GPL (version 2) license.
#
##########################################################################

### The configuration should be in config.feeds in same directory
### as this script. Or change the line below to point where ever
### you wish. See "config.feeds.example" for an example config file.
source [file dirname [info script]]/config.feeds

### Required utillib.tcl
source [file dirname [info script]]/utillib.tcl


##########################################################################
# No need to look below this line
##########################################################################
package require sqlite3

set feeds_name "FeedCheck"
set feeds_message "$feeds_name v1.1 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 {utime ufeed uurl utitle} {
  global feeds_channels
  foreach {uchan ufilter} [array get feeds_channels] {
    foreach umatch [split $ufilter "|"] {
      if {[string match -nocase $umatch $ufeed]} {
        feeds_smsg "$uchan" "$ufeed: \002$utitle\002 -- $uurl"
      }
    }
  }
}


### Open database, etc
if {[catch {sqlite3 feeds_dbh $feeds_dbfile} uerrmsg]} {
  puts "Could not open SQLite3 database '$feeds_dbfile': $uerrmsg."
  exit 2
}


# ------------------------------------------------------------------------
proc feeds_check_start {} {
  global feeds_dbfile

  set oldtime 0
  if {![catch {set ufile [open "$feeds_dbfile.time" r 0600]} uerrmsg]} {
    gets $ufile oldtime
    close $ufile
  } else {
    feeds_log "Could not open timefile: $uerrmsg"
    set oldtime [clock seconds]
  }

  return $oldtime
}


proc feeds_check_end {} {
  global feeds_dbfile

  if {![catch {set ufile [open "$feeds_dbfile.time" w 0600]} uerrmsg]} {
    puts $ufile [clock seconds]
    close $ufile
  }
}

# ------------------------------------------------------------------------
proc feeds_exec {} {
  global feeds_dbh feeds_check_period feeds_running feeds_sync_limit

#  feeds_log "Timed feed check."
  set oldtime [feeds_check_start]
  set usql "SELECT feed AS ufeed, title AS utitle, url AS uurl, utime AS utime FROM feeds WHERE utime > $oldtime ORDER BY utime ASC"
  set nresult [feeds_dbh onecolumn "SELECT COUNT(*) FROM feeds WHERE utime > $oldtime"]

  if {$nresult > $feeds_sync_limit} {
    feeds_log "$nresult new entries, probably unsynchronized. Ignoring."
  } else {
    feeds_log "$nresult new entries since $oldtime ( [utl_ctime $oldtime] ) .."
    feeds_dbh eval $usql {
      feeds_msg $utime $ufeed $uurl $utitle
    }
  }

  if {$nresult > 0} {
    feeds_check_end
  }

  set feeds_running [clock seconds]
  timer $feeds_check_period feeds_exec
}


if {[info exists feeds_running]} {
  set feeds_last [expr [clock seconds] - $feeds_running]
} else {
  set feeds_last -1
}

if {$feeds_last < 0 || $feeds_last > [expr $feeds_check_period * 60]} {
  feeds_log "Starting timed feed check."
  feeds_exec
}


# ------------------------------------------------------------------------
proc feeds_pubfetch {unick uhost uhand uchan utext} {
  global feeds_dbh feeds_sync_limit
#  feeds_log "Manual check invoked on $uchan."

  set oldtime [feeds_check_start]
  set nresult [feeds_dbh onecolumn "SELECT COUNT(*) FROM feeds WHERE utime > $oldtime"]

  if {$nresult > 0} {
    feeds_check_end
    if {$nresult > $feeds_sync_limit} {
      feeds_smsg $uchan "$nresult uutta, tod. näk. epäsynkissä. Ignoorataan."
    } else {
      set usql "SELECT feed AS ufeed, title AS utitle, url AS uurl, utime AS utime FROM feeds WHERE utime > $oldtime ORDER BY utime ASC"
      feeds_dbh eval $usql {
        feeds_msg $utime $ufeed $uurl $utitle
        set found 1
      }
      feeds_smsg $uchan "$nresult uutta."
    }
  } else {
    feeds_smsg $uchan "Ei uusia."
  }
}


# ------------------------------------------------------------------------
proc feeds_publast {unick uhost uhand uchan utext} {
  global feeds_dbh
  set ufound 0

  set usql "SELECT url AS uurl, feed AS ufeed, title AS utitle, utime AS utime FROM feeds WHERE feed LIKE '%[string tolower [utl_escape $utext]]%' ORDER BY utime DESC LIMIT 1"
  feeds_dbh eval $usql {
    feeds_smsg $uchan "Uusin '$ufeed' / [utl_ctime $utime]: $utitle -- $uurl"
    set ufound 1
  }

  if {$ufound == 0} {
    feeds_smsg $uchan "Ei osumia haulla '$utext'."
  }
}