PDA

Просмотр полной версии : [Вопрос] Бан система



Camelot
21.07.2014, 22:04
Недавно узнал про функцию выявления времени напрямую через мускул. (r7)
Ну вроде не сложно и место много не требует. Вот решил и поставить.
Всё шло хорошо, пока не дошёл до проверки, а именно, не представляю себе как её сделать.
Может кто-нибудь сможет мне помочь?

Постарался что-то сделать, но это не работает...


OnPlayerConnect(playerid)
{
mysql_format(cHandle, mysql_query, "SELECT * FROM `Bans` WHERE `Nick` = '%s' AND `DateUnBan` > NOW() LIMIT 1", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, true, "BanListCheck", "d", playerid);
}
publics: BanListCheck(playerid)
{
cache_get_data(rows, fields);
if(rows)
{
new adm[MAX_PLAYER_NAME], reason[64], bantime[30], unbantime[30];
mysql_get_field("BanUnTime", unbantime);
mysql_get_field("BanTime", bantime);
mysql_get_field("Admin", adm);
mysql_get_field("Reason", reason);
format(mysql_query, sizeof(mysql_query), "\
{FF0000}Аккаунт заблокирован!\n\n\
{FFFFFF}Дата блокировки: %s\n\
Дата разбана: %s\n\
Блокировщик: %s\n\
Причина бана: %s",
bantime,unbantime,adm, reason);
ShowPlayerDialog(playerid, 425, DIALOG_STYLE_MSGBOX, "Бан", mysql_query, "Закрыть", "");
return Kick(playerid);
}
else
{
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return SendClientMessage(playerid, 0xFFFFFF, "Вы были разбанены.");
}
}



CMD:ban(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 3) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "iis", params[0], params[1], params[2], params[3]))
return SendClientMessage(playerid, COLOR_GREEN,"(Используйте): {669966}/ban [ID Player] [Часы] [Причина]");
else if(!IsPlayerConnected(params[0]))
return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
mysql_format(cHandle, mysql_query, "INSERT INTO `Bans` (`Nick`,`Reason`,`Admin`,`DateUnBan`,`DateBan`) VALUES ('%s','%s','%s', NOW(), NOW()+INTERVAL %d HOUR)",
PInfo[params[0]][pNick], params[3], PInfo[playerid][pNick], params[2]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return Kick(params[0]);
}

underwoker
21.07.2014, 23:07
if(gettime() >= ПЕРЕМЕННАЯ ХРАНЯЩАЯ ВРЕМЯ БАНА)
{
new string1[128];
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return true;
}

Camelot
22.07.2014, 02:01
if(gettime() >= ПЕРЕМЕННАЯ ХРАНЯЩАЯ ВРЕМЯ БАНА)
{
new string1[128];
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return true;
}

Поставил. Не работает. При заходе на сервер, сразу показывается диалог с авторизацией.

publics: BanListCheck(playerid)
{
cache_get_data(rows, fields);
if(rows)
{
new tmp[30], adm[MAX_PLAYER_NAME], reason[64], bantime, unbantime;
mysql_get_field("BanUnTime", tmp); unbantime = strval(tmp);
mysql_get_field("BanTime", tmp); bantime = strval(tmp);
mysql_get_field("Admin", adm);
mysql_get_field("Reason", reason);
if(gettime() >= unbantime)
{
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return SendClientMessage(playerid, 0xFFFFFF, "Вы были разбанены.");
}
format(mysql_query, sizeof(mysql_query), "\
{FF0000}Аккаунт заблокирован!\n\n\
{FFFFFF}Дата блокировки: %s\n\
Дата разбана: %s\n\
Блокировщик: %s\n\
Причина бана: %s",
bantime,unbantime,adm, reason);
ShowPlayerDialog(playerid, 425, DIALOG_STYLE_MSGBOX, "Бан", mysql_query, "Закрыть", "");
Kick(playerid);
}
return true;
}

#ball
22.07.2014, 09:00
Попробуй

publics: BanListCheck(playerid)
{
cache_get_data(rows, fields);
if(rows)
{
new tmp[30], adm[MAX_PLAYER_NAME], reason[64], bantime, unbantime;
mysql_get_field("DateUnBan", tmp); unbantime = strval(tmp);
mysql_get_field("DateBan", tmp); bantime = strval(tmp);
mysql_get_field("Admin", adm);
mysql_get_field("Reason", reason);
if(gettime() >= unbantime)
{
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return SendClientMessage(playerid, 0xFFFFFF, "Вы были разбанены.");
}
else
{
format(mysql_query, sizeof(mysql_query), "\
{FF0000}Аккаунт заблокирован!\n\n\
{FFFFFF}Дата блокировки: %s\n\
Дата разбана: %s\n\
Блокировщик: %s\n\
Причина бана: %s",
bantime,unbantime,adm, reason);
ShowPlayerDialog(playerid, 425, DIALOG_STYLE_MSGBOX, "Бан", mysql_query, "Закрыть", "");
Kick(playerid);
}
}
else //Показываем авторизацию
return true;
}


CMD:ban(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 3) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "iis[30]", params[0], params[1], params[2]))
return SendClientMessage(playerid, COLOR_GREEN,"(Используйте): {669966}/ban [ID Player] [Дни] [Причина]");
else if(!IsPlayerConnected(params[0]))
return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
mysql_format(cHandle, mysql_query, "INSERT INTO `Bans` (`Nick`,`Reason`,`Admin`,`DateBan`,`DateUnBan`) VALUES ('%s','%s','%s', '%d',NOW()+INTERVAL %i DAY)",
PInfo[params[0]][pNick], params[2], PInfo[playerid][pNick], params[1],params[1]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return Kick(params[0]);
}

- - - Добавлено - - -

Покажи еще свою таблицу в базе

underwoker
22.07.2014, 13:20
Поставил. Не работает. При заходе на сервер, сразу показывается диалог с авторизацией.

publics: BanListCheck(playerid)
{
cache_get_data(rows, fields);
if(rows)
{
new tmp[30], adm[MAX_PLAYER_NAME], reason[64], bantime, unbantime;
mysql_get_field("BanUnTime", tmp); unbantime = strval(tmp);
mysql_get_field("BanTime", tmp); bantime = strval(tmp);
mysql_get_field("Admin", adm);
mysql_get_field("Reason", reason);
if(gettime() >= unbantime)
{
mysql_format(cHandle, mysql_query, "DELETE FROM `Bans` WHERE `Nick` = '%s'", PInfo[playerid][pNick]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return SendClientMessage(playerid, 0xFFFFFF, "Вы были разбанены.");
}
format(mysql_query, sizeof(mysql_query), "\
{FF0000}Аккаунт заблокирован!\n\n\
{FFFFFF}Дата блокировки: %s\n\
Дата разбана: %s\n\
Блокировщик: %s\n\
Причина бана: %s",
bantime,unbantime,adm, reason);
ShowPlayerDialog(playerid, 425, DIALOG_STYLE_MSGBOX, "Бан", mysql_query, "Закрыть", "");
Kick(playerid);
}
return true;
}
А почему в первом посте в запросе ты берешь данные из DateUnBan, а в котором мне показываешь из BanUnTime? Тогда уж сделай взятие данных из DateUnBan, а не из BanUnTime

Camelot
22.07.2014, 16:19
Вот я дырявая бошка. Все BanUnTime сменил на DateUnBan - всё равно не помогло.
Попробовал совет #ball - тоже не помогло.
Вот скрин бд:
http://ihost.pro-pawn.ru/image.php?di=NS4X

#ball
22.07.2014, 17:26
Зайди на сервер и дай бан этой командой:

CMD:ban(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 3) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "iis[30]", params[0], params[1], params[2]))
return SendClientMessage(playerid, COLOR_GREEN,"(Используйте): {669966}/ban [ID Player] [Дни] [Причина]");
else if(!IsPlayerConnected(params[0]))
return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
mysql_format(cHandle, mysql_query, "INSERT INTO `Bans` (`Nick`,`Reason`,`Admin`,`DateBan`,`DateUnBan`) VALUES ('%s','%s','%s', '%d',NOW()+INTERVAL %i DAY)",
PInfo[params[0]][pNick], params[2], PInfo[playerid][pNick], params[1],params[1]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return Kick(params[0]);
}

Посмотри,будут ли данные в бд.

Camelot
22.07.2014, 17:39
Зайди на сервер и дай бан этой командой:

CMD:ban(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 3) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "iis[30]", params[0], params[1], params[2]))
return SendClientMessage(playerid, COLOR_GREEN,"(Используйте): {669966}/ban [ID Player] [Дни] [Причина]");
else if(!IsPlayerConnected(params[0]))
return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
mysql_format(cHandle, mysql_query, "INSERT INTO `Bans` (`Nick`,`Reason`,`Admin`,`DateBan`,`DateUnBan`) VALUES ('%s','%s','%s', '%d',NOW()+INTERVAL %i DAY)",
PInfo[params[0]][pNick], params[2], PInfo[playerid][pNick], params[1],params[1]);
mysql_function_query(cHandle, mysql_query, false, "", "");
return Kick(params[0]);
}

Посмотри,будут ли данные в бд.

Но это не совсем то, что нужно. Во-первых, здесь бан дается на дни. Во-вторых, не записывается дата бана. Моя команда, которую указал в первом посте - рабочая.

#ball
22.07.2014, 18:43
Смотри, gettime() в итоге нам даст часы:минуты:секунды, а unbantime равно у нас примерно вот такому 2014-07-22 17:15:20.
Я не знаю как их сравнивать.
Если делать вот так

new get[30],year,month,day,hour,minut,second;
gettime(hour,minut,second);getdate(year,month,day);
format(get,30,"%04d-%02d-%02d %02d:%02d:%02d",year,month,day,hour,minut,second);

Получится,что-то этого.
Текущее время - 2014-07-22 17:15:20
Время разбана - 2014-07-23 17:15:20


Думай!