From f200685867a593eea49256661f9ff37c078457b3 Mon Sep 17 00:00:00 2001
From: garvinhicking <garvinhicking>
Date: Tue, 6 Dec 2005 13:33:15 +0000
Subject: [PATCH] aggregate exits

---
 .../serendipity_event_karma.php               | 68 ++++++++++++++++++-
 1 file changed, 66 insertions(+), 2 deletions(-)

diff --git a/plugins/serendipity_event_karma/serendipity_event_karma.php b/plugins/serendipity_event_karma/serendipity_event_karma.php
index 6ce374d..a266411 100644
--- a/plugins/serendipity_event_karma/serendipity_event_karma.php
+++ b/plugins/serendipity_event_karma/serendipity_event_karma.php
@@ -26,7 +26,7 @@ class serendipity_event_karma extends serendipity_event
         $propbag->add('description',   PLUGIN_KARMA_BLAHBLAH);
         $propbag->add('stackable',     false);
         $propbag->add('author',        'Garvin Hicking');
-        $propbag->add('version',       '1.7');
+        $propbag->add('version',       '1.8');
         $propbag->add('requirements',  array(
             'serendipity' => '0.8',
             'smarty'      => '2.6.7',
@@ -34,7 +34,7 @@ class serendipity_event_karma extends serendipity_event
         ));
         $propbag->add('event_hooks',   array('frontend_configure' => true, 'entry_display' => true, 'css' => true, 'event_additional_statistics' => true));
         $propbag->add('groups', array('STATISTICS'));
-        $propbag->add('configuration', array('karma_active', 'visits_active', 'max_entrytime', 'max_votetime', 'extended_only', 'max_karmatime', 'logging'));
+        $propbag->add('configuration', array('karma_active', 'visits_active', 'exits_active', 'max_entrytime', 'max_votetime', 'extended_only', 'max_karmatime', 'logging'));
     }
 
     function introspect_config_item($name, &$propbag)
@@ -75,6 +75,13 @@ class serendipity_event_karma extends serendipity_event
                 $propbag->add('default', 'true');
                 break;
 
+            case 'exits_active':
+                $propbag->add('type', 'boolean');
+                $propbag->add('name', SHOWS_TOP_EXIT);
+                $propbag->add('description', '');
+                $propbag->add('default', 'false');
+                break;
+
             case 'extended_only':
                 $propbag->add('type', 'boolean');
                 $propbag->add('name', PLUGIN_KARMA_EXTENDEDONLY);
@@ -151,6 +158,52 @@ class serendipity_event_karma extends serendipity_event
         $title       = $this->title;
     }
 
+    function prepareExits($entries, $get = false) {
+        static $exits = null;
+        
+        if ($exits === null) {
+            $q = 'SELECT entry_id, SUM(count) AS exits
+                    FROM ' . $serendipity['dbPrefix'] . 'exits
+                   WHERE entry_id IN (' . implode(', ', $entries) . ') GROUP BY entry_id';
+    
+            $sql = serendipity_db_query($q);
+            $exits = array();
+            if (is_array($sql)) {
+                foreach($sql AS $idx => $row) {
+                    $exits[$row['entry_id']] = (int)$row['exits'];
+                }
+            }
+        }
+        
+        if ($get) {
+            return $exits[$entries];
+        }
+        
+        return true;
+    }
+    
+    function getExits($entryid, $get_prepared = false) {
+        global $serendipity;
+        static $karma_exits = null;
+        
+        if ($karma_exits === null) {
+            $karma_exits = ' | ' . TOP_EXITS . ' (%d)';
+        }
+
+        if ($get_prepared) {
+            $points = $this->prepareExits($entryid, true);
+        } else {
+            $res = serendipity_db_query("SELECT sum(count) AS exits FROM {$serendipity['dbPrefix']}exits WHERE entry_id = " . (int)$entryid . " GROUP BY entry_id", true, 'assoc');
+            if (is_array($res) && isset($res['exits'])) {
+                $points = $res['exits'];
+            } else {
+                $points = 0;
+            }
+        }
+
+        return sprintf($karma_exits, $points);
+    }
+    
     function event_hook($event, &$bag, &$eventData, $addData = null) {
         global $serendipity;
 
@@ -429,6 +482,7 @@ class serendipity_event_karma extends serendipity_event
                         default:
                             $track_clicks  = serendipity_db_bool($this->get_config('visits_active', true));
                             $track_karma   = serendipity_db_bool($this->get_config('karma_active', true));
+                            $track_exits   = serendipity_db_bool($this->get_config('exits_active', true));
                             $karma_active  = $track_karma;
 
                             if (!is_array($eventData)) return;
@@ -482,6 +536,10 @@ class serendipity_event_karma extends serendipity_event
                                     $row['visits'] = 0;
                                 }
 
+                                if ($track_exits) {
+                                    $extended_key .= $this->getExits($entryid);
+                                }
+
                                 $eventData[0]['exflag'] = 1;
                                 if (isset($karma[$entryid])) {
                                     $extended_key .= sprintf($karma_current, $karma[$entryid], $row['points'], $row['votes'], $row['visits'], $url);
@@ -513,6 +571,8 @@ class serendipity_event_karma extends serendipity_event
                                     }
                                 }
 
+                                $this->prepareExits($entries);
+
                                 // Walk entry array and insert karma voting line.
                                 for ($i = 0; $i < $elements; $i++) {
                                     $entryid = $eventData[$i]['id'];
@@ -524,6 +584,10 @@ class serendipity_event_karma extends serendipity_event
                                         $eventData[$i]['add_footer'] = '';
                                     }
 
+                                    if ($track_exits) {
+                                        $eventData[$i]['add_footer'] .= $this->getExits($entryid, true);
+                                    }
+
                                     if (isset($karma[$entryid])) {
                                         $eventData[$i]['add_footer'] .= sprintf($karma_current, $karma[$entryid], $points, $votes, $visits, $url);
                                     } elseif ($eventData[$i]['timestamp'] < ($now - $max_karmatime)) {
-- 
2.39.5