Написание плагинов

Limbo

Участник
Сообщения
184
Реакции
34
Здравствуйте, прошу помощи в написание простенького плагина (можно на мат основе)
Требуется плагин который бы записывал игровое время проведённое на сервере., серверов 3.
И записывал бы в секундах все это в бд от gamecms в Таблица: users
Opera Снимок_2023-03-11_192305_phpmyadmin.cs-energy.su.png


Игры cs go и tf2
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Здравствуйте, прошу помощи в написание простенького плагина (можно на мат основе)
Требуется плагин который бы записывал игровое время проведённое на сервере., серверов 3.
И записывал бы в секундах все это в бд от gamecms в Таблица: users
Посмотреть вложение 110173

Игры cs go и tf2
Всю таблицу покажите
 

Limbo

Участник
Сообщения
184
Реакции
34
Всю таблицу покажите
-- --------------------------------------------------------

--
-- Структура таблицы `users`
--

CREATE TABLE `users` (
`id` int(7) NOT NULL,
`login` varchar(40) NOT NULL,
`password` varchar(250) NOT NULL,
`email` varchar(255) NOT NULL,
`route` varchar(32) DEFAULT NULL,
`regdate` datetime NOT NULL,
`avatar` varchar(255) NOT NULL,
`rights` varchar(10) NOT NULL DEFAULT '0',
`name` varchar(15) NOT NULL DEFAULT '---',
`nick` varchar(128) NOT NULL DEFAULT '---',
`skype` varchar(32) NOT NULL DEFAULT '---',
`discord` varchar(32) DEFAULT NULL,
`vk` varchar(30) NOT NULL DEFAULT '---',
`birth` date NOT NULL,
`signature` text NOT NULL,
`answers` int(4) DEFAULT 0,
`shilings` float NOT NULL,
`stickers` int(1) NOT NULL DEFAULT 0,
`thanks` int(5) DEFAULT 0,
`last_activity` varchar(20) NOT NULL DEFAULT '0000-00-00 00:00:00',
`dell` int(1) NOT NULL DEFAULT 0,
`last_topic` int(4) NOT NULL DEFAULT 0,
`reit` int(4) DEFAULT 0,
`proc` int(3) NOT NULL DEFAULT 0,
`steam_id` varchar(35) NOT NULL DEFAULT '0',
`steam_api` varchar(100) NOT NULL DEFAULT '0',
`vk_api` varchar(25) NOT NULL DEFAULT '0',
`fb` varchar(20) DEFAULT '0',
`fb_api` varchar(20) DEFAULT '0',
`active` int(1) NOT NULL DEFAULT 1,
`im` int(1) NOT NULL DEFAULT 1,
`telegram` varchar(50) NOT NULL DEFAULT '',
`prefix` varchar(30) DEFAULT '',
`game_time` int(11) NOT NULL DEFAULT 0,
`protect` int(1) NOT NULL DEFAULT 2,
`invited` int(7) DEFAULT 0,
`email_notice` int(1) NOT NULL DEFAULT 1,
`ip` varchar(64) NOT NULL DEFAULT '127.0.0.1',
`browser` varchar(32) DEFAULT NULL,
`multi_account` varchar(40) DEFAULT '0',
`gag` int(1) NOT NULL DEFAULT 2 COMMENT '1 - on, 2 - off',
`member_online` int(11) DEFAULT 0,
`game_money` int(11) DEFAULT 0,
`plugins_settings` varchar(512) DEFAULT '',
`ramka` varchar(255) DEFAULT '0',
`buyramka` int(1) DEFAULT 0,
`background` varchar(255) NOT NULL DEFAULT '0',
`buy_background` int(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Дамп данных таблицы `users`
--

INSERT INTO `users` (`id`, `login`, `password`, `email`, `route`, `regdate`, `avatar`, `rights`, `name`, `nick`, `skype`, `discord`, `vk`, `birth`, `signature`, `answers`, `shilings`, `stickers`, `thanks`, `last_activity`, `dell`, `last_topic`, `reit`, `proc`, `steam_id`, `steam_api`, `vk_api`, `fb`, `fb_api`, `active`, `im`, `telegram`, `prefix`, `game_time`, `protect`, `invited`, `email_notice`, `ip`, `browser`, `multi_account`, `gag`, `member_online`, `game_money`, `plugins_settings`, `ramka`, `buyramka`, `background`, `buy_background`) VALUES
(1, '✧ELITE✧', '9087f', 'csenergy.su', 'cs-energy', '2022-12-09 10:59:41', 'files/avatars/1678127390.jpg', '1', 'Виктор', '✧ELITE✧', '---', '✧ELITE✧#0209', '---', '1987-07-28', '', 2, 2000, 1, 0, '2023-03-11 15:24:26', 0, 2, 0, 5, 'STEAM_1:1:610728781', '76561199181723291', '0', '0', '0', 1, 1, '', '', 1592, 2, 0, 1, '185.210.140.82', 'ef27ba1d7630024b3b52f544f8191b05', '6:3', 2, 0, 0, '', 'frame16.png', 1, '18.jpg', 1);

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `users`
--
ALTER TABLE `users`
MODIFY `id` int(7) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=132;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
-- --------------------------------------------------------

--
-- Структура таблицы `users`
--

CREATE TABLE `users` (
`id` int(7) NOT NULL,
`login` varchar(40) NOT NULL,
`password` varchar(250) NOT NULL,
`email` varchar(255) NOT NULL,
`route` varchar(32) DEFAULT NULL,
`regdate` datetime NOT NULL,
`avatar` varchar(255) NOT NULL,
`rights` varchar(10) NOT NULL DEFAULT '0',
`name` varchar(15) NOT NULL DEFAULT '---',
`nick` varchar(128) NOT NULL DEFAULT '---',
`skype` varchar(32) NOT NULL DEFAULT '---',
`discord` varchar(32) DEFAULT NULL,
`vk` varchar(30) NOT NULL DEFAULT '---',
`birth` date NOT NULL,
`signature` text NOT NULL,
`answers` int(4) DEFAULT 0,
`shilings` float NOT NULL,
`stickers` int(1) NOT NULL DEFAULT 0,
`thanks` int(5) DEFAULT 0,
`last_activity` varchar(20) NOT NULL DEFAULT '0000-00-00 00:00:00',
`dell` int(1) NOT NULL DEFAULT 0,
`last_topic` int(4) NOT NULL DEFAULT 0,
`reit` int(4) DEFAULT 0,
`proc` int(3) NOT NULL DEFAULT 0,
`steam_id` varchar(35) NOT NULL DEFAULT '0',
`steam_api` varchar(100) NOT NULL DEFAULT '0',
`vk_api` varchar(25) NOT NULL DEFAULT '0',
`fb` varchar(20) DEFAULT '0',
`fb_api` varchar(20) DEFAULT '0',
`active` int(1) NOT NULL DEFAULT 1,
`im` int(1) NOT NULL DEFAULT 1,
`telegram` varchar(50) NOT NULL DEFAULT '',
`prefix` varchar(30) DEFAULT '',
`game_time` int(11) NOT NULL DEFAULT 0,
`protect` int(1) NOT NULL DEFAULT 2,
`invited` int(7) DEFAULT 0,
`email_notice` int(1) NOT NULL DEFAULT 1,
`ip` varchar(64) NOT NULL DEFAULT '127.0.0.1',
`browser` varchar(32) DEFAULT NULL,
`multi_account` varchar(40) DEFAULT '0',
`gag` int(1) NOT NULL DEFAULT 2 COMMENT '1 - on, 2 - off',
`member_online` int(11) DEFAULT 0,
`game_money` int(11) DEFAULT 0,
`plugins_settings` varchar(512) DEFAULT '',
`ramka` varchar(255) DEFAULT '0',
`buyramka` int(1) DEFAULT 0,
`background` varchar(255) NOT NULL DEFAULT '0',
`buy_background` int(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

--
-- Дамп данных таблицы `users`
--

INSERT INTO `users` (`id`, `login`, `password`, `email`, `route`, `regdate`, `avatar`, `rights`, `name`, `nick`, `skype`, `discord`, `vk`, `birth`, `signature`, `answers`, `shilings`, `stickers`, `thanks`, `last_activity`, `dell`, `last_topic`, `reit`, `proc`, `steam_id`, `steam_api`, `vk_api`, `fb`, `fb_api`, `active`, `im`, `telegram`, `prefix`, `game_time`, `protect`, `invited`, `email_notice`, `ip`, `browser`, `multi_account`, `gag`, `member_online`, `game_money`, `plugins_settings`, `ramka`, `buyramka`, `background`, `buy_background`) VALUES
(1, '✧ELITE✧', '9087f', 'csenergy.su', 'cs-energy', '2022-12-09 10:59:41', 'files/avatars/1678127390.jpg', '1', 'Виктор', '✧ELITE✧', '---', '✧ELITE✧#0209', '---', '1987-07-28', '', 2, 2000, 1, 0, '2023-03-11 15:24:26', 0, 2, 0, 5, 'STEAM_1:1:610728781', '76561199181723291', '0', '0', '0', 1, 1, '', '', 1592, 2, 0, 1, '185.210.140.82', 'ef27ba1d7630024b3b52f544f8191b05', '6:3', 2, 0, 0, '', 'frame16.png', 1, '18.jpg', 1);

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `users`
--
ALTER TABLE `users`
MODIFY `id` int(7) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=132;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
C++:
int time[MAXPLAYERS + 1];
Database db;

public void OnPluginStart()
{
    Database.Connect(Connection, "название секции в databases.cfg с подключением к gamecms");
}

public void Connection(Database hdb, const char[] error, any data)
{
    if(hdb != INVALID_HANDLE && !error[0]) db = hdb
}

public void OnClientPostAdminCheck(int client)
{
    if(0 < client && !IsFakeClient(client)) time[client] = GetTime();
}

public void OnClientDisconnected(int client)
{
    if(0 < client && !IsFakeClient(client))
    {
        char sQuery[256], sAuth[22];
        time[client] = GetTime() - time[client];
        GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
        SQL_FormatQuery(db, sQuery, sizeof(sQuery), "UPDATE `users` SET `game_time` = `game_time`+%i WHERE `steam_id`='%s'", time[client], sAuth);
        SQL_FastQuery(db, sQuery);    
    }
}
 
Последнее редактирование:

Limbo

Участник
Сообщения
184
Реакции
34
C++:
int time[MAXPLAYERS + 1];
Database db;

public void OnPluginStart()
{
    Database.Connect(Connection, "название секции в databases.cfg с подключением к gamecms");
}

public void Connection(Database hdb, const char[] error, any data)
{
    if(hdb != INVALID_HANDLE && !error[0]) db = hdb
}

public void OnClientPostAdminCheck(int client)
{
    if(0 < client && !IsFakeClient(client)) time[client] = GetTime();
}

public void OnClientDisconnected(int client)
{
    if(0 < client && !IsFakeClient(client)
    {
        char sQuery[256], sAuth[22];
        time[client] = GetTime() - time[client];
        GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
        SQL_FormatQuery(db, sQuery, sizeof(sQuery), "UPDATE `users` SET `game_time` = `game_time`+%i WHERE `steam_id`='%s'", time[client], sAuth);
        SQL_FastQuery(db, sQuery);   
    }
}
cs-go\sm_1.11_scripting\time.sp(22) : error 001: expected token: ")", but found "{"
//
// 1 Error.
//
// Compilation Time: 1,19 sec
// ----------------------------------------

Press enter to exit ...
 

DarkerZ

Участник
Сообщения
395
Реакции
175
C++:
int time[MAXPLAYERS + 1];
Database db;

public void OnPluginStart()
{
    Database.Connect(Connection, "название секции в databases.cfg с подключением к gamecms");
}

public void Connection(Database hdb, const char[] error, any data)
{
    if(hdb != INVALID_HANDLE && !error[0]) db = hdb
}

public void OnClientPostAdminCheck(int client)
{
    if(0 < client && !IsFakeClient(client)) time[client] = GetTime();
}

public void OnClientDisconnected(int client)
{
    if(0 < client && !IsFakeClient(client)
    {
        char sQuery[256], sAuth[22];
        time[client] = GetTime() - time[client];
        GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
        SQL_FormatQuery(db, sQuery, sizeof(sQuery), "UPDATE `users` SET `game_time` = `game_time`+%i WHERE `steam_id`='%s'", time[client], sAuth);
        SQL_FastQuery(db, sQuery);    
    }
}
Периодически желательно так же записывать данные, вдруг сервер крашнет
 

Limbo

Участник
Сообщения
184
Реакции
34
Ошибку пишет при компиляции
time.sp(22) : error 001: expected token: ")", but found "{"
так понял что то со скобкой где то?
Сообщения автоматически склеены:

Периодически желательно так же записывать данные, вдруг сервер крашнет
ага и правда !
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Периодически желательно так же записывать данные, вдруг сервер крашнет
Каждый раунд/каждую минуту выполнять запрос этот
Сообщения автоматически склеены:

Ошибку пишет при компиляции
time.sp(22) : error 001: expected token: ")", but found "{"
так понял что то со скобкой где то?
Сообщения автоматически склеены:


ага и правда !
Исправил
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Только после регистрации
Тогда с созданием транзакции возникнут проблемы, потому что при отправке в ней всех игроков в текущий момент, если хотя бы один не будет найден(если я правильно помню), то транзакция не произойдет. А если отправлять втупую все запросы и каждый по одному - это по оптимизации не очень кмк
 

Limbo

Участник
Сообщения
184
Реакции
34
Тогда с созданием транзакции возникнут проблемы, потому что при отправке в ней всех игроков в текущий момент, если хотя бы один не будет найден(если я правильно помню), то транзакция не произойдет. А если отправлять втупую все запросы и каждый по одному - это по оптимизации не очень кмк
а если вытащить значения из LR ?
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Palonez, @Palonez,
@Limbo,
C++:
int
    time[MAXPLAYERS + 1],
    user_id[MAXPLAYERS + 1];
  
Database g_hDatabase;

public void OnPluginStart()
{
    Database.Connect(ConnectCallBack, "gamecms");
    HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post);
}

public void ConnectCallBack(Database hDatabase, const char[] sError, any data)
{
    if (hDatabase == null) {
        SetFailState("Database failure: %s", sError);
        return;
    }

    g_hDatabase = hDatabase;
} 

public void OnClientPostAdminCheck(int client)
{
    static char szQuery[256], szAuth[64];
    if(0 < client && !IsFakeClient(client)) {
        GetClientAuthId(client, AuthId_Steam2, szAuth, sizeof(szAuth), true);
        FormatEx(szQuery, sizeof(szQuery), "SELECT `id` FROM `users` WHERE `steam_id` = '%s';", szAuth);
        g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(client));

        time[client] = GetTime();
    }
}

public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet hResults, const char[] sError, any iUserID)
{
    if(sError[0]) {
        LogError("SQL_Callback_SelectClient: %s", sError);
        return;
    }
  
    int client = GetClientOfUserId(iUserID);
    if(client) {
        if(hResults.FetchRow())    {
            user_id[client] = hResults.FetchInt(0);
        }
    }
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(!client) return;

    OnClientDisconnected(client);
}

public void OnClientDisconnected(int client)
{
    if(0 < client && !IsFakeClient(client) && user_id[client] > 0)
    {
        char szQuery[256], sAuth[64];
        time[client] = GetTime() - time[client];
        GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));

        FormatEx(szQuery, sizeof(szQuery),  "UPDATE `users` SET `game_time` = `game_time` + '%d' WHERE `id` = '%d'", time[client], user_id[client]);
        g_hDatabase.Query(SQL_Callback_SaveClient, szQuery, GetClientUserId(client));
    }
}

public void SQL_Callback_SaveClient(Database hDatabase, DBResultSet results, const char[] szError, any data)
{
    if(szError[0]) LogError("SQL_Callback_Save: %s", szError);
}

возможно так
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Palonez, @Palonez,
@Limbo,
C++:
int
    time[MAXPLAYERS + 1],
    user_id[MAXPLAYERS + 1];
 
Database g_hDatabase;

public void OnPluginStart()
{
    Database.Connect(ConnectCallBack, "gamecms");
    HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post);
}

public void ConnectCallBack(Database hDatabase, const char[] sError, any data)
{
    if (hDatabase == null) {
        SetFailState("Database failure: %s", sError);
        return;
    }

    g_hDatabase = hDatabase;
}

public void OnClientPostAdminCheck(int client)
{
    static char szQuery[256], szAuth[64];
    if(0 < client && !IsFakeClient(client)) {
        GetClientAuthId(client, AuthId_Steam2, szAuth, sizeof(szAuth), true);
        FormatEx(szQuery, sizeof(szQuery), "SELECT * FROM `users` WHERE `steam_id` = '%s';", szAuth);
        g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(client));

        time[client] = GetTime();
    }
}

public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet hResults, const char[] sError, any iUserID)
{
    if(sError[0]) {
        LogError("SQL_Callback_SelectClient: %s", sError);
        return;
    }
 
    int client = GetClientOfUserId(iUserID);
    if(client) {
        if(hResults.FetchRow())    {
            user_id[client] = hResults.FetchInt(0);
        }
    }
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(!client) return;

    OnClientDisconnected(client);
}

public void OnClientDisconnected(int client)
{
    if(0 < client && !IsFakeClient(client) && user_id[client] > 0)
    {
        char szQuery[152], sAuth[22];
        time[client] = GetTime() - time[client];
        GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));

        FormatEx(szQuery, sizeof(szQuery),  "UPDATE `users` SET `game_time` = `game_time` + '%d' WHERE `id` = '%d'", time[client], user_id[client]);
        g_hDatabase.Query(SQL_Callback_SaveClient, szQuery, GetClientUserId(client));
    }
}

public void SQL_Callback_SaveClient(Database hDatabase, DBResultSet results, const char[] szError, any data)
{
    if(szError[0]) LogError("SQL_Callback_Save: %s", szError);
}

возможно так
Зачем на 28 строке брать в запросе (*) все столбцы? Тогда FetchInt(0) не сработает, потому что в наборе результатов нужный столбец находится намного дальше, чем 0 индекс. Почему размер szQuery и szAuth, в разных местах указан по разному?
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
Зачем на 28 строке брать в запросе (*) все столбцы?
SELECT `id` FROM `users` WHERE `steam_id` = '%s';
Сообщения автоматически склеены:

Тогда FetchInt(0) не сработает
уверен?
Сообщения автоматически склеены:

Почему размер szQuery и szAuth, в разных местах указан по разному?
укажи сколько тебе надо.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
SELECT `id` FROM `users` WHERE `steam_id` = '%s';
А, проглядел, понял
Сообщения автоматически склеены:

укажи сколько тебе надо.
Причем тут это. Фактически они выполняют одно и тоже, а место выделяется разное
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Palonez, я не гонюсь за байтами, у меня нет такой привычки "оптимизации", просто видимо не заметил чтобы заменить, твой же код, добавил только получение ида

32-64-128-256
 
Сверху Снизу