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); } } }