#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <cstrike>
#include <jailbreak>
#include <colorchat>

#define PLUGIN "Jail CzasGry"
#define VERSION "1.0.6"
#define AUTHOR "Cypis"

new valut;
new pCvarSteam, pCvarTiem, pCvarCtToTT;
new CzasGry[MAX+1];
new dane_gracza[MAX+1];
new nazwa_gracza[MAX+1][64];
new bool:wczytane[MAX+1];

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_clcmd("jail_addct", "DodajGracza", ADMIN_BAN, "jail_addct <name | steamid>");
	register_clcmd("jail_delct", "UsunGracza", ADMIN_BAN, "jail_delct <name | steamid>");
	register_clcmd("jail_menuban", "MenuBan");
	register_clcmd("say /czasgry", "PokazCzasGry");
	
	pCvarTiem = register_cvar("jail_ct_time", "60");
	pCvarCtToTT = register_cvar("jail_tt_to_ct", "5");
	pCvarSteam = register_cvar("jail_ct_steam", "0");
	
	pCvarCtToTT = max(get_pcvar_num(pCvarCtToTT), 1);
	pCvarTiem = get_pcvar_num(pCvarTiem)*60;
	pCvarSteam = get_pcvar_num(pCvarSteam);
	
	valut = nvault_open("banct");
	set_task(1.0, "DodajAmxMod");
}

public DodajAmxMod()
{
	AddMenuItem("Ban na CT", "jail_menuban", ADMIN_BAN, "Jail_Ban");
}

public OnJoinTeam(id, team, tt, ct)
{
	if(team == 2)
	{
		if(!is_user_steam(id) && pCvarSteam)
		{
			ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 NonSteam nie moze grac w CT!");
			return JAIL_FORCE_TT;
		}
			
		if((ct && (ct*pCvarCtToTT >= tt)) && !is_user_admin(id))
		{
			ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Druzyna CT pelna! Dolaczyles do wiezniow!");
			return JAIL_FORCE_TT;
		}
		
		if(dane_gracza[id] == 2)
		{
			ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Masz zakaz dolaczania do CT!");
			return JAIL_FORCE_TT;
		}
	
		if(!dane_gracza[id] && ((get_user_time(id,1)+CzasGry[id]) < pCvarTiem) && !is_user_admin(id))
		{
			ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Masz za malo czasu przegrane na serwerze by grac w CT! Potrzebujesz %d minut.", pCvarTiem/60);
			return JAIL_FORCE_TT;
		}
	}
	return JAIL_CONTINUE;
}

public DodajGracza(id)
{
	if(!(get_user_flags(id) & ADMIN_BAN))
		return PLUGIN_HANDLED;

	new name[64], vaultdata[256];
	read_argv(1, name, 63);	
	if(nvault_get(valut, name, vaultdata, 255))
	{
		if(vaultdata[0] == '2')
		{
			client_print(id, print_console, "[PrisonBreak] Juz jest zbanoway ten gracz (%s)", name);
			return PLUGIN_HANDLED;
		}
		log_amx("Admin <%s> zbanowal gracza <%s>", nazwa_gracza[id], name); 
		nvault_set(valut, name, "2");
		client_print(id, print_console, "[PrisonBreak] Zbanowales gracza %s", name);
	}
	else
		client_print(id, print_console, "[PrisonBreak] Taki gracz (%s) jeszcze nie gral na serwerze", name);
	
	return PLUGIN_HANDLED;
}

public UsunGracza(id)
{
	if(!(get_user_flags(id) & ADMIN_BAN))
		return PLUGIN_HANDLED;

	new name[64], vaultdata[256];
	read_argv(1, name, 63);
	if(nvault_get(valut, name, vaultdata, 255))
	{
		log_amx("Admin <%s> odbanowal gracza <%s>", nazwa_gracza[id], name); 
		nvault_set(valut, name, "1");
		client_print(id, print_console, "[PrisonBreak] Odbanowales gracza %s", name);
	}
	else
		client_print(id, print_console, "[PrisonBreak] Nie ma takiego gracza (%s)", name);
	
	return PLUGIN_HANDLED;
}

public MenuBan(id)
{
	if(!(get_user_flags(id) & ADMIN_BAN))
		return PLUGIN_HANDLED;
	
	new menu = menu_create("Menu ban na CT:", "Ban_Handled");
	for(new i=1; i<=32; i++)
	{
		if(!is_user_connected(i) || is_user_hltv(i) || i == id)
			continue;
		
		new name[64], num[3];
		get_user_name(i, name, 64);
		num_to_str(i, num, 2);

		add(name, 63, (get_user_team(i) == 1? " \r[TT]": (get_user_team(i) == 2? " \r[CT]": " \r[SPECT]")));
		menu_additem(menu, name, num);
	}
	menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
	menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
	menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
	menu_display(id, menu);
	return PLUGIN_HANDLED;
}

public Ban_Handled(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		return PLUGIN_CONTINUE;
	}
	new id2, callback, data[3];
	menu_item_getinfo(menu, item, id2, data, 2, _, _, callback);
	id2 = str_to_num(data);
	
	if(dane_gracza[id2] != 2)
	{
		CzasGry[id2] = 0;
		dane_gracza[id2] = 2;
		nvault_set(valut, nazwa_gracza[id2], "2");
		
		if(cs_get_user_team(id2) == CS_TEAM_CT)
		{
			if(is_user_alive(id2))
				user_kill(id2);
			cs_set_user_team(id2, CS_TEAM_T);
		}
		
		log_amx("Admin <%s> zbanowal gracza <%s>", nazwa_gracza[id], nazwa_gracza[id2]); 
		ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Gracz ^x03%s^x01 zostal zbanowany na gre w CT", nazwa_gracza[id2]);
	}
	else
		ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Gracz ^x03%s^x01 jest juz zbanowany na CT! ", nazwa_gracza[id2]);
	
	return PLUGIN_CONTINUE;
}

public client_putinserver(id)
{
	dane_gracza[id] = 0;
	CzasGry[id] = 0;
	wczytane[id] = false;
	if(pCvarSteam)
	{
		if(is_user_steam(id))
		{
			get_user_authid(id, nazwa_gracza[id], 63);
			CzasGry[id] = WczytajCzas(id);
		}
		return;
	}
	if(is_user_steam(id))
		get_user_authid(id, nazwa_gracza[id], 63);
	else
		get_user_name(id, nazwa_gracza[id], 63);
			
	CzasGry[id] = WczytajCzas(id);
}

public WczytajCzas(id)
{
	new vaultdata[256];
	wczytane[id] = true;
	
	if(nvault_get(valut, nazwa_gracza[id], vaultdata, 255))
	{
		if(vaultdata[1] == '#')
		{
			new left[10];
			strtok(vaultdata, left, 9, vaultdata, 255, '#', 1);
			return str_to_num(vaultdata);
		}
		else
			dane_gracza[id] = (vaultdata[0]-'0');
	}
	return 0;
}

public client_disconnect(id)
{
	if(pCvarSteam)
	{
		if(is_user_steam(id))
		{
			ZapiszCzas(id);
		}
		return;
	}
	ZapiszCzas(id);
}

public ZapiszCzas(id)
{
	if(!dane_gracza[id] && wczytane[id])
	{
		new czas = CzasGry[id]+get_user_time(id,1);
		if(czas <= pCvarTiem)
		{
			new vaultdata[256];
			formatex(vaultdata, 255, "0#%i", czas);
			nvault_set(valut, nazwa_gracza[id], vaultdata);
		}
		else
			nvault_set(valut, nazwa_gracza[id], "1");
	}
}

public PokazCzasGry(id)
{
	new times = get_user_time(id,1);
	if((times+CzasGry[id]) < pCvarTiem && !dane_gracza[id])
		ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Spedziles na serwerze^x03 %d^x01 min.", (times+CzasGry[id])/60);
	else
		ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak]^x01 Przegrales ponad %d minut na serwerze", pCvarTiem/60);
	return PLUGIN_HANDLED;
}    

stock bool:is_user_steam(id)
{
	new authid[32]; 
	get_user_authid(id, authid, 31);
	return contain(authid , ":") != -1? true: false;
}
