739 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			739 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
ini_set("log_errors", 1);
 | 
						|
$srv = $user_settings['instance'];
 | 
						|
//$token = ($token != false ? msc($token,'d') : false);
 | 
						|
$token = ($token != false ? $token : false);
 | 
						|
 | 
						|
function msc($string, $action = 'e') {
 | 
						|
	// you may change these values to your own
 | 
						|
	$secret_key = 'yAmfVhZwm0749FSY24dC';
 | 
						|
	$secret_iv = 'm37uvAeKjYLKdI1lPkcJ';
 | 
						|
 | 
						|
	$output = false;
 | 
						|
	$encrypt_method = "AES-256-CBC";
 | 
						|
	$key = hash('sha256', $secret_key);
 | 
						|
	$iv = substr(hash('sha256', $secret_iv) , 0, 16);
 | 
						|
 | 
						|
	if ($action == 'e') {
 | 
						|
		$output = base64_encode(openssl_encrypt($string, $encrypt_method, $key, 0, $iv));
 | 
						|
	}
 | 
						|
	else if ($action == 'd') {
 | 
						|
		$output = openssl_decrypt(base64_decode($string) , $encrypt_method, $key, 0, $iv);
 | 
						|
	}
 | 
						|
 | 
						|
	return $output;
 | 
						|
}
 | 
						|
 | 
						|
function get_urls($input) {
 | 
						|
	$pattern = '$(https?://[a-z0-9_./?=&-~]+)(?![^<>]*>)$i'; // refine this for better/more specific results
 | 
						|
	if (preg_match_all($pattern, $input, $matches)) {
 | 
						|
		list($dummy, $links) = ($matches);
 | 
						|
		return $links;
 | 
						|
	}
 | 
						|
	return false;
 | 
						|
}
 | 
						|
 | 
						|
function emoji($text, $size = 30, $srv) {
 | 
						|
	$data = json_decode(file_get_contents("https://$srv/api/v1/custom_emojis") , true) [0]['url'];
 | 
						|
	$u = explode("/", $data);
 | 
						|
	array_pop($u);
 | 
						|
	$url = implode("/", $u);
 | 
						|
	$text = str_replace("http:", "http;", $text);
 | 
						|
	$text = str_replace("https:", "https;", $text);
 | 
						|
	$text = preg_replace('~:([a-z0-9_]+):~', "<img src='$url/$1.png' height=$size style='vertical-align: middle;'>", $text);
 | 
						|
	$text = str_replace("http;", "http:", $text);
 | 
						|
	$text = str_replace("https;", "https:", $text);
 | 
						|
	return $text;
 | 
						|
}
 | 
						|
 | 
						|
function emojify($string, $emojis, $size = 40) {
 | 
						|
	foreach ($emojis as $emoji) {
 | 
						|
		$string = str_replace(":" . $emoji['shortcode'] . ":", "<img alt='" . $emoji['shortcode'] . "' title='" . $emoji['shortcode'] . "' src='" . $emoji['static_url'] . "' height=$size style='vertical-align: middle;'>", $string);
 | 
						|
	}
 | 
						|
	return $string;
 | 
						|
}
 | 
						|
 | 
						|
function context($post) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
 | 
						|
	$curl = curl_init();
 | 
						|
	curl_setopt($curl, CURLOPT_URL, "https://$srv/api/v1/statuses/$post/context");
 | 
						|
	if (!is_null($token)) {
 | 
						|
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
	}
 | 
						|
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
	$result = curl_exec($curl);
 | 
						|
	curl_close($curl);
 | 
						|
	return $result;
 | 
						|
}
 | 
						|
 | 
						|
function averageColor($url) {
 | 
						|
	@$image = imagecreatefromstring(file_get_contents($url));
 | 
						|
 | 
						|
	if (!$image) {
 | 
						|
		$mainColor = "CCCCCC";
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		$thumb = imagecreatetruecolor(1, 1);
 | 
						|
		imagecopyresampled($thumb, $image, 0, 0, 0, 0, 1, 1, imagesx($image) , imagesy($image));
 | 
						|
		$mainColor = strtoupper(dechex(imagecolorat($thumb, 0, 0)));
 | 
						|
	}
 | 
						|
 | 
						|
	return $mainColor;
 | 
						|
}
 | 
						|
 | 
						|
function user_info($user) {
 | 
						|
	global $user_settings;
 | 
						|
	$info = api_get("accounts/" . $user);
 | 
						|
	$rel = api_get("accounts/relationships?id=" . $user);
 | 
						|
	return array(
 | 
						|
		$info,
 | 
						|
		$rel
 | 
						|
	);
 | 
						|
}
 | 
						|
 | 
						|
function api_get($url) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
 | 
						|
	$curl = curl_init();
 | 
						|
	curl_setopt($curl, CURLOPT_URL, "https://$srv/api/v1/" . $url);
 | 
						|
	if (!is_null($token)) {
 | 
						|
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
	}
 | 
						|
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
	$result = curl_exec($curl);
 | 
						|
	curl_close($curl);
 | 
						|
	return json_decode($result, true);
 | 
						|
}
 | 
						|
 | 
						|
function api_post($url, $array) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
 | 
						|
	$cSession = curl_init();
 | 
						|
	curl_setopt($cSession, CURLOPT_HEADER, false);
 | 
						|
	curl_setopt($cSession, CURLOPT_POST, 1);
 | 
						|
	curl_setopt($cSession, CURLOPT_URL, "https://$srv/api/v1/" . $url);
 | 
						|
	if (!is_null($token)) {
 | 
						|
		curl_setopt($cSession, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
	}
 | 
						|
	curl_setopt($cSession, CURLOPT_POSTFIELDS, http_build_query($array));
 | 
						|
	curl_setopt($cSession, CURLOPT_RETURNTRANSFER, true);
 | 
						|
	$result = curl_exec($cSession);
 | 
						|
	curl_close($cSession);
 | 
						|
 | 
						|
	return json_decode($result, true);
 | 
						|
}
 | 
						|
 | 
						|
function api_delete($url, $array) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
 | 
						|
	$cSession = curl_init();
 | 
						|
	curl_setopt($cSession, CURLOPT_HEADER, false);
 | 
						|
	curl_setopt($cSession, CURLOPT_POST, 1);
 | 
						|
	curl_setopt($cSession, CURLOPT_URL, "https://$srv/api/v1/" . $url);
 | 
						|
	curl_setopt($cSession, CURLOPT_CUSTOMREQUEST, "DELETE");
 | 
						|
	if (!is_null($token)) {
 | 
						|
		curl_setopt($cSession, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
	}
 | 
						|
	curl_setopt($cSession, CURLOPT_POSTFIELDS, http_build_query($array));
 | 
						|
	curl_setopt($cSession, CURLOPT_RETURNTRANSFER, true);
 | 
						|
	$result = curl_exec($cSession);
 | 
						|
	curl_close($cSession);
 | 
						|
 | 
						|
	return json_decode($result, true);
 | 
						|
}
 | 
						|
 | 
						|
function render_reply($item) {
 | 
						|
	global $user_settings;
 | 
						|
	global $logedin;
 | 
						|
	global $srv;
 | 
						|
 | 
						|
	$reply['mode'] = "";
 | 
						|
	if (isset($item['type']) && $item['type'] == 'ancestor') {
 | 
						|
		$reply['mode'] = "ancestor";
 | 
						|
	}
 | 
						|
 | 
						|
	$reply['id'] = $item['id'];
 | 
						|
	$reply['uid'] = $item['account']['id'];
 | 
						|
	$reply['name'] = emojify($item['account']['display_name'], $item['account']['emojis'], 15);
 | 
						|
	$reply['acct'] = $item['account']['acct'];
 | 
						|
	$reply['avatar'] = $item['account']['avatar'];
 | 
						|
 | 
						|
	$reply['menu'] = "<ul>";
 | 
						|
	if ($logedin) {
 | 
						|
		$reply['menu'] .= ($item['account']['id'] == $user_settings['uid'] ? "<li><a href='?action=delete&thread=" . $item['id'] . "' onClick='return false;' class='delete fontello' id='" . $item['id'] . "'> Delete Post</a></li>" : "");
 | 
						|
 | 
						|
		$reply['menu'] .= ($item['account']['id'] != $user_settings['uid'] ? "<li><a href='?action=mute&user=" . $item['account']['id'] . "' onClick='return false;' class='mute fontello' id='" . $item['account']['id'] . "' style='background-color:transparent;'> Mute User</a></li>" : "");
 | 
						|
 | 
						|
		$reply['menu'] .= ($item['account']['id'] != $user_settings['uid'] ? "<li><a href='?action=nsfw&user=" . $item['account']['id'] . "' onClick='return false;' class='nsfw fontello' id='" . $item['account']['id'] . "' style='background-color:transparent;'> User is NSFW</a></li>" : "");
 | 
						|
	}
 | 
						|
 | 
						|
	$reply['menu'] .= "<li><a target='_blank' href='" . $item['url'] . "' class='link fontello'  style='background-color:transparent;'> Original Note</a></li>";
 | 
						|
 | 
						|
	$reply['menu'] .= "</ul>";
 | 
						|
 | 
						|
	$json['id'] = $item['id'];
 | 
						|
	$json['scope'] = $item['visibility'];
 | 
						|
	if ($logedin) {
 | 
						|
		$json['mentions'] = "";
 | 
						|
		$array = $item["mentions"];
 | 
						|
		$json['mentions'] = ($user_settings['acct'] == $item["account"]['acct'] ? "" : "@" . $item["account"]['acct']) . " ";
 | 
						|
		if (!empty($array)) {
 | 
						|
			foreach ($array as $mnt) {
 | 
						|
				if ($mnt['acct'] != $user_settings['acct']) {
 | 
						|
					$json['mentions'] .= "@" . $mnt['acct'] . " ";
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	$reply['json'] = json_encode($json);
 | 
						|
 | 
						|
	$reply['replyto'] = ($item['in_reply_to_id'] ? " <a class='fontello link preview ldr' target='_blank' id='" . $item['in_reply_to_id'] . "' href='?thread=" . $item['in_reply_to_id'] . "'></a> " : "");
 | 
						|
	$reply['text'] = processText($item);
 | 
						|
 | 
						|
	$public = "";
 | 
						|
	$private = "";
 | 
						|
	$unlisted = "";
 | 
						|
	$direct = "";
 | 
						|
 | 
						|
	$reply['date'] = "<a style='text-decoration:none;color:darkgray;' target='_blank' href='" . $item['url'] . "'><span class='fontello'></span></a> - <a class='ldr' style='text-decoration:none;color:darkgray;' target='_blank' href='?thread=" . $item['id'] . "&instance=$srv" . "'>" . date("d/m/y H:i", strtotime($item['created_at'])) . "</a> - <span class='fontello' style='color:darkgray;'>" . $$item['visibility'] . "</span>";
 | 
						|
 | 
						|
	$reply['media'] = "";
 | 
						|
	if (!empty($item['media_attachments'])) {
 | 
						|
		$reply['media'] = "<div style='width:170px; display:inline-block; float:left; margin-right:15px; '>";
 | 
						|
		$images = count($item['media_attachments']);
 | 
						|
		$class = ($images > 1 ? "class='icon'" : "");
 | 
						|
		foreach ($item['media_attachments'] as $file) {
 | 
						|
			$ext = explode(".", $file['url']);
 | 
						|
			$ext = end($ext);
 | 
						|
			$ext = explode("?", $ext) [0];
 | 
						|
			if ($ext == 'mp4' || $ext == 'webm') {
 | 
						|
				$reply['media'] .= "<div style='text-align:center; width:100%;'><video preload='metadata' width='100%' controls loop>
 | 
						|
							<source src='" . $file['url'] . "' type='video/$ext'>
 | 
						|
							</video></div>
 | 
						|
						";
 | 
						|
			}
 | 
						|
			elseif ($ext == 'mp3' || $ext == 'ogg') {
 | 
						|
				$reply['media'] .= "<div style='text-align:center; width:100%;'><audio controls>
 | 
						|
												<source src='" . $file['url'] . "' type='audio/$ext'>
 | 
						|
												Your browser does not support the audio tag.
 | 
						|
											</audio> </div>";
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				if ($item['sensitive'] == true && $user_settings['explicit'] != 'off') {
 | 
						|
					$reply['media'] .= "<div style='overflow:hidden; float:left; margin:2px;' $class><a target='_blank' href='" . $file['url'] . "' onClick='return false;' class='blur'><noscript><img src='" . $file['url'] . "' style='width:100%;'></noscript><img " . "data-src='" . $file['url'] . "'" . " class='' style='max-width:100%; max-height:100% vertical-align:middle;'></a><a target='_blank' href='" . $file['url'] . "' onClick='return false;' class='open-lightbox' style='display:none;'><img src='" . $file['url'] . "' class='' style='width:100%;'></a></div>";
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					$reply['media'] .= "<div style='margin:0px;' $class><a target='_blank' href='" . $file['url'] . "' onClick='return false;' class='open-lightbox'><img src='" . $file['url'] . "'" . " class='' style='max-width:100%; max-height:100%; vertical-align:middle;'><noscript><img src='" . $file['url'] . "' style='width:100%;'></noscript></a></div>";
 | 
						|
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$reply['media'] .= "</div>";
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	$reply['buttons'] = "
 | 
						|
		" . ($logedin ? "<div class='felem'><a onClick='return false' class='replyform' href='?thread=" . $item['id'] . "' style='font-family:fontello'></a></div>" : "") . "
 | 
						|
					<div class='felem'><a onClick='return false' " . ($logedin ? "class='" . ($item['favourited'] == true ? "unfav" : "fav") . "' href='?action=fav&thread=" . $item['id'] . "'" : "") . " style='font-family:fontello'> <span>" . $item['favourites_count'] . "</span></a></div>
 | 
						|
					<div class='felem'><a onClick='return false' " . ($logedin && $item['visibility'] == "public" ? "class='" . ($item['reblogged'] == true ? "unreblog" : "reblog") . "' href='?action=reblog&thread=" . $item['id'] . "'" : "") . " style='font-family:fontello'> <span>" . $item['reblogs_count'] . "</span></a></div>
 | 
						|
		";
 | 
						|
 | 
						|
	$result = file_get_contents("templates/reply.txt");
 | 
						|
 | 
						|
	foreach ($reply as $key => $elem) {
 | 
						|
		$result = str_replace(":$key:", $elem, $result);
 | 
						|
	}
 | 
						|
 | 
						|
	return $result;
 | 
						|
}
 | 
						|
 | 
						|
function favourite($post, $mode) {
 | 
						|
	$result = api_post(($mode == true ? "statuses/$post/favourite" : "statuses/$post/unfavourite"),array());
 | 
						|
 | 
						|
	if (isset($result['favourites_count'])) {
 | 
						|
		return $result['favourites_count'];
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		return "error";
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function reblog($post, $mode) {
 | 
						|
	$result = api_post(($mode == true ? "statuses/$post/reblog" : "statuses/$post/unreblog"),array());
 | 
						|
	if (isset($result['reblog']['reblogs_count'])) {
 | 
						|
		return $result['reblog']['reblogs_count'];
 | 
						|
	}
 | 
						|
	elseif (isset($result['reblogs_count'])) {
 | 
						|
		return $result['reblogs_count'];
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		return "error";
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function delpost($id) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
 | 
						|
	if (!is_null($token)) {
 | 
						|
		$curl = curl_init();
 | 
						|
		curl_setopt($curl, CURLOPT_HEADER, false);
 | 
						|
		curl_setopt($curl, CURLOPT_POST, 1);
 | 
						|
		curl_setopt($curl, CURLOPT_URL, "https://$srv/api/v1/statuses/$id");
 | 
						|
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
 | 
						|
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
 | 
						|
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
		$result = curl_exec($curl);
 | 
						|
		curl_close($curl);
 | 
						|
		$result = json_decode($result, true);
 | 
						|
		if (empty($result)) {
 | 
						|
			return "1";
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			return "0";
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function sendpost($text, $media, $reply, $markdown = false, $scope, $sensitive, $spoiler = false) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
	if (!is_null($token)) {
 | 
						|
 | 
						|
		$cSession = curl_init();
 | 
						|
		curl_setopt($cSession, CURLOPT_URL, "https://$srv/api/v1/statuses");
 | 
						|
		curl_setopt($cSession, CURLOPT_RETURNTRANSFER, true);
 | 
						|
		curl_setopt($cSession, CURLOPT_POST, 1);
 | 
						|
		curl_setopt($cSession, CURLOPT_HTTPHEADER, array(
 | 
						|
			'Authorization: Bearer ' . $token
 | 
						|
		));
 | 
						|
		$query = "";
 | 
						|
		$query .= "status=" . urlencode(html_entity_decode($text, ENT_QUOTES)) . "&visibility=" . $scope;;
 | 
						|
		if (!is_null($reply) && $reply != "null") {
 | 
						|
			$query .= "&in_reply_to_id=" . $reply;
 | 
						|
		}
 | 
						|
		if ($markdown == true) {
 | 
						|
			$query .= "&content_type=text/markdown";
 | 
						|
		}
 | 
						|
		if ($sensitive == 'true') {
 | 
						|
			$query .= "&sensitive=true";
 | 
						|
		}
 | 
						|
		if ($spoiler == true) {
 | 
						|
			$query .= "&spoiler_text=" . $spoiler;
 | 
						|
		}
 | 
						|
 | 
						|
		if (!is_null($media)) {
 | 
						|
			foreach ($media as $mid) {
 | 
						|
				$query .= "&media_ids[]=" . $mid;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		
 | 
						|
		file_put_contents("query.txt",var_export($query,true));
 | 
						|
 | 
						|
		curl_setopt($cSession, CURLOPT_POSTFIELDS, $query);
 | 
						|
		$result = curl_exec($cSession);
 | 
						|
		curl_close($cSession);
 | 
						|
		return $result;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function uploadpic($file) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
	if (!is_null($token)) {
 | 
						|
		$mime = get_mime($file);
 | 
						|
		$info = pathinfo($file);
 | 
						|
		$name = $info['basename'];
 | 
						|
		$output = new CURLFile($file, $mime, $name);
 | 
						|
 | 
						|
		do {
 | 
						|
			$cSession = curl_init();
 | 
						|
			curl_setopt($cSession, CURLOPT_URL, "https://$srv/api/v1/media");
 | 
						|
			curl_setopt($cSession, CURLOPT_RETURNTRANSFER, true);
 | 
						|
			curl_setopt($cSession, CURLOPT_POST, 1);
 | 
						|
			curl_setopt($cSession, CURLOPT_HTTPHEADER, array(
 | 
						|
				'Authorization: Bearer ' . $token
 | 
						|
			));
 | 
						|
			curl_setopt($cSession, CURLOPT_POSTFIELDS, array(
 | 
						|
				'file' => $output
 | 
						|
			));
 | 
						|
			$result = curl_exec($cSession);
 | 
						|
		} while (empty($result));
 | 
						|
		curl_close($cSession);
 | 
						|
		$array = json_decode($result, true);
 | 
						|
 | 
						|
		$ext = explode(".", $array['url']);
 | 
						|
		$ext = end($ext);
 | 
						|
		$ext = explode("?", $ext) [0];
 | 
						|
 | 
						|
		if (in_array($ext, array(
 | 
						|
			'jpg',
 | 
						|
			'jpeg',
 | 
						|
			'gif',
 | 
						|
			'png',
 | 
						|
			'svg'
 | 
						|
		))) {
 | 
						|
			$file = $array['url'];
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			$file = "img/doc.png";
 | 
						|
		}
 | 
						|
		return json_encode(array(
 | 
						|
			$array['id'],
 | 
						|
			$file
 | 
						|
		));
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function register_app($instance) {
 | 
						|
	global $setting;
 | 
						|
 | 
						|
	$cSession = curl_init();
 | 
						|
	curl_setopt($cSession, CURLOPT_URL, "https://$instance/api/v1/apps");
 | 
						|
	curl_setopt($cSession, CURLOPT_RETURNTRANSFER, true);
 | 
						|
	curl_setopt($cSession, CURLOPT_HEADER, false);
 | 
						|
	curl_setopt($cSession, CURLOPT_POST, 1);
 | 
						|
	curl_setopt($cSession, CURLOPT_POSTFIELDS, http_build_query(array(
 | 
						|
		'client_name' => $setting['appname'],
 | 
						|
		'redirect_uris' => $setting['url'],
 | 
						|
		'scopes' => 'read write follow'
 | 
						|
	)));
 | 
						|
	$result = curl_exec($cSession);
 | 
						|
	curl_close($cSession);
 | 
						|
 | 
						|
	return json_decode($result, true);
 | 
						|
}
 | 
						|
 | 
						|
function getnotif($id = false, $max = false) {
 | 
						|
	global $srv;
 | 
						|
	global $token;
 | 
						|
	global $user_settings;
 | 
						|
	$n = "";
 | 
						|
	$notif = api_get("notifications?" . ($id == false ? "limit=9&" : "") . ($id != false ? ($max == true ? "max_id=$id" : "since_id=$id") : ""));
 | 
						|
	if (!empty($notif)) {
 | 
						|
		foreach ($notif as $post) {
 | 
						|
			$user = "<a class='link ldr' style='font-size:12px;' href='?user=" . $post['account']['id'] . "'>" . emojify($post['account']['display_name'], $post['account']['emojis'], 10) . "</a>";
 | 
						|
			$preview = "";
 | 
						|
			$buttons = "";
 | 
						|
			$media = "";
 | 
						|
 | 
						|
			switch ($post["type"]) {
 | 
						|
				case "mention":
 | 
						|
					if ($post['status']['in_reply_to_id'] == null) {
 | 
						|
						$type = "<span class='fontello' style='color:#62C2CC; font-size:10px;'></span>";
 | 
						|
						$string = "mentioned you in a post";
 | 
						|
						$preview = "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><span style='display:block; opacity:1; font-size:10px; color:black; line-height:12px;'>" . emojify(strip_tags(trim($post['status']['content']) , '<br><br \>') , $post['status']['emojis'], 15) . "</span></a>";
 | 
						|
						$media = (!empty($post['status']['media_attachments']) ? "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['status']['media_attachments'][0]['url'] . ");'></div></a>" : "");
 | 
						|
					}
 | 
						|
					else {
 | 
						|
						$type = "<span class='fontello' style='color:#62C2CC; font-size:10px;'></span>";
 | 
						|
						$string = "replied to your post";
 | 
						|
						$preview = "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><span style='display:block; opacity:1; font-size:10px; color:black; line-height:12px;'>" . emojify(strip_tags(trim($post['status']['content']) , '<br><br \>') , $post['status']['emojis'], 15) . "</span></a>";
 | 
						|
						$media = (!empty($post['status']['media_attachments']) ? "<div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['status']['media_attachments'][0]['url'] . ");'></div>" : "");
 | 
						|
					}
 | 
						|
 | 
						|
					$array = $post['status']["mentions"];
 | 
						|
					$mentions = ($user_settings['acct'] == $post['status']['account']['acct'] ? "" : "@" . $post['status']['account']['acct']) . " ";
 | 
						|
					if (!empty($array)) {
 | 
						|
						foreach ($array as $mnt) {
 | 
						|
							if ($mnt['acct'] != $user_settings['acct']) {
 | 
						|
								$mentions .= "@" . $mnt['acct'] . " ";
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
 | 
						|
					$buttons = "<div class='post_buttons' id='" . $post['status']['id'] . "' style='position:absolute; right:10px; bottom:10px; background-color:white; border-radius:60px; padding:5px;'>
 | 
						|
					<div class='felem'><a onClick='return false' class='quickreply' id='" . $post['status']['id'] . "' data-mentions='" . $mentions . "' href='?thread=" . $post['status']['id'] . "' style='font-family:fontello'></a></div>
 | 
						|
					<div class='felem'><a onClick='return false' class='" . ($post['status']['favourited'] == true ? "unfav" : "fav") . "' href='?action=fav&thread=" . $post['status']['id'] . "'" . " style='font-family:fontello'></a></div>
 | 
						|
					<div class='felem'><a onClick='return false' " . ($post['status']['visibility'] == "public" || $post['status']['visibility'] == "unlisted" ? "class='" . ($post['status']['reblogged'] == true ? "unreblog" : "reblog") . "' href='?action=reblog&thread=" . $post['status']['id'] . "'" : "") . " style='font-family:fontello'></a></div></div>";
 | 
						|
				break;
 | 
						|
 | 
						|
				case "favourite":
 | 
						|
					$type = "<span class='fontello' style='color:#F17022; font-size:10px;'></span>";
 | 
						|
					$string = "favourited your post";
 | 
						|
					$preview = "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><span style='display:block; opacity:1; font-size:10px; color:black; line-height:12px;'>" . (!empty($post['status']['content']) ? emojify(strip_tags(trim($post['status']['content']) , '<br><br \>') , $post['status']['emojis'], 15) : "Favourited your image") . "</span></a>";
 | 
						|
					$media = (!empty($post['status']['media_attachments']) ? "<div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['status']['media_attachments'][0]['url'] . ");'></div>" : "");
 | 
						|
				break;
 | 
						|
 | 
						|
				case "reblog":
 | 
						|
					$type = "<span class='fontello' style='color:#D1DC29; font-size:10px;'></span>";
 | 
						|
					$string = "reblogged your post";
 | 
						|
					$preview = "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><span style='display:block; opacity:1; font-size:10px; color:black; line-height:12px;'>" . (!empty($post['status']['content']) ? emojify(strip_tags(trim($post['status']['content']) , '<br><br \>') , $post['status']['emojis'], 15) : "Reblogged your image") . "</span></a>";
 | 
						|
					@$media = (!is_null($post['status']['media_attachments']) ? "<div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['status']['media_attachments'][0]['url'] . ");'></div>" : "");
 | 
						|
				break;
 | 
						|
				
 | 
						|
				case "pleroma:emoji_reaction":
 | 
						|
					$type = "<span class='fontello' style='color:#F17022; font-size:10px;'></span>";
 | 
						|
					$string = "favourited your post";
 | 
						|
					$preview = "<a style='text-decoration:none;' class='ldr' href='?thread=" . $post['status']['id'] . "' target='_blank'><span style='display:block; opacity:1; font-size:10px; color:black; line-height:12px;'>" . (!empty($post['status']['content']) ? emojify(strip_tags(trim($post['status']['content']) , '<br><br \>') , $post['status']['emojis'], 15) : "Favourited your image") . "</span></a>";
 | 
						|
					$media = (!empty($post['status']['media_attachments']) ? "<div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['status']['media_attachments'][0]['url'] . ");'></div>" : "");
 | 
						|
				break;
 | 
						|
 | 
						|
				case "follow":
 | 
						|
					$type = "<span class='fontello' style='color:#FDB813; font-size;10px;'></span>";
 | 
						|
					$string = "started following you";
 | 
						|
				break;
 | 
						|
			}
 | 
						|
 | 
						|
			$n .= "
 | 
						|
			<div class='notif " . ($id == false ? "" : "new") . "' id='" . $post['id'] . "'>
 | 
						|
				<div class='notifContents'>
 | 
						|
					<div style='flex: 0 0 60px; background-size:cover; background-image:url(" . $post['account']['avatar'] . "); border-radius:5px;'></div>
 | 
						|
					<div style='flex: 1; padding-left:5px; padding-right:5px; word-break: break-word; overflow:hidden;'>
 | 
						|
					<span>$type <span style='font-size:12px; font-weight:bold;'>$user</span></span>
 | 
						|
					" . trim($preview) . "
 | 
						|
					$buttons
 | 
						|
					</div>
 | 
						|
					$media
 | 
						|
				</div>
 | 
						|
			</div>
 | 
						|
			";
 | 
						|
 | 
						|
		}
 | 
						|
		return $n;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function getnotes($thread) {
 | 
						|
	global $user_settings;
 | 
						|
	global $token;
 | 
						|
	global $srv;
 | 
						|
	global $setting;
 | 
						|
	global $logedin;
 | 
						|
	@$reb = array(
 | 
						|
		json_decode(file_get_contents("https://$srv/api/v1/statuses/" . $thread . "/reblogged_by") , true)
 | 
						|
	);
 | 
						|
	@$fab = array(
 | 
						|
		json_decode(file_get_contents("https://$srv/api/v1/statuses/" . $thread . "/favourited_by") , true)
 | 
						|
	);
 | 
						|
	$limit = (count($reb[0]) > count($fab[0]) ? count($reb[0]) - 1 : count($fab[0]) - 1);
 | 
						|
 | 
						|
	$notes = array();
 | 
						|
	$index = 0;
 | 
						|
 | 
						|
	for ($i = 0;$i <= $limit;$i++) {
 | 
						|
		if (isset($reb[0][$i])) {
 | 
						|
			$notes[$index][0] = "reb";
 | 
						|
			$notes[$index][1] = $reb[0][$i];
 | 
						|
			$index++;
 | 
						|
		}
 | 
						|
		if (isset($fab[0][$i])) {
 | 
						|
			$notes[$index][0] = "fav";
 | 
						|
			$notes[$index][1] = $fab[0][$i];
 | 
						|
			$index++;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return $notes;
 | 
						|
}
 | 
						|
 | 
						|
function getreplies($thread, $since = false) {
 | 
						|
	global $user_settings;
 | 
						|
	global $token;
 | 
						|
	global $srv;
 | 
						|
	global $setting;
 | 
						|
	global $logedin;
 | 
						|
	$context = json_decode(context($thread) , true);
 | 
						|
	$array = array();
 | 
						|
	if (!empty($context['ancestors'])) {
 | 
						|
		if ($since == false) {
 | 
						|
			foreach ($context['ancestors'] as $elem) {
 | 
						|
				$elem['type'] = 'ancestor';
 | 
						|
				$array[] = $elem;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	$flag = 0;
 | 
						|
	if (!empty($context['descendants'])) {
 | 
						|
		foreach ($context['descendants'] as $elem) {
 | 
						|
			if (($since != false && $flag == 1) || $since == false) {
 | 
						|
				$elem['type'] = 'descendant';
 | 
						|
				$array[] = $elem;
 | 
						|
			}
 | 
						|
			if ($since != false && $elem['id'] == $since) {
 | 
						|
				$flag = 1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	$replies = array();
 | 
						|
 | 
						|
	foreach ($array as $item) {
 | 
						|
		$reply['mode'] = "";
 | 
						|
		if ($item['type'] == 'ancestor') {
 | 
						|
			$reply['mode'] = "ancestor";
 | 
						|
		}
 | 
						|
 | 
						|
		$replies[] = array(
 | 
						|
			'mode' => $reply['mode'],
 | 
						|
			'content' => $item
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	return $replies;
 | 
						|
}
 | 
						|
 | 
						|
function timeline($query) {
 | 
						|
	global $token;
 | 
						|
	global $srv;
 | 
						|
 | 
						|
	$notes = "";
 | 
						|
	$media = ($query['text'] == "on" ? "" : "&only_media=true");
 | 
						|
	$next = ($query['next'] ? "&max_id=" . $query['next'] : ($query['since'] ? "&since_id=" . $query['since'] : ""));
 | 
						|
 | 
						|
	switch ($query['mode']) {
 | 
						|
		case "home":
 | 
						|
			$array = api_get("timelines/home?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "federated":
 | 
						|
			$array = api_get("timelines/public?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "tag":
 | 
						|
			$array = api_get("timelines/tag/" . $query['tag'] . "?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "local":
 | 
						|
			$array = api_get("timelines/public?limit=25&local=true{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "user":
 | 
						|
			$array = api_get("accounts/" . $query['user'] . "/statuses?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "thread":
 | 
						|
			$array = array(
 | 
						|
				api_get("statuses/" . $query['thread'])
 | 
						|
			);
 | 
						|
		break;
 | 
						|
 | 
						|
		case "favourites":
 | 
						|
			$array = api_get("favourites?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "direct":
 | 
						|
			$array = api_get("timelines/direct?limit=25{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "list":
 | 
						|
			$array = api_get("timelines/list/" . $query['list'] . "?limit=25{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "bookmarks":
 | 
						|
			$array = api_get("bookmarks?limit=25{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		case "account":
 | 
						|
			$info = api_get("accounts/verify_credentials");
 | 
						|
			$array = api_get("accounts/" . $info['id'] . "/statuses?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
 | 
						|
		default:
 | 
						|
			$array = api_get("timelines/public?limit=25{$media}{$next}");
 | 
						|
		break;
 | 
						|
	}
 | 
						|
 | 
						|
	if (!is_array($array)) {
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	$next = end($array) ['id'];
 | 
						|
	$thread = array();
 | 
						|
 | 
						|
	foreach ($array as $elem) {
 | 
						|
		if ($query['replies'] == "on" || $query['mode'] == "thread") {
 | 
						|
			$thread[] = $elem;
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			if ($elem['in_reply_to_id'] == null) {
 | 
						|
				$thread[] = $elem;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	return array(
 | 
						|
		$thread,
 | 
						|
		$next
 | 
						|
	);
 | 
						|
}
 | 
						|
 | 
						|
function processText($elem) {
 | 
						|
	global $user_settings;
 | 
						|
	require_once "vendor/simple_html_dom.php";
 | 
						|
	$content = trim(html_entity_decode($elem['content'],ENT_QUOTES));
 | 
						|
	
 | 
						|
	if (!empty($content)) {
 | 
						|
		$html = str_get_html($content);
 | 
						|
		foreach ($html->find('a') as $lnk) {
 | 
						|
			foreach ($elem['media_attachments'] as $f) {
 | 
						|
				if (is_numeric(strpos($f['description'],explode("…",$lnk->innertext)[0]))) {
 | 
						|
					$content = str_replace($lnk->outertext . "<br/>", null, $content);
 | 
						|
					$content = str_replace("<br/>" . $lnk->outertext, null, $content);
 | 
						|
					$content = str_replace($lnk->outertext, null, $content);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			
 | 
						|
			if (is_numeric(strpos($lnk->href, $user_settings['instance'])) || in_array($lnk->class, array(
 | 
						|
				"u-url mention",
 | 
						|
				"hashtag"
 | 
						|
			)) || $lnk->rel == "tag") {
 | 
						|
				$content = str_replace($lnk->outertext, $lnk->innertext, $content);
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				$prv = $lnk->outertext;
 | 
						|
				$lnk->target = '_blank';
 | 
						|
				$lnk->class = 'link external';
 | 
						|
				$content = str_replace($prv, $lnk->outertext, $content);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	$result = strip_tags($content, '<br><p><strong><a><em><strike>');
 | 
						|
	$result = str_replace('<br />', ' <br>', $result);
 | 
						|
	//$result = str_replace(''', "'", $result);
 | 
						|
 | 
						|
	foreach ($elem['mentions'] as $mention) {
 | 
						|
		$result = str_replace("@" . $mention['username'], "<span class='user' id='" . $mention['id'] . "'><a href='?user=" . $mention['id'] . "' class='link ldr' onClick='return false;'>@" . $mention['username'] . "</a></span>", $result);
 | 
						|
	}
 | 
						|
 | 
						|
	//$result = preg_replace("/(?<!=\")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a target=\"_blank\" class='external' style='color:navy;' href=\"$1\">$1</a>", $result);
 | 
						|
	$result = emojify($result, $elem['emojis']);
 | 
						|
	$result = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a class='ldr' href=\"./?tag=$1\"><b>#$1</b></a>", $result);
 | 
						|
 | 
						|
	return $result;
 | 
						|
}
 | 
						|
 | 
						|
function get_mime($filename) {
 | 
						|
	$result = new finfo();
 | 
						|
 | 
						|
	if (is_resource($result) === true) {
 | 
						|
		return $result->file($filename, FILEINFO_MIME_TYPE);
 | 
						|
	}
 | 
						|
 | 
						|
	return false;
 | 
						|
}
 |