UP: Some basic interfaces for userpoints, such as posting nodes, comments, ...etc.'); break; } return $output; } function userpoints_basic_userpoints($op, $points = 0, $uid = 0, $event = '') { switch ($op) { case 'setting': $group = 'basic'; $form[$group] = array( '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => TRUE, '#title' => t('!Points for basic events', userpoints_translation()), ); $form[$group][USERPOINTS_POST . '_undo_points_on_delete'] = array( '#type' => 'checkbox', '#title' => t('Take away !points on node delete', array_merge(userpoints_translation())), '#default_value' => variable_get(USERPOINTS_POST . '_undo_points_on_delete', true), ); foreach (node_get_types() as $type => $name) { $form[$group][USERPOINTS_POST . $type] = array( '#type' => 'textfield', '#title' => t('!Points for posting a !node-name', array_merge(userpoints_translation(), array('!node-name' => $name->name))), '#default_value' => variable_get(USERPOINTS_POST . $type, '0'), '#size' => 5, '#maxlength' => 5, ); } $form[$group][USERPOINTS_POST_COMMENT] = array( '#type' => 'textfield', '#title' => t('!Points for posting a comment', userpoints_translation()), '#default_value' => variable_get(USERPOINTS_POST_COMMENT, 0), '#size' => 5, '#maxlength' => 5, ); $form[$group][USERPOINTS_MODERATE_COMMENT] = array( '#type' => 'textfield', '#title' => t('!Points for moderating a comment', userpoints_translation()), '#default_value' => variable_get(USERPOINTS_MODERATE_COMMENT, 0), '#size' => 5, '#maxlength' => 5, ); $group = 'v2compatibility'; $form[$group] = array( '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => TRUE, '#title' => t('!Points for basic events version 2.14 Compatibility', userpoints_translation()), '#description' => t('If you have used userpoints_basic prior to v3 you may need to enable this fix.
If you have not used userpoints_basic prior to v3 you do NOT need to enable this fix.
This fix only affects the behavior of how !points are handled when ownership of a node/comment changes. In version 2 data on the original owner was not kept and a static variable was used to store this information. Unfortunately people have experienced unusual side effects such as !points moving from one owner to a completely random user. All !points accrued with version 3 will not exhibit this behavior thus this fix is unnecessary. Only check this box under the following conditions
1) You have existing !points granted by a userpoints version prior to version 3
2) If ownership changes on a node/comment you want points to follow ownership
All !points accrued by version 3 will move ownership automatically this setting only affects !points accrued with v2
3) You have read Article 183520 on drupal.org and understand that there could be unusual issues with ownership moves', userpoints_translation()), ); $form[$group][USERPOINTS_USE_V2BUG] = array( '#type' => 'checkbox', '#title' => t('I agree to the above description and want to use the V2 bug fix'), '#default_value' => variable_get(USERPOINTS_USE_V2BUG, false), ); return $form; break; } } function userpoints_nodeapi(&$node, $op, $teaser, $page) { //static up_orig_uid please read drupal.org/node/183520 static $up_orig_uid; $points = variable_get(USERPOINTS_POST . $node->type, 0); switch ($op) { case 'insert': $params = array( 'points' => $points, 'uid' => $node->uid, 'operation' => 'insert', 'entity_id' => $node->nid, 'entity_type' => 'node' ); userpoints_userpointsapi($params); break; case 'delete': if (variable_get(USERPOINTS_POST . '_undo_points_on_delete', true)) { $points = -$points; $params = array( 'points' => $points, 'uid' => $node->uid, 'operation' => 'operation', 'entity_id' => $node->nid, 'entity_type' => 'node', ); userpoints_userpointsapi($params); } break; case 'prepare': $up_orig_uid = $node->uid; break; case 'update': //Find the last points granted on this node inserts and ownership gains $sql = "SELECT points, uid FROM {userpoints_txn} WHERE entity_id = %d AND entity_type = '%s' AND (operation = '%s' OR operation ='%s') ORDER BY time_stamp DESC LIMIT 1 "; $last_owner = db_fetch_object(db_query($sql, $node->nid, 'node', 'insert', 'Ownership gain')); //Check the UID of the original to this user, if different add/substract points if ($node->uid != $last_owner->uid && is_numeric($last_owner->uid) ) { //Check to see if this user has already lost the points for // Add to the new node owner $params = array( 'points' => $points, 'uid' => $node->uid, 'operation' => 'Ownership gain', 'entity_id' => $node->nid, 'entity_type' => 'node' ); userpoints_userpointsapi($params); // subtract from the original node owner $params = array( 'points' => -$points, 'uid' => $up_orig_uid, 'operation' => 'Ownership loss', 'entity_id' => $node->nid, 'entity_type' => 'node' ); userpoints_userpointsapi($params); } else { //We failed to pull a matching operation via the DB //If the user wants to use the V2BUG we'll use it.. //please read drupal.org/node/183520 if (variable_get(USERPOINTS_USE_V2BUG, false)) { if ($node->uid != $up_orig_uid) { // Add to the new node owner $params = array( 'points' => $points, 'uid' => $node->uid, 'operation' => 'Ownership gain', 'entity_id' => $node->nid, 'entity_type' => 'node' ); userpoints_userpointsapi($params); // subtract from the original node owner $params = array( 'points' => -$points, 'uid' => $up_orig_uid, 'operation' => 'Ownership loss', 'entity_id' => $node->nid, 'entity_type' => 'node' ); userpoints_userpointsapi($params); } } } break; } } function userpoints_comment($comment, $op) { global $user; //static up_orig_uid, please read this thread http://drupal.org/node/183520 static $up_orig_com_uid; $points = variable_get(USERPOINTS_POST_COMMENT, 0); switch ($op) { case 'insert': $params = array( 'points' => $points, 'uid' => $user->uid, 'operation' => 'insert', 'entity_id' => $comment['cid'], 'entity_type' => 'comment' ); userpoints_userpointsapi($params); break; case 'delete': $points = -$points; $params = array( 'points' => $points, 'uid' => $comment->uid, 'operation' => 'delete', 'entity_id' => $comment->cid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); break; case 'moderate': $points = variable_get(USERPOINTS_MODERATE_COMMENT, 0); $params = array( 'points' => $points, 'uid' => $comment->uid, 'operation' => 'moderate', 'entity_id' => $comment->cid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); break; case 'form': $up_orig_com_uid = $comment['uid']['#value']; break; case 'update': //Find the last points granted on this node inserts and ownership gains $sql = "SELECT points, uid FROM {userpoints_txn} WHERE entity_id = %d AND entity_type = '%s' AND (operation = '%s' OR operation ='%s') ORDER BY time_stamp DESC LIMIT 1 "; $cid = $comment['cid']; $new_uid = $comment['uid']; $last_owner = db_fetch_object(db_query($sql, $cid, 'comment', 'insert', 'Ownership gain')); //Check the UID of the original to this user, if different add/substract points if ($new_uid != $last_owner->uid && is_numeric($last_owner->uid) ) { //The owner has changed so we're removing from the //the original owner and giving to the new owner //Give to the original owner $points = $last_owner->points; $params = array( 'points' => $points, 'uid' => $new_uid, 'operation' => 'Ownership gain', 'entity_id' => $cid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); //Take away from the original owner $params = array( 'points' => -$points, 'uid' => $last_owner->uid, 'operation' => 'Ownership loss', 'entity_id' => $cid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); } else { //We failed to pull a matching operation via the DB //If the user wants to use the V2BUG we'll use it.. //please read drupal.org/node/183520 if (variable_get(USERPOINTS_USE_V2BUG, false)) { if ($orig_uid != $comment['uid']) { $params = array( 'points' => $points, 'uid' => $new_uid, 'operation' => 'Ownership gain', 'entity_id' => $cid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); //Take away from the original owner $params = array( 'points' => -$points, 'uid' => $comment['uid'], 'operation' => 'Ownership loss', 'entity_id' => $new_uid, 'entity_type' => 'comment' ); userpoints_userpointsapi($params); } } } break; } }