Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8e9b442a8 | |||
| 4945db86c0 | |||
| b74e0a0f3e | |||
| 5f4405c9ee |
@@ -8,10 +8,10 @@
|
||||
"@google/genai": "^1.38.0",
|
||||
"@libsql/client": "^0.17.0",
|
||||
"@mistralai/mistralai": "^1.13.0",
|
||||
"@napi-rs/canvas": "^0.1.88",
|
||||
"@napi-rs/canvas": "^0.1.89",
|
||||
"axios": "^1.13.4",
|
||||
"dotenv": "^17.2.3",
|
||||
"drizzle-orm": "^1.0.0-beta.9-e89174b",
|
||||
"drizzle-orm": "^1.0.0-beta.12-5845444",
|
||||
"emoji-regex": "^10.6.0",
|
||||
"ollama": "^0.6.3",
|
||||
"qrcode": "^1.5.4",
|
||||
@@ -22,11 +22,11 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "^1.3.7",
|
||||
"@types/node": "^25.0.10",
|
||||
"@types/node": "^25.1.0",
|
||||
"@types/qrcode": "^1.5.6",
|
||||
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
||||
"@typescript-eslint/parser": "^8.54.0",
|
||||
"drizzle-kit": "^1.0.0-beta.9-e89174b",
|
||||
"drizzle-kit": "^1.0.0-beta.12-5845444",
|
||||
"eslint": "^9.39.2",
|
||||
"tsx": "^4.21.0",
|
||||
"typescript": "^5.9.3",
|
||||
@@ -236,29 +236,29 @@
|
||||
|
||||
"@mistralai/mistralai": ["@mistralai/mistralai@1.13.0", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0", "zod-to-json-schema": "^3.24.1" } }, "sha512-eg7/8hQp91SshYDJ5XdWDsJENdIaSu52npJfKLCPuhla8Vm6GlESv2RROQyxESglCl7b1OULWiAv1ERbsrZO7w=="],
|
||||
|
||||
"@napi-rs/canvas": ["@napi-rs/canvas@0.1.88", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "0.1.88", "@napi-rs/canvas-darwin-arm64": "0.1.88", "@napi-rs/canvas-darwin-x64": "0.1.88", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.88", "@napi-rs/canvas-linux-arm64-gnu": "0.1.88", "@napi-rs/canvas-linux-arm64-musl": "0.1.88", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.88", "@napi-rs/canvas-linux-x64-gnu": "0.1.88", "@napi-rs/canvas-linux-x64-musl": "0.1.88", "@napi-rs/canvas-win32-arm64-msvc": "0.1.88", "@napi-rs/canvas-win32-x64-msvc": "0.1.88" } }, "sha512-/p08f93LEbsL5mDZFQ3DBxcPv/I4QG9EDYRRq1WNlCOXVfAHBTHMSVMwxlqG/AtnSfUr9+vgfN7MKiyDo0+Weg=="],
|
||||
"@napi-rs/canvas": ["@napi-rs/canvas@0.1.89", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "0.1.89", "@napi-rs/canvas-darwin-arm64": "0.1.89", "@napi-rs/canvas-darwin-x64": "0.1.89", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.89", "@napi-rs/canvas-linux-arm64-gnu": "0.1.89", "@napi-rs/canvas-linux-arm64-musl": "0.1.89", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.89", "@napi-rs/canvas-linux-x64-gnu": "0.1.89", "@napi-rs/canvas-linux-x64-musl": "0.1.89", "@napi-rs/canvas-win32-arm64-msvc": "0.1.89", "@napi-rs/canvas-win32-x64-msvc": "0.1.89" } }, "sha512-7GjmkMirJHejeALCqUnZY3QwID7bbumOiLrqq2LKgxrdjdmxWQBTc6rcASa2u8wuWrH7qo4/4n/VNrOwCoKlKg=="],
|
||||
|
||||
"@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@0.1.88", "", { "os": "android", "cpu": "arm64" }, "sha512-KEaClPnZuVxJ8smUWjV1wWFkByBO/D+vy4lN+Dm5DFH514oqwukxKGeck9xcKJhaWJGjfruGmYGiwRe//+/zQQ=="],
|
||||
"@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@0.1.89", "", { "os": "android", "cpu": "arm64" }, "sha512-CXxQTXsjtQqKGENS8Ejv9pZOFJhOPIl2goenS+aU8dY4DygvkyagDhy/I07D1YLqrDtPvLEX5zZHt8qUdnuIpQ=="],
|
||||
|
||||
"@napi-rs/canvas-darwin-arm64": ["@napi-rs/canvas-darwin-arm64@0.1.88", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Xgywz0dDxOKSgx3eZnK85WgGMmGrQEW7ZLA/E7raZdlEE+xXCozobgqz2ZvYigpB6DJFYkqnwHjqCOTSDGlFdg=="],
|
||||
"@napi-rs/canvas-darwin-arm64": ["@napi-rs/canvas-darwin-arm64@0.1.89", "", { "os": "darwin", "cpu": "arm64" }, "sha512-k29cR/Zl20WLYM7M8YePevRu2VQRaKcRedYr1V/8FFHkyIQ8kShEV+MPoPGi+znvmd17Eqjy2Pk2F2kpM2umVg=="],
|
||||
|
||||
"@napi-rs/canvas-darwin-x64": ["@napi-rs/canvas-darwin-x64@0.1.88", "", { "os": "darwin", "cpu": "x64" }, "sha512-Yz4wSCIQOUgNucgk+8NFtQxQxZV5NO8VKRl9ePKE6XoNyNVC8JDqtvhh3b3TPqKK8W5p2EQpAr1rjjm0mfBxdg=="],
|
||||
"@napi-rs/canvas-darwin-x64": ["@napi-rs/canvas-darwin-x64@0.1.89", "", { "os": "darwin", "cpu": "x64" }, "sha512-iUragqhBrA5FqU13pkhYBDbUD1WEAIlT8R2+fj6xHICY2nemzwMUI8OENDhRh7zuL06YDcRwENbjAVxOmaX9jg=="],
|
||||
|
||||
"@napi-rs/canvas-linux-arm-gnueabihf": ["@napi-rs/canvas-linux-arm-gnueabihf@0.1.88", "", { "os": "linux", "cpu": "arm" }, "sha512-9gQM2SlTo76hYhxHi2XxWTAqpTOb+JtxMPEIr+H5nAhHhyEtNmTSDRtz93SP7mGd2G3Ojf2oF5tP9OdgtgXyKg=="],
|
||||
"@napi-rs/canvas-linux-arm-gnueabihf": ["@napi-rs/canvas-linux-arm-gnueabihf@0.1.89", "", { "os": "linux", "cpu": "arm" }, "sha512-y3SM9sfDWasY58ftoaI09YBFm35Ig8tosZqgahLJ2WGqawCusGNPV9P0/4PsrLOCZqGg629WxexQMY25n7zcvA=="],
|
||||
|
||||
"@napi-rs/canvas-linux-arm64-gnu": ["@napi-rs/canvas-linux-arm64-gnu@0.1.88", "", { "os": "linux", "cpu": "arm64" }, "sha512-7qgaOBMXuVRk9Fzztzr3BchQKXDxGbY+nwsovD3I/Sx81e+sX0ReEDYHTItNb0Je4NHbAl7D0MKyd4SvUc04sg=="],
|
||||
"@napi-rs/canvas-linux-arm64-gnu": ["@napi-rs/canvas-linux-arm64-gnu@0.1.89", "", { "os": "linux", "cpu": "arm64" }, "sha512-NEoF9y8xq5fX8HG8aZunBom1ILdTwt7ayBzSBIwrmitk7snj4W6Fz/yN/ZOmlM1iyzHDNX5Xn0n+VgWCF8BEdA=="],
|
||||
|
||||
"@napi-rs/canvas-linux-arm64-musl": ["@napi-rs/canvas-linux-arm64-musl@0.1.88", "", { "os": "linux", "cpu": "arm64" }, "sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA=="],
|
||||
"@napi-rs/canvas-linux-arm64-musl": ["@napi-rs/canvas-linux-arm64-musl@0.1.89", "", { "os": "linux", "cpu": "arm64" }, "sha512-UQQkIEzV12/l60j1ziMjZ+mtodICNUbrd205uAhbyTw0t60CrC/EsKb5/aJWGq1wM0agvcgZV72JJCKfLS6+4w=="],
|
||||
|
||||
"@napi-rs/canvas-linux-riscv64-gnu": ["@napi-rs/canvas-linux-riscv64-gnu@0.1.88", "", { "os": "linux", "cpu": "none" }, "sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw=="],
|
||||
"@napi-rs/canvas-linux-riscv64-gnu": ["@napi-rs/canvas-linux-riscv64-gnu@0.1.89", "", { "os": "linux", "cpu": "none" }, "sha512-1/VmEoFaIO6ONeeEMGoWF17wOYZOl5hxDC1ios2Bkz/oQjbJJ8DY/X22vWTmvuUKWWhBVlo63pxLGZbjJU/heA=="],
|
||||
|
||||
"@napi-rs/canvas-linux-x64-gnu": ["@napi-rs/canvas-linux-x64-gnu@0.1.88", "", { "os": "linux", "cpu": "x64" }, "sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw=="],
|
||||
"@napi-rs/canvas-linux-x64-gnu": ["@napi-rs/canvas-linux-x64-gnu@0.1.89", "", { "os": "linux", "cpu": "x64" }, "sha512-ebLuqkCuaPIkKgKH9q4+pqWi1tkPOfiTk5PM1LKR1tB9iO9sFNVSIgwEp+SJreTSbA2DK5rW8lQXiN78SjtcvA=="],
|
||||
|
||||
"@napi-rs/canvas-linux-x64-musl": ["@napi-rs/canvas-linux-x64-musl@0.1.88", "", { "os": "linux", "cpu": "x64" }, "sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g=="],
|
||||
"@napi-rs/canvas-linux-x64-musl": ["@napi-rs/canvas-linux-x64-musl@0.1.89", "", { "os": "linux", "cpu": "x64" }, "sha512-w+5qxHzplvA4BkHhCaizNMLLXiI+CfP84YhpHm/PqMub4u8J0uOAv+aaGv40rYEYra5hHRWr9LUd6cfW32o9/A=="],
|
||||
|
||||
"@napi-rs/canvas-win32-arm64-msvc": ["@napi-rs/canvas-win32-arm64-msvc@0.1.88", "", { "os": "win32", "cpu": "arm64" }, "sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA=="],
|
||||
"@napi-rs/canvas-win32-arm64-msvc": ["@napi-rs/canvas-win32-arm64-msvc@0.1.89", "", { "os": "win32", "cpu": "arm64" }, "sha512-DmyXa5lJHcjOsDC78BM3bnEECqbK3xASVMrKfvtT/7S7Z8NGQOugvu+L7b41V6cexCd34mBWgMOsjoEBceeB1Q=="],
|
||||
|
||||
"@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@0.1.88", "", { "os": "win32", "cpu": "x64" }, "sha512-ROVqbfS4QyZxYkqmaIBBpbz/BQvAR+05FXM5PAtTYVc0uyY8Y4BHJSMdGAaMf6TdIVRsQsiq+FG/dH9XhvWCFQ=="],
|
||||
"@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@0.1.89", "", { "os": "win32", "cpu": "x64" }, "sha512-WMej0LZrIqIncQcx0JHaMXlnAG7sncwJh7obs/GBgp0xF9qABjwoRwIooMWCZkSansapKGNUHhamY6qEnFN7gA=="],
|
||||
|
||||
"@neon-rs/load": ["@neon-rs/load@0.0.4", "", {}, "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw=="],
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
|
||||
"@types/mssql": ["@types/mssql@9.1.8", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-mt9h5jWj+DYE5jxnKaWSV/GqDf9FV52XYVk6T3XZF69noEe+JJV6MKirii48l81+cjmAkSq+qeKX+k61fHkYrQ=="],
|
||||
|
||||
"@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="],
|
||||
"@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="],
|
||||
|
||||
"@types/qrcode": ["@types/qrcode@1.5.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw=="],
|
||||
|
||||
@@ -806,6 +806,8 @@
|
||||
|
||||
"@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
|
||||
|
||||
"bun-types/@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="],
|
||||
|
||||
"cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
|
||||
|
||||
"eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||
@@ -816,6 +818,8 @@
|
||||
|
||||
"libsql/detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="],
|
||||
|
||||
"protobufjs/@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="],
|
||||
|
||||
"string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
Generated
+53
-53
@@ -11,10 +11,10 @@
|
||||
"@google/genai": "^1.38.0",
|
||||
"@libsql/client": "^0.17.0",
|
||||
"@mistralai/mistralai": "^1.13.0",
|
||||
"@napi-rs/canvas": "^0.1.88",
|
||||
"@napi-rs/canvas": "^0.1.89",
|
||||
"axios": "^1.13.4",
|
||||
"dotenv": "^17.2.3",
|
||||
"drizzle-orm": "^1.0.0-beta.9-e89174b",
|
||||
"drizzle-orm": "^1.0.0-beta.12-5845444",
|
||||
"emoji-regex": "^10.6.0",
|
||||
"ollama": "^0.6.3",
|
||||
"qrcode": "^1.5.4",
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "^1.3.7",
|
||||
"@types/node": "^25.0.10",
|
||||
"@types/node": "^25.1.0",
|
||||
"@types/qrcode": "^1.5.6",
|
||||
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
||||
"@typescript-eslint/parser": "^8.54.0",
|
||||
@@ -1705,9 +1705,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.88.tgz",
|
||||
"integrity": "sha512-/p08f93LEbsL5mDZFQ3DBxcPv/I4QG9EDYRRq1WNlCOXVfAHBTHMSVMwxlqG/AtnSfUr9+vgfN7MKiyDo0+Weg==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.89.tgz",
|
||||
"integrity": "sha512-7GjmkMirJHejeALCqUnZY3QwID7bbumOiLrqq2LKgxrdjdmxWQBTc6rcASa2u8wuWrH7qo4/4n/VNrOwCoKlKg==",
|
||||
"license": "MIT",
|
||||
"workspaces": [
|
||||
"e2e/*"
|
||||
@@ -1720,23 +1720,23 @@
|
||||
"url": "https://github.com/sponsors/Brooooooklyn"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@napi-rs/canvas-android-arm64": "0.1.88",
|
||||
"@napi-rs/canvas-darwin-arm64": "0.1.88",
|
||||
"@napi-rs/canvas-darwin-x64": "0.1.88",
|
||||
"@napi-rs/canvas-linux-arm-gnueabihf": "0.1.88",
|
||||
"@napi-rs/canvas-linux-arm64-gnu": "0.1.88",
|
||||
"@napi-rs/canvas-linux-arm64-musl": "0.1.88",
|
||||
"@napi-rs/canvas-linux-riscv64-gnu": "0.1.88",
|
||||
"@napi-rs/canvas-linux-x64-gnu": "0.1.88",
|
||||
"@napi-rs/canvas-linux-x64-musl": "0.1.88",
|
||||
"@napi-rs/canvas-win32-arm64-msvc": "0.1.88",
|
||||
"@napi-rs/canvas-win32-x64-msvc": "0.1.88"
|
||||
"@napi-rs/canvas-android-arm64": "0.1.89",
|
||||
"@napi-rs/canvas-darwin-arm64": "0.1.89",
|
||||
"@napi-rs/canvas-darwin-x64": "0.1.89",
|
||||
"@napi-rs/canvas-linux-arm-gnueabihf": "0.1.89",
|
||||
"@napi-rs/canvas-linux-arm64-gnu": "0.1.89",
|
||||
"@napi-rs/canvas-linux-arm64-musl": "0.1.89",
|
||||
"@napi-rs/canvas-linux-riscv64-gnu": "0.1.89",
|
||||
"@napi-rs/canvas-linux-x64-gnu": "0.1.89",
|
||||
"@napi-rs/canvas-linux-x64-musl": "0.1.89",
|
||||
"@napi-rs/canvas-win32-arm64-msvc": "0.1.89",
|
||||
"@napi-rs/canvas-win32-x64-msvc": "0.1.89"
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-android-arm64": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.88.tgz",
|
||||
"integrity": "sha512-KEaClPnZuVxJ8smUWjV1wWFkByBO/D+vy4lN+Dm5DFH514oqwukxKGeck9xcKJhaWJGjfruGmYGiwRe//+/zQQ==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.89.tgz",
|
||||
"integrity": "sha512-CXxQTXsjtQqKGENS8Ejv9pZOFJhOPIl2goenS+aU8dY4DygvkyagDhy/I07D1YLqrDtPvLEX5zZHt8qUdnuIpQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1754,9 +1754,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-darwin-arm64": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.88.tgz",
|
||||
"integrity": "sha512-Xgywz0dDxOKSgx3eZnK85WgGMmGrQEW7ZLA/E7raZdlEE+xXCozobgqz2ZvYigpB6DJFYkqnwHjqCOTSDGlFdg==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.89.tgz",
|
||||
"integrity": "sha512-k29cR/Zl20WLYM7M8YePevRu2VQRaKcRedYr1V/8FFHkyIQ8kShEV+MPoPGi+znvmd17Eqjy2Pk2F2kpM2umVg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1774,9 +1774,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-darwin-x64": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.88.tgz",
|
||||
"integrity": "sha512-Yz4wSCIQOUgNucgk+8NFtQxQxZV5NO8VKRl9ePKE6XoNyNVC8JDqtvhh3b3TPqKK8W5p2EQpAr1rjjm0mfBxdg==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.89.tgz",
|
||||
"integrity": "sha512-iUragqhBrA5FqU13pkhYBDbUD1WEAIlT8R2+fj6xHICY2nemzwMUI8OENDhRh7zuL06YDcRwENbjAVxOmaX9jg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1794,9 +1794,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.88.tgz",
|
||||
"integrity": "sha512-9gQM2SlTo76hYhxHi2XxWTAqpTOb+JtxMPEIr+H5nAhHhyEtNmTSDRtz93SP7mGd2G3Ojf2oF5tP9OdgtgXyKg==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.89.tgz",
|
||||
"integrity": "sha512-y3SM9sfDWasY58ftoaI09YBFm35Ig8tosZqgahLJ2WGqawCusGNPV9P0/4PsrLOCZqGg629WxexQMY25n7zcvA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -1814,9 +1814,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-arm64-gnu": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.88.tgz",
|
||||
"integrity": "sha512-7qgaOBMXuVRk9Fzztzr3BchQKXDxGbY+nwsovD3I/Sx81e+sX0ReEDYHTItNb0Je4NHbAl7D0MKyd4SvUc04sg==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.89.tgz",
|
||||
"integrity": "sha512-NEoF9y8xq5fX8HG8aZunBom1ILdTwt7ayBzSBIwrmitk7snj4W6Fz/yN/ZOmlM1iyzHDNX5Xn0n+VgWCF8BEdA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1834,9 +1834,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-arm64-musl": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.88.tgz",
|
||||
"integrity": "sha512-kYyNrUsHLkoGHBc77u4Unh067GrfiCUMbGHC2+OTxbeWfZkPt2o32UOQkhnSswKd9Fko/wSqqGkY956bIUzruA==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.89.tgz",
|
||||
"integrity": "sha512-UQQkIEzV12/l60j1ziMjZ+mtodICNUbrd205uAhbyTw0t60CrC/EsKb5/aJWGq1wM0agvcgZV72JJCKfLS6+4w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1854,9 +1854,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.88.tgz",
|
||||
"integrity": "sha512-HVuH7QgzB0yavYdNZDRyAsn/ejoXB0hn8twwFnOqUbCCdkV+REna7RXjSR7+PdfW0qMQ2YYWsLvVBT5iL/mGpw==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.89.tgz",
|
||||
"integrity": "sha512-1/VmEoFaIO6ONeeEMGoWF17wOYZOl5hxDC1ios2Bkz/oQjbJJ8DY/X22vWTmvuUKWWhBVlo63pxLGZbjJU/heA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@@ -1874,9 +1874,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-x64-gnu": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.88.tgz",
|
||||
"integrity": "sha512-hvcvKIcPEQrvvJtJnwD35B3qk6umFJ8dFIr8bSymfrSMem0EQsfn1ztys8ETIFndTwdNWJKWluvxztA41ivsEw==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.89.tgz",
|
||||
"integrity": "sha512-ebLuqkCuaPIkKgKH9q4+pqWi1tkPOfiTk5PM1LKR1tB9iO9sFNVSIgwEp+SJreTSbA2DK5rW8lQXiN78SjtcvA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1894,9 +1894,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-linux-x64-musl": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.88.tgz",
|
||||
"integrity": "sha512-eSMpGYY2xnZSQ6UxYJ6plDboxq4KeJ4zT5HaVkUnbObNN6DlbJe0Mclh3wifAmquXfrlgTZt6zhHsUgz++AK6g==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.89.tgz",
|
||||
"integrity": "sha512-w+5qxHzplvA4BkHhCaizNMLLXiI+CfP84YhpHm/PqMub4u8J0uOAv+aaGv40rYEYra5hHRWr9LUd6cfW32o9/A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -1914,9 +1914,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-win32-arm64-msvc": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.88.tgz",
|
||||
"integrity": "sha512-qcIFfEgHrchyYqRrxsCeTQgpJZ/GqHiqPcU/Fvw/ARVlQeDX1VyFH+X+0gCR2tca6UJrq96vnW+5o7buCq+erA==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.89.tgz",
|
||||
"integrity": "sha512-DmyXa5lJHcjOsDC78BM3bnEECqbK3xASVMrKfvtT/7S7Z8NGQOugvu+L7b41V6cexCd34mBWgMOsjoEBceeB1Q==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -1934,9 +1934,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/canvas-win32-x64-msvc": {
|
||||
"version": "0.1.88",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.88.tgz",
|
||||
"integrity": "sha512-ROVqbfS4QyZxYkqmaIBBpbz/BQvAR+05FXM5PAtTYVc0uyY8Y4BHJSMdGAaMf6TdIVRsQsiq+FG/dH9XhvWCFQ==",
|
||||
"version": "0.1.89",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.89.tgz",
|
||||
"integrity": "sha512-WMej0LZrIqIncQcx0JHaMXlnAG7sncwJh7obs/GBgp0xF9qABjwoRwIooMWCZkSansapKGNUHhamY6qEnFN7gA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -2077,9 +2077,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "25.0.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz",
|
||||
"integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==",
|
||||
"version": "25.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz",
|
||||
"integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~7.16.0"
|
||||
|
||||
+3
-3
@@ -11,10 +11,10 @@
|
||||
"@google/genai": "^1.38.0",
|
||||
"@libsql/client": "^0.17.0",
|
||||
"@mistralai/mistralai": "^1.13.0",
|
||||
"@napi-rs/canvas": "^0.1.88",
|
||||
"@napi-rs/canvas": "^0.1.89",
|
||||
"axios": "^1.13.4",
|
||||
"dotenv": "^17.2.3",
|
||||
"drizzle-orm": "^1.0.0-beta.9-e89174b",
|
||||
"drizzle-orm": "^1.0.0-beta.12-5845444",
|
||||
"emoji-regex": "^10.6.0",
|
||||
"ollama": "^0.6.3",
|
||||
"qrcode": "^1.5.4",
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "^1.3.7",
|
||||
"@types/node": "^25.0.10",
|
||||
"@types/node": "^25.1.0",
|
||||
"@types/qrcode": "^1.5.6",
|
||||
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
||||
"@typescript-eslint/parser": "^8.54.0",
|
||||
|
||||
@@ -34,7 +34,8 @@ export class GeminiChat extends ChatCommand {
|
||||
|
||||
const chatId = msg.chat.id;
|
||||
|
||||
const messageParts = await collectReplyChainText(msg);
|
||||
const storedMsg = await MessageStore.get(chatId, msg.message_id);
|
||||
const messageParts = await collectReplyChainText(storedMsg);
|
||||
console.log("MESSAGE PARTS", messageParts);
|
||||
|
||||
const chatMessages = messageParts.map(part => {
|
||||
@@ -144,6 +145,10 @@ export class GeminiChat extends ChatCommand {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "image": {
|
||||
const image = event.delta.data;
|
||||
console.log("image", image);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Requirements} from "../base/requirements";
|
||||
import {Requirement} from "../base/requirement";
|
||||
import {Message} from "typescript-telegram-bot-api";
|
||||
import {googleAi} from "../index";
|
||||
import {logError, replyToMessage} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
|
||||
export class GeminiGenerateImage extends ChatCommand {
|
||||
command = "geminiGenImage";
|
||||
argsMode = "required" as const;
|
||||
|
||||
title = "/geminiGenImage";
|
||||
description = "Generate image with Gemini";
|
||||
|
||||
requirements = Requirements.Build(Requirement.BOT_CREATOR);
|
||||
|
||||
async execute(msg: Message, match?: RegExpExecArray): Promise<void> {
|
||||
console.log("match", match);
|
||||
|
||||
const prompt = match?.[3];
|
||||
return this.executeGenImage(msg, prompt);
|
||||
}
|
||||
|
||||
async executeGenImage(msg: Message, text: string): Promise<void> {
|
||||
if (!text || text.trim().length === 0) return;
|
||||
|
||||
let waitMessage: Message;
|
||||
|
||||
try {
|
||||
waitMessage = await replyToMessage({
|
||||
message: msg,
|
||||
text: Environment.genImageText,
|
||||
});
|
||||
|
||||
const interaction = await googleAi.interactions.create({
|
||||
model: Environment.GEMINI_IMAGE_MODEL,
|
||||
response_modalities: ["image"],
|
||||
input: text,
|
||||
});
|
||||
|
||||
interaction.outputs?.forEach((output, index) => {
|
||||
if (output.type === "image") {
|
||||
// const image = output.data;
|
||||
console.log(`Image output ${index + 1}:`, output);
|
||||
} else {
|
||||
console.log(`Output ${index + 1}: ${output}`);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
|
||||
await replyToMessage({
|
||||
message: waitMessage,
|
||||
text: `Произошла ошибка!\n${e.toString()}`,
|
||||
disableLinkPreview: true
|
||||
}).catch(logError);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import {addMute} from "../db/database";
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Requirements} from "../base/requirements";
|
||||
import {Requirement} from "../base/requirement";
|
||||
@@ -35,7 +34,7 @@ export class Ignore extends ChatCommand {
|
||||
return;
|
||||
}
|
||||
|
||||
if (await addMute(id)) {
|
||||
if (await Environment.addMute(id)) {
|
||||
await oldSendMessage(msg, text + " в муте! 🔇").catch(logError);
|
||||
} else {
|
||||
await oldSendMessage(msg, text + " уже в муте 🤔").catch(logError);
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
escapeMarkdownV2Text,
|
||||
logError,
|
||||
oldReplyToMessage,
|
||||
photoPathByUniqueId,
|
||||
startIntervalEditor
|
||||
} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
@@ -33,7 +34,8 @@ export class MistralChat extends ChatCommand {
|
||||
|
||||
const chatId = msg.chat.id;
|
||||
|
||||
const messageParts = await collectReplyChainText(msg);
|
||||
const storedMsg = await MessageStore.get(chatId, msg.message_id);
|
||||
const messageParts = await collectReplyChainText(storedMsg);
|
||||
console.log("MESSAGE PARTS", messageParts);
|
||||
|
||||
const chatMessages = messageParts.map(part => {
|
||||
@@ -43,8 +45,8 @@ export class MistralChat extends ChatCommand {
|
||||
text: (Environment.USE_NAMES_IN_PROMPT && !part.bot ? `MESSAGE FROM USER "${part.name}":\n` : "") + part.content,
|
||||
});
|
||||
|
||||
if (part.images && part.images.length > 0) {
|
||||
const base64Image = Buffer.from(fs.readFileSync(part.images[0])).toString("base64");
|
||||
for (const image of part.images) {
|
||||
const base64Image = Buffer.from(fs.readFileSync(photoPathByUniqueId(image))).toString("base64");
|
||||
content.push({
|
||||
type: "image_url",
|
||||
imageUrl: "data:image/jpeg;base64," + base64Image
|
||||
|
||||
+26
-10
@@ -1,17 +1,19 @@
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Message} from "typescript-telegram-bot-api";
|
||||
import {abortOllamaRequest, bot, getOllamaRequest, ollama, ollamaRequests} from "../index";
|
||||
import {abortOllamaRequest, bot, chatCommands, getOllamaRequest, ollama, ollamaRequests} from "../index";
|
||||
import {
|
||||
collectReplyChainText,
|
||||
escapeMarkdownV2Text,
|
||||
logError,
|
||||
oldReplyToMessage,
|
||||
replyToMessage,
|
||||
startIntervalEditor
|
||||
} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
import {MessageStore} from "../common/message-store";
|
||||
import {Cancel} from "../callback_commands/cancel";
|
||||
import {OllamaCancel} from "../callback_commands/ollama-cancel";
|
||||
import {OllamaGetModel} from "./ollama-get-model";
|
||||
|
||||
export class OllamaChat extends ChatCommand {
|
||||
command = "ollama";
|
||||
@@ -30,7 +32,8 @@ export class OllamaChat extends ChatCommand {
|
||||
|
||||
const chatId = msg.chat.id;
|
||||
|
||||
const messageParts = await collectReplyChainText(msg);
|
||||
const storedMsg = await MessageStore.get(chatId, msg.message_id);
|
||||
const messageParts = await collectReplyChainText(storedMsg);
|
||||
console.log("MESSAGE PARTS", messageParts);
|
||||
|
||||
const chatMessages = messageParts.map(part => {
|
||||
@@ -52,19 +55,32 @@ export class OllamaChat extends ChatCommand {
|
||||
return total + (curr.images?.length ?? 0);
|
||||
}, 0);
|
||||
|
||||
if (imagesCount) {
|
||||
try {
|
||||
const modelInfo = await chatCommands.find(c => c instanceof OllamaGetModel).loadModelInfo();
|
||||
if (modelInfo) {
|
||||
const caps = modelInfo.capabilities || [];
|
||||
if (!caps.includes("vision")) {
|
||||
await replyToMessage({
|
||||
message: msg,
|
||||
text: "Моя текущая модель не умеет анализировать изображения 🥹"
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
}
|
||||
}
|
||||
|
||||
const uuid = crypto.randomUUID();
|
||||
const cancelMarkup = {inline_keyboard: [[Cancel.withData(new OllamaCancel().data + " " + uuid).asButton()]]};
|
||||
|
||||
waitMessage = await bot.sendMessage({
|
||||
chat_id: chatId,
|
||||
waitMessage = await replyToMessage({
|
||||
message: msg,
|
||||
text: imagesCount ?
|
||||
imagesCount > 1 ? Environment.analyzingPicturesText : Environment.analyzingPictureText
|
||||
: Environment.waitText,
|
||||
|
||||
reply_parameters: {
|
||||
chat_id: chatId,
|
||||
message_id: msg.message_id
|
||||
}
|
||||
: Environment.waitText
|
||||
});
|
||||
|
||||
const stream = await ollama.chat({
|
||||
|
||||
@@ -3,6 +3,7 @@ import {Message} from "typescript-telegram-bot-api";
|
||||
import {boolToEmoji, logError, replyToMessage} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
import {ollama} from "../index";
|
||||
import {ShowResponse} from "ollama";
|
||||
|
||||
export class OllamaGetModel extends ChatCommand {
|
||||
title = "/ollamaGetModel";
|
||||
@@ -10,7 +11,7 @@ export class OllamaGetModel extends ChatCommand {
|
||||
|
||||
async execute(msg: Message): Promise<void> {
|
||||
try {
|
||||
const showResponse = await ollama.show({model: Environment.OLLAMA_MODEL});
|
||||
const showResponse = await this.loadModelInfo();
|
||||
|
||||
const caps = showResponse.capabilities;
|
||||
|
||||
@@ -27,4 +28,8 @@ export class OllamaGetModel extends ChatCommand {
|
||||
await replyToMessage({message: msg, text: e.toString()}).catch(logError);
|
||||
}
|
||||
}
|
||||
|
||||
async loadModelInfo(): Promise<ShowResponse | null> {
|
||||
return ollama.show({model: Environment.OLLAMA_MODEL});
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Message} from "typescript-telegram-bot-api";
|
||||
import {logError, randomValue, oldReplyToMessage} from "../util/utils";
|
||||
import {prefixAnswers} from "../db/database";
|
||||
import {logError, randomValue, replyToMessage} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
|
||||
export class PrefixResponse extends ChatCommand {
|
||||
async execute(msg: Message): Promise<void> {
|
||||
await oldReplyToMessage(msg, randomValue(prefixAnswers)).catch(logError);
|
||||
await replyToMessage({message: msg, text: randomValue(Environment.ANSWERS.prefix)}).catch(logError);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Message} from "typescript-telegram-bot-api";
|
||||
import {logError, randomValue, oldReplyToMessage} from "../util/utils";
|
||||
import {testAnswers} from "../db/database";
|
||||
import {logError, oldReplyToMessage, randomValue} from "../util/utils";
|
||||
import {Environment} from "../common/environment";
|
||||
|
||||
export class Test extends ChatCommand {
|
||||
regexp = /^(test|тест|еуые|ntcn|инноке(нтий|ш|нтич))/i;
|
||||
@@ -9,6 +9,6 @@ export class Test extends ChatCommand {
|
||||
description = "System functionality check";
|
||||
|
||||
async execute(msg: Message) {
|
||||
await oldReplyToMessage(msg, randomValue(testAnswers) || "а").catch(logError);
|
||||
await oldReplyToMessage(msg, randomValue(Environment.ANSWERS.test) || "а").catch(logError);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import {removeMute} from "../db/database";
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {Requirements} from "../base/requirements";
|
||||
import {Requirement} from "../base/requirement";
|
||||
@@ -34,7 +33,7 @@ export class Unignore extends ChatCommand {
|
||||
return;
|
||||
}
|
||||
|
||||
if (await removeMute(id)) {
|
||||
if (await Environment.removeMute(id)) {
|
||||
await oldSendMessage(msg, text + " больше не в муте! 🔈").catch(logError);
|
||||
} else {
|
||||
await oldSendMessage(msg, text + " не был в муте 🤔").catch(logError);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import {ChatCommand} from "../base/chat-command";
|
||||
import {logError, oldSendMessage, randomValue} from "../util/utils";
|
||||
import {betterAnswers} from "../db/database";
|
||||
import {Message} from "typescript-telegram-bot-api";
|
||||
import {Environment} from "../common/environment";
|
||||
|
||||
export class WhatBetter extends ChatCommand {
|
||||
command = ["what", "что"];
|
||||
@@ -19,7 +19,7 @@ export class WhatBetter extends ChatCommand {
|
||||
const a = m[2].trim();
|
||||
const b = m[4].trim();
|
||||
|
||||
const text = `${randomValue(betterAnswers)} ${randomValue([a, b])}`;
|
||||
const text = `${randomValue(Environment.ANSWERS.better)} ${randomValue([a, b])}`;
|
||||
|
||||
await oldSendMessage(msg, text).catch(logError);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import path from "node:path";
|
||||
import {saveData} from "../db/database";
|
||||
import {Answers} from "../model/answers";
|
||||
|
||||
export class Environment {
|
||||
static BOT_TOKEN: string;
|
||||
static TEST_ENVIRONMENT: boolean;
|
||||
static ADMIN_IDS: Set<number> = new Set<number>();
|
||||
static MUTED_IDS: Set<number> = new Set<number>();
|
||||
static CHAT_IDS_WHITELIST: Set<number> = new Set<number>();
|
||||
static BOT_PREFIX: string;
|
||||
static CREATOR_ID: number;
|
||||
@@ -15,9 +17,7 @@ export class Environment {
|
||||
|
||||
static ONLY_FOR_CREATOR_MODE: boolean;
|
||||
|
||||
static USE_MOM: boolean;
|
||||
static USE_DAD: boolean;
|
||||
static USE_FU: boolean;
|
||||
static ANSWERS: Answers;
|
||||
|
||||
static USE_NAMES_IN_PROMPT: boolean;
|
||||
|
||||
@@ -31,6 +31,7 @@ export class Environment {
|
||||
|
||||
static GEMINI_API_KEY?: string;
|
||||
static GEMINI_MODEL: string;
|
||||
static GEMINI_IMAGE_MODEL: string;
|
||||
|
||||
static MISTRAL_API_KEY?: string;
|
||||
static MISTRAL_MODEL: string;
|
||||
@@ -38,6 +39,7 @@ export class Environment {
|
||||
static waitText = "⏳ Дайте-ка подумать...";
|
||||
static analyzingPictureText = "🔍 Внимательно изучаю изображение...";
|
||||
static analyzingPicturesText = "🔍 Внимательно изучаю изображения...";
|
||||
static genImageText = "👨🎨 Генерирую изображение...";
|
||||
static ollamaCancelledText = "```Ollama\n❌ Отменено```";
|
||||
|
||||
static load() {
|
||||
@@ -52,10 +54,6 @@ export class Environment {
|
||||
|
||||
Environment.ONLY_FOR_CREATOR_MODE = process.env.ONLY_FOR_CREATOR_MODE == "true";
|
||||
|
||||
Environment.USE_MOM = process.env.USE_MOM == "true";
|
||||
Environment.USE_DAD = process.env.USE_DAD == "true";
|
||||
Environment.USE_FU = process.env.USE_FU == "true";
|
||||
|
||||
Environment.USE_NAMES_IN_PROMPT = process.env.USE_NAMES_IN_PROMPT == "true";
|
||||
|
||||
Environment.MAX_PHOTO_SIZE = Number(process.env.MAX_PHOTO_SIZE || "1280");
|
||||
@@ -68,6 +66,7 @@ export class Environment {
|
||||
|
||||
Environment.GEMINI_API_KEY = process.env.GEMINI_API_KEY;
|
||||
Environment.GEMINI_MODEL = process.env.GEMINI_MODEL || "gemini-2.5-flash-lite";
|
||||
Environment.GEMINI_IMAGE_MODEL = process.env.GEMINI_IMAGE_MODEL || "gemini-2.5-flash-image";
|
||||
|
||||
Environment.MISTRAL_API_KEY = process.env.MISTRAL_API_KEY;
|
||||
Environment.MISTRAL_MODEL = process.env.MISTRAL_MODEL || "mistral-small-latest";
|
||||
@@ -97,6 +96,29 @@ export class Environment {
|
||||
return has;
|
||||
}
|
||||
|
||||
static setMuted(muted: Set<number>) {
|
||||
this.MUTED_IDS = muted;
|
||||
}
|
||||
|
||||
static async addMute(id: number): Promise<boolean> {
|
||||
if (this.MUTED_IDS.has(id)) return Promise.resolve(false);
|
||||
|
||||
this.MUTED_IDS.add(id);
|
||||
await saveData();
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
static async removeMute(id: number): Promise<boolean> {
|
||||
if (!this.MUTED_IDS.has(id)) return Promise.resolve(false);
|
||||
this.MUTED_IDS.delete(id);
|
||||
await saveData();
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
static setAnswers(answers: Answers) {
|
||||
this.ANSWERS = answers;
|
||||
}
|
||||
|
||||
static setOllamaModel(newModel: string) {
|
||||
Environment.OLLAMA_MODEL = newModel;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ export class MessageStore {
|
||||
return this.map;
|
||||
}
|
||||
|
||||
static async put(m: Message | StoredMessage) {
|
||||
static async put(m: Message | StoredMessage): Promise<StoredMessage> {
|
||||
const msg: StoredMessage = isStoredMessage(m) ? m : {
|
||||
chatId: m.chat.id,
|
||||
id: m.message_id,
|
||||
@@ -26,6 +26,7 @@ export class MessageStore {
|
||||
|
||||
this.map.set(this.key(msg.chatId, msg.id), msg);
|
||||
await messageDao.insert(messageDao.mapStoredTo([msg]));
|
||||
return msg;
|
||||
}
|
||||
|
||||
static async get(chatId: number, messageId: number): Promise<StoredMessage | null> {
|
||||
|
||||
+5
-47
@@ -1,9 +1,7 @@
|
||||
import * as fs from "fs";
|
||||
import {Environment} from "../common/environment";
|
||||
import {logError} from "../util/utils";
|
||||
|
||||
|
||||
export let muted: Set<number> = new Set<number>();
|
||||
import {Answers} from "../model/answers";
|
||||
|
||||
type DataJsonFile = {
|
||||
admins: number[]
|
||||
@@ -12,39 +10,6 @@ type DataJsonFile = {
|
||||
|
||||
export let jsonFile: DataJsonFile;
|
||||
|
||||
type AnswersJsonFile = {
|
||||
test: string[]
|
||||
prefix: string[]
|
||||
better: string[]
|
||||
who: string[]
|
||||
kick: string[]
|
||||
invite: string[]
|
||||
day: number[]
|
||||
}
|
||||
|
||||
export const testAnswers: string[] = [];
|
||||
export const prefixAnswers: string[] = [];
|
||||
export const betterAnswers: string[] = [];
|
||||
export const whoAnswers: string[] = [];
|
||||
export const kickAnswers: string[] = [];
|
||||
export const inviteAnswers: string[] = [];
|
||||
export const dayAnswers: number[] = [];
|
||||
|
||||
export async function addMute(id: number): Promise<boolean> {
|
||||
if (muted.has(id)) return Promise.resolve(false);
|
||||
|
||||
muted.add(id);
|
||||
await saveData();
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
export async function removeMute(id: number): Promise<boolean> {
|
||||
if (!muted.has(id)) return Promise.resolve(false);
|
||||
muted.delete(id);
|
||||
await saveData();
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
|
||||
export async function readData(): Promise<void> {
|
||||
try {
|
||||
jsonFile = JSON.parse(fs.readFileSync(`${Environment.DATA_PATH}/data.json`).toString());
|
||||
@@ -53,8 +18,7 @@ export async function readData(): Promise<void> {
|
||||
admins.unshift(Environment.CREATOR_ID);
|
||||
|
||||
Environment.setAdmins(new Set<number>(admins));
|
||||
|
||||
muted = new Set<number>(jsonFile.muted || []);
|
||||
Environment.setMuted(new Set<number>(jsonFile.muted || []));
|
||||
|
||||
return Promise.resolve();
|
||||
} catch (e) {
|
||||
@@ -69,7 +33,7 @@ export async function saveData(): Promise<void> {
|
||||
jsonFile.admins = adminIds;
|
||||
|
||||
const mutedList: number[] = [];
|
||||
muted.forEach(id => mutedList.push(id));
|
||||
Environment.MUTED_IDS.forEach(id => mutedList.push(id));
|
||||
jsonFile.muted = mutedList;
|
||||
|
||||
try {
|
||||
@@ -82,14 +46,8 @@ export async function saveData(): Promise<void> {
|
||||
|
||||
export async function retrieveAnswers(): Promise<void> {
|
||||
try {
|
||||
const json: AnswersJsonFile = JSON.parse(fs.readFileSync(`${Environment.DATA_PATH}/answers.json`).toString());
|
||||
json.test.forEach(e => testAnswers.push(e));
|
||||
json.prefix.forEach(e => prefixAnswers.push(e));
|
||||
json.better.forEach(e => betterAnswers.push(e));
|
||||
json.who.forEach(e => whoAnswers.push(e));
|
||||
json.kick.forEach(e => kickAnswers.push(e));
|
||||
json.invite.forEach(e => inviteAnswers.push(e));
|
||||
json.day.forEach(e => dayAnswers.push(e));
|
||||
const json: Answers = JSON.parse(fs.readFileSync(`${Environment.DATA_PATH}/answers.json`).toString());
|
||||
Environment.setAnswers(json);
|
||||
return Promise.resolve();
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
|
||||
+6
-59
@@ -3,15 +3,11 @@ import {Environment} from "./common/environment";
|
||||
import {InlineQueryResult, TelegramBot, User} from "typescript-telegram-bot-api";
|
||||
import {ChatCommand} from "./base/chat-command";
|
||||
import {
|
||||
checkRequirements,
|
||||
executeChatCommand,
|
||||
extractTextMessage,
|
||||
findAndExecuteCallbackCommand,
|
||||
ignore,
|
||||
initSystemSpecs,
|
||||
logError,
|
||||
randomValue,
|
||||
searchChatCommand
|
||||
processNewMessage
|
||||
} from "./util/utils";
|
||||
import {Ae} from "./commands/ae";
|
||||
import {Help} from "./commands/help";
|
||||
@@ -21,7 +17,7 @@ import {Ping} from "./commands/ping";
|
||||
import {RandomString} from "./commands/random-string";
|
||||
import {SystemInfo} from "./commands/system-info";
|
||||
import {Test} from "./commands/test";
|
||||
import {inviteAnswers, kickAnswers, muted, readData, retrieveAnswers} from "./db/database";
|
||||
import {readData, retrieveAnswers} from "./db/database";
|
||||
import {Uptime} from "./commands/uptime";
|
||||
import {WhatBetter} from "./commands/what-better";
|
||||
import {When} from "./commands/when";
|
||||
@@ -40,7 +36,6 @@ import {Leave} from "./commands/leave";
|
||||
import {OllamaChat} from "./commands/ollama-chat";
|
||||
import {Start} from "./commands/start";
|
||||
import {MessageStore} from "./common/message-store";
|
||||
import {PrefixResponse} from "./commands/prefix-response";
|
||||
import {GeminiChat} from "./commands/gemini-chat";
|
||||
import {Choice} from "./commands/choice";
|
||||
import {Coin} from "./commands/coin";
|
||||
@@ -70,6 +65,7 @@ import {GeminiListModels} from "./commands/gemini-list-models";
|
||||
import {GeminiGetModel} from "./commands/gemini-get-model";
|
||||
import {GeminiSetModel} from "./commands/gemini-set-model";
|
||||
import {Debug} from "./commands/debug";
|
||||
import {GeminiGenerateImage} from "./commands/gemini-generate-image";
|
||||
|
||||
process.setUncaughtExceptionCaptureCallback(logError);
|
||||
|
||||
@@ -177,7 +173,8 @@ if (Environment.GEMINI_API_KEY) {
|
||||
new GeminiChat(),
|
||||
new GeminiListModels(),
|
||||
new GeminiGetModel(),
|
||||
new GeminiSetModel()
|
||||
new GeminiSetModel(),
|
||||
new GeminiGenerateImage()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -239,57 +236,7 @@ bot.on("edited_message", async (msg) => {
|
||||
await MessageStore.put(msg);
|
||||
});
|
||||
|
||||
bot.on("message", async (msg) => {
|
||||
console.log("message", msg);
|
||||
|
||||
Promise.all([MessageStore.put(msg), UserStore.put(msg.from)]).then(ignore);
|
||||
|
||||
if ((msg.new_chat_members?.length || 0 > 0)) {
|
||||
await bot.sendMessage({chat_id: msg.chat.id, text: randomValue(inviteAnswers)}).catch(logError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.left_chat_member && msg.left_chat_member.id !== botUser.id) {
|
||||
await bot.sendMessage({chat_id: msg.chat.id, text: randomValue(kickAnswers)}).catch(logError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (muted.has(msg.from.id)) return;
|
||||
|
||||
if (msg.forward_origin) return;
|
||||
|
||||
const cmdText = msg.text || msg.caption || "";
|
||||
|
||||
const then = Date.now();
|
||||
|
||||
const cmd = searchChatCommand(chatCommands, cmdText);
|
||||
const executed = await executeChatCommand(cmd, msg, cmdText);
|
||||
|
||||
const now = Date.now();
|
||||
const diff = now - then;
|
||||
console.log("diff", diff);
|
||||
|
||||
if (executed || !cmdText) return;
|
||||
|
||||
const startsWithPrefix = cmdText.toLowerCase().startsWith(Environment.BOT_PREFIX.toLowerCase());
|
||||
const messageWithoutPrefix = cmdText.substring(Environment.BOT_PREFIX.length).trim();
|
||||
|
||||
if (startsWithPrefix && messageWithoutPrefix.length === 0) {
|
||||
const prefixResponse = new PrefixResponse();
|
||||
if (await checkRequirements(prefixResponse, msg)) {
|
||||
await prefixResponse.execute(msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!startsWithPrefix && msg.chat.type !== "private") return;
|
||||
if (msg.chat.type === "private" && !Environment.ADMIN_IDS.has(msg.chat.id)) return;
|
||||
|
||||
const chat = chatCommands.find(e => e instanceof OllamaChat);
|
||||
if (await checkRequirements(chat, msg)) {
|
||||
await chat.executeOllama(msg, startsWithPrefix ? messageWithoutPrefix : cmdText);
|
||||
}
|
||||
});
|
||||
bot.on("message", processNewMessage);
|
||||
|
||||
bot.on("inline_query", async (query) => {
|
||||
console.log("query", query);
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
export type Answers = {
|
||||
test: string[]
|
||||
prefix: string[]
|
||||
better: string[]
|
||||
who: string[]
|
||||
kick: string[]
|
||||
invite: string[]
|
||||
day: number[]
|
||||
}
|
||||
+152
-7
@@ -12,7 +12,7 @@ import {
|
||||
} from "typescript-telegram-bot-api";
|
||||
import {Environment} from "../common/environment";
|
||||
import {TelegramError} from "typescript-telegram-bot-api/dist/errors";
|
||||
import {bot, botUser, messageDao} from "../index";
|
||||
import {bot, botUser, chatCommands, messageDao} from "../index";
|
||||
import os from "os";
|
||||
import axios from "axios";
|
||||
import {MessagePart} from "../common/message-part";
|
||||
@@ -25,6 +25,8 @@ import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
import {MessageStore} from "../common/message-store";
|
||||
import {SystemInfo} from "../commands/system-info";
|
||||
import {PrefixResponse} from "../commands/prefix-response";
|
||||
import {OllamaChat} from "../commands/ollama-chat";
|
||||
|
||||
export const ignore = () => {
|
||||
};
|
||||
@@ -178,7 +180,11 @@ export async function checkRequirements(cmd: ChatCommand | CallbackCommand | nul
|
||||
if (reqs.isRequiresSameUser()) {
|
||||
let originalFromId: number | null;
|
||||
try {
|
||||
originalFromId = (await MessageStore.get(chatId, messageId))?.fromId;
|
||||
const queryMessage = await MessageStore.get(chatId, messageId);
|
||||
if (queryMessage && queryMessage.replyToMessageId) {
|
||||
const originalMessage = await MessageStore.get(chatId, queryMessage.replyToMessageId);
|
||||
originalFromId = originalMessage?.fromId;
|
||||
}
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
originalFromId = null;
|
||||
@@ -521,7 +527,35 @@ export async function loadImagesIfExists(msg: Message | StoredMessage): Promise<
|
||||
return imageFilePaths;
|
||||
}
|
||||
|
||||
export async function collectReplyChainText(triggerMsg: Message, limit: number = 40, includeTrigger = true, cutPrefix: boolean = true): Promise<MessagePart[]> {
|
||||
export async function loadImagesFromFileIds(maxSizes: PhotoMaxSize[]): Promise<string[] | null> {
|
||||
if (!maxSizes?.length) return null;
|
||||
|
||||
const dataPath = path.join(Environment.DATA_PATH, "temp");
|
||||
if (!fs.existsSync(dataPath)) {
|
||||
fs.mkdirSync(dataPath);
|
||||
}
|
||||
|
||||
const imagePromises = maxSizes.map((size) => {
|
||||
return axios.get<ArrayBuffer>(size.url, {responseType: "arraybuffer"});
|
||||
});
|
||||
|
||||
const responses = await Promise.all(imagePromises);
|
||||
const paths = responses.map((res, index) => {
|
||||
try {
|
||||
const imageFilePath = path.join(dataPath, maxSizes[index].unique_file_id + ".jpg");
|
||||
const src = Buffer.from(res.data);
|
||||
fs.writeFileSync(imageFilePath, src);
|
||||
return imageFilePath;
|
||||
} catch (e) {
|
||||
logError(e);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
return paths.filter(p => p);
|
||||
}
|
||||
|
||||
export async function collectReplyChainText(triggerMsg: Message | StoredMessage, limit: number = 40, includeTrigger = true, cutPrefix: boolean = true): Promise<MessagePart[]> {
|
||||
const parts: MessagePart[] = [];
|
||||
|
||||
const pushPart = async (msg: Message | StoredMessage, textRequired: boolean = false) => {
|
||||
@@ -544,19 +578,21 @@ export async function collectReplyChainText(triggerMsg: Message, limit: number =
|
||||
});
|
||||
};
|
||||
|
||||
const chatId = triggerMsg.chat.id as number;
|
||||
const chatId = isStoredMessage(triggerMsg) ? triggerMsg.chatId as number : triggerMsg.chat.id;
|
||||
|
||||
if (includeTrigger) {
|
||||
await pushPart(triggerMsg);
|
||||
}
|
||||
|
||||
const first = triggerMsg.reply_to_message;
|
||||
const first = isStoredMessage(triggerMsg) ?
|
||||
(await MessageStore.get(chatId, triggerMsg.replyToMessageId)) :
|
||||
triggerMsg.reply_to_message;
|
||||
if (!first) {
|
||||
return parts;
|
||||
}
|
||||
await pushPart(first, false);
|
||||
|
||||
let curId = first.message_id;
|
||||
let curId = isStoredMessage(first) ? first.id : first.message_id;
|
||||
|
||||
while (parts.length < limit) {
|
||||
const cur = await messageDao.getById({chatId: chatId, id: curId});
|
||||
@@ -894,7 +930,7 @@ export function getRuntimeInfo(): RuntimeInfo {
|
||||
return {runtime: "unknown", version: String((process as any).version ?? "")};
|
||||
}
|
||||
|
||||
export type PhotoMaxSize = { width: number, height: number, url: string; unique_file_id: string; };
|
||||
export type PhotoMaxSize = { width: number, height: number, url: string; file_id: string; unique_file_id: string; };
|
||||
|
||||
export async function getPhotoMaxSize(photos: PhotoSize[], target: number = Environment.MAX_PHOTO_SIZE): Promise<PhotoMaxSize | null> {
|
||||
if (!photos) return null;
|
||||
@@ -923,6 +959,7 @@ export async function mapPhotoSizeToMax(size: PhotoSize): Promise<PhotoMaxSize |
|
||||
width: size.width,
|
||||
height: size.height,
|
||||
url: await getFileUrl(size.file_id),
|
||||
file_id: size.file_id,
|
||||
unique_file_id: size.file_unique_id
|
||||
};
|
||||
}
|
||||
@@ -949,3 +986,111 @@ export function ifTrue(exp?: never): boolean {
|
||||
export function boolToEmoji(bool: boolean): string {
|
||||
return bool ? "✅" : "❌";
|
||||
}
|
||||
|
||||
export const albumCache = new Map<string, { messages: Message[], timer: NodeJS.Timeout }>();
|
||||
|
||||
export async function processNewMessage(msg: Message) {
|
||||
console.log("message", msg);
|
||||
|
||||
let storedMsg: StoredMessage | null = null;
|
||||
Promise.all([
|
||||
MessageStore.put(msg).then(r => {
|
||||
storedMsg = r;
|
||||
console.log("storedMsg", storedMsg);
|
||||
}),
|
||||
UserStore.put(msg.from)
|
||||
]
|
||||
).catch(logError);
|
||||
|
||||
if ((msg.new_chat_members?.length || 0 > 0)) {
|
||||
await bot.sendMessage({chat_id: msg.chat.id, text: randomValue(Environment.ANSWERS.invite)}).catch(logError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.left_chat_member && msg.left_chat_member.id !== botUser.id) {
|
||||
await bot.sendMessage({chat_id: msg.chat.id, text: randomValue(Environment.ANSWERS.kick)}).catch(logError);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Environment.MUTED_IDS.has(msg.from.id)) return;
|
||||
|
||||
if (msg.forward_origin) return;
|
||||
|
||||
const groupId = msg.media_group_id;
|
||||
if (groupId) {
|
||||
await new Promise<true>(resolve => {
|
||||
if (!albumCache.has(groupId)) {
|
||||
albumCache.set(groupId, {
|
||||
messages: [msg],
|
||||
timer: setTimeout(async () => {
|
||||
const photos = await processAlbum(groupId);
|
||||
console.log("processedAlbum", photos);
|
||||
|
||||
storedMsg.photoMaxSizeFilePath = photos;
|
||||
await MessageStore.put(storedMsg).catch(logError);
|
||||
resolve(true);
|
||||
}, 1000)
|
||||
});
|
||||
} else {
|
||||
const entry = albumCache.get(groupId);
|
||||
entry.messages.push(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const cmdText = msg.text || msg.caption || "";
|
||||
|
||||
const then = Date.now();
|
||||
|
||||
const cmd = searchChatCommand(chatCommands, cmdText);
|
||||
const executed = await executeChatCommand(cmd, msg, cmdText);
|
||||
|
||||
const now = Date.now();
|
||||
const diff = now - then;
|
||||
console.log("diff", diff);
|
||||
|
||||
if (executed || !cmdText) return;
|
||||
|
||||
const startsWithPrefix = cmdText.toLowerCase().startsWith(Environment.BOT_PREFIX.toLowerCase());
|
||||
const messageWithoutPrefix = cmdText.substring(Environment.BOT_PREFIX.length).trim();
|
||||
|
||||
if (startsWithPrefix && messageWithoutPrefix.length === 0) {
|
||||
const prefixResponse = new PrefixResponse();
|
||||
if (await checkRequirements(prefixResponse, msg)) {
|
||||
await prefixResponse.execute(msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!startsWithPrefix && msg.chat.type !== "private") return;
|
||||
if (msg.chat.type === "private" && !Environment.ADMIN_IDS.has(msg.chat.id)) return;
|
||||
|
||||
const chat = chatCommands.find(e => e instanceof OllamaChat);
|
||||
if (await checkRequirements(chat, msg)) {
|
||||
await chat.executeOllama(msg, startsWithPrefix ? messageWithoutPrefix : cmdText);
|
||||
}
|
||||
}
|
||||
|
||||
async function processAlbum(groupId: string): Promise<string[]> {
|
||||
const entry = albumCache.get(groupId);
|
||||
if (!entry) return;
|
||||
|
||||
const allPhotos = entry.messages
|
||||
.filter(m => m.photo)
|
||||
.map(m => m.photo);
|
||||
|
||||
const allPhotoMaxSizes = await Promise.all(allPhotos.map(photo => getPhotoMaxSize(photo)));
|
||||
const ids = allPhotoMaxSizes.map(p => p.unique_file_id);
|
||||
|
||||
await loadImagesFromFileIds(allPhotoMaxSizes);
|
||||
|
||||
console.log(`Received album ${groupId} with ${ids.length} photos.`);
|
||||
console.log("File IDs:", ids);
|
||||
|
||||
albumCache.delete(groupId);
|
||||
return ids;
|
||||
}
|
||||
|
||||
export function photoPathByUniqueId(uniqueId: string): string {
|
||||
return path.join(Environment.DATA_PATH, "temp", uniqueId + ".jpg");
|
||||
}
|
||||
Reference in New Issue
Block a user