diff --git a/app/Http/Controllers/Api/TG/HookController.php b/app/Http/Controllers/Api/TG/HookController.php index 797e3d6d..8368bb2e 100755 --- a/app/Http/Controllers/Api/TG/HookController.php +++ b/app/Http/Controllers/Api/TG/HookController.php @@ -50,9 +50,23 @@ final class HookController $sCmd = $this->cleanCmd($aOption[0]); - list($sClass, $sFunc) = explode("#", $sCmd); - $sClass = ucfirst($sClass); - $sFunc = ucfirst($sFunc); +// list($sClass, $sFunc) = explode("#", $sCmd); +// $sClass = ucfirst($sClass); +// $sFunc = ucfirst($sFunc); + + // 大于3个说明是hook或dove之类 + $aCmd = explode("#", $sCmd); + if (count($aCmd) >= 3) { + $sHook = $aCmd[0]; +// $sClass = $aCmd[1]; +// $sFunc = $aCmd[2]; + $sClass = $sHook; + $sFunc = "go"; +// $aUpdate["subCmd"] = "/".$aCmd[1]."#".$aCmd[2]; + } else { + $sClass = $aCmd[0]; + $sFunc = $aCmd[1]; + } unset($aOption[0]); unset($aArg[0]); @@ -64,11 +78,11 @@ final class HookController if (method_exists($sClassPath, $sFunc)) { $oInstans = new $sClassPath(); - $r = $oInstans->$sFunc($aParams); + $r = $oInstans->$sFunc($aParams, $aUpdate); // 可以不返回,里面直接send if (isset($r)) { - if (empty($r)) { $r = 'hook的mod返回空'; } +// if (empty($r)) { $r = 'hook的mod返回空'; } // 返回可以是数组 if (is_array($r)) { foreach ($r as $row) { diff --git a/app/Http/Controllers/SakaiController.php b/app/Http/Controllers/SakaiController.php index 2399bfd3..b0bdd299 100755 --- a/app/Http/Controllers/SakaiController.php +++ b/app/Http/Controllers/SakaiController.php @@ -13,7 +13,7 @@ class SakaiController { public function test1() { - tomd(123, 1); +// tomd(123, 1); @$k = $_GET["k"]; @$s = $_GET["s"]; @@ -27,7 +27,42 @@ class SakaiController //test // $s = "\/AticleSet__1115zz__sale_rate 1118.118"; // $s = "\/git#LastTime 1"; - $s= "/cmd#list"; + $s = "/hook#set site:cfn"; + $s = "/dove#now"; + $s = "/dove#set vcf"; + $s = "/dove#unsetAll"; + $s = "/doveSite#del vcf"; + $s = "/doveSite#option__cfn__www 123"; + $s = "/doveSite#limit 10"; + $s = "/doveSite#like__memo c"; + $s = "/dove#tool#list"; + $s = "/dove#tool#exec html/client"; + $s = "/dove#option#list"; + $s = "/dove#option#add zzzzxxx"; + $s = "/dove#option#option__test xxx111"; + $s = "/dove#option#del test"; + $s = "/dove#option#like__key xx"; + $s = "/dove#option#like__value cc"; + $s = "/dove#option#find jichang_ww"; + $s = "/dove#option#add freenode_title"; + $s = "/dove#tool#sql"; + $s = "/dove#database#select select * from article_list limit 1"; + $s = "/dove#database#sql ALTER TABLE test ADD COLUMN age INT"; + $s = "/dove#toolOld#list"; + $s = "/dove#toolOld#exec html/article"; + $s = "/dove#test#FreenodeCrawUrl"; + $s = "/dove#tool#freenode_up"; + $s = "/dove#tool#toptag_html"; + $s = "/dove#tool#like_auto"; + $s = "/dove#tool#Article_freenode_up_limit 10 3"; + $s = "/note#add skljdfkljsdkljf"; + $s = "/note#now"; + $s = "/note#keep 2"; + $s = "/note#main"; +// $s = "/note#set__1 告诉你啊,你就是个几把"; +// $s = "/note#memo__1 股您吗的"; +// $s = "/note#icon"; + $s = "/note#add__now 脱裤子 112"; $oHttp = new Http(); $oHttp->sMethod = "post"; @@ -59,7 +94,8 @@ class SakaiController $r = $oHttp->send(); - var_dump($r); + echo "
";
+        echo($r);
 
         exit;
     }
diff --git a/app/Models/ArticleList.php b/app/Models/ArticleList.php
deleted file mode 100755
index 23de2634..00000000
--- a/app/Models/ArticleList.php
+++ /dev/null
@@ -1,10 +0,0 @@
-get()->toArray();
-        
-        foreach ($aArticleList as &$row) { // 使用引用来修改原数组
-            unset($row['updated_at']); // 移除 updated_at 字段
-            unset($row['created_at']); // 移除 created_at 字段
-            $this->oTGHttp->sendToTG(json_encode($row, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        }
-        
-        $this->oHttp::response(200, 'ok');
-    }
-    
-    public function Find($aParam)
-    {
-        $iId = $aParam['aArg'][1];
-        
-        $aSingle = ModelArticle::find($iId)->toArray();
-        
-        unset($aSingle['updated_at']);
-        unset($aSingle['created_at']);
-        
-        return json_encode($aSingle, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
-    }
-
-    
-    public function Like($aParams)
-    {
-        $aArticleList = ModelArticle::where($this->cmdGood($aParams['aOption'][1]), 'like', '%' . $aParams['aArg'][1] . '%')
-            ->orderBy("user_name")
-            ->get()
-            ->toArray();
-
-        if (empty($aArticleList)) {
-            $this->oTGHttp->sendToTG("没有");
-        } else {
-            foreach ($aArticleList as &$row) { // 使用引用来修改原数组
-                unset($row['updated_at']); // 移除 updated_at 字段
-                unset($row['created_at']); // 移除 created_at 字段
-                $this->oTGHttp->sendToTG(json_encode($row, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-            }
-        }
-
-        $this->oHttp::response(200, 'ok');
-    }
-    
-    public function Clone($aParam)
-    {
-        $iId = $aParam['aArg'][1];
-        
-        // 查找文章
-        $aArticle = ModelArticle::find($iId);
-        
-        if ($aArticle) {
-            // 复制文章
-            $newArticle = $aArticle->replicate();
-            
-            // 如果需要,可以修改新文章的某些字段,例如标题或状态
-//            $newArticle->title = $newArticle->title . ' - Copy'; // 修改标题
-            // $newArticle->status = 'draft'; // 例如,将状态设置为草稿
-            
-            // 保存新文章
-            $newArticle->save();
-            
-            // 发送新文章的 ID 到 Telegram
-            $sMsg = "新文章已创建,ID: " . $newArticle->id;
-            $this->oTGHttp->sendToTG($sMsg);
-            
-            // 返回 HTTP 响应
-            $this->oHttp::response(200, 'ok');
-        } else {
-            throw new \Exception("没有这个id");
-        }
-    }
-    
-    public function Add($aParams)
-    {
-        
-        $newArticle = new ModelArticle();
-        $newArticle->user_name = $aParams['aArg'][1];
-        $r = $newArticle->save();
-        
-        $this->oTGHttp->sendToTG(json_encode($r, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-    public function Del($aParams)
-    {
-        
-        $article = ModelArticle::find($aParams['aArg'][1]);
-
-        if ($article) {
-            $r = $article->delete();
-        } else {
-            $r = false;
-        }
-        
-        $this->oTGHttp->sendToTG(json_encode($r, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-    // /ArticleSet__id__user_name xxx
-    public function Set($aParams)
-    {
-        $sField = $this->cmdGood($aParams['aOption'][2]);
-
-        $article = ModelArticle::find($aParams['aOption'][1]);
-        
-        $sSet = $aParams['aArg'][1];
-
-        if ($article) {
-            $article->$sField = $sSet;
-
-            $r = $article->save();
-        } else {
-            // 处理未找到的情况
-            throw new \Exception("Article not found");
-        }
-
-        $this->oTGHttp->sendToTG(json_encode($r, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-    }
-    
-}
diff --git a/app/Services/TG/Hook/Mod/Base.php b/app/Services/TG/Hook/Mod/Base.php
index 6aede038..d0737152 100644
--- a/app/Services/TG/Hook/Mod/Base.php
+++ b/app/Services/TG/Hook/Mod/Base.php
@@ -15,29 +15,43 @@ class Base {
 //        $this->oTGHttp->sApiChatId = env("telegram_chatid");
     }
     
-    protected function cmdGood($sCmd) {
-        
-        $sCmdNew = "";
-        switch ($sCmd) {
-            case "user":
-                $sCmdNew = "user_name";
-                break;
-            case "project":
-                $sCmdNew = "project_name";
-                break;
-            case "code":
-                $sCmdNew = "sale_code";
-                break;
-            case "condition":
-                $sCmdNew = "cron_condition";
-                break;
-            default:
-                $sCmdNew = $sCmd;
-                break;
-        }
-        
-        return $sCmdNew;
-        
+    public function toJson($aData)
+    {
+        return json_encode($aData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
     }
     
+    public function eachSendTg($aData)
+    {
+        foreach ($aData as $row) {
+            $this->oTGHttp->sendToTG(json_encode($row, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
+        }
+        
+        $this->oHttp::response(200, 'ok');
+    }
+    
+//    protected function cmdGood($sCmd) {
+//        
+//        $sCmdNew = "";
+//        switch ($sCmd) {
+//            case "user":
+//                $sCmdNew = "user_name";
+//                break;
+//            case "project":
+//                $sCmdNew = "project_name";
+//                break;
+//            case "code":
+//                $sCmdNew = "sale_code";
+//                break;
+//            case "condition":
+//                $sCmdNew = "cron_condition";
+//                break;
+//            default:
+//                $sCmdNew = $sCmd;
+//                break;
+//        }
+//        
+//        return $sCmdNew;
+//        
+//    }
+    
 }
diff --git a/app/Services/TG/Hook/Mod/Cmd.php b/app/Services/TG/Hook/Mod/Cmd.php
deleted file mode 100644
index 70c861de..00000000
--- a/app/Services/TG/Hook/Mod/Cmd.php
+++ /dev/null
@@ -1,34 +0,0 @@
- 'SaleCode#List',
-            '优惠码find'  => 'SaleCode#Find xxhh',
-            '优惠码rate'  => 'SaleCode#SetRate__xxzz 6.7',
-            '文章list'  => 'Article#List',
-            '文章like'  => 'Article#Like__field like',
-            '文章add'  => 'Article#Add__name',
-            '文章del'  => 'Article#Del__id',
-            '文章set'  => 'Article#Set__id__fild set',
-//            '添加github的sshhost' => "System#AddSshHostGithub",
-            '文章clone' => "article#clone id",
-            'git手动重置' => "git#pullR",
-            '文章find' => "article#find id",
-            'cron暂停' => "option#pause 1",
-            '测试cron' => "test#cron_i 01",
-        ];
-        
-        $this->oTGHttp->sendToTG(json_encode($aCmdList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-}
diff --git a/app/Services/TG/Hook/Mod/Dove.php b/app/Services/TG/Hook/Mod/Dove.php
new file mode 100644
index 00000000..98f9e0bb
--- /dev/null
+++ b/app/Services/TG/Hook/Mod/Dove.php
@@ -0,0 +1,91 @@
+get();
+        
+        list(, $sSubCmd) = explode("#", $aData['message']['text'], 2);
+        $aData['message']['text'] = "/".$sSubCmd;
+        
+        $aData['dove_token'] = env('dove_token');
+        
+        foreach ($oDoveSiteCheckedList as $row) {
+            
+            $sApiUrl = "https://".$row->www.$row->api_path;
+            
+            $this->oHttp->sMethod = "post";
+            $this->oHttp->bIsJson = true;
+            $this->oHttp->sToUrl = $sApiUrl;
+            $this->oHttp->aData = $aData;
+            $r = $this->oHttp->send();
+            return $r;
+            
+        }
+        
+    }
+    
+    public function set($aParam)
+    {
+        $iSetValue = $aParam['iSetValue'] ?? 1;
+        $sCode = $aParam['aArg'][1];
+        
+        $oDoveSite = ModelDoveSite::where("code", $sCode)->first();
+
+        if (!$oDoveSite) {
+            throw new \Exception("没有这个code");
+        }
+        
+        $oDoveSite->dove_checked = $iSetValue;
+        
+        $r = $oDoveSite->save();
+        
+        if (!$r) {
+            throw new \Exception("没check上?");
+        }
+        
+        $r = $this->now();
+        
+        return $r;
+    }
+    
+    public function unsetAll()
+    {
+        
+        $r = ModelDoveSite::query()->update(["dove_checked" => 0]);
+        
+        return $r;
+    }
+    
+    public function unset($aParam)
+    {
+        $aParam['iSetValue'] = 0;
+        $r = $this->set($aParam);
+        
+        return $r;
+    }
+    
+    public function now()
+    {
+        $aDoveSiteNow = ModelDoveSite::where("dove_checked", 1)->get()->toArray();
+        
+        if ($aDoveSiteNow) {
+            $r = "";
+            foreach ($aDoveSiteNow as $row) {
+                $r .= "\n";
+                $r .= $row['code']."::".$row['www']."::".$row['class'];
+            }
+        } else {
+            $r = "没有";
+        }
+        
+        return $r;
+    }
+    
+}
diff --git a/app/Services/TG/Hook/Mod/DoveSite.php b/app/Services/TG/Hook/Mod/DoveSite.php
new file mode 100644
index 00000000..27dcd98a
--- /dev/null
+++ b/app/Services/TG/Hook/Mod/DoveSite.php
@@ -0,0 +1,67 @@
+code = $sCode;
+        $r = $oDoveSite->save();
+        
+        return $r;
+    }
+    
+    public function del($aParam)
+    {
+        $sCode = $aParam['aArg'][1];
+        
+        $r = ModelDoveSite::where("code", $sCode)->delete();
+        
+        return $r;
+    }
+    
+    public function limit($aParam)
+    {
+        $iLimit = $aParam['aArg'][1];
+        
+        $oDoveSite = ModelDoveSite::orderBy("code")->limit($iLimit)->get();
+        
+        $this->eachSendTg($oDoveSite);
+    }
+    
+    public function like($aParam)
+    {
+        $sField = $aParam['aOption'][1];
+        $sValue = $aParam['aArg'][1];
+        
+        $oDoveSiteLike = ModelDoveSite::where($sField, "like", "%".$sValue."%")->get();
+        
+        $this->eachSendTg($oDoveSiteLike);
+        
+    }
+    
+    public function option($aParam)
+    {
+        $sCode = $aParam['aOption'][1];
+        $sField = $aParam['aOption'][2];
+        $sValue = $aParam['aArg'][1];
+        
+        $oDoveSite = ModelDoveSite::where("code", $sCode)->first();
+        
+        if (!$oDoveSite) {
+            throw new \Exception("没有这个code");
+        }
+        
+        $oDoveSite->$sField = $sValue;
+        $r = $oDoveSite->save();
+        
+        return $r;
+    }
+    
+}
diff --git a/app/Services/TG/Hook/Mod/Git.php b/app/Services/TG/Hook/Mod/Git.php
deleted file mode 100644
index 8f9fb47e..00000000
--- a/app/Services/TG/Hook/Mod/Git.php
+++ /dev/null
@@ -1,128 +0,0 @@
-get()->toArray();
-        
-        $sMsg = '';
-        foreach ($aArticleList as $v) {
-            $sMsg .= "\n\n";
-            $sMsg .= "https://github.com/".$v['user_name']."/".$v['project_name'];
-        }
-        
-        return $sMsg;
-        
-    }
-    
-    public function LastTime($aParam)
-    {
-        $iId = $aParam['aArg'][1];
-        
-        $aArticle = ModelArticle::find($iId);
-        
-        $sProjectPath = env("BASE_DIR") . "github/" . $aArticle->user_name . "-" . $aArticle->project_name;
-        
-        // 进入指定目录
-        if (!chdir($sProjectPath)) {
-            throw new \Exception("无法进入目录" . $sProjectPath);
-        }
-
-        // 获取远程更新
-        $this->runCommand('git fetch origin');
-
-        // 获取最后提交的时间
-        $lastCommitTime = $this->runCommand('git log origin/main -1 --format=%cd');
-        $lastCommitTime = \DateTime::createFromFormat('D M d H:i:s Y O', $lastCommitTime[0]);
-        $lastCommitTime = json_encode($lastCommitTime->format('Y-m-d H:i:s'));
-
-        // 检查是否获取到时间
-        if (empty($lastCommitTime)) {
-            throw new \Exception("无法获取最后提交时间,可能是分支不存在或没有提交。");
-        }
-
-        return $lastCommitTime;
-        
-    }
-    
-    // 没用
-    public function AddSshHostGithub()
-    {
-
-        // 定义要添加的主机
-        $host = 'github.com';
-
-        // 执行 ssh-keyscan 命令
-        $key = shell_exec("ssh-keyscan -t ed25519 $host");
-
-        // 检查是否成功获取到公钥
-        if ($key) {
-            // 获取 known_hosts 文件的路径
-            $knownHostsFile = '/root/.ssh/known_hosts';
-
-            // 检查 known_hosts 文件中是否已经存在该主机的公钥
-            if (strpos(file_get_contents($knownHostsFile), $host) === false) {
-                // 将公钥写入 known_hosts 文件
-                file_put_contents($knownHostsFile, $key, FILE_APPEND);
-                $sMsg = "公钥已成功添加到 $knownHostsFile\n";
-            } else {
-                $sMsg = "公钥已存在于 $knownHostsFile\n";
-            }
-        } else {
-            $sMsg = "无法获取 $host 的公钥\n";
-        }
-        
-        $this->oTGHttp->sendToTG($sMsg);
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-    // /Git#PullR 3
-    public function PullR($aParam)
-    {
-        
-        $iId = $aParam['aArg'][1];
-        
-        $aArticle = ModelArticle::find($iId);
-        
-        $sProjectPath = env("BASE_DIR")."github/".$aArticle->user_name."-".$aArticle->project_name;
-        
-        // 进入指定目录
-        if (!chdir($sProjectPath)) {
-            throw new \Exception("无法进入目录".$sProjectPath);
-        }
-
-        // 获取远程更新
-        $this->runCommand('git fetch origin');
-
-        // 硬重置到远程主分支
-        $this->runCommand('git reset --hard origin/main');
-        
-        $this->oTGHttp->sendToTG("操作完成:已重置到远程主分支");
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-    private function runCommand($command) {
-        $output = [];
-        $returnVar = 0;
-        exec($command, $output, $returnVar);
-        
-        if ($returnVar !== 0) {
-            $jsonOutput = json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
-            $errorMessage = "命令失败: $command\n" . $jsonOutput . "\n";
-            
-            throw new \Exception($errorMessage);
-        } else {
-            return $output;
-        }
-        
-    }
-    
-}
diff --git a/app/Services/TG/Hook/Mod/Hook.php b/app/Services/TG/Hook/Mod/Hook.php
new file mode 100644
index 00000000..ea0cf9e2
--- /dev/null
+++ b/app/Services/TG/Hook/Mod/Hook.php
@@ -0,0 +1,84 @@
+delete();
+        
+        // 添加
+        $oHook = new ModelHook();
+        $oHook->tg_user_id = $iFromId;
+        $oHook->key = $sKey;
+        $oHook->steap = 1;
+        $r = $oHook->save();
+        
+        if ($r) {
+            
+            $aKey = explode(":", $sKey, 2);
+            
+            // site类hook处理
+            if ($aKey[0] === "site") {
+                
+//                $sSite = $aKey[0];
+                $sCode = $aKey[1];
+                
+                $oSiteSingle = ModelSiteList::where("code", $sCode)->first();
+                
+                if ($oSiteSingle) {
+                    $r = "site::".$oSiteSingle->code."@".$oSiteSingle->www." | 就绪!";
+                } else {
+                    $r = "没有这个site!";
+                }
+                
+            }
+            
+        }
+        
+        return $r;
+        
+    }
+    
+    public function go($aParam, $aData)
+    {
+//        $aApiUrl = 
+    }
+    
+    public function now($aParam, $aData)
+    {
+        $iFromId = $aData["message"]["from"]["id"];
+        
+        $oHookNow = ModelHook::where("tg_user_id", $iFromId)->first();
+        
+        if ($oHookNow) {
+            $aHookNow = $oHookNow->toArray();
+            unset($aHookNow['id']);
+            unset($aHookNow['tg_user_id']);
+            $r = $this->toJson($aHookNow);
+        } else {
+            $r = "没有!";
+        }
+        
+        return $r;
+        
+    }
+    
+    public function break($aParam, $aData)
+    {
+        $iFromId = $aData["message"]["from"]["id"];
+        
+        $r = ModelHook::where("tg_user_id", $iFromId)->delete();
+        
+        return $r;
+    }
+    
+}
diff --git a/app/Services/TG/Hook/Mod/Note.php b/app/Services/TG/Hook/Mod/Note.php
new file mode 100644
index 00000000..e87d2c52
--- /dev/null
+++ b/app/Services/TG/Hook/Mod/Note.php
@@ -0,0 +1,231 @@
+content = $sValue;
+        $oModelNote->save();
+        
+        $aParam["aArg"][1] = $iId;
+        $aData = $this->Find($aParam);
+        
+        return $aData;
+    }
+    
+    public function Memo($aParam)
+    {
+        $iId = $aParam["aOption"][1];
+        $sValue = $aParam["aArg"][1];
+        
+        $oModelNote = ModelNote::find($iId);
+        $oModelNote->memo = $sValue;
+        $oModelNote->save();
+        
+        $aParam["aArg"][1] = $iId;
+        $aData = $this->Find($aParam);
+        
+        return $aData;
+    }
+    
+    public function Find($aParam)
+    {
+        $iId = $aParam["aArg"][1];
+        
+        $oNote = ModelNote::find($iId)->first();
+        
+        $r = $this->noteToStr([$oNote]);
+        
+        return $r;
+    }
+    
+    public function Add($aParam)
+    {
+        $sType = $aParam["aOption"][1] ?? "under";
+        $sContent = $aParam["aArg"][1];
+        $iScore = $aParam["aArg"][2] ?? 0;
+        
+        if (!isset($this->arrTypeIcon()[$sType])) {
+            return "没有这个type";
+        }
+        
+        $oNote = new ModelNote();
+        $oNote->content = $sContent;
+        $oNote->type = $sType;
+        $oNote->score = $iScore;
+        $r = $oNote->save();
+        
+        $aParam["aArg"][1] = $oNote->id;
+        return $this->magic($aParam, $sType);
+    }
+    
+    public function Main($aParam)
+    {
+        
+        $oWarning = ModelNote::where("type", "warning")->get();
+        $oMark = ModelNote::where("type", "mark")->get();
+        $oNow = ModelNote::where("type", "now")->get();
+        $oTrack = ModelNote::where("type", "track")->get();
+        $oKeep = ModelNote::where("type", "keep")->get();
+        
+        $sWarning = $this->noteToStr($oWarning, "\n");
+        $sMark = $this->noteToStr($oMark, "\n");
+        $sNow = $this->noteToStr($oNow, "\n");
+        $sTrack = $this->noteToStr($oTrack, "\n");
+        $sKeep = $this->noteToStr($oKeep, "\n");
+        
+        $str = $sWarning."\n".$sMark."\n".$sNow."\n".$sTrack."\n".$sKeep;
+        
+        return $str;
+        
+    }
+    
+    public function Now($aParam)
+    {
+        return $this->magic($aParam, "now");
+    }
+    
+    public function Keep($aParam)
+    {
+        return $this->magic($aParam, "keep");
+    }
+    
+    public function wait($aParam)
+    {
+        return $this->magic($aParam, "wait");
+    }
+    
+    public function under($aParam)
+    {
+        return $this->magic($aParam, "under");
+    }
+    
+    public function del($aParam)
+    {
+        return $this->magic($aParam, "del");
+    }
+    
+    public function done($aParam)
+    {
+        return $this->magic($aParam, "done");
+    }
+    
+    public function mark($aParam)
+    {
+        return $this->magic($aParam, "mark");
+    }
+    
+    public function track($aParam)
+    {
+        return $this->magic($aParam, "track");
+    }
+    
+    public function warning($aParam)
+    {
+        return $this->magic($aParam, "warning");
+    }
+    
+    public function tip($aParam)
+    {
+        return $this->magic($aParam, "tip");
+    }
+    
+    public function icon()
+    {
+        return $this->toJson($this->arrTypeIcon());
+    }
+    
+    private function magic($aParam, $sNoteType)
+    {
+        $iId = $aParam["aArg"][1] ?? false;
+        
+        if ($iId) {
+            $oNote = ModelNote::find($iId);
+            $oNote->type = $sNoteType;
+            $oNote->save();
+            
+            $oNote = ModelNote::where("type", $sNoteType)->get();
+            $r = $this->noteToStr($oNote);
+        } else {
+            $oNote = ModelNote::where("type", $sNoteType)->get();
+            $r = $this->noteToStr($oNote);
+        }
+     
+        return $r;
+    }
+    
+    private function noteToStr($oNote, $sBr = "\n\n")
+    {
+        $str = "";
+        
+        foreach ($oNote as $row) {
+            $sIcon = $this->mapTypeIcon($row->type);
+            $str .= $sBr;
+            $str .= $sIcon."::".$row->id."::".$row->content;
+            if ($row->memo) {
+                $str .= "::".$row->memo;
+            }
+        }
+        
+        return $str;
+    }
+    
+    private function arrTypeIcon()
+    {
+        $aMap = [
+            "warning"   => "🟥",
+            "now"   => "🟩",
+            "wait"  => "🟧",
+            "under" => "⚪️",
+            "keep"  => "⬛️",
+            "del"   => "❌",
+            "track" => "🟫",
+            "mark"  => "🟪",
+            "done"  => "✅",
+            "tip"   => "💡",
+        ];
+        
+        return $aMap;
+    }
+    
+    private function mapTypeIcon($sType)
+    {
+//        $aMap = [
+//            "warning"   => "⚠️",
+//            "now"   => "🎸",
+//            "wait"  => "🚦",
+//            "under" => "⚪️",
+//            "keep"  => "📌",
+//            "del"   => "❌",
+//            "track" => "🌀",
+//            "mark"  => "⭐️",
+//            "done"  => "✅",
+//            "tip"   => "💡",
+//        ];
+        
+        $aMap = $this->arrTypeIcon();
+        
+        if (isset($aMap[$sType])) {
+            $sIcon = $aMap[$sType];
+        } else {
+            $sIcon = "::";
+        }
+        
+        return $sIcon;
+        
+    }
+    
+}
diff --git a/app/Services/TG/Hook/Mod/Option.php b/app/Services/TG/Hook/Mod/Option.php
deleted file mode 100644
index 66294176..00000000
--- a/app/Services/TG/Hook/Mod/Option.php
+++ /dev/null
@@ -1,34 +0,0 @@
-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/app/Services/TG/Hook/Mod/SaleCode.php b/app/Services/TG/Hook/Mod/SaleCode.php
deleted file mode 100644
index a638ae85..00000000
--- a/app/Services/TG/Hook/Mod/SaleCode.php
+++ /dev/null
@@ -1,48 +0,0 @@
-update(['sale_rate' => $aParams['aArg'][1]]);
-
-        $this->oTGHttp->sendToTG(json_encode($updatedRows, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-    public function List()
-    {
-        $aSaleCodeList = ModelArticle::select('sale_code', 'sale_rate')
-            ->distinct()
-            ->orderBy("sale_code")
-            ->get()
-            ->toArray();
-        
-        $this->oTGHttp->sendToTG(json_encode($aSaleCodeList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-    }
-    
-    public function Find($aParams)
-    {
-        
-        $aSaleCodeList = ModelArticle::select('sale_code', 'sale_rate')
-            ->where("sale_code", $aParams['aArg'][1])
-            ->distinct()
-            ->orderBy("sale_code")
-            ->get()
-            ->toArray();
-        
-        $this->oTGHttp->sendToTG(json_encode($aSaleCodeList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
-        
-        $this->oHttp::response(200, 'ok');
-        
-    }
-    
-}
diff --git a/app/Services/TG/Hook/Mod/Test.php b/app/Services/TG/Hook/Mod/Test.php
deleted file mode 100644
index aa953ab8..00000000
--- a/app/Services/TG/Hook/Mod/Test.php
+++ /dev/null
@@ -1,28 +0,0 @@
-oHttp->sMethod = "get";
-        $this->oHttp->sToUrl = env("APP_URL")."/cron";
-        $this->oHttp->bIsJson = true;
-        $this->oHttp->aData = [
-            "is_test" => true,
-            "time_type"  => $sTimeType,
-            "v" => $sValue
-        ];
-
-        $r = $this->oHttp->send();
-        
-        return $r;
-        
-    }
-    
-}