From 403fa43d44ef05ee2090a6cf766cb317da2feb32 Mon Sep 17 00:00:00 2001 From: hellcat <> Date: Sun, 27 Jul 2025 12:16:12 +0800 Subject: [PATCH] no message --- src/Command/Cron.php | 2 + src/Controllers/TomApi/Tg/HookController.php | 49 +- src/Models/DogOption.php | 51 ++ src/Models/Me.php | 19 + src/Models/Option.php | 47 + src/Models/Smtp.php | 16 + src/Services/Cron.php | 33 +- src/Services/Mail.php | 4 +- src/Services/Mail/Smtp_bulk.php | 30 +- src/Services/Tg/Hook/Dog.php | 908 +++++++++++++++++++ src/Services/Tg/Hook/Mod/Mail.php | 54 +- src/Services/Tg/Hook/Mod/Option.php | 50 + src/Services/Tg/Hook/Mod/Smtp.php | 29 + src/Services/Tg/Hook/Mod/Test.php | 12 + src/Services/Tg/Http.php | 77 +- 15 files changed, 1288 insertions(+), 93 deletions(-) create mode 100755 src/Models/DogOption.php create mode 100755 src/Models/Me.php create mode 100755 src/Models/Option.php create mode 100755 src/Models/Smtp.php create mode 100644 src/Services/Tg/Hook/Dog.php create mode 100644 src/Services/Tg/Hook/Mod/Option.php create mode 100644 src/Services/Tg/Hook/Mod/Smtp.php diff --git a/src/Command/Cron.php b/src/Command/Cron.php index ba31d489..4d4ae411 100755 --- a/src/Command/Cron.php +++ b/src/Command/Cron.php @@ -63,6 +63,8 @@ EOL; $jobs->sendDailyTrafficReport(); // 流量报告?不重要 $jobs->clearTodayWidth(); // 重置每日的用户使用流量 + $jobs->smtpClearDayCount(); // 重置stmp的day_count + // 每日清除前一天残留TgStep $jobs->clearTgStep(); diff --git a/src/Controllers/TomApi/Tg/HookController.php b/src/Controllers/TomApi/Tg/HookController.php index 13c600af..6b8c3799 100755 --- a/src/Controllers/TomApi/Tg/HookController.php +++ b/src/Controllers/TomApi/Tg/HookController.php @@ -75,7 +75,7 @@ final class HookController list($sClass, $sFunc) = explode("#", $sCmd); $sClass = ucfirst($sClass); - $sFunc = ucfirst($sFunc); +// $sFunc = ucfirst($sFunc); unset($aOption[0]); unset($aArg[0]); @@ -93,31 +93,34 @@ final class HookController // tomd($sFunc); // tomd($sClassPath, 1); - if (method_exists($sClassPath, $sFunc)) { - $oInstans = new $sClassPath(); - $r = $oInstans->$sFunc($aParams); +// if (method_exists($sClassPath, $sFunc)) { + $oInstans = new $sClassPath($aUpdate); + $r = $oInstans->$sFunc($aParams); + + // 可以不返回,里面直接send +// if (isset($r)) { +// if (empty($r)) { $r = 'hook的mod返回空'; } +// // 返回可以是数组 +// if (is_array($r)) { +// foreach ($r as $row) { +// $oTGHttp->sendToTG($row, $aUpdate); +// } +// } else { +// $oTGHttp->sendToTG($r, $aUpdate); +// } +// +// Http::response(200); +// } + + $oTGHttp->send($r, $aUpdate); - // 可以不返回,里面直接send - if (isset($r)) { - if (empty($r)) { $r = 'hook的mod返回空'; } - // 返回可以是数组 - if (is_array($r)) { - foreach ($r as $row) { - $oTGHttp->sendToTG($row, $aUpdate); - } - } else { - $oTGHttp->sendToTG($r, $aUpdate); - } - - Http::response(200); - } - - } else { - throw new \Exception("没有这个方法:".$sClass.'#'.$sFunc); - } +// } else { +// throw new \Exception("没有这个方法:".$sClass.'#'.$sFunc); +// } } catch (\Throwable $e) { - $sMessage = "错误(line:".$e->getLine()."): " . $e->getMessage(); +// $sMessage = "错误(line:".$e->getLine()."): " . $e->getMessage(); + $sMessage = "错误(文件: " . $e->getFile() . ",行: " . $e->getLine() . "): " . $e->getMessage(); $oTGHttp->sendToTG($sMessage, $aUpdate); diff --git a/src/Models/DogOption.php b/src/Models/DogOption.php new file mode 100755 index 00000000..7785833c --- /dev/null +++ b/src/Models/DogOption.php @@ -0,0 +1,51 @@ +where("k", $k)->first()?->v; + + return $v; + } + + public static function _list($sDogName) + { + $oSelf = self::where("dog_name", $sDogName)->get(); + + return self::_filterList($oSelf); + } + +// public static function _limit($sDogName, $iSkip, $iTake) +// { +// $oSelf = self::where("dog_name", $sDogName)->skip($iSkip)->take($iTake)->get(); +// +// return self::__filterList($oSelf); +// } + + public static function _filter($oOption) + { + $arr = []; + $arr[$oOption->dog_name."#".$oOption->k] = $oOption->v; + + return $arr; + } + + public static function _filterList($oOption) + { + $arr = []; + foreach ($oOption as $oOptionRow) { + $arr[] = self::_filter($oOptionRow); + } + + return $arr; + } + +} diff --git a/src/Models/Me.php b/src/Models/Me.php new file mode 100755 index 00000000..1507b436 --- /dev/null +++ b/src/Models/Me.php @@ -0,0 +1,19 @@ +first()?->v; + + return $v; + } + + public static function _list() + { + $oSelf = self::get(); + + return self::_filterList($oSelf); + } + + public static function _filter($oOption) + { + $arr = []; + $arr[$oOption->k] = $oOption->v; + + return $arr; + } + + public static function _filterList($oOption) + { + $arr = []; + foreach ($oOption as $oOptionRow) { + $arr[] = self::_filter($oOptionRow); + } + + return $arr; + } + +} diff --git a/src/Models/Smtp.php b/src/Models/Smtp.php new file mode 100755 index 00000000..71dd9b87 --- /dev/null +++ b/src/Models/Smtp.php @@ -0,0 +1,16 @@ += `day_max`"); + + echo Tools::toDateTime(time()) . ' smtp的dayCount重置'.$r.'条' . PHP_EOL; + } + public static function processEmailQueue_bulk(): void { if ((new EmailQueue())->count() === 0) { @@ -499,6 +508,16 @@ final class Cron } DB::beginTransaction(); + + $sDate = date("Y-m-d"); + $aSmtp = DB::select('SELECT * FROM smtp_list WHERE `day_clear_date` != "'.$sDate.'" AND `day_count` < `day_max` ORDER BY `day_clear_date` ASC LIMIT 1 FOR UPDATE SKIP LOCKED'); + + if (empty($aSmtp) || !isset($aSmtp[0])) { + echo Tools::toDateTime(time()) . ' 今日以没有可用smtp' . PHP_EOL; + break; + } + $oSmtp = $aSmtp[0]; + $email_queues_raw = DB::select('SELECT * FROM email_queue where `type` = "bulk" LIMIT 1 FOR UPDATE SKIP LOCKED'); if (count($email_queues_raw) === 0) { @@ -516,21 +535,15 @@ final class Cron if (Tools::isEmail($email_queue['to_email'])) { try { -// if (isset($email_queue['type']) && $email_queue['type'] == "bulk") { Mail::send_bulk( $email_queue['to_email'], $email_queue['subject'], $email_queue['template'], - json_decode($email_queue['array']) + json_decode($email_queue['array']), + $oSmtp ); -// } else { -// Mail::send( -// $email_queue['to_email'], -// $email_queue['subject'], -// $email_queue['template'], -// json_decode($email_queue['array']) -// ); -// } + + DB::update("UPDATE smtp_list SET `day_count` = `day_count` + 1 WHERE id = ".$oSmtp->id); } catch (Exception|ClientExceptionInterface $e) { echo $e->getMessage(); diff --git a/src/Services/Mail.php b/src/Services/Mail.php index 44f1f0d4..771bd4c4 100755 --- a/src/Services/Mail.php +++ b/src/Services/Mail.php @@ -66,10 +66,10 @@ final class Mail self::getClient()->send($to, $subject, $body); } - public static function send_bulk($to, $subject, $template, $array = []): void + public static function send_bulk($to, $subject, $template, $array = [], $oSmtp = []): void { $body = self::genHtml($template, $array); - new Smtp_bulk()->send($to, $subject, $body); + new Smtp_bulk($oSmtp)->send($to, $subject, $body); } } diff --git a/src/Services/Mail/Smtp_bulk.php b/src/Services/Mail/Smtp_bulk.php index 7b6a19cb..d35e581a 100755 --- a/src/Services/Mail/Smtp_bulk.php +++ b/src/Services/Mail/Smtp_bulk.php @@ -1,21 +1,22 @@ username; + $configs['smtp_password'] = $oSmtp->password; + $configs['smtp_sender'] = $oSmtp->sender; $mail = new PHPMailer(); $mail->isSMTP(); @@ -48,10 +49,6 @@ final class Smtp_bulk extends Base $mail->addBCC($configs['smtp_bbc']); } -// echo "
";
-//        var_dump($mail);
-//        exit;
-        
         $this->mail = $mail;
     }
 
@@ -66,6 +63,15 @@ final class Smtp_bulk extends Base
         $mail->Subject = $subject;
         $mail->Body = $body;
 
-        $mail->send();
+        if ($_ENV["is_loc"] == true) {
+            $str = "
";
+            $str .= "username : ".$mail->Username."
"; + $str .= "password : ".$mail->Password."
"; + $str .= "sender : ".$mail->From."
"; + tomd($str); + } else { + $mail->send(); + } + } } diff --git a/src/Services/Tg/Hook/Dog.php b/src/Services/Tg/Hook/Dog.php new file mode 100644 index 00000000..6b46ac53 --- /dev/null +++ b/src/Services/Tg/Hook/Dog.php @@ -0,0 +1,908 @@ +oDog->_setDogName("hub"); // 必须,me用,option用 +// $this->oDog->_setPrimaryKey("id"); // 可选,默认id +// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 +// $this->oDog->_setInFormat(["type"]); // 可选,zero^int,^date,^dateFull +// $this->oDog->_setOutFormat(["time" => "date"]); // 可选,date,dateFull + +class Dog extends Mod\Base { + + public $oModelSelf; + public $sPrimaryKey = "id"; + public $iStrMaxLen; + public $aStrField = []; + public $aInFormat = []; + public $aOutFormat = []; + public $sDogName; + private $aMsg = []; + + public function __construct($oModelSelf = false) + { + $this->_setModel($oModelSelf); + } + + //// 定义系列 + public function _setStrMaxLen($iStrMaxLen) + { + $this->iStrMaxLen = $iStrMaxLen; + } + + public function _setStrField($aStrField) + { + $this->iStrMaxLen = ModelDogOption::_hit($this->sDogName, "str_len_max"); + + if (!$this->iStrMaxLen) { +// throw new \Exception("需要设置dog的option的str_len_max"); + $this->iStrMaxLen = 60; + $this->aMsg["警告882"] = "需要设置dog的option的str_len_max,临时设为60。"; + } + + $this->aStrField = $aStrField; + } + + public function _setDogName($sDogName) + { + $this->sDogName = $sDogName; + } + + + public function _setModel($oModelSelf) + { + $this->oModelSelf = $oModelSelf; + } + + public function _setPrimaryKey($key) + { + $this->sPrimaryKey = $key; + } + + public function _setInFormat($aInFormat) + { + $this->aInFormat = $aInFormat; + } + + public function _setOutFormat($aOutFormat) + { + $this->aOutFormat = $aOutFormat; + } +// public function _setFormatField($aFormatField) +// { +// $this->aFormatField = $aFormatField; +// } + //// 定义系列 end + + //// option 系列 + public function option($aParam) + { + + $aOption = ModelDogOption::_list($this->sDogName); + + return $this->toJson($aOption); + } + + public function optionAdd($aParam) + { + $k = $aParam["aArg"][1] ?? false; + $v = $aParam["aArg"][2] ?? false; + + if ($k == "?") { + return "#optionAdd {k} {v}"; + } + + if (!$k) { + return "需要k"; + } + + if (!$v) { + return "需要v"; + } + + $oOption = new ModelDogOption(); + $oOption->dog_name = $this->sDogName; + $oOption->k = $k; + $oOption->v = $v; + $oOption->save(); + + return $this->toJson(ModelDogOption::_filter($oOption)); + } + + public function optionSet($aParam) + { + $k = $aParam["aOption"][1] ?? false; + $v = $aParam["aArg"][1] ?? false; + + if ($v == "?") { + return "#optionSet__{k} {v}"; + } + + if (!$k) { + return "需要k"; + } + + if (!$v) { + return "需要v"; + } + + $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first(); + + if (!$oOption) { + return "没找到这个"; + } + + $oOption->v = $v; + $oOption->save(); + + return $this->toJson(ModelDogOption::_filter($oOption)); + } + + public function optionDel($aParam) + { + $k = $aParam["aArg"][1] ?? false; + $is_done = $aParam["is_done"] ?? false; + + if ($k == "?") { + return "#optionDel {k}"; + } + + if (!$k) { + return "需要k"; + } + + $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first(); + + if (!$oOption) { + return "没找到这个"; + } + + if ($is_done === false) { + + $sMsg = "匹配以下,确认用optionDelDone()。"; + $sOption = $this->toJson($oOption); + + return $sMsg."\n\n".$sOption; + + } else if ($is_done === true) { + + $r = $oOption->delete(); + + return $r; + } + } + + public function optionDelDone($aParam) + { + $aParam["is_done"] = true; + + return $this->optionDel($aParam); + } + //// option 系列 end + + //// 辅助系列 + private function filterList($oSelfList) + { + foreach ($oSelfList as &$oSelfListRow) { + $oSelfListRow = $this->filterRow($oSelfListRow); + } + + return $oSelfList; + } + + private function meToStr_list($oMe) + { + $str = ""; + $i = 0; + foreach ($oMe as $oMeRow) { + if ($i !== 0) { + $str .= "\n\n"; + } + $str .= $this->meToStr($oMeRow); + $i++; + } + + return $str; + } + + private function meToStr($oMe) + { + $str = $oMe->id.":".$oMe->rag; + + return $str; + } + //// 辅助系列 end + + //// json系列 +// private function + //// json系列end + + //// me系列 + public function me() + { + $oMe = ModelMe::where("class", $this->sDogName)->first(); + + if (!$oMe) { + return "空"; + } + + return $oMe->rag; + } + + public function meEdit($aParam) + { + $aValue = $aParam["aArg"] ?? false; + + $sValue = implode(" ", $aValue); + + if ($sValue == "?") { + return "/meEdit {value}"; + } + + $aWhere = [ + "class" => $this->sDogName, + ]; + + $aValue = [ + "rag" => $sValue, + ]; + + $oMe = ModelMe::updateOrCreate($aWhere, $aValue); + + return $this->me(); + } + //// me系列 end + + private function filterRow($oSelfRow) + { + + foreach ($this->aStrField as $v) { + $oSelfRow->{$v} = $this->subStr($oSelfRow->{$v}); + } + + return $oSelfRow; + } + + private function subStr($input) { + + if (!$input) { + return ""; + } + + if (mb_strlen($input, 'UTF-8') > (int) $this->iStrMaxLen) { + + return mb_substr($input, 0, (int) $this->iStrMaxLen, 'UTF-8')."……"; + + } + + return $input; + } + + public function list($aParam) + { + return $this->page($aParam); + } + + public function limit($aParam) + { + if (($aParam["aArg"][1] ?? false) == "?") { + return "#limit {skip} {take}"; + } + + $iSkip = $aParam["aArg"][1] ?? 0; + $iTake = $aParam["aArg"][2] ?? false; + + if (!$iTake) { + $iTake = ModelOption::_hit("dog_limit"); + } + + if (!$iTake) { + return "需要option表里的dog_limit"; + } + + $oSelf = $this->oModelSelf->skip($iSkip)->take($iTake)->get(); + + return $this->toJson($oSelf); + } + + public function page($aParam) + { + $iPage = $aParam["aArg"][1] ?? 1; + + $aParam = []; + $aParam["aOption"][2] = $iPage; + + return $this->find($aParam); + } + + public function add($aParam) + { + $sField = $aParam["aOption"][1] ?? false; + $sValue = $aParam["aArg"][1] ?? false; + + if ($sValue == "?") { + return "#add__{field} {value}"; + } + + if (!$sValue) { + return "需要value"; + } + + if (!$sField) { + return "需要field"; + } + + $this->oModelSelf->$sField = $sValue; + + $this->oModelSelf->save(); + + $aParam = []; + $aParam["aOption"][1] = $this->sPrimaryKey; + $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey}; + + return $this->find($aParam); + } + + public function like($aParam) + { + + $aParam["is_like"] = true; + + return $this->find($aParam); + + } + + public function clone($aParam) + { + $sValue = $aParam['aArg'][1] ?? false; +// $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; + $sKeyType = $aParam["aOption"][1] ?? "int"; + + if ($sValue == "?") { + return "#clone__{keyType?int:int,str,int自增str随机} {whereValue}"; + } + + if (!$sValue) { + return "需要value"; + } + + // 查找文章 + $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sValue)->first(); + + if (!$oModelSelf) { + return "没找到这个"; + } + + $oModelSelfNew = $oModelSelf->replicate(); + if ($sKeyType == "str") { + $oModelSelfNew->code = $oModelSelfNew->{$this->sPrimaryKey}."-clone".rand(0, 9999); + } + $oModelSelfNew->save(); + + $aParam = []; + $aParam["aArg"][1] = $oModelSelfNew->{$this->sPrimaryKey}; + + return $this->find($aParam); + } + + private function _getLimit() + { + $iLimit = ModelDogOption::_hit($this->sDogName, "limit"); + + if (!$iLimit) { + $iLimit = ModelOption::_hit("dog_limit"); + } + + if (!$iLimit) { +// throw new \Exception("需要option里的dog_limit"); + $iLimit = 30; + $this->aMsg["警告881"] = "需要option里的dog_limit,临时设为30。"; + } + + return $iLimit; + } + + public function find($aParam) + { + $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey; + $sValue = $aParam["aArg"][1] ?? false; + $iPage = $aParam["aOption"][2] ?? 1; + $isLike = $aParam["is_like"] ?? false; + $sHitField = $aParam["sHitField"] ?? false; + + if ($sValue == "?") { + return "#find__{field?primaryKey}__{page?1} {value?all}"; + } + + $iLimit = $this->_getLimit(); + + if ($sValue === false ) { + + $oSelf = $this->oModelSelf; + + } else if ($isLike === true) { + + $oSelf = $this->oModelSelf->where($sField, "like", "%".$sValue."%"); + + } else { + + $oSelf = $this->oModelSelf->where($sField, $sValue); + + } + + $oSelf = $oSelf->paginate($iLimit, ['*'], 'page', $iPage); + + if ($oSelf->isEmpty()) { + return "没找到这个"; + } + + // hit必然单体 + if ($sHitField) { + return $oSelf->items()[0]->$sHitField; + } + + $aData = $this->toDataList($oSelf); + + return $this->toJson($aData); + } + + + private function toDataList($oSelf) + { + $aSelf = $oSelf->toArray(); + + $aMsg = []; + + // 说明是分页 + if (isset($aSelf["data"])) { + $aData = $aSelf["data"]; + } else { + $aData = $aSelf; + } + + $iCount = $aSelf["total"] ?? 0; + $iPagePer = $aSelf["per_page"] ?? 0; + $iPage = $aSelf["current_page"] ?? 0; + $iPageTotal = $aSelf["last_page"] ?? 0; + + if ($iPageTotal > 1) { + if ($iPage) { + $this->aMsg["页"]["页当前"] = $iPage; + } + + if ($iPageTotal) { + $this->aMsg["页"]["页总数"] = $iPageTotal; + } + + if ($iPagePer) { + $this->aMsg["页"]["行每页"] = $iPagePer; + } + + if ($iCount) { + $this->aMsg["页"]["行总数"] = $iCount; + } + } + + $aData = $this->filterDataList($aData); +// $aData = $this->dataInsterMsgList($aData); + + return $aData; + } + + public function toJson($aData) + { + + if ($this->aMsg && !is_string($aData)) { + if (is_object($aData)) { + $aData = $aData->toArray(); + } + array_unshift($aData, $this->aMsg); + } + + return parent::toJson($aData); + } + + private function dataInsterMsgList($aData, $aMsg) + { + if ($aMsg) { + array_unshift($aData, $aMsg); + } + + return $aData; + } + + private function dataInsterMsg($aData, $aMsg) + { + $aDataNew = []; + + if ($aMsg) { + $aDataNew[] = $aMsg; + $aDataNew[] = $aData; + } else { + $aDataNew = $aData; + } + + return $aDataNew; + } + + private function toData($oSelf) + { + if (!is_array($oSelf)) { + $aData = $oSelf->toArray(); + } else { + $aData = $oSelf; + } + + $aData = $this->filterData($aData); + + return $aData; + } + + private function filterDataList($aData) + { + foreach ($aData as &$aDataRow) { + $aDataRow = $this->filterData($aDataRow); + } + + return $aData; + } + + private function filterData($aData) + { + foreach ($this->aStrField as $sStrField) { + $aData[$sStrField] = $this->subStr($aData[$sStrField]); + } + + foreach ($this->aOutFormat as $sFormatField => $sFormatType) { + if ($sFormatType == "date") { + $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); + } else if ($sFormatType == "dateFull") { + $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); + } + } + + return $aData; + } + + public function kv($aParam) + { + $k = $aParam["aOption"][1] ?? false; + $v = $aParam["aArg"][1] ?? false; + + if ($v == "?") { + return "#kv__{k} {v}"; + } + + $aParam = []; + $aParam["aOption"][1] = $k; + $aParam["aOption"][2] = "v"; + $aParam["aArg"][1] = $v; + + return $this->set($aParam); + } + + public function jsonAdd($aParam) + { + if (($aParam["aArg"][1] ?? false) == "?") { + return "#jsonAdd {json}"; + } + + $aJson = $aParam["aArg"] ?? false; + $sJson = implode(" ", $aJson); + + if (!$sJson) { + return "需要json"; + } + + $aJson = json_decode($sJson, true); + + foreach ($aJson as $k => $v) { + $this->oModelSelf->$k = $v; + } + + $this->oModelSelf->save(); + + $aParam = []; + $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey}; + + return $this->find($aParam); + } + + public function jsonSet($aParam) + { + $sWhereValue = $aParam["aOption"][1] ?? false; + $aJson = $aParam["aArg"] ?? false; + $sJson = implode(" ", $aJson); + + if ($sJson == "?") { + return "#setJson__{whereValue} {json} | 绑定主键 单体"; + } + + if (!$sWhereValue) { + return "需要whereValue"; + } + + if (!$sJson) { + return "需要json"; + } + + $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sWhereValue)->first(); + + if (!$oModelSelf) { + return "没找到这个"; + } + + $aJson = json_decode($sJson, true); + + foreach ($aJson as $k => $v) { + $v = $this->inFormat($k, $v); + $oModelSelf->$k = $v; + } + + $oModelSelf->save(); + + $aParam = []; + $aParam["aArg"][1] = $oModelSelf->{$this->sPrimaryKey}; + + return $this->find($aParam); + } + + public function jsonGet($aParam) + { + $sWhereValue = $aParam["aArg"][1] ?? false; + $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; + + if ($sWhereValue == "?") { + return "#jsonGet__{whereFile?primary} {whereValue}"; + } + + if (!$sWhereValue) { + return "需要whereValue"; + } + + $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->first(); + + if (!$oSelf) { + return "没找到这个"; + } + + return $this->toJson($oSelf); + } + + public function likeSet($aParam) + { + if (($aParam["aArg"][1] ?? false) == "?") { + return "原set走like匹配,慎用"; + } + + $aParam["is_like"] = true; + + return $this->set($aParam); + } + + public function likeSetDone($aParam) + { + if (($aParam["aArg"][1] ?? false) == "?") { + return "原set走like匹配,慎用"; + } + + $aParam["is_like"] = true; + $aParam["is_like_done"] = true; + + return $this->set($aParam); + } + + public function set($aParam) + { + $sSetValue = $aParam["aArg"] ?? false; + $sSetValue = implode(" ", $sSetValue); + $bIsLike = $aParam["is_like"] ?? false; + $bIsLikeDone = $aParam["is_like_done"] ?? false; + + if ($sSetValue == "?") { + $tmp = "#set__{whereField}__{WhereValue}__{setField} {setValue} | 多条"; + $tmp .= "\n\n"; + $tmp .= "#set__{whereValue}__{setField} {setValue} | 主键"; + return $tmp; + } + + // 有第三参数说明是findSet模式 + if (isset($aParam["aOption"][3])) { + $sWhereField = $aParam["aOption"][1] ?? false; + $sWhereValue = $aParam["aOption"][2] ?? false; + $sSetField = $aParam["aOption"][3] ?? false; + $sMod = "findSet"; + } else { + $sWhereField = $this->sPrimaryKey; + $sWhereValue = $aParam["aOption"][1] ?? false; + $sSetField = $aParam["aOption"][2] ?? false; + $sMod = "set"; + } + + if (!$sWhereField) { + return "需要whereField"; + } + + if (!$sWhereValue) { + return "需要whereValue"; + } + + if (!$sSetField) { + return "需要setField"; + } + + if ($bIsLike === false) { + $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->get(); + } else if ($bIsLike === true) { + + $oSelf = $this->oModelSelf->where($sWhereField, "like", "%".$sWhereValue."%")->get(); + + if ($bIsLikeDone === false) { + + $sMsg = "匹配以下数据,确认修改用likeSetDone()。"; + + $sSelfStr = $this->toJson($oSelf); + + return $sMsg."\n\n".$sSelfStr; + } + + } else { + return "??????????????"; + } + + if ($oSelf->isEmpty()) { + return "没找到这个"; + } + + $sSetValue = $this->inFormat($sSetField, $sSetValue); + $i = 0; + foreach ($oSelf as $oSelfRow) { + $oSelfRow->$sSetField = $sSetValue; + $oSelfRow->save(); + $i++; + } + + if ($i == 1) { + $aParam = []; + $aParam["aOption"][1] = $this->sPrimaryKey; + $aParam["aArg"][1] = $oSelfRow->{$this->sPrimaryKey}; + return $this->find($aParam); + } + + return "影响".$i."条数据"; + } + + private function inFormat($sSetField, $sSetValue) { + + if (in_array($sSetField, $this->aInFormat)) { + $sSetValue = $this->mapInFormat($sSetValue); + } + + return $sSetValue; + } + + private function mapInFormat($sValue) + { + $aValue = explode("^", $sValue, 2); + + if (!isset($aValue[1])) { + return $sValue; + } + + $sValueQian = $aValue[0]; + $sValueHou = $aValue[1]; + + if ($sValueHou == "int") { + + if ($sValueQian == "zero") { + $sValueQian = 0; + } + + } else if ($sValueHou == "dayToDate") { + + $sValueQian = date("Y-m-d H:i:s", strtotime("+{$sValueQian} days")); + + } + + return $sValueQian; + } + + public function delDone($aParam) + { + $aParam["is_done"] = true; + + return $this->del($aParam); + } + + public function del($aParam) + { + $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey; + $sValue = $aParam["aArg"][1] ?? false; + $bIsDone = $aParam["is_done"] ?? false; + + if ($sValue == "?") { + return "#del__{field?默认primaryKey} {value}"; + } + + $oSelf = $this->oModelSelf->where($sField, $sValue)->get(); + + if ($oSelf->isEmpty()) { + return "没找到这个"; + } + + if ($bIsDone == true) { + + $i = 0; + foreach ($oSelf as $oSelfRow) { + $ii = $oSelfRow->delete(); + $i = $i + $ii; + } + + return "删除".$i."条数据"; + } + + $sMsg = "匹配以下数据,确认删除使用delDone()。\n\n"; + $sStr = $this->toJson($oSelf); + + return $sMsg.$sStr; + } + + public function hit($aParam) + { + $sHitField = $aParam["aOption"][1] ?? false; + $sWhereField = $aParam["aOption"][2] ?? $this->sPrimaryKey; + $sWhereValue = $aParam["aArg"][1] ?? false; + + if ($sWhereValue == "?") { + return "#hit__{hitField}__{whereField?primaryKey} {whereValue}"; + } + + if (!$sWhereValue) { + return "需要value"; + } + + $aParam = []; + $aParam["sHitField"] = $sHitField; + $aParam["aOption"][1] = $sWhereField; + $aParam["aArg"][1] = $sWhereValue; + + return $this->find($aParam); + } + + public function content($aParam) + { + $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; + $sValue = $aParam["aArg"][1] ?? false; + + if ($sValue == "?") { + return "#content__{whereField?primaryKey} {whereValue}"; + } + + if (!$sValue) { + return "需要value"; + } + + $aParam = []; + $aParam["aOption"][1] = "content"; + $aParam["aOption"][2] = $sWhereField; + $aParam["aArg"][1] = $sValue; + + return $this->hit($aParam); + } + + public function table() + { + $sTable = $this->oModelSelf->getTable(); + + $columns = \DB::select("SHOW CREATE TABLE `{$sTable}`"); + + return $columns[0]->{"Create Table"}; + } + +} diff --git a/src/Services/Tg/Hook/Mod/Mail.php b/src/Services/Tg/Hook/Mod/Mail.php index 865eb1f1..ddcf122d 100644 --- a/src/Services/Tg/Hook/Mod/Mail.php +++ b/src/Services/Tg/Hook/Mod/Mail.php @@ -30,9 +30,25 @@ use App\Models\MailArticle as ModelMailArticle; //use App\Services\TomTool\ToolTg; use App\Services\TomTool\TgFormat; +use App\Services\Tg\Hook\Dog; + final class Mail extends Base { + private $oDog; + + public function __construct($aUpdate = []) + { + $this->oDog = new Dog(new ModelMailArticle()); +// $this->oDog->_setPrimaryKey("k"); // 可选,默认id + $this->oDog->_setDogName("mail"); // 必须 + } + + public function __call($sName, $aArg) + { + return $this->oDog->$sName($aArg[0]); + } + public function List() { $oMailArticle = ModelMailArticle::all(); @@ -40,7 +56,7 @@ final class Mail extends Base return $this->toJson($oMailArticle); } - public function Add($aParam) + public function add($aParam) { $sValue = $aParam["aArg"][1] ?? false; @@ -55,7 +71,7 @@ final class Mail extends Base return $this->find($aParam); } - public function Set($aParam) + public function set($aParam) { $iId = $aParam["aOption"][1] ?? false; $sField = $aParam["aOption"][2] ?? false; @@ -91,7 +107,7 @@ final class Mail extends Base return $this->find($aParam); } - public function Like($aParam) + public function like($aParam) { $sValue = $aParam["aArg"][1] ?? false; $sField = $aParam["aOption"][1] ?? false; @@ -113,7 +129,7 @@ final class Mail extends Base return $this->toJson($oMailArticle); } - public function Del($aParam) + public function del($aParam) { $iId = $aParam["aArg"][1] ?? false; @@ -132,7 +148,7 @@ final class Mail extends Base return $this->list(); } - public function Find($aParam) + public function find($aParam) { $iId = $aParam["aArg"][1] ?? false; @@ -145,18 +161,18 @@ final class Mail extends Base return $this->toJson($oMailArticle); } - public function Me() - { - $tmp = [ - "type:bulk=群发,none=默认原本", - "tpl:war=重要通知,tip=运维通知,warn=系统提示,one=没有大标题一张纸", - "testSend,测试,发给约基奇" - ]; - - $str = TgFormat::arrToStr($tmp); - - return $str; - } +// public function Me() +// { +// $tmp = [ +// "type:bulk=群发,none=默认原本", +// "tpl:war=重要通知,tip=运维通知,warn=系统提示,one=没有大标题一张纸", +// "testSend,测试,发给约基奇" +// ]; +// +// $str = TgFormat::arrToStr($tmp); +// +// return $str; +// } public function testSend($aParam) { @@ -165,7 +181,7 @@ final class Mail extends Base return $this->send($aParam); } - public function Send($aParam) + public function send($aParam) { $iId = $aParam["aArg"][1] ?? false; $iClass = $aParam["aOption"][1] ?? false; @@ -210,7 +226,7 @@ final class Mail extends Base } - public function _Send($oMailArticle, $iClass, $isTest = false) + public function _send($oMailArticle, $iClass, $isTest = false) { $sMailTitle = $oMailArticle["title"]; $sMailContent = $oMailArticle["content"]; diff --git a/src/Services/Tg/Hook/Mod/Option.php b/src/Services/Tg/Hook/Mod/Option.php new file mode 100644 index 00000000..0994959e --- /dev/null +++ b/src/Services/Tg/Hook/Mod/Option.php @@ -0,0 +1,50 @@ +oDog = new Dog(new ModelOption()); + $this->oDog->_setPrimaryKey("k"); // 可选,默认id + $this->oDog->_setDogName("option"); // 必须 + } + + public function __call($sName, $aArg) + { + return $this->oDog->$sName($aArg[0]); + } + +// public function Pause($aParam) +// { +// $v = $aParam['aArg'][1]; +// +// // 获取第一个匹配的选项 +// $oOption = ModelOption::where("type", "pause")->first(); +// +// // 检查是否找到了选项 +// if ($oOption) { +// $oOption->value = $v; +// +// // 保存并返回结果 +// return json_encode($oOption->save()); +// } +// +// // 如果没有找到选项,返回一个错误信息 +// return json_encode(['error' => 'Option not found']); +// } +// +// public function List() +// { +// $aOptionList = ModelOption::all()->toArray(); +// +// return json_encode($aOptionList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); +// } + +} diff --git a/src/Services/Tg/Hook/Mod/Smtp.php b/src/Services/Tg/Hook/Mod/Smtp.php new file mode 100644 index 00000000..5705aba2 --- /dev/null +++ b/src/Services/Tg/Hook/Mod/Smtp.php @@ -0,0 +1,29 @@ +oDog = new Dog(new ModelSmtp()); + $this->oDog->_setDogName("smtp"); // 必须,me用,正常就是类名,只不过后期没准改名,所以就这里写死 +// $this->oDog->_setPrimaryKey("code"); // 可选,默认id +// $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 + + } + + public function __call($sName, $aArg) + { + + return $this->oDog->$sName($aArg[0]); + + } + +} diff --git a/src/Services/Tg/Hook/Mod/Test.php b/src/Services/Tg/Hook/Mod/Test.php index 8b624198..30c812f1 100644 --- a/src/Services/Tg/Hook/Mod/Test.php +++ b/src/Services/Tg/Hook/Mod/Test.php @@ -8,10 +8,22 @@ use App\Models\Order as ModelOrder; use App\Models\User as ModelUser; use App\Utils\Tools; //use App\Services\DB; +use App\Services\Cron; final class Test extends Base { // id:1778 测试员test1,可着它嚯嚯 + + public function smtpClearDayCount() + { + $job = new Cron(); + $job->smtpClearDayCount(); + } + + public function runMailBulk() + { + Cron::processEmailQueue_bulk(); + } private function OrderFormat($v) { diff --git a/src/Services/Tg/Http.php b/src/Services/Tg/Http.php index f67de9b5..c8ea65ff 100644 --- a/src/Services/Tg/Http.php +++ b/src/Services/Tg/Http.php @@ -4,6 +4,7 @@ namespace App\Services\Tg; use App\Models\Config; use App\Services\IM\Telegram; use App\Services\Tg\Http; +use App\Services\TomTool\Http as TomHttp; class Http { @@ -16,6 +17,55 @@ class Http { $this->sApiChatId = Config::obtain('telegram_chatid'); } + public function send($sMsg = "msg空", $aUpdate = []) + { + + $bSendTg = true; + + $sShell = $aUpdate["shell"] ?? false; + $bIsDove = $aUpdate["is_dove"] ?? false; + + if ($sShell == "cmd") { + $bSendTg = false; + } + + if ($bIsDove == true) { + $bSendTg = false; + } + + if ($_ENV['is_loc'] == true) { + $bSendTg = false; + } + + if (is_array($sMsg)) { + foreach ($sMsg as $sMsgRow) { + if ($bSendTg) { + $this->sendTg($sMsgRow); + } else { + echo $sMsgRow; + } + } + } else { + if ($bSendTg) { + $this->sendTg($sMsg); + } else { + echo $sMsg; + } + } + + if ($bSendTg) { + TomHttp::response(200); + } else { + exit; + } + + } + + private function sendTg($sMsg) + { + (new Telegram())->send(0, $sMsg); + } + public function sendToTG($sMsg = "没有msg?", $aUpdate = []) { @@ -29,37 +79,10 @@ class Http { } else { -// $oHttp = new Http(); -// $oHttp->sMethod = "post"; -// $oHttp->sToUrl = "https://api.telegram.org/bot$this->sApiToken/sendMessage"; -// $oHttp->bIsJson = true; -// $oHttp->aData = [ -// "chat_id" => $this->sApiChatId, -// "text" => $sMsg -// ]; -// -// $oHttp->send(); - - - - - - (new Telegram())->send(0, $sMsg); } -// if ($_ENV['is_loc'] === true) { -// echo "
";
-//            echo($sMsg);
-//        } else {
-//            
-//            (new Telegram())->send(0, $sMsg);
-//            
-////            $url = "https://api.telegram.org/bot$this->sApiToken/sendMessage?chat_id=$this->sApiChatId&text=" . urlencode($sMsg);
-////            file_get_contents($url);
-//        }
-        
     }
     
 }