src-empire/Empire/Core/News.php line 44

Open in your IDE?
  1. <?php
  2. namespace Empire\Core;
  3. use Empire\Legacy\cgt;
  4. use Empire\Legacy\db;
  5. use GuzzleHttp\Client;
  6. use GuzzleHttp\Exception\GuzzleException;
  7. class News extends AbstractEntity implements Entity {
  8.     const PRIMARY_FIELD "NEWS_ID";
  9.     const TABLE "NEWS";
  10.     CONST NEWS_TYPE_INS 1;
  11.     const NEWS_TYPE_DEV 2;
  12.     public $title;
  13.     public $text;
  14.     public $blurb;
  15.     public $time;
  16.     public $newsType;
  17.     public $poster;
  18.     public function __construct() {
  19.         $this->type cint_TYPE_NEWS;
  20.     }
  21.     function initialize() {
  22.         $this->id $this->NEWS_ID;
  23.         $this->text html_entity_decode($this->NEWS_TEXT);
  24.         $this->blurb self::truncateHtml(self::stripImages($this->text), 500);
  25.         $this->title $this->NEWS_TITLE;
  26.         $this->time cgt::evaluateString($this->NEWS_STAMP);
  27.         $this->newsType $this->NEWS_TYPE;
  28.         $this->poster User::load([$this->MEMB_ID]);
  29.     }
  30.     function getPrimaryField() {
  31.         return self::PRIMARY_FIELD;
  32.     }
  33.     function getTable() {
  34.         return self::TABLE;
  35.     }
  36.     public static function getLatestNews($type self::NEWS_TYPE_INS$limit 6) {
  37.         $query db::prepare(sprintf("SELECT * FROM %s WHERE NEWS_TYPE = %d ORDER BY NEWS_STAMP DESC LIMIT %d "self::TABLE$type$limit));
  38.         return db::fetchArrayOfObjects($queryself::class);
  39.     }
  40.     public static function getArchiveNews($page 1$type self::NEWS_TYPE_INS$term ""$perPage 10) {
  41.         $offset = ($page 1) * $perPage;
  42.         if(strlen($term) > 0) {
  43.             $term db::quoteEscape('%'.$term.'%');
  44.             $sql sprintf("SELECT * FROM %s WHERE NEWS_TYPE = %d AND (NEWS_TEXT like %s OR NEWS_TITLE like %s) ORDER BY NEWS_STAMP DESC LIMIT %d OFFSET %d"self::TABLE$type$term$term$perPage$offset);
  45.         } else {
  46.             $sql sprintf("SELECT * FROM %s WHERE NEWS_TYPE = %d ORDER BY NEWS_STAMP DESC LIMIT %d OFFSET %d"self::TABLE$type$perPage$offset);
  47.         }
  48.         $query db::prepare($sql);
  49.         return db::fetchArrayOfObjects($queryself::class);
  50.     }
  51.     public static function getNewsCount($type News::NEWS_TYPE_INS$term "") {
  52.         if(strlen($term) > 0) {
  53.             $term db::quoteEscape('%'.$term.'%');
  54.             $sql sprintf("SELECT COUNT(*) AS COUNT FROM %s WHERE NEWS_TYPE = %d AND (NEWS_TEXT like %s OR NEWS_TITLE like %s) "self::TABLE$type$term$term);
  55.         } else {
  56.             $sql sprintf("SELECT COUNT(*) AS COUNT FROM %s WHERE NEWS_TYPE = %d"self::TABLE$type);
  57.         }
  58.         $query db::prepare($sql);
  59.         return db::fetchObject($query)->COUNT;
  60.     }
  61.     /**
  62.      * truncateHtml can truncate a string up to a number of characters while preserving whole words and HTML tags
  63.      *
  64.      * @param string $text String to truncate.
  65.      * @param integer $length Length of returned string, including ellipsis.
  66.      * @param string $ending Ending to be appended to the trimmed string.
  67.      * @param boolean $exact If false, $text will not be cut mid-word
  68.      * @param boolean $considerHtml If true, HTML tags would be handled correctly
  69.      *
  70.      * @return string Trimmed string.
  71.      */
  72.     public static function truncateHtml($text$length 100$ending '...'$exact false$considerHtml true) {
  73.         if ($considerHtml) {
  74.             // if the plain text is shorter than the maximum length, return the whole text
  75.             if (strlen(preg_replace('/<.*?>/'''$text)) <= $length) {
  76.                 return $text;
  77.             }
  78.             // splits all html-tags to scanable lines
  79.             preg_match_all('/(<.+?>)?([^<>]*)/s'$text$linesPREG_SET_ORDER);
  80.             $total_length strlen($ending);
  81.             $open_tags = array();
  82.             $truncate '';
  83.             foreach ($lines as $line_matchings) {
  84.                 // if there is any html-tag in this line, handle it and add it (uncounted) to the output
  85.                 if (!empty($line_matchings[1])) {
  86.                     // if it's an "empty element" with or without xhtml-conform closing slash
  87.                     if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is'$line_matchings[1])) {
  88.                         // do nothing
  89.                         // if tag is a closing tag
  90.                     } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s'$line_matchings[1], $tag_matchings)) {
  91.                         // delete tag from $open_tags list
  92.                         $pos array_search($tag_matchings[1], $open_tags);
  93.                         if ($pos !== false) {
  94.                             unset($open_tags[$pos]);
  95.                         }
  96.                         // if tag is an opening tag
  97.                     } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s'$line_matchings[1], $tag_matchings)) {
  98.                         // add tag to the beginning of $open_tags list
  99.                         array_unshift($open_tagsstrtolower($tag_matchings[1]));
  100.                     }
  101.                     // add html-tag to $truncate'd text
  102.                     $truncate .= $line_matchings[1];
  103.                 }
  104.                 // calculate the length of the plain text part of the line; handle entities as one character
  105.                 $content_length strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i'' '$line_matchings[2]));
  106.                 if ($total_length $content_length $length) {
  107.                     // the number of characters which are left
  108.                     $left $length $total_length;
  109.                     $entities_length 0;
  110.                     // search for html entities
  111.                     if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i'$line_matchings[2], $entitiesPREG_OFFSET_CAPTURE)) {
  112.                         // calculate the real length of all entities in the legal range
  113.                         foreach ($entities[0] as $entity) {
  114.                             if ($entity[1] + $entities_length <= $left) {
  115.                                 $left--;
  116.                                 $entities_length += strlen($entity[0]);
  117.                             } else {
  118.                                 // no more characters left
  119.                                 break;
  120.                             }
  121.                         }
  122.                     }
  123.                     $truncate .= substr($line_matchings[2], 0$left $entities_length);
  124.                     // maximum lenght is reached, so get off the loop
  125.                     break;
  126.                 } else {
  127.                     $truncate .= $line_matchings[2];
  128.                     $total_length += $content_length;
  129.                 }
  130.                 // if the maximum length is reached, get off the loop
  131.                 if ($total_length >= $length) {
  132.                     break;
  133.                 }
  134.             }
  135.         } else {
  136.             if (strlen($text) <= $length) {
  137.                 return $text;
  138.             } else {
  139.                 $truncate substr($text0$length strlen($ending));
  140.             }
  141.         }
  142.         // if the words shouldn't be cut in the middle...
  143.         if (!$exact) {
  144.             // ...search the last occurance of a space...
  145.             $spacepos strrpos($truncate' ');
  146.             if (isset($spacepos)) {
  147.                 // ...and cut the text in this position
  148.                 $truncate substr($truncate0$spacepos);
  149.             }
  150.         }
  151.         // add the defined ending to the text
  152.         $truncate .= $ending;
  153.         if ($considerHtml) {
  154.             // close all unclosed html-tags
  155.             foreach ($open_tags as $tag) {
  156.                 $truncate .= '</' $tag '>';
  157.             }
  158.         }
  159.         return $truncate;
  160.     }
  161.     public static function stripImages($text) {
  162.         return preg_replace("/<img[^>]+\>/i"""$text);
  163.     }
  164.     public static function postNews($intUserID$newsText$newsType$newsTitle) {
  165.         $newsText htmlentities($newsTextENT_QUOTES);
  166.         $newsTitle htmlentities($newsTitleENT_QUOTES);
  167.         $now time();
  168.         $result Core::db()->prepare("INSERT INTO NEWS (`NEWS_TITLE`,`NEWS_TEXT`,`NEWS_STAMP`,`NEWS_TYPE`,`MEMB_ID`) VALUES ('$newsTitle','$newsText','$now','$newsType','$intUserID')");
  169.         $result->execute();
  170.         
  171.         if ($result) {
  172.             Event::send($intUserID0User::load([$intUserID])->getName() . " has posted the news article \"$newsTitle\"."cint_EVENTTYPE_NEWS);
  173.         }
  174.         // TODO: INB Posts
  175.         if ( Core::get('discord.postINB') == 'true') {
  176.             $hooktext substr(strip_tags(htmlspecialchars_decode($newsTitleENT_QUOTES)),,500 ) . "... Read the full article at https://swc-empire.com";
  177.             $hooktext str_replace('&nbsp;'' '$hooktext);
  178.             $hooktext str_replace('&mdash;''-'$hooktext);
  179.             if ($_ENV['APP_ENV'] == "dev") {
  180.                 self::postDiscordHook($hooktext);
  181.             }
  182.         }
  183.     }
  184.     public static function postDiscordHook($message) {
  185.         // for now, wrap this in a big if to avoid oopsies
  186.         if($_ENV['APP_ENV'] == "dev"){
  187.             $env $_ENV['APP_ENV'];
  188.             $url Core::get("discord.$env.inb.webhookUrl");
  189.             $av Core::get("discord.$env.inb.avatarUrl");
  190.             $usr Core::get("discord.$env.inb.username");
  191.             try {
  192.                 $client     = new Client();
  193.                 $response   $client->post(
  194.                     $url,
  195.                     [
  196.                         'headers' => [
  197.                             'Content-Type' => "application/json",
  198.                         ],
  199.                         'body' => json_encode([
  200.                             "username" => $usr,
  201.                             "avatar_url" => $av,
  202.                             "content" => "$message"
  203.                         ])
  204.                     ]
  205.                 );
  206.             } catch(GuzzleException $e) {
  207.                 Core::addFlash('error''Trying to send an event, the following error occurred: ' $e->getMessage());
  208.             }
  209.         }
  210.     }
  211. }