Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Smit\Livecover\Activities;
- class Likes {
- private $VK;
- private $mysqli;
- /**
- * @var array $posts_hash => Хэширование постов со стены группы,
- * в случае если нужно собрать и комменты и лайки с постов.
- */
- private $posts_hash = [];
- /**
- * @var array $settings => Входные настройки
- *
- * int group_id => id группы (Обязательный параметр)
- * bool get_comments_likes => Нужно ли собирать лайки с комментариев. По умолчанию false (опционально)
- * bool get_posts_likes => Нужно ли собирать лайки с постов. По умолчанию true (опционально)
- * string activities_table => Название таблицы, где хранятся активности. По умолчанию activities (опционально)
- * timestamp from_time => Время с которого нужно собирать активности. (Обязательный параметр)
- * array activities_balls => Очки за определённые активности.
- */
- private $settings = [
- "group_id" => null,
- "get_comments_likes" => false,
- "get_post_likes" => true,
- "activities_table" => "activities",
- "from_time" => null,
- "verify" => null,
- "activities_balls" => [
- "post_like" => 0,
- "comment_like" => 0
- ]
- ];
- /**
- * Likes constructor.
- * @param $VK => клиент VK
- * @param $mysqli => подключение к базе
- */
- public function __construct($VK, $mysqli)
- {
- $this->VK = $VK;
- $this->mysqli = $mysqli;
- }
- /**
- * Функция для запуска цепочки анализа активностей.
- *
- * @param bool $insertActivities => Нужно ли заносить в базу, после получения активностей
- * @return array|bool
- */
- public function run($insertActivities = false)
- {
- $posts_likes = [];
- $resultCommentsLikers = [];
- $oldActivities = $this->getOldActivities($this->settings['get_comments_likes'], $this->settings['get_post_likes']);
- if ($this->checkSettings() !== true) return;
- if ($this->settings['get_post_likes']) {
- $posts_likes = $this->getPostsLikes();
- $old_post_likes = $oldActivities['posts'];
- if (!empty($old_post_likes) and !empty($posts_likes)) {
- foreach ($old_post_likes as $post_id => $likers) {
- $posts_likes[$post_id] = array_diff($posts_likes[$post_id], $likers);
- if (empty($posts_likes[$post_id])) unset($posts_likes[$post_id]);
- }
- }
- if (empty($posts_likes)) $this->consoleLog("Nobody new users who set likes on gaven posts...");
- }
- if ($this->settings['get_comments_likes']) {
- $comments_likes = $this->getCommentsLikes();
- $old_comments_likes = $oldActivities['comments'];
- if (empty($comments_likes)) $this->consoleLog("Nobody set likes on gaven comments...");
- if (!empty($comments_likes)) {
- foreach ($comments_likes as $postAndCommentId => $user_ids) {
- $indexes = explode(":", $postAndCommentId);
- $post_id = $indexes[0];
- $comment_id = $indexes[1];
- foreach ($user_ids as $user_id) {
- if (isset($old_comments_likes["{$post_id}:{$comment_id}"])) {
- if (!in_array($user_id, $old_comments_likes["{$post_id}:{$comment_id}"])) $resultCommentsLikers[] = ["user_id" => $user_id, "comment_id" => $comment_id, "post_id" => $post_id];
- } else {
- $resultCommentsLikers[] = ["user_id" => $user_id, "comment_id" => $comment_id, "post_id" => $post_id];
- }
- }
- }
- }
- if (empty($resultCommentsLikers)) $this->consoleLog("No new users who set likes on given comments");
- }
- $result = [
- "posts" => [
- "current_likes" => $posts_likes,
- "old_likes" => $old_post_likes
- ],
- "comments" => $resultCommentsLikers
- ];
- if ($insertActivities) return $this->insertActivities($result);
- else return $result;
- }
- /**
- * Функция для занесеия активностей в базу.
- *
- * @param array $activities => массив с активностями для занесения в базу.
- * @return bool
- */
- protected function insertActivities(array $activities)
- {
- $usersAdded = 0;
- if (!empty($activities['posts']['current_likes'])) {
- $query = "INSERT INTO {$this->settings['activities_table']} (user_id, activity_type, liker_id, post_id, points) VALUES ";
- foreach ($activities['posts']['current_likes'] as $post_id => $likers) {
- if (empty($likers)) continue;
- foreach ($likers as $liker) {
- $points = $points = $this->settings['activities_balls']['post_like'];
- if (!is_null($this->settings['verify'])) {
- $count = 0;
- if (isset($activities['posts']['old_likes'][$post_id])) $count = count($activities['posts']['old_likes'][$post_id]);
- if ($count <= $this->settings['verify']['among_the_first']['count']) {
- $points = $this->settings['verify']['among_the_first']['points'];
- $activities['posts']['old_likes'][$post_id][] = $liker;
- }
- }
- $query .= sprintf(" (%s, 'post_like', %s, %s, %s), ", $liker, $liker, $post_id, $points);
- $usersAdded++;
- }
- }
- if ($usersAdded) {
- $query = substr($query, 0, -2) . ';';
- $this->mysqli->query($query);
- if ($this->mysqli->errno) $this->warning($this->mysqli->error."\nQUERY : {$query}");
- }
- $this->consoleLog("Total users who liked posts added to database: {$usersAdded}");
- }
- $usersAdded = 0;
- if (!empty($activities['comments'])) {
- $query = "INSERT INTO {$this->settings['activities_table']} (user_id, activity_type, liker_id, post_id, comment_id, points) VALUES ";
- foreach ($activities['comments'] as $liker) {
- $query .= sprintf(" (%s, 'comment_like', %s, %s, %s, %s), ", $liker['user_id'], $liker['user_id'], $liker['post_id'], $liker['comment_id'], $this->settings['activities_balls']['comment_like']);
- $usersAdded++;
- }
- $query = substr($query, 0, -2) . ';';
- $this->mysqli->query($query);
- if ($this->mysqli->errno) $this->warning($this->mysqli->error."\nQUERY : {$query}\n");
- $this->consoleLog("Total users who liked comments added to database: {$usersAdded}");
- }
- return true;
- }
- /**
- * Функция для получения старых активностей из базы
- * @return array|bool
- */
- protected function getOldActivities($comments, $posts)
- {
- $resultComments = [];
- $resultLikes = [];
- if ($comments) {
- $query = "SELECT * FROM activities WHERE activity_type='comment_like';";
- $response = $this->mysqli->query($query);
- if ($this->mysqli->errno) {
- return $this->warning($this->mysqli->error."\nQUERY : {$query}");
- }
- while ($row = $response->fetch_assoc()) {
- $resultComments["{$row['post_id']}:{$row['comment_id']}"][] = $row['user_id'];
- }
- }
- if ($posts) {
- $query = "SELECT * FROM activities WHERE activity_type='post_like';";
- $response = $this->mysqli->query($query);
- if ($this->mysqli->errno) {
- return $this->warning($this->mysqli->error."\nQUERY : {$query}");
- }
- $response = $response->fetch_all(MYSQLI_ASSOC);
- if (!empty($response)) {
- foreach ($response as $user) {
- $resultLikes[$user['post_id']][] = $user['user_id'];
- }
- }
- }
- return [
- "posts" => $resultLikes,
- "comments" => $resultComments
- ];
- }
- /**
- * Функция для получения и сортировки лайков с постов
- * @return array|void
- */
- protected function getPostsLikes()
- {
- if (empty($this->posts_hash)) {
- $posts = $this->VK->getPosts("-" . $this->settings['group_id']);
- foreach ($posts['items'] as $value) {
- if ((integer)$value['date'] < (integer)$this->settings['from_time']) continue;
- $postsIDs[] = [
- 'type' => 'post',
- 'id' => $value['id']
- ];
- }
- if (empty($postsIDs)) return $this->consoleLog("No posts for provided from_time...\n");
- else $this->posts_hash = $postsIDs;
- } else {
- $postsIDs = $this->posts_hash;
- }
- $likers = [];
- echo "Taking post likes: ";
- foreach ($postsIDs as $index) {
- if ($index['id'] == 0) continue;
- $likers[$index['id']] = $this->VK->getLikes("-".$this->settings['group_id'], $index['id'], $index['type'])['items'];
- sleep(1);
- echo count($likers).' ';
- }
- echo PHP_EOL;
- $this->consoleLog("Done getting likes");
- if (empty($likers)) $this->consoleLog("No likes for available posts...");
- return $likers;
- }
- /**
- * Функция для получения и сортировки комментариев с постов
- * @return array|void
- */
- protected function getCommentsLikes()
- {
- $result = [];
- if (empty($this->posts_hash)) {
- $posts = $this->VK->getPosts("-" . $this->settings['group_id']);
- foreach ($posts['items'] as $value) {
- if ((integer)$value['date'] < (integer)$this->settings['from_time']) continue;
- $postsIDs[] = [
- 'type' => 'post',
- 'id' => $value['id']
- ];
- }
- if (empty($postsIDs)) return $this->consoleLog("No posts for provided from_time...\n");
- else $this->posts_hash = $postsIDs;
- } else {
- $postsIDs = $this->posts_hash;
- }
- $this->consoleLog("Getting comments likes...");
- foreach ($postsIDs as $postsID) {
- $comments = $this->VK->getComments("-".$this->settings['group_id'], $postsID['id']);
- $queries_to_execute = [];
- foreach ($comments['items'] as $comment) {
- $queries_to_execute[] = "result.push({\"data\" : API.likes.getList({\"owner_id\" : \"-{$this->settings['group_id']}\",\"item_id\" : {$comment['id']},\"type\" : \"comment\"}), \"comment_id\" : {$comment['id']}});";
- }
- $queries_to_execute_pack = array_chunk($queries_to_execute, 25);
- foreach ($queries_to_execute_pack as $index => $queries_to_execute) {
- if ($index % 3 == 0) {
- $this->consoleLog("Sleeping 2 seconds per likes request");
- sleep(2);
- }
- $code_to_execute = "var result = [];\n";
- foreach ($queries_to_execute as $query) {
- $code_to_execute .= $query;
- }
- $code_to_execute .= "return result;";
- $response = $this->VK->execute($code_to_execute);
- foreach($response as $items) {
- foreach ($items['data']['items'] as $item) {
- $result["{$postsID['id']}:{$items['comment_id']}"][] = $item;
- }
- }
- }
- }
- $this->consoleLog("Done getting comments likes.");
- return $result;
- }
- /**
- * Функция для проверки необходимых данных
- * @return bool
- */
- protected function checkSettings()
- {
- if (is_null($this->settings['group_id'])) return $this->warning("NO GROUP_ID PROVIDED INTO SETTINGS");
- if (is_null($this->settings['from_time'])) return $this->warning("NO from_time PROVIDED\nPROVIDE it to settings, it's optional.");
- return true;
- }
- /**
- * Функция для установки необходимых настроек.
- * @param array $settings
- */
- public function setSettings(array $settings)
- {
- if (!empty($settings['group_id'])) $this->settings['group_id'] = $settings['group_id'];
- if (!empty($settings['get_comments_likes'])) $this->settings['get_comments_likes'] = $settings['get_comments_likes'];
- if (!empty($settings['get_post_likes'])) $this->settings['get_post_likes'] = $settings['get_post_likes'];
- if (!empty($settings['activities_table'])) $this->settings['activities_table'] = $settings['activities_table'];
- if (!empty($settings['from_time'])) $this->settings['from_time'] = $settings['from_time'];
- if (!empty($settings['activities_balls']['post_like'])) $this->settings['activities_balls']['post_like'] = $settings['activities_balls']['post_like'];
- if (!empty($settings['activities_balls']['comment_like'])) $this->settings['activities_balls']['comment_like'] = $settings['activities_balls']['comment_like'];
- if (!empty($settings['verify']['among_the_first']['count']) and !empty($settings['verify']['among_the_first']['points'])) {
- $this->settings['verify']['among_the_first']['count'] = $settings['verify']['among_the_first']['count'];
- $this->settings['verify']['among_the_first']['points'] = $settings['verify']['among_the_first']['points'];
- }
- }
- protected function warning($message)
- {
- $log = "<============================================ WARNING ============================================>\n";
- $date = date("Y-m-d H:i:s");
- $log .= "[{$date}] {$message}";
- $log .= "\n<============================================ WARNING ============================================>\n";
- print_r($log);
- return false;
- }
- protected function consoleLog($message)
- {
- $date = date("Y-m-d H:i:s");
- $log = "[{$date}] {$message}\n";
- print_r($log);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement