# HG changeset patch # User Matti Hamalainen # Date 1594333375 -10800 # Node ID cd5dd38466cf31a10ae8469aabd3a2e967c64146 # Parent f85b5c57229273d8778a94877c604f51241027a4 feeds: More refactoring. diff -r f85b5c572292 -r cd5dd38466cf config.feeds.example --- 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 \[\]|list|history\]" + "help_full" {"help_latest" "help_list" "help_history" "help_force"} + "help_latest" "@cmd@ latest \[\]" "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 " + + "multiple_matches" "'@1@' mätsää useampaan kuin yhteen." + "no_matches" "Ei feediä haulla '@1@'." + + "help_force" "@cmd@ force" } diff -r f85b5c572292 -r cd5dd38466cf feeds.tcl --- 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"