/** * Send by mail a digest of last articles. * * @param mixed $link The database connection. * @param integer $limit The maximum number of articles by digest. * @return boolean Return false if digests are not enabled. */ function send_headlines_digests($debug = false) { require_once 'classes/ttrssmailer.php'; $user_limit = 15; // amount of users to process (e.g. emails to send out) $limit = 1000; // maximum amount of headlines to include if ($debug) { _debug("Sending digests, batch of max {$user_limit} users, headline limit = {$limit}"); } if (DB_TYPE == "pgsql") { $interval_query = "last_digest_sent < NOW() - INTERVAL '1 days'"; } elseif (DB_TYPE == "mysql") { $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL 1 DAY)"; } $result = db_query("SELECT id,email FROM ttrss_users\n WHERE email != '' AND (last_digest_sent IS NULL OR {$interval_query})"); while ($line = db_fetch_assoc($result)) { if (@get_pref('DIGEST_ENABLE', $line['id'], false)) { $preferred_ts = strtotime(get_pref('DIGEST_PREFERRED_TIME', $line['id'], '00:00')); // try to send digests within 2 hours of preferred time if ($preferred_ts && time() >= $preferred_ts && time() - $preferred_ts <= 7200) { if ($debug) { _debug("Sending digest for UID:" . $line['id'] . " - " . $line["email"]); } $do_catchup = get_pref('DIGEST_CATCHUP', $line['id'], false); global $tz_offset; // reset tz_offset global to prevent tz cache clash between users $tz_offset = -1; $tuple = prepare_headlines_digest($line["id"], 1, $limit); $digest = $tuple[0]; $headlines_count = $tuple[1]; $affected_ids = $tuple[2]; $digest_text = $tuple[3]; if ($headlines_count > 0) { $mail = new ttrssMailer(); $rc = $mail->quickMail($line["email"], $line["login"], DIGEST_SUBJECT, $digest, $digest_text); if (!$rc && $debug) { _debug("ERROR: " . $mail->ErrorInfo); } if ($debug) { _debug("RC={$rc}"); } if ($rc && $do_catchup) { if ($debug) { _debug("Marking affected articles as read..."); } catchupArticlesById($affected_ids, 0, $line["id"]); } } elseif ($debug) { _debug("No headlines"); } db_query("UPDATE ttrss_users SET last_digest_sent = NOW()\n WHERE id = " . $line["id"]); } } } if ($debug) { _debug("All done."); } }
function catchupSelected() { $ids = explode(",", db_escape_string($_REQUEST["ids"])); $cmode = sprintf("%d", $_REQUEST["cmode"]); catchupArticlesById($this->link, $ids, $cmode); print json_encode(array("message" => "UPDATE_COUNTERS")); }
function catchup_feed($link, $feed, $cat_view, $owner_uid = false, $max_id = false) { if (!$owner_uid) { $owner_uid = $_SESSION['uid']; } //if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) { $ref_check_qpart = $max_id && !get_pref($link, 'REVERSE_HEADLINES') ? "ref_id <= '{$max_id}'" : "true"; if (is_numeric($feed)) { if ($cat_view) { if ($feed >= 0) { if ($feed > 0) { $children = getChildCategories($link, $feed, $owner_uid); array_push($children, $feed); $children = join(",", $children); $cat_qpart = "cat_id IN ({$children})"; } else { $cat_qpart = "cat_id IS NULL"; } db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE feed_id IN (SELECT id FROM ttrss_feeds WHERE {$cat_qpart})\n\t\t\t\t\t\t\tAND {$ref_check_qpart} AND unread = true\n\t\t\t\t\t\t\tAND owner_uid = {$owner_uid}"); } else { if ($feed == -2) { db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW() WHERE (SELECT COUNT(*)\n\t\t\t\t\t\t\t\tFROM ttrss_user_labels2 WHERE article_id = ref_id) > 0\n\t\t\t\t\t\t\t\tAND {$ref_check_qpart}\n\t\t\t\t\t\t\t\tAND unread = true AND owner_uid = {$owner_uid}"); } } } else { if ($feed > 0) { db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE feed_id = '{$feed}'\n\t\t\t\t\t\t\tAND {$ref_check_qpart} AND unread = true\n\t\t\t\t\t\t\tAND owner_uid = {$owner_uid}"); } else { if ($feed < 0 && $feed > -10) { // special, like starred if ($feed == -1) { db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE marked = true\n\t\t\t\t\t\t\tAND {$ref_check_qpart} AND unread = true\n\t\t\t\t\t\t\tAND owner_uid = {$owner_uid}"); } if ($feed == -2) { db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE published = true\n\t\t\t\t\t\t\tAND {$ref_check_qpart} AND unread = true\n\t\t\t\t\t\t\tAND owner_uid = {$owner_uid}"); } if ($feed == -3) { $intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE"); if (DB_TYPE == "pgsql") { $match_part = "updated > NOW() - INTERVAL '{$intl} hour' "; } else { $match_part = "updated > DATE_SUB(NOW(),\n\t\t\t\t\t\t\t\tINTERVAL {$intl} HOUR) "; } $result = db_query($link, "SELECT id FROM ttrss_entries,\n\t\t\t\t\t\t\tttrss_user_entries WHERE {$match_part} AND\n\t\t\t\t\t\t\tunread = true AND\n\t\t\t\t\t\t \tttrss_user_entries.ref_id = ttrss_entries.id AND\n\t\t\t\t\t\t\towner_uid = {$owner_uid}"); $affected_ids = array(); while ($line = db_fetch_assoc($result)) { array_push($affected_ids, $line["id"]); } catchupArticlesById($link, $affected_ids, 0); } if ($feed == -4) { db_query($link, "UPDATE ttrss_user_entries\n\t\t\t\t\t\t\tSET unread = false,last_read = NOW()\n\t\t\t\t\t\t\tWHERE {$ref_check_qpart} AND unread = true AND\n\t\t\t\t\t\t\towner_uid = {$owner_uid}"); } } else { if ($feed < -10) { // label $label_id = -$feed - 11; db_query($link, "UPDATE ttrss_user_entries, ttrss_user_labels2\n\t\t\t\t\t\tSET unread = false, last_read = NOW()\n\t\t\t\t\t\t\tWHERE label_id = '{$label_id}' AND unread = true\n\t\t\t\t\t\t\tAND {$ref_check_qpart}\n\t\t\t\t\t\t\tAND owner_uid = '{$owner_uid}' AND ref_id = article_id"); } } } } ccache_update($link, $feed, $owner_uid, $cat_view); } else { // tag db_query($link, "BEGIN"); $tag_name = db_escape_string($feed); $result = db_query($link, "SELECT post_int_id FROM ttrss_tags\n\t\t\t\t\tWHERE tag_name = '{$tag_name}' AND owner_uid = {$owner_uid}"); while ($line = db_fetch_assoc($result)) { db_query($link, "UPDATE ttrss_user_entries SET\n\t\t\t\t\t\tunread = false, last_read = NOW()\n\t\t\t\t\t\tWHERE {$ref_check_qpart} AND unread = true\n\t\t\t\t\t\tAND int_id = " . $line["post_int_id"]); } db_query($link, "COMMIT"); } }
} $op = $_REQUEST["op"]; switch ($op) { case "toggleMarked": $cmode = db_escape_string($_REQUEST["mark"]); $id = db_escape_string($_REQUEST["id"]); markArticlesById(array($id), $cmode); break; case "togglePublished": $cmode = db_escape_string($_REQUEST["pub"]); $id = db_escape_string($_REQUEST["id"]); publishArticlesById(array($id), $cmode); break; case "toggleUnread": $cmode = db_escape_string($_REQUEST["unread"]); $id = db_escape_string($_REQUEST["id"]); catchupArticlesById(array($id), $cmode); break; case "setPref": $id = db_escape_string($_REQUEST["id"]); $value = db_escape_string($_REQUEST["to"]); mobile_set_pref($id, $value); print_r($_SESSION); break; default: print json_encode(array("error", "UNKNOWN_METHOD")); break; } ?>
function outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgr_last_feed = false, $override_order = false) { $disable_cache = false; $timing_info = getmicrotime(); $topmost_article_ids = array(); if (!$offset) { $offset = 0; } if ($subop == "undefined") { $subop = ""; } $subop_split = split(":", $subop); if ($subop == "CatchupSelected") { $ids = split(",", db_escape_string($_REQUEST["ids"])); $cmode = sprintf("%d", $_REQUEST["cmode"]); catchupArticlesById($link, $ids, $cmode); } if ($subop == "ForceUpdate" && sprintf("%d", $feed) > 0) { update_generic_feed($link, $feed, $cat_view, true); } if ($subop == "MarkAllRead") { catchup_feed($link, $feed, $cat_view); if (get_pref($link, 'ON_CATCHUP_SHOW_NEXT_FEED')) { if ($next_unread_feed) { $feed = $next_unread_feed; } } } if ($subop_split[0] == "MarkAllReadGR") { catchup_feed($link, $subop_split[1], false); } if ($feed_id > 0) { $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE id = '{$feed}' LIMIT 1"); if (db_num_rows($result) == 0) { print "<div align='center'>" . __('Feed not found.') . "</div>"; return; } } if (preg_match("/^-?[0-9][0-9]*\$/", $feed) != false) { $result = db_query($link, "SELECT rtl_content FROM ttrss_feeds\n\t\t\t\tWHERE id = '{$feed}' AND owner_uid = " . $_SESSION["uid"]); if (db_num_rows($result) == 1) { $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content")); } else { $rtl_content = false; } if ($rtl_content) { $rtl_tag = "dir=\"RTL\""; } else { $rtl_tag = ""; } } else { $rtl_tag = ""; $rtl_content = false; } $script_dt_add = get_script_dt_add(); /// START ///////////////////////////////////////////////////////////////////////////////// $search = db_escape_string($_REQUEST["query"]); if ($search) { $disable_cache = true; } $search_mode = db_escape_string($_REQUEST["search_mode"]); $match_on = db_escape_string($_REQUEST["match_on"]); if (!$match_on) { $match_on = "both"; } $real_offset = $offset * $limit; if ($_REQUEST["debug"]) { $timing_info = print_checkpoint("H0", $timing_info); } $qfh_ret = queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on, $override_order, $real_offset); if ($_REQUEST["debug"]) { $timing_info = print_checkpoint("H1", $timing_info); } $result = $qfh_ret[0]; $feed_title = $qfh_ret[1]; $feed_site_url = $qfh_ret[2]; $last_error = $qfh_ret[3]; $vgroup_last_feed = $vgr_last_feed; if ($feed == -2) { $feed_site_url = article_publish_url($link); } /// STOP ////////////////////////////////////////////////////////////////////////////////// if (!$offset) { print "<div id=\"headlinesContainer\" {$rtl_tag}>"; if (!$result) { print "<div align='center'>" . __("Could not display feed (query failed). Please check label match syntax or local configuration.") . "</div>"; return; } print_headline_subtoolbar($link, $feed_site_url, $feed_title, $feed, $cat_view, $search, $match_on, $search_mode); print "<div id=\"headlinesInnerContainer\" onscroll=\"headlines_scroll_handler()\">"; } $headlines_count = db_num_rows($result); if (db_num_rows($result) > 0) { # print "\{$offset}"; if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) { print "<table class=\"headlinesList\" id=\"headlinesList\" \n\t\t\t\t\tcellspacing=\"0\">"; } $lnum = $limit * $offset; error_reporting(DEFAULT_ERROR_LEVEL); $num_unread = 0; $cur_feed_title = ''; $fresh_intl = get_pref($link, "FRESH_ARTICLE_MAX_AGE") * 60 * 60; while ($line = db_fetch_assoc($result)) { $class = $lnum % 2 ? "even" : "odd"; $id = $line["id"]; $feed_id = $line["feed_id"]; $labels = get_article_labels($link, $id); $labels_str = "<span id=\"HLLCTR-{$id}\">"; $labels_str .= format_article_labels($labels, $id); $labels_str .= "</span>"; if (count($topmost_article_ids) < 5) { array_push($topmost_article_ids, $id); } if ($line["last_read"] == "" && !sql_bool_to_bool($line["unread"])) { $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/updated.png') . "\" \n\t\t\t\t\t\talt=\"Updated\">"; } else { $update_pic = "<img id='FUPDPIC-{$id}' src=\"images/blank_icon.gif\" \n\t\t\t\t\t\talt=\"Updated\">"; } if (sql_bool_to_bool($line["unread"]) && time() - strtotime($line["updated_noms"]) < $fresh_intl) { $update_pic = "<img id='FUPDPIC-{$id}' src=\"" . theme_image($link, 'images/fresh_sign.png') . "\" alt=\"Fresh\">"; } if ($line["unread"] == "t" || $line["unread"] == "1") { $class .= "Unread"; ++$num_unread; $is_unread = true; } else { $is_unread = false; } if ($line["marked"] == "t" || $line["marked"] == "1") { $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Unstar article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>"; } else { $marked_pic = "<img id=\"FMPIC-{$id}\" \n\t\t\t\t\t\tsrc=\"" . theme_image($link, 'images/mark_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\" alt=\"Star article\" \n\t\t\t\t\t\tonclick='javascript:tMark({$id})'>"; } if ($line["published"] == "t" || $line["published"] == "1") { $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_set.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Unpublish article\" onclick='javascript:tPub({$id})'>"; } else { $published_pic = "<img id=\"FPPIC-{$id}\" src=\"" . theme_image($link, 'images/pub_unset.png') . "\" \n\t\t\t\t\t\tclass=\"markedPic\"\n\t\t\t\t\t\talt=\"Publish article\" onclick='javascript:tPub({$id})'>"; } # $content_link = "<a target=\"_blank\" href=\"".$line["link"]."\">" . # $line["title"] . "</a>"; # $content_link = "<a # href=\"" . htmlspecialchars($line["link"]) . "\" # onclick=\"view($id,$feed_id);\">" . # $line["title"] . "</a>"; # $content_link = "<a href=\"javascript:viewContentUrl('".$line["link"]."');\">" . # $line["title"] . "</a>"; if (get_pref($link, 'HEADLINES_SMART_DATE')) { $updated_fmt = smart_date_time(strtotime($line["updated_noms"])); } else { $short_date = get_pref($link, 'SHORT_DATE_FORMAT'); $updated_fmt = date($short_date, strtotime($line["updated_noms"])); } if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { $content_preview = truncate_string(strip_tags($line["content_preview"]), 100); } $score = $line["score"]; $score_pic = theme_image($link, "images/" . get_score_pic($score)); /* $score_title = __("(Click to change)"); $score_pic = "<img class='hlScorePic' src=\"images/$score_pic\" onclick=\"adjustArticleScore($id, $score)\" title=\"$score $score_title\">"; */ $score_pic = "<img class='hlScorePic' src=\"{$score_pic}\" \n\t\t\t\t\ttitle=\"{$score}\">"; if ($score > 500) { $hlc_suffix = "H"; } else { if ($score < -100) { $hlc_suffix = "L"; } else { $hlc_suffix = ""; } } $entry_author = $line["author"]; if ($entry_author) { $entry_author = " - {$entry_author}"; } $has_feed_icon = feed_has_icon($feed_id); if ($has_feed_icon) { $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">"; } else { //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">"; $feed_icon_img = ""; } if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { if (get_pref($link, 'VFEED_GROUP_BY_FEED')) { if ($feed_id != $vgroup_last_feed && $line["feed_title"]) { $cur_feed_title = $line["feed_title"]; $vgroup_last_feed = $feed_id; $cur_feed_title = htmlspecialchars($cur_feed_title); $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)"; print "<tr class='feedTitle'><td colspan='7'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</td></tr>"; } } $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'"; print "<tr class='{$class}' id='RROW-{$id}' {$mouseover_attrs}>"; print "<td class='hlUpdPic'>{$update_pic}</td>"; print "<td class='hlSelectRow'>\n\t\t\t\t\t\t<input type=\"checkbox\" onclick=\"tSR(this)\"\n\t\t\t\t\t\t\tid=\"RCHK-{$id}\">\n\t\t\t\t\t\t</td>"; print "<td class='hlMarkedPic'>{$marked_pic}</td>"; print "<td class='hlMarkedPic'>{$published_pic}</td>"; # if ($line["feed_title"]) { # print "<td class='hlContent'>$content_link</td>"; # print "<td class='hlFeed'> # <a href=\"javascript:viewfeed($feed_id, '', false)\">". # truncate_string($line["feed_title"],30)."</a> </td>"; # } else { print "<td onclick='view({$id})' class='hlContent{$hlc_suffix}' valign='middle' id='HLC-{$id}'>"; print "<a id=\"RTITLE-{$id}\" \n\t\t\t\t\t\thref=\"" . htmlspecialchars($line["link"]) . "\"\n\t\t\t\t\t\tonclick=\"return false\">" . $line["title"]; if (get_pref($link, 'SHOW_CONTENT_PREVIEW')) { if ($content_preview) { print "<span class=\"contentPreview\"> - {$content_preview}</span>"; } } print "</a>"; print $labels_str; # <a href=\"javascript:viewfeed($feed_id, '', false)\">". # $line["feed_title"]."</a> if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) { if ($line["feed_title"]) { print "<span class=\"hlFeed\">\n\t\t\t\t\t\t\t\t(<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a>)\n\t\t\t\t\t\t\t</span>"; } } // print "<img id='HLL-$id' class='hlLoading' // src='images/indicator_tiny.gif' style='display : none'>"; print "</td>"; # } print "<td class=\"hlUpdated\" onclick='view({$id})'><nobr>{$updated_fmt} </nobr></td>"; print "<td class='hlMarkedPic'>{$score_pic}</td>"; if ($line["feed_title"] && !get_pref($link, 'VFEED_GROUP_BY_FEED')) { print "<td onclick=\"viewfeed({$feed_id})\" class=\"hlFeedIcon\">{$feed_icon_img}</td>"; } print "</tr>"; } else { if (get_pref($link, 'VFEED_GROUP_BY_FEED') && $line["feed_title"]) { if ($feed_id != $vgroup_last_feed) { $cur_feed_title = $line["feed_title"]; $vgroup_last_feed = $feed_id; $cur_feed_title = htmlspecialchars($cur_feed_title); $vf_catchup_link = "(<a onclick='javascript:catchupFeedInGroup({$feed_id});' href='#'>" . __('mark as read') . "</a>)"; $has_feed_icon = feed_has_icon($feed_id); if ($has_feed_icon) { $feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL . "/{$feed_id}.ico\" alt=\"\">"; } else { //$feed_icon_img = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\" alt=\"\">"; } print "<div class='cdmFeedTitle'>" . "<div style=\"float : right\">{$feed_icon_img}</div>" . "<a href=\"javascript:viewfeed({$feed_id}, '', false)\">" . $line["feed_title"] . "</a> {$vf_catchup_link}</div>"; } } if ($is_unread) { $add_class = "Unread"; } else { $add_class = ""; } $expand_cdm = get_pref($link, 'CDM_EXPANDED'); $show_excerpt = false; if ($expand_cdm && $score >= -100) { $cdm_cstyle = ""; $show_excerpt = false; } else { $cdm_cstyle = "style=\"display : none\""; $show_excerpt = true; } $mouseover_attrs = "onmouseover='postMouseIn({$id})' \n\t\t\t\t\t\tonmouseout='postMouseOut({$id})'"; print "<div class=\"cdmArticle{$add_class}\" \n\t\t\t\t\t\tid=\"RROW-{$id}\"\t\t\t\t\t\t\n\t\t\t\t\t\t{$mouseover_attrs}'>"; print "<div class=\"cdmHeader\">"; if (!get_pref($link, "VFEED_GROUP_BY_FEED") || !$line["feed_title"]) { $cdm_feed_icon = "<span style=\"cursor : pointer\" onclick=\"viewfeed({$feed_id})\">{$feed_icon_img}</span>"; } print "<div class=\"articleUpdated\">{$updated_fmt} {$score_pic} {$cdm_feed_icon}\n\t\t\t\t\t\t</div>"; print "<span id=\"RTITLE-{$id}\" class=\"titleWrap{$hlc_suffix}\"><a class=\"title\" \n\t\t\t\t\t\tonclick=\"javascript:toggleUnread({$id}, 0)\"\n\t\t\t\t\t\ttarget=\"_blank\" href=\"" . $line["link"] . "\">" . $line["title"] . "</a>\n\t\t\t\t\t\t"; print $entry_author; /* if (!$expand_cdm || $score < -100) { print " <a id=\"CICH-$id\" href=\"javascript:cdmExpandArticle($id)\"> (".__('Show article').")</a>"; } */ print $labels_str; if (!get_pref($link, 'VFEED_GROUP_BY_FEED')) { if ($line["feed_title"]) { print " (<a href='javascript:viewfeed({$feed_id})'>" . $line["feed_title"] . "</a>)"; } } print "</span></div>"; if ($show_excerpt) { print "<div class=\"cdmExcerpt\" id=\"CEXC-{$id}\"\n\t\t\t\t\t\t\tonclick=\"cdmExpandArticle({$id})\"\n\t\t\t\t\t\t\ttitle=\"" . __('Click to expand article') . "\">"; $content_preview = trim(truncate_string(strip_tags($line["content_preview"]), 100)); if (strlen($content_preview) != 0) { print $content_preview; } else { print __('Click to expand article'); } print "</div>"; } print "<div class=\"cdmContent\" \n\t\t\t\t\t\tonclick=\"cdmClicked({$id})\"\n\t\t\t\t\t\tid=\"CICD-{$id}\" {$cdm_cstyle}>"; if ($line["orig_feed_id"]) { $tmp_result = db_query($link, "SELECT * FROM ttrss_archived_feeds\n\t\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]); if (db_num_rows($tmp_result) != 0) { print "<div clear='both'>"; print __("Originally from:"); print " "; $tmp_line = db_fetch_assoc($tmp_result); print "<a target='_blank' \n\t\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>"; print " "; print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>"; print "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_set.gif'></a>"; print "</div>"; } } // print "<div class=\"cdmInnerContent\" id=\"CICD-$id\" $cdm_cstyle>"; print "<div id=\"POSTNOTE-{$id}\">"; if ($line['note']) { print format_article_note($id, $line['note']); } print "</div>"; print sanitize_rss($link, $line["content_preview"]); $article_content = $line["content_preview"]; $e_result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE\n\t\t\t\t\t\tpost_id = '{$id}' AND content_url != ''"); if (db_num_rows($e_result) > 0) { $entries_html = array(); $entries = array(); while ($e_line = db_fetch_assoc($e_result)) { $url = $e_line["content_url"]; $ctype = $e_line["content_type"]; if (!$ctype) { $ctype = __("unknown type"); } $filename = substr($url, strrpos($url, "/") + 1); $entry = format_inline_player($link, $url, $ctype); $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . $filename . " (" . $ctype . ")" . "</a>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; array_push($entries, $entry); } $tmp_result = db_query($link, "SELECT always_display_enclosures FROM\n\t\t\t\t\tttrss_feeds WHERE id = " . $line['feed_id'] . " AND owner_uid = " . $_SESSION["uid"]); $always_display_enclosures = db_fetch_result($tmp_result, 0, "always_display_enclosures"); if (!get_pref($link, "STRIP_IMAGES")) { if ($always_display_enclosures || !preg_match("/img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { print "<p><img \n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"></p>"; } } } } print "<div class=\"cdmEnclosures\">"; if (db_num_rows($e_result) == 1) { print __("Attachment:") . " "; } else { print __("Attachments:") . " "; } print join(", ", $entries_html); print "</div>"; } print "<br clear='both'>"; // print "</div>"; /* if (!$expand_cdm) { print "<a id=\"CICH-$id\" href=\"javascript:cdmExpandArticle($id)\"> Show article</a>"; } */ print "</div>"; print "<div class=\"cdmFooter\"><span class='s0'>"; /* print "<div class=\"markedPic\">Star it: $marked_pic</div>"; */ print __("Select:") . " <input type=\"checkbox\" onclick=\"toggleSelectRowById(this, \n\t\t\t\t\t\t\t'RROW-{$id}')\" class=\"feedCheckBox\" id=\"RCHK-{$id}\">"; print "</span><span class='s1'>{$marked_pic} "; print "{$published_pic} "; print "<img src=\"images/art-zoom.png\" class='tagsPic' \n\t\t\t\t\t\tonclick=\"zoomToArticle({$id})\"\n\t\t\t\t\t\tstyle=\"cursor : pointer\"\n\t\t\t\t\t\talt='Zoom' \n\t\t\t\t\t\ttitle='" . __('Show article summary in new window') . "'> "; $note_escaped = htmlspecialchars($line['note'], ENT_QUOTES); print "<img src=\"images/art-pub-note.png\" class='tagsPic' \n\t\t\t\t\t\tstyle=\"cursor : pointer\" style=\"cursor : pointer\"\n\t\t\t\t\t\tonclick=\"publishWithNote({$id}, '{$note_escaped}')\"\n\t\t\t\t\t\talt='PubNote' title='" . __('Publish article with a note') . "'>"; print "</span>"; $tags_str = format_tags_string(get_article_tags($link, $id), $id); print "<span class='s1'>\n\t\t\t\t\t\t<img class='tagsPic' src='" . theme_image($link, 'images/tag.png') . "' alt='Tags' title='Tags'>\n\t\t\t\t\t\t<span id=\"ATSTR-{$id}\">{$tags_str}</span>\n\t\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\" \n\t\t\t\t\t\thref=\"javascript:editArticleTags({$id}, {$feed_id}, true)\">(+)</a>"; print "</span>"; print "<span class='s2'><a class=\"cdmToggleLink\"\n\t\t\t\t\t\t\thref=\"javascript:toggleUnread({$id})\">\n\t\t\t\t\t\t\t" . __('toggle unread') . "</a></span>"; print "</div>"; print "</div>"; } ++$lnum; } if (!get_pref($link, 'COMBINED_DISPLAY_MODE') && !$offset) { print "</table>"; } } else { $message = ""; switch ($view_mode) { case "unread": $message = __("No unread articles found to display."); break; case "updated": $message = __("No updated articles found to display."); break; case "marked": $message = __("No starred articles found to display."); break; default: if ($feed < -10) { $message = __("No articles found to display. You can assign articles to labels manually (see the Actions menu above) or use a filter."); } else { $message = __("No articles found to display."); } } if (!$offset) { print "<div class='whiteBox'>{$message}</div>"; } } if (!$offset) { print "</div>"; print "</div>"; } return array($topmost_article_ids, $headlines_count, $feed, $disable_cache, $vgroup_last_feed); }
/** * Send by mail a digest of last articles. * * @param mixed $link The database connection. * @param integer $limit The maximum number of articles by digest. * @return boolean Return false if digests are not enabled. */ function send_headlines_digests($link, $debug = false) { require_once 'lib/phpmailer/class.phpmailer.php'; $user_limit = 15; // amount of users to process (e.g. emails to send out) $limit = 1000; // maximum amount of headlines to include if ($debug) { _debug("Sending digests, batch of max {$user_limit} users, headline limit = {$limit}"); } if (DB_TYPE == "pgsql") { $interval_query = "last_digest_sent < NOW() - INTERVAL '1 days'"; } else { if (DB_TYPE == "mysql") { $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL 1 DAY)"; } } $result = db_query($link, "SELECT id,email FROM ttrss_users\n\t\t\t\tWHERE email != '' AND (last_digest_sent IS NULL OR {$interval_query})"); while ($line = db_fetch_assoc($result)) { if (get_pref($link, 'DIGEST_ENABLE', $line['id'], false)) { $preferred_ts = strtotime(get_pref($link, 'DIGEST_PREFERRED_TIME', $line['id'], '00:00')); // try to send digests within 2 hours of preferred time if ($preferred_ts && time() >= $preferred_ts && time() - $preferred_ts <= 7200) { if ($debug) { print "Sending digest for UID:" . $line['id'] . " - " . $line["email"] . " ... "; } $do_catchup = get_pref($link, 'DIGEST_CATCHUP', $line['id'], false); global $tz_offset; // reset tz_offset global to prevent tz cache clash between users $tz_offset = -1; $tuple = prepare_headlines_digest($link, $line["id"], 1, $limit); $digest = $tuple[0]; $headlines_count = $tuple[1]; $affected_ids = $tuple[2]; $digest_text = $tuple[3]; if ($headlines_count > 0) { $mail = new PHPMailer(); $mail->PluginDir = "lib/phpmailer/"; $mail->SetLanguage("en", "lib/phpmailer/language/"); $mail->CharSet = "UTF-8"; $mail->From = SMTP_FROM_ADDRESS; $mail->FromName = SMTP_FROM_NAME; $mail->AddAddress($line["email"], $line["login"]); if (SMTP_HOST) { $mail->Host = SMTP_HOST; $mail->Mailer = "smtp"; $mail->SMTPAuth = SMTP_LOGIN != ''; $mail->Username = SMTP_LOGIN; $mail->Password = SMTP_PASSWORD; } $mail->IsHTML(true); $mail->Subject = DIGEST_SUBJECT; $mail->Body = $digest; $mail->AltBody = $digest_text; $rc = $mail->Send(); if (!$rc && $debug) { print "ERROR: " . $mail->ErrorInfo; } if ($debug) { print "RC={$rc}\n"; } if ($rc && $do_catchup) { if ($debug) { print "Marking affected articles as read...\n"; } catchupArticlesById($link, $affected_ids, 0, $line["id"]); } } else { if ($debug) { print "No headlines\n"; } } db_query($link, "UPDATE ttrss_users SET last_digest_sent = NOW()\n\t\t\t\t\t\tWHERE id = " . $line["id"]); } } } if ($debug) { _debug("All done."); } }
/** * Send by mail a digest of last articles. * * @param mixed $link The database connection. * @param integer $limit The maximum number of articles by digest. * @return boolean Return false if digests are not enabled. */ function send_headlines_digests($link, $limit = 100) { if (!DIGEST_ENABLE) { return false; } $user_limit = DIGEST_EMAIL_LIMIT; $days = 1; print "Sending digests, batch of max {$user_limit} users, days = {$days}, headline limit = {$limit}\n\n"; if (DB_TYPE == "pgsql") { $interval_query = "last_digest_sent < NOW() - INTERVAL '{$days} days'"; } else { if (DB_TYPE == "mysql") { $interval_query = "last_digest_sent < DATE_SUB(NOW(), INTERVAL {$days} DAY)"; } } $result = db_query($link, "SELECT id,email FROM ttrss_users\n\t\t\t\tWHERE email != '' AND (last_digest_sent IS NULL OR {$interval_query})"); while ($line = db_fetch_assoc($result)) { if (get_pref($link, 'DIGEST_ENABLE', $line['id'], false)) { print "Sending digest for UID:" . $line['id'] . " - " . $line["email"] . " ... "; $do_catchup = get_pref($link, 'DIGEST_CATCHUP', $line['id'], false); $tuple = prepare_headlines_digest($link, $line["id"], $days, $limit); $digest = $tuple[0]; $headlines_count = $tuple[1]; $affected_ids = $tuple[2]; $digest_text = $tuple[3]; if ($headlines_count > 0) { $mail = new PHPMailer(); $mail->PluginDir = "lib/phpmailer/"; $mail->SetLanguage("en", "lib/phpmailer/language/"); $mail->CharSet = "UTF-8"; $mail->From = DIGEST_FROM_ADDRESS; $mail->FromName = DIGEST_FROM_NAME; $mail->AddAddress($line["email"], $line["login"]); if (DIGEST_SMTP_HOST) { $mail->Host = DIGEST_SMTP_HOST; $mail->Mailer = "smtp"; $mail->SMTPAuth = DIGEST_SMTP_LOGIN != ''; $mail->Username = DIGEST_SMTP_LOGIN; $mail->Password = DIGEST_SMTP_PASSWORD; } $mail->IsHTML(true); $mail->Subject = DIGEST_SUBJECT; $mail->Body = $digest; $mail->AltBody = $digest_text; $rc = $mail->Send(); if (!$rc) { print "ERROR: " . $mail->ErrorInfo; } print "RC={$rc}\n"; if ($rc && $do_catchup) { print "Marking affected articles as read...\n"; catchupArticlesById($link, $affected_ids, 0, $line["id"]); } } else { print "No headlines\n"; } db_query($link, "UPDATE ttrss_users SET last_digest_sent = NOW()\n\t\t\t\t\tWHERE id = " . $line["id"]); } } print "All done.\n"; }
login_sequence($link, true); $op = $_REQUEST["op"]; switch ($op) { case "toggleMarked": $cmode = db_escape_string($_REQUEST["mark"]); $id = db_escape_string($_REQUEST["id"]); markArticlesById($link, array($id), $cmode); break; case "togglePublished": $cmode = db_escape_string($_REQUEST["pub"]); $id = db_escape_string($_REQUEST["id"]); publishArticlesById($link, array($id), $cmode); break; case "toggleUnread": $cmode = db_escape_string($_REQUEST["unread"]); $id = db_escape_string($_REQUEST["id"]); catchupArticlesById($link, array($id), $cmode); break; case "setPref": $id = db_escape_string($_REQUEST["id"]); $value = db_escape_string($_REQUEST["to"]); mobile_set_pref($link, $id, $value); print_r($_SESSION); break; default: print json_encode(array("error", "UNKNOWN_METHOD")); break; } ?>