content['sslverify'] = $sslverify;
$this->body['id'] = $this->generate_id();
$this->body['jsonrpc'] = "2.0";
$this->body['method'] = NULL; // MUST be set later
$this->body['params'] = []; // CAN be set later
}
function add_body(array $b) : void
{
array_merge($this->body, $b);
}
private function generate_id()
{
$time = microtime(true);
$str = (string)$time;
$last = $str[strlen($str) - 1];
$last = (int)$last;
$id = $time * $time * $last;
$id = md5(base64_encode($id));
return $id;
}
/**
* This function sets the method of the RPC call you're making.
* For a list of available methods, see:
* https://www.unrealircd.org/docs/JSON-RPC#JSON-RPC_Methods
*/
function set_method(String $method) : void
{
do_log("Set method:", $method);
$this->body['method'] = $method;
}
function set_params(array $params) : void
{
do_log("Set params:", $params);
$this->body['params'] = $params;
}
function execute()
{
$this->content['body'] = json_encode($this->body);
if (!$this->content['body'])
return;
$url = "https://".UNREALIRCD_HOST.":".UNREALIRCD_PORT."/api";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$headers = array(
"Accept: application/json",
"Content-Type: application/json",
"Authorization: Basic ". base64_encode(UNREALIRCD_RPC_USER.":".UNREALIRCD_RPC_PASSWORD),
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
if (UNREALIRCD_DEBUG)
do_log("SENDING JSON:", $this->content['body']);
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->content['body']);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$apiResponse = curl_exec($curl);
curl_close($curl);
$this->result = $apiResponse;
}
function fetch_assoc()
{
do_log("RPC::fetch_assoc()", $this->result);
return json_decode($this->result, true);
}
static function die(array $err)
{
die("There was a problem processing the request: ".$err['message']." (".$err['code'].")
Please contact the plugin author.
".
"If you are a developer, see: https://www.unrealircd.org/docs/JSON-RPC#Error");
}
}
class RPC_List
{
static $user = [];
static $channel = [];
static $tkl = [];
static $spamfilter = [];
static $opercount = 0;
static $services_count = 0;
static $most_populated_channel = NULL;
static $channel_pop_count = 0;
}
function rpc_pop_lists()
{
$rpc = new RPC();
/* Get the user list */
$rpc->set_method("user.list");
$rpc->execute();
foreach($rpc->fetch_assoc() as $key => $value)
{
if ($key == "error")
{
RPC::die($value);
return;
}
if ($key == "result")
foreach($value['list'] as $r)
{
RPC_List::$user[] = $r;
if (strpos($r['user']['modes'],"o") !== false && strpos($r['user']['modes'],"S") == false)
RPC_List::$opercount++;
elseif (strpos($r['user']['modes'],"S") !== false)
RPC_List::$services_count++;
}
}
/* Get the channels list */
$rpc->set_method("channel.list");
$rpc->execute();
foreach($rpc->fetch_assoc() as $key => $value)
{
if ($key == "error")
{
RPC::die($value);
return;
}
if ($key == "result")
foreach($value['list'] as $r)
{
RPC_List::$channel[] = $r;
if ($r['num_users'] > RPC_List::$channel_pop_count)
{
RPC_List::$channel_pop_count = $r['num_users'];
RPC_List::$most_populated_channel = $r['name'];
}
}
}
/* Get the tkl list */
$rpc->set_method("server_ban.list");
$rpc->execute();
foreach($rpc->fetch_assoc() as $key => $value)
{
if ($key == "error")
{
RPC::die($value);
return;
}
if ($key == "result")
foreach($value['list'] as $r)
RPC_List::$tkl[] = $r;
}
/* Get the tkl list */
$rpc->set_method("spamfilter.list");
$rpc->execute();
foreach($rpc->fetch_assoc() as $key => $value)
{
if ($key == "error")
{
RPC::die($value);
return;
}
if ($key == "result")
foreach($value['list'] as $r)
RPC_List::$spamfilter[] = $r;
}
}
/** RPC TKL Add */
function rpc_tkl_add($name, $type, $expiry, $reason) : bool
{
$rpc = new RPC();
$rpc->set_method("server_ban.add");
$rpc->set_params(["name" => $name, "type" => $type, "reason" => $reason, "duration_string" => $expiry]);
$rpc->execute();
$result = $rpc->fetch_assoc();
if (isset($result['error']))
{
$msg = "The $type could not be added: $name - ".$result['error']['message'] . " (" . $result['error']['code'] . ")";
Message::Fail($msg);
return false;
}
return true;
}
/** RPC TKL Delete */
function rpc_tkl_del($name, $type) : bool
{
$rpc = new RPC();
$rpc->set_method("server_ban.del");
$rpc->set_params(["name" => $name, "type" => $type]);
$rpc->execute();
$result = $rpc->fetch_assoc();
if (isset($result['error']))
{
$msg = "The $type could not be deleted: $name - ".$result['error']['message'] . " (" . $result['error']['code'] . ")";
Message::Fail($msg);
return false;
}
return true;
}
/** RPC Spamfilter Delete
*
*/
function rpc_sf_del($name, $mtype, $targets, $action) : bool
{
$rpc = new RPC();
$rpc->set_method("spamfilter.del");
$rpc->set_params(["name" => $name, "match_type" => $mtype, "spamfilter_targets" => $targets, "ban_action" => $action, "set_by" => "YoMama"]);
$rpc->execute();
$result = $rpc->fetch_assoc();
if (isset($result['error']))
{
$msg = "The spamfilter entry could not be deleted: $name - ".$result['error']['message'] . " (" . $result['error']['code'] . ")";
Message::Fail($msg);
return false;
}
else
{
$r = $result['result']['tkl'];
Message::Success("Deleted spamfilter entry: ".$r['name']." [type: ".$r['match_type']."] [targets: ".$r['spamfilter_targets']. "] [action: ".$r['ban_action']."] [reason: ".$r['reason']."] [set by: ".$r['set_by']."]");
}
return true;
}