借贷宝php面试,php基于socket的关键词情绪化回复

基于前文[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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值