drupal/modules/rating.module

109 lines
4.8 KiB
Plaintext

<?php
// $Id$
function rating_help() {
$output .= "<p>Drupal uses <i>gravity</i> as an indication for each user's contributed value. The system can be compared with <a href=\"http://www.slashcode.com/\">SlashCode</a>'s Karma and is - in fact - even more similar to <a href=\"http://scoop.kuro5hin.org/\">Scoop</a>'s Mojo.</p>";
$output .= "<p>Gravity is calculated based on the moderation done to a user's nodes: you gain or loose points based on the fact your nodes got approved/promoted or rejected/declined. The sampling period could be an arbitrary number of days (by default set to 60 days) or an arbitrary number of nodes (by default set to 30), whatever comes first. Thus, you lose one point for each node being rejected during the past 60 days and you gain one point for each node being approved. You don't gain nor loose points for nodes that have been replaced or expired. Cron will periodically re-calculate each user's gravity.</p>";
$output .= "<p>By default, Drupal does not use gravity but it can be used by module builders to automatically assign access rights or editorial priveledges to users or to limit or eliminate potential abuse by limiting the rate of posting or the ability to post at all. Aside from that, it can be used to play point games but that is, needless to say, not the goal gravity aspires to.</p>";
return $output;
}
function rating_perm() {
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();
}
function rating_conf_options() {
$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.");
$weight = array("Disabled", 1, 2, 3, 4, 5, 6, 7, 9, 10);
foreach (module_list() as $name) {
if (module_hook($name, "user")) {
$output .= form_select("Weight of a $name", "rating_weight_$name", variable_get("rating_weight_$name", 0), $weight, "The weight of a $name.");
}
}
return $output;
}
function rating_cron() {
if (time() - variable_get("rating_cron_last", 0) > variable_get("rating_cron_time", time())) {
variable_set("rating_cron_last", time());
$r1 = db_query("SELECT uid FROM users ORDER BY rating DESC");
while ($account = db_fetch_object($r1)) {
db_query("UPDATE users SET rating = '". rating_gravity($account->uid) ."' WHERE uid = '$account->uid'");
$rating[$account->uid] = ++$i;
}
db_query("DELETE FROM rating");
$r2 = db_query("SELECT uid FROM users ORDER BY rating DESC");
while ($account = db_fetch_object($r2)) {
db_query("INSERT INTO rating (uid, new, old) VALUES ('$account->uid', '". ++$j ."', '". $rating[$account->uid] ."')");
}
}
}
function rating_gravity($uid) {
$period = 5184000; // maximum 60 days
$number = 30; // maximum 30 nodes
$gravity = 0;
$r1 = db_query("SELECT nid, type FROM node WHERE uid = '$uid' AND (". time() ." - created < $period) AND moderate = 0 AND promote = 1 AND status = 1 LIMIT $number");
while ($node = db_fetch_object($r1)) {
$gravity += 1;
}
$r2 = db_query("SELECT nid, type FROM node WHERE uid = '$uid' AND (". time() ." - created < $period) AND status = 0 LIMIT $number");
while ($node = db_fetch_object($r1)) {
$gravity -= 1;
}
return $gravity;
}
function rating_list($limit) {
$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");
$output .= "<table cellpadding=\"1\" cellspacing=\"1\">\n";
while ($account = db_fetch_object($result)) {
$ranking = $account->old - $account->new;
$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>";
}
$output .= "</table>\n";
return $output;
}
function rating_page() {
global $user, $theme;
$theme->header();
if (user_access("access user ratings")) {
$theme->box(t("Top 100 users"), rating_list(100));
}
else {
$theme->box(t("Access denied"), message_access());
}
$theme->footer();
}
function rating_block() {
$block[0]["subject"] = "Top 10:<br />users";
$block[0]["content"] = rating_list(10);
$block[0]["info"] = "Top 10: users";
return $block;
}
?>