[Stats MySQL] Проверка кода, вопросы

Сообщения
1,015
Реакции
818
Помог
10 раз(а)
d3m37r4, Tranquillity, благодарю, в пиратки как я понял такого кеша нету? Ну я про 4554 билд который
24 Мар 2019
Кстати из всего мне придется экранировать только < остальное спец символы отобразились нормально в топе.
24 Мар 2019
Можно узнать версию клиента при коннекте?
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Лучше все экранировать
Скорее всего, но результат мне показал иначе, пока буду решать проблема по мере их поступления
(Занимаюсь само****, не буду ругаться)
24 Мар 2019
Снова проблема, на старенький билдиках. Не пойму, почему практически одинаковый код отображается в мотд по разному, а именно ширина таблицы во всю длинну.

Топ игроков отказался растягиваться.
2019-03-24_150610.png

А вот топ играющих живет нормально

2019-03-24_150545.png

Стиль одинаковый тык

Вывод мотд-окна вроде тоже одинаковый, если конечно снова не туплю на ровно месте.
Код корявый, шибко пока не ругайте =D Пока надо с мотд решить вопрос.

C++:
public ClCmdTop(const id) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "SELECT * FROM %s ORDER BY Skill DESC",
        SQL_TABLE
    );
 
    new aData[2]; aData[0] = SQL_GETTOP; aData[1] = id;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
C++:
        case SQL_GETTOP: {
            Logging(g_sLogsDir, "stats_inform_", "^"[SQL_GETTOP] Queue Time %f^"", fQueueTime);
         
            new sMotd[MOTD_STRLEN], sTableRowClass[TABLE_ROW_CLASS_STRLEN], iLen, iPos;
         
            iLen = formatex(sMotd[iLen], charsmax(sMotd),
                "<meta charset=utf-8> \
                <link href=^"http://filestorage.gmforce.ru/game-force/players_stats/stats.css^" rel=stylesheet type=text/css> \
                <body> \
                <div>Топ лучших игроков</div></br> \
                <table> \
                <tr> \
                <th width=3%%># \
                <th width=37%%>Игрок \
                <th width=12%%>Убийств \
                <th width=12%%>Смертей \
                <th width=12%%>В голову \
                <th width=12%%>Скилл \
                <th width=12%%>Уровень"
            );
         
            while(SQL_MoreResults(hQuery)) {
                new sPlayerName[PLAYER_NAME_STRLEN * 3], iKills, iDeaths, iHead, Float:fSkill;
             
                SQL_ReadResult(hQuery, 1, sPlayerName, charsmax(sPlayerName));
             
                iKills = SQL_ReadResult(hQuery, 2);
                iDeaths = SQL_ReadResult(hQuery, 3);
                iHead = SQL_ReadResult(hQuery, 4);
                SQL_ReadResult(hQuery, 5, fSkill);
             
                iPos++;
                sTableRowClass = (iPos % 2) ? "b" : "";
             
                new sSkillName[SKILL_NAME_STRLEN];
                sSkillName = GetSkillName(fSkill);
                replace(sSkillName, SKILL_NAME_STRLEN, "+", "p");
                replace(sSkillName, SKILL_NAME_STRLEN, "-", "m");
             
                replace(sPlayerName, charsmax(sPlayerName), "<", "&lt;");
             
                iLen += formatex(sMotd[iLen], charsmax(sMotd) - iLen,
                    "<tr class=%s><td>%d<td>%s<td>%d<td>%d<td>%d<td>%.0f<td class=%s>",
                    sTableRowClass, iPos, sPlayerName, iKills, iDeaths, iHead, fSkill, sSkillName
                );
                SQL_NextRow(hQuery);
            }
            new id = aData[1];
            show_motd(id, sMotd, "Топ игроков");
        }

C++:
public ClCmdHot(const id) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "SELECT * FROM %s ORDER BY Skill DESC",
        SQL_TABLE
    );
 
    new aData[2]; aData[0] = SQL_GETHOT; aData[1] = id;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
C++:
        case SQL_GETHOT: {
            Logging(g_sLogsDir, "stats_inform_", "^"[SQL_GETHOT] Queue Time %f^"", fQueueTime);
         
            new sMotd[MOTD_STRLEN], sTableRowClass[TABLE_ROW_CLASS_STRLEN], iLen, iPos, iRank;
         
            iLen = formatex(sMotd[iLen], charsmax(sMotd),
                "<meta charset=utf-8> \
                <link href=^"http://filestorage.gmforce.ru/game-force/players_stats/stats.css^" rel=stylesheet type=text/css> \
                <body> \
                <div>Топ играющих игроков</div></br> \
                <table> \
                <tr> \
                <th width=3%%># \
                <th width=37%%>Игрок \
                <th width=12%%>Убийств \
                <th width=12%%>Смертей \
                <th width=12%%>В голову \
                <th width=12%%>Скилл \
                <th width=12%%>Уровень"
            );
         
            new aPlayersID[MAX_PLAYERS], iPlayersNum;
            get_players_ex(aPlayersID, iPlayersNum, GetPlayers_ExcludeBots | GetPlayers_ExcludeHLTV);
         
            while(SQL_MoreResults(hQuery)) {
                new sAuthID[AUTHID_STRLEN], sAuthIDTemp[AUTHID_STRLEN], sPlayerName[PLAYER_NAME_STRLEN * 3], iKills, iDeaths, iHead, Float:fSkill;
                SQL_ReadResult(hQuery, 0, sAuthID, charsmax(sAuthID));
             
                iRank++;
             
                for(new i; i < iPlayersNum; i++) {
                    get_user_authid(aPlayersID[i], sAuthIDTemp, charsmax(sAuthIDTemp));
                 
                    if(equal(sAuthID, sAuthIDTemp)) {
                        iPos++;
                     
                        SQL_ReadResult(hQuery, 1, sPlayerName, charsmax(sPlayerName));
                        iKills = SQL_ReadResult(hQuery, 2);
                        iDeaths = SQL_ReadResult(hQuery, 3);
                        iHead = SQL_ReadResult(hQuery, 4);
                        SQL_ReadResult(hQuery, 5, fSkill);
                     
                        sTableRowClass = (iPos % 2) ? "b" : "";
                     
                        new sSkillName[SKILL_NAME_STRLEN];
                        sSkillName = GetSkillName(fSkill);
                        replace(sSkillName, SKILL_NAME_STRLEN, "+", "p");
                        replace(sSkillName, SKILL_NAME_STRLEN, "-", "m");
                     
                        replace(sPlayerName, charsmax(sPlayerName), "<", "&lt;");
                     
                        iLen += formatex(sMotd[iLen], charsmax(sMotd) - iLen,
                            "<tr class=%s><td>%d<td>%s<td>%d<td>%d<td>%d<td>%.0f<td class=%s>",
                            sTableRowClass, iRank, sPlayerName, iKills, iDeaths, iHead, fSkill, sSkillName
                        );
                    }
                }
                SQL_NextRow(hQuery);
            }
            new id = aData[1];
            show_motd(id, sMotd, "Топ играющих");
24 Мар 2019
Забыл уточнить, две команды с одинаковым стилем рисуются по разному на одной и той же пиратской версии 4554
 
  • Нравится
Реакции: ifx
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Решил проблемы с отображением стиля на разных версиях клиента.

Снова невнимательность, во всю длину не растягивалась из-за двойного процента: width: 100%%;
Отступы вокруг ячеек убрал: border-collapse: collapse;

С округлением шапки не стал заморачиваться и просто отредактировал саму картинку.
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Напомните пожалуйста, максимальную длинну запроса SQL
 
Сообщения
1,667
Реакции
1,489
Помог
24 раз(а)
Gudaus, спасибо за 404
 
Сообщения
1,667
Реакции
1,489
Помог
24 раз(а)
Gudaus, нет, это задача сайта.
Вы не знали?
 
Сообщения
1,667
Реакции
1,489
Помог
24 раз(а)
Gudaus, с телефона заходил, не работала.
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Как эти два запроса в один объединить? Что-то туплю сижу.

C++:
SQLInsert(const iVictim, const iKiller) {
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iKiller][PD_KILLS], g_eSQLData[iKiller][PD_DEATHS],
        g_eSQLData[iKiller][PD_HEAD], g_eSQLData[iKiller][PD_SKILL], g_eSQLData[iKiller][PD_AUTHID]
    );
    
    new aData[2]; aData[0] = SQL_UPDATE;
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
    
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iVictim][PD_KILLS], g_eSQLData[iVictim][PD_DEATHS],
        g_eSQLData[iVictim][PD_HEAD], g_eSQLData[iVictim][PD_SKILL], g_eSQLData[iVictim][PD_AUTHID]
    );
    
    SQL_ThreadQuery(g_hSQLTuple, "QueryHandler", g_sSQLQuery, aData, sizeof(aData));
}
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Javekson, сформатируй всё в один буфер, разделив ';', и выполняй. Но такой вариант подойдёт только в том случае, если ты не ждёшь "успешного" статуса выполнения (ответа в каллбек sql-запроса).
 
Сообщения
207
Реакции
420
Помог
10 раз(а)
Ещё можно выкрутиться через CASE. Но, честно, не проверял.

SQL:
UPDATE
  %s
SET
  `Kills` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Deaths` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Head` = CASE
    WHEN `authid` = '%s' THEN %d
    WHEN `authid` = '%s' THEN %d
  END,

  `Skill` = CASE
    WHEN `authid` = '%s' THEN %f
    WHEN `authid` = '%s' THEN %f
  END

WHERE
  `authid` IN ('%s', '%s');
Смысла от объединения двух UPDATE в один, как по мне, нет.
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
BlackSignature, типа так?

Код:
    formatex(g_sSQLQuery, charsmax(g_sSQLQuery),
        "UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s';
        UPDATE %s SET Kills = %d, Deaths = %d, Head = %d, Skill = %f WHERE AuthID = '%s'",
        SQL_TABLE, g_eSQLData[iKiller][PD_KILLS], g_eSQLData[iKiller][PD_DEATHS],
        g_eSQLData[iKiller][PD_HEAD], g_eSQLData[iKiller][PD_SKILL], g_eSQLData[iKiller][PD_AUTHID],
        SQL_TABLE, g_eSQLData[iVictim][PD_KILLS], g_eSQLData[iVictim][PD_DEATHS],
        g_eSQLData[iVictim][PD_HEAD], g_eSQLData[iVictim][PD_SKILL], g_eSQLData[iVictim][PD_AUTHID]
    );
29 Мар 2019
Может правда лучше не замарачиваться над этим, просто думал об "оптимизации", а именно сделать пакетную отправку запроса.
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Javekson, Это ты при событии килла сразу данные отсылаешь? Если так (и тебя не заботит успешность выполнения обоих запросов), то такой вариант оправдан. 1 форматекс вместо 2, 1 тредквери вместо 2.
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Это ты при событии килла сразу данные отсылаешь?
Да

Если так (и тебя не заботит успешность выполнения обоих запросов)
Не совсем понял об успешности запроса, под этой фразой подразумевается то, что запрос может не дойти или то, что в обработчики я не произвожу никаких действий с ответом?
29 Мар 2019
И еще вопрос, я же правильно понимаю, что HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Не совсем понял об успешности запроса, под этой фразой подразумевается то, что запрос может не дойти или то, что в обработчики я не произвожу никаких действий с ответом?
Если один фейланется из двух то фейланутся два одновременно
29 Мар 2019
И еще вопрос, я же правильно понимаю, что HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
Если очень грубо то да
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
HC_CONTINUE = PLUGIN_CONTINUE по своей сути?
Это просто "именованные цифры".

Код:
/**
 * Return codes
 */
#define PLUGIN_CONTINUE     0   /* Results returned by public functions */
#define PLUGIN_HANDLED      1   /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2   /* to use in client_command(), continue all plugins but stop the command */
Код:
/**
* Hookchain return types
*/
enum
{
	HC_CONTINUE = 0, // Plugin didn't take any action
	HC_SUPERCEDE,    // Skip real function, use my return value
	HC_BREAK         // Skip all forwards and real function, use my return value
                     // @note Warning: Be very careful, using this type of return will skip calls for all following AMXX plugins
};
т.е. 0, 1, 2
 
Сообщения
1,015
Реакции
818
Помог
10 раз(а)
Снова магия ребят ))
SELECT COUNT(*) FROM stats WHERE Skill > 104.61 ORDER BY Skill DESC

Почему в результате 1 висит? )) Когда по сути 0 должно быть.

Результат
2019-04-08_160906.png

Табличка
2019-04-08_160915.png
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу