Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.97 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Smit\Livecover\Activities;
  4.  
  5. class Likes {
  6.  
  7. private $VK;
  8. private $mysqli;
  9.  
  10. /**
  11. * @var array $posts_hash => Хэширование постов со стены группы,
  12. * в случае если нужно собрать и комменты и лайки с постов.
  13. */
  14.  
  15. private $posts_hash = [];
  16.  
  17.  
  18. /**
  19. * @var array $settings => Входные настройки
  20. *
  21. * int group_id => id группы (Обязательный параметр)
  22. * bool get_comments_likes => Нужно ли собирать лайки с комментариев. По умолчанию false (опционально)
  23. * bool get_posts_likes => Нужно ли собирать лайки с постов. По умолчанию true (опционально)
  24. * string activities_table => Название таблицы, где хранятся активности. По умолчанию activities (опционально)
  25. * timestamp from_time => Время с которого нужно собирать активности. (Обязательный параметр)
  26. * array activities_balls => Очки за определённые активности.
  27. */
  28.  
  29. private $settings = [
  30. "group_id" => null,
  31. "get_comments_likes" => false,
  32. "get_post_likes" => true,
  33. "activities_table" => "activities",
  34. "from_time" => null,
  35. "verify" => null,
  36. "activities_balls" => [
  37. "post_like" => 0,
  38. "comment_like" => 0
  39. ]
  40. ];
  41.  
  42. /**
  43. * Likes constructor.
  44. * @param $VK => клиент VK
  45. * @param $mysqli => подключение к базе
  46. */
  47.  
  48. public function __construct($VK, $mysqli)
  49. {
  50. $this->VK = $VK;
  51. $this->mysqli = $mysqli;
  52. }
  53.  
  54. /**
  55. * Функция для запуска цепочки анализа активностей.
  56. *
  57. * @param bool $insertActivities => Нужно ли заносить в базу, после получения активностей
  58. * @return array|bool
  59. */
  60.  
  61. public function run($insertActivities = false)
  62. {
  63. $posts_likes = [];
  64. $resultCommentsLikers = [];
  65. $oldActivities = $this->getOldActivities($this->settings['get_comments_likes'], $this->settings['get_post_likes']);
  66.  
  67. if ($this->checkSettings() !== true) return;
  68.  
  69. if ($this->settings['get_post_likes']) {
  70. $posts_likes = $this->getPostsLikes();
  71. $old_post_likes = $oldActivities['posts'];
  72. if (!empty($old_post_likes) and !empty($posts_likes)) {
  73. foreach ($old_post_likes as $post_id => $likers) {
  74. $posts_likes[$post_id] = array_diff($posts_likes[$post_id], $likers);
  75. if (empty($posts_likes[$post_id])) unset($posts_likes[$post_id]);
  76. }
  77. }
  78.  
  79. if (empty($posts_likes)) $this->consoleLog("Nobody new users who set likes on gaven posts...");
  80. }
  81.  
  82. if ($this->settings['get_comments_likes']) {
  83. $comments_likes = $this->getCommentsLikes();
  84. $old_comments_likes = $oldActivities['comments'];
  85. if (empty($comments_likes)) $this->consoleLog("Nobody set likes on gaven comments...");
  86. if (!empty($comments_likes)) {
  87. foreach ($comments_likes as $postAndCommentId => $user_ids) {
  88. $indexes = explode(":", $postAndCommentId);
  89. $post_id = $indexes[0];
  90. $comment_id = $indexes[1];
  91. foreach ($user_ids as $user_id) {
  92. if (isset($old_comments_likes["{$post_id}:{$comment_id}"])) {
  93. 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];
  94. } else {
  95. $resultCommentsLikers[] = ["user_id" => $user_id, "comment_id" => $comment_id, "post_id" => $post_id];
  96. }
  97. }
  98. }
  99. }
  100.  
  101. if (empty($resultCommentsLikers)) $this->consoleLog("No new users who set likes on given comments");
  102. }
  103.  
  104. $result = [
  105. "posts" => [
  106. "current_likes" => $posts_likes,
  107. "old_likes" => $old_post_likes
  108. ],
  109.  
  110. "comments" => $resultCommentsLikers
  111. ];
  112.  
  113. if ($insertActivities) return $this->insertActivities($result);
  114. else return $result;
  115.  
  116. }
  117.  
  118. /**
  119. * Функция для занесеия активностей в базу.
  120. *
  121. * @param array $activities => массив с активностями для занесения в базу.
  122. * @return bool
  123. */
  124.  
  125. protected function insertActivities(array $activities)
  126. {
  127. $usersAdded = 0;
  128. if (!empty($activities['posts']['current_likes'])) {
  129. $query = "INSERT INTO {$this->settings['activities_table']} (user_id, activity_type, liker_id, post_id, points) VALUES ";
  130. foreach ($activities['posts']['current_likes'] as $post_id => $likers) {
  131. if (empty($likers)) continue;
  132. foreach ($likers as $liker) {
  133. $points = $points = $this->settings['activities_balls']['post_like'];
  134. if (!is_null($this->settings['verify'])) {
  135. $count = 0;
  136. if (isset($activities['posts']['old_likes'][$post_id])) $count = count($activities['posts']['old_likes'][$post_id]);
  137. if ($count <= $this->settings['verify']['among_the_first']['count']) {
  138. $points = $this->settings['verify']['among_the_first']['points'];
  139. $activities['posts']['old_likes'][$post_id][] = $liker;
  140. }
  141. }
  142.  
  143. $query .= sprintf(" (%s, 'post_like', %s, %s, %s), ", $liker, $liker, $post_id, $points);
  144. $usersAdded++;
  145. }
  146. }
  147. if ($usersAdded) {
  148. $query = substr($query, 0, -2) . ';';
  149. $this->mysqli->query($query);
  150. if ($this->mysqli->errno) $this->warning($this->mysqli->error."\nQUERY : {$query}");
  151. }
  152.  
  153. $this->consoleLog("Total users who liked posts added to database: {$usersAdded}");
  154. }
  155.  
  156. $usersAdded = 0;
  157. if (!empty($activities['comments'])) {
  158. $query = "INSERT INTO {$this->settings['activities_table']} (user_id, activity_type, liker_id, post_id, comment_id, points) VALUES ";
  159. foreach ($activities['comments'] as $liker) {
  160. $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']);
  161. $usersAdded++;
  162. }
  163. $query = substr($query, 0, -2) . ';';
  164. $this->mysqli->query($query);
  165. if ($this->mysqli->errno) $this->warning($this->mysqli->error."\nQUERY : {$query}\n");
  166. $this->consoleLog("Total users who liked comments added to database: {$usersAdded}");
  167. }
  168.  
  169. return true;
  170. }
  171.  
  172. /**
  173. * Функция для получения старых активностей из базы
  174. * @return array|bool
  175. */
  176.  
  177. protected function getOldActivities($comments, $posts)
  178. {
  179. $resultComments = [];
  180. $resultLikes = [];
  181. if ($comments) {
  182.  
  183. $query = "SELECT * FROM activities WHERE activity_type='comment_like';";
  184. $response = $this->mysqli->query($query);
  185.  
  186. if ($this->mysqli->errno) {
  187. return $this->warning($this->mysqli->error."\nQUERY : {$query}");
  188. }
  189.  
  190. while ($row = $response->fetch_assoc()) {
  191. $resultComments["{$row['post_id']}:{$row['comment_id']}"][] = $row['user_id'];
  192. }
  193. }
  194. if ($posts) {
  195. $query = "SELECT * FROM activities WHERE activity_type='post_like';";
  196. $response = $this->mysqli->query($query);
  197. if ($this->mysqli->errno) {
  198. return $this->warning($this->mysqli->error."\nQUERY : {$query}");
  199. }
  200. $response = $response->fetch_all(MYSQLI_ASSOC);
  201. if (!empty($response)) {
  202. foreach ($response as $user) {
  203. $resultLikes[$user['post_id']][] = $user['user_id'];
  204. }
  205. }
  206. }
  207.  
  208. return [
  209. "posts" => $resultLikes,
  210. "comments" => $resultComments
  211. ];
  212. }
  213.  
  214. /**
  215. * Функция для получения и сортировки лайков с постов
  216. * @return array|void
  217. */
  218.  
  219. protected function getPostsLikes()
  220. {
  221. if (empty($this->posts_hash)) {
  222. $posts = $this->VK->getPosts("-" . $this->settings['group_id']);
  223.  
  224. foreach ($posts['items'] as $value) {
  225. if ((integer)$value['date'] < (integer)$this->settings['from_time']) continue;
  226. $postsIDs[] = [
  227. 'type' => 'post',
  228. 'id' => $value['id']
  229. ];
  230. }
  231. if (empty($postsIDs)) return $this->consoleLog("No posts for provided from_time...\n");
  232. else $this->posts_hash = $postsIDs;
  233. } else {
  234. $postsIDs = $this->posts_hash;
  235. }
  236.  
  237. $likers = [];
  238. echo "Taking post likes: ";
  239. foreach ($postsIDs as $index) {
  240. if ($index['id'] == 0) continue;
  241. $likers[$index['id']] = $this->VK->getLikes("-".$this->settings['group_id'], $index['id'], $index['type'])['items'];
  242. sleep(1);
  243. echo count($likers).' ';
  244. }
  245.  
  246. echo PHP_EOL;
  247. $this->consoleLog("Done getting likes");
  248. if (empty($likers)) $this->consoleLog("No likes for available posts...");
  249. return $likers;
  250. }
  251.  
  252. /**
  253. * Функция для получения и сортировки комментариев с постов
  254. * @return array|void
  255. */
  256.  
  257. protected function getCommentsLikes()
  258. {
  259. $result = [];
  260. if (empty($this->posts_hash)) {
  261. $posts = $this->VK->getPosts("-" . $this->settings['group_id']);
  262. foreach ($posts['items'] as $value) {
  263. if ((integer)$value['date'] < (integer)$this->settings['from_time']) continue;
  264. $postsIDs[] = [
  265. 'type' => 'post',
  266. 'id' => $value['id']
  267. ];
  268. }
  269. if (empty($postsIDs)) return $this->consoleLog("No posts for provided from_time...\n");
  270. else $this->posts_hash = $postsIDs;
  271. } else {
  272. $postsIDs = $this->posts_hash;
  273. }
  274. $this->consoleLog("Getting comments likes...");
  275. foreach ($postsIDs as $postsID) {
  276. $comments = $this->VK->getComments("-".$this->settings['group_id'], $postsID['id']);
  277. $queries_to_execute = [];
  278. foreach ($comments['items'] as $comment) {
  279. $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']}});";
  280. }
  281.  
  282. $queries_to_execute_pack = array_chunk($queries_to_execute, 25);
  283. foreach ($queries_to_execute_pack as $index => $queries_to_execute) {
  284. if ($index % 3 == 0) {
  285. $this->consoleLog("Sleeping 2 seconds per likes request");
  286. sleep(2);
  287. }
  288. $code_to_execute = "var result = [];\n";
  289. foreach ($queries_to_execute as $query) {
  290. $code_to_execute .= $query;
  291. }
  292.  
  293. $code_to_execute .= "return result;";
  294. $response = $this->VK->execute($code_to_execute);
  295. foreach($response as $items) {
  296. foreach ($items['data']['items'] as $item) {
  297. $result["{$postsID['id']}:{$items['comment_id']}"][] = $item;
  298. }
  299. }
  300. }
  301. }
  302.  
  303. $this->consoleLog("Done getting comments likes.");
  304. return $result;
  305. }
  306.  
  307. /**
  308. * Функция для проверки необходимых данных
  309. * @return bool
  310. */
  311.  
  312. protected function checkSettings()
  313. {
  314. if (is_null($this->settings['group_id'])) return $this->warning("NO GROUP_ID PROVIDED INTO SETTINGS");
  315. if (is_null($this->settings['from_time'])) return $this->warning("NO from_time PROVIDED\nPROVIDE it to settings, it's optional.");
  316. return true;
  317. }
  318.  
  319. /**
  320. * Функция для установки необходимых настроек.
  321. * @param array $settings
  322. */
  323.  
  324. public function setSettings(array $settings)
  325. {
  326. if (!empty($settings['group_id'])) $this->settings['group_id'] = $settings['group_id'];
  327. if (!empty($settings['get_comments_likes'])) $this->settings['get_comments_likes'] = $settings['get_comments_likes'];
  328. if (!empty($settings['get_post_likes'])) $this->settings['get_post_likes'] = $settings['get_post_likes'];
  329. if (!empty($settings['activities_table'])) $this->settings['activities_table'] = $settings['activities_table'];
  330. if (!empty($settings['from_time'])) $this->settings['from_time'] = $settings['from_time'];
  331. if (!empty($settings['activities_balls']['post_like'])) $this->settings['activities_balls']['post_like'] = $settings['activities_balls']['post_like'];
  332. if (!empty($settings['activities_balls']['comment_like'])) $this->settings['activities_balls']['comment_like'] = $settings['activities_balls']['comment_like'];
  333. if (!empty($settings['verify']['among_the_first']['count']) and !empty($settings['verify']['among_the_first']['points'])) {
  334. $this->settings['verify']['among_the_first']['count'] = $settings['verify']['among_the_first']['count'];
  335. $this->settings['verify']['among_the_first']['points'] = $settings['verify']['among_the_first']['points'];
  336. }
  337. }
  338.  
  339. protected function warning($message)
  340. {
  341. $log = "<============================================ WARNING ============================================>\n";
  342. $date = date("Y-m-d H:i:s");
  343. $log .= "[{$date}] {$message}";
  344. $log .= "\n<============================================ WARNING ============================================>\n";
  345. print_r($log);
  346. return false;
  347. }
  348.  
  349. protected function consoleLog($message)
  350. {
  351. $date = date("Y-m-d H:i:s");
  352. $log = "[{$date}] {$message}\n";
  353. print_r($log);
  354. }
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement