Система промокодов

Уроки по созданию сервера и готовые решения
Ответить
Аватара пользователя
danilasar
Сообщения: 188
Зарегистрирован: 17 июл 2018, 09:55
Откуда: Саратов, Россия
Контактная информация:

Система промокодов

Сообщение danilasar » 04 окт 2018, 13:46

Доброго времени суток, поскольку многие из вас ищут систему промокодов, то я решил выложить её для вас.
Написанная не мною, вырезка из мода Just RP.
Для начала создадим диалог, ко всем дефайнам:

Код: Выделить всё

#define D_PROMO         15000
Ко всем forward:

Код: Выделить всё

forward ShowDPromo(playerid);
forward ShowAPromo(playerid);
forward ShowBPromo(playerid);
forward CreatePromo(playerid,code[]);
forward DeletePromo(playerid,code[]);
forward CheckPromo(playerid);
forward ActivatePromo(playerid,code[]);
Непосредственно сама команда:

Код: Выделить всё

cmd:pmenu(playerid, params[])
{
    if(GetString(GetName(playerid), NGA1) || GetString(GetName(playerid), NGA2) || GetString(GetName(playerid), NGA4))
    {
       ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,"{43A5DF}Меню промокодов","\
       1. Создать промокод \n\
       2. Действующие промокоды \n\
       3. Активированные промокоды \n\
       4. Заблокированные промокоды \n\
       {F66B6D}5. Заблокировать промокод \n\
       {F66B6D}6. Удалить промокод","Далее","Выход");
    }
    return true;
}
Ко всем диалогам:

Код: Выделить всё

case D_PROMO:
		{
		    if(!response) return 1;
		    switch(listitem)
		    {
		        case 0: ShowPlayerDialog(playerid,D_PROMO+1,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 1","{FFFFFF}Вам необходимо придумать промокод\nДлина промокода должна быть 6 символов, состоящая из цифр и букв латинского алфавита\n\nВведите промокод в строчку ниже:","Далее","Назад");
				case 1: mysql_function_query(dbHandle, "SELECT * FROM `promo` WHERE activate = '0' AND block = '0'", true, "ShowDPromo", "i", playerid);
				case 2: mysql_function_query(dbHandle, "SELECT * FROM `promo` WHERE activate = '1'", true, "ShowAPromo", "i", playerid);
				case 3: mysql_function_query(dbHandle, "SELECT * FROM `promo` WHERE block = '1'", true, "ShowBPromo", "i", playerid);
				case 4: ShowPlayerDialog(playerid,D_PROMO+2,DIALOG_STYLE_INPUT,"{F66B6D}Блокировка промокода","{FFFFFF}Введите ниже промокод, который хотите заблокировать:","Далее","Назад");
				case 5: ShowPlayerDialog(playerid,D_PROMO+3,DIALOG_STYLE_INPUT,"{F66B6D}Удаление промокода","{FFFFFF}Введите ниже промокод, который хотите удалить:","Далее","Назад");
			}
		}
		case D_PROMO+2:
		{
		    if(!response)
		    {
		        return ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,"{F2E70F}Меню промокодов","\
			    1. Создать промокод \n\
			    2. Действующие промокоды \n\
				3. Активированные промокоды \n\
				4. Заблокированные промокоды \n\
				{F66B6D}5. Заблокировать промокод \n\
				{F66B6D}6. Удалить промокод","Далее","Выход");
		    }
		    new qstring[128];
     		mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo` WHERE `name`='%s'", inputtext);
       	 	mysql_tquery(dbHandle, qstring, "BlockPromo", "is", playerid,inputtext);
		}
		case D_PROMO+3:
		{
		    if(!response)
		    {
		        return ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,"{F2E70F}Меню промокодов","\
			    1. Создать промокод \n\
			    2. Действующие промокоды \n\
				3. Активированные промокоды \n\
				4. Заблокированные промокоды \n\
				{F66B6D}5. Заблокировать промокод \n\
				{F66B6D}6. Удалить промокод","Далее","Выход");
		    }
   		    new qstring[128];
     		mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo` WHERE `name`='%s'", inputtext);
       	 	mysql_tquery(dbHandle, qstring, "DeletePromo", "is", playerid,inputtext);
		}
		case D_PROMO+1:
		{
		    if(!response)
		    {
		        ShowPlayerDialog(playerid,D_PROMO,DIALOG_STYLE_LIST,"{F2E70F}Меню промокодов","\
			    1. Создать промокод \n\
			    2. Действующие промокоды \n\
				3. Активированные промокоды \n\
				4. Заблокированные промокоды \n\
				{F66B6D}5. Заблокировать промокод \n\
				{F66B6D}6. Удалить промокод","Далее","Выход");
				return 1;
		    }
		    new totalstring[712];
		    if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid,D_PROMO+1,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 1","{FFFFFF}Вам необходимо придумать промокод\nДлина промокода должна быть 3 символов, состоящая из цифр и букв латинского алфавита\n\nВведите промокод в строчку ниже:","Далее","Назад");
			SetPVarString(playerid,"PROMO",inputtext);
			strcat(totalstring,"{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций\n\n{4AA9CF}Типы:\n");
			strcat(totalstring,"{FFFFFF}1. VIP аккаунт\n");
			strcat(totalstring,"2. Игровая валюта\n");
			strcat(totalstring,"3. Рубли\n\n");
			strcat(totalstring,"Если указан тип '1', то в качестве количества приза - указываете дни, в течении которых будет действовать VIP аккаунт\n");
			strcat(totalstring,"Если указаны типы '2' и '3', то соответственно указываете количество игровой валюты, и рублей для выигрыша.\n\n");
			strcat(totalstring,"{F6F7D8}Указывать все значения нужно через запятую!\n");
			strcat(totalstring,"Пример: 1,30,10\n");
			strcat(totalstring,"Где 1 - тип(VIP), 30 - кол-во дней, 10 - число активаций");
			ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 2",totalstring,"Далее","Назад");
		}
		case D_PROMO+4:
		{
		    new totalstring[512];
		    if(!response)
			{
			    strcat(totalstring,"{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций\n\n{4AA9CF}Типы:\n");
				strcat(totalstring,"{FFFFFF}1. VIP аккаунт\n");
				strcat(totalstring,"2. Игровая валюта\n");
				strcat(totalstring,"3. Рубли\n\n");
				strcat(totalstring,"Если указан тип '1', то в качестве количества приза - указываете дни, в течении которых будет действовать VIP аккаунт\n");
				strcat(totalstring,"Если указаны типы '2' и '3', то соответственно указываете количество игровой валюты, и рублей для выигрыша.\n\n");
				strcat(totalstring,"{F6F7D8}Указывать все значения нужно через запятую!\n");
				strcat(totalstring,"Пример: 1,30,10\n");
				strcat(totalstring,"Где 1 - тип приза(VIP), 30 - количество дней, 10 - число доступных активаций промокода");
				ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 2",totalstring,"Далее","Назад");
				return 1;
			}
			new numb[3];
			if(sscanf(inputtext, "p<,>iii",numb[0],numb[1],numb[2]))
			{
			    strcat(totalstring,"{FFFFFF}Теперь необходимо ввести тип приза, количество выигрыша, количество активаций\n\n{4AA9CF}Типы:\n");
				strcat(totalstring,"{FFFFFF}1. VIP аккаунт\n");
				strcat(totalstring,"2. Игровая валюта\n");
				strcat(totalstring,"3. Рубли\n\n");
				strcat(totalstring,"Если указан тип '1', то в качестве количества приза - указываете дни, в течении которых будет действовать VIP аккаунт\n");
				strcat(totalstring,"Если указаны типы '2' и '3', то соответственно указываете количество игровой валюты, и рублей для выигрыша.\n\n");
				strcat(totalstring,"{F6F7D8}Указывать все значения нужно через запятую!\n");
				strcat(totalstring,"Пример: 1,30,10\n");
				strcat(totalstring,"Где 1 - тип приза(VIP), 30 - количество дней, 10 - число доступных активаций промокода");
				ShowPlayerDialog(playerid,D_PROMO+4,DIALOG_STYLE_INPUT,"Создание промокода | {FE6060}Шаг: 2",totalstring,"Далее","Назад");
				return 1;
			}
			SetPVarInt(playerid,"TYPEPROMO",numb[0]),SetPVarInt(playerid,"AMOUNTPROMO",numb[1]),SetPVarInt(playerid,"ACTIVATEPROMO",numb[2]);
        	new qstring[128],promoname[16];
         	GetPVarString(playerid, "PROMO", promoname, sizeof(promoname));
         	mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo` WHERE `name`='%s'", promoname);
       	 	mysql_tquery(dbHandle, qstring, "CreatePromo", "is", playerid,promoname);
		}
case D_PROMO+5:
       	{
       	    if(!response) return 1;
       	 	new qstring[128];
       	 	SetPVarString(playerid, "CODE", inputtext);
            mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo_activations` WHERE `account_id` = '%d'",PI[playerid][pID]);
			mysql_tquery(dbHandle, qstring, "CheckPromo", "i", playerid);
       	}
В самый конец мода:

Код: Выделить всё

public ShowDPromo(playerid)
{
    new rows,fields;
    cache_get_data(rows, fields);
    if(!rows) return SendClientMessage(playerid, -1, "{2789FA}Ошибка: {FFFFFF}действующих промокодов не обнаружено.");
    new promolist[2000],code[24],priztext[24],string[100],typepriz,amountpriz,activate;
    strcat(promolist, "{2789FA}№:\t{FFFFFF}Промокод:\t{FFFFFF}Тип приза:\t{FFFFFF}Количество:\t{2789FA}Число активаций:\n");
    for(new i = 0; i < rows; i++)
    {
        cache_get_row(i, 0, code, dbHandle, 24);
		typepriz = cache_get_row_int(i, 5, dbHandle);
		amountpriz = cache_get_row_int(i, 6, dbHandle);
		activate = cache_get_row_int(i, 3, dbHandle);
		switch(typepriz)
		{
		    case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
		    case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
		    case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
		}
        format(string,sizeof(string),"{2789FA}%d  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{2789FA}%d\n", i+1, code, priztext,string, activate);
        strcat(promolist, string);
	}
    ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список действующих промокодов", promolist, "Закрыть", "");
    return 1;
}
public ShowAPromo(playerid)
{
    new rows,fields;
    cache_get_data(rows, fields);
    if(!rows) return SendClientMessage(playerid, -1, "{2789FA}Ошибка: {FFFFFF}активированных промокодов не обнаружено.");
    new promolist[2000],code[24],priztext[24],data[32],string[128],typepriz,amountpriz;
    strcat(promolist, "{2789FA}№:\t{FFFFFF}Промокод:\t{FFFFFF}Тип приза:\t{FFFFFF}Количество:\t{2789FA}Активирован:\n");
    for(new i; i < rows; i++)
    {
        cache_get_row(i, 0, code, dbHandle, 24);
		typepriz = cache_get_row_int(i, 5, dbHandle);
		amountpriz = cache_get_row_int(i, 6, dbHandle);
		cache_get_row(i, 4, data, dbHandle, 32);
		switch(typepriz)
		{
		    case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
		    case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
		    case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
		}
        format(string,sizeof(string),"{2789FA}%d  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{2789FA}%s\n", i+1, code, priztext,string, data);
        strcat(promolist, string);
    }
    ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список активированных промокодов", promolist, "Закрыть", "");
    return 1;
}
public ShowBPromo(playerid)
{
    new rows,fields;
    cache_get_data(rows, fields);
    if(!rows) return SendClientMessage(playerid, -1, "{43A5DF}Ошибка: {FFFFFF}заблокированных промокодов не обнаружено.");
    new promolist[2000],code[24],priztext[24],data[32],string[100],typepriz,amountpriz;
    strcat(promolist, "{2789FA}№:\t{FFFFFF}Промокод:\t{FFFFFF}Тип приза:\t{FFFFFF}Количество:\t{2789FA}Заблокирован:\n");
    for(new i; i < rows; i++)
    {
        cache_get_row(i, 0, code, dbHandle, 24);
		typepriz = cache_get_row_int(i, 5, dbHandle);
		amountpriz = cache_get_row_int(i, 6, dbHandle);
		cache_get_row(i, 4, data, dbHandle, 32);
		switch(typepriz)
		{
		    case 1: priztext = "VIP аккаунт", format(string,sizeof string, "%dдней",amountpriz);
		    case 2: priztext = "Игр. валюта", format(string,sizeof string, "%dруб.",amountpriz);
		    case 3: priztext = "Рубли", format(string,sizeof string, "%dруб.",amountpriz);
		}
        format(string,sizeof(string),"{2789FA}%d  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{FFFFFF}%s  \t{2789FA}%s\n", i+1, code, priztext,string, data);
        strcat(promolist, string);
    }
    ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_LIST,"{FFFFFF}Список заблокированных промокодов", promolist, "Закрыть", "");
    return 1;
}
public CreatePromo(playerid,code[])
{
    new rows,fields,string[256],typetext[24];
    cache_get_data(rows, fields);
    if(rows) return SendClientMessage(playerid,COLOR_ORANGE,"Промокод уже имеется в базе данных. Придумайте другой..");
	new type = GetPVarInt(playerid,"TYPEPROMO");
	switch(type)
	{
	    case 1: typetext = "VIP аккаунт";
	    case 2: typetext = "Игровая валюта";
	    case 3: typetext = "Рубли";
	}
	new amount = GetPVarInt(playerid,"AMOUNTPROMO");
	new totalactivate = GetPVarInt(playerid,"ACTIVATEPROMO");
    format(string,sizeof(string),"INSERT INTO `promo` (`name`,`typepriz`,`amountpriz`,`nactivations`) VALUES ('%s','%d','%d','%d')",code,type,amount,totalactivate);
   	mysql_function_query(dbHandle, string, false, "", "");
    format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно создан\n\n{FFFFFF}Тип выигрыша: {65A0D0}%d (%s)\n{FFFFFF}Количество выигрыша/дней: {65A0D0}%d\n{FFFFFF}Число доступных активаций: {65A0D0}%d",code,type,typetext,amount,totalactivate);
    ShowPlayerDialog(playerid, D_NULL, DIALOG_STYLE_MSGBOX, "Создание промокода | {FE6060}Финал", string, "Закрыть", "");

    return DeletePVar(playerid,"TYPEPROMO"),DeletePVar(playerid,"AMOUNTPROMO"),DeletePVar(playerid,"ACTIVATEPROMO"),DeletePVar(playerid,"PROMO");
}
public DeletePromo(playerid,code[])
{
    new rows,fields;
    cache_get_data(rows, fields);
    if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
	new string[512];
    format(string, sizeof(string), "DELETE FROM promo WHERE name = '%s'", code);
   	mysql_function_query(dbHandle, string, false, "", "");
    format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно удалён.",code);
    SendClientMessage(playerid,-1,string);
    return 1;
}
forward BlockPromo(playerid,code[]);
public BlockPromo(playerid,code[])
{
    new rows,fields;
    cache_get_data(rows, fields);
    if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
	new string[256];
	new hourss,minn,secc;
	gettime(hourss,minn,secc);
	format(string,100,"%s / %02d:%02d:%02d",date("%dd.%mm.%yyyy",gettime()),hourss,minn,secc);
    format(string, sizeof(string), "UPDATE promo SET `block`='1',`date`='%s' WHERE name='%s'", code, string);
   	mysql_function_query(dbHandle, string, false, "", "");
    format(string,sizeof(string),"{FFFFFF}Промокод {65A0D0}'%s' {FFFFFF}успешно заблокирован.",code);
    SendClientMessage(playerid,-1,string);
    return 1;
}
public CheckPromo(playerid)
{
    //new rows,fields;
    //cache_get_data(rows, fields);
	//if(rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}Вы уже активировали промокод, и не можете сделать это повторно.");
	new accid;
	accid = cache_get_row_int(0, 0, dbHandle);
    if(accid == PI[playerid][pID]) return SendClientMessage(playerid,-1,"{FE0000}Ошибка: {FFFFFF}Вы уже активировали этот промокод, повторная активация невозможна.");
    new qstring[128],code[16];
    GetPVarString(playerid,"CODE",code,sizeof(code));
	mysql_format(dbHandle, qstring, sizeof(qstring), "SELECT * FROM `promo` WHERE `name`='%s'", code);
 	mysql_tquery(dbHandle, qstring, "ActivatePromo", "is", playerid, code);
	return 1;
}
public ActivatePromo(playerid,code[])
{
    new rows,fields;
    cache_get_data(rows, fields);
    printf("Не существует 2");
    if(!rows) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокода не существует.");
	new typepriz,amountpriz,nactivations,string[512],activate,block,data[24],typetext[34],typetext1[24];
	new year,month,day;
	new current_date = getdate(year, month, day);
    for(new i; i < rows; i++)
    {
		typepriz = cache_get_row_int(i, 5, dbHandle);
		amountpriz = cache_get_row_int(i, 6, dbHandle);
		nactivations = cache_get_row_int(i, 3, dbHandle);
		activate = cache_get_row_int(i, 1, dbHandle);
		block = cache_get_row_int(i, 2, dbHandle);
		cache_get_row(i, 4, data, dbHandle, 24);
		switch(typepriz)
		{
		    case 1: typetext = "VIP аккаунт сроком на",typetext1 = " дней",PI[playerid][pVip] = 1,PI[playerid][pVipTime] = current_date + amountpriz;
	    	case 2: typetext = "Игровая валюта в количестве",typetext1 = " руб",GiveMoney(playerid,amountpriz);
	   	 	case 3: typetext = "Рубли в количестве",typetext1 = " кр.",PI[playerid][pCredits] += amountpriz;
		}
	}
	if(block > 0) return SendClientMessage(playerid,-1,"{43A5DF}Ошибка: {FFFFFF}промокод заблокирован.");
	if(activate != 0)
	{
	    format(string,sizeof(string),"{FFFFFF}Промокод '%s' {FFFFFF}уже активирован {65A0D0}%s\n{FFFFFF}К сожалению, Вы опоздали. Но ничего, получится в другой раз..",code,data);
		ShowPlayerDialog(playerid,D_NULL,DIALOG_STYLE_MSGBOX,"{FE0000}Ошибка",string,"Закрыть","");
		return true;
	}
	format(string,sizeof(string),"INSERT INTO `promo_activations` (`account_id`,`name_promo`) VALUES ('%d','%s')",PI[playerid][pID],code);
   	mysql_function_query(dbHandle, string, false, "", "");
	SendClientMessage(playerid,COLOR_ORANGE,"Поздравляем! Вы активировали промокод!");
	format(string,sizeof(string),"Промокод содержал: %s %d%s",typetext,amountpriz,typetext1),SendClientMessage(playerid,COLOR_ORANGE,string);
	nactivations--;
	format(string, sizeof(string), "UPDATE promo SET `nactivations`='%d' WHERE name='%s'", nactivations, code);
	mysql_function_query(dbHandle, string, false, "", "");
	if(nactivations == 0)
	{
	    new hourss,minn,secc;
		gettime(hourss,minn,secc);
		format(string,100,"%s / %02d:%02d:%02d",date("%dd.%mm.%yyyy",gettime()),hourss,minn,secc);
	    format(string, sizeof(string), "UPDATE promo SET `activate`='1',`date`='%s' WHERE name='%s'", string,code);
   		mysql_function_query(dbHandle, string, false, "", "");
   		//return SendClientMessage(playerid,-1,"{FE0000}Ошибка: {FFFFFF}количество активаций для промокода исчерпано.");
   		return true;
	}
	DeletePVar(playerid,"CODE");
    return 1;
}
И активация промокода в диалоговом окне (создаете сами, можете команду сделать, можете в меню игрока добавить):

Код: Выделить всё

new stringer[256];
strcat(stringer,"{FFFFFF}В данном окне, Вы сможете активировать промокод\n");
strcat(stringer,"{F2F195}Возможные призы: VIP, Деньги, Донат\n\n");
strcat(stringer,"{FFFFFF}Введите полученный промокод в окошко ниже:");
ShowPlayerDialog(playerid,D_PROMO+5,DIALOG_STYLE_INPUT,"{43A5DF}Активация промокода",stringer,"Далее","Отмена");
Ну и не забудьте выполнить вот такие SQL-запросы:

Код: Выделить всё

CREATE TABLE `promo` (
  `name` varchar(24) NOT NULL,
  `activate` int(11) NOT NULL,
  `block` int(11) NOT NULL,
  `nactivations` int(11) NOT NULL,
  `date` varchar(32) NOT NULL,
  `typepriz` int(11) NOT NULL,
  `amountpriz` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
CREATE TABLE `promo_activations` (
  `account_id` int(11) NOT NULL,
  `name_promo` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
Вот в общем-то и всё, если есть какие-то вопросы задавайте.
Автор данной системы, к сожалению, мне неизвестен.
Табуляцию я думаю выполните сами :)
Переделал: danilasar (то есть я)

Ответить