'
' . t('About') . '
');
$output['header_content'] = array('#markup' => t('This module allows an admin to configure a limit on User Points for a certain defined window.'));
$output['header_content_links'] = array('#markup' => '
' . t('Userpoints Limit administration pages') . '
');
$link_list['point_settings'] = l(t('Points'), 'admin/config/people/userpoints/settings');
$output['topic-list'] = array('#markup' => theme('item_list', array('items' => $link_list)));
return render($output);
}
}
/**
* Implements hook_userpoints().
*/
function userpoints_limit_userpoints($op, $params = array()) {
switch ($op) {
case 'setting':
$intervals = array(
// 1-3 days.
86400, 86400 * 2, 86400 * 3,
// 1, 2, 3 weeks.
604800, 604800 * 2, 604800 * 3,
// 1, 3 months.
86400 * 30, 86400 * 90,
);
$intervals = drupal_map_assoc(variable_get('userpoints_limit_interval', $intervals), 'format_interval');
$form['userpoint_limit'] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#title' => t('Userpoints Limit'),
'#group' => 'settings_additional',
'#weight' => 25,
);
$form['userpoint_limit']['userpoints_limit_duration'] = array(
'#type' => 'select',
'#title' => t('Duration'),
'#default_value' => variable_get('userpoints_limit_duration', 0),
'#options' => $intervals,
'#description' => t('Reset Userpoint Duration'),
);
$form['userpoint_limit']['userpoints_limit_message'] = array(
'#type' => 'textarea',
'#title' => t('Message'),
'#default_value' => variable_get('userpoints_limit_message', 'You may accrue a maximum of !limit points during each !duration period.'),
'#description' => t('The message a user will see if they exceed the limit. Available replacement values include !duration and !limit.'),
);
$form['userpoint_limit']['userpoints_limit_points'] = array(
'#type' => 'textfield',
'#title' => t('Points Limit'),
'#default_value' => variable_get('userpoints_limit_points', -1),
'#description' => t('Maximum number of points allowed for each user. Set to -1 to allow unlimted points.'),
'#size' => 5,
);
return $form;
case 'points before':
global $user;
// Get time duration value and reduce -1
// for 23 hours: 59 minutes: 59 seconds.
if (($duration = (variable_get('userpoints_limit_duration', 0) - 1)) && variable_get('userpoints_limit_points', -1) != -1) {
$last_timestamp = userpoints_limit_generate_query($params);
/* Enforce consistent sort order.
* Check time limit extends the duration
* for eg: if user logged in 1'st day. till 2nd day he didnt logout but
* the limit is one day.. so, we need to check and reset
* userpoints_limits table.
*/
if ($last_timestamp) {
if ((mktime(0, 0, 0, date('m', $last_timestamp), date('d', $last_timestamp), date('y', $last_timestamp)) + $duration) < (mktime(0, 0, 0) + $duration)) {
$limit['uid'] = $params['uid'];
$limit['timestamp'] = time();
$ret = drupal_write_record('userpoints_limits', $limit, array('uid'));
$last_timestamp = $limit['timestamp'];
}
}
else {
$limit['uid'] = $params['uid'];
$limit['timestamp'] = time();
$ret = drupal_write_record('userpoints_limits', $limit);
$last_timestamp = $limit['timestamp'];
}
$settings = array();
$settings['max_points'] = variable_get('userpoints_limit_points', -1);
$settings['duration'] = variable_get('userpoints_limit_duration', 0);
$from_time = mktime(0, 0, 0, date('m', $last_timestamp), date('d', $last_timestamp), date('y', $last_timestamp));
$to_time = $from_time + $duration;
$result = db_select('userpoints_txn', 'p')
->condition('p.uid', $params['uid'], '=')
->condition('p.changed', array($from_time, $to_time), 'BETWEEN');
$result->addExpression('SUM(points)', 'points_cnt');
$result = $result->execute()
->fetchObject();
if (isset($result) && (($result->points_cnt + $params['points']) > variable_get('userpoints_limit_points', -1))) {
// Stop userpoints before store
// check if userpoints is deducted.
if ($params['points'] > 0) {
$message = userpoints_limit_message_content($settings);
// Do not allow the points transaction.
drupal_set_message(check_plain($message), 'error');
return FALSE;
}
else {
$query_settings = array();
$query_settings['query_values'] = $params;
$query_settings['from_time'] = $from_time;
$query_settings['to_time'] = $to_time;
$query_settings['settings'] = $settings;
if (!userpoints_limit_points_query($query_settings)) {
return FALSE;
}
}
}
elseif ($params['points'] < 0) {
// Userpoints below zero.
$query_settings = array();
$query_settings['query_values'] = $params;
$query_settings['from_time'] = $from_time;
$query_settings['to_time'] = $to_time;
$query_settings['settings'] = $settings;
if (!userpoints_limit_points_query($query_settings)) {
return FALSE;
}
}
}
break;
}
}
/**
* Generate userpoints_limits query.
*
* @param array $params
* It contains query arguments.
*
* @return object
* It contains query object
*/
function userpoints_limit_generate_query($params) {
$result = db_select('userpoints_limits', 'p')
->fields('p')
->condition('p.uid', $params['uid'], '=')
->execute()
->fetchObject();
if ($result) {
return $result->timestamp;
}
return FALSE;
}
/**
* Check if the userpoint is deducted.
*
* @param array $query_settings
* query_values => It contains query arguments and message settings
* from_time => from time when the points inserted
* to_time => to time
*
* @return bool
* if deducted points count not available then it retunrs false.
*/
function userpoints_limit_points_query($query_settings) {
$deduct_point = db_select('userpoints_txn', 'p')
->condition('p.uid', $query_settings['query_values']['uid'], '=')
->condition('p.entity_type', $query_settings['query_values']['entity_type'], '=')
->condition('p.entity_id', $query_settings['query_values']['entity_id'], '=')
->condition('p.changed', array($query_settings['from_time'], $query_settings['to_time']), 'BETWEEN');
$deduct_point->addExpression('COUNT(*)', 'count');
$deduct_point = $deduct_point->execute()
->fetchObject();
if (!$deduct_point->count) {
// Stop userpoints before store.
$message = userpoints_limit_message_content($query_settings['settings']);
// Do not allow the points transaction.
drupal_set_message(check_plain($message), 'error');
return FALSE;
}
}
/**
* To construct message.
*
* @param array $settings
* It's a array value category => user points category name
* max_points => It contains maximum points for the user
* tid => It contains taxonomy id
*
* @return message
* It returns the confirmation message
*/
function userpoints_limit_message_content($settings) {
$message = strtr(variable_get('userpoints_limit_message', 'You may accrue a maximum of !limit points during each !duration period.'), array(
'!limit' => $settings['max_points'],
'!duration' => current(drupal_map_assoc(array($settings['duration']), 'format_interval')),
)
);
return $message;
}
/**
* Implements hook_user_login().
*/
function userpoints_limit_user_login(&$edit, $account) {
global $user;
if (($interval = variable_get('userpoints_limit_duration', 0)) && variable_get('userpoints_limit_points', -1) != -1) {
$last_timestamp = db_select('userpoints_limits', 'p')
->fields('p')
->condition('p.uid', $user->uid, '=')
->execute()
->fetchObject();
if (isset($last_timestamp->timestamp) && $last_timestamp->timestamp) {
// See if it's time for a reset.
if ((time() - $interval) >= $last_timestamp->timestamp) {
$limit['uid'] = $user->uid;
$limit['timestamp'] = time();
$ret = drupal_write_record('userpoints_limits', $limit, array('uid'));
}
}
else {
$limit['uid'] = $user->uid;
$limit['timestamp'] = time();
$ret = drupal_write_record('userpoints_limits', $limit);
}
}
}
/**
* Implements hook_user_delete().
*/
function userpoints_limit_user_delete($account) {
// The user is being deleted, delete all traces in userpoints limit table.
db_delete('userpoints_limits')
->condition('uid', $account->uid)
->execute();
}