Merge branch 'pull'
This commit is contained in:
		
				commit
				
					
						a946b7cea3
					
				
			
		
					 10 changed files with 317 additions and 78 deletions
				
			
		
							
								
								
									
										212
									
								
								include/api.php
									
										
									
									
									
								
							
							
						
						
									
										212
									
								
								include/api.php
									
										
									
									
									
								
							|  | @ -3,6 +3,7 @@ | ||||||
| 	require_once("datetime.php"); | 	require_once("datetime.php"); | ||||||
| 	require_once("conversation.php"); | 	require_once("conversation.php"); | ||||||
| 	require_once("oauth.php"); | 	require_once("oauth.php"); | ||||||
|  | 	require_once("html2plain.php"); | ||||||
| 	/*  | 	/*  | ||||||
| 	 * Twitter-Like API | 	 * Twitter-Like API | ||||||
| 	 *   | 	 *   | ||||||
|  | @ -306,10 +307,10 @@ | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		$ret = Array( | 		$ret = Array( | ||||||
|  | 			'id' => intval($uinfo[0]['cid']), | ||||||
| 			'self' => intval($uinfo[0]['self']), | 			'self' => intval($uinfo[0]['self']), | ||||||
| 			'uid' => intval($uinfo[0]['uid']), | 			'uid' => intval($uinfo[0]['uid']), | ||||||
| 			'id' => intval($uinfo[0]['cid']), | 			'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']), | ||||||
| 			'name' => $uinfo[0]['name'], |  | ||||||
| 			'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']), | 			'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']), | ||||||
| 			'location' => ($usr) ? $usr[0]['default-location'] : '', | 			'location' => ($usr) ? $usr[0]['default-location'] : '', | ||||||
| 			'profile_image_url' => $uinfo[0]['micro'], | 			'profile_image_url' => $uinfo[0]['micro'], | ||||||
|  | @ -347,6 +348,8 @@ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	function api_item_get_user(&$a, $item) { | 	function api_item_get_user(&$a, $item) { | ||||||
|  | 		global $usercache; | ||||||
|  | 
 | ||||||
| 		// The author is our direct contact, in a conversation with us.
 | 		// The author is our direct contact, in a conversation with us.
 | ||||||
| 		if(link_compare($item['url'],$item['author-link'])) { | 		if(link_compare($item['url'],$item['author-link'])) { | ||||||
| 			return api_get_user($a,$item['cid']); | 			return api_get_user($a,$item['cid']); | ||||||
|  | @ -363,26 +366,39 @@ | ||||||
| 		list($nick, $name) = array_map("trim",explode("(",$item['author-name'])); | 		list($nick, $name) = array_map("trim",explode("(",$item['author-name'])); | ||||||
| 		$name=str_replace(")","",$name); | 		$name=str_replace(")","",$name); | ||||||
| 
 | 
 | ||||||
|  | 		if ($name == '') | ||||||
|  | 			$name = $nick; | ||||||
|  | 
 | ||||||
|  | 		if ($nick == '') | ||||||
|  | 			$nick = $name; | ||||||
|  | 
 | ||||||
|  | 		// Generating a random ID
 | ||||||
|  | 		if (!array_key_exists($nick, $usercache)) | ||||||
|  | 			$usercache[$nick] = mt_rand(2000000, 2100000); | ||||||
|  | 
 | ||||||
| 		$ret = array( | 		$ret = array( | ||||||
| 			'uid' => 0, | 			'id' => $usercache[$nick], | ||||||
| 			'id' => 0, |  | ||||||
| 			'name' => $name, | 			'name' => $name, | ||||||
| 			'screen_name' => $nick, | 			'screen_name' => $nick, | ||||||
| 			'location' => '', //$uinfo[0]['default-location'],
 | 			'location' => '', //$uinfo[0]['default-location'],
 | ||||||
|  | 			'description' => '', | ||||||
| 			'profile_image_url' => $item['author-avatar'], | 			'profile_image_url' => $item['author-avatar'], | ||||||
| 			'url' => $item['author-link'], | 			'url' => $item['author-link'], | ||||||
| 			'contact_url' => 0, |  | ||||||
| 			'protected' => false,	#
 | 			'protected' => false,	#
 | ||||||
|  | 			'followers_count' => 0, | ||||||
| 			'friends_count' => 0, | 			'friends_count' => 0, | ||||||
| 			'created_at' => '', | 			'created_at' => '', | ||||||
|  | 			'favourites_count' => 0, | ||||||
| 			'utc_offset' => 0, #XXX: fix me
 | 			'utc_offset' => 0, #XXX: fix me
 | ||||||
| 			'time_zone' => '', //$uinfo[0]['timezone'],
 | 			'time_zone' => '', //$uinfo[0]['timezone'],
 | ||||||
| 			'geo_enabled' => false, |  | ||||||
| 			'statuses_count' => 0, | 			'statuses_count' => 0, | ||||||
|  | 			'following' => 1, | ||||||
|  | 			'statusnet_blocking' => false, | ||||||
|  | 			'notifications' => false, | ||||||
|  | 			'uid' => 0, | ||||||
|  | 			'contact_url' => 0, | ||||||
|  | 			'geo_enabled' => false, | ||||||
| 			'lang' => 'en', #XXX: fix me
 | 			'lang' => 'en', #XXX: fix me
 | ||||||
| 			'description' => '', |  | ||||||
| 			'followers_count' => 0, |  | ||||||
| 			'favourites_count' => 0, |  | ||||||
| 			'contributors_enabled' => false, | 			'contributors_enabled' => false, | ||||||
| 			'follow_request_sent' => false, | 			'follow_request_sent' => false, | ||||||
| 			'profile_background_color' => 'cfe8f6', | 			'profile_background_color' => 'cfe8f6', | ||||||
|  | @ -393,7 +409,6 @@ | ||||||
| 			'profile_background_image_url' => '', | 			'profile_background_image_url' => '', | ||||||
| 			'profile_background_tile' => false, | 			'profile_background_tile' => false, | ||||||
| 			'profile_use_background_image' => false, | 			'profile_use_background_image' => false, | ||||||
| 			'notifications' => false, |  | ||||||
| 			'verified' => true, #XXX: fix me
 | 			'verified' => true, #XXX: fix me
 | ||||||
| 			'followers' => '', #XXX: fix me
 | 			'followers' => '', #XXX: fix me
 | ||||||
| 			'status' => array() | 			'status' => array() | ||||||
|  | @ -591,16 +606,16 @@ | ||||||
| 				$in_reply_to_screen_name = $lastwall['reply_author']; | 				$in_reply_to_screen_name = $lastwall['reply_author']; | ||||||
| 			}   | 			}   | ||||||
| 			$status_info = array( | 			$status_info = array( | ||||||
| 				'created_at' => api_date($lastwall['created']), | 				'text' => html2plain(bbcode($lastwall['body']), 0), | ||||||
| 				'id' => $lastwall['contact-id'], |  | ||||||
| 				'text' => strip_tags(bbcode($lastwall['body'])), |  | ||||||
| 				'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), |  | ||||||
| 				'truncated' => false, | 				'truncated' => false, | ||||||
|  | 				'created_at' => api_date($lastwall['created']), | ||||||
| 				'in_reply_to_status_id' => $in_reply_to_status_id, | 				'in_reply_to_status_id' => $in_reply_to_status_id, | ||||||
|  | 				'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), | ||||||
|  | 				'id' => $lastwall['contact-id'], | ||||||
| 				'in_reply_to_user_id' => $in_reply_to_user_id, | 				'in_reply_to_user_id' => $in_reply_to_user_id, | ||||||
| 				'favorited' => false, |  | ||||||
| 				'in_reply_to_screen_name' => $in_reply_to_screen_name, | 				'in_reply_to_screen_name' => $in_reply_to_screen_name, | ||||||
| 				'geo' => '', | 				'geo' => '', | ||||||
|  | 				'favorited' => false, | ||||||
| 				'coordinates' => $lastwall['coord'], | 				'coordinates' => $lastwall['coord'], | ||||||
| 				'place' => $lastwall['location'], | 				'place' => $lastwall['location'], | ||||||
| 				'contributors' => ''					 | 				'contributors' => ''					 | ||||||
|  | @ -650,7 +665,7 @@ | ||||||
| 			$user_info['status'] = array( | 			$user_info['status'] = array( | ||||||
| 				'created_at' => api_date($lastwall['created']), | 				'created_at' => api_date($lastwall['created']), | ||||||
| 				'id' => $lastwall['contact-id'], | 				'id' => $lastwall['contact-id'], | ||||||
| 				'text' => strip_tags(bbcode($lastwall['body'])), | 				'text' => html2plain(bbcode($lastwall['body']), 0), | ||||||
| 				'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), | 				'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), | ||||||
| 				'truncated' => false, | 				'truncated' => false, | ||||||
| 				'in_reply_to_status_id' => $in_reply_to_status_id, | 				'in_reply_to_status_id' => $in_reply_to_status_id, | ||||||
|  | @ -686,10 +701,17 @@ | ||||||
| 		$count = (x($_REQUEST,'count')?$_REQUEST['count']:20); | 		$count = (x($_REQUEST,'count')?$_REQUEST['count']:20); | ||||||
| 		$page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0); | 		$page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0); | ||||||
| 		if ($page<0) $page=0; | 		if ($page<0) $page=0; | ||||||
| 		$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
 | 		$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0); | ||||||
|  | 		$max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0); | ||||||
|  | 		//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
 | ||||||
| 		 | 		 | ||||||
| 		$start = $page*$count; | 		$start = $page*$count; | ||||||
| 
 | 
 | ||||||
|  | 		//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
 | ||||||
|  | 
 | ||||||
|  | 		if ($max_id > 0) | ||||||
|  | 			$sql_extra = 'AND `item`.`id` <= '.intval($max_id); | ||||||
|  | 
 | ||||||
| 		$r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
 | 		$r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
 | ||||||
| 			`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, | 			`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, | ||||||
| 			`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, | 			`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, | ||||||
|  | @ -722,6 +744,48 @@ | ||||||
| 	api_register_func('api/statuses/home_timeline','api_statuses_home_timeline', true); | 	api_register_func('api/statuses/home_timeline','api_statuses_home_timeline', true); | ||||||
| 	api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true); | 	api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true); | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 *  | ||||||
|  | 	 */ | ||||||
|  | 	function api_statuses_show(&$a, $type){ | ||||||
|  | 		if (local_user()===false) return false; | ||||||
|  | 
 | ||||||
|  | 		$user_info = api_get_user($a); | ||||||
|  | 
 | ||||||
|  | 		// params
 | ||||||
|  | 		$id = intval($a->argv[3]); | ||||||
|  | 
 | ||||||
|  | 		logger('API: api_statuses_show: '.$id);		 | ||||||
|  | 
 | ||||||
|  | 		//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
 | ||||||
|  | 
 | ||||||
|  | 		$r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
 | ||||||
|  | 			`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, | ||||||
|  | 			`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, | ||||||
|  | 			`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` | ||||||
|  | 			FROM `item`, `contact` | ||||||
|  | 			WHERE `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0 | ||||||
|  | 			AND `contact`.`id` = `item`.`contact-id` | ||||||
|  | 			AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 | ||||||
|  | 			$sql_extra | ||||||
|  | 			AND `item`.`id`=%d",
 | ||||||
|  | 			intval($id) | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		$ret = api_format_items($r,$user_info); | ||||||
|  | 		 | ||||||
|  | 		$data = array('$status' => $ret[0]); | ||||||
|  | 		/*switch($type){ | ||||||
|  | 			case "atom": | ||||||
|  | 			case "rss": | ||||||
|  | 				$data = api_rss_extra($a, $data, $user_info); | ||||||
|  | 		}*/ | ||||||
|  | 		return  api_apply_template("status", $type, $data); | ||||||
|  | 	} | ||||||
|  | 	api_register_func('api/statuses/show','api_statuses_show', true); | ||||||
|  | 
 | ||||||
|  | 	//api_register_func('api/statuses/mentions','api_statuses_mentions', true);
 | ||||||
|  | 	//api_register_func('api/statuses/replies','api_statuses_mentions', true);
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	function api_statuses_user_timeline(&$a, $type){ | 	function api_statuses_user_timeline(&$a, $type){ | ||||||
|  | @ -740,7 +804,8 @@ | ||||||
| 		$count = (x($_REQUEST,'count')?$_REQUEST['count']:20); | 		$count = (x($_REQUEST,'count')?$_REQUEST['count']:20); | ||||||
| 		$page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0); | 		$page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0); | ||||||
| 		if ($page<0) $page=0; | 		if ($page<0) $page=0; | ||||||
| 		$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
 | 		$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0); | ||||||
|  | 		//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
 | ||||||
| 		 | 		 | ||||||
| 		$start = $page*$count; | 		$start = $page*$count; | ||||||
| 
 | 
 | ||||||
|  | @ -846,33 +911,64 @@ | ||||||
| 		foreach($r as $item) { | 		foreach($r as $item) { | ||||||
| 			localize_item($item); | 			localize_item($item); | ||||||
| 			$status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item)); | 			$status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item)); | ||||||
|  | 
 | ||||||
|  | 			if ($item['parent']!=$item['id']) { | ||||||
|  | 				$r = q("select id from item where parent=%s and id<%s order by id desc limit 1",  | ||||||
|  | 					intval($item['parent']), intval($item['id'])); | ||||||
|  | 				if ($r) | ||||||
|  | 					$in_reply_to_status_id = $r[0]['id']; | ||||||
|  | 				else | ||||||
|  | 					$in_reply_to_status_id = $item['parent']; | ||||||
|  | 
 | ||||||
|  | 				$r = q("select `item`.`contact-id`, `contact`.nick, `item`.`author-name` from item, contact 
 | ||||||
|  | 					where `contact`.`id` = `item`.`contact-id` and `item`.id=%d", intval($in_reply_to_status_id));
 | ||||||
|  | 
 | ||||||
|  | 				$in_reply_to_screen_name = $r[0]['author-name']; | ||||||
|  | 				$in_reply_to_user_id = $r[0]['contact-id']; | ||||||
|  | 
 | ||||||
|  | 			} else { | ||||||
|  | 				$in_reply_to_screen_name = ''; | ||||||
|  | 				$in_reply_to_user_id = 0; | ||||||
|  | 				$in_reply_to_status_id = 0; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			$status = array( | 			$status = array( | ||||||
| 				'created_at'=> api_date($item['created']), | 				'text'		=> trim($item['title']." \n".html2plain(bbcode($item['body']), 0)), | ||||||
| 				'published' => api_date($item['created']), |  | ||||||
| 				'updated'   => api_date($item['edited']), |  | ||||||
| 				'id'		=> intval($item['id']), |  | ||||||
| 				'message_id' => $item['uri'], |  | ||||||
| 				'text'		=> strip_tags(bbcode($item['body'])), |  | ||||||
| 				'statusnet_html'		=> bbcode($item['body']), |  | ||||||
| 				'source'    => (($item['app']) ? $item['app'] : 'web'), |  | ||||||
| 				'url'		=> ($item['plink']!=''?$item['plink']:$item['author-link']), |  | ||||||
| 				'truncated' => False, | 				'truncated' => False, | ||||||
| 				'in_reply_to_status_id' => ($item['parent']!=$item['id']? intval($item['parent']):''), | 				'created_at'=> api_date($item['created']), | ||||||
| 				'in_reply_to_user_id' => '', | 				'in_reply_to_status_id' => $in_reply_to_status_id, | ||||||
| 				'favorited' => $item['starred'] ? true : false, | 				'source'    => (($item['app']) ? $item['app'] : 'web'), | ||||||
| 				'in_reply_to_screen_name' => '', | 				'id'		=> intval($item['id']), | ||||||
|  | 				'in_reply_to_user_id' => $in_reply_to_user_id, | ||||||
|  | 				'in_reply_to_screen_name' => $in_reply_to_screen_name, | ||||||
| 				'geo' => '', | 				'geo' => '', | ||||||
|  | 				'favorited' => $item['starred'] ? true : false, | ||||||
|  | 				'user' =>  $status_user , | ||||||
|  | 				'statusnet_html'		=> bbcode($item['body']), | ||||||
|  | 				'statusnet_conversation_id'	=> 0, | ||||||
|  | 			); | ||||||
|  | 
 | ||||||
|  | 			// Seesmic doesn't like the following content
 | ||||||
|  | 			if ($_SERVER['HTTP_USER_AGENT'] != 'Seesmic') { | ||||||
|  | 				$status2 = array( | ||||||
|  | 					'updated'   => api_date($item['edited']), | ||||||
|  | 					'published' => api_date($item['created']), | ||||||
|  | 					'message_id' => $item['uri'], | ||||||
|  | 					'url'		=> ($item['plink']!=''?$item['plink']:$item['author-link']), | ||||||
| 					'coordinates' => $item['coord'], | 					'coordinates' => $item['coord'], | ||||||
| 					'place' => $item['location'], | 					'place' => $item['location'], | ||||||
| 					'contributors' => '', | 					'contributors' => '', | ||||||
| 					'annotations'  => '', | 					'annotations'  => '', | ||||||
| 					'entities'  => '', | 					'entities'  => '', | ||||||
| 				'user' =>  $status_user , |  | ||||||
| 					'objecttype' => (($item['object-type']) ? $item['object-type'] : ACTIVITY_OBJ_NOTE), | 					'objecttype' => (($item['object-type']) ? $item['object-type'] : ACTIVITY_OBJ_NOTE), | ||||||
| 					'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST), | 					'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST), | ||||||
| 					'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type, | 					'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type, | ||||||
| 					'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type, | 					'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type, | ||||||
| 				); | 				); | ||||||
|  | 
 | ||||||
|  | 				$status = array_merge($status, $status2); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			$ret[]=$status; | 			$ret[]=$status; | ||||||
| 		}; | 		}; | ||||||
| 		return $ret; | 		return $ret; | ||||||
|  | @ -882,17 +978,31 @@ | ||||||
| 	function api_account_rate_limit_status(&$a,$type) { | 	function api_account_rate_limit_status(&$a,$type) { | ||||||
| 
 | 
 | ||||||
| 		$hash = array( | 		$hash = array( | ||||||
|  | 			  'reset_time_in_seconds' => strtotime('now + 1 hour'), | ||||||
| 			  'remaining_hits' => (string) 150, | 			  'remaining_hits' => (string) 150, | ||||||
| 			  'hourly_limit' => (string) 150, | 			  'hourly_limit' => (string) 150, | ||||||
| 			  'reset_time' => datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME), | 			  'reset_time' => datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME), | ||||||
| 			  'reset_time_in_seconds' => strtotime('now + 1 hour') |  | ||||||
| 		); | 		); | ||||||
|  | 		if ($type == "xml") | ||||||
|  | 			$hash['resettime_in_seconds'] = $hash['reset_time_in_seconds']; | ||||||
| 
 | 
 | ||||||
| 		return api_apply_template('ratelimit', $type, array('$hash' => $hash)); | 		return api_apply_template('ratelimit', $type, array('$hash' => $hash)); | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 	api_register_func('api/account/rate_limit_status','api_account_rate_limit_status',true); | 	api_register_func('api/account/rate_limit_status','api_account_rate_limit_status',true); | ||||||
| 
 | 
 | ||||||
|  | 	function api_help_test(&$a,$type) { | ||||||
|  | 
 | ||||||
|  | 		if ($type == 'xml') | ||||||
|  | 			$ok = "true"; | ||||||
|  | 		else | ||||||
|  | 			$ok = "ok"; | ||||||
|  | 
 | ||||||
|  | 		return api_apply_template('test', $type, array('$ok' => $ok)); | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	api_register_func('api/help/test','api_help_test',true); | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 *  https://dev.twitter.com/docs/api/1/get/statuses/friends  | 	 *  https://dev.twitter.com/docs/api/1/get/statuses/friends  | ||||||
| 	 *  This function is deprecated by Twitter | 	 *  This function is deprecated by Twitter | ||||||
|  | @ -1075,7 +1185,7 @@ | ||||||
| 					'recipient_screen_name'=> $recipient['screen_name'], | 					'recipient_screen_name'=> $recipient['screen_name'], | ||||||
| 					'recipient'=> $recipient, | 					'recipient'=> $recipient, | ||||||
| 					 | 					 | ||||||
| 					'text'=> $item['title']."\n".strip_tags(bbcode($item['body'])) , | 					'text'=> $item['title']."\n".html2plain(bbcode($item['body']), 0) , | ||||||
| 					 | 					 | ||||||
| 			); | 			); | ||||||
| 		 | 		 | ||||||
|  | @ -1144,7 +1254,7 @@ | ||||||
| 				'recipient_screen_name'=> $recipient['screen_name'], | 				'recipient_screen_name'=> $recipient['screen_name'], | ||||||
| 				'recipient'=> $recipient, | 				'recipient'=> $recipient, | ||||||
| 				 | 				 | ||||||
| 				'text'=> $item['title']."\n".strip_tags(bbcode($item['body'])) , | 				'text'=> $item['title']."\n".html2plain(bbcode($item['body']), 0) , | ||||||
| 				 | 				 | ||||||
| 			); | 			); | ||||||
| 			 | 			 | ||||||
|  | @ -1197,4 +1307,36 @@ | ||||||
| 	api_register_func('api/oauth/request_token', 'api_oauth_request_token', false); | 	api_register_func('api/oauth/request_token', 'api_oauth_request_token', false); | ||||||
| 	api_register_func('api/oauth/access_token', 'api_oauth_access_token', false); | 	api_register_func('api/oauth/access_token', 'api_oauth_access_token', false); | ||||||
| 
 | 
 | ||||||
|  | /* | ||||||
|  | Not implemented by now: | ||||||
|  | statuses/public_timeline | ||||||
|  | statuses/mentions | ||||||
|  | statuses/replies | ||||||
|  | statuses/retweets_of_me | ||||||
|  | statuses/destroy | ||||||
|  | statuses/retweet | ||||||
|  | friendships/create | ||||||
|  | friendships/destroy | ||||||
|  | friendships/exists | ||||||
|  | friendships/show | ||||||
|  | account/update_location | ||||||
|  | account/update_profile_background_image | ||||||
|  | account/update_profile_image | ||||||
|  | favorites | ||||||
|  | favorites/create | ||||||
|  | favorites/destroy | ||||||
|  | blocks/create | ||||||
|  | blocks/destroy | ||||||
|  | oauth/authorize | ||||||
| 
 | 
 | ||||||
|  | Not implemented in status.net: | ||||||
|  | statuses/retweeted_to_me | ||||||
|  | statuses/retweeted_by_me | ||||||
|  | direct_messages/destroy | ||||||
|  | account/end_session | ||||||
|  | account/update_delivery_device | ||||||
|  | notifications/follow | ||||||
|  | notifications/leave | ||||||
|  | blocks/exists | ||||||
|  | blocks/blocking | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | @ -189,8 +189,29 @@ function bbcode($Text,$preserve_nl = false) { | ||||||
| 	// Check for [code] text
 | 	// Check for [code] text
 | ||||||
| 	$Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text); | 	$Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text); | ||||||
| 
 | 
 | ||||||
|  | 	// Declare the format for [spoiler] layout
 | ||||||
|  | 	$SpoilerLayout = '<blockquote class="spoiler">$1</blockquote>'; | ||||||
|  | 
 | ||||||
|  | 	// Check for [spoiler] text
 | ||||||
|  | 	// handle nested quotes
 | ||||||
|  | 	$endlessloop = 0; | ||||||
|  | 	while ((strpos($Text, "[/spoiler]") !== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20)) | ||||||
|  | 		$Text = preg_replace("/\[spoiler\](.*?)\[\/spoiler\]/ism","$SpoilerLayout", $Text); | ||||||
|  | 
 | ||||||
|  | 	// Check for [spoiler=Author] text
 | ||||||
|  | 
 | ||||||
|  | 	$t_wrote = t('$1 wrote:'); | ||||||
|  | 
 | ||||||
|  | 	// handle nested quotes
 | ||||||
|  | 	$endlessloop = 0; | ||||||
|  | 	while ((strpos($Text, "[/spoiler]")!== false)  and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20)) | ||||||
|  | 		$Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism", | ||||||
|  |         	                     "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>", | ||||||
|  |                 	             $Text); | ||||||
|  | 
 | ||||||
| 	// Declare the format for [quote] layout
 | 	// Declare the format for [quote] layout
 | ||||||
| 	$QuoteLayout = '<blockquote>$1</blockquote>'; | 	$QuoteLayout = '<blockquote>$1</blockquote>'; | ||||||
|  | 
 | ||||||
| 	// Check for [quote] text
 | 	// Check for [quote] text
 | ||||||
| 	// handle nested quotes
 | 	// handle nested quotes
 | ||||||
| 	$endlessloop = 0; | 	$endlessloop = 0; | ||||||
|  | @ -205,7 +226,7 @@ function bbcode($Text,$preserve_nl = false) { | ||||||
| 	$endlessloop = 0; | 	$endlessloop = 0; | ||||||
| 	while ((strpos($Text, "[/quote]")!== false)  and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) | 	while ((strpos($Text, "[/quote]")!== false)  and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) | ||||||
| 		$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", | 		$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", | ||||||
|         	                     "<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>", |         	                     "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote class=".'"author"'.">$2</blockquote>", | ||||||
|                 	             $Text); |                 	             $Text); | ||||||
| 
 | 
 | ||||||
| 	// [img=widthxheight]image source[/img]
 | 	// [img=widthxheight]image source[/img]
 | ||||||
|  |  | ||||||
|  | @ -74,7 +74,7 @@ function email_msg_headers($mbox,$uid) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| function email_get_msg($mbox,$uid) { | function email_get_msg($mbox,$uid, $reply) { | ||||||
| 	$ret = array(); | 	$ret = array(); | ||||||
| 
 | 
 | ||||||
| 	$struc = (($mbox && $uid) ? @imap_fetchstructure($mbox,$uid,FT_UID) : null); | 	$struc = (($mbox && $uid) ? @imap_fetchstructure($mbox,$uid,FT_UID) : null); | ||||||
|  | @ -114,7 +114,7 @@ function email_get_msg($mbox,$uid) { | ||||||
| 	$ret['body'] = removegpg($ret['body']); | 	$ret['body'] = removegpg($ret['body']); | ||||||
| 	$msg = removesig($ret['body']); | 	$msg = removesig($ret['body']); | ||||||
| 	$ret['body'] = $msg['body']; | 	$ret['body'] = $msg['body']; | ||||||
| 	$ret['body'] = convertquote($ret['body'], false); | 	$ret['body'] = convertquote($ret['body'], $reply); | ||||||
| 
 | 
 | ||||||
| 	if (trim($html) != '') | 	if (trim($html) != '') | ||||||
| 		$ret['body'] = removelinebreak($ret['body']); | 		$ret['body'] = removelinebreak($ret['body']); | ||||||
|  |  | ||||||
|  | @ -1,9 +1,15 @@ | ||||||
| <?php | <?php | ||||||
| require_once "html2bbcode.php"; | require_once "html2bbcode.php"; | ||||||
| 
 | 
 | ||||||
| function breaklines($line, $level) | function breaklines($line, $level, $wraplength = 75) | ||||||
| { | { | ||||||
| 	$wraplen = 75-$level; | 
 | ||||||
|  | 	if ($wraplength == 0) | ||||||
|  | 		$wraplength = 2000000; | ||||||
|  | 
 | ||||||
|  | 	//	return($line);
 | ||||||
|  | 
 | ||||||
|  | 	$wraplen = $wraplength-$level; | ||||||
| 
 | 
 | ||||||
| 	$newlines = array(); | 	$newlines = array(); | ||||||
| 
 | 
 | ||||||
|  | @ -37,7 +43,7 @@ function breaklines($line, $level) | ||||||
| 	return(implode($newlines, "\n")); | 	return(implode($newlines, "\n")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function quotelevel($message) | function quotelevel($message, $wraplength = 75) | ||||||
| { | { | ||||||
| 	$lines = explode("\n", $message); | 	$lines = explode("\n", $message); | ||||||
| 
 | 
 | ||||||
|  | @ -65,12 +71,31 @@ function quotelevel($message) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (!$startquote or ($line != '')) | 		if (!$startquote or ($line != '')) | ||||||
| 			$newlines[] = breaklines($line, $currlevel); | 			$newlines[] = breaklines($line, $currlevel, $wraplength); | ||||||
| 	} | 	} | ||||||
| 	return(implode($newlines, "\n")); | 	return(implode($newlines, "\n")); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function html2plain($html) | function collecturls($message) { | ||||||
|  | 	$pattern = '/<a.*?href="(.*?)".*?>(.*?)<\/a>/is'; | ||||||
|  | 	preg_match_all($pattern, $message, $result, PREG_SET_ORDER); | ||||||
|  | 
 | ||||||
|  | 	$urls = array(); | ||||||
|  | 	foreach ($result as $treffer) { | ||||||
|  | 		// A list of some links that should be ignored
 | ||||||
|  | 		$list = array("/user/", "/tag/", "/profile/", "/search?search=", "mailto:", "/u/", "/node/", | ||||||
|  | 				"//facebook.com/profile.php?id=", "//plus.google.com/"); | ||||||
|  | 		foreach ($list as $listitem) | ||||||
|  | 			if (strpos($treffer[1], $listitem) !== false) | ||||||
|  | 				$ignore = true; | ||||||
|  | 
 | ||||||
|  | 		if (!$ignore) | ||||||
|  | 			$urls[$treffer[1]] = $treffer[1]; | ||||||
|  | 	} | ||||||
|  | 	return($urls); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function html2plain($html, $wraplength = 75, $compact = false) | ||||||
| { | { | ||||||
| 	global $lang; | 	global $lang; | ||||||
| 
 | 
 | ||||||
|  | @ -93,22 +118,16 @@ function html2plain($html) | ||||||
| 	$message = str_replace(array("\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"), array("<", ">", "<br>", " ", ""), $message); | 	$message = str_replace(array("\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"), array("<", ">", "<br>", " ", ""), $message); | ||||||
| 	$message = preg_replace('= [\s]*=i', " ", $message); | 	$message = preg_replace('= [\s]*=i', " ", $message); | ||||||
| 
 | 
 | ||||||
| 	// nach <a href="...">...</a> suchen, die ... miteinander vergleichen und bei Gleichheit durch ein einzelnes ... ersetzen.
 | 	// Collecting all links
 | ||||||
| 	$pattern = '/<a.*?href="(.*?)".*?>(.*?)<\/a>/is'; | 	$urls = collecturls($message); | ||||||
| 	preg_match_all($pattern, $message, $result, PREG_SET_ORDER); |  | ||||||
| 
 | 
 | ||||||
| 	foreach ($result as $treffer) { |  | ||||||
| 		if ($treffer[1] == $treffer[2]) { |  | ||||||
| 			$search = '<a href="'.$treffer[1].'" target="_blank">'.$treffer[1].'</a>'; |  | ||||||
| 			$message = str_replace($search, $treffer[1], $message); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	@$doc->loadHTML($message); | 	@$doc->loadHTML($message); | ||||||
| 
 | 
 | ||||||
| 	node2bbcode($doc, 'html', array(), '', ''); | 	node2bbcode($doc, 'html', array(), '', ''); | ||||||
| 	node2bbcode($doc, 'body', array(), '', ''); | 	node2bbcode($doc, 'body', array(), '', ''); | ||||||
| 
 | 
 | ||||||
| 	// MyBB-Auszeichnungen
 | 	// MyBB-Auszeichnungen
 | ||||||
|  | 	/* | ||||||
| 	node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_'); | 	node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_'); | ||||||
| 	node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/'); | 	node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/'); | ||||||
| 	node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*'); | 	node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*'); | ||||||
|  | @ -117,7 +136,11 @@ function html2plain($html) | ||||||
| 	node2bbcode($doc, 'b', array(), '*', '*'); | 	node2bbcode($doc, 'b', array(), '*', '*'); | ||||||
| 	node2bbcode($doc, 'i', array(), '/', '/'); | 	node2bbcode($doc, 'i', array(), '/', '/'); | ||||||
| 	node2bbcode($doc, 'u', array(), '_', '_'); | 	node2bbcode($doc, 'u', array(), '_', '_'); | ||||||
|  | 	*/ | ||||||
| 
 | 
 | ||||||
|  | 	if ($compact) | ||||||
|  | 		node2bbcode($doc, 'blockquote', array(), "»", "«"); | ||||||
|  | 	else | ||||||
| 		node2bbcode($doc, 'blockquote', array(), '[quote]', "[/quote]\n"); | 		node2bbcode($doc, 'blockquote', array(), '[quote]', "[/quote]\n"); | ||||||
| 
 | 
 | ||||||
| 	node2bbcode($doc, 'br', array(), "\n", ''); | 	node2bbcode($doc, 'br', array(), "\n", ''); | ||||||
|  | @ -143,16 +166,25 @@ function html2plain($html) | ||||||
| 	node2bbcode($doc, 'h5', array(), "\n\n*", "*\n"); | 	node2bbcode($doc, 'h5', array(), "\n\n*", "*\n"); | ||||||
| 	node2bbcode($doc, 'h6', array(), "\n\n*", "*\n"); | 	node2bbcode($doc, 'h6', array(), "\n\n*", "*\n"); | ||||||
| 
 | 
 | ||||||
| 	node2bbcode($doc, 'a', array('href'=>'/(.+)/'), ' $1', '', true); | 	// Problem: there is no reliable way to detect if it is a link to a tag or profile
 | ||||||
| 	node2bbcode($doc, 'img', array('alt'=>'/(.+)/'), '$1', ''); | 	//node2bbcode($doc, 'a', array('href'=>'/(.+)/'), ' $1 ', '', true);
 | ||||||
| 	node2bbcode($doc, 'img', array('title'=>'/(.+)/'), '$1', ''); | 	node2bbcode($doc, 'a', array('href'=>'/(.+)/', 'rel'=>'oembed'), ' $1 ', '', true); | ||||||
| 	node2bbcode($doc, 'img', array(), '', ''); | 	//node2bbcode($doc, 'img', array('alt'=>'/(.+)/'), '$1', '');
 | ||||||
|  | 	//node2bbcode($doc, 'img', array('title'=>'/(.+)/'), '$1', '');
 | ||||||
|  | 	//node2bbcode($doc, 'img', array(), '', '');
 | ||||||
|  | 	if (!$compact) | ||||||
| 		node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '[img]$1', '[/img]'); | 		node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '[img]$1', '[/img]'); | ||||||
|  | 	else | ||||||
|  | 		node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '', ''); | ||||||
|  | 
 | ||||||
|  | 	node2bbcode($doc, 'iframe', array('src'=>'/(.+)/'), ' $1 ', '', true); | ||||||
| 
 | 
 | ||||||
| 	$message = $doc->saveHTML(); | 	$message = $doc->saveHTML(); | ||||||
| 
 | 
 | ||||||
|  | 	if (!$compact) { | ||||||
| 		$message = str_replace("[img]", "", $message); | 		$message = str_replace("[img]", "", $message); | ||||||
| 		$message = str_replace("[/img]", "", $message); | 		$message = str_replace("[/img]", "", $message); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	// was ersetze ich da?
 | 	// was ersetze ich da?
 | ||||||
| 	// Irgendein stoerrisches UTF-Zeug
 | 	// Irgendein stoerrisches UTF-Zeug
 | ||||||
|  | @ -168,12 +200,20 @@ function html2plain($html) | ||||||
| 
 | 
 | ||||||
| 	$message = html_entity_decode($message, ENT_QUOTES, 'UTF-8'); | 	$message = html_entity_decode($message, ENT_QUOTES, 'UTF-8'); | ||||||
| 
 | 
 | ||||||
|  | 	if (!$compact) { | ||||||
|  | 		$counter = 1; | ||||||
|  | 		foreach ($urls as $id=>$url) | ||||||
|  | 			if (strpos($message, $url) == false) | ||||||
|  | 				$message .= "\n".$url." "; | ||||||
|  | 				//$message .= "\n[".($counter++)."] ".$url;
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	do { | 	do { | ||||||
| 		$oldmessage = $message; | 		$oldmessage = $message; | ||||||
| 		$message = str_replace("\n\n\n", "\n\n", $message); | 		$message = str_replace("\n\n\n", "\n\n", $message); | ||||||
| 	} while ($oldmessage != $message); | 	} while ($oldmessage != $message); | ||||||
| 
 | 
 | ||||||
| 	$message = quotelevel(trim($message)); | 	$message = quotelevel(trim($message), $wraplength); | ||||||
| 
 | 
 | ||||||
| 	return(trim($message)); | 	return(trim($message)); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ function savereplace($pattern, $replace, $text) | ||||||
| 
 | 
 | ||||||
| function unifyattributionline($message) | function unifyattributionline($message) | ||||||
| { | { | ||||||
| 	$quotestr = array('quote', 'collapsed'); | 	$quotestr = array('quote', 'spoiler'); | ||||||
| 	foreach ($quotestr as $quote) { | 	foreach ($quotestr as $quote) { | ||||||
| 
 | 
 | ||||||
| 		$message = savereplace('/----- Original Message -----\s.*?From: "([^<"].*?)" <(.*?)>\s.*?To: (.*?)\s*?Cc: (.*?)\s*?Sent: (.*?)\s.*?Subject: ([^\n].*)\s*\['.$quote.'\]/i', "[".$quote."='$1']\n", $message); | 		$message = savereplace('/----- Original Message -----\s.*?From: "([^<"].*?)" <(.*?)>\s.*?To: (.*?)\s*?Cc: (.*?)\s*?Sent: (.*?)\s.*?Subject: ([^\n].*)\s*\['.$quote.'\]/i', "[".$quote."='$1']\n", $message); | ||||||
|  |  | ||||||
|  | @ -504,7 +504,12 @@ function poller_run($argv, $argc){ | ||||||
| 							//$datarray['title'] = notags(trim($meta->subject));
 | 							//$datarray['title'] = notags(trim($meta->subject));
 | ||||||
| 							$datarray['created'] = datetime_convert('UTC','UTC',$meta->date); | 							$datarray['created'] = datetime_convert('UTC','UTC',$meta->date); | ||||||
| 
 | 
 | ||||||
| 							$r = email_get_msg($mbox,$msg_uid); | 							// Is it  reply?
 | ||||||
|  | 							$reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") or | ||||||
|  | 								(substr(strtolower($datarray['title']), 0, 3) == "re-") or | ||||||
|  | 								(raw_refs != "")); | ||||||
|  | 
 | ||||||
|  | 							$r = email_get_msg($mbox,$msg_uid, $reply); | ||||||
| 							if(! $r) { | 							if(! $r) { | ||||||
| 								logger("Mail: can't fetch msg ".$msg_uid); | 								logger("Mail: can't fetch msg ".$msg_uid); | ||||||
| 								continue; | 								continue; | ||||||
|  |  | ||||||
|  | @ -124,7 +124,7 @@ function removetofu($message) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if ($quotestart != 0) { | 	if ($quotestart != 0) { | ||||||
| 		$message = trim(substr($message, 0, $quotestart))."\n[collapsed]\n".substr($message, $quotestart+7, -8).'[/collapsed]'; | 		$message = trim(substr($message, 0, $quotestart))."\n[spoiler]".substr($message, $quotestart+7, -8).'[/spoiler]'; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return($message); | 	return($message); | ||||||
|  |  | ||||||
|  | @ -940,6 +940,36 @@ function prepare_body($item,$attach = false) { | ||||||
| 			$s .= '<div class="filesavetags"><span>' . t('Filed under:') . ' </span>' . $x . '</div>';  | 			$s .= '<div class="filesavetags"><span>' . t('Filed under:') . ' </span>' . $x . '</div>';  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Look for spoiler
 | ||||||
|  | 	$spoilersearch = '<blockquote class="spoiler">'; | ||||||
|  | 
 | ||||||
|  | 	// Remove line breaks before the spoiler
 | ||||||
|  | 	while ((strpos($s, "\n".$spoilersearch) !== false)) | ||||||
|  | 		$s = str_replace("\n".$spoilersearch, $spoilersearch, $s); | ||||||
|  | 	while ((strpos($s, "<br />".$spoilersearch) !== false)) | ||||||
|  | 		$s = str_replace("<br />".$spoilersearch, $spoilersearch, $s); | ||||||
|  | 
 | ||||||
|  | 	while ((strpos($s, $spoilersearch) !== false)) { | ||||||
|  | 
 | ||||||
|  | 		$pos = strpos($s, $spoilersearch); | ||||||
|  | 		$rnd = random_string(8); | ||||||
|  | 		$spoilerreplace = '<br /> <span id="spoiler-wrap-'.$rnd.'" style="white-space:nowrap;" class="fakelink" onclick="openClose(\'spoiler-'.$rnd.'\');">'.sprintf(t('Click to open/close')).'</span>'. | ||||||
|  | 	                                '<blockquote class="spoiler" id="spoiler-'.$rnd.'" style="display: none;">'; | ||||||
|  | 		$s = substr($s, 0, $pos).$spoilerreplace.substr($s, $pos+strlen($spoilersearch)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Look for quote with author
 | ||||||
|  | 	$authorsearch = '<blockquote class="author">'; | ||||||
|  | 
 | ||||||
|  | 	while ((strpos($s, $authorsearch) !== false)) { | ||||||
|  | 
 | ||||||
|  | 		$pos = strpos($s, $authorsearch); | ||||||
|  | 		$rnd = random_string(8); | ||||||
|  | 		$authorreplace = '<br /> <span id="author-wrap-'.$rnd.'" style="white-space:nowrap;" class="fakelink" onclick="openClose(\'author-'.$rnd.'\');">'.sprintf(t('Click to open/close')).'</span>'. | ||||||
|  | 	                                '<blockquote class="author" id="author-'.$rnd.'" style="display: block;">'; | ||||||
|  | 		$s = substr($s, 0, $pos).$authorreplace.substr($s, $pos+strlen($authorsearch)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	$prep_arr = array('item' => $item, 'html' => $s); | 	$prep_arr = array('item' => $item, 'html' => $s); | ||||||
| 	call_hooks('prepare_body_final', $prep_arr); | 	call_hooks('prepare_body_final', $prep_arr); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,4 +2,5 @@ | ||||||
|  <remaining-hits type="integer">$hash.remaining_hits</remaining-hits> |  <remaining-hits type="integer">$hash.remaining_hits</remaining-hits> | ||||||
|  <hourly-limit type="integer">$hash.hourly_limit</hourly-limit> |  <hourly-limit type="integer">$hash.hourly_limit</hourly-limit> | ||||||
|  <reset-time type="datetime">$hash.reset_time</reset-time> |  <reset-time type="datetime">$hash.reset_time</reset-time> | ||||||
|  |  <reset_time_in_seconds type="integer">$hash.resettime_in_seconds</reset_time_in_seconds> | ||||||
| </hash> | </hash> | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue