comment = [__CLASS__, 'pushServiceReady'];
Typecho_Plugin::factory('Widget_Feedback')->finishComment = [__CLASS__, 'pushServiceGo'];
Helper::addRoute('CommentPushAction','/CommentPush/officialAccount','CommentPush_Action','officialAccount');
Helper::addPanel(1, 'CommentPush/Logs.php', 'CommentPush日志', 'CommentPush日志', 'administrator');
return _t('CommentPush插件启用成功');
}
/**
* @throws Typecho_Db_Exception
* @throws Typecho_Plugin_Exception
*/
public static function deactivate()
{
Helper::removeRoute('CommentPushAction');
Helper::removePanel(1, 'CommentPush/Logs.php');
if (Helper::options()->plugin('CommentPush')->isDelete == 1) {
self::removeTable();
}
}
/**
* @throws Typecho_Db_Exception
*/
private static function addTable()
{
$db = Typecho_Db::get();
$sql = self::getSql($db, 'install');
$db->query($sql);
}
/**
* @param $db
* @param string $path
* @return string|string[]
*/
private static function getSql($db, $path = 'install')
{
$adapter = $db->getAdapterName();
$prefix = $db->getPrefix();
if ($adapter === 'Pdo_Mysql' || $adapter === 'Mysql' || $adapter === 'Mysqli') {
$sqlTemplate = file_get_contents(__DIR__ . '/sql/' . $path . '/Mysql.sql');
}
if ($adapter === 'Pdo_SQLite') {
$sqlTemplate = file_get_contents(__DIR__ . '/sql/' . $path . '/SQLite.sql');
}
if ($adapter === 'Pdo_Pgsql') {
$sqlTemplate = file_get_contents(__DIR__ . '/sql/' . $path . '/Pgsql.sql');
}
if (empty($sqlTemplate)) throw new \Exception('暂不支持你的数据库');
$sql = str_replace('{prefix}', $prefix, $sqlTemplate);
return $sql;
}
/**
* @return string
* @throws Typecho_Db_Exception
*/
private static function removeTable()
{
$db = Typecho_Db::get();
$sql = self::getSql($db, 'uninstall');
try {
$db->query($sql, Typecho_Db::WRITE);
} catch (Typecho_Exception $e) {
return "删除CommentPush日志表失败!";
}
return "删除CommentPush日志表成功!";
}
/**
* @param Typecho_Widget_Helper_Form $form
*/
public static function config(Typecho_Widget_Helper_Form $form)
{
$serviceTitle = new Typecho_Widget_Helper_Layout('div', array('class=' => 'typecho-page-title'));
$serviceTitle->html('
推送服务配置
');
$form->addItem($serviceTitle);
$services = new Typecho_Widget_Helper_Form_Element_Checkbox('services', [
"QQService" => _t('Qmsg酱'),
"WeChatService" => _t('Server酱'),
"AliYunEmailService" => _t('阿里云邮件'),
"SmtpService" => _t('SMTP'),
"DingTalkBotService" => _t('钉钉机器人'),
"EnterpriseWeChatService" => _t('企业微信机器人'),
"OfficialAccountService" => _t('微信公众号')
], 'services', _t('推送服务 多选同时推送'), _t('插件作者:高彬展 奥秘Sir'));
$form->addInput($services->addRule('required', _t('必须选择一项推送服务')));
$isPushBlogger = new Typecho_Widget_Helper_Form_Element_Radio('isPushBlogger', [
1 => '是',
0 => '否'
], 1, _t('当评论者为博主本人不推送'), _t('如果选择“是”,博主本人写的评论将不推送'));
$form->addInput($isPushBlogger);
$isPushCommentReply = new Typecho_Widget_Helper_Form_Element_Radio('isPushCommentReply', [
1 => '是',
0 => '否'
], 1, _t('当作者回复评论向对方发送邮件'), _t('如果选择“否”,将不推送'));
$form->addInput($isPushCommentReply);
$isDelete = new Typecho_Widget_Helper_Form_Element_Radio('isDelete', [0 => '不删除', 1 => '删除'], 1, _t('卸载是否删除数据表'));
$form->addInput($isDelete);
self::qqService($form);
self::weChatService($form);
self::aliYunMailService($form);
self::smtpService($form);
self::DingTalkBotService($form);
self::EnterpriseWeChatService($form);
self::officialAccount($form);
}
/**
* Qmsg酱配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function qqService(Typecho_Widget_Helper_Form $form)
{
$qqServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$qqServiceTitle->html('Qmsg酱配置
');
$form->addItem($qqServiceTitle);
$qqApiUrl = new Typecho_Widget_Helper_Form_Element_Text('qqApiUrl', NULL, NULL, _t('Qmsg酱接口'), _t("当选择Qmsg酱必须填写"));
$form->addInput($qqApiUrl);
$receiveQq = new Typecho_Widget_Helper_Form_Element_Text('receiveQq', NULL, NULL, _t('接收消息的QQ,可以添加多个,以英文逗号分割'), _t("当选择Qmsg酱必须填写(指定的QQ必须在您的QQ号列表中)"));
$form->addInput($receiveQq);
}
/**
* Server酱配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function weChatService(Typecho_Widget_Helper_Form $form)
{
$weChatServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$weChatServiceTitle->html('Server酱配置
');
$form->addItem($weChatServiceTitle);
$weChatScKey = new Typecho_Widget_Helper_Form_Element_Text('weChatScKey', NULL, NULL, _t('Server酱 SCKEY'), _t("当选择Server酱必须填写"));
$form->addInput($weChatScKey);
}
/**
* 阿里云邮件配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function aliYunMailService(Typecho_Widget_Helper_Form $form)
{
$aliYunEmailServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$aliYunEmailServiceTitle->html('阿里云邮件配置
');
$form->addItem($aliYunEmailServiceTitle);
$aliYunRegion = new Typecho_Widget_Helper_Form_Element_Select('regionId', [
AliYunEmailService::HANGZHOU => _t('华东1(杭州)'),
AliYunEmailService::SINGAPORE => _t('亚太东南1(新加坡)'),
AliYunEmailService::SYDNEY => _t('亚太东南2(悉尼)')
], NULL, _t('服务地址'), _t('选择邮件推送所在服务器区域'));
$form->addInput($aliYunRegion);
$aliYunAccessKeyId = new Typecho_Widget_Helper_Form_Element_Text('accessKeyId', NULL, NULL, _t('AccessKey ID'), _t('请填入在阿里云生成的AccessKey ID'));
$form->addInput($aliYunAccessKeyId);
$aliYunAccessKeySecret = new Typecho_Widget_Helper_Form_Element_Text('accessKeySecret', NULL, NULL, _t('Access Key Secret'), _t('请填入在阿里云生成的Access Key Secret'));
$form->addInput($aliYunAccessKeySecret);
$aliYunFromAlias = new Typecho_Widget_Helper_Form_Element_Text('fromAlias', NULL, NULL, _t('发件人名称'), _t('邮件中显示的发信人名称,留空为博客名称'));
$form->addInput($aliYunFromAlias);
$aliYunAccountName = new Typecho_Widget_Helper_Form_Element_Text('accountName', NULL, NULL, _t('发件邮箱地址'), _t('邮件中显示的发信地址'));
$form->addInput($aliYunAccountName->addRule('email', _t('请输入正确的邮箱地址')));
}
/**
* SMTP配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function smtpService(Typecho_Widget_Helper_Form $form)
{
$smtpServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$smtpServiceTitle->html('SMTP配置
');
$form->addItem($smtpServiceTitle);
$smtpHost = new Typecho_Widget_Helper_Form_Element_Text('smtpHost', NULL, NULL, _t('SMTP地址'), _t('SMTP服务器连接地址'));
$form->addInput($smtpHost);
$smtpPort = new Typecho_Widget_Helper_Form_Element_Text('smtpPort', NULL, NULL, _t('SMTP端口'), _t('SMTP服务器连接端口'));
$form->addInput($smtpPort);
$smtpFromAlias = new Typecho_Widget_Helper_Form_Element_Text('smtpFromAlias', NULL, NULL, _t('发件人名称'), _t('邮件中显示的发信人名称,留空为博客名称'));
$form->addInput($smtpFromAlias);
$smtpUser = new Typecho_Widget_Helper_Form_Element_Text('smtpUser', NULL, NULL, _t('SMTP登录用户'), _t('SMTP登录用户名,一般为邮箱地址'));
$form->addInput($smtpUser);
$smtpPass = new Typecho_Widget_Helper_Form_Element_Text('smtpPass', NULL, NULL, _t('SMTP登录密码'), _t('一般为邮箱密码,但某些服务商需要生成特定密码'));
$form->addInput($smtpPass);
$smtpAuth = new Typecho_Widget_Helper_Form_Element_Checkbox('smtpAuth', ['enable' => _t('服务器需要验证')], ['enable'], _t('SMTP验证模式'));
$form->addInput($smtpAuth);
$smtpSecure = new Typecho_Widget_Helper_Form_Element_Radio('smtpSecure', ['false' => _t('无安全加密'), 'ssl' => _t('SSL加密'), 'tls' => _t('TLS加密')], 'false', _t('SMTP加密模式'));
$form->addInput($smtpSecure);
$template = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$template->html('邮件自定义模版
');
$form->addItem($template);
$authorTemplate = new Typecho_Widget_Helper_Form_Element_Textarea('authorTemplate', NULL, NULL, _t('向博主发信内容模板(为空即默认模版)'),
_t("可选参数:
'{blogUrl}',
'{blogName}',
'{author}',
'{permalink}',
'{title}',
'{text}',
'{ip}'
" . '写法:' . htmlspecialchars('{title}
')));
$form->addInput($authorTemplate);
$replyTemplate = new Typecho_Widget_Helper_Form_Element_Textarea('replyTemplate', NULL, NULL, _t('向访客发信内容模板(为空即默认模版)'),
_t("可选参数:
'{blogUrl}',
'{blogName}',
'{author}',
'{permalink}',
'{title}',
'{text}',
'{replyAuthor}',
'{replyText}',
'{commentUrl}'
" . '写法:' . htmlspecialchars('{title}
')));
$form->addInput($replyTemplate);
}
/**
* 钉钉机器人配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function DingTalkBotService(Typecho_Widget_Helper_Form $form)
{
$DingTalkBotServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$DingTalkBotServiceTitle->html('钉钉机器人配置
');
$form->addItem($DingTalkBotServiceTitle);
$DingTalkWebhook = new Typecho_Widget_Helper_Form_Element_Text('DingTalkWebhook', NULL, NULL, _t('钉钉 Webhook 地址'), _t("当选择钉钉机器人必须填写"));
$form->addInput($DingTalkWebhook);
$DingTalkSecret = new Typecho_Widget_Helper_Form_Element_Text('DingTalkSecret', NULL, NULL, _t('安全设置加签密钥'), _t("当选择钉钉机器人必须填写(安全设置:加签)"));
$form->addInput($DingTalkSecret);
}
/**
* 企业微信机器人配置面板
* @param Typecho_Widget_Helper_Form $form
*/
private static function EnterpriseWeChatService(Typecho_Widget_Helper_Form $form)
{
$EnterpriseWeChatServiceTitle = new Typecho_Widget_Helper_Layout('div', ['class=' => 'typecho-page-title']);
$EnterpriseWeChatServiceTitle->html('企业微信机器人配置
');
$form->addItem($EnterpriseWeChatServiceTitle);
$EnterpriseWeChatWebhook = new Typecho_Widget_Helper_Form_Element_Text('EnterpriseWeChatWebhook', NULL, NULL, _t('企业微信 Webhook 地址'), _t("当选择企业微信机器人必须填写"));
$form->addInput($EnterpriseWeChatWebhook);
}
private static function officialAccount(Typecho_Widget_Helper_Form $form){
$officialAccountTitle = new Typecho_Widget_Helper_Layout('div',['class' => 'typecho-page-title']);
$officialAccountTitle->html('微信公众号
');
$form->addItem($officialAccountTitle);
$token = new Typecho_Widget_Helper_Form_Element_Text('officialAccountToken', null, null, _t('接口配置信息 Token'), '接口配置信息 Token,Url为:博客地址/CommentPush/officialAccount');
$form->addInput($token);
$appId = new Typecho_Widget_Helper_Form_Element_Text('officialAccountAppId', null, null, _t('appId'), '微信公众号 appID');
$form->addInput($appId);
$appSecret = new Typecho_Widget_Helper_Form_Element_Text('officialAccountAppSecret', null, null, _t('appSecret'), '微信公众号 appSecret');
$form->addInput($appSecret);
$openId = new Typecho_Widget_Helper_Form_Element_Text('officialAccountOpenid', null, null, _t('openid'), '接收信息的微信号 openid');
$form->addInput($openId);
$templateId = new Typecho_Widget_Helper_Form_Element_Text('officialAccountTemplateId', null, null, _t('templateId'), "消息模版 templateId 可选参数:'{{title.DATA}}','{{user.DATA}}','{{ip.DATA}}','{{content.DATA}}'
示例(将例子复制粘贴到微信公众号模版内容即可):
标题:{{title.DATA}}
评论人:{{user.DATA}}
IP:{{ip.DATA}}
评论内容:{{content.DATA}}");
$form->addInput($templateId);
}
/**
* @param Typecho_Widget_Helper_Form $form
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form)
{
// TODO: Implement personalConfig() method.
}
public static function pushServiceReady($comment, $active)
{
self::$comment = $comment;
self::$active = $active;
return $comment;
}
/**
* @modify 小码农 增加实例化方法
*/
public static function pushServiceGo($comment)
{
$options = Helper::options();
$plugin = $options->plugin('CommentPush');
$services = $plugin->services;
if (!$services || $services == 'services') return false;
self::$comment['coid'] = $comment->coid;
/** @var QQService | WeChatService | AliYunEmailService | SmtpService | DingTalkBotService | EnterpriseWeChatService $service */
foreach ($services as $service){
$inst=call_user_func([$service,'create']);
call_user_func([$inst, '__handler'], self::$active, self::$comment, $plugin);
}
}
}