日期:2014-05-17 浏览次数:20495 次
<?php class EtherpadLiteClient { const API_VERSION = 1; const CODE_OK = 0; const CODE_INVALID_PARAMETERS = 1; const CODE_INTERNAL_ERROR = 2; const CODE_INVALID_FUNCTION = 3; const CODE_INVALID_API_KEY = 4; protected $apiKey = ""; protected $baseUrl = "http://localhost:9001/api"; public function __construct($apiKey, $baseUrl = null){ $this->apiKey = $apiKey; if (isset($baseUrl)){ $this->baseUrl = $baseUrl; } if (!filter_var($this->baseUrl, FILTER_VALIDATE_URL)){ throw new InvalidArgumentException("[{$this->baseUrl}] is not a valid URL"); } } protected function call($function, array $arguments = array()){ $query = array_merge( array('apikey' => $this->apiKey), $arguments ); $url = $this->baseUrl."/".self::API_VERSION."/".$function."?".http_build_query($query); // not all PHP installs have access to curl if (function_exists('curl_init')){ $c = curl_init($url); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_TIMEOUT, 20); $result = curl_exec($c); curl_close($c); } else { $result = file_get_contents($url); } if($result == ""){ throw new UnexpectedValueException("Empty or No Response from the server"); } $result = json_decode($result); if ($result === null){ throw new UnexpectedValueException("JSON response could not be decoded"); } return $this->handleResult($result); } protected function handleResult($result){ if (!isset($result->code)){ throw new RuntimeException("API response has no code"); } if (!isset($result->message)){ throw new RuntimeException("API response has no message"); } if (!isset($result->data)){ $result->data = null; } switch ($result->code){ case self::CODE_OK: return $result->data; case self::CODE_INVALID_PARAMETERS: case self::CODE_INVALID_API_KEY: throw new InvalidArgumentException($result->message); case self::CODE_INTERNAL_ERROR: throw new RuntimeException($result->message); case self::CODE_INVALID_FUNCTION: throw new BadFunctionCallException($result->message); default: throw new RuntimeException("An unexpected error occurred whilst handling the response"); } } // GROUPS // Pads can belong to a group. There will always be public pads that doesnt belong to a group (or we give this group the id 0) // creates a new group public function createGroup(){ return $this->call("createGroup"); } // this functions helps you to map your application group ids to etherpad lite group ids public function createGroupIfNotExistsFor($groupMapper){ return $this->call("createGroupIfNotExistsFor", array( "groupMapper" => $groupMapper )); } // deletes a group public function deleteGroup($groupID){ return $this->call("deleteGroup", array( "groupID" => $groupID )); } // returns all pads of this group public function listPads($groupID){ return $this->call("listPads", array( "groupID" => $groupID )); } // creates a new pad in this group public function createGroupPad($groupID, $padName, $text){ return $this->call("createGroupPad", array( "groupID" => $groupID, "padName" => $padName, "text" => $text )); } // AUTHORS // Theses authors are bind to the attributes the users choose (color and name). // creates a new author public function createAuthor($name){ return $this->call("createAuthor", array( "name" => $name )); } // this functions helps you to map your application author ids to etherpad lite author ids public function createAuthorIfNotExistsFor($authorMapp