User:General Earl/scripts/API - ranks

From Earth Empires Wiki
Jump to: navigation, search

This is a very basic example. Can probably be converted to use MySQL or similar type database fairly easily.

#!/usr/bin/perl -w

use strict;

use POSIX qw(strftime);
use Compress::Zlib;
use HTTP::Message;
use LWP;
use DBI;

$| = 1;

print "\n".&logTime." Status : News collection started.\n";

sub logTime {
	my $time = strftime "%Y-%m-%d %H:%M:%S", gmtime;
	return $time;
}

# put things in an infinite loop
while (1) {

sub getContent {
	# setup You need an API key
	my $api     = "";
	
	# ServerIDs
	#  8 = Express
	#  9 = Alliance
	# 10 = Team
	# 11 = Primary
	# 12 = FFA
	# Multiple servers example: $server = "8,9,10,11,12"'
	my $server  = 9;
	
	#ranks feed link
	my $url = "http://www.earthempires.com/ranks_feed?apicode=${api}&serverid=${server}";
	
	# time to wait if retrieval fails.
	my $delaytime = 10;

	# do content retieval
	my $ua = LWP::UserAgent->new;
	$ua->timeout(20);
	my $can_accept = HTTP::Message::decodable;
	my $response = $ua->get($url, 'Accept-Encoding' => $can_accept );
	if ($response->is_error) {
		printf "[%d] %s\n", $response->code, $response->message;
		die;
	}
	my $content = $response->decoded_content;
	
	# check our stuff
	if ($content eq "You already received this update") {
		#print &logTime()." Server says: $content\n";
		print &logTime()." Warning: Waiting $delaytime seconds, requesting too fast.\n";
		sleep $delaytime;
	} elsif ($content eq "") {
		print &logTime()." Warning: No content received, waiting $delaytime seconds.\n";
		sleep $delaytime;
	} else {
		print &logTime()." Status : Retrieving content...\n";
		my $contentclip = substr($content,0,127);
		print &logTime()." Status : Server replied:\n$contentclip ...\n";
		&getRanks($content);
	}
}

sub getRanks {
	my $dbfile = "alliance.db";
	my $content = shift @_;
	my @countries = split("\n",$content);
	
	# time between updates
	my $wait = 300;
	
	# stamp all entries together for easier retrieval.
	my $timestamp = strftime "%Y-%m-%d %H:%M:%S", gmtime;
	
	# API csv values:
	# server, resetid, rank, cnum, cname, land, nw, tag, gov, gdi prot, vac, alive, deleted
	print &logTime()." Status : Opening database ($dbfile)...\n";
	my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","") or die "couldn't connect to db".DBI->errstr;
	$dbh->do("CREATE TABLE IF NOT EXISTS history (
					id INTEGER PRIMARY KEY,
					ts TEXT,
					server INTEGER, 
					resetid INTEGER,
					rank INTEGER,
					cnum INTEGER,
					cname TEXT,
					land INTEGER,
					nw INTEGER,
					tag TEXT,
					govt TEXT,
					gdi INTEGER,
					prot INTEGER,
					vac INTEGER,
					alive INTEGER,
					deleted INTEGER
					)"
	);
	print &logTime()." Status : Writing records...\n";
	my $counter = 0;
	$dbh->begin_work();
	foreach my $country (@countries) {
		my @data = split(",", $country);
		my ($server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted) = @data;
		$dbh->do("INSERT INTO history\(
					ts,
					server, 
					resetid, 
					rank, 
					cnum,
					cname,
					land,
					nw,
					tag,
					govt,
					gdi,
					prot,
					vac,
					alive,
					deleted
					) VALUES (
					'$timestamp',
					'$server', 
					'$resetid', 
					'$rank', 
					'$cnum', 
					'$cname', 
					'$land', 
					'$nw', 
					'$tag', 
					'$govt', 
					'$gdi', 
					'$prot', 
					'$vac', 
					'$alive', 
					'$deleted'
					)"
		);
		#print "$counter: $server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted\n";
		#printf "%4s: %2s %4s %4s %4s %-34s %7s %12s %12s %1s %1s %1s %1s %1s %1s\n", $counter, $server, $resetid, $rank, $cnum, $cname, $land, $nw, $tag, $govt, $gdi, $prot, $vac, $alive, $deleted;
		$counter++;
	}
	$dbh->commit();
	$dbh->disconnect;
	print &logTime()." Status : $counter records added to history.\n";
	print &logTime()." Status : Waiting $wait seconds for next update.\n";
	sleep $wait;
}
&getContent;

}