<?php
// $Id: twitter_signin.module,v 1.1.2.6 2010/01/25 03:14:45 walkah Exp $

/**
 * Implementation of hook_menu().
 */
function twitter_signin_menu() {
  $items = array();

  $items['twitter/redirect'] = array(
    'title' => 'Twitter Redirect',
    'page callback' => 'twitter_signin_redirect',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK
    
  );

  $items['admin/settings/twitter/signin'] = array(
    'title' => 'Sign-in',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('twitter_signin_admin_settings'),
    'access arguments' => array('administer site configuration'),
    'file' => 'twitter_signin.pages.inc',
    'type' => MENU_LOCAL_TASK,
    'weight' => 5
    
  );

  return $items;
}

/**
 * Implementation of hook_block().
 */
function twitter_signin_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      $block[0]['info'] = t('Sign in with Twitter');
      return $block;
    case 'view':
      global $user;
      
      if (!$user->uid && _twitter_use_oauth()) {
        $block['subject'] = t('Sign in with Twitter');
        $block['content'] = twitter_signin_button();
        return $block;
      }
  }
}

/**
 * Implementation of hook_user().
 */
function twitter_signin_user($op, &$edit, &$account, $category = NULL) {
  if ($op == 'insert' && isset($_SESSION['twitter']['values'])) {
    unset($_SESSION['twitter']);
  }
}

/**
 * returns an image link for signing in with twitter
 */
function twitter_signin_button() {
  $img_path = drupal_get_path('module', 'twitter_signin') . '/images/';
  $img = $img_path . variable_get('twitter_signin_button', 'Sign-in-with-Twitter-lighter-small.png');
  
  return l(theme('image', $img, t('Sign in with Twitter')), 'twitter/redirect', array('html' => TRUE));
}


/**
 * Submit handler for twitter signin
 */
function twitter_signin_redirect() {
  module_load_include('lib.php', 'oauth');
  module_load_include('lib.php', 'twitter');
  module_load_include('inc', 'twitter');

  $key = variable_get('twitter_consumer_key', '');
  $secret = variable_get('twitter_consumer_secret', '');
  $twitter = new TwitterOAuth($key, $secret);
  $token = $twitter->get_request_token();

  $_SESSION['twitter_oauth']['token'] = $token;
  $_SESSION['twitter_oauth']['destination'] = referer_uri();
  $_SESSION['twitter_oauth']['signin'] = TRUE;
  drupal_goto($twitter->get_authenticate_url($token));
}

/**
 * Implementation of hook_form_alter()
 */
function twitter_signin_form_alter(&$form, $form_state, $form_id) {
  // This only applies if we've got OAuth / signin enabled.
  if (!_twitter_use_oauth()) {
    return;
  }
  
  if ($form_id == 'twitter_oauth_callback' && $_SESSION['twitter_oauth']['signin']) {
    $form['#submit'] = array_merge(array('twitter_signin_oauth_callback_submit'), $form['#submit']);
  }
  
  if ($form_id == 'user_login' || $form_id == 'user_login_block') {
    $items = array();
    $items[] = twitter_signin_button();
    
    $form['twitter_signin'] = array(
      '#value' => theme('item_list', $items),
    );
  }
  elseif ($form_id == 'user_register' && isset($_SESSION['twitter']['values'])) {
    $form['name']['#default_value'] = $_SESSION['twitter']['values']['screen_name'];
    $form['auth_twitter'] = array('#type' => 'hidden', '#value' => $_SESSION['twitter']['values']['user_id']);
  }
}

/**
 * Form submit for the OAuth callback. Here we add in sign-in specific handling
 */
function twitter_signin_oauth_callback_submit(&$form, &$form_state) {
  global $user;

  $success = FALSE;

  $key = variable_get('twitter_consumer_key', '');
  $secret = variable_get('twitter_consumer_secret', '');
  $response = $form_state['twitter_oauth']['response'];

  $account = user_external_load($response['user_id']);
  if (isset($account->uid)) {
    user_external_login($account, $response);
    $success = TRUE;
  }
  elseif ($uid = db_result(db_query("SELECT uid FROM {twitter_account} WHERE twitter_uid= %d", $response['user_id']))) {
    // We have an existing twitter account - set it up for login
    $account = user_load($uid);
    $edit["authname_twitter"] = $response['user_id'];
    user_save($account, $edit);
    $user = $account;
    $success = TRUE;
  }
  else {
    // No existing user account, let's see if we can register.
    if (variable_get('twitter_signin_register', 0)) {
      // Check for a nickname collision
      $account = user_load(array('name' => $response['screen_name']));
      if (!$account->uid) {
        $edit = array(
          'name' => $response['screen_name'],
          'pass' => user_password(),
          'init' => $response['screen_name'],
          'status' => 1,
          "authname_twitter" => $response['user_id'],
          'access' => time(),
        );
        $account = user_save('', $edit);
        $user = $account;
        $success = TRUE;
      }
      else {
        drupal_set_message(t('The nickname %name is already in use on this site, please register below with a new nick name, or @login to continue.', array('%name' => $response['screen_name'], '@login' => url('user/login'))), 'warning');
      }
    }
    else {
      drupal_set_message(t('Please complete the following registration form to create your new account on %site', array('%site' => variable_get('site_name', ''))));
    }
  }
  
  if (!$success) {
    $_SESSION['twitter']['values'] = $response;
    drupal_goto('user/register');
  }
}
