\\0", $c); $c = preg_replace('/(\#[A-Za-z0-9-_]+)/i', "\\0", $c); ////Headlines //$c = preg_replace('/^\# (.*)$/m', "

$1

", $c); //$c = preg_replace('/^\#\# (.*)$/m', "

$1

", $c); //$c = preg_replace('/^\#\#\# (.*)$/m', "

$1

", $c); //$c = preg_replace('/\"([^\"]+)\"/i', "„ $1 “", $c); $c = preg_replace('/\*([^\*]+)\*/i', "$1", $c); $c = nl2br($c); return $c; } private static function get_title($url){ $str = file_get_contents($url); if(strlen($str)>0){ $str = trim(preg_replace('/\s+/', ' ', $str)); // supports line breaks inside preg_match("/\<title\>(.*)\<\/title\>/i",$str,$title); // ignore case return $title[1]; } } private static function random_str($len = 10){ $chr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $chr_len = strlen($chr); $random_str = ''; for($i = 0; $i < $len; $i++){ $random_str .= $chr[rand(0, $chr_len - 1)]; } return $random_str; } public static function thumb($source_path, $thumb_path){ ini_set('memory_limit', '128M'); $thumb_w = 476; $thumb_h = 476; $source_details = getimagesize($source_path); // pass id to thumb name $source_w = $source_details[0]; $source_h = $source_details[1]; if($source_w > $source_h){ $new_w = $thumb_w; $new_h = intval($source_h * $new_w / $source_w); } else { $new_h = $thumb_h; $new_w = intval($source_w * $new_h / $source_h); } //$dest_x = intval(($thumb_w - $new_w) / 2); //$dest_y = intval(($thumb_h - $new_h) / 2); switch($source_details[2]){ case IMAGETYPE_GIF: $imgt = "ImageGIF"; $imgcreatefrom = "ImageCreateFromGIF"; break; case IMAGETYPE_JPEG: $imgt = "ImageJPEG"; $imgcreatefrom = "ImageCreateFromJPEG"; break; case IMAGETYPE_PNG: $imgt = "ImagePNG"; $imgcreatefrom = "ImageCreateFromPNG"; break; default: return false; } $old_image = $imgcreatefrom($source_path); $new_image = imagecreatetruecolor($new_w, $new_h); imagecopyresampled($new_image, $old_image, 0, 0, 0, 0, $new_w, $new_h, $source_w, $source_h); //$new_image = imagecreatetruecolor($thumb_w, $thumb_h); //imagecopyresized($new_image, $old_image, $dest_x, $dest_y, 0, 0, $new_w, $new_h, $source_w, $source_h); return $imgt($new_image, $thumb_path); } public static function insert($r){ self::login_protected(); $p = self::pirvacy($r["pirvacy"]); $text = self::parse_content($r["text"]); $post_id = DB::get_instance()->query( "INSERT INTO `posts` ". "(`id`, `text`, `plain_text`, `feeling`, `persons`, `location`, `pirvacy`, `content_type`, `content`, `datetime`, `status`) ". "VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), 1);", $text, $r["text"], $r["feeling"], $r["persons"], $r["location"], $p, $r["content_type"], $r["content"] )->last_id(); return [ "text" => $text, "feeling" => $r["feeling"], "persons" => $r["persons"], "location" => $r["location"], "pirvacy" => $p, "content_type" => $r["content_type"], "content" => $r["content"], "datetime" => date("d M Y H:i"), "id" => $post_id ]; } public static function update($r){ self::login_protected(); $r["pirvacy"] = self::pirvacy($r["pirvacy"]); $plain_text = $r["text"]; $r["text"] = self::parse_content($r["text"]); DB::get_instance()->query("UPDATE `posts` SET `text` = ?, `plain_text` = ?, `feeling` = ?, `persons` = ?, `location` = ?, `pirvacy` = ?, `content_type` = ?, `content` = ? WHERE `id` = ? AND `status` = 1", $r["text"], $plain_text, $r["feeling"], $r["persons"], $r["location"], $r["pirvacy"], $r["content_type"], $r["content"], $r["id"]); return $r; } public static function hide($r){ self::login_protected(); DB::get_instance()->query("UPDATE `posts` SET `status` = 4 WHERE `id` = ?", $r["id"]); return ["done" => true]; } public static function delete($r){ self::login_protected(); DB::get_instance()->query("UPDATE `posts` SET `status` = 5 WHERE `id` = ?", $r["id"]); return ["done" => true]; } public static function edit_data($r){ self::login_protected(); return DB::get_instance()->query("SELECT `plain_text` AS `text`, `feeling`, `persons`, `location`, `pirvacy`, `content_type`, `content` FROM `posts` WHERE `id` = ? AND `status` = 1", $r["id"])->first(); } public static function get_date($r){ self::login_protected(); $date = DB::get_instance()->query("SELECT DATE_FORMAT(`datetime`,'%Y %c %e %k %i') AS `date_format` FROM `posts` WHERE `id` = ? AND `status` = 1", $r["id"])->first("date_format"); $date = array_map("intval", explode(" ", $date)); $date[4] = floor($date[4]/10)*10; return $date; } public static function set_date($r){ self::login_protected(); $d = $r["date"]; $datetime = "{$d[0]}/{$d[1]}/{$d[2]} {$d[3]}:{$d[4]}"; DB::get_instance()->query("UPDATE `posts` SET `datetime` = ? WHERE `id` = ? AND `status` = 1", $datetime, $r["id"]); return [ "datetime" => date("d M Y H:i", strtotime($datetime)) ]; } public static function parse_link($r){ self::login_protected(); $l = $r["link"]; preg_match('/^https?:\/\/([^:\/\s]+)([^\/\s]*\/)([^\.\s]+)\.(jpe?g|png|gif)((\?|\#)(.*))?$/i', $l, $img); if($img){ return [ "valid" => true, "content_type" => "img_link", "content" => [ "src" => $l, "host" => $img[1] ] ]; } preg_match('/^https?:\/\/(www\.)?([^:\/\s]+)(.*)?$/i', $l, $url); // Get content $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $l); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Proxycat/1.1)"); curl_setopt($ch, CURLOPT_REFERER, ''); $html = curl_exec($ch); curl_close($ch); // Parse $doc = new DOMDocument(); @$doc->loadHTML('<?xml encoding="utf-8" ?>'.$html); // Get title $nodes = $doc->getElementsByTagName('title'); $title = $nodes->item(0)->nodeValue; // Content $content = [ "link" => $l, "title" => ($title ? $title : $url[2]), "is_video" => false, "host" => $url[2] ]; // Metas $metas = $doc->getElementsByTagName('meta'); for($i = 0; $i < $metas->length; $i++){ $meta = $metas->item($i); $n = $meta->getAttribute('name'); $p = $meta->getAttribute('property'); $c = $meta->getAttribute('content'); if($n == 'twitter:description' || $p == 'og:description' || $n == 'description'){ $content["desc"] = substr($c, 0, 180); } if($n == 'twitter:title' || $p == 'og:title' || $p == 'title'){ $content["title"] = $c; } if($p == 'og:url'){ $content["link"] = $c; } if($p == 'og:type'){ $content["is_video"] = ($c == "video"); } if($n == 'twitter:image:src' || $p == 'og:image'){ $content["thumb"] = $c; } if($n == 'twitter:domain'){ $content["host"] = $c; } } return [ "valid" => true, "content_type" => "link", "content" => $content ]; } public static function upload_image($r){ self::login_protected(); $photo = null; $ext = null; if($r["data"]){ preg_match('/^data\:image\/(jpe?g|png|gif)\;base64,(.*)$/', $r["data"], $m); if(!$m){ throw new Exception("invalid file"); } $ext = $m[1]; if($ext == "jpeg"){ $ext = "jpg"; } // Decode photo $photo = base64_decode($m[2]); } if($_FILES){ $photo = file_get_contents($_FILES["file"]["tmp_name"]); $r["name"] = $_FILES['file']['name']; $ext = pathinfo($r["name"], PATHINFO_EXTENSION); } if(!$_FILES && !$r["data"]){ throw new Exception("no file"); } // Create MD5 $md5 = md5($photo); // Find duplicate if($d = DB::get_instance()->query("SELECT `path`, `thumb` FROM `images` WHERE `md5` = ? AND `status` = 1 LIMIT 1", $md5)->first()){ return $d; } // Save to DB $id = DB::get_instance()->query( "INSERT INTO `images` ". "(`id`, `name`, `path`, `thumb`, `type`, `md5`, `datetime`, `status`) ". "VALUES (NULL, ?, NULL, NULL, ?, ?, NOW(), 1);", $r["name"], $ext, $md5 )->last_id(); // Create path name $name = dechex($id).self::random_str(3).".".$ext; $path = 'i/'.$name; $thumb = 't/'.$name; // Save path file_put_contents($path, $photo); // Create thumb self::thumb($path, $thumb); // Save to DB DB::get_instance()->query("UPDATE `images` SET `path` = ?, `thumb` = ? WHERE `id` = ?", $path, $thumb, $id); return ["path" => $path, "thumb" => $thumb]; } public static function load($r){ $until = null; if(preg_match("/^([0-9]{4})-([0-9]{2})$/", $r["filter"]["until"])){ $until = $r["filter"]["until"]."-01 00:00"; } $id = null; if($r["filter"]["id"]){ $id = intval($r["filter"]["id"]); } return DB::get_instance()->query( "SELECT `id`, `text`, `feeling`, `persons`, `location`, `pirvacy`, `content_type`, `content`, DATE_FORMAT(`posts`.`datetime`,'%d %b %Y %H:%i') AS `datetime` ". "FROM `posts` ". "WHERE ". (!self::is_logged_in() ? "`pirvacy` = 'public' AND " : ""). ($until ? "`posts`.`datetime` < DATE_ADD('{$until}', INTERVAL +1 MONTH) AND " : ""). ($id ? "`id` = {$id} AND " : ""). "`status` = 1 ". "ORDER BY `posts`.`datetime` DESC ". "LIMIT ? OFFSET ?", $r["limit"], $r["offset"] )->all(); } public static function login($r){ if(!Config::get_safe("force_login", false)){ return true; } if(self::is_logged_in()){ throw new Exception("You are already logged in."); } if(Config::get("nick") == $r["nick"] && Config::get_safe("pass", "") == $r["pass"]){ $_SESSION["logged_in"] = md5($r["nick"].$r["pass"]); return true; } Log::put("login_fails", $r["nick"]); throw new Exception("The nick or password is incorrect."); } public static function logout($r){ if(!Config::get_safe("force_login", false)){ throw new Exception("You can't log out. There is no account."); } if(!self::is_logged_in()){ throw new Exception("You are not even logged in."); } $_SESSION["logged_in"] = false; return true; } public static function handshake($r){ return ["logged_in" => self::is_logged_in()]; } }