Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал /bug - баг репорт

Richie56

Изучающий
Пользователь
Регистрация
1 Май 2014
Сообщения
611
Лучшие ответы
1
Репутация
205
Описание:​

"/bug" - работает как на вывод диалога так и принимает текст без диалога, из под команды.
"/buglist" - работает страницами, их количество не ограничено.
Столбец текст в "/buglist" в случаи если символов больше 30 сокращается, просмотреть полностью можно выбрав пункт.
Присутствует возможность удалить репорт выбрав его и нажав "Удалить".
Присутствует сохранение, а так же загрузка репортов из бд.


Скриншоты:​






Ко всем макросам:​
PHP:
#define MAX_BUGS 5000


Ко всем массивам:​
PHP:
new gBugDataName[MAX_BUGS][25];
new gBugDataText[MAX_BUGS][128];
new gBugDataDate[MAX_BUGS][20];
new playerBugListPage[MAX_PLAYERS];
new playerBugListItem[MAX_PLAYERS char];
new playerBugListData[MAX_PLAYERS][15];


Ко всем командам:​
PHP:
CMD:bug(playerid, params[])
{
	if(!params[0]) ShowPlayerDialog(playerid, 7771, DIALOG_STYLE_INPUT, "Баг репорт", "Опишите баг кратко и ясно, строка ограничина 128 символами, постарайтесь вместить:", "Принять", "Закрыть");
	else
	{
		if(strlen(params) < 10 || strlen(params) > 125) SendClientMessage(playerid, -1, "Описание должно содержать не менее 10 символов, и не более 125.");
		else
		{
			new id = -1;
		    for(new i; i < MAX_BUGS; i++) if(!gBugDataName[i][0]) { id = i; break; }
		    if(id == -1) SendClientMessage(playerid, -1, "Баг репорт переполнен.");
		    else
		    {
		        new year, month, day, hour, minute, second, string[260];
			    getdate(year, month, day);
			    gettime(hour, minute, second);

			    GetPlayerName(playerid, gBugDataName[id], 25);
			    strmid(gBugDataText[id], params, 0, strlen(params), 128);
			    format(gBugDataDate[id], 20, "%i/%i/%i %i:%i:%i", year, month, day, hour, minute, second);

			    format(string, sizeof(string), "INSERT INTO `bugs` (`id`, `name`, `text`, `date`) VALUES ('%i', '%s', '%s', '%s')", id, gBugDataName[id], gBugDataText[id], gBugDataDate[id]);
			    mysql_pquery(dbConnect, string);
			    SendClientMessage(playerid, -1, "Благодарим вас за найденный баг.");
			}
		}
	}
	return 1;
}
CMD:buglist(playerid, params[])
{
    playerBugListPage[playerid] = 1;
	ShowBugList(playerid);
    return 1;
}


Ко всем стокам:​
PHP:
stock ShowBugList(playerid)
{
    new text[128], header[32], string[1400] = "№\tИгрок\tДата\tТекст\n", count, next, id, page = playerBugListPage[playerid];
    for(new i; i < MAX_BUGS; i++) if(gBugDataName[i][0])
    {
        if(count >= (page * 15) 	&& count < (page * 15) + 15) next++;
        if(count >= (page - 1) * 15 && count < ((page - 1) * 15) + 15)
        {
	        strmid(text, gBugDataText[i], 0, strlen(gBugDataText[i]), 128);
	        if(strlen(text) > 30)
			{
				strdel(text, 28, strlen(text));
				strcat(text, "...");
			}
			playerBugListData[playerid][id++] = i;
	        format(string, sizeof(string), "%s%i\t%s\t%s\t%s\n", string, (i + 1), gBugDataName[i], gBugDataDate[i], text);
		}
		count++;
    }
	if(next) strcat(string, "Следующая страница\n");
	if(page > 1) strcat(string, "Предыдущая страница");
	format(header, sizeof(header), "Баг репорт, страница: %i", page);
    ShowPlayerDialog(playerid, 7772, DIALOG_STYLE_TABLIST_HEADERS, header, string, "Выбрать", "Закрыть");
}


В public OnDialogResponse, ко всем case:​
PHP:
case 7771: if(response)
{
    if(strlen(inputtext) < 10 || strlen(inputtext) > 125)
	{
	    ShowPlayerDialog(playerid, 7771, DIALOG_STYLE_INPUT, "Баг репорт", "Опишите баг кратко и ясно, строка ограничина 128 символами, постарайтесь вместить:", "Принять", "Закрыть");
 		SendClientMessage(playerid, -1, "Описание должно содержать не менее 10 символов, и не более 125.");
	}
	else
	{
	    new id = -1;
	    for(new i; i < MAX_BUGS; i++) if(!gBugDataName[i][0]) { id = i; break; }
	    if(id == -1) SendClientMessage(playerid, -1, "Баг репорт переполнен.");
	    else
	    {
		    new year, month, day, hour, minute, second, string[260];
		    getdate(year, month, day);
		    gettime(hour, minute, second);

		    GetPlayerName(playerid, gBugDataName[id], 25);
		    strmid(gBugDataText[id], inputtext, 0, strlen(inputtext), 128);
		    format(gBugDataDate[id], 20, "%i/%i/%i %i:%i:%i", year, month, day, hour, minute, second);

		    format(string, sizeof(string), "INSERT INTO `bugs` (`id`, `name`, `text`, `date`) VALUES ('%i', '%s', '%s', '%s')", id, gBugDataName[id], gBugDataText[id], gBugDataDate[id]);
		    mysql_pquery(dbConnect, string);
		    SendClientMessage(playerid, -1, "Благодарим вас за найденный баг.");
		}
	}
}
case 7772:
{
	if(!response) playerBugListPage[playerid] = 0;
	else
	{
	    if(!strcmp(inputtext, "Следующая страница"))
	    {
	        playerBugListPage[playerid]++;
         	ShowBugList(playerid);
	    }
	    else if(!strcmp(inputtext, "Предыдущая страница"))
	    {
	        playerBugListPage[playerid]--;
         	ShowBugList(playerid);
	    }
	    else
	    {
		    new list = playerBugListData[playerid][listitem];
		    if(!gBugDataName[list][0]) ShowBugList(playerid);
		    else
		    {
				new header[16], string[175];
			    format(header, sizeof(header), "№%i", list);
				format(string, sizeof(string), "Отправил: %s\nДата: %s\nОписание: %s", gBugDataName[list], gBugDataDate[list], gBugDataText[list]);
				playerBugListItem{playerid} = listitem;
			    ShowPlayerDialog(playerid, 7773, DIALOG_STYLE_MSGBOX, header, string, "Удалить", "Назад");
    		}
		}
	}
}
case 7773:
{
	if(!response) ShowBugList(playerid);
	else
	{
	    new list = playerBugListData[playerid][playerBugListItem{playerid}];
	    if(!gBugDataName[list][0]) ShowBugList(playerid);
	    else
	    {
		    gBugDataName[list] = "";
			gBugDataText[list] = "";
			gBugDataDate[list] = "";
			new string[46];
		    format(string, sizeof(string), "DELETE FROM `bugs` WHERE `id` = '%i'", list);
		    mysql_pquery(dbConnect, string);
			format(string, sizeof(string), "Репорт №%i успешно удален.", (list + 1));
			SendClientMessage(playerid, -1, string);
			#if defined foreach
			foreach(Player, i)
			#else
			for(new i = GetPlayerPoolSize(); i >= 0; i--) if(IsPlayerConnected(i))
			#endif
			{
				if(playerBugListPage[i]) ShowBugList(i);
			}
		}
	}
}


В public OnGameModeInit, для MySql R39.6:​
PHP:
new Cache:cache = mysql_query(dbConnect, "SELECT * FROM `bugs`"), rows = cache_num_rows(dbConnect);
if(rows)
{
	for(new i, id; i < rows; i++)
	{
	    id = cache_get_field_content_int(i, "id", dbConnect);
	    cache_get_field_content(i, "name", gBugDataName[id], dbConnect, 25);
	    cache_get_field_content(i, "text", gBugDataText[id], dbConnect, 128);
	    cache_get_field_content(i, "date", gBugDataDate[id], dbConnect, 20);
	}
}
cache_delete(cache);


В public OnGameModeInit, для MySql R41.4:​
PHP:
new Cache:cache = mysql_query(dbConnect, "SELECT * FROM `bugs`"), rows;
cache_get_row_count(rows);
if(rows)
{
	for(new i, id; i < rows; i++)
	{
	    cache_get_value_name_int(i, "id", id);
	    cache_get_value_name(i, "name", gBugDataName[id], 25);
	    cache_get_value_name(i, "text", gBugDataText[id], 128);
	    cache_get_value_name(i, "date", gBugDataDate[id], 20);
	}
}
cache_delete(cache);


Ну и самом собой не забываем сменить dbConnect на свою переменную хранящую подключение.


В базу данных импортируем таблицу:​
PHP:
CREATE TABLE IF NOT EXISTS `bugs` (
  `id` int(11) NOT NULL,
  `name` varchar(25) NOT NULL,
  `text` varchar(128) NOT NULL,
  `date` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Если возникли проблемы с кодировкой, в public OnGameModeInit:​
PHP:
mysql_query(dbConnect, "SET NAMES cp1251", false);
mysql_set_charset("cp1251");


Автор: Richie56
 
Последнее редактирование:
Сверху Снизу