Commit f93f991b authored by nanahira's avatar nanahira

thirdeye

parent 7965d428
......@@ -11,10 +11,10 @@
"dependencies": {
"better-sqlite3": "^7.4.3",
"class-transformer": "^0.4.0",
"koishi-thirdeye": "^8.3.3",
"leven": "3.1",
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"schemastery-gen": "^2.4.2",
"source-map-support": "^0.5.20"
},
"devDependencies": {
......@@ -1264,7 +1264,6 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
"integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
"peer": true,
"dependencies": {
"@types/node": "*"
}
......@@ -1320,7 +1319,6 @@
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
"integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
"peer": true,
"dependencies": {
"@types/connect": "*",
"@types/node": "*"
......@@ -1330,7 +1328,6 @@
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
"integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
"peer": true,
"dependencies": {
"@types/node": "*"
}
......@@ -1338,14 +1335,12 @@
"node_modules/@types/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==",
"peer": true
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
},
"node_modules/@types/cookies": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
"integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
"peer": true,
"dependencies": {
"@types/connect": "*",
"@types/express": "*",
......@@ -1383,7 +1378,6 @@
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
"integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
"peer": true,
"dependencies": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.18",
......@@ -1395,7 +1389,6 @@
"version": "4.17.28",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
"integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
"peer": true,
"dependencies": {
"@types/node": "*",
"@types/qs": "*",
......@@ -1414,14 +1407,12 @@
"node_modules/@types/http-assert": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==",
"peer": true
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
},
"node_modules/@types/http-errors": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==",
"peer": true
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
},
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.4",
......@@ -1466,14 +1457,12 @@
"node_modules/@types/keygrip": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==",
"peer": true
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
},
"node_modules/@types/koa": {
"version": "2.13.4",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
"integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
"peer": true,
"dependencies": {
"@types/accepts": "*",
"@types/content-disposition": "*",
......@@ -1489,7 +1478,6 @@
"version": "8.0.11",
"resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz",
"integrity": "sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==",
"peer": true,
"dependencies": {
"@types/koa": "*"
}
......@@ -1498,7 +1486,6 @@
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
"integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
"peer": true,
"dependencies": {
"@types/koa": "*"
}
......@@ -1512,8 +1499,7 @@
"node_modules/@types/mime": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
"peer": true
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
},
"node_modules/@types/mustache": {
"version": "4.1.2",
......@@ -1535,20 +1521,17 @@
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
"peer": true
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"node_modules/@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"peer": true
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
"node_modules/@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
"integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
"peer": true,
"dependencies": {
"@types/mime": "^1",
"@types/node": "*"
......@@ -5567,6 +5550,39 @@
"node": ">=12.0.0"
}
},
"node_modules/koishi-decorators": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-1.1.1.tgz",
"integrity": "sha512-AaumjnVTT8N7jJ67w16blSez9z+Pi+duuJusheIq3Hmkvx+iRxkpp3w0IvlU69gHqdQRK3Z4qNNC+KrMPDORUg==",
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13",
"typed-reflector": "^1.0.9"
},
"peerDependencies": {
"koishi": "^4.2.1"
}
},
"node_modules/koishi-thirdeye": {
"version": "8.3.3",
"resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-8.3.3.tgz",
"integrity": "sha512-4JI7DZ+0BcF4n+J05Iy0JxaXKLd7IdFC9MgksNaI64+LqXBNJrePRBVPCWkdSpq7UyhQHYxQqCnK15OLAbB+tg==",
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"koishi-decorators": "^1.1.1",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13",
"schemastery": "^2.4.2",
"schemastery-gen": "^2.4.2",
"typed-reflector": "^1.0.9"
},
"peerDependencies": {
"koishi": "^4.2.2"
}
},
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
......@@ -6811,8 +6827,7 @@
"node_modules/schemastery": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.4.2.tgz",
"integrity": "sha512-0sCJuGa7LyAtnoXEVwUKSPSTMfizA0zpK0kX7dzGPLpeLuxgJg7VVyR2KFsfHg+WlqYbUOvoGY7JSNPk5I5uHQ==",
"peer": true
"integrity": "sha512-0sCJuGa7LyAtnoXEVwUKSPSTMfizA0zpK0kX7dzGPLpeLuxgJg7VVyR2KFsfHg+WlqYbUOvoGY7JSNPk5I5uHQ=="
},
"node_modules/schemastery-gen": {
"version": "2.4.2",
......@@ -7684,9 +7699,9 @@
}
},
"node_modules/typed-reflector": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.8.tgz",
"integrity": "sha512-Gc2y1jdXpBrRDhTth80ABcmZjL/4Jmx+GrBf7uvn4BXW4J+kj5V3IjA+GQl/n+3ye7SgoEO6HOiDhac1H+mKgw==",
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.9.tgz",
"integrity": "sha512-Df9KpLcXsSM4/q+iFT/WKU8RxmwUC8POY/7VFL9xgvqh2aaY7o+43n7pUTUVKtimJTkQokKoOVe/B8ouW8tBhA==",
"dependencies": {
"reflect-metadata": "^0.1.13"
}
......@@ -9192,7 +9207,6 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
"integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
"peer": true,
"requires": {
"@types/node": "*"
}
......@@ -9248,7 +9262,6 @@
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
"integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
"peer": true,
"requires": {
"@types/connect": "*",
"@types/node": "*"
......@@ -9258,7 +9271,6 @@
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
"integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
"peer": true,
"requires": {
"@types/node": "*"
}
......@@ -9266,14 +9278,12 @@
"@types/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==",
"peer": true
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
},
"@types/cookies": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
"integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
"peer": true,
"requires": {
"@types/connect": "*",
"@types/express": "*",
......@@ -9311,7 +9321,6 @@
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
"integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
"peer": true,
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.18",
......@@ -9323,7 +9332,6 @@
"version": "4.17.28",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
"integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
"peer": true,
"requires": {
"@types/node": "*",
"@types/qs": "*",
......@@ -9342,14 +9350,12 @@
"@types/http-assert": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==",
"peer": true
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
},
"@types/http-errors": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==",
"peer": true
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
},
"@types/istanbul-lib-coverage": {
"version": "2.0.4",
......@@ -9394,14 +9400,12 @@
"@types/keygrip": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==",
"peer": true
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
},
"@types/koa": {
"version": "2.13.4",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
"integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
"peer": true,
"requires": {
"@types/accepts": "*",
"@types/content-disposition": "*",
......@@ -9417,7 +9421,6 @@
"version": "8.0.11",
"resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz",
"integrity": "sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==",
"peer": true,
"requires": {
"@types/koa": "*"
}
......@@ -9426,7 +9429,6 @@
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
"integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
"peer": true,
"requires": {
"@types/koa": "*"
}
......@@ -9440,8 +9442,7 @@
"@types/mime": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
"peer": true
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
},
"@types/mustache": {
"version": "4.1.2",
......@@ -9463,20 +9464,17 @@
"@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
"peer": true
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
"peer": true
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
"@types/serve-static": {
"version": "1.13.10",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
"integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
"peer": true,
"requires": {
"@types/mime": "^1",
"@types/node": "*"
......@@ -12526,6 +12524,33 @@
"ws": "^8.4.2"
}
},
"koishi-decorators": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-1.1.1.tgz",
"integrity": "sha512-AaumjnVTT8N7jJ67w16blSez9z+Pi+duuJusheIq3Hmkvx+iRxkpp3w0IvlU69gHqdQRK3Z4qNNC+KrMPDORUg==",
"requires": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13",
"typed-reflector": "^1.0.9"
}
},
"koishi-thirdeye": {
"version": "8.3.3",
"resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-8.3.3.tgz",
"integrity": "sha512-4JI7DZ+0BcF4n+J05Iy0JxaXKLd7IdFC9MgksNaI64+LqXBNJrePRBVPCWkdSpq7UyhQHYxQqCnK15OLAbB+tg==",
"requires": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"koishi-decorators": "^1.1.1",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13",
"schemastery": "^2.4.2",
"schemastery-gen": "^2.4.2",
"typed-reflector": "^1.0.9"
}
},
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
......@@ -13453,8 +13478,7 @@
"schemastery": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.4.2.tgz",
"integrity": "sha512-0sCJuGa7LyAtnoXEVwUKSPSTMfizA0zpK0kX7dzGPLpeLuxgJg7VVyR2KFsfHg+WlqYbUOvoGY7JSNPk5I5uHQ==",
"peer": true
"integrity": "sha512-0sCJuGa7LyAtnoXEVwUKSPSTMfizA0zpK0kX7dzGPLpeLuxgJg7VVyR2KFsfHg+WlqYbUOvoGY7JSNPk5I5uHQ=="
},
"schemastery-gen": {
"version": "2.4.2",
......@@ -14068,9 +14092,9 @@
}
},
"typed-reflector": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.8.tgz",
"integrity": "sha512-Gc2y1jdXpBrRDhTth80ABcmZjL/4Jmx+GrBf7uvn4BXW4J+kj5V3IjA+GQl/n+3ye7SgoEO6HOiDhac1H+mKgw==",
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.9.tgz",
"integrity": "sha512-Df9KpLcXsSM4/q+iFT/WKU8RxmwUC8POY/7VFL9xgvqh2aaY7o+43n7pUTUVKtimJTkQokKoOVe/B8ouW8tBhA==",
"requires": {
"reflect-metadata": "^0.1.13"
}
......
......@@ -29,10 +29,10 @@
"dependencies": {
"better-sqlite3": "^7.4.3",
"class-transformer": "^0.4.0",
"koishi-thirdeye": "^8.3.3",
"leven": "3.1",
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"schemastery-gen": "^2.4.2",
"source-map-support": "^0.5.20"
},
"devDependencies": {
......
import { DefineSchema, RegisterSchema } from 'schemastery-gen';
import { Schema } from 'koishi';
import { DefineSchema, RegisterSchema } from 'koishi-thirdeye';
import { YGOProCardLike } from './YGOProCard';
import _ from 'lodash';
import { renderTemplate } from './utility';
......
import 'source-map-support/register';
import { Context } from 'koishi';
import { MyPlugin } from './plugin';
import { YGOCardConfig } from './config';
export * from './plugin';
import sqlite, { Database } from 'better-sqlite3';
import { promises as fs } from 'fs';
import _ from 'lodash';
import { YGOProCard } from './YGOProCard';
import { plainToClass } from 'class-transformer';
import path from 'path';
import { BasePlugin, DefinePlugin, LifecycleEvents } from 'koishi-thirdeye';
export * from './config';
const plugin = new MyPlugin();
export default class ygocard {
static Config: any = plugin.schema;
constructor(ctx: Context, config: Partial<YGOCardConfig>) {
ctx.plugin(plugin, config as YGOCardConfig);
@DefinePlugin({ name: 'ygocard', schema: YGOCardConfig })
export default class YGOCardPlugin
extends BasePlugin<YGOCardConfig>
implements LifecycleEvents {
private dbs: Database[] = [];
private queryInDB(value: string, db: Database) {
const possibleValueNumber = parseInt(value) || 0;
const statement = db.prepare<[number, string, string]>(
"select datas.*,texts.name,texts.desc from datas,texts where datas.id = texts.id and datas.type & 0x4000 = 0 and (datas.alias = 0 or datas.id - datas.alias > 10) and (datas.id = ? or texts.name like ('%' || ? || '%') or texts.desc like ('%' || ? || '%'))",
);
return statement
.all(possibleValueNumber, value, value)
.map((obj) => plainToClass(YGOProCard, obj));
}
private queryInAllDBs(value: string, matchCount?: number) {
return _.sortBy(
_.uniqBy(
_.flatten(this.dbs.map((db) => this.queryInDB(value, db))),
(c) => c.id,
),
(c) => c.getDistanceFrom(value),
).slice(0, matchCount || this.config.matchCount);
}
private async loadDBs() {
const allDatabaseFiles = _.flatten(
await Promise.all(
this.config.databasePaths.map(async (p) =>
(await fs.readdir(p))
.filter((f) => f.endsWith('.cdb'))
.map((f) => path.join(p, f)),
),
),
);
this.ctx
.logger('ygocard')
.info(`Will load cards from ${allDatabaseFiles.length} databases.`);
this.dbs = allDatabaseFiles.map((dbFile) =>
sqlite(dbFile, {
readonly: true,
fileMustExist: true,
}),
);
}
onConnect() {
this.loadDBs();
}
onDisconnect() {
this.dbs.forEach((db) => db.close());
}
onApply() {
const ctx = this.ctx;
ctx
.command(
`${this.config.commandName} <cardQuery:string>`,
'查询 YGOPro 卡片',
)
.option('count', '-c <count:posint>', {
fallback: this.config.matchCount,
})
.usage(`使用 ${this.config.commandName} 卡号或关键词 搜索卡片。`)
.example(
`${this.config.commandName} 10000 搜索卡号为 10000 的卡片。 ${this.config.commandName} 青眼白龙 搜索卡名或描述中包含『青眼白龙』的卡片。`,
)
.action(async ({ session, options }, value) => {
const cards = this.queryInAllDBs(value, options.count);
if (!cards.length) {
return `没有找到卡片 ${value} 。`;
}
if (cards.length === 1) {
return cards[0].getDisplayString(this.config);
}
await session.send(
`卡片 ${value} 匹配下列结果:\n--------------------\n${cards
.map((c, i) => `${i + 1}\t${c.getIdAndName()}`)
.join(
'\n',
)}\n--------------------\n输入编号或卡片密码查询对应的卡片。`,
);
const reply = await session.prompt();
if (!reply) {
return;
}
const replyNumber = parseInt(reply);
const card =
cards[replyNumber - 1] ||
cards.find((c) => c.id === replyNumber) ||
cards.find((c) => c.name === value) ||
cards.find((c) => c.name.includes(value)) ||
cards.find((c) => c.desc.includes(value));
if (!card) {
return '没有找到卡片。';
}
return card.getDisplayString(this.config);
});
}
}
import 'source-map-support/register';
import { Context } from 'koishi';
import { YGOCardConfig } from './config';
import sqlite, { Database } from 'better-sqlite3';
import { promises as fs } from 'fs';
import _ from 'lodash';
import { YGOProCard } from './YGOProCard';
import { plainToClass } from 'class-transformer';
import path from 'path';
export type PluginConfig = Partial<YGOCardConfig>;
export class MyPlugin {
private config: YGOCardConfig;
private ctx: Context;
private dbs: Database[] = [];
name = 'ygocard-main';
schema = YGOCardConfig;
private queryInDB(value: string, db: Database) {
const possibleValueNumber = parseInt(value) || 0;
const statement = db.prepare<[number, string, string]>(
"select datas.*,texts.name,texts.desc from datas,texts where datas.id = texts.id and datas.type & 0x4000 = 0 and (datas.alias = 0 or datas.id - datas.alias > 10) and (datas.id = ? or texts.name like ('%' || ? || '%') or texts.desc like ('%' || ? || '%'))",
);
return statement
.all(possibleValueNumber, value, value)
.map((obj) => plainToClass(YGOProCard, obj));
}
private queryInAllDBs(value: string, matchCount?: number) {
return _.sortBy(
_.uniqBy(
_.flatten(this.dbs.map((db) => this.queryInDB(value, db))),
(c) => c.id,
),
(c) => c.getDistanceFrom(value),
).slice(0, matchCount || this.config.matchCount);
}
private async loadDBs() {
const allDatabaseFiles = _.flatten(
await Promise.all(
this.config.databasePaths.map(async (p) =>
(await fs.readdir(p))
.filter((f) => f.endsWith('.cdb'))
.map((f) => path.join(p, f)),
),
),
);
this.ctx
.logger('ygocard')
.info(`Will load cards from ${allDatabaseFiles.length} databases.`);
this.dbs = allDatabaseFiles.map((dbFile) =>
sqlite(dbFile, {
readonly: true,
fileMustExist: true,
}),
);
}
async apply(ctx: Context, config: YGOCardConfig) {
this.ctx = ctx;
this.config = config;
ctx.on('ready', () => this.loadDBs());
ctx.on('dispose', () => {
this.dbs.forEach((db) => db.close());
});
ctx
.command(
`${this.config.commandName} <cardQuery:string>`,
'查询 YGOPro 卡片',
)
.option('count', '-c <count:posint>', {
fallback: this.config.matchCount,
})
.usage(`使用 ${this.config.commandName} 卡号或关键词 搜索卡片。`)
.example(
`${this.config.commandName} 10000 搜索卡号为 10000 的卡片。 ${this.config.commandName} 青眼白龙 搜索卡名或描述中包含『青眼白龙』的卡片。`,
)
.action(async ({ session, options }, value) => {
const cards = this.queryInAllDBs(value, options.count);
if (!cards.length) {
return `没有找到卡片 ${value} 。`;
}
if (cards.length === 1) {
return cards[0].getDisplayString(this.config);
}
await session.send(
`卡片 ${value} 匹配下列结果:\n--------------------\n${cards
.map((c, i) => `${i + 1}\t${c.getIdAndName()}`)
.join(
'\n',
)}\n--------------------\n输入编号或卡片密码查询对应的卡片。`,
);
const reply = await session.prompt();
if (!reply) {
return;
}
const replyNumber = parseInt(reply);
const card =
cards[replyNumber - 1] ||
cards.find((c) => c.id === replyNumber) ||
cards.find((c) => c.name === value) ||
cards.find((c) => c.name.includes(value)) ||
cards.find((c) => c.desc.includes(value));
if (!card) {
return '没有找到卡片。';
}
return card.getDisplayString(this.config);
});
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment