summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugues Hiegel <hugues@hiegel.fr>2009-05-26 15:22:05 +0200
committerHugues Hiegel <hugues@hiegel.fr>2009-05-26 15:22:05 +0200
commit14fdad085440068cf9ba850e42916a39310979b8 (patch)
treec018c7ce78ab575d0c10a031b3d8db047b90e62f
parent753c41bd9481afd4f25f9d9c8f8d6d4a7679ca57 (diff)
Next Generation of Badges with format lines
-rw-r--r--Badges_NG.php301
1 files changed, 301 insertions, 0 deletions
diff --git a/Badges_NG.php b/Badges_NG.php
new file mode 100644
index 0000000..802e968
--- /dev/null
+++ b/Badges_NG.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ *
+ Licensed under WTFPL - DoWhatTheFuckYouWant Public License
+ (c) Hugues Hiegel 2006-2008 <hugues@hiegel.fr>
+
+ Thanks to Pavel Zbytovský - www.zby.cz
+ for saving me time with the MySQL stuff !
+
+
+CREATE TABLE `users` (
+ `username` varchar(100) NOT NULL,
+ `statsstart` bigint(11) NOT NULL,
+ `playcount` int(10) unsigned NOT NULL,
+ `lastupdate` bigint(11) unsigned NOT NULL,
+ PRIMARY KEY (`username`)
+) ;
+
+CREATE TABLE `badges` (
+ `username` varchar(100) NOT NULL,
+ `type` varchar(100) NOT NULL,
+ `style` varchar(100) NOT NULL,
+ `color` varchar(100) NOT NULL,
+ `lastupdate` bigint(11) default NULL,
+ `hits` bigint(20) unsigned NOT NULL,
+ `lasthit` bigint(11) unsigned default NULL,
+ `png` longblob,
+ PRIMARY KEY (`username`,`type`)
+);
+
+ *
+ */
+
+/*get the parameters*/
+$Pathinfo=$_SERVER['PATH_INFO'];
+$pathinfo=explode("/", $Pathinfo);
+$script=explode("/", $_SERVER['SCRIPT_NAME']);
+
+$username=$pathinfo[1];
+$type=$pathinfo[2];
+$style=$pathinfo[3];
+$color=$pathinfo[4];
+
+include("Config.php");
+
+mysql_connect(MYSQL_HOST, MYSQL_USER);
+mysql_select_db(MYSQL_DB);
+
+/*make cache data (array $data)*/
+$res = mysql_query("SELECT * FROM users WHERE username='" . gpc_addslashes(strtolower($username)) . "'");
+$data = mysql_fetch_assoc($res);
+
+if(($username AND !mysql_num_rows($res))
+OR ($data["lastupdate"] AND $data["lastupdate"]+CACHE < time()))
+ make_db_cache($username);
+
+/*output image cache*/
+$Cache=CACHE_FOLDER."/Pictures/".strtolower(rawurlencode($username))."_$type-$style-$color.png";
+
+clearstatcache();
+
+//if (is_file($Cache) AND (filemtime($Cache) >= $data['lastupdate'])){
+ //header("Location: ".$Cache); //its faster, but you should set CACHE_FOLDER = "."
+//}
+
+/*-----------------------------------------------------------
+ Ok, now we are ready to create the image with GD.
+*/
+
+$playcount = $data['playcount'];
+$statsstart = $data['statsstart'];
+
+$Lines = array();
+$Lines[] = new Text;
+
+if (! $playcount)
+{
+ $Lines[0]->value="Sorry, $username is not";
+ $Lines[0]->angle=rand(-1,2);
+ $Lines[] = new Text;
+ $Lines[1]->value="a valid Last.fm account";
+ $Lines[1]->angle=rand(-2,1);
+ define(HEIGHT, 50);
+ $Cache="";
+}
+else
+{
+ $res = mysql_query("SELECT * FROM badges WHERE username='" . gpc_addslashes(strtolower($username)) . "' AND type='$type' AND style='$style' AND color='$color';");
+ $badge = mysql_fetch_assoc($res);
+
+ if ( !is_file($Cache)
+ OR (filemtime($Cache) < $data['lastupdate'])
+ OR !filesize($Cache)
+ OR $username == "gugusse")
+ {
+
+ $duration = $_SERVER['REQUEST_TIME'] - $statsstart;
+ $months = $duration / (60*60*24*30);
+ $weeks = $duration / (60*60*24*7);
+ $days = $duration / (60*60*24);
+
+ $TPM = floor($playcount / $months); // TRACKS PER MONTH
+ $TPW = floor($playcount / $weeks); // TRACKS PER WEEK
+ $TPD = floor($playcount / $days); // TRACKS PER DAY
+ define(ALBUM_TRACKS, 13);
+ $APD = floor($TPD / ALBUM_TRACKS); // ALBUMS PER DAY
+ $APM = floor($TPM / ALBUM_TRACKS); // ALBUMS PER MONTH
+ $APW = floor($TPW / ALBUM_TRACKS); // ALBUMS PER WEEK
+
+ // %user <username>
+ // %number <number>
+ // %albumtrack «track»/«album»
+ // %dayweekmonth «day»/«week»/«month»
+ // %trueness «a true»/«an untrue»
+ // %since <month + year>
+ $formats = array("DEFAULT" => "%number %albumtrack per %dayweekmonth",
+ "Total" => "%number %albumtrack played",
+ "Trueness" => "%user is $trueness listener",
+ "Since" => "listening since %since",
+ "FAILBACK" => "Sorry, this $type is unavailable");
+
+ switch($type)
+ {
+ case "(Tracks|Albums)Per(Day|Week|Month)":
+ $TEXT="DEFAULT";
+ break;
+ case "Trueness":
+ case "Since":
+ case "Total":
+ $TEXT=$type;
+ break;
+ default:
+ $TEXT="FAILBACK";
+ break;
+ }
+
+ define(ANGLE,rand(2,13));
+
+ foreach ($Lines as $Line)
+ $Line->font = "import/" . $Styles[$style];
+
+ $y=0;
+ foreach ($Lines as $Line)
+ {
+ $size=imageftbbox($Line->size, $Line->angle, $Line->font, $Line->value);
+ $Line->initiate($size);
+ $y+=$Line->height;
+ $Line->y=$y;
+ }
+
+ $Image = new Text;
+ $Image->width = WIDTH;
+ $Image->height = $y;
+
+ $img=imagecreatetruecolor($Image->width, $Image->height);
+ imagealphablending($img, FALSE);
+ imagesavealpha($img, TRUE);
+
+ foreach ($Lines as $Line)
+ {
+ $Line->color=imagecolorallocate($img, GetColor("r", $Colors[$color]),
+ GetColor("g", $Colors[$color]),
+ Getcolor("b", $Colors[$color]));
+ }
+
+ $transparent=imagecolorallocatealpha($img, 255, 255, 255, 127);
+
+ imagefilledrectangle($img, 0, 0, $Image->width, $Image->height, $transparent);
+
+ foreach ($Lines as $Line)
+ imagettftext($img, $Line->size, $Line->angle, $Line->x, $Line->y, $Line->color, $Line->font, $Line->value);
+
+
+ imagepng($img, $Cache);
+ imagedestroy($img);
+
+ $QUERY=sprintf("REPLACE INTO badges (username, type, style, color, lastupdate, png) VALUES ('%s','%s','%s','%s', %s, '%s');",
+ $username,
+ $type,
+ $style,
+ $color,
+ time(),
+ $Cache );
+ //echo $QUERY;
+ mysql_query($QUERY);
+ }
+
+ if (is_file($Cache))
+ {
+ touch_badge($username, $type, $style, $color);
+ header("Content-Type: image/png");
+ //echo $Cache;
+ echo file_get_contents($Cache);
+ }
+}
+
+
+
+function make_db_cache($username){
+ global $data;
+ $profile_xml = file_get_contents("http://ws.audioscrobbler.com/1.0/user/".rawurlencode($username)."/profile.xml");
+
+ $feed=new XMLReader();
+ if($feed->xml($profile_xml)){
+ while ($feed->read())
+ {
+ switch ($feed->name)
+ {
+ case "playcount":
+ $feed->read();
+ $data['playcount']=intval($feed->value);
+ $feed->read();
+ break;
+
+ case "registered":
+ case "statsreset":
+ $data['statsstart']=$feed->getAttribute("unixtime");
+ $feed->read();
+ $feed->read();
+ break;
+
+ case "profile":
+ $data['username']=$feed->getAttribute("username");
+ break;
+ }
+ }
+
+ if ($data['playcount'] != 0)
+ {
+ $QUERY=(sprintf("REPLACE INTO users (statsstart,playcount,lastupdate,username) VALUES ('%s',%s,'%s','%s');",
+ time(), $data['playcount'], gpc_addslashes($data['statsstart']), gpc_addslashes(strtolower($username))));
+ mysql_query($QUERY);
+ }
+ }
+}
+
+function touch_badge($username, $type, $style, $color)
+{
+ $res = mysql_query("SELECT hits FROM badges WHERE username='" . gpc_addslashes(strtolower($username)) . "' AND type='$type' AND style='$style' AND color='$color';");
+ $data = mysql_fetch_assoc($res);
+
+ if(mysql_num_rows($res))
+ $hits = $data["hits"];
+ $hits++;
+
+ $QUERY=sprintf("UPDATE badges SET hits=%s, lasthit='%s' WHERE username='%s' AND type='$type' AND style='$style' AND color='$color';",
+ $hits, time(), gpc_addslashes(strtolower($username)));
+ //echo $QUERY;
+ mysql_query($QUERY);
+}
+
+function gpc_addslashes($str){
+ return (get_magic_quotes_gpc() ? $str : addslashes($str));
+}
+
+function GetColor($color, $code) {
+ switch($color)
+ {
+ case "r":
+ return ($code >> 16) & 0xff;
+ break;
+ case "g":
+ return ($code >> 8) & 0xff;
+ break;
+ case "b":
+ return ($code >> 0) & 0xff;
+ break;
+ }
+}
+
+
+class Text {
+ var $width = 0;
+ var $height = 0;
+ var $x = 0;
+ var $y = 0;
+
+ var $font = "";
+ var $size = 150; // High values to better quality
+ var $angle = 0;
+ var $color = 0;
+ var $value = "";
+
+ function initiate($size) {
+ $this->width = abs(
+ max($size[0], $size[2], $size[4], $size[6])
+ - min(0, $size[0], $size[2], $size[4], $size[6])
+ );
+ $this->height= abs(
+ max($size[1], $size[3], $size[5], $size[7])
+ - min(0, $size[1], $size[3], $size[5], $size[7])
+ );
+
+ $ratio = WIDTH / $this->width;
+
+ $this->width *= WIDTH;
+ $this->height *= $ratio;
+ $this->size *= $ratio;
+ }
+}
+