ICHARM
WeiPHP成语接龙插件开发感悟(艾逗笔成语接龙改进版)
WeiPHP成语接龙插件开发感悟(艾逗笔成语接龙改进版)

按照“艾逗笔”的博文【分分钟上手weiphp插件开发】Vol.2——成语接龙插件:Idioms

,思路大体清楚了,于是开始照着写,,

 

/**
 * Idiom的微信模型
 */
class WeixinAddonModel extends WeixinModel{
	function reply($dataArr, $keywordArr = array()) {
		$config = getAddonConfig ( 'Idiom' ); // 获取后台插件的配置参数	
		//dump($config);
		
		$api = 'http://i.itpk.cn/api.php?question=@cy';   //将api接口申明为变量
		//当用户触发插件时
		if($dataArr['Content']=='成语接龙' || $dataArr['Content']=='Idiom'){
			$keywordArr['step'] = 'input';                //把用户下一次输入作为自定义关键词
			set_user_status('Idiom',$keywordArr );		//缓存自定义关键词
			$this->replyText('请输入一个成语,例如:一马当先');
		}

		//if($keywordArr['step'] == 'input'){
			if($dataArr['Content'] == '不玩了'){  //当用户输入的内容为“不玩了”的时候退出插件
				$this -> replyText('已退出成语接龙,回复“成语接龙”再次进入');
				return false;
			}
			
		
		//将用户输入的成语提交给Api,并将返回的结果赋值给$reply变量
		$reply = file_get_contents($api.$dataArr['Content']);
		//通过判断返回的字符串大小,来确定用户输入的成语是否正确
		if(strlen($reply) != 12){
			
			$keywordArr['step'] = 'input';
			set_user_status('Idiom',$keywordArr);
			$this -> replyText($reply."n".'请重新输入一个成语继续接龙,输入“不玩了”退出成语接龙');
		}else{
			$keywordArr['step'] = 'input';
			set_user_status('Idiom',$keywordArr);
			$this->replyText($reply."n".'请输入以【'.mb_strcut($reply,9,3).'】字开头的成语!');
			
		}
		
		}

	} 

写完发现,没有判断用户输入的成语和上一次API返回的成语是否接的上,于是想自己加上一个判断,这时候就出现了很多令人的困扰的问题。发现自己对weiphp框架了解的太少了,对其运作原理,十分不理解。
于是去论坛找类似的插件,阅读其源码。逐渐明白了一些东西。

1.set_user_status()函数是用来缓存触发某个插件的关键词的,set_user_status(‘Idiom’,$keywordArr);的意思是将用户的下一次输入作为触发Idiom插件的关键词

2.刚开始对插件结束的条件感到困惑,随后发现在返回数据给微信后,后面的代码不会再执行了,即一旦执行完$this->replyXXX()之类的函数,下面的代码就不会执行,意味着,该插件已经退出运行,后面的代码还是会执行的,只有遇到return false;或者die;代码才会终止运行,但是一旦执行完$this->replyXXX()之类的函数,后面代码中$this->replyXXX()之类的函数,便不会再次执行。每一次代码执行完,插件都会退出运行,下一次触发代码又从头开始执行。只是缓存了触发了关键词,所以下一次输入时,会再次触发该插件,从而让用户感觉不到插件退出运行过。

3.$keywordArr数组是一个非常实用的数组,该数组的键值不会随着插件的退出运行,而清空,所以可以使用该数组非常方便的缓存一些数据。$keywordArr[‘step’] = ‘input’;在该插件中其实作用不大,其作用是为了确保,再次触发插件后,执行了正确的代码段。

由以上的感悟,所以很简单的就能解决“没有判断用户输入的成语和上一次API返回的成语是否接的上”的问题。首先将API返回的成语缓存进$keywordArr数组中,等待下一次触发时,取出缓存的成语与输入的成语进行判断。但是,要确保该判断不能在api没有返回成语前就执行。于是,我在插件第一次触发运行的代码段里,再次用$keywordArr缓存一个参数,用来记录插件的循环次数。

修改后的代码如下:

 

以上感悟纯属个人见解,有些尚未被证实,希望大家看到后指正,谢谢!

/**
 * Idiom的微信模型
 */
class WeixinAddonModel extends WeixinModel{
	function reply($dataArr, $keywordArr = array()) {
		$config = getAddonConfig ( 'Idiom' ); // 获取后台插件的配置参数	
		$map ['id'] = $keywordArr ['aim_id'];
		$param ['token'] = get_token ();
		$param ['openid'] = get_openid ();
		
		$api = 'http://i.itpk.cn/api.php?question=@cy';   //将api接口申明为变量
		
		//当用户触发插件时
		if($dataArr['Content']=='成语接龙' || $dataArr['Content']=='Idiom'){
			$keywordArr['first'] = 0;					//记录该插件循环的次数
			$keywordArr['step'] = 'input';               
			set_user_status('Idiom',$keywordArr );		//将用户下一次输入作为触发Idiom插件的关键词
			$this->replyText('请输入一个成语,例如:一马当先');
		}
		

		if($keywordArr['step'] == 'input'){
			if($dataArr['Content'] == '不玩了'){   //当用户输入的内容为“不玩了”的时候退出循环
				unset($keywordArr['ApiReply']);    //删除数组键值
				$times = $keywordArr['first'];
				unset($keywordArr['first']);		
				$this -> replyText('已退出成语接龙,回复“成语接龙”再次进入。'."n".'本次接龙,您已接了'.$times.'个成语!');
				return false;
			}
			
			if($keywordArr['first'] !=0){
				$reply = $keywordArr['ApiReply'];
				if(mb_strcut($reply,9,3) != mb_strcut($dataArr['Content'], 0 ,3)){
					$keywordArr['step'] = 'input';
					set_user_status('Idiom',$keywordArr);
					$this -> replyText('请输入以【'.mb_strcut($reply,9,3).'】字开头的成语!');return false;
				}
			}
			
			
			//将用户输入的成语提交给Api,并将返回的结果赋值给$reply变量
			$reply = file_get_contents($api.$dataArr['Content']);
			   
			//通过判断返回的字符串大小,来确定用户输入的成语是否正确
			if(strlen($reply) != 12){
			
				$keywordArr['step'] = 'input';
				set_user_status('Idiom',$keywordArr);
				$this -> replyText($reply."n".'请重新输入一个以【'.mb_strcut($keywordArr['ApiReply'],9,3).'】成语继续接龙,输入“不玩了”退出成语接龙。');
			}else{
				//缓存api返回的成语,留在下一次与用户输入的成语进行判断
				$keywordArr['ApiReply'] = $reply;
				$keywordArr['first'] += 1;
				$keywordArr['step'] = 'input';
				set_user_status('Idiom',$keywordArr);
				$this->replyText($reply."n".'请输入以【'.mb_strcut($reply,9,3).'】字开头的成语!');
				
			}
		
		}

	} 

 

 

 

效果图:

http://www.icharm.me/wp-content/uploads/2015/08/weixin_idiom2-306x250.pnghttp://www.icharm.me/wp-content/uploads/2015/08/weixin_idiom1-307x250.png

 

 

下载插件:http://pan.baidu.com/s/1dDg2wRv 密码:1o8g

首页      博文      Code      WeiPHP成语接龙插件开发感悟(艾逗笔成语接龙改进版)

发表评论

textsms
account_circle
email

ICHARM

WeiPHP成语接龙插件开发感悟(艾逗笔成语接龙改进版)
按照“艾逗笔”的博文【分分钟上手weiphp插件开发】Vol.2——成语接龙插件:Idioms ,思路大体清楚了,于是开始照着写,,   /** * Idiom的微信模型 */ class WeixinAddonMo…
扫描二维码继续阅读
2015-08-07