t('Change Pants'),
'path' => 'pants/change',
'callback' => 'pants_change',
'type' => MENU_CALLBACK,
'access' => user_access('change pants status')
);
}
return $items;
}
/**
* Implementation of hook_perm
*/
function pants_perm() {
return array('change pants status');
}
/**
* Implementation of hook_block
*/
function pants_block($op = 'list', $delta = 0) {
global $user;
switch ($op) {
case 'list':
$blocks[0]['info'] = t('Your Pants');
$blocks[1]['info'] = t('Recent Pants');
return $blocks;
case 'view':
switch ($delta) {
case 0:
$output .= '
'. _pants_status(_pants_get($user->uid)) . "
\n";
$output .= l(t('change'), 'pants/change', array('id' => 'pants'));
drupal_add_js(array('pants' => array('basePath' => base_path())), 'setting');
drupal_add_js(drupal_get_path('module', 'pants') . '/pants.js');
$block['subject'] = t('Your Pants are:');
$block['content'] = $output;
return $block;
case 1:
$block['subject'] = t('Recent Pants');
$block['content'] = theme('pants_block');
return $block;
}
}
}
/**
* Implementation of hook_user
*/
function pants_user($op, $edit, &$account, $category = NULL) {
switch ($op) {
case 'form':
$form['pants'] =
array('#type' => 'radios',
'#title' => t('Pants'),
'#default_value' => $account->pants,
'#options' => array(0 => t('Off'), 1 => t('On')),
'#description' => t('Your current pants status'),
);
return $form;
case 'load':
$account->pants = _pants_get($account->uid);
break;
case 'insert':
case 'update':
_pants_set($account->uid, $edit['pants']);
unset ($edit['pants']);
break;
case 'view' :
$items[] = array('title' => t('Pants status'),
'value' => _pants_status(_pants_get($account->uid)),
'class' => 'user');
return array('' => $items);
}
}
/**
* Implementation of hook_xmlrpc
*/
function pants_xmlrpc() {
return array(
array(
'drupal.changePants',
'pants_xmlrpc_change',
array('array', 'string', 'string'),
t('Changes pants status for the given user')),
array(
'drupal.getPants',
'pants_xmlrpc_get',
array('array', 'string', 'string'),
t('Changes pants status for the given user')));
}
/**
* Callbacks
*/
function pants_change() {
global $user;
$status = _pants_change($user->uid);
if ($_GET['destination']) {
drupal_goto($_GET['destination']);
}
else {
print _pants_status($status);
}
return;
}
function pants_xmlrpc_change($username, $password) {
global $user;
$user = user_authenticate($username, $password);
if (!$user->uid || !user_access('change pants status', $user)) {
return xmlrpc_error(1, t('Wrong username or password.'));
}
return _pants_change($user->uid);
//return _pants_change(1);
}
function pants_xmlrpc_get($username, $password) {
global $user;
$user = user_authenticate($username, $password);
if (!$user->uid || !user_access('change pants status', $user)) {
return xmlrpc_error(1, t('Wrong username or password.'));
}
return _pants_get($user->uid);
//return _pants_get(1);
}
/**
* Theme Functions
*/
function theme_pants_block() {
$result = db_query_range(db_rewrite_sql('SELECT u.uid, u.name, p.status, p.changed FROM {users} u INNER JOIN {pants_history} p ON p.uid = u.uid WHERE u.status = 1 ORDER BY p.changed DESC', 'u'), 0, 10);
$items = array();
while ($pants = db_fetch_object($result)) {
$label = ($pants->status) ? t('put pants on') :t('took pants off');
$items[] = theme('username', $pants) .' '. $label .'
'. t('@time ago', array('@time' => format_interval(time() - $pants->changed)));
}
return theme('item_list', $items);
}
/**
* Helper / "Private" Functions
*/
function _pants_change($uid) {
$status = 1 - _pants_get($uid);
_pants_set($uid, $status);
return $status;
}
function _pants_get($uid, $readable = FALSE) {
$status = db_result(db_query("SELECT status FROM {pants_history} WHERE uid = %d", $uid));
return $status;
}
function _pants_set($uid, $status) {
db_query('DELETE FROM {pants_history} WHERE uid = %d', $uid);
db_query('INSERT INTO {pants_history} (uid, status) VALUES (%d, %d)', $uid, $status);
db_query('INSERT INTO {pants_history} (uid, status, changed) VALUES (%d, %d, %d)', $uid, $status, time());
}
function _pants_status($status) {
return ($status) ? t('On') : t('Off');
}