From 5b079de70b802e6ef73d5644b619ea4d822f175b Mon Sep 17 00:00:00 2001
From: hellcat <>
Date: Fri, 19 Dec 2025 17:38:00 +0800
Subject: [PATCH] no message
---
.../Controllers/Api/FreenodeController.php | 35 +
.../Controllers/Api/TG/HookController.php | 10 +-
app/Models/DogOption.php | 51 +
app/Services/Tg/Hook/Dog.php | 1049 +++++++++++++++++
app/Services/Tg/Hook/Mod/Article.php | 43 +
app/Services/{TG => Tg}/Hook/Mod/Base.php | 4 +-
app/Services/{TG => Tg}/Hook/Mod/Cmd.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/DataBase.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/Jichang.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/Option.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/Test.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/Tom.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/Tool.php | 2 +-
app/Services/{TG => Tg}/Hook/Mod/ToolOld.php | 2 +-
app/Services/{TG => Tg}/Http.php | 0
public/fn/20240101.html | 353 ------
16 files changed, 1193 insertions(+), 368 deletions(-)
create mode 100755 app/Models/DogOption.php
create mode 100644 app/Services/Tg/Hook/Dog.php
create mode 100644 app/Services/Tg/Hook/Mod/Article.php
rename app/Services/{TG => Tg}/Hook/Mod/Base.php (91%)
rename app/Services/{TG => Tg}/Hook/Mod/Cmd.php (96%)
rename app/Services/{TG => Tg}/Hook/Mod/DataBase.php (93%)
rename app/Services/{TG => Tg}/Hook/Mod/Jichang.php (98%)
rename app/Services/{TG => Tg}/Hook/Mod/Option.php (98%)
rename app/Services/{TG => Tg}/Hook/Mod/Test.php (98%)
rename app/Services/{TG => Tg}/Hook/Mod/Tom.php (85%)
rename app/Services/{TG => Tg}/Hook/Mod/Tool.php (98%)
rename app/Services/{TG => Tg}/Hook/Mod/ToolOld.php (94%)
rename app/Services/{TG => Tg}/Http.php (100%)
delete mode 100755 public/fn/20240101.html
diff --git a/app/Http/Controllers/Api/FreenodeController.php b/app/Http/Controllers/Api/FreenodeController.php
index e35d2bc..6ce33f0 100755
--- a/app/Http/Controllers/Api/FreenodeController.php
+++ b/app/Http/Controllers/Api/FreenodeController.php
@@ -94,9 +94,44 @@ class FreenodeController extends Controller
TeleSlave::log()->enableSlaveQueue(false)->send("新fn文章:".$sHtmlUrl);
+ self::_delLast();
+
return $sHtmlUrl;
}
+ private function _delLast()
+ {
+ $iLastTime = strtotime("+365 day"); // 这边保存1年
+// $sLastDate = date("Y-m-d", $iLastTime);
+ $sLastDateCode = date("Ymd", $iLastTime);
+
+ // 删除file
+ foreach (self::$sEnding as $sClient => $sEnding) {
+ $sFilePath = "sub/".$sLastDateCode."-".$sClient.$sEnding;
+
+ if (file_exists($sFilePath)) {
+ if (unlink($sFilePath)) {
+// echo " - 文件删除成功".$sFilePath."\n";
+ } else {
+ $sMsg = " - 文件删除失败 -> ".$sFilePath."\n";
+ TeleSlave::warn()->send($sMsg);
+ }
+ }
+ }
+
+ // 删除html
+ $sHtmlPath = "fn/".$sLastDateCode.".html";
+ if (file_exists($sHtmlPath)) {
+ if (unlink($sHtmlPath)) {
+// echo " - 文件删除成功".$sHtmlPath."\n";
+ } else {
+ $sMsg = " - 文件删除失败 -> ".$sHtmlPath."\n";
+ TeleSlave::warn()->send($sMsg);
+ }
+ }
+
+ }
+
private function _saveHtml($sDateCode)
{
$sFreenodeNewUrl = env("APP_URL")."/fn/single/".$sDateCode;
diff --git a/app/Http/Controllers/Api/TG/HookController.php b/app/Http/Controllers/Api/TG/HookController.php
index 5bfd1af..363bf7d 100755
--- a/app/Http/Controllers/Api/TG/HookController.php
+++ b/app/Http/Controllers/Api/TG/HookController.php
@@ -71,8 +71,8 @@ final class HookController
$sClassPath = "App\\Services\\TG\\Hook\\Mod\\".$sClass;
- if (method_exists($sClassPath, $sFunc)) {
- $oInstans = new $sClassPath();
+// if (method_exists($sClassPath, $sFunc)) {
+ $oInstans = new $sClassPath($aUpdate);
$r = $oInstans->$sFunc($aParams);
// 可以不返回,里面直接send
@@ -90,9 +90,9 @@ final class HookController
Http::response(200);
}
- } else {
- throw new \Exception("没有这个方法:".$sClass.'#'.$sFunc);
- }
+// } else {
+// throw new \Exception("没有这个方法:".$sClass.'#'.$sFunc);
+// }
} catch (\Throwable $e) {
$sMessage = "错误(line:".$e->getLine()."): " . $e->getMessage();
diff --git a/app/Models/DogOption.php b/app/Models/DogOption.php
new file mode 100755
index 0000000..fbebc1b
--- /dev/null
+++ b/app/Models/DogOption.php
@@ -0,0 +1,51 @@
+where("k", $k)->first()?->v;
+// tomd($sDogName);
+ 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/app/Services/Tg/Hook/Dog.php b/app/Services/Tg/Hook/Dog.php
new file mode 100644
index 0000000..55c5b8c
--- /dev/null
+++ b/app/Services/Tg/Hook/Dog.php
@@ -0,0 +1,1049 @@
+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 $aSelectField = [];
+ public $aHideField = [];
+ public $aJsonField = [];
+
+ public function __construct($oModelSelf = false)
+ {
+ $this->_setModel($oModelSelf);
+ }
+
+ //// 定义系列
+
+ // 必须,关联option和me那些
+ public function _setDogName($sDogName)
+ {
+ $this->sDogName = $sDogName;
+ }
+
+ // 必须,使用的model
+ public function _setModel($oModelSelf)
+ {
+ $this->oModelSelf = $oModelSelf;
+ }
+
+ // str字段的最大长度
+ public function _setStrMaxLen($iStrMaxLen)
+ {
+ $this->iStrMaxLen = $iStrMaxLen;
+ }
+
+ public function _setJsonField($aJsonField)
+ {
+ $this->aJsonField = $aJsonField;
+ }
+
+ // 隐藏某些字段[id,name]
+ public function _setHideField($aHideField = [])
+ {
+ $this->aHideField = $aHideField;
+ }
+
+ // 选择性取某些字段[id,name]
+ public function _setSelectField($aSelectField = [])
+ {
+ $this->aSelectField = $aSelectField;
+ }
+
+ // 设置长字符串字段
+ public function _setStrField($aStrField)
+ {
+ $this->iStrMaxLen = ModelDogOption::_hit($this->sDogName, "str_len_max");
+
+ if (!$this->iStrMaxLen) {
+ $this->iStrMaxLen = 60;
+ $this->aMsg["警告882"] = "需要设置dog的option的str_len_max,临时设为60。";
+ }
+
+ $this->aStrField = $aStrField;
+ }
+
+ // 设置主键
+ public function _setPrimaryKey($key)
+ {
+ $this->sPrimaryKey = $key;
+ }
+
+ // 写入数据时格式化某些字段 [transfer_enable => gb]
+ public function _setInFormat($aInFormat)
+ {
+ $this->aInFormat = $aInFormat;
+ }
+
+ // 输出数据时格式化某些字段 [transfer_enable => gb]
+ public function _setOutFormat($aOutFormat)
+ {
+ $this->aOutFormat = $aOutFormat;
+ }
+
+ //// 定义系列 end
+
+ //// option 系列
+ public function option($aParam)
+ {
+
+ $aOption = ModelDogOption::_list($this->sDogName);
+
+ return $this->toJson($aOption);
+ }
+
+ public function optionAdd($aParam)
+ {
+ $k = $aParam["aOption"][1] ?? false;
+ $v = $aParam["aArg"][1] ?? 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});
+// }
+//
+// foreach ($this->aJsonField as $v) {
+// $oSelfRow->{$v} = json_decode($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)
+ {
+ $sWhereValue = $aParam['aArg'][1] ?? false;
+ $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey;
+ $sWhereFieldType = $aParam["aOption"][2] ?? "int";
+
+ if ($sWhereValue == "?") {
+ return "#clone__[whereField]__[whereFieldType(:int,str)] [whereValue]";
+// return "#clone__{keyType?int:int,str,int自增str随机} {whereValue}";
+ }
+
+ if (!$sWhereField) {
+ return "需要field";
+ }
+
+ if (!$sWhereValue) {
+ return "需要value";
+ }
+
+ // 查找文章
+ $oModelSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->first();
+
+ if (!$oModelSelf) {
+ return "没找到这个";
+ }
+
+ $oModelSelfNew = $oModelSelf->replicate();
+ if ($sWhereFieldType == "str") {
+ $oModelSelfNew->$sWhereField = $oModelSelfNew->{$sWhereField}."-clone".rand(0, 9999);
+ }
+ $oModelSelfNew->save();
+
+ $aParam = [];
+ $aParam["aOption"][1] = $sWhereField;
+ $aParam["aArg"][1] = $oModelSelfNew->$sWhereField;
+
+ 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] ?? "_all";
+ $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 === "_all" ) {
+
+ $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);
+
+ if ($sHitField) {
+ if (in_array($sHitField, $this->aStrField)) {
+ $aData = $oSelf->items()[0]->$sHitField;
+ } else {
+ $aData = $aData[0][$sHitField];
+ }
+ }
+
+ 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)
+ {
+ if ($this->aSelectField) {
+ $aDataNew = [];
+ foreach ($this->aSelectField as $sSelectField) {
+ $aDataNew[$sSelectField] = $aData[$sSelectField];
+ }
+ $aData = $aDataNew;
+ }
+
+ if ($this->aHideField) {
+ foreach ($this->aHideField as $sHideField) {
+ unset($aData[$sHideField]);
+ }
+ }
+
+ foreach ($this->aStrField as $sStrField) {
+ $aData[$sStrField] = $this->subStr($aData[$sStrField]);
+ }
+
+ foreach ($this->aJsonField as $sJsonField) {
+ $aData[$sJsonField] = json_decode($aData[$sJsonField]);
+ }
+
+ 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]);
+ } else if ($sFormatType == "gb") {
+ $aData[$sFormatField] = round($aData[$sFormatField] / 1073741824, 2)."gb";
+ }
+ }
+
+ 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 arrUnset($aParam)
+ {
+ $aParam["sCmd"] = "unset";
+ return $this->arrSet($aParam);
+ }
+
+ public function arrSet($aParam)
+ {
+ $sWhereValue = $aParam["aOption"][1] ?? '';
+ $sUpdField = $aParam["aOption"][2] ?? '';
+ $sUpdKey = $aParam["aOption"][3] ?? '';
+ $sUpdValue = $aParam["aArg"][1] ?? '';
+ $sCmd = $aParam["sCmd"] ?? 'set';
+
+ if ($sUpdValue == "?") {
+ return "#arrSet__[sWhereValue]__[sUpdField]__[?sUpdKey] [?sUpdValue]";
+ }
+
+ if (!$sWhereValue) {
+ return "需要whereValue";
+ }
+
+ if (!$sUpdField) {
+ return "需要sWhereValue";
+ }
+
+ if (!$sUpdKey) {
+// return "需要sUpdKey";
+ }
+
+ if (!$sUpdValue) {
+ if ($sCmd == "set") {
+ return "需要sUpdValue";
+ }
+ }
+
+ $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sWhereValue)->first();
+
+ if (!$oModelSelf) {
+ return "没找到";
+ }
+
+ $sArr = $oModelSelf->$sUpdField ?? "[]";
+ $aArr = json_decode($sArr, true);
+ $aArrNew = $aArr;
+
+ if ($sCmd == "set") {
+ if ($sUpdKey) {
+ $aArrNew[$sUpdKey] = $sUpdValue;
+ } else {
+ $aArrNew[] = $sUpdValue;
+ }
+ } else if ($sCmd == "unset") {
+ if (!$sUpdKey) {
+ return "需要sUpdKey";
+ }
+ if (isset($aArrNew[$sUpdKey])) {
+ unset($aArrNew[$sUpdKey]);
+ }
+ }
+
+ $sArrNew = json_encode($aArrNew);
+ $oModelSelf->$sUpdField = $sArrNew ?? "[]";
+ $r = $oModelSelf->save();
+
+ if (!$r) {
+ return "save失败?";
+ }
+
+ $a = json_decode($oModelSelf->$sUpdField);
+
+ return $this->toJson($a);
+ }
+
+ public function schemaAdd($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 = $this->inFormat($k, $v);
+ }
+
+ $this->oModelSelf->save();
+
+ $aParam = [];
+ $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey};
+
+ return $this->find($aParam);
+ }
+
+ public function schemaSet($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 schemaGet($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"));
+
+ } else if ($sValueHou == "dateNow") {
+ $sValueQian = date("Y-m-d");
+ } else if ($sValueHou == "dateTimeNow") {
+ $sValueQian = date("Y-m-d H:i:s");
+ } else if ($sValueHou == "gb") {
+ $sValueQian = $sValueQian * 1073741824;
+ }
+
+ 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/app/Services/Tg/Hook/Mod/Article.php b/app/Services/Tg/Hook/Mod/Article.php
new file mode 100644
index 0000000..f56de3b
--- /dev/null
+++ b/app/Services/Tg/Hook/Mod/Article.php
@@ -0,0 +1,43 @@
+oDog = new Dog(new ModelArticleList());
+ $this->oDog->_setDogName("ArticleList");
+// $this->oDog->_setStrField(["schema"]);
+ $this->aUpdate = $aUpdate;
+ }
+
+ public function __call($sName, $aArg)
+ {
+ return $this->oDog->$sName($aArg[0]);
+ }
+
+ public function todayDel($aParam)
+ {
+ $sArticleCode = $aParam["aArg"][1] ?? date("Ymd");
+
+ $r = ModelArticleList::where("code", $sArticleCode)->delete();
+
+ if (!$r) {
+ return "删除失败";
+ }
+
+ return "删除成功";
+ }
+
+
+}
diff --git a/app/Services/TG/Hook/Mod/Base.php b/app/Services/Tg/Hook/Mod/Base.php
similarity index 91%
rename from app/Services/TG/Hook/Mod/Base.php
rename to app/Services/Tg/Hook/Mod/Base.php
index 1caace7..c7e729f 100644
--- a/app/Services/TG/Hook/Mod/Base.php
+++ b/app/Services/Tg/Hook/Mod/Base.php
@@ -1,10 +1,10 @@
-
-
-
-
-
-
- 「1月1日」2024年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 首页
-
-
-
-
- 免费节点
-
-
-
-
-
-
2024年最新高速SSR/V2ray/Clash/Shadowrocket免费节点订阅链接
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-