changeset 565:cd5dd38466cf

feeds: More refactoring.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 10 Jul 2020 01:22:55 +0300
parents f85b5c572292
children 4cd72a178cbf
files config.feeds.example feeds.tcl
diffstat 2 files changed, 141 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/config.feeds.example	Thu Jul 09 22:07:16 2020 +0300
+++ b/config.feeds.example	Fri Jul 10 01:22:55 2020 +0300
@@ -79,6 +79,10 @@
 }
 
 
+# History limit
+set feeds_history_limit 4
+
+
 # 1 = Enable logging of various script actions into bot's log
 # 0 = Don't.
 set feeds_log_enable 1
@@ -114,8 +118,8 @@
 
 array set feeds_messages {
 
-  "help_full" {"help"}
-  "help" "@cmd@ \[latest \[<feed>\]|list|history\]"
+  "help_full" {"help_latest" "help_list" "help_history" "help_force"}
+  "help_latest" "@cmd@ latest \[<feed>\]"
 
   "chk_unsync_entries" "Epäsynkki."
   "chk_new_entries" "@1@ uutta."
@@ -124,7 +128,27 @@
   "search_latest_feed" "Uusin '@1@' / @2@: @3@ -- @4@"
   "search_no_matches"  "Ei osumia haulla '@1@'."
 
-  "history_list" "Feedien historia: @1@"
-  "history_list_item" "@1@ (@2@)"
-  "history_list_sep" ", "
+  "feed_list_active" "Aktiiviset feedit (uudemmat kuin @1@) -- @2@"
+  "feed_list_all" "Kaikki feedit:\n@1@"
+  "feed_list_filter" "Kaikki '@1@' mätsäävät feedit:\n@2@"
+
+  "feed_list_item_short" "@1@ (@2@)"
+  "feed_list_sep_short" ", "
+
+  "feed_list_item_long" "@1@ (@2@) @3@ @4@"
+  "feed_list_sep_long" "\n"
+  "feed_list_long_denied" "EIII PYSTY, koita privana @cmd@ @1@"
+
+  "help_list" "@cmd@ list \[long\] \[feedin nimi patterni\]"
+
+  "history_list" "Feedin '@1@' historia:\n@2@"
+  "history_list_item" "@3@: '@2@' -- @1@"
+  "history_list_sep" "\n"
+
+  "help_history" "@cmd@ hist <feedin nimi>"
+
+  "multiple_matches" "'@1@' mätsää useampaan kuin yhteen."
+  "no_matches"  "Ei feediä haulla '@1@'."
+
+  "help_force" "@cmd@ force"
 }
--- a/feeds.tcl	Thu Jul 09 22:07:16 2020 +0300
+++ b/feeds.tcl	Fri Jul 10 01:22:55 2020 +0300
@@ -87,7 +87,7 @@
     # Too many items, don't spam the channels
     feeds_log "${nresult} new entries since [utl_ctime $oldtime], probably unsynchronized. Ignoring."
     if {$uforce} {
-      feeds_msg $upublic $unick $uchan "chk_unsync_entries" [list $nresult $oldtime [utl_ctime $oldtime]]
+      feeds_msg $upublic $unick $uchan "chk_unsync_entries" [list $nresult [utl_ctime $oldtime]]
     }
   } else {
     # Spam the channels with new items
@@ -127,9 +127,34 @@
 }
 
 
+proc feeds_validate_name {upublic unick uchan upattern ufeed} {
+  global feeds_dbh
+  upvar 1 $ufeed rfeed
+
+  # Check value
+  if {$upattern == ""} {
+    set ufeed ""
+    return 1
+  }
+
+  # Check if there are multiple matches
+  set usql "SELECT COUNT(DISTINCT(feed)) AS nfeeds,feed AS rfeed FROM feeds WHERE feed LIKE '%[utl_escape $upattern]%'"
+  feeds_dbh eval $usql {}
+
+  if {$nfeeds > 1} {
+    feeds_msg $upublic $unick $uchan "multiple_matches" [list $upattern]
+    return 0
+  } elseif {$nfeeds == 0} {
+    feeds_msg $upublic $unick $uchan "no_matches" [list $upattern]
+    return 0
+  } else {
+    return 1
+  }
+}
+
 # ------------------------------------------------------------------------
 proc feeds_cmd {unick uhost uhand uchan uargs upublic} {
-  global feeds_dbh feeds_messages
+  global feeds_dbh feeds_messages feeds_history_limit
 
   # Check and handle arguments
   set rarglist [::textutil::split::splitx $uargs {\s+}]
@@ -147,6 +172,13 @@
     # Show latest entry or latest entry of specified feed
     set ufound 0
     set utext [string tolower [join $rargs " "]]
+
+    # Validate feed name
+    set ufeed ""
+    if {![feeds_validate_name $upublic $unick $uchan $utext $ufeed]} {
+      return 0
+    }
+
     set usql "SELECT url AS uurl, feed AS ufeed, title AS utitle, utime AS utime FROM feeds WHERE feed LIKE '%[utl_escape $utext]%' ORDER BY utime DESC LIMIT 1"
     feeds_dbh eval $usql {
       feeds_msg $upublic $unick $uchan "search_latest_feed" [list $ufeed [utl_ctime $utime] $utitle $uurl]
@@ -163,24 +195,93 @@
     }
     feeds_check_do 1 $upublic $unick $uchan
   } elseif {[string match "list*" $rcmd]} {
-    # TODO FIXME -
-    feeds_smsg $upublic $unick $uchan "help"
+    # List feeds
+    set uarg [lindex $rargs 0]
+
+    if {$uarg == "all" || $uarg == "long" || $uarg == "kaikki"} {
+      # Long list
+      set utext [string tolower [join [lrange $rargs 1 end] " "]]
+
+      if {$upublic} {
+        feeds_msg $upublic $unick $uchan "feed_list_long_denied" [list $rcmd $utext]
+        return 0
+      }
+
+      set ulistitem [feeds_qm "feed_list_item_long"]
+      set ulistsep [feeds_qm "feed_list_sep_long"]
+
+      set usql "SELECT feed AS ufeed, MAX(utime) AS ulatest, MIN(utime) AS uoldest, COUNT(feed) AS nitems FROM feeds WHERE feed LIKE '%[utl_escape $utext]%' GROUP BY feed"
+      set ulist {}
+
+      feeds_dbh eval $usql {
+        lappend ulist [utl_str_map_values $ulistitem [list $ufeed [utl_ctime $ulatest] [utl_ctime $uoldest] $nitems]]
+      }
+
+      if {$utext != ""} {
+        feeds_msg $upublic $unick $uchan "feed_list_filter" [list $utext [join $ulist $ulistsep]]
+      } else {
+        feeds_msg $upublic $unick $uchan "feed_list_all" [list [join $ulist $ulistsep]]
+      }
+    } elseif {$uarg != ""} {
+      # List feeds with a name filter
+      set utext [string tolower [join $rargs " "]]
+
+      set ulistitem [feeds_qm "feed_list_item_short"]
+      set ulistsep [feeds_qm "feed_list_sep_short"]
+
+      set usql "SELECT feed AS ufeed, MAX(utime) AS ulatest, MIN(utime) AS uoldest, COUNT(feed) AS nitems FROM feeds WHERE feed LIKE '%[utl_escape $utext]%' GROUP BY feed"
+      set ulist {}
+
+      feeds_dbh eval $usql {
+        lappend ulist [utl_str_map_values $ulistitem [list $ufeed [utl_ctime $ulatest] [utl_ctime $uoldest] $nitems]]
+      }
+
+      feeds_msg $upublic $unick $uchan "feed_list_filter" [list $utext [join $ulist $ulistsep]]
+    } else {
+      # List any active feeds
+      set uold [expr [clock seconds] - 60*60*24*365]
+
+      set ulistitem [feeds_qm "feed_list_item_short"]
+      set ulistsep [feeds_qm "feed_list_sep_short"]
+
+      set usql "SELECT feed AS ufeed, MAX(utime) AS ulatest, MIN(utime) AS uoldest, COUNT(feed) AS nitems FROM feeds GROUP BY feed HAVING ulatest >= $uold"
+      set ulist {}
+
+      feeds_dbh eval $usql {
+        lappend ulist [utl_str_map_values $ulistitem [list $ufeed [utl_ctime $ulatest] [utl_ctime $uoldest] $nitems]]
+      }
+
+      feeds_msg $upublic $unick $uchan "feed_list_active" [list [utl_ctime $uold] [join $ulist $ulistsep]]
+    }
 
   } elseif {[string match "hist*" $rcmd]} {
-    # Show history of feeds
+    # Show history of a feed
+    if {[llength $rarglist] < 2} {
+      feeds_msg $upublic $unick $uchan "help_history"
+      return 0
+    }
+
+    set utext [string tolower [join $rargs " "]]
+    if {$upublic} {
+      feeds_msg $upublic $unick $uchan "feed_list_long_denied" [list $rcmd $utext]
+      return 0
+    }
+
+    # Validate feed name
+    if {![feeds_validate_name $upublic $unick $uchan $utext $ufeed]} {
+      return 0
+    }
+
     set ulistitem [feeds_qm "history_list_item"]
     set ulistsep [feeds_qm "history_list_sep"]
-
-    # TODO FIXME - does not work as intended, should list feed with latest item's timestamp
-    # and number of items
-    set usql "SELECT feed AS ufeed, utime FROM feeds GROUP BY feed ORDER BY utime DESC,feed DESC"
+    set usql "SELECT url AS uurl, title AS utitle, utime FROM feeds WHERE feed='[utl_escape $ufeed]' ORDER BY utime DESC LIMIT ${feeds_history_limit}"
     set ulist {}
 
     feeds_dbh eval $usql {
-      lappend ulist [utl_str_map_values $ulistitem [list $ufeed [utl_ctime $utime]]]
+      lappend ulist [utl_str_map_values $ulistitem [list $uurl $utitle [utl_ctime $utime]]]
     }
 
-    feeds_msg $upublic $unick $uchan "history_list" [list [join $ulist $ulistsep]]
+    feeds_msg $upublic $unick $uchan "history_list" [list $ufeed [join $ulist $ulistsep]]
   } else {
     # Help/usage
     feeds_msg $upublic $unick $uchan "help"