Skip to content
rating.module 4.07 KiB
Newer Older
Dries Buytaert's avatar
 
Dries Buytaert committed
<?php
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
function rating_perm() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  return array("access user ratings");
}

function rating_link($type) {
  if ($type == "page" && user_access("access user ratings")) {
    $links[] = "<a href=\"module.php?mod=rating\">". t("user ratings") ."</a>";
  }

  return $links ? $links : array();
Dries Buytaert's avatar
 
Dries Buytaert committed
}

Dries Buytaert's avatar
Dries Buytaert committed
function rating_conf_options() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  $period = array(3600 => format_interval(3600), 10800 => format_interval(10800), 21600 => format_interval(21600), 32400 => format_interval(32400), 43200 => format_interval(43200), 86400 => format_interval(86400), 172800 => format_interval(172800), 259200 => format_interval(259200), 604800 => format_interval(604800), 1209600 => format_interval(1209600), 1000000000 => "Never");
  $output .= form_select("Update interval", "rating_cron_time" , variable_get("rating_cron_time", 86400), $period, "The update interval for the user ratings.  Requires crontab.");
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $weight = array("Disabled", 1, 2, 3, 4, 5, 6, 7, 9, 10);
Dries Buytaert's avatar
 
Dries Buytaert committed
  foreach (module_list() as $name) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    if (module_hook($name, "user")) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      $output .= form_select("Weight of a $name", "rating_weight_$name", variable_get("rating_weight_$name", 0), $weight, "The weight of a $name.");
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
  }
Dries Buytaert's avatar
 
Dries Buytaert committed
  return $output;
}

Dries Buytaert's avatar
Dries Buytaert committed
function rating_cron() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  if (time() - variable_get("rating_cron_last", 0) > variable_get("rating_cron_time", time())) {
    variable_set("rating_cron_last", time());

Dries Buytaert's avatar
 
Dries Buytaert committed
    $r1 = db_query("SELECT uid FROM users ORDER BY rating DESC");
Dries Buytaert's avatar
 
Dries Buytaert committed
    while ($account = db_fetch_object($r1)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      db_query("UPDATE users SET rating = '". rating_gravity($account->uid) ."' WHERE uid = '$account->uid'");
Dries Buytaert's avatar
 
Dries Buytaert committed
      $rating[$account->uid] = ++$i;
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    db_query("DELETE FROM rating");
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    $r2 = db_query("SELECT uid FROM users ORDER BY rating DESC");
Dries Buytaert's avatar
 
Dries Buytaert committed
    while ($account = db_fetch_object($r2)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      db_query("INSERT INTO rating (uid, new, old) VALUES ('$account->uid', '". ++$j ."', '". $rating[$account->uid] ."')");
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
Dries Buytaert committed
  }
}

function rating_help() {
 ?>
Dries Buytaert's avatar
 
Dries Buytaert committed
  <P>The rating cron will periodically calculate each user's gravity, the overall time-weighted rating of each user's contributions.</P>
 <?
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function rating_gravity($uid) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $status;

  $period = 5184000;    // maximum 60 days
  $number = 30;         // maximum 30 comments

Dries Buytaert's avatar
 
Dries Buytaert committed
  $r1 = db_query("SELECT nid, type FROM node WHERE uid = '$uid' AND (". time() ." - timestamp < $period) AND status = '$status[posted]'");
Dries Buytaert's avatar
 
Dries Buytaert committed
  while ($node = db_fetch_object($r1)) {
    $bonus += variable_get("rating_weight_$node->type", 0);
  }

Dries Buytaert's avatar
 
Dries Buytaert committed
  $r2 = db_query("SELECT nid, type FROM node WHERE uid = '$uid' AND (". time() ." - timestamp < $period) AND status = '$status[dumped]'");
Dries Buytaert's avatar
 
Dries Buytaert committed
  while ($node = db_fetch_object($r1)) {
    $bonus -= variable_get("rating_weight_$node->type", 0);
  }

Dries Buytaert's avatar
 
Dries Buytaert committed
/*
Dries Buytaert's avatar
 
Dries Buytaert committed
  $r3 = db_query("SELECT score, votes FROM comments WHERE uid = '$uid' AND votes > 0 AND (". time() ." - timestamp < $period) ORDER BY timestamp LIMIT $number");
Dries Buytaert's avatar
 
Dries Buytaert committed
  while ($comment = db_fetch_object($r3)) {
    $weight++;
    $score += $weight * $comment->score;
    $votes += $weight * $comment->votes;
  }

  $bonus += $weight / 5;
Dries Buytaert's avatar
 
Dries Buytaert committed
*/
Dries Buytaert's avatar
 
Dries Buytaert committed

  return ($votes ? ($score + $weight) / $votes + $bonus : $bonus);
}

Dries Buytaert's avatar
Dries Buytaert committed
function rating_list($limit) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  $result = db_query("SELECT u.rating, u.name, u.uid, r.* FROM users u LEFT JOIN rating r ON u.uid = r.uid ORDER BY u.rating DESC LIMIT $limit");
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $output .= "<TABLE CELLPADDING=\"1\" CELLSPACING=\"1\">\n";
Dries Buytaert's avatar
Dries Buytaert committed
  while ($account = db_fetch_object($result)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    $ranking = $account->old - $account->new;
Dries Buytaert's avatar
 
Dries Buytaert committed
    $output .= "<TR><TD ALIGN=\"right\">". ++$i .".</TD><TD>". format_name($account) ."</TD><TD ALIGN=\"right\">". check_output($account->rating) ."</TD><TD>(". ($ranking < 0 ? "" : "+") ."$ranking)</TD></TR>";
Dries Buytaert's avatar
Dries Buytaert committed
  }
  $output .= "</TABLE>\n";
  return $output;
}

function rating_page() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $user, $theme;

Dries Buytaert's avatar
 
Dries Buytaert committed
  $theme->header();

  if (user_access("access user ratings")) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    $theme->box(t("Top 100 users"), rating_list(100));
  }
  else {
    $theme->box(t("Access denied"), message_access());
  }
Dries Buytaert's avatar
 
Dries Buytaert committed

  $theme->footer();
Dries Buytaert's avatar
Dries Buytaert committed
}

function rating_block() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  $block[0][subject] = "Top 10:<BR>users";
  $block[0][content] = rating_list(10);
  $block[0][info] = "Top 10: users";
Dries Buytaert's avatar
Dries Buytaert committed
  return $block;
}