/** * Processes all jobs of a bot defined in config.php. * @params * $bot :array, as defined in config.php * @returns nothing */ function process($bot) { foreach ($bot['jobs'] as $job_label => $job) { $firstrun = !sizeof(get_logged_issues($job_label)) > 0; //Anything logged yet for this job? echo "\nProcessing job '{$job_label}'\n"; echo "------------------------------------------------"; $starting_id = get_last_initiative($job_label, $bot['starting_id']); //the bot's starting id is only used as fallback echo "[starting with initiative {$starting_id}]\n"; if ($firstrun) { $event = array("issue_id" => -2, "initiative_id" => -2, "job" => $job_label); log_event($event); //initiatiate log table echo "First run for this job on this bot. No tweets will be sent.\n\n"; } $query = $job['query'] . "&min_id=" . $starting_id; //make sure to get only recent initiatives $result = lf_query($bot['lf'], $query); //get all initiatives needed for the current job $job_labels = (array) $job['dont_retweet']; //this prevents issues beeing tweeted for multiple jobs $job_labels[] = $job_label; $logged_issues = get_logged_issues($job_labels); //events already twittered $todo = 0; //as of now there is no event to process $twittered = 0; //nothing has been twittered yet $new_event_found = false; //nothing new has been detected yet - suprise foreach ($result as $initiative) { log_and_flush(); // Log and flush the output buffer :) if (in_array($initiative['issue_state'], (array) $job['states'])) { //process only those whose state is among those of interest $todo++; //one initiative found, so one more to do :) $issue_id = $initiative['issue_id']; //get the issue_id, that is NOT the initiative's id! $initiative_id = $initiative['id']; $event = array("issue_id" => $issue_id, "initiative_id" => $initiative_id, "job" => $job_label); //current event if (!in_array($issue_id, $logged_issues)) { //dont tweet the same issue twice $new_event_found = true; echo "\n\tIssue {$initiative['issue_id']} has not yet been twittered for one of the following job(s): " . implode(', ', $job_labels) . ". ({$initiative_id})\n"; $url = get_issue_link($bot['lf'], $initiative); echo "\t\tURL: {$url}\n"; if ($firstrun) { $shorturl = true; } else { $shorturl = shortlink($url); //bit.ly } if ($shorturl) { //the url actually got shortened echo "\t\tShortened URL: {$shorturl}\n"; $tweet = sprintf($job['format'], $bot['hashtag'], $shorturl, $issue_id); echo "\t\tSending tweet: '{$tweet}'\n"; if ($firstrun) { // Prevent the bot from tweeting on the first run, there'd be tons of old stuff otherwise $done = true; echo "\t\tNo tweets on first run.\n"; } else { $done = twitter($bot['twitter'], $tweet); //Here we go! } if ($done) { log_event($event); //keep this one in mind to not twitter it again in future runs for the same job $logged_events[] = $event; //keep this one in mind not to twitter it again this run $twittered++; //one more has been twittered $todo--; //this one is done :) } else { echo "\t\tAborted: unable to send tweet.\n"; } } else { echo "\t\tAborted: unable to shorten url.\n"; } } else { $todo--; //we dont have to deal with this one anymore echo "\n\tIssue {$initiative['issue_id']} has already been twittered for one of the the following job(s): " . implode(', ', $job_labels) . ". ({$initiative_id})\n"; } } } if (!$new_event_found) { echo "\n*No untwittered issues for job '{$job_label}'.\n\n"; } else { echo "\n*{$twittered} issue(s) have been twittered for job '{$job_label}'.\n\n"; } if ($todo > 0) { echo "\n*There are " . $todo . " initiative(s) left to process.\n\n"; } echo "\n\n"; log_and_flush(); //Log and flush the output buffer :) } }
foreach ($bots as $name => $bot) { log_this("–––––––––––– processing bot '{$name}'"); echo "** BOT '{$name}' running \n*****************************\n"; log_and_flush(); //Log and flush the output buffer :) $db_events_table = $name . "_events"; // every bot gets his own table to log events //clear_logged_events(); // reset the bot process($bot, !table_exists($db_events_table)); /* If the events table does not exists nothing will be twittered. This way old stuff wont be twittered in the first run. Instead the table is created and logs the old events. */ summary_tweet($bot); //Daily summary. echo "\n\n\n\n"; //print_table($db_events_table); // shows all logged events for debugging } log_and_flush(); //Log and flush the output buffer for the last time ob_end_clean(); //end output buffer log_this("––––––––––––– done. ", $log); //write the output of this script to the log table mysql_close(DB); ?>