<?php

/*

* $Author ：PHPYUN开发团队

*

* 官网: http://www.phpyun.com

*

* 版权所有 2009-2019 宿迁鑫潮信息技术有限公司，并保留所有权利。

*

* 软件声明：未经授权前提下，不得用于商业运营、二次开发以及任何形式的再次发布。

 */

/*

	[UCenter] (C)2001-2099 Comsenz Inc.

	This is NOT a freeware, use is subject to license terms



	$Id: note.php 1059 2011-03-01 07:25:09Z monkey $

*/



!defined('IN_UC') && exit('Access Denied');



define('UC_NOTE_REPEAT', 5);

define('UC_NOTE_TIMEOUT', 15);

define('UC_NOTE_GC', 10000);



define('API_RETURN_FAILED', '-1');



class notemodel {



	var $db;

	var $base;

	var $apps;

	var $operations = array();

	var $notetype = 'HTTP';



	function __construct(&$base) {

		$this->notemodel($base);

	}



	function notemodel(&$base) {

		$this->base = $base;

		$this->db = $base->db;

		$this->apps = $this->base->cache('apps');

		$this->operations = array(

			'test'=>array('', 'action=test'),

			'deleteuser'=>array('', 'action=deleteuser'),

			'renameuser'=>array('', 'action=renameuser'),

			'deletefriend'=>array('', 'action=deletefriend'),

			'gettag'=>array('', 'action=gettag', 'tag', 'updatedata'),

			'getcreditsettings'=>array('', 'action=getcreditsettings'),

			'getcredit'=>array('', 'action=getcredit'),

			'updatecreditsettings'=>array('', 'action=updatecreditsettings'),

			'updateclient'=>array('', 'action=updateclient'),

			'updatepw'=>array('', 'action=updatepw'),

			'updatebadwords'=>array('', 'action=updatebadwords'),

			'updatehosts'=>array('', 'action=updatehosts'),

			'updateapps'=>array('', 'action=updateapps'),

			'updatecredit'=>array('', 'action=updatecredit'),

		);

	}



	function get_total_num($all = TRUE) {

	}



	function get_list($page, $ppp, $totalnum, $all = TRUE) {

	}



	function delete_note($ids) {

	}



	function add($operation, $getdata='', $postdata='', $appids=array(), $pri = 0) {

		$extra = $varextra = '';

		$appadd = $varadd = array();

		foreach((array)$this->apps as $appid => $app) {

			$appid = $app['appid'];

			if($appid == intval($appid)) {

				if($appids && !in_array($appid, $appids)) {

					$appadd[] = 'app'.$appid."='1'";

				} else {

					$varadd[] = "('noteexists{$appid}', '1')";

				}

			}

		}

		if($appadd) {

			$extra = implode(',', $appadd);

			$extra = $extra ? ', '.$extra : '';

		}

		if($varadd) {

			$varextra = implode(', ', $varadd);

			$varextra = $varextra ? ', '.$varextra : '';

		}



		$getdata = addslashes($getdata);

		$postdata = addslashes($postdata);

		$this->db->query("INSERT INTO ".UC_DBTABLEPRE."notelist SET getdata='$getdata', operation='$operation', pri='$pri', postdata='$postdata'$extra");

		$insert_id = $this->db->insert_id();

		$insert_id && $this->db->query("REPLACE INTO ".UC_DBTABLEPRE."vars (name, value) VALUES ('noteexists', '1')$varextra");

		return $insert_id;

	}



	function send() {

		register_shutdown_function(array($this, '_send'));

	}



	function _send() {





		$note = $this->_get_note();

		if(empty($note)) {

			$this->db->query("REPLACE INTO ".UC_DBTABLEPRE."vars SET name='noteexists".UC_APPID."', value='0'");

			return NULL;

		}



		$this->sendone(UC_APPID, 0, $note);



		$this->_gc();

	}



	function sendone($appid, $noteid = 0, $note = '') {

		require_once UC_ROOT.'./lib/xml.class.php';

		$return = FALSE;

		$app = $this->apps[$appid];

		if($noteid) {

			$note = $this->_get_note_by_id($noteid);

		}

		$this->base->load('misc');

		$apifilename = isset($app['apifilename']) && $app['apifilename'] ? $app['apifilename'] : 'uc.php';

		if($app['extra']['apppath'] && @include $app['extra']['apppath'].'./api/'.$apifilename) {

			$uc_note = new uc_note();

			$method = $note['operation'];

			if(is_string($method) && !empty($method)) {

				parse_str($note['getdata'], $note['getdata']);

				if(get_magic_quotes_gpc()) {

					$note['getdata'] = $this->base->dstripslashes($note['getdata']);

				}

				$note['postdata'] = xml_unserialize($note['postdata']);

				$response = $uc_note->$method($note['getdata'], $note['postdata']);

			}

			unset($uc_note);

		} else {

			$url = $this->get_url_code($note['operation'], $note['getdata'], $appid);

			$note['postdata'] = str_replace(array("\n", "\r"), '', $note['postdata']);

			$response = trim($_ENV['misc']->dfopen2($url, 0, $note['postdata'], '', 1, $app['ip'], UC_NOTE_TIMEOUT, TRUE));

		}



		$returnsucceed = $response != '' && ($response == 1 || is_array(xml_unserialize($response)));



		$closedsqladd = $this->_close_note($note, $this->apps, $returnsucceed, $appid) ? ",closed='1'" : '';



		if($returnsucceed) {

			if($this->operations[$note['operation']][2]) {

				$this->base->load($this->operations[$note['operation']][2]);

				$func = $this->operations[$note['operation']][3];

				$_ENV[$this->operations[$note['operation']][2]]->$func($appid, $response);

			}

			$this->db->query("UPDATE ".UC_DBTABLEPRE."notelist SET app$appid='1', totalnum=totalnum+1, succeednum=succeednum+1, dateline='{$this->base->time}' $closedsqladd WHERE noteid='$note[noteid]'", 'SILENT');

			$return = TRUE;

		} else {

			$this->db->query("UPDATE ".UC_DBTABLEPRE."notelist SET app$appid = app$appid-'1', totalnum=totalnum+1, dateline='{$this->base->time}' $closedsqladd WHERE noteid='$note[noteid]'", 'SILENT');

			$return = FALSE;

		}

		return $return;

	}



	function _get_note() {

		$app_field = 'app'.UC_APPID;

		$data = $this->db->fetch_first("SELECT * FROM ".UC_DBTABLEPRE."notelist WHERE closed='0' AND $app_field<'1' AND $app_field>'-".UC_NOTE_REPEAT."' LIMIT 1");

		return $data;

	}



	function _gc() {

		rand(0, UC_NOTE_GC) == 0 && $this->db->query("DELETE FROM ".UC_DBTABLEPRE."notelist WHERE closed='1'");

	}



	function _close_note($note, $apps, $returnsucceed, $appid) {

		$note['app'.$appid] = $returnsucceed ? 1 : $note['app'.$appid] - 1;

		$appcount = count($apps);

		foreach($apps as $key => $app) {

			$appstatus = $note['app'.$app['appid']];

			if(!$app['recvnote'] || $appstatus == 1 || $appstatus <= -UC_NOTE_REPEAT) {

				$appcount--;

			}

		}

		if($appcount < 1) {

			return TRUE;

			

		}

	}



	function _get_note_by_id($noteid) {

		$data = $this->db->fetch_first("SELECT * FROM ".UC_DBTABLEPRE."notelist WHERE noteid='$noteid'");

		return $data;

	}



	function get_url_code($operation, $getdata, $appid) {

		$app = $this->apps[$appid];

		$authkey = UC_KEY;

		$url = $app['url'];

		$apifilename = isset($app['apifilename']) && $app['apifilename'] ? $app['apifilename'] : 'uc.php';

		$action = $this->operations[$operation][1];

		$code = urlencode($this->base->authcode("$action&".($getdata ? "$getdata&" : '')."time=".$this->base->time, 'ENCODE', $authkey));

		return $url."/api/$apifilename?code=$code";

	}



}



?>