日期:2014-05-17 浏览次数:20607 次
<?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