You are here

function fb_actions_cron_per_user in Drupal for Facebook 5.2

Same name and namespace in other branches
  1. 5 fb_actions.module \fb_actions_cron_per_user()
  2. 6.2 contrib/fb_actions.module \fb_actions_cron_per_user()

Trigger an action several times, emulating a different user each time. Useful for cron jobs in which we update each users profile box, for example.

File

./fb_actions.module, line 307
Actions defined here interact with Facebook's API. This makes it possible to notify facebook of various activities as they happen.

Code

function fb_actions_cron_per_user($obj, $values) {

  //$args = func_get_args();

  //watchdog('fb_action_debug', "fb_actions_cron_per_user" . dpr($args, 1), WATCHDOG_ERROR);
  foreach ($values['fb_app_nids'] as $nid) {
    $fb_app = fb_get_app(array(
      'nid' => $nid,
    ));

    // Set paths as if on a canvas page.
    // perform per-user actions by manipulating the global user variable.
    $save_session = session_save_session();
    session_save_session(FALSE);

    // Save current settings
    $before_fb = $GLOBALS['fb'];
    $before_fb_app = $GLOBALS['fb_app'];
    $before_user = $GLOBALS['user'];

    // Find some users of the app, for whom cron has not run recently.
    $result = db_query("SELECT * FROM {fb_user_app} WHERE apikey='%s' AND fbu > 0 AND added > 0 ORDER BY time_cron ASC LIMIT %d", $fb_app->apikey, $values['throttle']);
    while ($data = db_fetch_object($result)) {

      // Find a local account for the application user
      $account = fb_user_get_local_user($data->fbu, $fb_app);
      if (variable_get('fb_actions_verbose', FALSE)) {
        watchdog('fb_action_debug', "fb_actions_cron_per_user fbu is {$data->fbu}, local user is " . theme('username', $account), WATCHDOG_ERROR);
      }
      if (!$account || !$account->uid) {
        watchdog('fb cron', t('Facebook user %fbu does not correspond to a local account.', array(
          '%fbu' => $data->fbu,
        )));

        //db_query("DELETE FROM {fb_user_app} WHERE apikey='%s' AND fbu = %d",

        //         $fb_app->apikey,
        //         $data->fbu);
      }
      else {

        // If here, local user has been found.
        // The older facebook API required us to log in as the current user.
        // In the new API we should not need a user account to perform tasks appropriate for cron jobs.
        $fb = fb_api_init($fb_app, FB_FBU_NO_SESSION);
        if ($fb) {

          // Set things up as if this were a canvas page.
          $GLOBALS['user'] = $account;
          $GLOBALS['fb'] = $fb;
          $GLOBALS['fb_app'] = $fb_app;

          // Invoke any actions that we've been configured to invoke.
          try {
            actions_do($values['actions'], $fb_app, array(
              'fb' => $fb,
              'fb_app' => $fb_app,
            ));
          } catch (Exception $e) {
            watchdog('fb cron', "Action per user failed. " . $e
              ->getMessage(), WATCHDOG_ERROR);
          }
        }

        // end if able to log into facebook
      }

      // end if local user found.
      // Record how recently cron was run for this user.  We do this even if
      // we failed to log in, because we don't want persistent problems to
      // clog the cron queue.  We'll get to this user again, eventually.
      db_query("UPDATE {fb_user_app} SET time_cron=%d WHERE apikey='%s' AND fbu=%d", time(), $fb_app->apikey, $data->fbu);
    }

    // end loop per user
    // Restore global variables
    $GLOBALS['user'] = $before_user;
    $GLOBALS['fb'] = $before_fb;
    $GLOBALS['fb_app'] = $before_fb_app;
    session_save_session($save_session);
  }
}