Exemplo n.º 1
0
        }
    }
    if (!empty($rebuild_friendreqcount)) {
        foreach (array_keys($rebuild_friendreqcount) as $userid) {
            // The user could have been a friend too
            list($pendingcount) = $db->query_first("\n\t\t\t\tSELECT COUNT(*)\n\t\t\t\tFROM " . TABLE_PREFIX . "userlist AS userlist\n\t\t\t\tLEFT JOIN " . TABLE_PREFIX . "userlist AS userlist_ignore ON(userlist_ignore.userid = " . $userid . " AND userlist_ignore.relationid = userlist.userid AND userlist_ignore.type = 'ignore')\n\t\t\t\tWHERE userlist.relationid = " . $userid . "\n\t\t\t\t\tAND userlist.type = 'buddy'\n\t\t\t\t\tAND userlist.friend = 'pending'\n\t\t\t\t\tAND userlist_ignore.type IS NULL", DBARRAY_NUM);
            $db->query_write("\n\t\t\t\tUPDATE " . TABLE_PREFIX . "user\n\t\t\t\tSET friendreqcount = {$pendingcount}\n\t\t\t\tWHERE userid = " . $userid);
        }
    }
    if ($rebuild_my_friendcount) {
        list($myfriendcount) = $db->query_first("\n\t\t\tSELECT COUNT(*) FROM " . TABLE_PREFIX . "userlist\n\t\t\tWHERE userid = " . $vbulletin->userinfo['userid'] . "\n\t\t\t\tAND type = 'buddy'\n\t\t\t\tAND friend = 'yes'", DBARRAY_NUM);
        $db->query_write("\n\t\t\tUPDATE " . TABLE_PREFIX . "user\n\t\t\tSET friendcount = {$myfriendcount}\n\t\t\tWHERE userid = " . $vbulletin->userinfo['userid']);
    }
    /* Todo, force the cache variable (if we can) */
    require_once DIR . '/includes/functions_databuild.php';
    build_userlist($vbulletin->userinfo['userid']);
    $show["{$vbulletin->GPC['userlist']}"] = true;
    ($hook = vBulletinHook::fetch_hook('profile_updatelist_complete')) ? eval($hook) : false;
    if ($vbulletin->GPC['ajax']) {
        $ajax = true;
        $_REQUEST['do'] = $vbulletin->GPC['userlist'] == 'ignore' ? 'ignorelist' : 'buddylist';
    } else {
        eval(print_standard_redirect('updatelist_' . $vbulletin->GPC['userlist']));
    }
}
// ################# start edit buddy list ###############
if ($_REQUEST['do'] == 'buddylist') {
    $buddylist = '';
    $incominglist = '';
    $friend_list = array();
    $show['friend_controls'] = ($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_friends'] and $vbulletin->userinfo['permissions']['genericpermissions2'] & $vbulletin->bf_ugp_genericpermissions2['canusefriends']);
Exemplo n.º 2
0
 /**
  * Merge two users
  *
  * @param integer $sourceuserid
  * @param integer $destuserid
  */
 public function merge($sourceuserid, $destuserid)
 {
     $this->checkHasAdminPermission('canadminusers');
     $assertor = vB::getDbAssertor();
     if (!($sourceinfo = $assertor->getRow('user_fetchwithtextfield', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_STORED, 'userid' => $sourceuserid)))) {
         throw new vB_Exception_Api('invalid_source_username_specified');
     }
     if (!($destinfo = $assertor->getRow('user_fetchwithtextfield', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_STORED, 'userid' => $destuserid)))) {
         throw new vB_Exception_Api('invalid_destination_username_specified');
     }
     /*
     		// Update Subscribed Forums
     		$assertor->assertQuery('userInsertSubscribeforum', array(
     			vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD,
     			'sourceuserid' => $sourceinfo['userid'],
     			'destuserid' => $destinfo['userid'],
     		));
     
     		$assertor->assertQuery('user_updatesubscribethread', array(
     			'userid' => $destinfo['userid'],
     		));
     
     		$assertor->assertQuery('userInsertSubscribethread', array(
     			vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD,
     			'sourceuserid' => $sourceinfo['userid'],
     			'destuserid' => $destinfo['userid'],
     		));
     
     		require_once(DIR . '/includes/functions_databuild.php');
     		update_subscriptions(array('userids' => array($destinfo['userid'])));
     */
     // Update Subscribed Events
     $assertor->assertQuery('userInsertSubscribeevent', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD, 'sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     /*
     REPLACE INTO
     */
     // Merge relevant data in the user table
     // It is ok to have duplicate ids in the buddy/ignore lists
     $userdm = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_SILENT);
     $userdm->set_existing($destinfo);
     $options = vB::getDatastore()->getValue('options');
     $userdm->set('posts', "posts + {$sourceinfo['posts']}", false);
     $userdm->set_ladder_usertitle_relative($sourceinfo['posts']);
     $userdm->set('reputation', "reputation + {$sourceinfo['reputation']} - " . $options['reputationdefault'], false);
     $userdm->set('lastvisit', "IF(lastvisit < {$sourceinfo['lastvisit']}, {$sourceinfo['lastvisit']}, lastvisit)", false);
     $userdm->set('lastactivity', "IF(lastactivity < {$sourceinfo['lastactivity']}, {$sourceinfo['lastactivity']}, lastactivity)", false);
     $userdm->set('lastpost', "IF(lastpost < {$sourceinfo['lastpost']}, {$sourceinfo['lastpost']}, lastpost)", false);
     $userdm->set('pmtotal', "pmtotal + {$sourceinfo['pmtotal']}", false);
     $userdm->set('pmunread', "pmunread + {$sourceinfo['pmunread']}", false);
     $userdm->set('gmmoderatedcount', "gmmoderatedcount + {$sourceinfo['gmmoderatedcount']}", false);
     if ($sourceinfo['joindate'] > 0) {
         // get the older join date, but only if we actually have a date
         $userdm->set('joindate', "IF(joindate > {$sourceinfo['joindate']}, {$sourceinfo['joindate']}, joindate)", false);
     }
     $userdm->set('ipoints', "ipoints + " . intval($sourceinfo['ipoints']), false);
     $userdm->set('warnings', "warnings + " . intval($sourceinfo['warnings']), false);
     $userdm->set('infractions', "infractions + " . intval($sourceinfo['infractions']), false);
     $assertor->assertQuery('user_insertuserlist', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $assertor->assertQuery('user_updateuserlist', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $myfriendcount = $assertor->getField('user_fetchuserlistcount', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_STORED, 'userid' => $destinfo['userid']));
     $userdm->set('friendcount', $myfriendcount);
     $userdm->save();
     unset($userdm);
     require_once DIR . '/includes/functions_databuild.php';
     build_userlist($destinfo['userid']);
     // if the source user has infractions, then we need to update the infraction groups on the dest
     // easier to do it this way to make sure we get fresh info about the destination user
     if ($sourceinfo['ipoints']) {
         unset($usercache["{$destinfo['userid']}"]);
         $new_user = vB_User::fetchUserInfo($destinfo['userid']);
         $infractiongroups = array();
         $groups = $assertor->assertQuery('user_fetchinfractiongroup', array());
         foreach ($groups as $group) {
             $infractiongroups["{$group['usergroupid']}"]["{$group['pointlevel']}"][] = array('orusergroupid' => $group['orusergroupid'], 'override' => $group['override']);
         }
         $userdm = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_SILENT);
         $userdm->set_existing($new_user);
         $infractioninfo = vB_Library::instance('Content_Infraction')->fetchInfractionGroups($infractiongroups, $new_user['userid'], $new_user['ipoints'], $new_user['usergroupid']);
         $userdm->set('infractiongroupids', $infractioninfo['infractiongroupids']);
         $userdm->set('infractiongroupid', $infractioninfo['infractiongroupid']);
         $userdm->save();
         unset($userdm);
     }
     // Update announcements
     $assertor->assertQuery('user_updateannouncement', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update Read Announcements
     $assertor->assertQuery('userInsertAnnouncementread', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD, 'sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update Deletion Log
     $assertor->assertQuery('user_updatedeletionlog', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid'], 'destusername' => $destinfo['username']));
     // Update Edit Log
     $assertor->assertQuery('user_updateeditlog', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid'], 'destusername' => $destinfo['username']));
     // Update Edit Log
     $assertor->assertQuery('user_updatepostedithistory', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid'], 'destusername' => $destinfo['username']));
     // Update Poll Votes - find any poll where we both voted
     // we need to remove the source user's vote
     $pollconflicts = array();
     $polls = $assertor->assertQuery('user_fetchpollvote', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     foreach ($polls as $poll) {
         $pollconflicts["{$poll['nodeid']}"] = $poll;
     }
     $assertor->assertQuery('user_updatepollvote', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     if (!empty($pollconflicts)) {
         $assertor->assertQuery('user_deletepollvote', array('userid' => $sourceinfo['userid']));
         // Polls that need to be rebuilt now
         foreach ($pollconflicts as $pollconflict) {
             vB_Api::instanceInternal('poll')->updatePollCache($pollconflict['nodeid']);
             $pollvotes = $assertor->assertQuery('user_fetchpollvote2', array('nodeid' => $pollconflict['nodeid']));
             $lastvote = 0;
             foreach ($pollvotes as $pollvote) {
                 if ($pollvote['votedate'] > $lastvote) {
                     $lastvote = $pollvote['votedate'];
                 }
             }
             // It appears that pollvote.votedate wasn't always set in the past so we could have votes with no datetime, hence the check on lastvote below
             $assertor->assertQuery('userUpdatePoll', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD, 'nodeid' => $pollconflict['nodeid'], 'lastvote' => $lastvote));
         }
     }
     // Update User Notes
     $assertor->assertQuery('user_updateusernote', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $assertor->assertQuery('user_updateusernote2', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update Calendar Events
     $assertor->assertQuery('user_updateevent', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update Reputation Details
     $assertor->assertQuery('user_updatereputation', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $assertor->assertQuery('user_updatereputation2', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update infractions
     $assertor->assertQuery('user_updateinfraction', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $assertor->assertQuery('user_updateinfraction2', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Update tags
     require_once DIR . '/includes/class_taggablecontent.php';
     vB_Taggable_Content_Item::merge_users($sourceinfo['userid'], $destinfo['userid']);
     // Clear Group Transfers
     //		$assertor->assertQuery('user_updatesocialgroup', array(
     //			'userid' => $sourceinfo['userid'],
     //		));
     // Delete requests if the dest user already has them
     $assertor->assertQuery('userDeleteUsergrouprequest', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_METHOD, 'sourceuserid' => $sourceinfo['userid'], 'destusergroupid' => $destinfo['usergroupid'], 'destmembergroupids' => $destinfo['membergroupids']));
     // Convert remaining requests to dest user.
     $assertor->assertQuery('user_updateusergrouprequest', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Paid Subscriptions
     $assertor->assertQuery('user_updatepaymentinfo', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     // Move subscriptions over
     $assertor->assertQuery('user_updatesubscriptionlog', array('sourceuserid' => $sourceinfo['userid'], 'destuserid' => $destinfo['userid']));
     $list = $remove = $update = array();
     // Combine active subscriptions
     $subs = $assertor->assertQuery('user_fetchsubscriptionlog', array('userid' => $destinfo['userid']));
     foreach ($subs as $sub) {
         $subscriptionid = $sub['subscriptionid'];
         $existing = $list[$subscriptionid];
         if ($existing) {
             if ($sub['expirydate'] > $existing['expirydate']) {
                 $remove[] = $existing['subscriptionlogid'];
                 unset($update[$existing['subscriptionlogid']]);
                 $list[$subscriptionid] = $sub;
                 $update[$sub['subscriptionlogid']] = $sub['expirydate'];
             } else {
                 $remove[] = $sub['subscriptionlogid'];
             }
         } else {
             $list[$subscriptionid] = $sub;
         }
     }
     if (!empty($remove)) {
         $assertor->assertQuery('user_deletesubscriptionlog', array('ids' => $remove));
     }
     foreach ($update as $subscriptionlogid => $expirydate) {
         $assertor->assertQuery('user_updatesubscriptionlog2', array('expirydate' => $expirydate, 'subscriptionlogid' => $subscriptionlogid));
     }
     //fix the names on any nodes that the user may be attached to.
     $assertor->assertQuery('vBForum:node', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_UPDATE, vB_dB_Query::CONDITIONS_KEY => array('userid' => $sourceinfo['userid']), 'authorname' => $destinfo['username'], 'userid' => $destinfo['userid']));
     $assertor->assertQuery('vBForum:node', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_UPDATE, vB_dB_Query::CONDITIONS_KEY => array('lastauthorid' => $sourceinfo['userid']), 'lastcontentauthor' => $destinfo['username'], 'lastauthorid' => $destinfo['userid']));
     // Remove remnants of source user
     $userdm = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_SILENT);
     $userdm->set_existing($sourceinfo);
     $userdm->delete();
     unset($userdm);
     return true;
 }
Exemplo n.º 3
0
 /**
  * Additional data to update after a save call (such as denormalized values in other tables).
  *
  * @param	boolean	Do the query?
  */
 function post_save_each($doquery = true)
 {
     $moderatorid = $this->fetch_field('moderatorid');
     // update usergroupid / membergroupids
     if (!$this->condition and !in_array($this->moderator['userid'], explode(',', $this->config['SpecialUsers']['undeletableusers'])) and can_administer('canadminusers')) {
         $update_usergroupid = $this->info['usergroupid'] > 0;
         $update_membergroup = (!empty($this->info['membergroupids']) and is_array($this->info['membergroupids']));
         if ($update_usergroupid or $update_membergroup) {
             $userdata = new vB_Datamanager_User($this->registry, vB_DataManager_Constants::ERRTYPE_SILENT);
             if (!$this->info['user'] and $this->moderator['userid']) {
                 $this->info['user'] = fetch_userinfo($this->moderator['userid']);
             }
             $userdata->set_existing($this->info['user']);
             cache_permissions($this->info['user'], false);
             $displaygroupid = $update_usergroupid ? $this->info['usergroupid'] : $this->info['user']['displaygroupid'];
             $this->usergroupcache = vB::getDatastore()->get_value('usergroupcache');
             $userdata->set_usertitle($this->info['user']['customtitle'] ? $this->info['user']['usertitle'] : '', false, $this->usergroupcache["{$displaygroupid}"], ($this->info['user']['customtitle'] == 1 or $this->info['user']['permissions']['genericpermissions'] & $this->bf_ugp_genericpermissions['canusecustomtitle']) ? true : false, $this->info['user']['customtitle'] == 1 ? true : false);
             $userdata->set_failure_callback(array(&$this, 'update_user_failed_insert'));
             if ($update_usergroupid) {
                 $userdata->set('usergroupid', $this->info['usergroupid']);
                 $userdata->set('displaygroupid', $this->info['usergroupid']);
             }
             if ($update_membergroup) {
                 $membergroupids = preg_split('#,#', $this->info['user']['membergroupids'], -1, PREG_SPLIT_NO_EMPTY);
                 $membergroupids = array_unique(array_merge($membergroupids, $this->info['membergroupids']));
                 if ($key = array_search($this->info['user']['usergroupid'], $membergroupids)) {
                     unset($membergroupids["{$key}"]);
                 }
                 sort($membergroupids);
                 $userdata->set('membergroupids', $membergroupids);
             }
             if ($userdata->errors) {
                 $this->errors = array_merge($this->errors, $userdata->errors);
                 return;
             }
             $userdata->save();
         }
     }
     if (!$this->condition and !$this->options['ignoremods']) {
         $rebuild_ignore_list = array();
         $ignored_moderators = $this->assertor->getRows('userlist', array('relationid' => $this->fetch_field('userid'), 'type' => 'ignore'));
         foreach ($ignored_moderators as $ignored_moderator) {
             $rebuild_ignore_list[] = $ignored_moderator['userid'];
         }
         if (!empty($rebuild_ignore_list)) {
             require_once DIR . '/includes/functions_databuild.php';
             $this->assertor->delete('userlist', array('relationid' => $this->fetch_field('userid'), 'type' => 'ignore'));
             foreach ($rebuild_ignore_list as $userid) {
                 build_userlist($userid);
             }
         }
     }
     // Legacy Hook 'moderatordata_postsave' Removed //
     vB_Cache::instance(vB_Cache::CACHE_FAST)->event('userPerms_' . $this->moderator['userid']);
 }
 /**
  * Additional data to update after a save call (such as denormalized values in other tables).
  *
  * @param	boolean	Do the query?
  */
 function post_save_each($doquery = true)
 {
     $moderatorid = $this->fetch_field('moderatorid');
     // update usergroupid / membergroupids
     if (!$this->condition and !in_array($this->moderator['userid'], explode(',', $this->registry->config['SpecialUsers']['undeletableusers'])) and can_administer('canadminusers')) {
         $update_usergroupid = $this->info['usergroupid'] > 0;
         $update_membergroup = (!empty($this->info['membergroupids']) and is_array($this->info['membergroupids']));
         if ($update_usergroupid or $update_membergroup) {
             $userdata =& datamanager_init('User', $this->registry, ERRTYPE_SILENT);
             if (!$this->info['user'] and $this->moderator['userid']) {
                 $this->info['user'] = fetch_userinfo($this->moderator['userid']);
             }
             $userdata->set_existing($this->info['user']);
             cache_permissions($this->info['user'], false);
             $displaygroupid = $update_usergroupid ? $this->info['usergroupid'] : $this->info['user']['displaygroupid'];
             $userdata->set_usertitle($this->info['user']['customtitle'] ? $this->info['user']['usertitle'] : '', false, $this->registry->usergroupcache["{$displaygroupid}"], ($this->info['user']['customtitle'] == 1 or $this->info['user']['permissions']['genericpermissions'] & $this->registry->bf_ugp_genericpermissions['canusecustomtitle']) ? true : false, $this->info['user']['customtitle'] == 1 ? true : false);
             $userdata->set_failure_callback(array(&$this, 'update_user_failed_insert'));
             if ($update_usergroupid) {
                 $userdata->set('usergroupid', $this->info['usergroupid']);
                 $userdata->set('displaygroupid', $this->info['usergroupid']);
             }
             if ($update_membergroup) {
                 $membergroupids = preg_split('#,#', $this->info['user']['membergroupids'], -1, PREG_SPLIT_NO_EMPTY);
                 $membergroupids = array_unique(array_merge($membergroupids, $this->info['membergroupids']));
                 if ($key = array_search($this->info['user']['usergroupid'], $membergroupids)) {
                     unset($membergroupids["{$key}"]);
                 }
                 sort($membergroupids);
                 $userdata->set('membergroupids', $membergroupids);
             }
             if ($userdata->errors) {
                 $this->errors = array_merge($this->errors, $userdata->errors);
                 return;
             }
             $userdata->save();
         }
     }
     if (!$this->condition and !$this->registry->options['ignoremods']) {
         $rebuild_ignore_list = array();
         $ignored_moderators = $this->dbobject->query_read("SELECT userid FROM " . TABLE_PREFIX . "userlist WHERE relationid = " . $this->fetch_field('userid') . " AND type = 'ignore'");
         while ($ignored_moderator = $this->dbobject->fetch_array($ignored_moderators)) {
             $rebuild_ignore_list[] = $ignored_moderator['userid'];
         }
         if (!empty($rebuild_ignore_list)) {
             require_once DIR . '/includes/functions_databuild.php';
             $this->dbobject->query_write("DELETE FROM " . TABLE_PREFIX . "userlist WHERE relationid = " . $this->fetch_field('userid') . " AND type = 'ignore'");
             foreach ($rebuild_ignore_list as $userid) {
                 build_userlist($userid);
             }
         }
     }
     ($hook = vBulletinHook::fetch_hook('moderatordata_postsave')) ? eval($hook) : false;
 }
Exemplo n.º 5
0
 $userdm->set('pmunread', "pmunread + {$sourceinfo['pmunread']}", false);
 $userdm->set('gmmoderatedcount', "gmmoderatedcount + {$sourceinfo['gmmoderatedcount']}", false);
 if ($sourceinfo['joindate'] > 0) {
     // get the older join date, but only if we actually have a date
     $userdm->set('joindate', "IF(joindate > {$sourceinfo['joindate']}, {$sourceinfo['joindate']}, joindate)", false);
 }
 $userdm->set('ipoints', "ipoints + " . intval($sourceinfo['ipoints']), false);
 $userdm->set('warnings', "warnings + " . intval($sourceinfo['warnings']), false);
 $userdm->set('infractions', "infractions + " . intval($sourceinfo['infractions']), false);
 $db->query_write("\r\n\t\tINSERT IGNORE INTO " . TABLE_PREFIX . "userlist\r\n\t\t\t(userid, relationid, type, friend)\r\n\t\tSELECT {$destinfo['userid']}, relationid, type, friend\r\n\t\tFROM " . TABLE_PREFIX . "userlist\r\n\t\tWHERE userid = {$sourceinfo['userid']}\r\n\t");
 $db->query_write("\r\n\t\tUPDATE IGNORE " . TABLE_PREFIX . "userlist\r\n\t\tSET relationid = {$destinfo['userid']}\r\n\t\tWHERE relationid = {$sourceinfo['userid']}\r\n\t\t\tAND relationid <> {$destinfo['userid']}\r\n\t");
 list($myfriendcount) = $db->query_first("\r\n\t\tSELECT COUNT(*) FROM " . TABLE_PREFIX . "userlist\r\n\t\tWHERE userid = {$destinfo['userid']}\r\n\t\t\tAND type = 'buddy'\r\n\t\t\tAND friend = 'yes'", DBARRAY_NUM);
 $userdm->set('friendcount', $myfriendcount);
 $userdm->save();
 unset($userdm);
 build_userlist($destinfo['userid']);
 // if the source user has infractions, then we need to update the infraction groups on the dest
 // easier to do it this way to make
 if ($sourceinfo['ipoints']) {
     // make sure we get fresh info about the destination user
     unset($usercache["{$destinfo['userid']}"]);
     $new_user = fetch_userinfo($destinfo['userid']);
     $infractiongroups = array();
     $groups = $vbulletin->db->query_read("\r\n\t\t\tSELECT usergroupid, orusergroupid, pointlevel, override\r\n\t\t\tFROM " . TABLE_PREFIX . "infractiongroup\r\n\t\t\tORDER BY pointlevel\r\n\t\t");
     while ($group = $vbulletin->db->fetch_array($groups)) {
         $infractiongroups["{$group['usergroupid']}"]["{$group['pointlevel']}"][] = array('orusergroupid' => $group['orusergroupid'], 'override' => $group['override']);
     }
     $userdm =& datamanager_init('User', $vbulletin, ERRTYPE_SILENT);
     $userdm->set_existing($new_user);
     require_once DIR . '/includes/functions_infractions.php';
     $infractioninfo = fetch_infraction_groups($infractiongroups, $new_user['userid'], $new_user['ipoints'], $new_user['usergroupid']);