Y! Messenger online status (durata in zile/ore/min)

Spre bucuria multora am zis sa postez codul sursa de la scriptul asta facut de mine care afiseaza cate zile/ore/min este un ID de yahoo messenger online. In principiu pentru a functiona acest script aveti nevoie de un cronjob care sa ruleze un fisier PHP la fiecare minut. Asa e facut scriptul sa prelucreze informatiile din baza de date, eu am folosit MySQL. Orice modificare ulterioara a cronjob-ului atrage dupa sine si modificari majore in scriptul care calculeaza si aproximeaza durata ID-ului in stare online.

mysql.txt

CREATE TABLE `y_mess_time` (
`id` int(25) NOT NULL auto_increment,
`id_yahoo` varchar(50) NOT NULL default '',
`data` varchar(50) NOT NULL default '',
`ora` varchar(50) NOT NULL default '',
`stare` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM

ymess_cron.php

<?php
// setam id-ul de messenger
$id_yahoo = "ymess-ID";

// aflam starea id-ului
$file = 'http://opi.yahoo.com/online?u=' . $id_yahoo . '&m=t&t=1';
$open_file = fopen($file, 'r') OR die('Nu se poate deschide link-ul pentru citire'); 
$read_file = fread($open_file, 50);

// cateva setari
$data = date("j.m.Y"); 
$ora = date("H:i:s");
$stare = $read_file;

// conectarea la db
$db = mysql_connect("localhost", "db_user", "db_pass") or die("Could not connect.");
if(!$db) die("no db");
if(!mysql_select_db("db_name",$db)) die("No database selected.");

// scrierea in db a starii id-ului
mysql_query("INSERT INTO y_mess_time (id_yahoo, data, ora, stare) 
			 VALUES ('$id_yahoo', '$data', '$ora', '$stare')") or die (mysql_error()); 

fclose($open_file);

ymess_status.php

<?php 
// conectarea la db
$db = mysql_connect("localhost", "db_user", "db_pass") or die("Could not connect.");
if(!$db) die("no db");
if(!mysql_select_db("db_name",$db)) die("No database selected.");

// cateva setari de baza..
$data = date("j.m.Y"); 
$stare = '01';

// inregistrari astazi
$interogare = mysql_query("SELECT * 
						   FROM y_mess_time 
						   WHERE data = '$data' 
						   AND stare = '$stare'", $db); 
$rezultat = mysql_num_rows($interogare); 

// impartim numarul de inregistrari la 60 (transf din minute in ore)
$timp = $rezultat / 60;

// functie pentru a modela cat de cat numarul rezultat pana acum
function approx($num)
{
	$numar = explode(".", $num);
	return $numar['0'] . '.' . substr($numar['1'], 0, 2);
}
$ore = approx($timp);

// setari default asta in cazul in care nu este nici o inregistrare sa nu apara campurile goale..
$y_ore_on = $y_min_on = '00';

// cateva verificari pentru a aproxima numarul de ore si min
$y_ore = explode(".", $ore);
if ($y_ore['1'] > 60)
{
	$y_ore_on = $y_ore['0'] + 1;
	$y_min_on = $y_ore['1'] - 60;
}
else
{
	$y_ore_on = $y_ore['0'];
	$y_min_on = $y_ore['1'];
}

$y_ore_count = strlen($y_ore_on);
$y_min_count = strlen($y_min_on);

if ($y_ore_count == 1) { $y_ore_on = '0' . $y_ore_on; }
if ($y_min_count == 1) { $y_min_on = '0' . $y_min_on; }

// inregistrari total
$interogare2 = mysql_query("SELECT * 
							FROM y_mess_time 
							WHERE stare = '$stare'", $db); 
$rezultat2 = mysql_num_rows($interogare2); 

// impartim numarul de inregistrari la 60 (transf din minute in ore)
$timp2 = $rezultat2 / 60;

// functie pentru a modela cat de cat numarul rezultat pana acum
function approx2($num2)
{
	$numar2 = explode(".", $num2);
	return $numar2['0'] . '.' . substr($numar2['1'], 0, 2);
}
$ore2 = approx2($timp2);

// setari default asta in cazul in care nu este nici o inregistrare sa nu apa campurile goale..
$y_ore_on2 = $y_min_on2 = '00';
$y_zile_on = '000';

// cateva verificari pentru a aproxima numarul de ore si min
$y_ore2 = explode(".", $ore2);
if ($y_ore2['1'] > 60) 
{
	$y_ore_on2 = $y_ore2['0'] + 1;
	$y_min_on2 = $y_ore2['1'] - 60;
}
else
{
	$y_ore_on2 = $y_ore2['0'];
	$y_min_on2 = $y_ore2['1'];
}

// impartim numarul de ore la 24 (transf din ore in zile)
$zile = $y_ore_on2 / 24;
$y_zile = explode(".", $zile);
$y_zile_c = strlen($y_zile['0']);
if ($y_zile_c == 1) { $numar_zile = substr($zile, 0, 1); } 
if ($y_zile_c == 2) { $numar_zile = substr($zile, 0, 2); } 
if ($y_zile_c == 3) { $numar_zile = substr($zile, 0, 3); }

while ($y_ore_on2 > 24) 
{
	$y_ore_on2 = $y_ore_on2 - 24;
} 

$y_ore_count2 = strlen($y_ore_on2);
$y_min_count2 = strlen($y_min_on2);
$y_zile_count = strlen($numar_zile);
if ($y_ore_count2 == 1) { $y_ore_on2 = '0' . $y_ore_on2; }
if ($y_min_count2 == 1) { $y_min_on2 = '0' . $y_min_on2; }
if ($y_zile_count == 1) { $y_zile_on = '00' . $numar_zile; }
if ($y_zile_count == 2) { $y_zile_on = '0' . $numar_zile; }
?>
Astazi: <b><?php echo $y_ore_on; ?></b> ore si <b><?php echo $y_min_on; ?></b> minute<br />
Total: <b><?php echo $y_zile_on; ?></b> zile <b><?php echo $y_ore_on2; ?></b> ore si <b><?php echo $y_min_on2; ?></b> min din data 29 Ian 2006

Script-ul este simplu, privit in ansamblu. Ideea aproximarii timpului a fost mai grea 🙂 dar in rest poate fi modificat dupa bunul plac.

Scriptul e compus din 2 fisiere (ymess_cron.php si ymess_status.php), primul fisier trebuie rulat la fiecare minut iar al doilea afiseaza durata. Script-ul in functiune arata cam asa:

Astazi: 12 ore si 34 minute
Total: 005 zile 03 ore si 21 min din data 29 Ian 2006

Pentru cei care nu au auzit de cronjob, in primul rand ca sa puteti pune o linie de comanda care sa acceseze acest fisier la fiecare minut trebuie sa scrieti comanda cronjob -e si apoi cronjob -l pe server cu linux. Ca sa verificati daca cronul a fost adaugat, asta daca sunteti pe Putty sau daca folositi CPanel de acolo de la cron-uri, linia de comanda pentru cronjob, cand lucrati direct din Putty, este:

*/1 * * * * lynx -dump http://website.ro/ymess_status/ymess_cron.php

sau

*/1 * * * * php http://website.ro/ymess_status/ymess_cron.php

Multa bafta iar pentru nelamuriri astept comentariu. Sper sa va placa si sa va fie de folos, puteti sa il modificati dupa bunul plac, dar vreau sa imi treceti nick-ul sau adresa blog-ului pe acolo.

5 thoughts on “Y! Messenger online status (durata in zile/ore/min)”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.