<?php 
// $Id: drupalchat.module,v 1.9 2010/07/14 10:45:40 darklrd Exp $

/**
 * @file
 * Module code for DrupalChat.
 */

/**
 * Implementation of hook_help().
 */
function drupalchat_help() {
	if ($path == 'admin/help#drupalchat') {
		$help_text = 'Provides one on one chat.';
		return '<p>' . t($help_text) . '</p>';
	}
}
/**
 * Implementation of hook_perm().
 */
function drupalchat_perm() {
  return array(
    'administer drupalchat',
    'access drupalchat',
  );
}
/**
 * Implementation of hook_block().
 */
function drupalchat_block($op = 'list', $delta = 0, $edit = array()) {
  switch ($op) {
    case 'list':
      return array(
        'drupalchat' => array(
          'info' => t('DrupalChat'),
        ),
      );
    case 'view':
      if ($delta == 'drupalchat' && user_access('access drupalchat')) {
        return array(
          'subject' => t(''),
          'content' => theme('drupalchat'),
          'cache'   => BLOCK_NO_CACHE,
        );
      }
      break;
  }
}
/**
 * Implementation of hook_theme().
 */
function drupalchat_theme($existing, $type, $theme, $path) {
  return array(
    'drupalchat' => array(
      'template' => 'drupalchat',
      'arguments' => array(),
      'path' => drupal_get_path('module', 'drupalchat') .'/themes',
      'file' => 'drupalchat.theme.inc',
      
    ),
  );
}
/**
* Implementaiton of hook_menu()
*/
function drupalchat_menu() {
	$items['admin/settings/drupalchat'] = array(
    	'page callback' => 'drupal_get_form',
    	'page arguments' => array('drupalchat_settings_form'),
    	'file' => 'includes/drupalchat.admin.inc',
    	'access arguments' => array('administer drupalchat'),
    	'title' => 'DrupalChat settings',
    	'description' => 'Administer DrupalChat.',
    );
	$items['drupalchat/online-users'] = array(
		'title' => 'DrupalChat Online Users',
		'page callback' => 'drupalchat_online_users',
		'access arguments' => array('access drupalchat'),
		'type' => MENU_CALLBACK,
	);
	$items['drupalchat/process-messages'] = array(
		'title' => 'DrupalChat Messages',
		'page callback' => 'drupalchat_process_messages',
		'access arguments' => array('access drupalchat'),
		'type' => MENU_CALLBACK,
	);
	$items['drupalchat/process-messages-long-polling'] = array(
		'title' => 'DrupalChat Messages',
		'page callback' => 'drupalchat_process_messages_long_polling',
		'access arguments' => array('access drupalchat'),
		'type' => MENU_CALLBACK,
	);
	$items['drupalchat/store-messages'] = array(
		'title' => 'DrupalChat Messages',
		'page callback' => 'drupalchat_store_messages',
		'access arguments' => array('access drupalchat'),
		'type' => MENU_CALLBACK,
	);
	$items['drupalchat/load-messages'] = array(
		'title' => 'DrupalChat Messages',
		'page callback' => 'drupalchat_load_messages',
		'access arguments' => array('access drupalchat'),
		'type' => MENU_CALLBACK,
	);
	return $items;
}
/**
* Process and get messages
*/
function drupalchat_process_messages() {
	global $user;
	if(isset($_POST['drupalchat_current_message']) && ($_POST['drupalchat_current_message']=='TRUE')) {
		$current_message = (object) array(
	  		'uid1' => $user->uid,
	  		'uid2' => check_plain($_POST['drupalchat_uid2']),
	  		'message' => check_plain($_POST['drupalchat_message']),
	  		'timestamp' => time(),	
		);
		drupal_write_record('drupalchat_msg',$current_message);
	}
	else {
		if(($_POST['drupalchat_last_timestamp'])!=0) {
			$last_timestamp = check_plain($_POST['drupalchat_last_timestamp']);
		}
		else {
			$last_timestamp = time();
		}
		$results = db_query('SELECT name, uid1, uid2, message, timestamp FROM {drupalchat_msg},{users} WHERE uid2 = %d AND timestamp > %d AND {drupalchat_msg}.uid1={users}.uid ORDER BY timestamp ASC',$user->uid,$last_timestamp);
		drupal_set_header('Content-Type: text/plain; charset: utf-8');
		printf('{ "messages": [');
		$drupalchat_counter = 0;
		while($result = db_fetch_object($results)) {
			if((module_exists('drupalchat_ur')) && (variable_get('drupalchat_ur_name',NULL)) && (variable_get('drupalchat_ur_activate',FALSE))) {
				$friends = user_relationships_load(array("between" => array($result->uid1, $result->uid2)));
				foreach ($friends as $relationship) {
    				if ($relationship->approved && $relationship->name == variable_get('drupalchat_ur_name','friend')) {
       					$output = '{"message": "%s", "timestamp": "%s", "uid1": "%s", "name": "%s"}';
						printf($output, $result->message, $result->timestamp, $result->uid1, $result->name);
						$drupalchat_counter++;
    				}
				}
			}
			else {
				$output = '{"message": "%s", "timestamp": "%s", "uid1": "%s", "name": "%s"}';
				printf($output, $result->message, $result->timestamp, $result->uid1, $result->name);
				$drupalchat_counter++;
			}
			if($drupalchat_counter < $results->num_rows) {
				printf(',');
			}
			if($result->timestamp > $last_timestamp) {
				$last_timestamp = $result->timestamp;
			}
		}	
		printf('], "total_messages": "%s", "last_timestamp": "%s",',$results->num_rows, $last_timestamp);
		
		$current_user = (object) array(
      'uid' => $user->uid,
      'name' => $user->name,
      'session' => $user->sid,
      'timestamp' => time(),
    );
	if($user->uid > 0) {
		$result = db_query('SELECT uid, name, session, timestamp FROM {drupalchat_users} WHERE uid = %d',$user->uid);
		if(!$result->num_rows) {
			drupal_write_record('drupalchat_users',$current_user);
		}
		else {
			drupal_write_record('drupalchat_users',$current_user,'uid');
		}
	}
	$total_online_users = 0;
	$results = db_query('SELECT  uid, name FROM {drupalchat_users} WHERE timestamp >= (%d-%d)',time(),variable_get('drupalchat_refresh_rate', 2));
	printf('"online": {');
	while($result = db_fetch_object($results)) {
		if((module_exists('drupalchat_ur')) && (variable_get('drupalchat_ur_name',NULL)) && (variable_get('drupalchat_ur_activate',FALSE)) && ($user->uid != $result->uid)) {
			$friends = user_relationships_load(array("between" => array($user->uid, $result->uid)));
			foreach ($friends as $relationship) {
    			if ($relationship->approved && $relationship->name == variable_get('drupalchat_ur_name','friend')) {
       				$output = '"%s": "%s",';
					printf($output, $result->uid, $result->name);
					$total_online_users++;
    			}
			}
		}
		else {
			$output = '"%s": "%s",';
			printf($output, $result->uid, $result->name);
			$total_online_users++;
		}
	}
	printf('"total": "%s"}}',$total_online_users);
	//printf('"total": "%s"}}',$total_online_users.'/'.round(memory_get_peak_usage()/(1024*8)));

	}
}
/**
* Process and get messages via long polling
*/
function drupalchat_process_messages_long_polling() {
	global $user;
	if(isset($_POST['drupalchat_current_message']) && ($_POST['drupalchat_current_message']=='TRUE')) {
		$current_message = (object) array(
	  		'uid1' => $user->uid,
	  		'uid2' => check_plain($_POST['drupalchat_uid2']),
	  		'message' => check_plain($_POST['drupalchat_message']),
	  		'timestamp' => time(),	
		);
		drupal_write_record('drupalchat_msg',$current_message);
	}
	else {
		if(($_POST['drupalchat_last_timestamp'])!=0) {
			$last_timestamp = check_plain($_POST['drupalchat_last_timestamp']);
		}
		else {
			$last_timestamp = time();
		}
		$initial_time = time();
		/*$results = db_query('SELECT name, uid1, uid2, message, timestamp FROM {drupalchat_msg},{users} WHERE uid2 = %d AND timestamp > %d AND {drupalchat_msg}.uid1={users}.uid ORDER BY timestamp ASC',$user->uid,$last_timestamp);
		$results1 = db_query('SELECT  uid, name FROM {drupalchat_users} WHERE timestamp >= (%d-%d)',time(),variable_get('drupalchat_refresh_rate', 2));
		$old_online_users = $results1->num_rows;*/
		do {
			sleep(2);
			$old_online_users = $results1->num_rows;
			$results = db_query('SELECT name, uid1, uid2, message, timestamp FROM {drupalchat_msg},{users} WHERE uid2 = %d AND timestamp > %d AND {drupalchat_msg}.uid1={users}.uid ORDER BY timestamp ASC',$user->uid,$last_timestamp);
			$results1 = db_query('SELECT  uid, name FROM {drupalchat_users} WHERE timestamp >= %d',(time()-5));
			$current_user = (object) array(
      			'uid' => $user->uid,
      			'name' => $user->name,
      			'session' => $user->sid,
      			'timestamp' => time(),
    		);
			if($user->uid > 0) {
				$result = db_query('SELECT uid, name, session, timestamp FROM {drupalchat_users} WHERE uid = %d',$user->uid);
				if(!$result->num_rows) {
					drupal_write_record('drupalchat_users',$current_user);
				}
				else {
					drupal_write_record('drupalchat_users',$current_user,'uid');
				}	
			}
				
		} while(((time()-$initial_time)<(ini_get('max_execution_time')-3)) && ($results->num_rows == 0) && ($results1->num_rows == $old_online_users));
		drupal_set_header('Content-Type: text/plain; charset: utf-8');
		printf('{ "messages": [');
		$drupalchat_counter = 0;
		while($result = db_fetch_object($results)) {
			if((module_exists('drupalchat_ur')) && (variable_get('drupalchat_ur_name',NULL)) && (variable_get('drupalchat_ur_activate',FALSE))) {
				$friends = user_relationships_load(array("between" => array($result->uid1, $result->uid2)));
				foreach ($friends as $relationship) {
    				if ($relationship->approved && $relationship->name == variable_get('drupalchat_ur_name','friend')) {
       					$output = '{"message": "%s", "timestamp": "%s", "uid1": "%s", "name": "%s"}';
						printf($output, $result->message, $result->timestamp, $result->uid1, $result->name);
						$drupalchat_counter++;
    				}
				}
			}
			else {
				$output = '{"message": "%s", "timestamp": "%s", "uid1": "%s", "name": "%s"}';
				printf($output, $result->message, $result->timestamp, $result->uid1, $result->name);
				$drupalchat_counter++;
			}
			if($drupalchat_counter < $results->num_rows) {
				printf(',');
			}
			if($result->timestamp > $last_timestamp) {
				$last_timestamp = $result->timestamp;
			}
		}	
		printf('], "total_messages": "%s", "last_timestamp": "%s",',$results->num_rows, $last_timestamp);
		
		
	
	$total_online_users = 0;
	
	printf('"online": {');
	while($result = db_fetch_object($results1)) {
		if((module_exists('drupalchat_ur')) && (variable_get('drupalchat_ur_name',NULL)) && (variable_get('drupalchat_ur_activate',FALSE)) && ($user->uid != $result->uid)) {
			$friends = user_relationships_load(array("between" => array($user->uid, $result->uid)));
			foreach ($friends as $relationship) {
    			if ($relationship->approved && $relationship->name == variable_get('drupalchat_ur_name','friend')) {
       				$output = '"%s": "%s",';
					printf($output, $result->uid, $result->name);
					$total_online_users++;
    			}
			}
		}
		else {
			$output = '"%s": "%s",';
			printf($output, $result->uid, $result->name);
			$total_online_users++;
		}
	}
	printf('"total": "%s"}}',$total_online_users);
	flush();
	//printf('"total": "%s"}}',$total_online_users.'/'.round(memory_get_peak_usage()/(1024*8)));

	}
}
/**
* Process and get messages via long polling
*/
function drupalchat_store_messages() {
	global $user;
	
	if($user->uid > 0) {
		$result = db_query('SELECT uid1, uid2, message, timestamp FROM {drupalchat_msg} WHERE uid2 = uid1 AND uid1 = %d',$user->uid);
		$current_user = (object) array(
      			'uid1' => $user->uid,
				'uid2' => $user->uid,
      			'message' => $_POST['drupalchat_tabs_content'].'{{drupalchat_break}}'.$_POST['drupalchat_conversations_content'],
      			'timestamp' => time()-3600,
    		);
    		
		if(!$result->num_rows) {
			drupal_write_record('drupalchat_msg',$current_user);
		}
		else {
			drupal_write_record('drupalchat_msg',$current_user,array('uid1','uid2'));
		}
	}
}
function drupalchat_load_messages() {
	global $user;
	$result = db_fetch_object(db_query('SELECT message FROM {drupalchat_msg} WHERE uid2 = uid1 AND uid1 = %d',$user->uid));
	print $result->message;
}
/**
* Implementaiton of hook_cron()
*/	
function drupalchat_cron() {
	db_query('DELETE FROM {drupalchat_msg} WHERE timestamp < (%d-10)',time());
	db_query('DELETE FROM {drupalchat_users} WHERE timestamp < (%d-10)',time());
}
/**
 * Implementation of hook_user()
 */
function drupalchat_user($op, &$edit, &$account, $category = NULL) {
	switch ($op) {
		case 'login':
			db_query('DELETE FROM {drupalchat_msg} WHERE uid1=uid2 AND uid1=%d',$account->uid);
			break;
		
	}
}