From a947bd0889cfb2eb58692f92ab19a875019d3b79 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 5 Aug 2019 21:00:27 -0400 Subject: [PATCH] Add Trending Tags widget + template --- src/Content/Widget/TrendingTags.php | 114 ++++++++++++++++++++++++ view/templates/widget/trending_tags.tpl | 18 ++++ 2 files changed, 132 insertions(+) create mode 100644 src/Content/Widget/TrendingTags.php create mode 100644 view/templates/widget/trending_tags.tpl diff --git a/src/Content/Widget/TrendingTags.php b/src/Content/Widget/TrendingTags.php new file mode 100644 index 0000000000..15a06e029c --- /dev/null +++ b/src/Content/Widget/TrendingTags.php @@ -0,0 +1,114 @@ + L10n::tt('Trending Tags (last %d hour)', 'Trending Tags (last %d hours)', $period), + '$more' => L10n::t('More Trending Tags'), + '$tags' => $tags, + ]); + + return $o; + } + + /** + * Returns a list of the most frequent global tags over the given period + * + * @param int $period Period in hours to consider posts + * @return array + * @throws \Exception + */ + private static function getGlobalTrendingTags(int $period) + { + $tags = Cache::get('global_trending_tags'); + + if (!$tags) { + $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` +FROM `term` t + JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` + JOIN `thread` ON `thread`.`iid` = i.`id` +WHERE `thread`.`visible` + AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + AND NOT `thread`.`private` + AND t.`uid` = 0 + AND t.`otype` = ? + AND t.`type` = ? + AND t.`term` != '' + AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) +GROUP BY `term` +ORDER BY `score` DESC +LIMIT 20", Term::OBJECT_TYPE_POST, Term::HASHTAG, $period); + + if (DBA::isResult($tags)) { + $tags = DBA::toArray($tagsStmt); + Cache::set('global_trending_tags', $tags, Cache::HOUR); + } + } + + return $tags ?: []; + } + + /** + * Returns a list of the most frequent local tags over the given period + * + * @param int $period Period in hours to consider posts + * @return array + * @throws \Exception + */ + private static function getLocalTrendingTags(int $period) + { + $tags = Cache::get('local_trending_tags'); + + if (!$tags) { + $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` +FROM `term` t +JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` +JOIN `thread` ON `thread`.`iid` = i.`id` +JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall` +WHERE `thread`.`visible` + AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + AND NOT `thread`.`private` + AND `thread`.`wall` + AND `thread`.`origin` + AND t.`otype` = ? + AND t.`type` = ? + AND t.`term` != '' + AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) +GROUP BY `term` +ORDER BY `score` DESC +LIMIT 20", Term::OBJECT_TYPE_POST, Term::HASHTAG, $period); + + if (DBA::isResult($tags)) { + $tags = DBA::toArray($tagsStmt); + Cache::set('local_trending_tags', $tags, Cache::HOUR); + } + } + + return $tags ?: []; + } +} diff --git a/view/templates/widget/trending_tags.tpl b/view/templates/widget/trending_tags.tpl new file mode 100644 index 0000000000..554b4984e4 --- /dev/null +++ b/view/templates/widget/trending_tags.tpl @@ -0,0 +1,18 @@ +