From b180a28b468dc139d22276c0002a6714e031478e Mon Sep 17 00:00:00 2001 From: mrilyew <99399973+mrilyew@users.noreply.github.com> Date: Mon, 9 Jun 2025 16:15:21 +0300 Subject: [PATCH] set up common events --- VKAPI/Handlers/Wall.php | 3 +- Web/Models/Entities/Traits/TSubscribable.php | 9 ++++++ Web/Models/Entities/User.php | 3 ++ Web/Presenters/GroupPresenter.php | 3 ++ Web/Presenters/WallPresenter.php | 2 ++ Web/Util/EventRateLimiter.php | 30 +++++++++++++++++--- install/sqls/eventdb/00001-events-log.sql | 6 ++-- 7 files changed, 47 insertions(+), 9 deletions(-) diff --git a/VKAPI/Handlers/Wall.php b/VKAPI/Handlers/Wall.php index 9e4d9180..a29fc754 100644 --- a/VKAPI/Handlers/Wall.php +++ b/VKAPI/Handlers/Wall.php @@ -21,7 +21,6 @@ use openvk\Web\Models\Entities\Note; use openvk\Web\Models\Repositories\Notes as NotesRepo; use openvk\Web\Models\Repositories\Polls as PollsRepo; use openvk\Web\Models\Repositories\Audios as AudiosRepo; -use openvk\Web\Util\EventRateLimiter; final class Wall extends VKAPIRequestHandler { @@ -727,7 +726,7 @@ final class Wall extends VKAPIRequestHandler (new WallPostNotification($wallOwner, $post, $this->getUser()->getId()))->emit(); } - EventRateLimiter::i()->writeEvent("wall.post", $this->getUser(), $wallOwner); + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("wall.post", $this->getUser(), $wallOwner); return (object) ["post_id" => $post->getVirtualId()]; } diff --git a/Web/Models/Entities/Traits/TSubscribable.php b/Web/Models/Entities/Traits/TSubscribable.php index 898f33a8..654ae4ac 100644 --- a/Web/Models/Entities/Traits/TSubscribable.php +++ b/Web/Models/Entities/Traits/TSubscribable.php @@ -37,6 +37,15 @@ trait TSubscribable if (!($sub->fetch())) { $ctx->table("subscriptions")->insert($data); + + # todo change + + if (str_contains(static::class, "Club")) { + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("groups.sub", $user, $this); + } else { + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("friends.outgoing_sub", $user, $this); + } + return true; } diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index df4da4d0..71946b34 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -114,6 +114,7 @@ class User extends RowModel public function getChandlerUser(): ChandlerUser { + # TODO cache this function return new ChandlerUser($this->getRecord()->ref("ChandlerUsers", "user")); } @@ -1043,6 +1044,8 @@ class User extends RowModel "anonymous" => $anonymous, "sent" => time(), ]); + + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("gifts.send", $sender, $this); } public function ban(string $reason, bool $deleteSubscriptions = true, $unban_time = null, ?int $initiator = null): void diff --git a/Web/Presenters/GroupPresenter.php b/Web/Presenters/GroupPresenter.php index a38dacaa..088dfc9d 100644 --- a/Web/Presenters/GroupPresenter.php +++ b/Web/Presenters/GroupPresenter.php @@ -79,6 +79,9 @@ final class GroupPresenter extends OpenVKPresenter } $club->toggleSubscription($this->user->identity); + + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("groups.create", $this->user->identity, $club); + $this->redirect("/club" . $club->getId()); } else { $this->flashFail("err", tr("error"), tr("error_no_group_name")); diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index dbdfdde0..3311c777 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -432,6 +432,8 @@ final class WallPresenter extends OpenVKPresenter } } + \openvk\Web\Util\EventRateLimiter::i()->writeEvent("wall.post", $this->user->identity, $wallOwner); + if ($should_be_suggested) { $this->redirect("/club" . $wallOwner->getId() . "/suggested"); } else { diff --git a/Web/Util/EventRateLimiter.php b/Web/Util/EventRateLimiter.php index 80fea28a..e39e3c61 100644 --- a/Web/Util/EventRateLimiter.php +++ b/Web/Util/EventRateLimiter.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace openvk\Web\Util; use openvk\Web\Models\Entities\User; +use openvk\Web\Models\RowModel; use Chandler\Patterns\TSimpleSingleton; class UserEvent @@ -28,10 +29,31 @@ class EventRateLimiter { use TSimpleSingleton; - public function writeEvent(string $event_name, User $initiator, ?User $reciever = null): bool + private $config; + private $availableFields; + + public function __construct() { - $eventsConfig = OPENVK_ROOT_CONF["openvk"]["preferences"]["security"]["rateLimits"]["eventsLimit"]; - if (!$eventsConfig['enable']) { + $this->config = OPENVK_ROOT_CONF["openvk"]["preferences"]["security"]["rateLimits"]["eventsLimit"]; + $this->availableFields = array_keys($this->config['list']); + } + + public function tryToLimit(?User $user): bool + { + if (!$this->config['enable']) { + return false; + } + + if ($user->isAdmin()) { + return false; + } + + return true; + } + + public function writeEvent(string $event_name, User $initiator, ?RowModel $reciever = null): bool + { + if (!$this->config['enable']) { return false; } @@ -48,7 +70,7 @@ class EventRateLimiter ]; if ($reciever) { - $data['receiverId'] = $reciever->getId(); + $data['receiverId'] = $reciever->getRealId(); } $newEvent = new UserEvent($data); diff --git a/install/sqls/eventdb/00001-events-log.sql b/install/sqls/eventdb/00001-events-log.sql index dc972bec..3b7c4b4c 100644 --- a/install/sqls/eventdb/00001-events-log.sql +++ b/install/sqls/eventdb/00001-events-log.sql @@ -1,8 +1,8 @@ CREATE TABLE `user-events` ( - `initiatorId` BIGINT(20) NOT NULL, + `initiatorId` BIGINT(20) UNSIGNED NOT NULL, `initiatorIp` VARBINARY(16) NULL DEFAULT NULL, - `receiverId` BIGINT(20) NOT NULL, + `receiverId` BIGINT(20) NULL DEFAULT NULL, `eventType` CHAR(25) NOT NULL, - `eventTime` BIGINT(20) NOT NULL + `eventTime` BIGINT(20) UNSIGNED NOT NULL ) ENGINE = InnoDB;