Файл: system/moderation.php
Строк: 91
<?php
declare(strict_types=1);
function moderation_can_punish(array $actor,array $target): bool {
$actorAccess=(int)($actor['access']??0); $targetAccess=(int)($target['access']??0);
if($actorAccess<=0 || (int)($actor['id']??0)===(int)($target['id']??0)) return false;
// Модератор/администратор никогда не может наказать равного или старшего по роли.
return $actorAccess>$targetAccess;
}
function moderation_normalize_reason(string $reason): string {
$reason=trim(preg_replace('/s+/u',' ',$reason)??'');
return mb_substr($reason,0,300,'UTF-8');
}
function moderation_duration(int $days,int $hours,int $minutes): int {
$days=max(0,min(3650,$days)); $hours=max(0,min(23,$hours)); $minutes=max(0,min(59,$minutes));
$seconds=$days*86400+$hours*3600+$minutes*60;
return max(300,min($seconds,10*365*86400));
}
function moderation_cleanup_expired(int $uid=0): void {
$now=time();
if($uid>0){
db_query('DELETE FROM `ban` WHERE `time`<='.$now.' AND `user`='.(int)$uid);
db_query('DELETE FROM `banned` WHERE `time`<='.$now.' AND `user`='.(int)$uid);
return;
}
// Глобальная уборка не должна делать две DELETE на каждом просмотре страницы.
$stamp=dirname(__DIR__).'/logs/moderation-cleanup.tick';
if(is_file($stamp) && (int)@filemtime($stamp)>=$now-60) return;
@touch($stamp);
db_query('DELETE FROM `ban` WHERE `time`<='.$now);
db_query('DELETE FROM `banned` WHERE `time`<='.$now);
}
function moderation_log(int $actor,int $target,string $kind,string $reason,int $until,string $action='apply'): void {
db_execute('INSERT INTO `moderation_log` (`actor`,`target`,`kind`,`reason`,`until_at`,`action`,`created_at`,`ip`) VALUES (:a,:t,:k,:r,:u,:ac,:c,:ip)',[
'a'=>$actor,'t'=>$target,'k'=>$kind,'r'=>$reason,'u'=>$until,'ac'=>$action,'c'=>time(),'ip'=>security_client_ip()
]);
}