#!/usr/bin/perl
use strict;
use IO::Socket;



# >> LIBRARY PATH [UPDATE!]

use lib '/full/path/to/adcycle';      # update this path to the adcycle dir

# << LIBRARY PATH




# >> no other mods are required -------- >>


# >> from core
my $master;
use strict;
use AdConfig;
use AdEnv;
use AdDb;
use AdCron;
use AdCookies;
use CGI;
$master->{config}=AdConfig->new();
$master->{env}=AdEnv->new();
$master->{db}=AdDb->new;
$master->{cron}=AdCron->new;
$master->{cookie}=AdCookies->new;
$master->{query}=CGI->new;
$master->{db}->connect($master,"adcycle");
my $cgi_bin_url=$master->{config}->get_cgi_bin_url;
my $images_url=$master->{config}->get_images_url;
# << from core



my $socket_dir=$master->{query}->param('socket_dir');
my $socket_id=$master->{query}->param('socket_id');

my $pid=$$;
open(W,">$socket_dir/pid$socket_id");
print W "$pid";
close(W);
system("chmod 777 $socket_dir/pid$socket_id");



my $buf;
my $new_sock;
unlink "$socket_dir/adsock$socket_id";
my $sock_server=new IO::Socket::UNIX(
   Local  => "$socket_dir/adsock$socket_id",
   Type   => SOCK_STREAM,
   Listen => SOMAXCONN
) || die "Socket init failure: $!";
system("chmod 777 $socket_dir/adsock$socket_id");

$sock_server->autoflush(1);

my $counter=0;
while($new_sock=$sock_server->accept()){
  $new_sock->autoflush(1);
	$counter++;
  while(($buf=<$new_sock>) && ($buf!~/xENDx/)){
    chomp($buf);




if(index($buf,"DAEMON_PING")==-1){



$master->{env}=AdEnv->new();


# >> mod block
my $datestamp=$master->{env}->get_datestamp;
my $timestamp=$master->{env}->get_timestamp;
my $hour=$master->{env}->get_hour;
my($qs,$remote,$agent,$hostname,$page_url,$cookie)=split(/\|xx\|/,$buf);
my $gid=$master->{cookie}->parse_query($qs,'gid')+0;
my $cid=$master->{cookie}->parse_query($qs,'cid')+0;
my $mid=$master->{cookie}->parse_query($qs,'mid')+0;
my $layout=$master->{cookie}->parse_query($qs,'layout')."";
my $keywords=$master->{cookie}->parse_query($qs,'keywords')."";
my $refresh=$master->{cookie}->parse_query($qs,'refresh')."";
my $id=$master->{cookie}->parse_query($qs,"\&id")."";
my $target=$master->{cookie}->parse_query($qs,'t')."";
my $type=$master->{cookie}->parse_query($qs,'type')."";
$master->{datestamp}=$datestamp;
# << mod block


# >> get the group ref + cookie
my $gidref=$master->{db}->select_single_row_hash("SELECT * FROM groups where GID='$gid'");
$master->{gidref}=$gidref;
$master->{page_url}=$page_url;
my $width=$gidref->{WIDTH};
my $height=$gidref->{HEIGHT};
my $tid=$gidref->{TID};
$master->{TID}=$tid;
my $impr_cookie=$master->{cookie}->parse_cookie($cookie,"i$tid");
my $click_cookie=$master->{cookie}->parse_cookie($cookie,"c$tid");
# << get the group ref + cookie



# <-------------------------------------------



# >> define defaults
$master->{hostname}=$hostname;
$master->{impr_cookie}=$impr_cookie;
$master->{click_cookie}=$click_cookie;
$master->{remote}=$remote;
$master->{keywords}=$keywords;
$master->{type}=$type;
$master->{timestamp}=$timestamp;
$master->{layout}=$layout;
my $cookie_depth=35;
$master->{COOKIE_DEPTH}=$cookie_depth;
my $output="";
if($gid==0){$gid=1;}
if($id==0){$id=1;}
$master->{GID}=$gid;
$master->{ID}=$id;
my $forced_delivery="no";
if($cid>0){$forced_delivery="yes";}
# << define defaults



# get unix stamp
my $epoch_seconds=$master->{db}->single_result("SELECT UNIX_TIMESTAMP('$timestamp')");
$master->{UNIX_STAMP}=$epoch_seconds;
my $hour_stamp=int($epoch_seconds/3600);


#get the adconfig
my $configref=$master->{db}->select_single_row_hash("SELECT * FROM adconfig");


# poor man's cron 
if($hour_stamp != $configref->{THIS_HOUR} && $configref->{CRON_ENABLED}==0){
	$master->{cron}->hourly_update($master);
}


# insert delayed
my $delayed="";
if($configref->{DELAYED_INSERT}==1){
	$delayed=" DELAYED ";
}

my $cidref;
if($cid==0){
	# get available campaigns from cp_grouping
	my(@cidref)=$master->{db}->select_multi_row_hash("
	SELECT DISTINCT cp_grouping.WEIGHT,cp.RICH_ONLY,cp.WIDTH,cp.HEIGHT,cp.IMPR_DELAY,cp.IMPR_LIMIT,cp.CLICK_DELAY,cp.CLICK_LIMIT,cp.RATE_CONTROL,cp.TARGET,cp.CID
	FROM cp_grouping,cp  
	WHERE cp_grouping.GID=$gid AND cp_grouping.STATUS=1 AND cp_grouping.CID=cp.CID AND cp.IMPR_BIN>0 AND cp.CLICK_BIN>0 AND cp.ACTION_BIN>0 
	ORDER BY WEIGHT DESC
	");
	my $cidtot=@cidref;


	# >> target
	my @new_cidref;
	my @default;
	for(my $k=0;$k<$cidtot;$k++){
		my $ck="yes";
		if($cidref[$k]->{RICH_ONLY}==1 && $type ne "iframe" && $type ne "ssi"){
			$ck="no";
		}
		if($cidref[$k]->{TARGET}==1 && $cidref[$k]->{WEIGHT}>0){
			my $output=$master->{cookie}->target($master,$cidref[$k]);						
			if($output eq "bad"){$ck="no";}
		}
		if($cidref[$k]->{WEIGHT}==0 && $ck eq "yes"){
			$ck="no";
			push(@default,$cidref[$k]);
		}
		if($ck eq "yes"){
			push(@new_cidref,$cidref[$k]);
		}
	}
	@cidref=@new_cidref;
	$cidtot=@cidref;
	# << target


	# build grid hash
	my %grid;
	for(my $k=0;$k<$cidtot;$k++){
		$grid{$cidref[$k]->{CID}}=$cidref[$k]->{WEIGHT};
	}
	$master->{GRID}=\%grid;

	# parse the incoming cookies
	$master=$master->{cookie}->parse_cookies($master,@cidref);

	# count screen campaigns
	@cidref=$master->{cookie}->count_screen($master,@cidref);

	# >> find a campaign to display
	if($gidref->{ROTATION_FLAVOR}==0){
		$cidref=$master->{cookie}->cookie_random_weighted($master,@cidref);
	}
	if($gidref->{ROTATION_FLAVOR}==1){
		$cidref=$master->{cookie}->cookie_ordered_weighted($master,@cidref);
	}
	if($gidref->{ROTATION_FLAVOR}==2){
		$cidref=$master->{cookie}->random_weighted($master,@cidref);
	}
	# << end find a campaign to display

	if(!$cidref){
		$cidref=$master->{cookie}->random_select($master,@default);
	}


}else{
	$cidref=$master->{db}->select_single_row_hash("SELECT * FROM cp where CID='$cid'");
}



my $head="";
if($refresh>0 && $type ne "ssi"){
	$head=qq~
	<head>
	<META HTTP-EQUIV="refresh" CONTENT="$refresh">
	<META HTTP-EQUIV="expires" CONTENT="Jan 01, 1994">
	<META HTTP-EQUIV="pragma" CONTENT="no-cache">			
	</head>
	~;
}


# >> PROCESS THE CAMPAIGN
if($cidref->{CID}>0 && $gidref){
	$cid=$cidref->{CID};
	$master->{CID}=$cid;

	my $query_append;
	if($type eq "ssi" || $type eq "iframe"){
		$query_append="and USE_AS_HTML_DEFAULT=0";
	}else{
		$query_append="and AD_TYPE=0";
	}


	my $mediaref;
	if($mid==0){
		# get banners to display
		my(@midref)=$master->{db}->select_multi_row_hash("SELECT * FROM cp_media WHERE CID=$cid AND WEIGHT > 0 $query_append");
		my $midtot=@midref;
		# >> select the media to display
		srand();
		my $BNRAND=int(rand(1000));
		my $TOTAL;
		for(my $k=0;$k<$midtot;$k++){
			$TOTAL=$TOTAL+$midref[$k]->{WEIGHT};
		}
		if($TOTAL==0){$TOTAL=$TOTAL+1;}
		my $MULT=1000/$TOTAL;
		my @rank=0;
		my $run=0;
		my $FOUND_cp=0;
		my $old_value=0;
		my $done;
		for(my $k=0;$k<$midtot;$k++){
			$rank[$k]=$run+($midref[$k]->{WEIGHT}*$MULT);
			$run=$rank[$k];
			if($rank[$k]>=$BNRAND && $rank[$k]>=$old_value && $FOUND_cp!=10){
				$FOUND_cp=10;
				$mediaref=$midref[$k];
				$done="YES";
			}
			$old_value=$rank[$k];
		}
		# << end select media to display
	}else{
		$mediaref=$master->{db}->select_single_row_hash("SELECT * FROM cp_media where MID='$mid'");
	}
	$master->{MID}=$mediaref->{MID};
	my $mid=$mediaref->{MID};


	# >> convert
	$mediaref->{IMG_URL}=~s/IDNUMBER+/$id/g;
	$mediaref->{CLICK_URL}=~s/IDNUMBER+/$id/g;
	$mediaref->{RICH}=~s/gid=GID+/gid=$gid/g;
	$mediaref->{UNDER_TEXT}=~s/IDNUMBER+/$id/g;
	$mediaref->{RICH}=~s/IDNUMBER+/$id/g;
	# << convert


	my $target;
	if($mediaref->{TARGET} ne "none"){$target=qq~ target="$mediaref->{TARGET}"~;}
	if($mediaref->{TARGET} eq "none"){$target=qq~ target="$target"~;}
	my $mouseover="";
	if(length($mediaref->{MOUSEOVER})>0){
		$mouseover=qq~ onMouseover="$mediaref->{MOUSEOVER}" ~;
	}


	# >> Normal banner/button
	if($width>2 && $height>2){
		# >> create ad output
		if($type eq "iframe" || $type eq "ssi"){
			if($mediaref->{AD_TYPE}==0){# standard gif
				my $under_text;
				my $border=0;
				if($type eq "ssi"){
					$border="$mediaref->{BORDER}";
				}
				if(length($mediaref->{UNDER_TEXT})>1){$under_text=qq~<a href="$cgi_bin_url/adclick.cgi?cid=$cid&mid=$mid&gid=$gid&id=$id"$target>$mediaref->{UNDER_TEXT}</a><br>~;}
				$output=qq~$head<a href="$cgi_bin_url/adclick.cgi?cid=$cid&mid=$mid&gid=$gid&id=$id"$mouseover$target><img src="$mediaref->{IMG_URL}" width=$gidref->{WIDTH} height=$gidref->{HEIGHT} border=$border ALT="$mediaref->{ALT}"></a><br>$under_text~;
				if(index($mediaref->{SINGLE_PIXEL_URL},"http")!=-1){
					$output.=qq~<img src="$mediaref->{SINGLE_PIXEL_URL}" width=1 height=1 border=0>~;
				}
				$output="<!-- START ADCYCLE  HTML CODE -->".$output."<!-- END ADCYCLE HTML CODE -->";
			}else{# rich media
				$output=qq~$head$mediaref->{RICH}~;
			}
		}else{ #standard gif redirect
			$output=qq~Location: $mediaref->{IMG_URL}\n\n~;
		}
		# << end create ad output
	}
	# << Normal banner/button


	# >> Text Link
	if($width==1 && $height==1){
		if($forced_delivery eq "yes"){
			$output=qq~Location: $images_url/clear.gif\n\n~;
		}else{
			$mediaref->{UNDER_TEXT}=~ s/\'/\\'/g;
			my $turl=qq~<a href="$cgi_bin_url/adclick.cgi?cid=$cid&mid=$mid&gid=$gid&id=$id"$mouseover$target>~;
			if(index($mediaref->{UNDER_TEXT},"[U]")==-1){
				$output=qq~document.write('$turl$mediaref->{UNDER_TEXT}</a>');~;
			}else{
				$output=$mediaref->{UNDER_TEXT};
				$output=~ s/\[U\]/$turl/g;
				$output=~ s/\[\/U\]/\<\/a\>/g;
				$output=qq~document.write('$output');~;
			}
		}
	}
	# << Text Link


	# >> update database files
	if($width==2 && $height==2){$output=qq~Location: $mediaref->{CLICK_URL}\n\n~;}
	$master->{db}->{adcycle}->do("UPDATE cp_media SET TOTAL_IMPR=TOTAL_IMPR+1 WHERE MID='$mid'");
	$master->{db}->{adcycle}->do("UPDATE cp_grouping SET HOUR_IMPR=HOUR_IMPR+1,TOTAL_IMPR=TOTAL_IMPR+1 WHERE GID='$gid' AND CID='$cid' AND MID='$mid'");
	$master->{db}->{adcycle}->do("UPDATE cp SET IMPR_BIN=IMPR_BIN-1,DELIVERED_IMPR=DELIVERED_IMPR+1,TODAY_IMPR=TODAY_IMPR+1 WHERE CID='$cid'");
	my $insert_list=[["IP",$remote],["CID",$cid],["GID",$gid],["MID",$mid],["ACTION","0"],["AGENT",$agent],["PAGE_URL",$page_url],["CACHE",$id]];
	$master->{db}->insert_row("dlog$hour",$insert_list,$delayed);
	# << end update database files


	# >> raw_logging [turn from "off" to "on" to enable]
	my $logging="off";
	my $log_dir="/path/to/log/dir";
	my $event_type="I";

	if($logging eq "on"){

		# more load! - comment out fields you don't need
		my $cidref=$master->{db}->select_single_row_hash("SELECT * FROM cp where CID='$cid'");
		my $aidref=$master->{db}->select_single_row_hash("SELECT * FROM ad where AID='$cidref->{AID}'");
		my $midref=$master->{db}->select_single_row_hash("SELECT * FROM cp_media where MID='$mid'");
		
		my $list.="$event_type|"; # event type
		$list.="$remote|"; # IP
		$list.="$cidref->{AID}|"; # ADVERTISER ID
		# $list.="$aidref->{ADVERTISER_NAME}|"; # ADVERTISER NAME
		$list.="$cid|"; # CAMPAIGN ID
		# $list.="$cidref->{CAMPAIGN_NAME}|"; # CAMPAIGN NAME
		$list.="$gid|"; # GID
		# $list.="$gidref->{GROUP_NAME}|"; # GROUP NAME
		$list.="$mid|"; # MID
		#	$list.="$midref->{NAME}|"; # MEDIA NAME
		$list.="$agent|"; # BROWSER TYPE
		$list.="$page_url|"; # PAGE URL
		$list.="$datestamp|"; # DATESTAMP
		
		open(W,">> $log_dir/raw.log");
		print W "$list\n";
		close(W);
	}
	# << raw_logging




}
# << END PROCESS THE CAMPAIGN



# >> ERROR OCCURRED -- the dreaded black adcycle banner
if($cidref->{CID}+0==0 || length($output)<1 || !$gidref){
	if($tid+0==0){
		$tid=1;
	}
	my $tidref=$master->{db}->select_single_row_hash("SELECT * FROM adtype WHERE TID=$tid");
	if($type eq "iframe"){
		$output=qq~$head<a href="$tidref->{DEFAULT_CLICK}" target="_top"><img src="$tidref->{DEFAULT_IMAGE}" border=0 width=$gidref->{WIDTH} height=$gidref->{HEIGHT}></a>~;
	}elsif($type eq "ssi"){
		$output=qq~<a href="$tidref->{DEFAULT_CLICK}" target="_top"><img src="$tidref->{DEFAULT_IMAGE}" border=0 width=$gidref->{WIDTH} height=$gidref->{HEIGHT}></a>~;
	}else{
		$output=qq~Location: $tidref->{DEFAULT_IMAGE}\n\n~;
	}
	my $insert_list=[["REMOTE",$remote],["GID",$gid],["ACTION","0"],["AGENT",$agent],["PAGE_URL",$page_url],["LOG_TIME",$datestamp]];
	$master->{db}->insert_row("error_log",$insert_list,$delayed);
}
# << ERROR OCCURRED


# <-------------------------------------------






	# >> mod block
	my $part1="";
	if(length($configref->{P3P})>0){
		$part1.=qq~P3P: $configref->{P3P}\n~;
	}
	if($forced_delivery eq "no"){
		$master->{cookie}->output_cookie($master);
		$part1.=$master->{impr_cookie};
	}
	if($type ne "ssi"){
	  $part1.="Cache-Control: no-cache\n";
	  $part1.="Pragma: no-cache\n";
	  $part1.="Expires: 0\n";
	}
	if($type eq "iframe"){
	  $part1.="Content-Type: text/html\n\n";
	}
	if($width==1 && $height==1 && $forced_delivery eq "no"){	
		$part1.="Content-Type: application/x-javascript\n\n";
	}

	print $new_sock "$part1$output\0";
	# << mod block


	# >> multi-layout add-on
	if($master->{layout} eq "multi"){
		$master->{db}->release_lock("cplock$tid");
	}
	# << multi-layout add-on


}else{
	#get the adconfig
	my $configref=$master->{db}->select_single_row_hash("SELECT * FROM adconfig");
	if($configref){
		print $new_sock "GOOD PROBE\n";
	}else{
		print $new_sock "BAD PROBE\n";
	}
}

}
$new_sock->close();
	
}
close($sock_server);
