/* plugin_cavey_warn.sma version 1.1, By Caveman ICQ# 70710878
                    Please read the readme                          
	Also available from http://gosh.ex.ac.uk/~py99jan/	*/
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
new ACCESS_WARN;
 
new WARN_BURY;
new WARN_SLAY;
new WARN_KICK;
new WARN_BAN;
new Require_reason;
new WARN_DELAY;
 
#define MAX_IPADDRESS 32
 
new STRING_VERSION[MAX_DATA_LENGTH] = "2.50.11";
 
new UserIP[MAX_PLAYERS][MAX_IPADDRESS];
/*0 the timer, 1 the flag, 2 the TargetIndex*/
new gTimer[MAX_PLAYERS][3];
 
public admin_warn(HLCommand,HLData,HLUserName,UserIndex) {
		/*Input variables*/
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
 
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
	if ( access(ACCESS_WARN, User)==0 ){
		getstrvar("admin_reject_msg",Data,MAX_DATA_LENGTH);
		messageex(User,Data,print_console);
		return PLUGIN_CONTINUE;	
	}
 
		/*Identify user variables*/
	new TargetName[MAX_NAME_LENGTH];
	new WarnTarget[MAX_DATA_LENGTH];
	new OldID;
	new TargetIdentifier[MAX_AUTHID_LENGTH];
	new TargetIndex;
		/*"Say" variables*/
	new Text[MAX_TEXT_LENGTH];
	new Reason[MAX_TEXT_LENGTH];
		/*File reading and writing*/
	new iBanType = bBanByID;
 
 	strbreak(Data,WarnTarget,Reason, MAX_DATA_LENGTH);
 
	if ( ( strlen(Reason) == 0 ) && (Require_reason != 0)) {
		selfmessage("Please enter a reason for the logs");
		selfmessage("Use ^"admin_warn <target> <reason>^"");
		return PLUGIN_HANDLED;
	}
	if (getvar("sv_lan") == 1){
		iBanType = bBanByIP;
	}
	if (check_user(WarnTarget)==1) {
		get_username(WarnTarget,TargetName,MAX_NAME_LENGTH);
		say_command(User,Command,TargetName);
		if ( check_immunity(TargetName) == 1 ) {
			snprintf(Text, MAX_TEXT_LENGTH, "You can't issue a warning to %s, you silly bear.", TargetName);
			say(Text);
		} else {
			get_userindex(TargetName, TargetIndex);
			if ( iBanType == bBanByIP ){
				strtok(UserIP[TargetIndex], ":", TargetIdentifier, MAX_IPADDRESS);
			} else if ( iBanType == bBanByID ){
				new SessionID,Team,Dead;
				playerinfo(TargetIndex,TargetName,MAX_NAME_LENGTH,SessionID,OldID,Team,Dead,TargetIdentifier);
			} 
				/*Block abuse of command*/
			if ( (gTimer[UserIndex][1]!= 0) && (gTimer[UserIndex][2]==TargetIndex) ){
				snprintf(Text, MAX_TEXT_LENGTH, "%d", UserIndex);
				kill_timer(gTimer[UserIndex][0]);
				gTimer[UserIndex][0] = set_timer("Warn_Timer", (WARN_DELAY), 1, Text);
				selfmessage("You may not repeatedly warn a player in so short a time!");
				slap(User);
				return PLUGIN_HANDLED;
			}  
			gTimer[UserIndex][1] = 1;
			gTimer[UserIndex][0] = set_timer("Warn_Timer", WARN_DELAY, 1, Text);
				/*End blocking*/
 
			writefile("warnings.ini",TargetIdentifier,-1);
 
			new FileSize = filesize("warnings.ini");
			new Warnings = 0;
			for(new Count=1;Count<=FileSize;Count++) {
				readfile("warnings.ini",Text,Count,MAX_TEXT_LENGTH);
				if ( (strcasestr(Text,TargetIdentifier) != -1) ) {
					Warnings++;
				}
			}
			if ( ( Warnings < WARN_BURY ) ){
				snprintf(Text, MAX_TEXT_LENGTH, "A WARNING has been issued to^n^n%s^n^nfor %s", TargetName,Reason);
				centersay(Text,10,10,250,10);
				slap(TargetName);
			} else if ( ( Warnings >= WARN_BURY ) && ( Warnings < WARN_SLAY ) ){
				snprintf(Text, MAX_TEXT_LENGTH, "A WARNING has been issued to^n^n%s^n^nfor %s", TargetName,Reason);
				centersay(Text,10,250,250,10);
				plugin_exec("admin_bury",TargetName);
			} else if ( ( Warnings >= WARN_SLAY ) && ( Warnings < WARN_KICK ) ){
				snprintf(Text, MAX_TEXT_LENGTH, "WARNING %d has been issued to^n^n%s^n^nfor %s", Warnings, TargetName,Reason);
				centersay(Text,10,250,10,10);
				slay(TargetName);
			} else if ( ( Warnings >= WARN_KICK ) && ( Warnings < WARN_BAN ) ){
				snprintf(Text, MAX_TEXT_LENGTH, "WARNING %d has been issued to %s^n^nfor %s^n^nPlayer will be kicked", Warnings, TargetName,Reason);
				centersay(Text,10,250,10,10);
				snprintf(Text, MAX_TEXT_LENGTH, "%s has been kicked for warning %d of %d", TargetName, Warnings, WARN_KICK);
				say(Text);
				snprintf(Text, MAX_TEXT_LENGTH, "After %d warnings you will be banned", WARN_KICK);
				message(TargetName, Text);
				kick(TargetName);
			} else if ( ( Warnings >= WARN_BAN ) ){
				snprintf(Text, MAX_TEXT_LENGTH, "WARNING %d has been issued to %s^n^nfor %s^n^nPlayer will be banned", Warnings, TargetName,Reason);
				centersay(Text,10,250,10,10);
				snprintf(Text, MAX_TEXT_LENGTH, "You have been permanantly banned from this server");
				message(TargetName, Text);
				snprintf(Text, MAX_TEXT_LENGTH, "%s has been kicked and banned", TargetName);
				say(Text);
				ban(TargetName,0,iBanType);
				kick(TargetName);
			} 
			gTimer[UserIndex][2] = TargetIndex;
		}
	}
	return PLUGIN_HANDLED;
}
 
public Warn_Timer(Timer, Repeat, HLUserName, HLParam){
	new Data[MAX_DATA_LENGTH];
	new UserIndex;
 
	convert_string(HLParam,Data,MAX_DATA_LENGTH);
	UserIndex = strtonum(Data);
	gTimer[UserIndex][1] = 0;
	gTimer[UserIndex][2] = 0;
 
	return PLUGIN_CONTINUE;
}
 
public plugin_connect(HLUserName, HLIP, UserIndex) {
	if (UserIndex >= 1 && UserIndex <= MAX_PLAYERS) {
		strinit(UserIP[UserIndex]);
		convert_string(HLIP, UserIP[UserIndex], MAX_IPADDRESS);
	}
	if ( gTimer[UserIndex][0] != 0 ) {
		kill_timer(gTimer[UserIndex][0]);
	}
	return PLUGIN_CONTINUE;
}
 
public plugin_disconnect(HLUserName, UserIndex) {
	if (UserIndex >= 1 && UserIndex <= MAX_PLAYERS) {
		strinit(UserIP[UserIndex]);
	}
	if ( gTimer[UserIndex][0] != 0 ) {
		kill_timer(gTimer[UserIndex][0]);
	}
	return PLUGIN_CONTINUE;
}
 
 
public plugin_init() {
	plugin_registerinfo("Caveys Admin Warn Plugin","Command for warning TKers sequentially.",STRING_VERSION);
 
	plugin_registercmd("admin_warn","admin_warn",ACCESS_ALL,"admin_warn ^"<target>^" ^"<reason>^": Issues warnings sequentially with a punishment to get their attention.");
 
	new Text[MAX_TEXT_LENGTH];
 
	strinit(Text);
	get_vaultdata("WARN_BURY",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		WARN_BURY = 4;
	} else {
		WARN_BURY = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",WARN_BURY);
	set_vaultdata("WARN_BURY",Text);
 
	strinit(Text);
	get_vaultdata("WARN_SLAY",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		WARN_SLAY = 5;
	} else {
		WARN_SLAY = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",WARN_SLAY);
	set_vaultdata("WARN_SLAY",Text);
 
	strinit(Text);
	get_vaultdata("WARN_KICK",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		WARN_KICK = 8;
	} else {
		WARN_KICK = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",WARN_KICK);
	set_vaultdata("WARN_KICK",Text);
 
	strinit(Text);
	get_vaultdata("WARN_BAN",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		WARN_BAN = 10;
	} else {
		WARN_BAN = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",WARN_BAN);
	set_vaultdata("WARN_BAN",Text);
 
	strinit(Text);
	get_vaultdata("WARN_REQUIRE_REASON",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		Require_reason = 10;
	} else {
		Require_reason = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",Require_reason);
	set_vaultdata("WARN_REQUIRE_REASON",Text);
 
	strinit(Text);
	get_vaultdata("WARN_DELAY",Text, MAX_TEXT_LENGTH);
	if (strlen(Text) == 0){
		WARN_DELAY = 60;
	} else {
		WARN_DELAY = strtonum(Text);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%d",WARN_DELAY);
	set_vaultdata("WARN_DELAY",Text);
 
	new i;
	for (i=1;i<MAX_PLAYERS;i++){
		gTimer[i][0] = 0;
		gTimer[i][1] = 0;
	}
	return PLUGIN_CONTINUE;
}