You are here

function _connector_information_update in Connector 6

3 calls to _connector_information_update()
connector_cron in ./connector.module
Implementation of hook_cron().
_connector_information_fetch in ./connector.module
_connector_log_in in ./connector.module

File

./connector.module, line 487
Connector module

Code

function _connector_information_update($uid, $types = NULL) {

  //TODO: Configure more types of information that we want fetched?
  if (is_object($uid)) {
    $uid = $uid->uid;
  }
  $connection = _connector_get_primary_connection($uid);
  $connector = isset($connection) ? _connector_get_connectors($connection->connector) : FALSE;
  if ($connector) {
    if (isset($connector['information callback']) && is_callable($connector['information callback'])) {
      $info = call_user_func($connector['information callback'], $connector, $connection->cid, $types);
    }
    $info = $info ? (array) $info : array();
    foreach ((array) $types as $type => $value) {
      if (!empty($value) && !array_key_exists($type, $info) && $type != 'avatar') {
        $info[$type] = FALSE;
      }
    }
    if (empty($types) || !empty($types['avatar'])) {
      if (variable_get('user_pictures', 0) && isset($connector['avatar callback']) && is_callable($connector['avatar callback'])) {
        $avatar = call_user_func($connector['avatar callback'], $connector, $connection->cid);
      }
      else {
        $avatar = NULL;
      }
    }
    if (!empty($connector['cache'])) {
      $max_life = time() + $connector['cache'];
    }
    else {

      //TODO: Make default cache time configurable?
      $max_life = time() + 432000;

      //5 days x 24 hours per day x 3600 seconds per hour = 432000
    }
  }
  if (!empty($info)) {
    if (array_key_exists('real name', $info)) {
      $real_name = (object) array(
        'uid' => $uid,
        'type' => 'real name',
      );
      $existing = db_fetch_object(db_query("SELECT value, failure_level FROM {connector_info} WHERE uid = %d AND type = 'real name'", array(
        ':uid' => $uid,
      )));
      if ($info['real name'] === FALSE) {
        $real_name->max_life = intval(time() + 30 * 60 * pow(5.6346264945, $existing->failure_level));

        // 30 minutes * 60 seconds per minute * failure level 4 = delay of 3 weeks
        if ($existing->failure_level < 4) {
          $real_name->failure_level = $existing->failure_level + 1;
        }
      }
      else {
        $real_name->max_life = $max_life;
        if ($existing && $existing->failure_level > 0) {
          $real_name->failure_level = 0;
        }
      }
      if ($info['real name'] !== FALSE || !empty($connector['invalidate old info'])) {
        $real_name->value = empty($info['real name']) ? '' : $info['real name'];

        //TODO: Empty should be saved as NULL?
      }
      if ($existing !== FALSE) {
        if ($existing->value == $info['real name']) {
          unset($real_name->value);
        }
        drupal_write_record('connector_info', $real_name, array(
          'uid',
          'type',
        ));
      }
      else {
        drupal_write_record('connector_info', $real_name);
      }
      _connector_information_fetch($uid, NULL, FALSE, TRUE);
    }
  }
  if (isset($avatar)) {
    if ($avatar !== FALSE || !empty($connector['invalidate old info'])) {
      $account = user_load($uid);
      if (isset($account->picture) && $account->picture != $destination && file_exists($account->picture)) {
        file_delete($account->picture);
      }
    }
    $avatar_record = (object) array(
      'uid' => $uid,
      'type' => 'avatar',
    );
    $existing = db_fetch_object(db_query("SELECT failure_level FROM {connector_info} WHERE uid = %d AND type = 'avatar'", array(
      ':uid' => $uid,
    )));
    if ($avatar === FALSE) {
      $avatar_record->max_life = time() + 30 * pow(5.6346264945, $existing->failure_level);

      // Failure level 4 = delay of 3 weeks
      if ($existing->failure_level < 4) {
        $avatar_record->failure_level = $avatar_record->failure_level + 1;
      }
    }
    elseif ($existing->failure_level > 0) {
      $avatar_record->max_life = $max_life;
      $avatar_record->failure_level = 0;
    }
    if (db_result(db_query("SELECT COUNT(*) FROM {connector_info} WHERE uid = %d AND type = 'avatar'", array(
      ':uid' => $uid,
    )))) {
      drupal_write_record('connector_info', $avatar_record, array(
        'uid',
        'type',
      ));
    }
    else {
      drupal_write_record('connector_info', $avatar_record);
    }
    if (!empty($avatar)) {
      $result = drupal_http_request($avatar);
      if ($result->code != 200) {
        watchdog('connector', 'Failed importing avatar for user @uid, code : @code', array(
          '@uid' => $uid,
          '@code' => $result->code,
        ));
      }
      else {

        //Copied from file_save_data - needs to write the file before validating it
        $temp = file_directory_temp();

        // On Windows, tempnam() requires an absolute path, so we use realpath().
        $tmp_file = tempnam(realpath($temp), 'file');
        if (!($fp = fopen($tmp_file, 'wb'))) {
          drupal_set_message(t('The file could not be created.'), 'error');
        }
        else {
          fwrite($fp, $result->data);
          fclose($fp);
          $file = new stdClass();
          $file->filename = file_munge_filename(trim(basename($tmp_file), '.'), 'jpg jpeg gif png', FALSE);
          $file->filepath = $tmp_file;
          $file->filemime = file_get_mimetype($tmp_file);
          $file->filesize = filesize($tmp_file);
          $errors = array();
          $errors += file_validate_is_image($file);
          $errors += file_validate_image_resolution($file, variable_get('user_picture_dimensions', '85x85'));
          $errors += file_validate_size($file, variable_get('user_picture_file_size', '30') * 1024);
          if (empty($errors)) {
            $info = image_get_info($file->filepath);
            $destination = file_create_path(variable_get('user_picture_path', 'pictures'));
            file_check_directory($destination, FILE_CREATE_DIRECTORY);
            if (file_copy($file, $destination . '/picture-' . $uid . '.' . $info['extension'], FILE_EXISTS_REPLACE)) {
              user_save($account, array(
                'picture' => $file->filepath,
              ));
            }
          }
          file_delete($tmp_file);
        }
      }
    }
  }
}