Код:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <time>
#include <reapi>
const TASK_LOAD_CONFIG = 518232;
const TASK_LOAD = 158716;
/* Настройки */
#define SQL_HOST "" // Хост базы данных
#define SQL_DATEBASE "" // База данных
#define SQL_USER "" // Пользователь базы данных
#define SQL_PASSWORD "" // Пароль от базы данных
#define SERVER_ID 4 // id сервера
#define SQL_TABLE "" // Таблица с админами
#define SQL_TABLE_SERVERS "" // Таблица для активации админов
#define PLUGIN_PREFIX "Online" // Префикс перед сообщениями в чате и в логах
#define COMMAND "promocode" // Команда для ввода промокода
//#define SEE_MENU // (*) Показ меню после первой смерти.
#if defined SEE_MENU
new bool:g_bSeeMotd[33];
new KEYSMENU = (1<<4)|(1<<9);
#endif
enum _:eData_Codes { PROMOCODE[64], ACCESS[64], TIME };
new aDataCodes[eData_Codes];
enum _:TOTAL_SQL_TYPES { SQL_TYPE_INSERT, SQL_TYPE_IGNORE }
new Handle:g_hSqlTuple;
new g_szSteamID[MAX_PLAYERS + 1][34];
new g_szLogFile[PLATFORM_MAX_PATH];
public plugin_init() {
register_plugin("Promocode", "0.1", "AlexandrFiner");
register_clcmd(COMMAND, "Command_Promcode");
register_clcmd("say /promo", "Open_PromoMenu");
register_clcmd("say_team /promo", "Open_PromoMenu");
register_menucmd(register_menuid("Open_PromoMenu"), 1023, "Close_PromoMenu");
register_dictionary("time.txt");
#if defined SEE_MENU
RegisterHookChain(RG_CBasePlayer_Killed, "player_kill", true);
register_menu("Menu_Server", KEYSMENU, "Menu_Server");
#endif
}
public client_putinserver(id)
get_user_authid(id, g_szSteamID[id], charsmax(g_szSteamID[]));
public plugin_cfg() {
new szDir[] = "addons/amxmodx/logs/promocode";
if(!dir_exists(szDir)) {
mkdir(szDir);
}
new szDate[16]; get_time("%Y%m%d", szDate, charsmax(szDate));
formatex(g_szLogFile, charsmax(g_szLogFile), "%s/log_%s.txt", szDir, szDate);
SQL_SetAffinity("mysql");
g_hSqlTuple = SQL_MakeDbTuple(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DATEBASE);
}
#if defined SEE_MENU
public player_kill(victim)
{
if(!is_user_connected(victim)) {
return;
}
if(!g_bSeeMotd[victim]) {
static menu[1024], len;
len = formatex(menu[len], charsmax(menu) - len, "\rХочешь узнать как получить бесплатно VIP?^n^n");
len += formatex(menu[len], charsmax(menu) - len, "\r5. \yДа, Я хочу VIP :)^n");
len += formatex(menu[len], charsmax(menu) - len, "\r0. \yВыход");
show_menu(victim, KEYSMENU, menu, -1, "Menu_Server");
}
g_bSeeMotd[victim] = true;
}
public Menu_Server(victim, key) {
switch(key) {
case 4: {
if(is_user_connected(victim)) {
show_motd(victim, "forum.txt", "Forum");
}
}
}
}
public client_disconnected(id)
{
g_bSeeMotd[id] = false;
}
#endif
public SQL_Handler(iFailState, Handle:sqlQuery, const szError[], iError, const szData[], iDataSize) {
switch(iFailState)
{
case TQUERY_CONNECT_FAILED:
{
log_amx("MySQL connection failed");
log_amx("[ %d ] %s", iError, szError);
if(iDataSize) {
log_amx("Query state: %d", szData[1]);
}
return;
}
case TQUERY_QUERY_FAILED:
{
new szLastQuery[512];
SQL_GetQueryString(sqlQuery, szLastQuery, charsmax(szLastQuery));
log_amx("MySQL query failed");
log_amx("[ %d ] %s", iError, szError);
log_amx("[ SQL ] %s", szLastQuery);
if(iDataSize) {
log_amx("Query state: %d", szData[1]);
}
return;
}
}
new iAuthType = szData[0];
switch(iAuthType)
{
case SQL_TYPE_INSERT:
{
new insertId = SQL_GetInsertId(sqlQuery);
new szQuery[512];
formatex(szQuery, charsmax(szQuery), "INSERT INTO `%s` (`admin_id`, `server_id`, `use_static_bantime`) VALUES ('%d', '%d', 'no')", SQL_TABLE_SERVERS, insertId, SERVER_ID);
new szDataNew[1]; szDataNew[0] = SQL_TYPE_IGNORE;
SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, szDataNew, sizeof szDataNew);
server_cmd("amx_reloadadmins");
}
}
}
public plugin_precache() {
load_config();
set_task_ex(60.0, "load_config", TASK_LOAD_CONFIG, .flags = SetTask_Repeat);
}
public load_config() {
new szPath[PLATFORM_MAX_PATH], szCfgFile[PLATFORM_MAX_PATH];
get_configsdir(szPath, charsmax(szPath));
formatex(szCfgFile, charsmax(szCfgFile), "%s/promocode.ini", szPath);
if(!file_exists(szCfgFile)) {
set_fail_state("[Промокоды] Файл %s не найден.", szCfgFile);
return;
}
new iConfig = fopen(szCfgFile, "rt");
if(iConfig)
{
new szBuffer[512], szTime[8];
while(!feof(iConfig))
{
fgets(iConfig, szBuffer, charsmax(szBuffer));
if(!szBuffer[0] || szBuffer[0] == ';')
continue;
parse(szBuffer,
aDataCodes[PROMOCODE], charsmax(aDataCodes[PROMOCODE]),
aDataCodes[ACCESS], charsmax(aDataCodes[ACCESS]),
szTime, charsmax(szTime)
);
aDataCodes[TIME] = str_to_num(szTime);
break;
}
fclose(iConfig);
}
}
public Command_Promcode(id) {
new szArg[32];
read_args(szArg, charsmax(szArg));
remove_quotes(szArg);
trim(szArg);
if(!strlen(szArg))
return PLUGIN_HANDLED;
if(equali(szArg, aDataCodes[PROMOCODE])) {
//if(get_user_flags(id) & read_flags(aDataCodes[PROMOCODE])) {
if(get_user_flags(id) & read_flags(aDataCodes[ACCESS])) {
client_print_color(id, print_team_red, "^4[%s] ^1Простите, но у вас ^3уже ^1есть эта привлегия^1.", PLUGIN_PREFIX);
return PLUGIN_HANDLED;
}
new iTime = 60 * aDataCodes[TIME];
//client_print_color(id, id, "^4[%s] ^1Вам ^4успешно ^1выдана услуга. Срок: ^3%d мин.", PLUGIN_PREFIX, aDataCodes[TIME]);
client_print_color(0, print_team_default, "^4[%s] ^1Игрок ^3%n ^1активировал ^4Promo VIP ^1на ^3%d ^1мин.", PLUGIN_PREFIX, id, aDataCodes[TIME]);
new iSysTime;
iSysTime = get_systime() + 7200;
new szQuery[512];
formatex
(
szQuery, charsmax(szQuery),
"\
INSERT INTO `%s` ( `access`, `flags`, `steamid`, `nickname`, `icq`, `created`, `expired`, `days`, `ashow`) VALUES ( '%s', 'ce', '%s', '%s', 'Промокод - %n', '%d', '%d', '1', '1') \
",
SQL_TABLE, aDataCodes[ACCESS], g_szSteamID[id], g_szSteamID[id], id, iSysTime, (iSysTime + iTime)
);
new szDataNew[1]; szDataNew[0] = SQL_TYPE_INSERT;
SQL_ThreadQuery(g_hSqlTuple, "SQL_Handler", szQuery, szDataNew, sizeof szDataNew);
log_to_file(g_szLogFile, "Актвация промокода (%s, %s, %d мин) - %n (%s)", aDataCodes[PROMOCODE], aDataCodes[ACCESS], aDataCodes[TIME], id, g_szSteamID[id]);
}
else client_print_color(id, print_team_red, "^4[%s] ^1Данный промокод ^3не найден^1 в базе.", PLUGIN_PREFIX);
return PLUGIN_HANDLED;
}
public Open_PromoMenu(id) {
new szMenu[512],
iLen = formatex(szMenu, charsmax(szMenu), "\yАктивировать промокод^n^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1. \wВвести промокод^n");
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0. \wВыход");
return show_menu(id, (1<<0|1<<9), szMenu, -1, "Open_PromoMenu");
}
public Close_PromoMenu(id, iKey) {
switch(iKey) {
case 0: {
client_cmd(id, "messagemode ^"%s^"", COMMAND);
client_print_color(id, id, "^4[%s] ^1Введите промо код и нажмите Enter.", PLUGIN_PREFIX);
}
case 9: return PLUGIN_HANDLED;
}
return Open_PromoMenu(id);
}