logger = new LBRY_Daemon_Logger(); $this->notice = new LBRY_Admin_Notice(); $this->daemon_running = $this->test_daemon(); if (!$this->daemon_running) { $this->start_daemon(); $this->notice->set_notice('error', 'Cannot connect to the LBRY Daemon. Attempting to start daemon server.
If you are still having troubles, click HERE for help.'); } } /** * Returns a boolean representation of daemon status * @return bool Whether or not the daemon is running */ private function test_daemon() { try { $result = $this->request('status')->result; return $result->is_running; } catch (LBRYDaemonException $e) { $this->logger->log('daemon_status_error', $e->getMessage() . ' | Code: ' . $e->getCode()); return false; } } /** * Attempts to start the daemon */ private function start_daemon() { // Check if a daemon start process is already running $options = get_option(LBRY_SETTINGS); if ($options[LBRY_DAEMON_PID]) { if ($this->is_process_running($options[LBRY_DAEMON_PID])) { return; } $options[LBRY_DAEMON_PID] = false; update_option(LBRY_SETTINGS, $options); } // Using proc_open to set up the request // Again, this is unix only $cmd = ABSPATH . "lbrynet start"; $command = $cmd . ' > /dev/null 2> /dev/null & echo $!;'; $pid = exec($command); if ($pid) { $options = get_option(LBRY_SETTINGS); $options[LBRY_DAEMON_PID] = $pid; update_option(LBRY_SETTINGS, $options); } } /** * Attempts to stop the daemon */ private function stop_daemon() { exec(ABSPATH . 'lbrynet stop > /dev/null 2> /dev/null &'); } /** * Checks to see if a PID is currently running * @param int $pid * @return boolean */ private function is_process_running($pid) { // This is unix specific $lines_out = array(); exec('ps '.(int)$pid, $lines_out); if(count($lines_out) >= 2) { // Process is running return true; } return false; } /** * Returns an unused address * https://lbry.tech/api/sdk#address_unused * @return string Unused wallet address in base58 */ public function wallet_unused_address() { if (!$this->daemon_running) return; try { $result = $this->request('address_unused'); return $result->result; } catch (LBRYDaemonException $e) { $this->logger->log('address_unused error', $e->getMessage() . ' | Code: ' . $e->getCode()); $this->notice->set_notice('error', 'Issue getting unused address.'); return; } } /** * Returns an paginated array of Address lists * https://lbry.tech/api/sdk#address_list * @param int $page Pagination page number * @return array Array of address lists linked to this account */ public function address_list($page = 1) { if (!$this->daemon_running) return; // Get 20 per page $params = array( 'page' => $page, 'page_size' => 20 ); try { $result = $this->request('address_list', $params); return $result->result->items; } catch (LBRYDaemonException $e) { $this->logger->log('address_list error', $e->getMessage() . ' | Code: ' . $e->getCode()); $this->notice->set_notice('error', 'Issue getting address list.'); return; } } /** * Returns the available balance of a current LBRY account * https://lbry.tech/api/sdk#account_balance * @param string $address Wallet Address * @return float Wallet Balance */ public function wallet_balance() { if (!$this->daemon_running) return; try { $result = $this->request('account_balance'); return $result->result->available; } catch (LBRYDaemonException $e) { $this->logger->log('account_balance error', $e->getMessage() . ' | Code: ' . $e->getCode()); $this->notice->set_notice('error', 'Issue getting account balance.'); return; } } /** * Returns a list of channels for this account * https://lbry.tech/api/sdk#channel_list * @param int $page Pagination page number * @return array claim dictionary or null if empty */ public function channel_list($page = 1) { if (!$this->daemon_running) return; $params = array( 'page' => $page, 'page_size' => 20 ); try { $result = $this->request('channel_list', $params)->result->items; return empty($result) ? null : $result; } catch (LBRYDaemonException $e) { $this->logger->log('channel_list error', $e->getMessage() . ' | Code: ' . $e->getCode()); $this->notice->set_notice('error', 'Issue retrieving channel list.'); return; } } /** * Create a claim for a new channel * https://lbry.tech/api/sdk#channel_create * @return array dictionary containing result of the request */ public function channel_new($channel_name, $bid_amount) { if (!$this->daemon_running) return; // TODO: Sanitize channel name and bid // Make sure no @ sign, as we will add that if (strpos($channel_name, '@')) { throw new \Exception('Illegal character "@" in channel name', 1); } // No white space allowed if (strpos($channel_name, ' ')) { throw new \Exception("No spaces allowed in channel name", 1); } $channel_name = '@' . $channel_name; try { $result = $this->request( 'channel_create', array( 'name' => $channel_name, 'bid' => number_format(floatval($bid_amount), 2, '.', '') ) ); return $result->result; } catch (LBRYDaemonException $e) { $this->logger->log('channel_new error', $e->getMessage() . ' | Code: ' . $e->getCode()); throw new \Exception('Issue creating new channel.', 1); return; } } /** * Returns the canonical URL for the supplied claim ID, null otherwise * @param string $claim_id * @return string Canonical URL, null if not found */ public function canonical_url($claim_id = null) { if (!$this->daemon_running) return; if (!$claim_id) { return null; } try { $result = $this->request( 'claim_search', array( 'claim_id' => $claim_id, 'no_totals' => true ) ); $items = $result->result->items; if (!$items) { return null; } return $items[0]->canonical_url; } catch (LBRYDaemonException $e) { $this->logger->log('canonical_url error', $e->getMessage() . ' | Code: ' . $e->getCode()); return; } } /** * Publishes a post to the LBRY Network * https://lbry.tech/api/sdk#publish * @param array $args An array containing necessary data for publish post * * Available params: * ['name', 'bid', 'file_path', 'title', 'description', 'language', 'license', 'channel_id', 'thumbnail'] * * @return object $result */ public function publish($args) { if (!$this->daemon_running) return; try { $result = $this->request( 'publish', $args ); $this->logger->log('publish success!', 'Successfully published post with result: ' . print_r($result->result, true)); return $result->result; } catch (LBRYDaemonException $e) { $this->logger->log('publish error', $e->getMessage() . ' | Code: ' . $e->getCode()); $this->notice->set_notice('error', 'Issue publishing / updating post to LBRY Network.'); return; } } /** * Sends a cURL request to the LBRY Daemon * @param string $method The method to call on the LBRY API * @param array $params The Parameters to send the LBRY API Call * @return string The cURL response */ private function request($method, $params = array()) { // JSONify our request data $data = array( 'method' => $method, 'params' => $params ); $data = json_encode($data); // Send it via curl $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->address); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_AUTOREFERER, false); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_HEADER, 0); $result = curl_exec($ch); $response_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); if ($response_code != '200') { $this->logger->log("Damon Connection Issue", "Daemon connection returned response code $response_code"); throw new LBRYDaemonException("Daemon Connection Issue", $response_code); } $result = json_decode($result); $this->check_for_errors($result); return $result; } /** * Checks for erros in decoded daemon response and throws an exception if it finds one * @param $response */ private function check_for_errors($response) { if (property_exists($response, 'error')) { $message = $response->error->message; $code = $response->error->code; $this->logger->log("Daemon error code $code", $message); throw new LBRYDaemonException($message, $code); } } /** * Temporary placeholder function for daemon. Not currently in use. * @return [type] [description] */ // private function download_daemon() // { // $output_filename = "lbrydaemon"; // // // HACK: Shouldn't just directly download, need to know OS, etc // // TODO: Make sure we are only installing if not there or corrupted // $host = "http://build.lbry.io/daemon/build-6788_commit-5099e19_branch-lbryum-refactor/mac/lbrynet"; // $fp = fopen(LBRY_URI . '/' . $output_filename, 'w+'); // $ch = curl_init(); // curl_setopt($ch, CURLOPT_URL, $host); // curl_setopt($ch, CURLOPT_VERBOSE, 1); // curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // curl_setopt($ch, CURLOPT_FILE, $fp); // curl_setopt($ch, CURLOPT_AUTOREFERER, false); // curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // curl_setopt($ch, CURLOPT_HEADER, 0); // // $result = curl_exec($ch); // curl_close($ch); // fclose($fp); // // $filepath = LBRY_URI . '/' . $output_filename; // // `chmod +x {$filepath}`; // error_log(`{$filepath} status`); // `{$filepath} start &`; // } } class LBRYDaemonException extends Exception { public function __contstruct($message = '', $code = 0, Exception $previous = null) { parent::__construct($message, $code, $previous); } }