/* SDAL_LOOK STEAM

Using Arrays as Database for Steam-ID and Name.

*/

#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>

#define ACCESS_LOOK 	128  // security level to see the "faked" nick
#define ACCESS_CONSOLE	131072
#define MAX_ENTRIES	500

new STRING_VERSION[MAX_DATA_LENGTH] = "19.03.03_STEAM";


new TextFile[MAX_DATA_LENGTH]="addons/adminmod/config/sdallook/LOOK.txt";

/*Für Debuging*/
new g_debug=0;

/*Storage Database*/
new g_WONID[MAX_ENTRIES][MAX_NUMBER_LENGTH];
new g_NAMES[MAX_ENTRIES][MAX_NAME_LENGTH];
new g_realentries=1;
new g_loadfile;


public admin_look(HLCommand,HLData,HLUserName,UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new Authid[MAX_AUTHID_LENGTH];
	new iWon,iSess,iTeam,iDead;
	
	new i;
	new maxplayers=maxplayercount();
	new searchindex;
	
	selfmessage( "------------------------------- Spielerliste: ------------------------------");
	snprintf(Text,MAX_TEXT_LENGTH,"ID^t^t^t^tORIGINALNAME^t^t^t^t^t^t^t^t^tSPIELER-FAKE-NAME");
	selfmessage(Text);
	selfmessage("");
	for(i=1;i<=maxplayers;i++){
		if(playerinfo(i,Player,MAX_NAME_LENGTH,iSess,iWon,iTeam,iDead,Authid)){
			searchindex = search_database(Authid,0);
			if(searchindex!=0){
				snprintf(Text, MAX_TEXT_LENGTH, "%i.^t^t^t %s ^t^t^t^tspielt als^t^t^t^t%s",searchindex,g_NAMES[searchindex],Player);
				selfmessage(Text);
			}
		}
	}			
	selfmessage( "------------------------------------------------------------------------------");
	return PLUGIN_HANDLED;
}

public admin_look_add(HLCommand,HLData,HLUserName,UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new Authid[MAX_AUTHID_LENGTH];
	new searchindex;
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	
	if(g_realentries<MAX_ENTRIES){
		if ( check_user(Data) == 1) {
			get_username(Data,Player,MAX_TEXT_LENGTH);
			get_userAuthID(Player,Authid);
			searchindex = search_database(Authid,0);
			if(searchindex==0){
				g_realentries++;
				strcpy(g_WONID[g_realentries],Authid,MAX_AUTHID_LENGTH);
				strcpy(g_NAMES[g_realentries],Player,MAX_NAME_LENGTH);
				snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] %s mit %s gespeichert",Player,Authid);
				selfmessage(Text);
				save_file();
				/*snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Um Aenderung im Textfile zu speichern, benutze admin_look_save!!!");
				selfmessage(Text);*/
			}else{
				snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] %s existiert schon: %s (%s)",Player,g_NAMES[searchindex],g_WONID[searchindex]);
				selfmessage(Text);
			}
		}else{
			snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Konnte %s nicht finden",Data);
			selfmessage(Text);
		}
	}
	return PLUGIN_HANDLED;
}

public admin_look_del(HLCommand,HLData,HLUserName,UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new i;
	new iData;
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	
	iData=strtonum(Data);
	
	if(iData==0 || iData > g_realentries){
		snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Konnte ID %i nicht finden!",iData);
		selfmessage(Text);
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] %s wird entfernt!",g_NAMES[iData]);
		selfmessage(Text);
		save_file();
		/*snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Um Aenderung im Textfile zu speichern, benutze admin_look_save!!!");
		selfmessage(Text);*/
		for(i=iData;i<g_realentries;i++){
			strcpy(g_WONID[i],g_WONID[i+1],MAX_NUMBER_LENGTH);
			strcpy(g_NAMES[i],g_NAMES[i+1],MAX_NAME_LENGTH);
		}
		g_realentries--;
	}
	return PLUGIN_HANDLED;
}

public admin_look_find(HLCommand,HLData,HLUserName,UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new searchindex;
	new tempsearchindex;
	new i;
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	
	
	selfmessage( "------------- Spieler-DATABASE: -------------");
	selfmessage( "ID  ^tWONID        ^tNAME");
	/*5 Versuche, um weitere Namen zu finden*/
	for(i=1;i<=20;i++){
		searchindex = search_database(Data,tempsearchindex);
		if(searchindex!=0){
			tempsearchindex=searchindex+1;
			snprintf(Text,MAX_TEXT_LENGTH,"%i.  ^t%s      ^t%s",searchindex,g_WONID[searchindex],g_NAMES[searchindex]);
			selfmessage(Text);
		}else{
			selfmessage("Suche beendet");
			return PLUGIN_HANDLED;
		}
	}
	selfmessage("Suche nach 20 Treffer abgebrochen!");
	return PLUGIN_HANDLED;
}		

public admin_look_list(HLCommand,HLData,HLUserName,UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new iLine;
	new maxline;
	new i;
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	
	iLine=strtonum(Data);
	
	if(iLine>g_realentries){
		iLine=0;
	}
	maxline=iLine+9;
	if(maxline>g_realentries){
		maxline=g_realentries;
	}
	
	selfmessage( "------------- Spieler-DATABASE: -------------");
	selfmessage( "ID  ^tWONID        ^tNAME");
	for(i=iLine;i<=maxline;i++){
		snprintf(Text,MAX_TEXT_LENGTH,"%i.  ^t%s      ^t%s",i,g_WONID[i],g_NAMES[i]);
		selfmessage(Text);
	}
	selfmessage( "--------------------------------------------------");
	snprintf(Text,MAX_TEXT_LENGTH,"---^t^t^tAnzeige: %i bis %i   ^t^t  ---",iLine,maxline);
	selfmessage(Text);
	snprintf(Text,MAX_TEXT_LENGTH,"---^t^t^tvon insg. %i Spielern^t^t  ---",g_realentries);
	selfmessage(Text);
	
	return PLUGIN_HANDLED;
}
				
public admin_look_save(HLCommand,HLData,HLUserName,UserIndex){
	save_file();
	return PLUGIN_HANDLED;
}

public admin_look_reload(HLCommand,HLData,HLUserName,UserIndex){
	new i;
	
	for(i=0;i<=g_realentries;i++){
		strinit(g_WONID[i]);
		strinit(g_NAMES[i]);
	}
	read_file();
	return PLUGIN_HANDLED;
}
	

/*Logd-Connect Funktion*/
public sdal_look_connect(HLCommand,HLUserIndex){
	new strUserIndex[MAX_NAME_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new UserIndex;
	
	/*Database wird erst beim ersten Spieler auf dem Server geladen*/
	if(g_loadfile==0){
		g_loadfile=1;
		read_file();
	}
	
	convert_string(HLUserIndex, strUserIndex, MAX_NAME_LENGTH);
	
	UserIndex=strtonum(strUserIndex);
	
	playerinfo(UserIndex,Player,MAX_NAME_LENGTH);
	set_timer("ann_timer",20, 0, Player);
	
	return PLUGIN_CONTINUE; 
}

public plugin_info(HLOldName,HLNewName,UserIndex) {
	new NewName[MAX_NAME_LENGTH];
	new OldName[MAX_NAME_LENGTH];
	
	convert_string(HLNewName, NewName, MAX_NAME_LENGTH);
	convert_string(HLOldName, OldName, MAX_NAME_LENGTH);

	if( streq(OldName,NewName)==0){
		set_timer("ann_timer",1, 0, NewName); 
	}
	return PLUGIN_CONTINUE;
}

public ann_timer(Timer,Repeat,HLName,HLParam){
	new Text[MAX_TEXT_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new Authid[MAX_AUTHID_LENGTH];
	new searchindex;
	convert_string(HLParam,Player,MAX_NAME_LENGTH);
	
	get_userAuthID(Player,Authid);
	
	if(strlen(Authid)!=0){
		if(g_debug==1){
			snprintf(Text,MAX_TEXT_LENGTH, "Spieler: %s mit %s wird gesucht!",Player,Authid);
			say(Text);
		}
		
		searchindex = search_database(Authid,1);
		if(searchindex!=0){
			if(strcmp(Player,g_NAMES[searchindex])!=0){
				snprintf(Text,MAX_TEXT_LENGTH,"Hallo %s !^nDein Fakename ist also^n%s ?",g_NAMES[searchindex],Player);
				typesay(Text,12,random(255),random(255),random(255));
			}
		}
		
		if(g_debug==1){
			snprintf(Text,MAX_TEXT_LENGTH, "Spieler: %s mit %s hat den Index:%i (DB-Name:%s)!",Player,Authid,searchindex,g_NAMES[searchindex]);
			say(Text);
		}
	}else{
		if(g_debug==1){
			snprintf(Text,MAX_TEXT_LENGTH, "Konnte von Spieler %s die wonid nicht ermitteln!",Player);
			say(Text);
		}
	}
	return PLUGIN_CONTINUE;
}

search_database(SearchParam[],Start){
	new i;
	
	if(g_debug){
		new Text[MAX_TEXT_LENGTH];
		snprintf(Text,MAX_TEXT_LENGTH,"Suche: %s ab Index: %i",SearchParam,Start);
		say(Text);
	}
	if(strncmp(SearchParam,"STEAM",5)!=0){
		for(i=Start;i<=g_realentries;i++){
			if(strcasestrx(g_NAMES[i],SearchParam)!=-1){
				return i;
				break;
			}
		}
	}else{
		for(i=Start;i<=g_realentries;i++){
			if(strcasestrx(g_WONID[i],SearchParam)!=-1){
				return i;
				break;
			}
		}
	}
	return 0;
}		

save_file(){
	new Data[MAX_DATA_LENGTH];
	new i;
	
	resetfile(TextFile);
	for(i=1;i<=g_realentries;i++){
		snprintf(Data,MAX_DATA_LENGTH,"%s %s",g_WONID[i],g_NAMES[i]);
		writefile(TextFile,Data,-1);
	}
	
	new Text[MAX_TEXT_LENGTH];
	snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Die Daten wurden gespeichert!");
	selfmessage(Text);
}

read_file(){
	new Data[MAX_DATA_LENGTH];
	new i;
	new iLine;
	
	iLine=filesize(TextFile);
	
	g_realentries=1;
	
	/*Damit der Array nicht überläuft*/
	if(iLine>MAX_ENTRIES){
		iLine=MAX_ENTRIES;
	}
	
	for(i=0;i<=iLine;i++){
		readfile(TextFile,Data,i,MAX_DATA_LENGTH);
		if(strlen(Data)!=0 && strncasecmp(Data,"//",2)!=0){
			strsep(Data," ",g_WONID[g_realentries],MAX_NUMBER_LENGTH,g_NAMES[g_realentries],MAX_NAME_LENGTH);
			g_realentries++;
		}
	}
	g_realentries--;
	/*DEBUG-MESSAGE*/
	if(g_debug){
		new Text[MAX_TEXT_LENGTH];
		snprintf(Text,MAX_TEXT_LENGTH,"[ADMIN][SDAL-LOOK] Es wurden %i Zeilen geladen",i);
		selfmessage(Text);
	}
}

public plugin_init() {
	plugin_registerinfo("SDALs admin_look Plugin","Searching for fakenames",STRING_VERSION);
	plugin_registercmd("admin_look","admin_look",ACCESS_LOOK,"admin_look: Zeigt bekannte Spieler mit ihren aktuellen Nick auf dem Server.");
	plugin_registercmd("admin_look_add","admin_look_add",ACCESS_LOOK,"admin_look_add: Fuegt Spielername mit Wonid in die Look.txt ein.");
	plugin_registercmd("admin_look_del","admin_look_del",ACCESS_LOOK,"admin_look_del <Zeilennr>: Loescht die Zeile in den gespeicherten Daten.");
	plugin_registercmd("admin_look_find","admin_look_find",ACCESS_LOOK,"admin_look_find <Name/Wonid>: Suche nach Namen/Wonid in den gespeicherten Daten.");
	plugin_registercmd("admin_look_list","admin_look_list",ACCESS_LOOK,"admin_look_list <Zeilennr>: Zeigt die gespeicherten Daten an.");
	plugin_registercmd("admin_look_save","admin_look_save",ACCESS_LOOK,"admin_look_save: Speichert die Namensliste im File");
	plugin_registercmd("admin_look_reload","admin_look_reload",ACCESS_LOOK,"admin_look_reload: laedt die Liste neu ein");
	plugin_registercmd("sdal_look_connect", "sdal_look_connect", ACCESS_CONSOLE);
	exec( "logd_reg 51 admin_command sdal_look_connect" );
	
	if (fileexists(TextFile) != 1) {
  		selfmessage("[ADMIN][SDAL-LOOK] Kann LOOK.txt nicht finden!");
  	}
	return PLUGIN_CONTINUE;
}
