array(
'title' => '城市天气',
'description' => '"城市名+天气", 如: "北京天气"',
'keywords' => array(
array('3', '^.+天气$')
)
),
'baike.php' => array(
'title' => '百度百科',
'description' => '"百科+查询内容" 或 "定义+查询内容", 如: "百科姚明", "定义自行车"',
'keywords' => array(
array('3', '^百科.+$'),
array('3', '^定义.+$'),
)
),
'translate.php' => array(
'title' => '即时翻译',
'description' => '"@查询内容(中文或英文)"',
'keywords' => array(
array('3', '^@.+$'),
)
),
'calendar.php' => array(
'title' => '今日老黄历',
'description' => '"日历", "万年历", "黄历"或"几号"',
'keywords' => array(
array('1', '日历'),
array('1', '万年历'),
array('1', '黄历'),
array('1', '几号'),
)
),
'news.php' => array(
'title' => '看新闻',
'description' => '"新闻"',
'keywords' => array(
array('1', '新闻'),
)
),
'express.php' => array(
'title' => '快递查询',
'description' => '"快递+单号", 如: "申通1200041125"',
'keywords' => array(
array('3', '^(申通|圆通|中通|汇通|韵达|顺丰|EMS) *[a-z0-9]{1,}$')
)
),
);
public function doWebManage() {
global $_W, $_GPC;
$foo = !empty($_GPC['foo']) ? $_GPC['foo'] : 'display';
if($foo == 'display') {
require model('rule');
$pindex = max(1, intval($_GPC['page']));
$psize = 20;
$types = array('', '等价', '包含', '正则表达式匹配');
$condition = 'weid = 0 AND module = \'userapi\'';
$params = array();
if (isset($_GPC['status'])) {
$condition .= " AND status = :status";
$params[':status'] = intval($_GPC['status']);
}
if(isset($_GPC['keyword'])) {
$condition .= ' AND `name` LIKE :keyword';
$params[':keyword'] = "%{$_GPC['keyword']}%";
}
$ds = rule_search($condition, $params, $pindex, $psize, $total);
$pager = pagination($total, $pindex, $psize);
if (!empty($ds)) {
foreach($ds as &$item) {
$reply = pdo_fetch('SELECT * FROM ' . tablename($this->tablename) . ' WHERE `rid`=:rid', array(':rid' => $item['id']));
$item['description'] = $reply['description'];
}
}
$import = false;
$apis = implode('\',\'', array_keys($this->predefines));
$apis = "'{$apis}'";
$sql = 'SELECT DISTINCT `apiurl` FROM ' . tablename($this->tablename) . ' AS `e` LEFT JOIN ' . tablename('rule') . " AS `r` ON (`e`.`rid`=`r`.`id`) WHERE `r`.`weid`='0' AND `apiurl` IN ({$apis})";
$apiurls = pdo_fetchall($sql);
if(count($apiurls) != count($this->predefines)) {
$import = true;
}
include $this->template('display');
}
if($foo == 'import') {
$apis = implode('\',\'', array_keys($this->predefines));
$apis = "'{$apis}'";
$sql = 'SELECT DISTINCT `apiurl` FROM ' . tablename($this->tablename) . ' AS `e` LEFT JOIN ' . tablename('rule') . " AS `r` ON (`e`.`rid`=`r`.`id`) WHERE `r`.`weid`='0' AND `apiurl` IN ({$apis})";
$apiurls = pdo_fetchall($sql);
$as = array();
foreach($apiurls as $url) {
$as[] = $url['apiurl'];
}
foreach($this->predefines as $key => $v) {
if(!in_array($key, $as)) {
$rule = array(
'weid' => 0,
'cid' => 0,
'name' => $v['title'],
'module' => 'userapi',
'displayorder' => 255,
'status' => 1,
);
pdo_insert('rule', $rule);
$rid = pdo_insertid();
if(!empty($rid)) {
foreach($v['keywords'] as $row) {
$data = array(
'content' => $row[1],
'type' => $row[0],
'rid' => $rid,
'weid' => 0,
'module' => 'userapi',
'status' => $rule['status'],
'displayorder' => $rule['displayorder'],
);
pdo_insert('rule_keyword', $data);
}
$reply = array(
'rid' => $rid,
'description' => $v['description'],
'apiurl' => $key,
'token' => '',
'default_text' => '',
'cachetime' => 0
);
pdo_insert($this->tablename, $reply);
}
}
}
itoast('成功导入.', referer(), 'success');
}
if($foo == 'delete') {
$rid = intval($_GPC['rid']);
pdo_delete('rule', array('module' => 'userapi', 'id' => $rid));
pdo_delete('rule_keyword', array('module' => 'userapi', 'rid' => $rid));
pdo_delete($this->tablename, array('rid' => $rid));
itoast('成功删除.', referer(), 'success');
}
if($foo == 'post') {
$rid = intval($_GPC['id']);
require model('rule');
if(checksubmit()) {
if (empty($_GPC['name'])) {
itoast('抱歉,规则名称为必填项,请选回修改!', '', '');
}
if (($_GPC['type'] && empty($_GPC['apiurl'])) || (empty($_GPC['type']) && empty($_GPC['apilocal']))) {
itoast('请填写接口地址!', '', '');
}
if ($_GPC['type'] && empty($_GPC['token'])) {
itoast('请填写Token值!', '', '');
}
$rule = array(
'weid' => 0,
'cid' => 0,
'name' => $_GPC['service'],
'module' => 'userapi',
'displayorder' => 255,
'status' => intval($_GPC['status']),
);
if($rid) {
pdo_update('rule', $rule, array('id' => $rid));
} else {
pdo_insert('rule', $rule);
$rid = pdo_insertid();
}
if(empty($rid)) {
itoast('增加服务失败, 请稍后重试. ', '', 'error');
}
pdo_delete('rule_keyword', array('rid' => $rid));
$rows = array();
$rowtpl = array(
'rid' => $rid,
'weid' => 0,
'module' => $rule['module'],
'status' => $rule['status'],
'displayorder' => $rule['displayorder'],
);
if (!empty($_GPC['keyword-name'])) {
foreach ($_GPC['keyword-name'] as $id => $row) {
if (empty($row) && strlen($row) == 0 && intval($_GPC['keyword-type'][$id]) != 4) {
continue;
}
$rowtpl['content'] = $row;
$rowtpl['type'] = intval($_GPC['keyword-type'][$id]);
if($rowtpl['type'] == 4) {
$rowtpl['content'] = '';
}
$rows[md5($rowtpl['type'] . $rowtpl['content'])] = $rowtpl;
}
}
if (!empty($_GPC['keyword-name-new'])) {
foreach ($_GPC['keyword-name-new'] as $id => $row) {
if (empty($row) && strlen($row) == 0 && intval($_GPC['keyword-type-new'][$id]) != 4) {
continue;
}
$rowtpl['content'] = $row;
$rowtpl['type'] = intval($_GPC['keyword-type-new'][$id]);
if($rowtpl['type'] == 4) {
$rowtpl['content'] = '';
}
$rows[md5($rowtpl['type'] . $rowtpl['content'])] = $rowtpl;
}
}
if(!empty($_GPC['keywords'])) {
$kwds = explode(',', trim($_GPC['keywords']));
foreach($kwds as $kwd) {
$kwd = trim($kwd);
if(empty($kwd)) {
continue;
}
$rowtpl['content'] = $kwd;
$rowtpl['type'] = 1;
$rows[md5($rowtpl['type'] . $rowtpl['content'])] = $rowtpl;
}
}
foreach($rows as $krow) {
$result = pdo_insert('rule_keyword', $krow);
}
$reply = array(
'rid' => $rid,
'description' => htmlspecialchars_decode($_GPC['description']),
'apiurl' => empty($_GPC['type']) ? $_GPC['apilocal'] : $_GPC['apiurl'],
'token' => $_GPC['wetoken'],
'default_text' => $_GPC['default-text'],
'cachetime' => intval($_GPC['cachetime']),
);
if($_GPC['id']) {
if(pdo_update($this->tablename, $reply, array('rid' => $rid)) !== false) {
itoast('编辑服务成功. ', 'refresh', 'success');
} else {
itoast('编辑服务失败, 请稍后重试. ', '', 'error');
}
} else {
if(pdo_insert($this->tablename, $reply)) {
itoast('增加服务成功. ', 'refresh', 'success');
} else {
itoast('增加服务失败, 请稍后重试. ', '', 'error');
}
}
}
$rid = intval($_GPC['id']);
if (!empty($rid)) {
$rule = rule_single($rid);
$rule['kwd-adv'] = false;
$rule['keywords'] = array();
foreach($rule['keyword'] as $kwd) {
if($kwd['type'] != '1') {
$rule['kwd-adv'] = true;
} else {
$rule['keywords'][] = $kwd['content'];
}
}
$rule['keywords'] = implode(',', $rule['keywords']);
$row = pdo_fetch("SELECT * FROM ".tablename($this->tablename)." WHERE rid = :rid ORDER BY `id` DESC", array(':rid' => $rid));
if (!strexists($row['apiurl'], 'http://') && !strexists($row['apiurl'], 'https://')) {
$row['apilocal'] = $row['apiurl'];
$row['apiurl'] = '';
}
} else {
$row = array(
'cachetime' => 0,
);
}
$types = array(
2 => array(
'name' => '包含关键字',
'description' => '用户进行交谈时,对话中包含上述关键字就执行这条规则。',
),
3 => array(
'name' => '正则表达式匹配',
'description' => "用户进行交谈时,对话内容符合述关键字中定义的模式才会执行这条规则。
注意:如果你不明白正则表达式的工作方式,请不要使用正则匹配
注意:正则匹配使用MySQL的匹配引擎,请使用MySQL的正则语法
示例:
^微擎匹配以“微擎”开头的语句
微擎$匹配以“微擎”结尾的语句
^微擎$匹配等同“微擎”的语句
微擎匹配包含“微擎”的语句
[0-9\.\-]匹配所有的数字,句号和减号
^[a-zA-Z_]$所有的字母和下划线
^[[:alpha:]]{3}$所有的3个字母的单词
^a{4}$aaaa
^a{2,4}$aa,aaa或aaaa
^a{2,}$匹配多于两个a的字符串",
),
4 => array(
'name' => '直接接管',
'description' => "如果没有比这条回复优先级更高的回复被触发,那么直接使用这条回复。
注意:如果你不明白这个机制的工作方式,请不要使用直接接管",
)
);
$path = IA_ROOT . '/source/modules/userapi/api';
if (is_dir($path)) {
$apis = array();
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$apis[] = $file;
}
}
}
}
include $this->template('post');
}
}
}