function fb_actions_cron_per_user in Drupal for Facebook 5.2
Same name and namespace in other branches
- 5 fb_actions.module \fb_actions_cron_per_user()
- 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);
}
}