基于前文[https://my.oschina.net/u/3470006/blog/4791622]
在完成关键词回复后我想写个有趣的功能,比如拟人情绪化的回复
我的设想是将服务端设定为一个一般的正常的人类,拟人的情绪化回复并不是简单地在关键词回复加上什么表情就是了
就最简单的问问题来说,问一次会回答你,问两次也许还会正常回答你,但问更多次就会感到厌烦
基于这个设定就需要修改代码,首先是需要存储客户端发来的消息,用一个数组保存消息和相应的次数
保存输入内容函数
function save_input($Message){
if(isset($GLOBALS['Inputs'][$Message])){
$GLOBALS['Inputs'][$Message]++;
}
else{
$GLOBALS['Inputs'][$Message]=1;
}
//模拟人的记忆,最多保存2500条消息
if(count($GLOBALS['Inputs'])>2500){
array_shift($GLOBALS['Inputs']);
}
}
为了便于后面的操作,将关键词回复独立为一个函数
function keyword_reply($Message){
$Reply=isset(KEYWORD_REPLY[$Message])?KEYWORD_REPLY[$Message]:KEYWORD_REPLY_UNKNOWN;
return $Reply.PHP_EOL;
}
定义情绪化回复函数
function mood_reply($Message){
}
再定义一个常量来确定当前的回复模式,约定为0关键词回复1情绪化回复
const REPLY_MODE=1;
修改消息处理函数代码
function message_handler($Message,$Client){
save_input($Message);
$Reply=(REPLY_MODE===0)?keyword_reply($Message):mood_reply($Message);
socket_write($Client,$Reply);
}
定义一个获取消息次数函数
function get_message_number($Message){
if(isset($GLOBALS['Inputs'][$Message]))
return $GLOBALS['Inputs'][$Message];
else
return 0;
}
定义情绪化回复内容常量
const MOOD_REPLY=['啊,你都问了好几次这个问题了啊','先生你好,先生再见!什么,原来你是女的吗','|-_-|','嗯?','你说啥?'];
然后修改情绪化回复的代码
//停顿0.5到3秒,模拟思考过程
usleep(mt_rand(5,30)*100000);
if(get_message_number($Message)>=3){
return MOOD_REPLY[array_rand(MOOD_REPLY)].PHP_EOL;
}
//使用原有的关键词回复
else{
return keyword_reply($Message);
}
最后贴上完整代码
const REPLY_MODE=1;
const KEYWORD_REPLY=['你好'=>'你好,你可以直接输入消息来获得回答','你是谁'=>'我是关键词回复器'];
const KEYWORD_REPLY_UNKNOWN='无法理解你的问题';
const MOOD_REPLY=['啊,你都问了好几次这个问题了啊','先生你好,先生再见!什么,原来你是女的吗','|-_-|','嗯?','你说啥?'];
function message_handler($Message,$Client){
save_input($Message);
$Reply=(REPLY_MODE===0)?keyword_reply($Message):mood_reply($Message);
socket_write($Client,$Reply);
}
function keyword_reply($Message){
$Reply=isset(KEYWORD_REPLY[$Message])?KEYWORD_REPLY[$Message]:KEYWORD_REPLY_UNKNOWN;
return $Reply.PHP_EOL;
}
function save_input($Message){
if(isset($GLOBALS['Inputs'][$Message])){
$GLOBALS['Inputs'][$Message]++;
}
else{
$GLOBALS['Inputs'][$Message]=1;
}
//模拟人的记忆,最多保存2500条消息
if(count($GLOBALS['Inputs'])>2500){
array_shift($GLOBALS['Inputs']);
}
}
function get_message_number($Message){
if(isset($GLOBALS['Inputs'][$Message]))
return $GLOBALS['Inputs'][$Message];
else
return 0;
}
function mood_reply($Message){
//停顿0.5到3秒,模拟思考过程
usleep(mt_rand(5,30)*100000);
if(get_message_number($Message)>=3){
return MOOD_REPLY[array_rand(MOOD_REPLY)].PHP_EOL;
}
//使用原有的关键词回复
else{
return keyword_reply($Message);
}
}