Тема срачей, говнокода и путей их преодоления

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Была тут тема, где неизвестный автор немножко ебанулся:
PHP:
if( $lvl == 8 ) {
                /*
                Пылающий Паразит
                Кольчатый Страхочервь
                Хлюп
                Яростная Мокрица
                */
                $bots = array( 'Литейщик','Проклятие Глубин','Пустынник Маньяк','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы' );
            }
            if( $lvl == 9 ) {
                /*
                Пылающий Паразит
                Кольчатый Страхочервь
                Хлюп
                Яростная Мокрица
                */
                $bots = array( 'Механический Охранник','Механический Убийца','Жирный Зомби','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы','Дух-Хранитель','Заблудшая Душа' );
            }
            if( $lvl == 10 ) {
                /*
                Пылающий Паразит
                Кольчатый Страхочервь
                Хлюп
                Яростная Мокрица
                */
                $bots = array( 'Глубинный Зомби','Безумный Рыцарь','Сирена','Каменный Зомби','Заблудшая Душа','Дух-Хранитель','Кошмар Глубин','Банши','Дух','Прозерпина' );
            }
            
            
            $id2 = rand(0,(count($bots)-1));           
            $id = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `login` = "'.$bots[$id2].'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));

ВЖУХ!
PHP:
$id2 = [];
if($lvl === 8) {
  $bots = array_rand(['Литейщик','Проклятие Глубин','Пустынник Маньяк','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы']);
} elseif( $lvl === 9 ) {
  $bots = array_rand(['Механический Охранник','Механический Убийца','Жирный Зомби','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы','Дух-Хранитель','Заблудшая Душа']);
} elseif( $lvl === 10 ) {
  $bots = array_rand(['Глубинный Зомби','Безумный Рыцарь','Сирена','Каменный Зомби','Заблудшая Душа','Дух-Хранитель','Кошмар Глубин','Банши','Дух','Прозерпина']);
}
if (!empty($bots)) {
  $id = mysql_fetch_array(mysql_query('SELECT * FROM `test_bot` WHERE `login` = "'.$bots.'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));
}

elseif, чтобы проверки не шли одна за другой если отработала предыдущая.
=== вместо ==, чтобы принимался только integer
встроенная функция вместо внешнего рандомизатора потому что... ну почему бы и нет?
 

oxy

Знаток
🏆
📜
Сообщения
424
Реакции
101
Ну тогда давай уже вот так:

PHP:
$bots = [
    8 => ['Литейщик','Проклятие Глубин','Пустынник Маньяк','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы'],
    9 => ['Механический Охранник','Механический Убийца','Жирный Зомби','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы','Дух-Хранитель','Заблудшая Душа'],
    10 => ['Глубинный Зомби','Безумный Рыцарь','Сирена','Каменный Зомби','Заблудшая Душа','Дух-Хранитель','Кошмар Глубин','Банши','Дух','Прозерпина']
]

if(isset($bots[$lvl])){
    $botLogin = array_rand($bots[$lvl]);
    $id = mysql_fetch_array(mysql_query('SELECT `id` FROM `test_bot` WHERE `login` = "'.$botLogin.'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));
}
 

oxy

Знаток
🏆
📜
Сообщения
424
Реакции
101
Я никогда не устану удивятся суржику в названии полей и переменных...
Блядь ну назовите вы уже все транслитом.. Напиши вместо level -> uroven, ну или воспользуйся уже переводчиком и посмотри как переводится слово пещера....
 

fulugan

Некто
📜
Сообщения
12
Реакции
2
Ну тогда давай уже вот так:

PHP:
$bots = [
    8 => ['Литейщик','Проклятие Глубин','Пустынник Маньяк','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы'],
    9 => ['Механический Охранник','Механический Убийца','Жирный Зомби','Пустынник Убийца','Рабочий Мглы','Смотритель Мглы','Сторож Мглы','Дух-Хранитель','Заблудшая Душа'],
    10 => ['Глубинный Зомби','Безумный Рыцарь','Сирена','Каменный Зомби','Заблудшая Душа','Дух-Хранитель','Кошмар Глубин','Банши','Дух','Прозерпина']
]

if(isset($bots[$lvl])){
    $botLogin = array_rand($bots[$lvl]);
    $id = mysql_fetch_array(mysql_query('SELECT `id` FROM `test_bot` WHERE `login` = "'.$botLogin.'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));
}
PHP:
$botLogin = array_rand($bots[$lvl]);

$id = mysql_fetch_array(mysql_query('SELECT `id` FROM `test_bot` WHERE `login` = "'.$botLogin.'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));
данный код не будет работать. array_rand возвращает индекс элемента массива, а не его содержимое.
нужно так:

PHP:
$botRnd = array_rand($bots[$lvl]);

    $botLogin = $bots[$lvl][$botRnd];

    $id = mysql_fetch_array(mysql_query('SELECT `id` FROM `test_bot` WHERE `login` = "'.$botLogin.'" AND `level` <= "'.$u->info['level'].'" AND `pishera` != "" AND `active` = "1" ORDER BY `level` DESC LIMIT 1'));


@DarksLight2, сложно код поместить в соответствующие теги ?
 
Последнее редактирование модератором:

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Да, это я что-то маху дал. О_о
$a = ['aaa', 'bbb' , 'hhh'];
echo $a[array_rand($a)];
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Были у меня одни бекапы баз...
code_language.powershell:
Param([switch]$Log,[switch]$Full);
$Server = ".\ARTZVITSQLSERVER";     # SQL Server Instance.           
$Dest = "z:\";    # Backup path     
$daysToStoreBackups = 3;

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ConnectionInfo');           
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.Management.Sdk.Sfc');           
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO');           
# Requiered for SQL Server 2008 (SMO 10.0).           
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended');           

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server $Server;           
# If missing set default backup directory.           
If ($Dest -eq "")           
{ $Dest = $server.Settings.BackupDirectory + "\" };

Get-ChildItem "$Dest\*" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreBackups)} |% {Remove-Item $_ -force }
"Removed all previous backups older than $daysToStoreBackups days"
          
Write-Output ("Started at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));           
# Full-backup for every database           
foreach ($db in $srv.Databases)           
{           
    If($Full)
    {
        If($db.Name -ne "tempdb")  # Non need to backup TempDB           
        {           
            $timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;           
            $backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");           
            $backup.Action = "Database";           
            $backup.Database = $db.Name;           
            $backup.Devices.AddDevice($Dest + $db.Name + "_full_" + $timestamp + ".bak", "File");           
            $backup.BackupSetDescription = "Full backup of " + $db.Name + " " + $timestamp;           
            $backup.Incremental = 0;           
            # Starting full backup process.           
            $backup.SqlBackup($srv);   
            # For db with recovery mode <> simple: Log backup.           
            If ($db.RecoveryModel -ne 3)           
            {           
                $timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;           
                $backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");           
                $backup.Action = "Log";           
                $backup.Database = $db.Name;           
                $backup.Devices.AddDevice($Dest + $db.Name + "_log_" + $timestamp + ".trn", "File");           
                $backup.BackupSetDescription = "Log backup of " + $db.Name + " " + $timestamp;           
                #Specify that the log must be truncated after the backup is complete.           
                $backup.LogTruncation = "Truncate";
                # Starting log backup process           
                $backup.SqlBackup($srv);           
            };           
        };
    }
    If($Log)
    {
            # For db with recovery mode <> simple: Log backup.           
            If ($db.RecoveryModel -ne 3)           
            {           
                $timestamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;           
                $backup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup");           
                $backup.Action = "Log";           
                $backup.Database = $db.Name;           
                $backup.Devices.AddDevice($Dest + $db.Name + "_log_" + $timestamp + ".trn", "File");           
                $backup.BackupSetDescription = "Log backup of " + $db.Name + " " + $timestamp;           
                #Specify that the log must be truncated after the backup is complete.           
                $backup.LogTruncation = "Truncate";
                # Starting log backup process           
                $backup.SqlBackup($srv);           
            };           
    };
};           
Write-Output ("Finished at: " + (Get-Date -format  yyyy-MM-dd-HH:mm:ss));

Путём мануалов и манипуляций всё стало проще.
code_language.powershell:
Param([switch]$Log,[switch]$Full);
$Server = ".\ARTZVITSQLSERVER";
$Database = "artzvit";
$Dest = "z:\";
$daysToStoreBackups = 3;

$TimeStamp = Get-Date -format yyyy-MM-dd-HH-mm-ss;

Get-ChildItem "$Dest\$Database\*" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreBackups)} |% {Remove-Item $_ -force }
"Removed all previous backups older than $daysToStoreBackups days"

If($Full)
{
    $BackupFile = $Dest + $Database + "\full_" + $TimeStamp + ".bak";
    Write-Output ("Started full backup at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
    Backup-SqlDatabase -ServerInstance $Server -Database $Database -BackupFile $BackupFile
    Write-Output ("Finished at: " + (Get-Date -format  yyyy-MM-dd-HH:mm:ss));
    Exit 0;
}

If($Log)
{
    $BackupFile = $Dest + $Database + "\log_" + $TimeStamp + ".trn";
    Write-Output ("Started truncation journal backup at: " + (Get-Date -format yyyy-MM-dd-HH:mm:ss));
    Backup-SqlDatabase -ServerInstance $Server -Database $Database -BackupFile $BackupFile -BackupAction Log
    Write-Output ("Finished at: " + (Get-Date -format  yyyy-MM-dd-HH:mm:ss));
    Exit 0;
}

Write-Output ("Error! You MUST specify -Full or -Log key! Stopping... ");
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Будьте очень осторожны с опечатками в номерах.
<?php echo 0230; выведет не 230, как может показаться, а 152. Потому что посчитает, что это ввод в восьмеричной системе.
 

k880TR

Интересующийся
📜
Сообщения
70
Реакции
11

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Можно проследить, как более-менее ровная структура движка 20-50 обрезалась, когда из привата вырезали локации чтобы отдать порезанный паблик. И как потом люди её насиловали, добавляя кучу id наугад, вперемешку, лишь бы не совпало с тем, что уже есть. :)
Сводил в один файл - поржал. :)
PHP:
private static $roomFileNames = [
        20 => 'city.php',
        21 => 'city.php',
        22 => 'shop.php',
        23 => 'repair.php',
        25 => 'comission.php',
        26 => 'city.php',
        27 => 'post.php',
        29 => 'bank.php',
        30 => 'clan_create.php',
        31 => 'tower.php',
        34 => 'fshop.php',
        37 => 'gotzamok.php',
        50 => 'ashop.php',
        51 => 'city.php',
        61 => 'akadem.php',
        650 => 'ul_clans.php',
        1055 => 'group_arena.php',
        620 => 'enter_cave.php',
        666 => 'jail.php',
        2655 => 'city.php',
        1051 => 'lab_enter.php',
        404 => 'vxod.php',
        2111 => 'city.php',
        402 => 'lab_chaos_enter.php',
        2601 => 'city.php',
        603 => 'aren_of_angels.php',
        660 => 'hostel.php',
        777 => 'obshaga.php',
        401 => 'hell.php',
    ];
 

Bayer

Специалист
⚖️
🏆
📜
Сообщения
731
Реакции
248
Можно проследить, как более-менее ровная структура движка 20-50 обрезалась, когда из привата вырезали локации чтобы отдать порезанный паблик. И как потом люди её насиловали, добавляя кучу id наугад, вперемешку, лишь бы не совпало с тем, что уже есть. :)
Сводил в один файл - поржал. :)
PHP:
private static $roomFileNames = [
        20 => 'city.php',
        21 => 'city.php',
        22 => 'shop.php',
        23 => 'repair.php',
        25 => 'comission.php',
        26 => 'city.php',
        27 => 'post.php',
        29 => 'bank.php',
        30 => 'clan_create.php',
        31 => 'tower.php',
        34 => 'fshop.php',
        37 => 'gotzamok.php',
        50 => 'ashop.php',
        51 => 'city.php',
        61 => 'akadem.php',
        650 => 'ul_clans.php',
        1055 => 'group_arena.php',
        620 => 'enter_cave.php',
        666 => 'jail.php',
        2655 => 'city.php',
        1051 => 'lab_enter.php',
        404 => 'vxod.php',
        2111 => 'city.php',
        402 => 'lab_chaos_enter.php',
        2601 => 'city.php',
        603 => 'aren_of_angels.php',
        660 => 'hostel.php',
        777 => 'obshaga.php',
        401 => 'hell.php',
    ];
Ля, циклы же это основы разве нет?
Из базы подтянул и вывел.

Ну а про scandir какой нибудь я вообще помолчу лучше =) (PHP: scandir - Manual)
И то что можно более понятнее привязать имя локации к файлу тоже не стоит говорить.


Код писали дети в подвалах.
 

k880TR

Интересующийся
📜
Сообщения
70
Реакции
11
Вообще в идеале все локации можно было бы сделать в одном файле, а не рассирать файлами типа cp1.php, cp2.php и так далее, но до этого не дошло)
 

oxy

Знаток
🏆
📜
Сообщения
424
Реакции
101
Вообще в идеале все локации можно было бы сделать в одном файле, а не рассирать файлами типа cp1.php, cp2.php и так далее, но до этого не дошло)
А вот тут не согласен. Есть такой подход как абстрактная фабрика. И это заметно упрощает добавление и работу с новыми локациями. По тому много файлов это не всегда плохо... Но это не случай БК))))))))
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Ля, циклы же это основы разве нет?
Из базы подтянул и вывел.

Ну а про scandir какой нибудь я вообще помолчу лучше =) (PHP: scandir - Manual)
И то что можно более понятнее привязать имя локации к файлу тоже не стоит говорить.


Код писали дети в подвалах.
Ненене, в одну переменную это уже я их свёл. Я просто выкусывал эти данные отовсюду: там строчка, там две... Причём воткнуто в переменную, потому что ниже функция работает с этим:
header('location: ' . self::$roomFileName[$roomId]);

В базу я из заносить не хочу по причине нахера. Это статические, никогда не изменяемые данные в игровом процессе. Зачем подвязывать туда БД?
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Ода мамкиным оптимизаторам. Два года оно меня не смущало, сейчас вдруг всмотрелся и взоржал. Берём любой первый попавшийся файл:
PHP:
<?php
session_start();
if (empty($_SESSION['uid'])) {
    header("Location: index.php");
    exit;
}
include 'functions.php';
if ($user->room != 30) {
    header("Location: main.php");
    exit;
}
#...

Нахуя там if (empty($_SESSION['uid'])) спросите себя вы, как спрашивал себя я? Ответ напрашивался: чтобы когда ты не в игре, бла-бла, ты не мог запустить файл, бла-бла. Казалось бы.
Но если сходить в include 'functions.php';? Правильно, первые же строки:
PHP:
<?php
if (empty($_SESSION['uid'])) {
    exit('ERROR!');
}
include 'config.php';
#...

Та твою ж мать! :eek:
Сейчас у меня каждый второй php-файл похудеет... :)
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Вдогонку. В каждом сраном файле:
PHP:
if ($user->battle) {
    header('location: fbattle.php');
    exit;
}

if ($user->in_tower == 1) {
    header('Location: towerin.php');
    exit;
}

if ($user->room != 29) {
    header("Location: main.php");
    exit;
}
Вместо этого в одном подключаемом месте или прямо в functions что-то по шаблону:
PHP:
if ($user->battle && !basename('fbattle.php')) {
    header('location: fbattle.php');
    exit;
}
if ($user->room == 29 && !basename('bank.php')) {
    header('location: main.php');
    exit;
}
Задача неожиданно оказалась интереснее чем на первый взгляд. Что мы хотим?
  1. Чтобы все проверки там ли я нахожусь лежали в одном файле.
  2. Чтобы нельзя было открывать комнаты в которых не находишься новом окне.
  3. Что бы не распространялось на комнаты, в которых ты находишься. Это, как бы, тоже некрасиво, но можно временно пренебречь и оставить на потом.
  4. Чтобы не распространялось на совершенно левые файлы, которые к этим комнатам не имеют никакого отношения.
Нам понадобится два массива:
  • массив ID-номеров комнат, которые будут проверяться
  • массив соответствий ID-номеров комнат игровым файлам

PHP:
$roomsCheck = [1, 2, 3, 5];
$roomsFiles = [
    1 => 'file1.php',
    2 => 'file2.php',
    3 => 'file3.php',
    5 => 'file5.php',
]

# $user['room'] - номер комнаты в которой находится игрок.
# pathinfo(debug_backtrace()[0]['file'])['basename'] - имя файла на который смотрит игрок

//     Если я в одной из этих комнат,
// [И] Имя файла который инклюдит файл с проверкой не совпадает с именем файла локации в которой я нахожусь
// [И] Номер комнаты который я пытаюсь открыть есть в списке проверяемых

if (in_array($user['room'], $roomsCheck)
    && pathinfo(debug_backtrace()[0]['file'])['basename'] != $roomsFiles[$user['room']]
    && in_array(array_search(pathinfo(debug_backtrace()[0]['file'])['basename'], $roomsFiles), $roomsCheck)) {
    header('location: main.php');
    exit;
}

Логика построена на трех штуках:

TL;DR;
Первая: поиск ключа массива по его значению. Мы берём файл, в котором находимся и смотрим, есть ли в нашем массиве его упоминание. Если есть — мы молодцы.
Вторая: выкусывает имя файла из полного пути, превращая, например /www/htdocs/inc/lib/file2.php в file2.php.
Третья самая муторная. Она смотрит откуда пришёл вызов и врзвращает кучу данных о вызове. [0]['file'] значит, что мы взяли первую строчку массива, значение file.

Как это работает вживую:
PHP:
# Проверяем...
echo sprintf('<div style="background-color: aliceblue;">myRoom: %s<br>pathinfo-backtrace: %s<br>travel::roomName: %s<br>currentRoom: %s</div>',
    $user['room'],
    pathinfo(debug_backtrace()[0]['file'])['basename'],
    $roomsFiles[$user->room],
    array_search(pathinfo(debug_backtrace()[0]['file'])['basename'], $roomsFiles)
);

На живом примере, чтобы не писать отдельный код под эту задачу.
Вводная: Я, как игрок, нахожусь в файле clan_create.php (id: 30), проверка о которой всё это написано находится в файле functions.php. В отдельном окне у меня открыто bank.php (id: 29). Вместо перенаправления у меня используется слово "сорямба" для дебага.

clan_create.php (id: 30)
1604008960117.png

bank.php (id: 29)
1604008994489.png



Берите, пользуйтесь.
 
Последнее редактирование:

Bayer

Специалист
⚖️
🏆
📜
Сообщения
731
Реакции
248
Тоже вот по папкам на компудахтере погулял и нашёл вот такую штуку.
Код:
if (!empty($my_where_info['user_name'])) {

  $links = '<a class="light" href="/">My Blutbad</a>';

  switch ($self_adress) {
    case 'info':
        $blutbad_title = "My Blutbad $blutbad_title_sp ".$my_where_info['user_name'];
    break;
Код в 100 строк с хуйней
Это титлы для хтмэла в пэхнапэ файле который другой пэхнапэ вызывает в html вот так <title><?php echo $blutbad_title ?></title>
А ещё индекс разделён на 3 файла index_header.php, index_footer.php. Вот и зачем это все, это типа имитация шаблонов?
Зачем эти бессмысленные массивы и лишний хлам, а ещё смешивание php и html - ведь хэтэмэл загружается быстрее в разы.
Что хотят сделать авторы таких подходов я не понимаю.
Вот как надо делать шаблоны:
Это .tpl
Код:
<title>{title}</title>
   <div class="text">{text}</div>
Это пэхнапэ
Код:
$result = str_replace(
   array('{title}','{text}'),
   array('Главная страница','Наш текст'),
Templating("index.tpl")
);
    
echo $result;
 
Последнее редактирование:

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Нарвался у кого-то:
PHP:
if ($user['intel'] >= 4) {
        $user['intel'] = 61 + $user['intel'] - 4;
        if ($user['intel'] > 100) {
            $user['intel'] = 100;
        }
    } else {
        $user['intel'] = 0;
    }
Что? Как? Нахрена? Неизвестно...
 

Insallah

¯\_(ツ)_/¯
🏆
📜
Сообщения
1,501
Реакции
467
Оптимизация порой странная штука. Вот о чём думал человек?
PHP:
for ($i = 0; $i < 3; $i++) {
            if (!$abil[$i]) {
                $abil[$i] = 0;
            }
        }

Ради двух переменных...
 
Сверху