All streams
Search
Write a publication
Pull to refresh
19
0.9
Кашлак Андрей @andreymal

User

Send message
Если выбирать между 1.0.3 и 2.0, то 2.0 определённо лучше
Лайвстритоподобность подразумевает кастомизируемость, да
Они основаны на реальном времени разработки двух лайвстритоподобных сайтов, в связи с чем чуть ближе к реальности чем обычно)
Можно было бы хотя бы для приличия // TODO: переписать этот говнокод воткнуть.)

А тот ORM, который EntityORM, страшненький, неудивительно что не хочется его юзать. (Вообще, по моим грубым оценкам, CMS такого уровня можно накатать с нуля месяца за три, если не стесняться пользоваться сторонними батарейками.)
Справедливости ради, в 2.0 это, если верить грепу, единственное такое место, в 1.0.3 такого было побольше
Если приглядеться, можно заметить на скриншотах личку и 2014 год)
Копирую из исходного кода Livestreet 2.0 без изменений
Скрытый текст
/**
 * Объект маппера для работы с БД
 *
 * @package application.modules.topic
 * @since 1.0
 */
class ModuleTopic_MapperTopic extends Mapper
{
    /**
     * Строит строку условий для SQL запроса топиков
     *
     * @param array $aFilter Фильтр
     * @return string
     */
    protected function buildFilter($aFilter)
    {
        $sDateNow=date('Y-m-d H:i:s');
        $sWhere = '';
        if (isset($aFilter['topic_date_more'])) {
            $sWhere .= " AND t.topic_date_publish >  " . $this->oDb->escape($aFilter['topic_date_more']);
        }
        if (isset($aFilter['topic_slug'])) {
            $sWhere .= " AND t.topic_slug =  " . $this->oDb->escape($aFilter['topic_slug']);
        }
        if (isset($aFilter['topic_publish'])) {
            $sWhere .= " AND t.topic_publish =  " . (int)$aFilter['topic_publish'] . " AND t.topic_date_publish <= '{$sDateNow}' ";
        }
        if (isset($aFilter['topic_rating']) and is_array($aFilter['topic_rating'])) {
            $sPublishIndex = '';
            if (isset($aFilter['topic_rating']['publish_index']) and $aFilter['topic_rating']['publish_index'] == 1) {
                $sPublishIndex = " or topic_publish_index = 1 ) and ( topic_skip_index = 0 and b.blog_skip_index = 0 ";
            }
            if ($aFilter['topic_rating']['type'] == 'top') {
                $sWhere .= " AND ( t.topic_rating >= " . (float)$aFilter['topic_rating']['value'] . " {$sPublishIndex} ) ";
            } else {
                $sWhere .= " AND ( t.topic_rating < " . (float)$aFilter['topic_rating']['value'] . "  ) ";
            }
        }
        if (isset($aFilter['topic_new'])) {
            $sWhere .= " AND t.topic_date_publish >=  '" . $aFilter['topic_new'] . "'";
        }
        if (isset($aFilter['user_id'])) {
            $sWhere .= is_array($aFilter['user_id'])
                ? " AND t.user_id IN(" . implode(', ', $aFilter['user_id']) . ")"
                : " AND t.user_id =  " . (int)$aFilter['user_id'];
        }
        if (isset($aFilter['blog_id'])) {
            if (!is_array($aFilter['blog_id'])) {
                $aFilter['blog_id'] = array($aFilter['blog_id']);
            }
            $sBlogList = join("','", $aFilter['blog_id']);
            $sWhere .= " AND ( t.blog_id IN ('{$sBlogList}') ";
            $sWhere .= " OR t.blog_id2 IN ('{$sBlogList}') ";
            $sWhere .= " OR t.blog_id3 IN ('{$sBlogList}') ";
            $sWhere .= " OR t.blog_id4 IN ('{$sBlogList}') ";
            $sWhere .= " OR t.blog_id5 IN ('{$sBlogList}') ) ";
        }
        if (isset($aFilter['blog_type']) and is_array($aFilter['blog_type'])) {
            $aBlogTypes = array();
            foreach ($aFilter['blog_type'] as $sType => $aBlogId) {
                /**
                 * Позиция вида 'type'=>array('id1', 'id2')
                 */
                if (!is_array($aBlogId) && is_string($sType)) {
                    $aBlogId = array($aBlogId);
                }
                /**
                 * Позиция вида 'type'
                 */
                if (is_string($aBlogId) && is_int($sType)) {
                    $sType = $aBlogId;
                    $aBlogId = array();
                }

                $aBlogTypes[] = (count($aBlogId) == 0)
                    ? "(b.blog_type='" . $sType . "')"
                    : "(b.blog_type='" . $sType . "' AND t.blog_id IN ('" . join("','", $aBlogId) . "'))";
            }
            $sWhere .= " AND (" . join(" OR ", (array)$aBlogTypes) . ")";
        }
        if (isset($aFilter['topic_type'])) {
            if (!is_array($aFilter['topic_type'])) {
                $aFilter['topic_type'] = array($aFilter['topic_type']);
            }
            $sWhere .= " AND t.topic_type IN (" . join(",",
                    array_map(array($this->oDb, 'escape'), $aFilter['topic_type'])) . ")";
        }
        return $sWhere;
    }
}

И это у них называется ORM, ага
Не я, и я его к счастью не использую)
А почему те, кто запатчили, не делали пулл-реквестов — этого уже знать не могу
Тут нужно всё выкидывать и переписывать с нуля. На питоне.))
Я просто оставлю это здесь в качестве демонстрации уровня ответственности топикстартера и поддержки предыдущих версий



(плюс ещё две потенциальных sql-инъекции, но эксплуатировать их извне без сторонних плагинов нельзя, поэтому меня послали)


К слову, пароли даже в версии 2.0 (сейчас проверил по гитхабу) хэшируются в обычный md5 даже без соли. В 2017 году, ага.

В общем, народ, не используйте LiveStreet для мало-мальски серьёзных сайтов.
Предлагаю для таких случаев сохранять страничку с договором в web.archive.org при регистрации. На нотариально заверенный скриншот вряд ли потянет, но хоть что-то

UPD: пока меня модерировали, уже выше написали)
Какое-нибудь ФСБ или АНБ ни капельки не интересует, давал я разрешение или нет :)
Хз-хз, как раз про его читы я чаще всего и слышу)
А недоверие фатально для играбельности. Никакая лагокомпенсация не осилит вычислить движение вперёд, резко поменявшееся на торможение и движение назад.

толстая статья
Забавно, но именно её я в эту ветку и хотел скинуть в качестве подтверждения своих слов.)) Благо там прямым текстом написано:
Каждый раз когда вы пытаетесь узнать, получил ли кто-нибудь пулю, сервер просто возвращает всех игроков на правильные (с точки зрения задержки клиента) позиции, интерполирует время и наблюдает – получил кто пулю, или нет.

определением столкновений в Battlefield 3 занимается клиент, а не сервер


Да, я упустил в своих комментах, что хоть какие-то, но проверки таки есть, мой косяк. Тем не менее, простор для читерства всё ещё имеется (aimbot как минимум), и, насколько мне известно, читы таки процветают)
Тогда выстрел, выглядящий абсолютно точным на стороне клиента, может оказаться промахом на стороне сервера из-за лага, джиттера, неидеальности физического движка, столкновения с другим игроком (все ведь замечали возникающие при этом дёргания?), чего угодно ещё. Так что сервер вынужден доверять клиенту, чтобы стрелялка была хоть как-нибудь играбельной
Да что там, всю третьекваку в 2005-м зарубил на корню лично Кармак!!1
Не знаю, что за MMO, но как минимум в стрелялках без вычислений на клиенте нельзя вообще никак, вроде ещё Кармак по этому поводу ныл когда-то (пруфы затерялись)
Пожалуйста, не надо, я и на десктопе уже вдоволь настрадался с этими тормозящими и жрущими оперативу «веб-приложениями»™, автор теперь хочет чтобы я и на мобильнике страдал?

мы наблюдаем становление ботов
И как обычно игнорируется, что подобные боты существуют ещё с 80-х, я сам их клепал и юзал вместо браузера на мобильнике лет восемь назад будучи ещё школьником. (С музыкой, правда, боты раньше вроде не работали, но всё-таки)
Обязательность мобильника мешает. Особенно для такой не шибко законной темы

Information

Rating
1,784-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity