浏览代码

feat: /history 默认过滤已完成和已取消状态,/history all 显示全部

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
kotoyuuko 1 月之前
父节点
当前提交
65066e5b35
共有 2 个文件被更改,包括 16 次插入19 次删除
  1. 0 10
      package-lock.json
  2. 16 9
      src/command/handlers/history.ts

+ 0 - 10
package-lock.json

@@ -551,7 +551,6 @@
 			"integrity": "sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"defu": "^6.1.4",
 				"exsolve": "^1.0.7",
@@ -2175,7 +2174,6 @@
 			"integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"@vitest/utils": "3.2.4",
 				"pathe": "^2.0.3",
@@ -2191,7 +2189,6 @@
 			"integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"@vitest/pretty-format": "3.2.4",
 				"magic-string": "^0.30.17",
@@ -2598,7 +2595,6 @@
 			"resolved": "https://registry.npmjs.org/grammy/-/grammy-1.39.3.tgz",
 			"integrity": "sha512-7arRRoOtOh9UwMwANZ475kJrWV6P3/EGNooeHlY0/SwZv4t3ZZ3Uiz9cAXK8Zg9xSdgmm8T21kx6n7SZaWvOcw==",
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"@grammyjs/types": "3.23.0",
 				"abort-controller": "^3.0.0",
@@ -2789,7 +2785,6 @@
 			"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"engines": {
 				"node": ">=12"
 			},
@@ -3114,7 +3109,6 @@
 			"integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"pathe": "^2.0.3"
 			}
@@ -3125,7 +3119,6 @@
 			"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"esbuild": "^0.27.0",
 				"fdir": "^6.5.0",
@@ -3224,7 +3217,6 @@
 			"integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
 			"dev": true,
 			"license": "MIT",
-			"peer": true,
 			"dependencies": {
 				"@types/chai": "^5.2.2",
 				"@vitest/expect": "3.2.4",
@@ -3332,7 +3324,6 @@
 			"dev": true,
 			"hasInstallScript": true,
 			"license": "Apache-2.0",
-			"peer": true,
 			"bin": {
 				"workerd": "bin/workerd"
 			},
@@ -4431,7 +4422,6 @@
 			"dev": true,
 			"hasInstallScript": true,
 			"license": "Apache-2.0",
-			"peer": true,
 			"bin": {
 				"workerd": "bin/workerd"
 			},

+ 16 - 9
src/command/handlers/history.ts

@@ -10,6 +10,9 @@ export async function handleHistoryCommand(ctx: Context, env: any) {
       return;
     }
 
+    // Check if "all" argument is provided
+    const showAll = ctx.match?.trim() === 'all';
+
     // Retrieve stored credentials for this user
     const credentials = await env.COSMOE_CREDENTIALS.get(userId.toString());
     if (!credentials) {
@@ -18,11 +21,11 @@ export async function handleHistoryCommand(ctx: Context, env: any) {
     }
 
     const credentialsObj = JSON.parse(credentials);
-    
+
     // Initialize Cosmoe client and set stored credentials
     const cosmoeClient = new CosmoeClient();
     cosmoeClient.setCredentials(credentialsObj.user_id, credentialsObj.token);
-    
+
     if (!cosmoeClient.isAuthenticated()) {
       await ctx.reply("无效的凭证,请尝试使用 /login 命令重新登录");
       return;
@@ -30,26 +33,30 @@ export async function handleHistoryCommand(ctx: Context, env: any) {
 
     // Get booking history
     const bookingsResult = await cosmoeClient.getMyBookings();
-    
+
     if (bookingsResult.code !== 200 || !bookingsResult.data) {
       await ctx.reply("获取预约记录失败");
       return;
     }
 
-    const bookings = bookingsResult.data;
+    // Filter out completed and cancelled bookings unless "all" is specified
+    let bookings = bookingsResult.data;
+    if (!showAll) {
+      bookings = bookings.filter((b: any) => b.status !== '已完成' && b.status !== '已取消');
+    }
 
     if (bookings.length === 0) {
-      await ctx.reply("你的预约记录为空");
+      await ctx.reply(showAll ? "你的预约记录为空" : "没有进行中的预约记录,使用 /history all 查看全部");
       return;
     }
 
     // Format and send booking history
-    let historyMessage = `*预约记录*\n\n`;
-    
-    // Sort bookings by booking_date in descending order (most recent first) and take only the latest 10
+    let historyMessage = showAll ? `*预约记录(全部)*\n\n` : `*预约记录*\n\n`;
+
+    // Sort bookings by booking_date in descending order (most recent first)
     const sortedBookings = [...bookings]
       .sort((a, b) => new Date(b.booking_date).getTime() - new Date(a.booking_date).getTime())
-      .slice(0, 8);
+      .slice(0, showAll ? 50 : 8);
 
     for (let i = 0; i < sortedBookings.length; i++) {
       const booking = sortedBookings[i];