* @copyright 2008-2010 Phergie Development Team (http://phergie.org) * @license http://phergie.org/license New BSD License * @link http://pear.phergie.org/package/Phergie_Plugin_Ideone */ /** * Interfaces with ideone.com to execute code and return the result. * * @category Phergie * @package Phergie_Plugin_Ideone * @author Phergie Development Team * @license http://phergie.org/license New BSD License * @link http://pear.phergie.org/package/Phergie_Plugin_Ideone * @uses Phergie_Plugin_Command pear.phergie.org */ class Phergie_Plugin_Ideone extends Phergie_Plugin_Abstract { /** * Checks for dependencies. * * @return void */ public function onLoad() { $this->plugins->getPlugin('Command'); } /** * Checks a service response for an error, sends a notice to the event * source if an error has occurred, and returns whether an error was found. * * @param array $result Associative array representing the service response * * @return boolean TRUE if an error is found, FALSE otherwise */ protected function isError($result) { if ($result['error'] != 'OK') { $this->doNotice($this->event->getNick(), 'ideone error: ' . $result['error']); return true; } return false; } /** * Executes a source code sequence in a specified language and returns * the result. * * @param string $language Programming language the source code is in * @param string $code Source code to execute * * @return void */ public function onCommandIdeone($language, $code) { $source = $this->event->getSource(); $nick = $this->event->getNick(); // Get authentication credentials $user = $this->getConfig('ideone.user', 'test'); $pass = $this->getConfig('ideone.pass', 'test'); // Normalize the command parameters $language = strtolower($language); // Massage PHP code to allow for convenient shorthand if ($language == 'php') { if (!preg_match('/^<\?(?:php)?/', $code)) { $code = 'getLanguages($user, $pass); if ($this->isError($response)) { return; } $languageLength = strlen($language); foreach ($response['languages'] as $languageId => $languageName) { if (strncasecmp($language, $languageName, $languageLength) == 0) { break; } } // Send the paste data $response = $client->createSubmission( $user, $pass, $code, $languageId, null, // string input - data from stdin true, // boolean run - TRUE to execute the code false // boolean private - FALSE to make the paste public ); if ($this->isError($response)) { return; } $link = $response['link']; // Wait until the paste data is processed or the service fails $attempts = $this->getConfig('ideone.attempts', 10); foreach (range(1, $attempts) as $attempt) { $response = $client->getSubmissionStatus($user, $pass, $link); if ($this->isError($response)) { return; } if ($response['status'] == 0) { $result = $response['result']; break; } else { $result = null; sleep(1); } } if ($result == null) { $this->doNotice($nick, 'ideone error: Timed out'); return; } if ($result != 15) { $this->doNotice($nick, 'ideone error: Status code ' . $result); return; } // Get details for the created paste $response = $client->getSubmissionDetails( $user, $pass, $link, false, // boolean withSource - FALSE to not return the source code false, // boolean withInput - FALSE to not return stdin data true, // boolean withOutput - TRUE to include output true, // boolean withStderr - TRUE to return stderr data false // boolean withCmpinfo - TRUE to return compilation info ); if ($this->isError($response)) { return; } // Replace the output if it exceeds a specified maximum length $outputLimit = $this->getConfig('ideone.output_limit', 100); var_dump($response); if ($outputLimit && strlen($response['output']) > $outputLimit) { $response['output'] = 'Output is too long to post'; } // Format the message $msg = $this->getConfig('ideone.format', '%nick%: [ %link% ] %output%'); $response['nick'] = $nick; $response['link'] = 'http://ideone.com/' . $link; foreach ($response as $key => $value) { $msg = str_replace('%' . $key . '%', $value, $msg); } $this->doPrivmsg($source, $msg); } }