new table openvk-eventdb.user-events

This commit is contained in:
mrilyew 2025-06-09 15:18:49 +03:00
parent b90a0fa013
commit 969168e53a
4 changed files with 80 additions and 1 deletions

View file

@ -21,6 +21,7 @@ use openvk\Web\Models\Entities\Note;
use openvk\Web\Models\Repositories\Notes as NotesRepo; use openvk\Web\Models\Repositories\Notes as NotesRepo;
use openvk\Web\Models\Repositories\Polls as PollsRepo; use openvk\Web\Models\Repositories\Polls as PollsRepo;
use openvk\Web\Models\Repositories\Audios as AudiosRepo; use openvk\Web\Models\Repositories\Audios as AudiosRepo;
use openvk\Web\Util\EventRateLimiter;
final class Wall extends VKAPIRequestHandler final class Wall extends VKAPIRequestHandler
{ {
@ -723,9 +724,11 @@ final class Wall extends VKAPIRequestHandler
} }
if ($owner_id > 0 && $owner_id !== $this->getUser()->getId()) { if ($owner_id > 0 && $owner_id !== $this->getUser()->getId()) {
(new WallPostNotification($wallOwner, $post, $this->user->identity))->emit(); (new WallPostNotification($wallOwner, $post, $this->getUser()->getId()))->emit();
} }
EventRateLimiter::i()->writeEvent("wall.post", $this->getUser(), $wallOwner);
return (object) ["post_id" => $post->getVirtualId()]; return (object) ["post_id" => $post->getVirtualId()];
} }

View file

@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
namespace openvk\Web\Util;
use openvk\Web\Models\Entities\User;
use Chandler\Patterns\TSimpleSingleton;
class UserEvent
{
private $data;
public function __construct($data)
{
$this->data = $data;
}
public function write($edb): bool
{
$edb->getConnection()->query("INSERT INTO `user-events` VALUES (?, ?, ?, ?, ?)", ...array_values($this->data));
return true;
}
}
class EventRateLimiter
{
use TSimpleSingleton;
public function writeEvent(string $event_name, User $initiator, ?User $reciever = null): bool
{
$eventsConfig = OPENVK_ROOT_CONF["openvk"]["preferences"]["security"]["rateLimits"]["eventsLimit"];
if (!$eventsConfig['enable']) {
return false;
}
if (!($e = eventdb())) {
return false;
}
$data = [
'initiatorId' => $initiator->getId(),
'initiatorIp' => null,
'receiverId' => null,
'eventType' => $event_name,
'eventTime' => time()
];
if ($reciever) {
$data['receiverId'] = $reciever->getId();
}
$newEvent = new UserEvent($data);
$newEvent->write($e);
return true;
}
}

View file

@ -0,0 +1,8 @@
CREATE TABLE `user-events`
(
`initiatorId` BIGINT(20) NOT NULL,
`initiatorIp` VARBINARY(16) NULL DEFAULT NULL,
`receiverId` BIGINT(20) NOT NULL,
`eventType` CHAR(25) NOT NULL,
`eventTime` BIGINT(20) NOT NULL
) ENGINE = InnoDB;

View file

@ -41,6 +41,15 @@ openvk:
maxViolations: 50 maxViolations: 50
maxViolationsAge: 120 maxViolationsAge: 120
autoban: true autoban: true
eventsLimit:
enable: true
restrictionTime: 86400
list:
groups.create: 5
groups.sub: 50
friends.outgoing_sub: 25
wall.post: 500
gifts.send: 20
blacklists: blacklists:
limit: 100 limit: 100
applyToAdmins: true applyToAdmins: true