projects:matrix_php_class
Matrix PHP Class
- matrix.class.php
<?php
class matrix {
function __construct() {
$this->homeserver = "glasgow.social";
$this->access_token = "ACCESS_TOKEN_HERE";
// room lookups
$this->rooms = array(
"#room_name"=> "!room_id:glasgow.social",
);
}
function post($msg, $room_name = "#glasgow", $formatted_msg = null) {
$msgtype = "m.text";
if(preg_match("/^#/", $room_name)) {
$room = $this->rooms[$room_name];
} else {
$room = $room_name;
}
$url = "https://".$this->homeserver."/_matrix/client/r0/rooms/$room/send/m.room.message?access_token=".$this->access_token;
$payload = array("msgtype"=>$msgtype, "body"=>$msg);
if(!is_null($formatted_msg)) {
$payload['format'] = "org.matrix.custom.html";
$payload['formatted_body'] = $formatted_msg;
}
$payload = json_encode($payload);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
}
function get_rooms() {
$url = "https://".$this->homeserver."/_matrix/client/r0/joined_rooms?access_token=".$this->access_token;
$data = file_get_contents($url);
return json_decode($data, true);
}
function send_direct_message($hostmask, $msg) {
if(preg_match("/^!/", $hostmask)) {
$private_room_id = $hostmask;
} else {
$private_room_id = $this->create_private_room($hostmask);
}
if($private_room_id) {
$this->post($msg, $private_room_id);
return $private_room_id;
} else {
error_log("Unable to create private room for $hostmask");
}
return false;
}
function get_new_events($room, $from = null) {
if(is_null($from))
$from = $this->get_from_time($room);
$url = "https://{$this->homeserver}/_matrix/client/r0/rooms/$room/messages?access_token={$this->access_token}&from=$from&limit=40";
$cache_filename = "/tmp/".md5($room).".cache";
if(!file_exists($cache_filename)) {
$content = file_get_contents($url);
file_put_contents($cache_filename, $content);
} else {
$cache_ts = filemtime($cache_filename);
if($cache_ts >= strtotime('-5 seconds')) {
$content = file_get_contents($cache_filename);
} else {
$content = file_get_contents($url);
} else {
$content = file_get_contents($url);
file_put_contents($cache_filename, $content);
}
}
$data = json_decode($content, true);
return $data;
}
function get_sync_token($room) {
$json_filter["room"]["rooms"] = array("$room");
$url = "https://{$this->homeserver}/_matrix/client/r0/sync?access_token={$this->access_token}&filter=".json_encode($json_filter);
$content = file_get_contents($url);
$data = json_decode($content, true);
return false;
}
function get_from_time($room) {
$filename = "/tmp/".md5($room).".fromts";
if(file_exists($filename)) {
$from_ts = filemtime($filename);
if($from_ts <= strtotime('-30 minutes')) {
error_log("GETNEWEVENTS: FROMTS Cache hit");
$from = $this->set_from_time($room);
file_put_contents($filename, $from);
}
$data = file_get_contents($filename);
return $data;
} else {
error_log("GETNEWEVENTS: FROMTS file didn't exist.");
$from = $this->set_from_time($room);
return $from;
}
}
function set_from_time($room, $from = null) {
if(is_null($from)) {
$from = $this->get_sync_token($room);
}
$filename = "/tmp/".md5($room).".fromts";
file_put_contents($filename, $from);
file_put_contents($filename, $from);
return $from;
}
function del_cache($room) {
$cache_filename = "/tmp/".md5($room).".cache";
unlink($cache_filename);
}
}
}
?>
projects/matrix_php_class.txt · Last modified: 2021/04/07 20:59 by admin