Portal:siro

ダイレクトマーケティングブログ

しろぼっとなおす

しろぼっと大改造

ちっサイばっかり構っていて最近しろぼっとのアレソレをおろそかにしているので、がっつりリファクタリングします。

処理の共通化

  1. require_onceによる外部ファイル読み込み
  2. TwitterAPI操作変数の宣言
  3. データベースへの接続

これらを共通化します。

まずはsirobot_common.phpを作る
//====common======================================================================================

// include_path 自動設定
// sirobot.phpのみinclude_pathの指定をしていないため、もしかしたらそちらに不具合が出る可能性有り。出たらこの項目は共通化対象から除外
$path = "**********";
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

// require_once(共通)
require_once "Services/Twitter.php";
require_once "Services/twitteroauth.php";
require_once "Services/ShortURL.php";
require_once "Jsphon/Decoder.php";

// グローバル変数stの宣言
$st =& new Services_Twitter(
****
TRUE );

// データベースへの接続を行う
// 接続成功:dbへのコネクション、接続失敗:falseが返る
function db_conn(){
	$conn = mysql_connect(****);
	if($conn !== false){
		mysql_select_db(**,$conn);
		mysql_query("SET NAMES UTF8");
	}
	return $conn;
}

//====common======================================================================================

この辺はちっサイのママなのでたいして難しくないですね。
データベースへのコネクションとかをどんどん置換していきます。

共通処理の外部化

agree(機能への返答パターンランダム)を一括でまとめます。
replyでしか使っていないので、replyの中の関数とします。

function agree_string(){
	$conn = db_conn();
	if($conn !== false){
		mysql_query("set @id = floor(rand()*(SELECT COUNT(*) FROM sirobot_agree))+1");
		$query = mysql_query("select string from sirobot_agree where id = @id");
		$obj = mysql_fetch_object($query);
		$agree_str = $obj->string;
		mysql_close($conn);
	}
	return $agree_str;
}

これもゆるりと置換します。

機能の共通化

内部処理がちょびーっと違うだけでほぼ同じっていう処理があるので、それを共通化します。
例えば、
こちらがちゅー機能

function love3($i){	// (>3<)機能
	global $st,$rep;
	// 機能概要→「ちゅーして」ってreplyがあったら適当な顔文字を返信する 以上
	$love3_conn = db_conn();
	if($love3_conn !== false){
		// おまじない
		mysql_query("set @love3_id = floor(rand()*(SELECT COUNT(*) FROM sirobot_love3))+1");
		$love3_query = mysql_query("select string from sirobot_love3 where id = @love3_id");
		$love3_obj = mysql_fetch_object($love3_query);
		$love3_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $love3_obj->string;
		$st->setUpdate(array('status'=>$love3_status,'in_reply_to_status_id_str'=>$rep[$i]["id_str"]));
		mysql_close($love3_conn);
	}

こちらが子豚ちゃん機能

function pig($i){	// 子ブタちゃん機能
	global $st,$rep;
	// 機能概要→「だっこ」「おんぶ」「ぎゅー」ってreplyがあったら重いよデブって返信する 以上
	$pig_conn = db_conn();
	if($pig_conn !== false){
		// おまじない
		mysql_query("set @pig_id = floor(rand()*(SELECT COUNT(*) FROM sirobot_pig))+1");
		$pig_query = mysql_query("select string from sirobot_pig where id = @pig_id");
		$pig_obj = mysql_fetch_object($pig_query);
		$pig_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $pig_obj->string;
		$st->setUpdate(array('status'=>$pig_status,'in_reply_to_status_id_str'=>$rep[$i]["id_str"]));
		mysql_close($pig_conn);
	}
}

如何見てもほぼ同じなので、この際がっつり一本化してしまいます。

書き直すとこんな感じ。

function honey_toast($i,$honey){	// ハニートースト機能
	global $st,$rep;
	$honey_conn = db_conn();
	if($honey_conn !== false){
		mysql_query("set @honey_id = floor(rand()*(SELECT COUNT(*) FROM sirobot_" . $honey ."))+1");
		$honey_query = mysql_query("select string from sirobot_" . $honey . " where id = @honey_id");
		$honey_obj = mysql_fetch_object($honey_query);
		$honey_status = "@" . $rep[$i]["user"]["screen_name"] . " " . $honey_obj->string;
		$st->setUpdate(array('status'=>$honey_status,'in_reply_to_status_id_str'=>$rep[$i]["id_str"]));
		mysql_close($honey_conn);
	}
}

ニートースト機能として一本化します。
で、これを挿入したらば、こちらの呼び出し元を修正します。

		} elseif (strpos( $rep[$i]["text"], "ちゅーして" ) !== false ){
			honey_toast($i,"love3");	// (>3<)機能
		} elseif ( strpos( $rep[$i]["text"], "だっこ" ) !== false
				|| strpos( $rep[$i]["text"], "おんぶ" ) !== false
				|| strpos( $rep[$i]["text"], "ぎゅー" ) !== false ){
			honey_toast($i,"pig"); // 子ブタちゃん機能


これで新機能を追加する際はif文の条件判定の追加とテーブルの追加だけでよくなりました。

ていうか

もっとがっつりまとめればよくね、ということに気づく。

function honey_toast($i,$honey){	// ハニートースト機能
	global $st,$rep;
	$honey_status = "@" . $rep[$i]["user"]["screen_name"] . " " . get_dbstring($honey);
	$st->setUpdate(array('status'=>$honey_status,'in_reply_to_status_id_str'=>$rep[$i]["id_str"]));
}

function get_dbstring($tbl){
	$conn = db_conn();
	$dbstring = "なんかエラーみたい!";
	if($conn !== false){
		mysql_query("set @id = floor(rand()*(SELECT COUNT(*) FROM sirobot_" . $tbl ."))+1");
		$query = mysql_query("select string from sirobot_" . $tbl . " where id = @id");
		$obj = mysql_fetch_object($query);
		$dbstring = $obj->string;
		mysql_close($conn);
	}
	return $dbstring;
}


さっき上で書いたagreeいらなくなりました…。



とりあえずここまで。

新機能の実装とgiftの修正は見送ります。


しろぼっとに感情的な反応を    つけなくてもこいつ今のままで面白いからいいんじゃね、っていう思いが割と強いせいでs