|
Суть системы та же: она будет удалять неактивные аккаунты, т.е. те аккаунты, владельцы которых не заходили на сервер более N-дней (указывается в макросе - define). Настройки: Настраивается система просто, на дефайнах. Там можно указать кол-во дней, за который аккаунт считается неактивным. Также на в дефайне нужно прописать таблицу с аккаунтами и поле с последней датой захода. Требования:
- Стандартный инклуд a_samp и прилагающиеся к нему библиотеки.
- Инклуд и плагин MySQL версии R-39. Можно легко перевести на более высокую версию.
- Немного мозгов и прямых рук.
Переходим к самой системе: Ко всем дефайнам:
Код #define N_DAYS 30 // кол-во дней, через которое аккаунт будет считаться неактивным #define N_TABLE "accounts" // таблица с аккаунтами #define N_FIELD "lastlogin" // поле с последним заходом игрока #define N_NAME "name" // поле с ником игрока
ВНИМАНИЕ! Поле с последним заходом должно быть уже создано в вашей базу данных, иначе система работать не будет.
Код Имя: lastlogin Тип: int Длина: 32 По умолчанию: нет Остальное не трогаем.
Идем в OnPlayerConnect и добавляем следующий код:
Код new query[150], name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, sizeof(name)); mysql_format(dbHandle, query, sizeof(query), "UPDATE "N_TABLE" SET "N_FIELD" = '%d' WHERE "T_NAME" = '%s'", gettime(), name);mysql_function_query(dbHandle, query, false, "", "");
Далее добавим в OnGameModeInit
Код public OnGameModeInit() { mysql_function_query(dbHandle, "SELECT * FROM "N_TABLE"", true, "CheckAccountDelete", ""); return true; }
Создаем паблик в конце мода:
Код forward CheckAccountDelete(); public CheckAccountDelete() { new rows, fields; cache_get_data(rows, fields); if(!rows) return print("В указанной таблице не обнаружено строк!"); new count, tick = GetTickCount(), lastlogin; for(new r; r<rows; r++) { lastlogin = cache_get_field_content_int(r, ""N_FIELD""); if(gettime()-lastlogin > N_DAYS*86400) { new name[MAX_PLAYER_NAME]; cache_get_field_content(r, ""N_NAME"", name, dbHandle, 24); mysql_format(dbHandle, query, sizeof(query), "DELETE FROM "N_TABLE" WHERE "N_NAME" = '%s'", name); mysql_function_query(dbHandle, query, false, "", ""); // удаляем аккаунт printf("Аккаунт с ником %s был удален из базы, так как прошло более %d дней с момента регистрации!", name, N_DAYS); count++; } } printf("ОБЩАЯ СТАТИСТИКА ОЧИСТКИ АККАУНТОВ: %d аккаунтов удалено, %d - время, за которое они очищены (мс)", %d - всего выполнений цикла (аккаунтов)", count, GetTickCount()-tick, rows); return true; }
ВНИМАНИЕ! Данная система может вызвать незапланированную нагрузку на сервер. Поэтому, рекомендуется применять данную систему ночью, когда игроков практически нет. Среднее время выполнения цикла for в 10 000 итераций (допустим, что у нас 10 000 аккаунтов) - 2 с.
Автор: @DEST и @stibs.
В ЛС не отвечу даже не старайтесь. Все вопросы на форум, создавайте тему там ответим.
|
|