All pastes #549493 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-06-08 04:20 UTC
rendered paste body


#include <amxmodx>
#include <sockets>
#include <amxmisc>

#define AUTHOR "Wuss"
#define PLUGIN "S2S"
#define VERSION "0.1"

new sock = 0
new rconid[13]

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_cvar("s2s_ip", "74.52.157.234")
	register_cvar("s2s_rcon", "")
	
	register_srvcmd("remote_names", "retNames")

}

public retNames()
{
	new snd[201]
	format(snd, 200, "amx_who")
	//server_cmd("amx_chat %s", snd)

	new ip[21], rconpass[31]
	get_cvar_string("s2s_ip",ip,20)
	get_cvar_string("s2s_rcon",rconpass,30)
	
	hlds_rcon_cmd(ip, 27015, rconpass, snd)
	
	socket_close(sock)
	sock = 0
}

public hlds_makesock(host[], port, rcon[]) 
{
	new error=0
	// Get hlds rcon. Don't eaven bother if it's not set.
	if(!rcon[0]) 
	{
		log_amx("There is no HLDS rcon set.")
		return PLUGIN_HANDLED
	}
	// hlds ip/port/password
	// Connect to HLDS Server
	sock = socket_open(host, port, SOCKET_UDP, error)
	if (error != 0) 
	{
		log_amx("HLDS Connection Failed - error %i",error)
		return PLUGIN_HANDLED
	}
	if (sock <= 0) 
	{
		log_message("hldsconnect error: %d; hlds_address: %d", error, sock)
	}
	//log_amx("sock opened to %s:%s", host, port, rcon)
	hlds_challenge()
	return PLUGIN_CONTINUE
}

public hlds_rcon_cmd(host[], port, rcon[], cmd[]) 
{
	// If HLDS connection not available, try connecting first
	if(sock <= 0) 
	{
		hlds_makesock(host, port, rcon)
		//log_amx("%s:%s:%s", host, port, rcon)
		if(sock <= 0) 
		{
			// Still no connection. Give up.
			return PLUGIN_HANDLED
		}
	}
	
	// Just to be sure, get challenge
	hlds_challenge()
	
	new snd[256]
	
	// send rcon command
	setc(snd,255,0x00)
	setc(snd,4,0xff)
	format(snd[4],255,"rcon %s ^"%s^" %s",rconid, rcon, cmd)
	socket_send(sock,snd,255)
	
	new data[1025]

	new statusFile[64]
	get_configsdir(statusFile, 63)
	format(statusFile, 63, "%s/status.log", statusFile)
	
	// delete the temp file
	delete_file(statusFile)
	socket_recv(sock,data,1024)
	new line = 0
	write_file(statusFile, data, line)
	
	// Close the socket
	socket_close(sock)
	
	statusParse()

	return PLUGIN_CONTINUE
}

public statusParse()
{
	new statusFile[64]
	get_configsdir(statusFile, 63)
	format(statusFile, 63, "%s/status.log", statusFile)
	
	new textline[256], blank[64], len
	
	// Open the status.log file, and read line 4 to get the player count
	new playersline = 4, cur_players[3]
	
	while ( read_file(statusFile, playersline++, textline, 255, len))
	{
		// Player Count
		if (equal(textline, "players", 1))
		{
			parse(textline, blank, 0, blank, 0, cur_players, 2)
			log_amx("Player Count: %s", cur_players)
			
		}
		
	}

	
	// Open the status.log file, and read line by line looking for steamid's and names
	// The lines we need will all start with #
	
	new namesline = 7, name[64], steamid[64]
	
	while ( read_file(statusFile, namesline++, textline, 255, len))
	{
		// We need two diffrent if statements because of the output of status
		//   # 1    vs    #10
		
				// List of users if > 9 and their steam id's
		
		if (equal(textline, "#", 1))
		{
			parse(textline, blank, 0, name, 63, blank, 0, steamid, 63)
			log_amx("Name: %s Steam: %s", name, steamid)
			
		}
		
		
		// List of users id < 10 and their steam id's
		else if (equal(textline, "# ", 1))
		{
			parse(textline, blank, 0, blank, 0, name, 63, blank, 0, steamid, 63)
			log_amx("Name: %s Steam: %s", name, steamid)
			
		}

		
	
	}
	
}

public hlds_challenge() {
	// Try couple of times in row to get challenge
	new iNum=5,i
	for(i = 0; i <= iNum; i++) {
		//send challenge rcon and receive response
		new rcv[256],snd[256]
		setc(snd,4,0xff)
		copy(snd[4],255,"challenge rcon")
		setc(snd[18],1,'^n')
		socket_send(sock,snd,255)
		//log_amx("Snd: %s",snd)
		socket_recv(sock,rcv,255)
		//log_amx("Rec:%s",rcv)
		
		// get hlds rcon challenge number from response
		copy(rconid,12,rcv[19])
		replace(rconid,255,"^n","")
		if(rconid[0]) break
	}
	if(!rconid[0]) {
		log_amx("Could not get rcon challenge")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public plugin_end() 
{
	socket_close(sock)
}