
#include <a_samp>
#include <dini>
#define MAX_BANNED 150
#define COLOR_LRED 0xff0000ff
#define white 0xFFFFFFAA
forward split(const strsrc[], strdest[][], delimiter);
forward UpdateBanList();

enum bn
{
	Name[MAX_PLAYER_NAME],
	Reason[25],
	Admin[MAX_PLAYER_NAME],
	dateDay,
	dateMonth,
	dateYear,
	timeHour,
	timeMinute,
	timeSecond
}
new BanName[MAX_BANNED][bn];

public OnFilterScriptInit()
{
    UpdateBanList();
    SetTimer("UpdateBanList",120000,1);
}

public UpdateBanList()
{
	new arrCoords[9][64];
	new File:file;new valtmp[160];new idx;
	if((file=fopen("bannames.cfg",io_read)))
	{
	    while(fread(file,valtmp))
	    {
	        for(new l1; l1<strlen(valtmp); l1++) if(valtmp[l1]==13 || valtmp[l1]==10) valtmp[l1] = 0;
	        if(!strlen(valtmp))break;
	        split(valtmp, arrCoords, ',');
            strmid(BanName[idx][Name],arrCoords[0],0,strlen(arrCoords[0]),255);
            strmid(BanName[idx][Reason],arrCoords[1],0,strlen(arrCoords[1]),255);
            strmid(BanName[idx][Admin],arrCoords[2],0,strlen(arrCoords[2]),255);
            BanName[idx][dateDay]=strval(arrCoords[3]);
            BanName[idx][dateMonth]=strval(arrCoords[4]);
            BanName[idx][dateYear]=strval(arrCoords[5]);
            BanName[idx][timeHour]=strval(arrCoords[6]);
            BanName[idx][timeMinute]=strval(arrCoords[7]);
            BanName[idx][timeSecond]=strval(arrCoords[8]);
            printf("%s %s %s  %i %i %i %i %i %i",BanName[idx][Name],BanName[idx][Reason],BanName[idx][Admin],BanName[idx][dateDay],BanName[idx][dateMonth],BanName[idx][dateYear],BanName[idx][timeHour],BanName[idx][timeMinute],BanName[idx][timeSecond]);
            idx++;
	    }
		fclose(file);
	}
}

public OnPlayerConnect(playerid)
{
	new pname[MAX_PLAYER_NAME];new string[128];
	GetPlayerName(playerid,pname,sizeof(pname));
	for(new i=0;i<MAX_BANNED;i++)
	{
	    if(strfind(BanName[i][Name],pname,true)>-1)
	    {
	        SendClientMessage(playerid,COLOR_LRED,"<||---------------------------------------------------------------------------------------------------------||>");
	        format(string,sizeof(string),"<|| Здравсвуйте, %s, Ваш ник находится в Бан листе этого сервера ||>",pname);
			SendClientMessage(playerid,white,string);
			format(string,sizeof(string),"<||                                       Дата бана: %02d-%02d-%04d время: %02d:%02d:%02d                         ||>",BanName[i][dateDay],BanName[i][dateMonth],BanName[i][dateYear],BanName[i][timeHour],BanName[i][timeMinute],BanName[i][timeSecond]);
			SendClientMessage(playerid,white,string);
            format(string,sizeof(string),"<||                                       Причина:%25s                            ||>",BanName[i][Reason]);
			SendClientMessage(playerid,white,string);
			SendClientMessage(playerid,COLOR_LRED,"<||---------------------------------------------------------------------------------------------------------||>");
	        Kick(playerid);
	    }
	}
	return 1;
}
public OnPlayerCommandText(playerid,cmdtext[])
{
	new cmd[0xff],idx,string[128];
	cmd=strtok(cmdtext,idx);
	if(!strcmp(cmd,"/banname",true))
	{
	    new tmp[0xff],id;
	    tmp=strtok(cmdtext,idx);
	    if(!strlen(tmp))return SendClientMessage(playerid,white,"<||  /banname [playerid] [причина] ||>");
	    id=strval(tmp);
		tmp=strtok(cmdtext,idx);
		if(!strlen(tmp))return SendClientMessage(playerid,white,"<||  /banname [playerid] [причина] ||>");
	    if(IsPlayerAdmin(playerid))
	    {
	    	if(strlen(tmp)>25)return SendClientMessage(playerid,white,"<||  Длина причины не должна быть больше 25 символов ||>");
			id=strval(tmp);
			if(!IsPlayerConnected(id)||IsPlayerNPC(id))return SendClientMessage(playerid,white,"<||  Нет такого игрока ||>");
	        new tname[MAX_PLAYER_NAME],pname[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,pname,sizeof(pname));
	        GetPlayerName(id,tname,sizeof(tname));
			format(string,sizeof(string),"<|| Вы Забанили %s Причина: %s ||>",tname,tmp);
			SendClientMessage(playerid,white,string);
			format(string,sizeof(string),"<|| Вас Забанили по Причине: %s ||>",tmp);
			SendClientMessage(id,white,string);
			NameBan(tname,tmp,pname);
			Kick(id);
			UpdateBanList();
			return 1;
	    }
	}
	if(!strcmp(cmd,"/addbanname",true))
	{
	    new tmp[0xff],banname[MAX_PLAYER_NAME];
	    tmp=strtok(cmdtext,idx);
	    if(!strlen(tmp)||strlen(tmp)>MAX_PLAYER_NAME)return SendClientMessage(playerid,white,"<||  /addbanname [player Name] [причина] ||>");
	    strmid(banname,tmp,0,strlen(tmp),255);
		tmp=strtok(cmdtext,idx);
		if(!strlen(tmp))return SendClientMessage(playerid,white,"<||  /addbanname [playerid Name] [причина] ||>");
	    if(IsPlayerAdmin(playerid))
	    {
	    	if(strlen(tmp)>25)return SendClientMessage(playerid,white,"<||  Длина причины не должна быть больше 25 символов ||>");
	        new pname[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,pname,sizeof(pname));
			format(string,sizeof(string),"<|| Вы Забанили %s Причина: %s ||>",banname,tmp);
			SendClientMessage(playerid,white,string);
			NameBan(banname,tmp,pname);
			UpdateBanList();
			return 1;
	    }
	}
	return 0;
}

stock NameBan(BandName[],reson[],Admins[])
{
	new File:file,hour,minute,second,year,month,day,str[128];
	file=fopen("bannames.cfg",io_append);
	gettime(hour,minute,second);
	getdate(year,month,day);
	format(str,128,"%s,%s,%s,%i,%i,%i,%i,%i,%i \r\n",BandName,reson,Admins,day,month,year,hour,minute,second);
	for(new io=0; io<strlen(str); io++) {
	fputchar(file, str[io], false);
	}
	fclose(file);
}
public split(const strsrc[], strdest[][], delimiter)
{
	new i, li;
	new aNum;
	new len;

	while(i <= strlen(strsrc)){
	    if(strsrc[i]==delimiter || i==strlen(strsrc))
		{
	        len = strmid(strdest[aNum], strsrc, li, i, 128);
	        strdest[aNum][len] = 0;
	        li = i+1;
	        aNum++;
		}
		i++;
	}
	return 1;
}
