view include/syncwp2nntp_functions.php @ 0:1a30ce1834e5 draft default tip

added README
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Wed, 08 Aug 2012 20:02:35 +0900
parents
children
line wrap: on
line source

<?php
/*
	syncwp2nntp_functions.php
	function definition.
*/

require_once "Net/NNTP/Client.php";

//for nntpd
define("DEFAULT_SERVER_ADDR","news.example.com"); //please change this address to own nntpd.
define("NNTP_ENCODING","ISO-2022-JP");
define("WP_ENCODING","UTF-8");
define("NNTP_DETECT_ENCODINGS","ISO-2022-JP,UTF-8,EUC-JP,Shift_JIS");

//if you want to authenticate on nntpd , enable code below.
/*

define("NNTP_ENABLE_AUTHENTICATE","TRUE");
define("NNTP_USERNAME","nntpuser"); // change username
define("NNTP_PASSWORD","nntppass"); // change password

*/

//for wordpress
define("EVENT_NAME","syncwp2nntp_refresh_event_2");
define("DEFAULT_REFRESH_INTERVAL",360); //default 360sec 
define("FUNC_PUBLISH_POST","syncwp2nntp_publish_post");
define("FUNC_REFRESH_EVENT_CALLBACK","syncwp2nntp_refresh_event_callback");
define("FUNC_ADD_PAGE","syncwp2nntp_add_page");
define("ARTICLE_LASTN_COUNT",5); //default 5 articles.
define("DEFAULT_POST_USER",1); //default 1 (admin).

//for options
define("SYNCWP2NNTP_SERVER_ADDRESS","syncwp2nntp_server_address");
define("SYNCWP2NNTP_REFRESH_INTERVAL","syncwp2nntp_refresh_interval");
define("SYNCWP2NNTP_POST_USER","syncwp2nntp_post_user");
define("SYNCWP2NNTP_EXPORT_NNTP","syncwp2nntp_export_nntp");

/*
	syncwp2nntp_add_page
	create submenu page
*/
function syncwp2nntp_add_page($_arg)
{
	// User Level Permission
	//  -- Subscriber = 0,Contributor = 1,Author = 2,Editor= 7,Administrator = 9
	add_submenu_page('options-general.php','syncwp2nntp','syncwp2nntp',7, __FILE__, 'syncwp2nntp_add_menu');

	return $_arg;
}

/*
	syncwp2nntp_add_menu
	create menu page
*/
function syncwp2nntp_add_menu()
{
	//commit configuration.
	if(isset($_POST["srv"]) && isset($_POST["int"])){
		$new_server = $_POST["srv"];
		$new_interval = $_POST["int"];

		update_option(SYNCWP2NNTP_SERVER_ADDRESS,$new_server);
		update_option(SYNCWP2NNTP_REFRESH_INTERVAL,$new_interval);
	}
	if(isset($_POST["exp"])){
		update_option(SYNCWP2NNTP_EXPORT_NNTP,$_POST["exp"]);
	}
	if(isset($_POST["ref"])){
		syncwp2nntp_refresh();
	}

	$triger = "disable";
	if(get_option(SYNCWP2NNTP_EXPORT_NNTP) === "disable"){
		$triger = "enable";		
	}

	//generate configuration html.
	$out = '<div class="wrap">'."\n";
	$out .= '<h2>syncwp2nmtp configuration</h2>'."\n";
	$out .= '<form method="post">'."\n";
	$out .= '<p>server address.</p>'."\n";
	$out .= '<input type="text" name="srv" value="'.get_option(SYNCWP2NNTP_SERVER_ADDRESS).'"/>'."\n";
	$out .= '<p>refresh interval. (seconds)</p>'."\n";
	$out .= '<input type="text" name="int" value="'.get_option(SYNCWP2NNTP_REFRESH_INTERVAL).'"/>'."\n";
	$out .= '<p>wordpress post user id. (used when import article from newsgroup)</p>'."\n";
	$out .= '<input type="text" name="wpusr" value="'.get_option(SYNCWP2NNTP_POST_USER).'"/>'."\n";
	$out .= '<p></p>'."\n";
	$out .= '<input name="submit" type="submit" value="save"/>'."\n";
	$out .= '</form>';
	$out .= '<form method="post">'."\n";
	$out .= '<p>export wordpress entry to newsgroup (import only)</p>'."\n";
	$out .= '<input type="submit" name="exp" value="'.$triger.'"/>'."\n";
	$out .= '</form>';
	$out .= '<p>execute manual refresh.</p>'."\n";
	$out .= '<form method="post">'."\n";
	$out .= '<input type="hidden" name="ref" value="1"/>'."\n";
	$out .= '<input name="submit" type="submit" value="execute"/>'."\n";
	$out .= '</form>';
	$out .= '</div>'."\n";

	echo($out);
}

/*
	syncwp2nntp_activate
	called on activate plugin.
*/
function syncwp2nntp_activate()
{
	add_option(SYNCWP2NNTP_SERVER_ADDRESS,DEFAULT_SERVER_ADDR);
	add_option(SYNCWP2NNTP_REFRESH_INTERVAL,DEFAULT_REFRESH_INTERVAL);
	add_option(SYNCWP2NNTP_POST_USER,DEFAULT_POST_USER);
	add_option(SYNCWP2NNTP_EXPORT_NNTP,"enabled");
	syncwp2nntp_schedule_event(DEFAULT_REFRESH_INTERVAL);
}

/*
	syncwp2nntp_deactivate
	called on deactivate plugin.
*/
function syncwp2nntp_deactivate()
{
	delete_option(SYNCWP2NNTP_SERVER_ADDRESS);
	delete_option(SYNCWP2NNTP_REFRESH_INTERVAL);
	delete_option(SYNCWP2NNTP_POST_USER,DEFAULT_POST_USER);
	delete_option(SYNCWP2NNTP_EXPORT_NNTP);
	syncwp2nntp_unschedule_event();
}

/*
	syncwp2nntp_refresh_event_callback
	called when refresh event has activated
*/
function syncwp2nntp_refresh_event_callback()
{
	syncwp2nntp_refresh();
	syncwp2nntp_schedule_event(intval(get_option(SYNCWP2NNTP_REFRESH_INTERVAL)));
}

/*
	syncwp2nntp_refresh
	import article from server.
*/
function syncwp2nntp_refresh($_debug = false)
{
	//check newsgroup has modified?
	$server = get_option(SYNCWP2NNTP_SERVER_ADDRESS);

	$categories_data = syncwp2nntp_refresh_get_all_category_data();

	if($_debug){
		echo "\$categories_data\n";
		//print_r($categories_data);
	}

	$objnntp = new Net_NNTP_Client();
	if(PEAR::isError($objnntp->connect($server))){
		echo "cloud not connect to server.\n";
	}
	$articles = array();
	foreach($categories_data as $category){
		if(PEAR::isError($objnntp->selectGroup($category["cat_name"]))){
			continue;
		}

		$last = $objnntp->last();
		$article_count = ARTICLE_LASTN_COUNT;
		if($category["cat_last_id"] != -1){
			$article_count = $last - $category["cat_last_id"];
		}
		
		for($i = 0;$i < $article_count;++ $i){
			if(PEAR::isError($objnntp->selectArticle($last - $i))){
				continue;	
			}
			$article = array();

			//get article subject,content,from,newsgroups
			//article array will be like this
			//$article["Subject"] => article subject
			//$article["Content"] => article content
			//$article["From"] => article author
			//$article["Date"] => article posted date
			//$article["Newsgroups"] => article's cross-posted newsgroup list (hashtable key => newsgroup name,value => article id)

			//subject
			$subject = $objnntp->getHeaderField("Subject");
			if(ereg("=\?.*\?=",$subject)){
				$subject = mb_decode_mimeheader($subject);
			}
			$subject = mb_convert_encoding($subject,WP_ENCODING,NNTP_DETECT_ENCODINGS);
			$article["Subject"] = $subject;

			//content
			$content = $objnntp->getBody(null,true);
			$content = mb_convert_encoding($content,WP_ENCODING,NNTP_DETECT_ENCODINGS);
			$article["Content"] = $content;

			//contenttype
			$content_type = $objnntp->getHeaderField("Content-Type");
			if(ereg("multipart",$content_type)){
				//this is multipart format.
				$tmp = explode('"',$content_type);
				$boundary = $tmp[1];
				$tmp = explode($boundary,$content);
				$tmp = strstr($tmp[1],"\r\n\r\n");
				$article["Content"] = $tmp."\nThis message contains attachments";
			}
			
			//from
			$from = $objnntp->getHeaderField("From");
			if(ereg("^=\?.*\?=",$from)){
				$from = mb_decode_mimeheader($from);
			}
			$from = mb_convert_encoding($from,WP_ENCODING,NNTP_DETECT_ENCODINGS);
			$article["From"] = $from;
		
			//xref
			$xref = $objnntp->getHeaderField("Xref");
			$exp_xref = explode(" ",$xref);
			$newsgroups = array();
			for($j = 1;$j < count($exp_xref);++ $j){
				$newsgroup = array();
				$tmp = explode(":",$exp_xref[$j]);
				// ex, some.news.group:9999
				// $tmp[0] => newsgroup
				// $tmp[1] => article id
				$newsgroups[$tmp[0]] = $tmp[1];	
			}
			$article["Newsgroups"] = $newsgroups;

			//date
			$date = $objnntp->getHeaderField("Date");
			$article["Date"] = $date;

			//message-id
			$message_id = $objnntp->getHeaderField("Message-ID");
			$article["Message-ID"] = $message_id;

			$articles[$message_id] = $article;	
		}
	}
	$objnntp->disconnect();


	remove_action("publish_post",FUNC_PUBLISH_POST);
	foreach($articles as $article){
		syncwp2nntp_refresh_insert_into_wordpress($article);
	}
	add_action("publish_post",FUNC_PUBLISH_POST);

	return $articles;
}

/*
	syncwp2nntp_refresh_insert_into_wordpress
	create new wordpress post from $_article
	to know $_article format written in syncwp2nntp_refresh function 
*/
function syncwp2nntp_refresh_insert_into_wordpress($_article)
{
	//build post data.
	$the_post = array();
	$the_post["post_title"] = $_article["Subject"];
	$the_post["post_content"] = "From:".$_article["From"]."\n".$_article["Content"];
	$the_post["post_date"] = date("Y-m-d H:i:s",strtotime($_article["Date"]));
	$categories = array();
	foreach(array_keys($_article["Newsgroups"]) as $newsgroup){
		$cat_id = get_cat_ID($newsgroup);
		if($cat_id != 0){
			array_push($categories,$cat_id);
		}
	}
	$the_post["post_category"] = $categories;
	$the_post["post_author"] = 1;
	$the_post["post_status"] = "publish"; //to change private

	$the_post_id = wp_insert_post($the_post);
	if($the_post_id == 0){
		return false;
	}

	foreach(array_keys($_article["Newsgroups"]) as $category){
		add_post_meta($the_post_id,$category,$_article["Newsgroups"][$category],true);
	}
	return true;
}

/*
	syncwp2nntp_refresh_get_all_category_data

	this function returns two dimensional array
	$categories_data[category_name][categry_attribute]
	category_attributes list.
	cat_name : category name
	cat_id : category id
	cat_last_id : the last article ID corresponds to newsgroup. 
*/
function syncwp2nntp_refresh_get_all_category_data()
{
	$categories_data = array();
	foreach(get_all_category_ids() as $cat_id){
		$category = array();
		$category["cat_name"] = get_cat_name($cat_id);
		$category["cat_id"] = $cat_id;	
		
		$posts = get_posts("numberposts=1&post_status=publish,private&category=".$cat_id);
		if(count($posts) == 0){
			$category["cat_last_id"] = -1;
		}else{
			$category["cat_last_id"] = get_post_meta($posts[0]->ID,$category["cat_name"],true);
		}
		array_push($categories_data,$category);
	}
	return $categories_data;	
}

/*
	syncwp2nntp_publish_post
	export article to newsgroup
*/
function syncwp2nntp_publish_post($_post_id)
{
	if(get_option(SYNCWP2NNTP_EXPORT_NNTP) === "disable"){
		return;
	}

	$the_post = get_post($_post_id);

	$server = get_option(SYNCWP2NNTP_SERVER_ADDRESS);

	$objnntp = new Net_NNTP_Client();
	$ret = $objnntp->connect($server);
	if(PEAR::isError($ret)){
		//failed to connecting server.
		return;	
	}

	$userinfo = get_userdata($the_post->post_author);

	$subject = $the_post->post_title;
	$subject = mb_encode_mimeheader($subject,NNTP_ENCODING);
	$content = mb_convert_encoding($the_post->post_content,NNTP_ENCODING);

	$categories = "";
	foreach((get_the_category($_post_id)) as $category){
		if(PEAR::isError($objnntp->selectGroup($category->cat_name))){
			//if news-group does not exist.
			continue;
		}
		$categories .= $category->cat_name.",";
	}
	$categories = rtrim($categories,",");
	$objnntp->mail($categories,$subject,$content,"From: ".$userinfo->user_email,"Content-Type: text/plain;charset=".NNTP_ENCODING);

	$draft_post = array();
	$draft_post["ID"] = $_post_id;
	$draft_post["post_status"] = "draft";

	wp_update_post($draft_post);

	$objnntp->disconnect();

	syncwp2nntp_refresh();
}

/*
	schedule user defined event.
*/
function syncwp2nntp_schedule_event($_interval)
{
	wp_schedule_single_event(time()+$_interval,EVENT_NAME);
}

/*
	unschedule user defined event.
*/
function syncwp2nntp_unschedule_event()
{
	wp_clear_scheduled_hook(EVENT_NAME);
}

?>