--- subscriptions.module.orig 2008-01-16 16:09:35.000000000 -0700 +++ subscriptions.module 2008-01-16 16:09:46.000000000 -0700 @@ -207,6 +207,36 @@ function subscriptions_queue($event) { if (is_array($event['load_args'])) { $load_args = serialize($event['load_args']); } + // !custom ----- + // get the uids of all the subscribers to this node + $sub_result = db_query(" + SELECT recipient_uid FROM {subscriptions} + WHERE field = %d AND value = %d", 'nid', $event['node']->nid); + + $nosend_uids = array(); + // for each subscriber: check if new comments > 1, and if so add to no-send list + while ($row = db_fetch_object($sub_result)) { + // get the time for subscriber's last read of this node + $history = db_fetch_object(db_query(" + SELECT timestamp FROM {history} + WHERE uid = %d AND nid = %d", $row->recipient_uid, $event['node']->nid)); + $last_read = $history->timestamp ? $history->timestamp : 0; + + // count comments since last read time + $new_comments = (int)db_result(db_query(' + SELECT COUNT(c.cid) + FROM {node} n INNER JOIN {comments} c ON n.nid = c.nid + WHERE n.nid = %d AND timestamp > %d AND c.status = 0', + $event['node']->nid, $last_read)); + + // if more than one unread comment, add to no-send list + if ($new_comments > 1) { + array_push($nosend_uids, $row->recipient_uid); + } + } + $nosend_list = implode(',', $nosend_uids); + // end custom ----- + foreach (module_implements('subscriptions') as $subs_module) { $subs_module_query = module_invoke($subs_module, 'subscriptions', 'queue', $event); if (!isset($subs_module_query)) { @@ -214,6 +244,7 @@ function subscriptions_queue($event) { } foreach ($subs_module_query as $module => $module_query) { foreach ($module_query as $field => $query) { $join = empty($query['join']) ? '' : $query['join']; $where = empty($query['where']) ? array() : array($query['where']); $args = array($event['load_function'], $event['load_args'], $module, $field, $event['uid']); @@ -228,6 +259,12 @@ function subscriptions_queue($event) { $where[] = "s.recipient_uid != %d"; $args[] = $user->uid; } + // !custom + if ($nosend_list) { + $where[] = "s.recipient_uid NOT IN (%s)"; + $args[] = $nosend_list; + } + // end custom $conditions = implode(' AND ', $where); $result = db_query(" INSERT INTO {subscriptions_queue} (uid, name, mail, language, module, field, value, author_uid, send_interval, digest, last_sent, load_function, load_args)