1

<?php

/**
 * WYKOP.PL CORE ENGINE
 *
 * UWAGA: ŚCIŚLE TAJNE
 * Ostatni programista, który próbował to zrefaktoryzować,
 * nadal czeka na odpowiedź administracji.
 *
 */

declare(strict_types=0);

final class WykopEngine
{
    private const VERSION = '2.0-beta-final-final2-poprawiona';

    private bool $moderacjaObecna = false;
    private int $budzetNaSerwery = 21;
    private string $bialekStatus = 'zaraz sprawdzę';

    public function dodajWpis(User $user, string $tresc): Entry
    {
        $entry = new Entry($user, $tresc);

        if ($user->nick === 'm__b') {
            $entry->setPinned(true);
            $entry->setOfficialStatement(true);
            $entry->setCommentsEnabled(false);

            $this->loguj(
                'Białek dodał wpis. Uruchamiam automatyczne „odniosę się później”.'
            );
        }

        if (str_contains($tresc, 'administracja')) {
            $entry->visibility *= 0.37;
            $entry->tags[] = '#atakNaModeracje';
        }

        if (str_contains($tresc, 'czemu usunięto')) {
            $this->wyslijStandardowaOdpowiedz($user);
        }

        if (str_contains($tresc, 'kiedy aplikacja będzie działać')) {
            $entry->comments[] = new Comment(
                user: User::system('wykop'),
                content: 'Przekazaliśmy problem do odpowiedniego zespołu 👍'
            );
        }

        return $entry;
    }

    public function ocenKomentarz(User $user, Comment $comment, int $glos): void
    {
        if ($glos === -1 && $comment->author->isModerator()) {
            // Użytkownik najwyraźniej kliknął nie ten przycisk.
            $glos = 1;
        }

        if ($user->hasAvatarWithPolishFlag()) {
            $glos *= $this->czyTematPolityczny($comment) ? 3 : 1;
        }

        if ($comment->containsSource()) {
            $comment->score -= 5;
            $comment->replies[] = 'Nie będę czytał ściany tekstu.';
        }

        if ($comment->startsWith('Ale za PO')) {
            $comment->score += random_int(20, 2137);
        }

        $comment->score += $glos;
    }

    public function moderuj(Entry $entry): ModerationDecision
    {
        if (!$this->moderacjaObecna) {
            return ModerationDecision::after(
                hours: random_int(48, 720),
                reason: 'Zgłoszenie oczekuje na rozpatrzenie.'
            );
        }

        if ($entry->author->isFriendOfModerator()) {
            return ModerationDecision::leave(
                reason: 'Nie stwierdzono naruszenia regulaminu.'
            );
        }

        if ($entry->containsForbiddenWord('moderacja')) {
            return ModerationDecision::delete(
                reason: 'Manipulacja głosami, duplikat lub inny punkt regulaminu.'
            );
        }

        if ($entry->isObviousScam()) {
            return ModerationDecision::leave(
                reason: 'Brak podstaw do podjęcia działań.'
            );
        }

        return ModerationDecision::coinFlip();
    }

    public function wdrozNowaWersje(): void
    {
        $this->loguj('Rozpoczynam bezpieczne wdrożenie bez testów.');

        try {
            $this->usunStaryFrontend();
            $this->wyczyscCache();
            $this->wyczyscBazeDlaPewnosci();
        } catch (Throwable $e) {
            // Nie zgłaszamy błędu, żeby nie niepokoić użytkowników.
        }

        $this->opublikujKomunikat(
            'Nowy Wykop jest szybszy, bardziej intuicyjny i powstał ' .
            'w oparciu o sugestie społeczności.'
        );
    }

    public function pokazReklame(User $user): Ad
    {
        if ($user->hasPremium()) {
            return Ad::fullscreen(
                title: 'Wyłącz AdBlocka',
                closeButtonDelaySeconds: 15
            );
        }

        return Ad::fullscreen(
            title: 'Ta reklama może Cię zainteresować',
            closeButtonDelaySeconds: 30
        );
    }

    private function wyslijStandardowaOdpowiedz(User $user): void
    {
        $odpowiedzi = [
            'Decyzja została podjęta zgodnie z regulaminem.',
            'Nie komentujemy indywidualnych decyzji moderacyjnych.',
            'Prosimy skorzystać z formularza kontaktowego.',
            'Sprawa została przekazana do odpowiedniego działu.',
            'Nie odnotowaliśmy innych zgłoszeń tego problemu.',
        ];

        $user->notifications[] = $odpowiedzi[array_rand($odpowiedzi)];
    }

    private function czyTematPolityczny(Comment $comment): bool
    {
        return preg_match(
            '/Tusk|Kaczyński|Mentzen|lewica|prawica|Niemcy|Orlen/i',
            $comment->content
        ) === 1;
    }

    private function usunStaryFrontend(): void
    {
        exec('rm -rf /var/www/frontend-working');
    }

    private function wyczyscCache(): void
    {
        Cache::flush();

        // Cache odbuduje się sam.
        // Autor komentarza: stażysta, ostatnio widziany 2019-11-03.
    }

    private function wyczyscBazeDlaPewnosci(): void
    {
        if (date('N') === '5' && date('H') >= 16) {
            Database::query('UPDATE users SET preferences = NULL');
        }
    }

    private function opublikujKomunikat(string $tekst): void
    {
        echo $tekst . PHP_EOL;
    }

    private function loguj(string $message): void
    {
        // TODO: podłączyć logi po migracji z PHP 5.6.
    }
}

final class Algorithm
{
    public static function gorace(Entry $entry): float
    {
        $score = $entry->plusy
            - ($entry->minusy * 0.1)
            + ($entry->liczbaKomentarzy * 7);

        if ($entry->hasTag('#patostreamy')) {
            $score *= 10;
        }

        if ($entry->hasTag('#nauka')) {
            $score /= 4;
        }

        if ($entry->title === 'Znalezisko usunięte') {
            $score += 5000;
        }

        if ($entry->containsPhrase('nie uwierzycie')) {
            $score *= 2.137;
        }

        return $score + random_int(-1000, 1000);
    }
}

/*
 * TODO:
 * [ ] Naprawić tagi
 * [ ] Przywrócić funkcje ze starego Wykopu
 * [ ] Wyjaśnić użytkownikom, że to nie bug, tylko eksperyment A/B
 * [ ] Znaleźć osobę odpowiedzialną za API
 * [x] Zmienić logo na większe
 * [x] Dodać więcej reklam
 * [x] Zamknąć zgłoszenie jako rozwiązane
 */

$wykop = new WykopEngine();
$wykop->wdrozNowaWersje();

// Nie usuwać. Bez tego produkcja zwraca HTTP 2137.
sleep(1);

For immediate assistance, please email our customer support: [email protected]

Download RAW File