Более подробно для тех, кого всё таки интересовало как такое произошло. Как мы видим из темы:
Нововведения за 14.07.22-08.12.2022. У нас появились новые функции, что бы ограничить пользователей, которые нарушают правила и были либо заблокированы или отправлены только в чтение, т.к выигрыш он свой мало вероятно, что смог бы забрать, как и было написано в обновлениях:
Если пользователь заблокирован, он не выиграет в розыгрыше, если до этого записался
Если пользователь попал в группу только чтение, то он так же больше не сможет выйграть в розыгрыше, если до этого записался
Но к сожалению, что бы могло пойти не так? Тесты были минимальные и была совершенна обычная человеческая ошибка в тернарном операторе и к сожалению, мы не можем использовать юнит тесты и не только для дополнений, т.к даже движок не предоставляет возможность автотестов и не только, был бы какой ни будь phpunit, наверное можно было избежать. Ну а для сомневающихся мы приложим код:
PHP:
public function getNewWinners()
{
$participants = $this->ContestParticipants->filter(function (ContestParticipant $participant) {
if ($participant->User->is_banned) {
return false;
}
if ($participant->User->isMemberOf(\XF::options()->mcContestExcludeWinGroups)) {
return false;
}
return true;
})->toArray();
$countWinners = $this->data['count_winners'] >= count($participants) ? $this->data['count_winners'] : count($participants);
return Arr::random(array_values($participants), $countWinners);
}
А если рассматривать более конкретно данную ошибку, то она находится в тернарном операторе:
$countWinners = $this->data['count_winners'] >= count($participants) ? $this->data['count_winners'] : count($participants);
Конечно на момент 30 декабря 23:59 было немного меньше победителей и меньше участников, но пример мы приведём на текущем состояние:
Количество победителей: 47
Количество участников: 264
Проверяется у нас условие, которое возвращает
false
, так как 47 победителей не больше, чем участников, а участников 264. Соответственно данное выражение вернёт
false
и выполнит условие
count($participants)
, что соответственно 264 победителю. Во всём виновата человеческая ошибка, а так же виноваты мы, что не все возможности проверили и обдумали в данном моменте. Но в тот день не выиграл лишь 1 человек т.к он был в РО и это
Vikinger, на данный момент он вообще исключен из розыгрыша.
Ещё раз приносим свои извинения за данный инцидент, а так же мы сделаем ещё медальку для вас, что бы её получили все кто участвовал в розыгрыше и так же запустим более выгодные скидки, после окончания новогодних скидок, которые будут включать все группы пользователей, которые доступны на платном повышение.