From 2a40e4557e26509d00aad4a7ab25f4daf606577e Mon Sep 17 00:00:00 2001 From: KT Date: Wed, 7 Feb 2024 19:46:20 +0800 Subject: [PATCH 1/8] chore: Update packages --- Pipfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 42909a3..e53af23 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -287,7 +287,7 @@ "genshin": { "git": "https://github.com/KT-Yeh/genshin.py", "markers": "python_version >= '3.8'", - "ref": "e1e68d3620f5159be587e22acc423cabe1573ceb" + "ref": "454ac3400aaa5cbde2fd381cae9c348356a72762" }, "genshinpyrail": { "git": "https://github.com/KT-Yeh/GenshinPyRail.git", @@ -715,11 +715,11 @@ }, "sentry-sdk": { "hashes": [ - "sha256:34ad8cfc9b877aaa2a8eb86bfe5296a467fffe0619b931a05b181c45f6da59bf", - "sha256:78575620331186d32f34b7ece6edea97ce751f58df822547d3ab85517881a27a" + "sha256:696ef61a323a207e6a20b018ddc6591adb81c671434c88d1a4f2e95ffa75556c", + "sha256:c98c8e9bb4dc8ff1e67473caf6467acfccf915dadcc26d0efb0d6791a8652610" ], "index": "pypi", - "version": "==1.40.0" + "version": "==1.40.2" }, "six": { "hashes": [ @@ -1028,12 +1028,12 @@ }, "ipykernel": { "hashes": [ - "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f", - "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f" + "sha256:1547352b32da95a2761011a8dac2af930c26a0703dfa07690d16b7d74dac0ba1", + "sha256:e5dfba210fc9da74a5dae8fa6c41f816e11bd18d10381b2517d9a0d57cc987c4" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==6.29.0" + "version": "==6.29.1" }, "ipython": { "hashes": [ From ec7c3b498d961533d36e950f6bd4d8ebd681560e Mon Sep 17 00:00:00 2001 From: KT Date: Tue, 13 Feb 2024 19:32:58 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=E6=98=9F=E9=90=B5=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E6=AB=83=E5=A2=9E=E5=8A=A0=E5=9C=96=E7=89=87=E9=A1=AF?= =?UTF-8?q?=E7=A4=BA=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 星鐵展示櫃增加圖片顯示 - mihomo api 版本從 v1 更換為 v2 --- Pipfile | 2 + Pipfile.lock | 236 +++++++++--------- cogs/showcase/ui_starrail.py | 49 ++-- ...72\346\253\203\350\263\207\346\226\231.py" | 23 ++ database/models.py | 10 +- star_rail/showcase.py | 125 +++++++--- 6 files changed, 275 insertions(+), 170 deletions(-) create mode 100644 "database/alembic/versions/2ba9f9c494d7_\346\270\205\347\251\272\346\230\237\347\251\271\351\220\265\351\201\223\345\261\225\347\244\272\346\253\203\350\263\207\346\226\231.py" diff --git a/Pipfile b/Pipfile index 4936584..6a90c0c 100644 --- a/Pipfile +++ b/Pipfile @@ -19,6 +19,8 @@ sqlalchemy = {version = "~=2.0.16", extras = ["asyncio"]} python-dotenv = "~=1.0.0" alembic = "~=1.11.1" genshinpyrail = {ref = "gdb", git = "https://github.com/KT-Yeh/GenshinPyRail.git"} +honkairail = "~=1.1" +hsrcard = {ref = "gdb", git = "https://github.com/KT-Yeh/HSRCard.git"} [dev-packages] black = "*" diff --git a/Pipfile.lock b/Pipfile.lock index e53af23..457c3d0 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "547f42a8f6569591590a6dcebbf1171d17eff3be25a1b90a7783ecde68cd9025" + "sha256": "5d5fea8c64b02b7f7cd28c37be219bae82f11b60d00ee4e61e250700ac24a362" }, "pipfile-spec": 6, "requires": { @@ -112,7 +112,6 @@ "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.19.0" }, "alembic": { @@ -121,7 +120,6 @@ "sha256:d6c96c2482740592777c400550a523bc7a9aada4e210cae2e733354ddae6f6f8" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.11.3" }, "astunparse": { @@ -153,7 +151,6 @@ "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], "index": "pypi", - "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, "braceexpand": { @@ -193,12 +190,10 @@ "sha256:9da4679fc3cb10c64b388284700dc998663e0e57328283bbfcfc2525ec5960a6" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==2.3.2" }, - "enkanetwork.py": { + "enkanetwork-py": { "git": "https://github.com/KT-Yeh/EnkaNetwork.py", - "markers": "python_version >= '3.6'", "ref": "d86f3d4ac6aa52c42413f55ae3e9b20e39c3d7d5" }, "frozenlist": { @@ -286,12 +281,10 @@ }, "genshin": { "git": "https://github.com/KT-Yeh/genshin.py", - "markers": "python_version >= '3.8'", "ref": "454ac3400aaa5cbde2fd381cae9c348356a72762" }, "genshinpyrail": { "git": "https://github.com/KT-Yeh/GenshinPyRail.git", - "markers": "python_version >= '3.7' and python_version < '4.0'", "ref": "92404351659a8c50f6aa23e5768106790ad7bf43" }, "greenlet": { @@ -358,6 +351,18 @@ "markers": "platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==3.0.3" }, + "honkairail": { + "hashes": [ + "sha256:348f5ba04884e1c6daccc37d71a8122c66539c700278ad28036e11a88fe91882", + "sha256:84b170cebd88e926bb8673b5f0bb3575f4bb7febb158a2369e74c8c3c451b551" + ], + "index": "pypi", + "version": "==1.1.4" + }, + "hsrcard": { + "git": "https://github.com/KT-Yeh/HSRCard.git", + "ref": "c5a95feb8389db0b31375e695acf0de5b1562784" + }, "idna": { "hashes": [ "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", @@ -379,7 +384,6 @@ "sha256:87f34942ee44865f5ce08e36723b7c74a313d8a13a4db8a6b7cc12618cc3496c" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==2.5.2" }, "mako": { @@ -458,7 +462,6 @@ }, "mihomo": { "git": "https://github.com/KT-Yeh/mihomo", - "markers": "python_version >= '3.8' and python_version < '4.0'", "ref": "24011870ea34d760b40528cf2642dae07369501d" }, "multidict": { @@ -627,7 +630,6 @@ "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==9.5.0" }, "prometheus-client": { @@ -636,7 +638,6 @@ "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.19.0" }, "psutil": { @@ -659,7 +660,6 @@ "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==5.9.8" }, "pydantic": { @@ -710,16 +710,15 @@ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.0.1" }, "sentry-sdk": { "hashes": [ - "sha256:696ef61a323a207e6a20b018ddc6591adb81c671434c88d1a4f2e95ffa75556c", - "sha256:c98c8e9bb4dc8ff1e67473caf6467acfccf915dadcc26d0efb0d6791a8652610" + "sha256:657abae98b0050a0316f0873d7149f951574ae6212f71d2e3a1c4c88f62d6456", + "sha256:ac5cf56bb897ec47135d239ddeedf7c1c12d406fb031a4c0caa07399ed014d7e" ], "index": "pypi", - "version": "==1.40.2" + "version": "==1.40.4" }, "six": { "hashes": [ @@ -742,58 +741,58 @@ "asyncio" ], "hashes": [ - "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9", - "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d", - "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e", - "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669", - "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d", - "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5", - "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002", - "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e", - "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd", - "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215", - "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24", - "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39", - "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62", - "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900", - "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf", - "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735", - "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4", - "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23", - "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9", - "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c", - "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de", - "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7", - "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625", - "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f", - "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a", - "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4", - "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643", - "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018", - "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9", - "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5", - "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08", - "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3", - "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3", - "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed", - "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95", - "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6", - "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0", - "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84", - "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f", - "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d", - "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2", - "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5", - "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570", - "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7", - "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c", - "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf", - "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3", - "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed", - "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5" + "sha256:02a4f954ccb17bd8cff56662efc806c5301508233dc38d0253a5fdb2f33ca3ba", + "sha256:06ed4d6bb2365222fb9b0a05478a2d23ad8c1dd874047a9ae1ca1d45f18a255e", + "sha256:1128b2cdf49107659f6d1f452695f43a20694cc9305a86e97b70793a1c74eeb4", + "sha256:1a870e6121a052f826f7ae1e4f0b54ca4c0ccd613278218ca036fa5e0f3be7df", + "sha256:379af901ceb524cbee5e15c1713bf9fd71dc28053286b7917525d01b938b9628", + "sha256:3f06afe8e96d7f221cc0b59334dc400151be22f432785e895e37030579d253c3", + "sha256:3fc557f5402206c18ec3d288422f8e5fa764306d49f4efbc6090a7407bf54938", + "sha256:4b4d848b095173e0a9e377127b814490499e55f5168f617ae2c07653c326b9d1", + "sha256:4f57af0866f6629eae2d24d022ba1a4c1bac9b16d45027bbfcda4c9d5b0d8f26", + "sha256:4fc0628d2026926404dabc903dc5628f7d936a792aa3a1fc54a20182df8e2172", + "sha256:5310958d08b4bafc311052be42a3b7d61a93a2bf126ddde07b85f712e7e4ac7b", + "sha256:56524d767713054f8758217b3a811f6a736e0ae34e7afc33b594926589aa9609", + "sha256:5901eed6d0e23ca4b04d66a561799d4f0fe55fcbfc7ca203bb8c3277f442085b", + "sha256:651d10fdba7984bf100222d6e4acc496fec46493262b6170be1981ef860c6184", + "sha256:691d68a4fca30c9a676623d094b600797699530e175b6524a9f57e3273f5fa8d", + "sha256:6d68e6b507a3dd20c0add86ac0a0ca061d43c9a0162a122baa5fe952f14240f1", + "sha256:6e25f029e8ad6d893538b5abe8537e7f09e21d8e96caee46a7e2199f3ddd77b0", + "sha256:750d1ef39d50520527c45c309c3cb10bbfa6131f93081b4e93858abb5ece2501", + "sha256:79a74a4ca4310c812f97bf0f13ce00ed73c890954b5a20b32484a9ab60e567e9", + "sha256:79e629df3f69f849a1482a2d063596b23e32036b83547397e68725e6e0d0a9ab", + "sha256:84d377645913d47f0dc802b415bcfe7fb085d86646a12278d77c12eb75b5e1b4", + "sha256:872f2907ade52601a1e729e85d16913c24dc1f6e7c57d11739f18dcfafde29db", + "sha256:8b39462c9588d4780f041e1b84d2ba038ac01c441c961bbee622dd8f53dec69f", + "sha256:8cbeb0e49b605cd75f825fb9239a554803ef2bef1a7b2a8b428926ed518b6b63", + "sha256:8f95ede696ab0d7328862d69f29b643d35b668c4f3619cb2f0281adc16e64c1b", + "sha256:94a78f56ea13f4d6e9efcd2a2d08cc13531918e0516563f6303c4ad98c81e21d", + "sha256:98f4d0d2bda2921af5b0c2ca99207cdab00f2922da46a6336c62c8d6814303a7", + "sha256:996b41c38e34a980e9f810d6e2709a3196e29ee34e46e3c16f96c63da10a9da1", + "sha256:99a9a8204b8937aa72421e31c493bfc12fd063a8310a0522e5a9b98e6323977c", + "sha256:a481cc2eec83776ff7b6bb12c8e85d0378af0e2ec4584ac3309365a2a380c64b", + "sha256:a678f728fb075e74aaa7fdc27f8af8f03f82d02e7419362cc8c2a605c16a4114", + "sha256:a9846ffee3283cff4ec476e7ee289314290fcb2384aab5045c6f481c5c4d011f", + "sha256:b39503c3a56e1b2340a7d09e185ddb60b253ad0210877a9958ac64208eb23674", + "sha256:b7ee16afd083bb6bb5ab3962ac7f0eafd1d196c6399388af35fef3d1c6d6d9bb", + "sha256:ba46fa770578b3cf3b5b77dadb7e94fda7692dd4d1989268ef3dcb65f31c40a3", + "sha256:c2d8a2c68b279617f13088bdc0fc0e9b5126f8017f8882ff08ee41909fab0713", + "sha256:caa79a6caeb4a3cc4ddb9aba9205c383f5d3bcb60d814e87e74570514754e073", + "sha256:d25fe55aab9b20ae4a9523bb269074202be9d92a145fcc0b752fff409754b5f6", + "sha256:dc32ecf643c4904dd413e6a95a3f2c8a89ccd6f15083e586dcf8f42eb4e317ae", + "sha256:e1a532bc33163fb19c4759a36504a23e63032bc8d47cee1c66b0b70a04a0957b", + "sha256:e1bcd8fcb30305e27355d553608c2c229d3e589fb7ff406da7d7e5d50fa14d0d", + "sha256:e70cce65239089390c193a7b0d171ce89d2e3dedf797f8010031b2aa2b1e9c80", + "sha256:ec3717c1efee8ad4b97f6211978351de3abe1e4b5f73e32f775c7becec021c5c", + "sha256:ed4667d3d5d6e203a271d684d5b213ebcd618f7a8bc605752a8865eb9e67a79a", + "sha256:f2efbbeb18c0e1c53b670a46a009fbde7b58e05b397a808c7e598532b17c6f4b", + "sha256:f75ac12d302205e60f77f46bd162d40dc37438f1f8db160d2491a78b19a0bd61", + "sha256:fab1bb909bd24accf2024a69edd4f885ded182c079c4dbcd515b4842f86b07cb", + "sha256:fb97a9b93b953084692a52a7877957b7a88dfcedc0c5652124f5aebf5999f7fe", + "sha256:fd133afb7e6c59fad365ffa97fb06b1001f88e29e1de351bef3d2b1224e2f132" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.25" + "index": "pypi", + "version": "==2.0.26" }, "typing-extensions": { "hashes": [ @@ -926,32 +925,31 @@ }, "black": { "hashes": [ - "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8", - "sha256:07204d078e25327aad9ed2c64790d681238686bce254c910de640c7cc4fc3aa6", - "sha256:08b34e85170d368c37ca7bf81cf67ac863c9d1963b2c1780c39102187ec8dd62", - "sha256:1a95915c98d6e32ca43809d46d932e2abc5f1f7d582ffbe65a5b4d1588af7445", - "sha256:2588021038bd5ada078de606f2a804cadd0a3cc6a79cb3e9bb3a8bf581325a4c", - "sha256:2fa6a0e965779c8f2afb286f9ef798df770ba2b6cee063c650b96adec22c056a", - "sha256:34afe9da5056aa123b8bfda1664bfe6fb4e9c6f311d8e4a6eb089da9a9173bf9", - "sha256:3897ae5a21ca132efa219c029cce5e6bfc9c3d34ed7e892113d199c0b1b444a2", - "sha256:40657e1b78212d582a0edecafef133cf1dd02e6677f539b669db4746150d38f6", - "sha256:48b5760dcbfe5cf97fd4fba23946681f3a81514c6ab8a45b50da67ac8fbc6c7b", - "sha256:5242ecd9e990aeb995b6d03dc3b2d112d4a78f2083e5a8e86d566340ae80fec4", - "sha256:5cdc2e2195212208fbcae579b931407c1fa9997584f0a415421748aeafff1168", - "sha256:5d7b06ea8816cbd4becfe5f70accae953c53c0e53aa98730ceccb0395520ee5d", - "sha256:7258c27115c1e3b5de9ac6c4f9957e3ee2c02c0b39222a24dc7aa03ba0e986f5", - "sha256:854c06fb86fd854140f37fb24dbf10621f5dab9e3b0c29a690ba595e3d543024", - "sha256:a21725862d0e855ae05da1dd25e3825ed712eaaccef6b03017fe0853a01aa45e", - "sha256:a83fe522d9698d8f9a101b860b1ee154c1d25f8a82ceb807d319f085b2627c5b", - "sha256:b3d64db762eae4a5ce04b6e3dd745dcca0fb9560eb931a5be97472e38652a161", - "sha256:e298d588744efda02379521a19639ebcd314fba7a49be22136204d7ed1782717", - "sha256:e2c8dfa14677f90d976f68e0c923947ae68fa3961d61ee30976c388adc0b02c8", - "sha256:ecba2a15dfb2d97105be74bbfe5128bc5e9fa8477d8c46766505c1dda5883aac", - "sha256:fc1ec9aa6f4d98d022101e015261c056ddebe3da6a8ccfc2c792cbe0349d48b7" + "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8", + "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8", + "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd", + "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9", + "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31", + "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92", + "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f", + "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29", + "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4", + "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693", + "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218", + "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a", + "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23", + "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0", + "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982", + "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894", + "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540", + "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430", + "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b", + "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2", + "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6", + "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.1.1" + "version": "==24.2.0" }, "click": { "hashes": [ @@ -971,27 +969,31 @@ }, "debugpy": { "hashes": [ - "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332", - "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0", - "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f", - "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa", - "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6", - "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637", - "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6", - "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8", - "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb", - "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b", - "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4", - "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153", - "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f", - "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd", - "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595", - "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926", - "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e", - "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada" + "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb", + "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146", + "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8", + "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242", + "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0", + "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741", + "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539", + "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23", + "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3", + "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39", + "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd", + "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9", + "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace", + "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42", + "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0", + "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7", + "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e", + "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234", + "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98", + "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703", + "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42", + "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099" ], "markers": "python_version >= '3.8'", - "version": "==1.8.0" + "version": "==1.8.1" }, "decorator": { "hashes": [ @@ -1023,17 +1025,15 @@ "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==7.0.0" }, "ipykernel": { "hashes": [ - "sha256:1547352b32da95a2761011a8dac2af930c26a0703dfa07690d16b7d74dac0ba1", - "sha256:e5dfba210fc9da74a5dae8fa6c41f816e11bd18d10381b2517d9a0d57cc987c4" + "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0", + "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.29.1" + "version": "==6.29.2" }, "ipython": { "hashes": [ @@ -1114,7 +1114,6 @@ "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.8.0" }, "mypy-extensions": { @@ -1201,7 +1200,6 @@ "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==5.9.8" }, "ptyprocess": { diff --git a/cogs/showcase/ui_starrail.py b/cogs/showcase/ui_starrail.py index cc67796..98375a7 100644 --- a/cogs/showcase/ui_starrail.py +++ b/cogs/showcase/ui_starrail.py @@ -1,4 +1,4 @@ -from typing import Any, Callable +from typing import Any import discord import sentry_sdk @@ -24,7 +24,7 @@ def __init__(self, showcase: Showcase) -> None: discord.SelectOption( label=f"★{character.rarity} Lv.{character.level} {character.name}", value=str(i), - emoji=emoji.starrail_elements.get(character.element), + emoji=emoji.starrail_elements.get(character.element.name), ) ) options.append(discord.SelectOption(label="刪除角色快取資料", value="-2", emoji="❌")) @@ -33,9 +33,10 @@ def __init__(self, showcase: Showcase) -> None: async def callback(self, interaction: discord.Interaction) -> None: index = int(self.values[0]) if index >= 0: # 角色資料 - embed = self.showcase.get_character_stat_embed(index) - await interaction.response.edit_message( - embed=embed, view=ShowcaseView(self.showcase, index) + await interaction.response.defer() + embed, file = await self.showcase.get_character_card_embed_file(index) + await interaction.edit_original_response( + embed=embed, view=ShowcaseView(self.showcase, index), attachments=[file] ) elif index == -1: # 玩家資料一覽 embed = self.showcase.get_player_overview_embed() @@ -66,15 +67,34 @@ async def callback(self, interaction: discord.Interaction) -> None: class ShowcaseButton(discord.ui.Button): """角色展示櫃按鈕""" - def __init__(self, label: str, function: Callable[..., discord.Embed], *args, **kwargs): + def __init__(self, label: str, showcase: Showcase, chatacter_index: int): super().__init__(style=discord.ButtonStyle.primary, label=label) - self.callback_func = function - self.callback_args = args - self.callback_kwargs = kwargs + self.label = label + self.showcase = showcase + self.character_index = chatacter_index async def callback(self, interaction: discord.Interaction) -> Any: - embed = self.callback_func(*self.callback_args, **self.callback_kwargs) - await interaction.response.edit_message(embed=embed, attachments=[]) + match self.label: + case "圖片": + await interaction.response.defer() + try: + embed, file = await self.showcase.get_character_card_embed_file( + self.character_index + ) + except Exception: + embed = self.showcase.get_character_stat_embed(self.character_index) + await interaction.edit_original_response(embed=embed, attachments=[]) + else: + await interaction.edit_original_response(embed=embed, attachments=[file]) + case "面板": + embed = self.showcase.get_character_stat_embed(self.character_index) + await interaction.response.edit_message(embed=embed, attachments=[]) + case "遺器": + embed = self.showcase.get_relic_stat_embed(self.character_index) + await interaction.response.edit_message(embed=embed, attachments=[]) + case "詞條": + embed = self.showcase.get_relic_score_embed(self.character_index) + await interaction.response.edit_message(embed=embed, attachments=[]) class ShowcaseView(discord.ui.View): @@ -83,9 +103,10 @@ class ShowcaseView(discord.ui.View): def __init__(self, showcase: Showcase, character_index: int | None = None): super().__init__(timeout=config.discord_view_long_timeout) if character_index is not None: - self.add_item(ShowcaseButton("面板", showcase.get_character_stat_embed, character_index)) - self.add_item(ShowcaseButton("遺器", showcase.get_relic_stat_embed, character_index)) - self.add_item(ShowcaseButton("詞條", showcase.get_relic_score_embed, character_index)) + self.add_item(ShowcaseButton("圖片", showcase, character_index)) + self.add_item(ShowcaseButton("面板", showcase, character_index)) + self.add_item(ShowcaseButton("遺器", showcase, character_index)) + self.add_item(ShowcaseButton("詞條", showcase, character_index)) if len(showcase.data.characters) > 0: self.add_item(ShowcaseCharactersDropdown(showcase)) diff --git "a/database/alembic/versions/2ba9f9c494d7_\346\270\205\347\251\272\346\230\237\347\251\271\351\220\265\351\201\223\345\261\225\347\244\272\346\253\203\350\263\207\346\226\231.py" "b/database/alembic/versions/2ba9f9c494d7_\346\270\205\347\251\272\346\230\237\347\251\271\351\220\265\351\201\223\345\261\225\347\244\272\346\253\203\350\263\207\346\226\231.py" new file mode 100644 index 0000000..dbca835 --- /dev/null +++ "b/database/alembic/versions/2ba9f9c494d7_\346\270\205\347\251\272\346\230\237\347\251\271\351\220\265\351\201\223\345\261\225\347\244\272\346\253\203\350\263\207\346\226\231.py" @@ -0,0 +1,23 @@ +"""清空星穹鐵道展示櫃資料 + +Revision ID: 2ba9f9c494d7 +Revises: 5d2af112b1f5 +Create Date: 2024-02-13 14:59:36.015068 + +""" + +from alembic import op + +# revision identifiers, used by Alembic. +revision = "2ba9f9c494d7" +down_revision = "5d2af112b1f5" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute("DELETE FROM starrail_showcases") + + +def downgrade() -> None: + pass diff --git a/database/models.py b/database/models.py index 01d5327..1799bd7 100644 --- a/database/models.py +++ b/database/models.py @@ -5,7 +5,7 @@ import genshin import sqlalchemy -from mihomo import StarrailInfoParsedV1 +from mihomo import StarrailInfoParsed from sqlalchemy.orm import DeclarativeBase, Mapped, MappedAsDataclass, mapped_column from .dataclass import spiral_abyss @@ -326,14 +326,14 @@ class StarrailShowcase(Base): _raw_data: Mapped[bytes] """展示櫃 bytes 資料""" - def __init__(self, uid: int, data: StarrailInfoParsedV1): + def __init__(self, uid: int, data: StarrailInfoParsed): """初始化星穹鐵道展示櫃資料表的物件。 Parameters: ------ uid: `int` 星穹鐵道 UID。 - data: `StarrailInfoParsedV1` + data: `StarrailInfoParsed` Mihomo API 資料。 """ json_str = data.json(by_alias=True) @@ -341,7 +341,7 @@ def __init__(self, uid: int, data: StarrailInfoParsedV1): self._raw_data = zlib.compress(json_str.encode("utf-8"), level=5) @property - def data(self) -> StarrailInfoParsedV1: + def data(self) -> StarrailInfoParsed: """Mihomo API 資料""" data = zlib.decompress(self._raw_data).decode("utf-8") - return StarrailInfoParsedV1.parse_raw(data) + return StarrailInfoParsed.parse_raw(data) diff --git a/star_rail/showcase.py b/star_rail/showcase.py index c120fe3..dc43011 100644 --- a/star_rail/showcase.py +++ b/star_rail/showcase.py @@ -1,5 +1,11 @@ +import io +import json +from typing import Tuple + import discord -from mihomo import MihomoAPI, StarrailInfoParsedV1 +from honkairail.src.tools.modalV2 import StarRailApiDataV2 +from hsrcard.hsr import HonkaiCard +from mihomo import MihomoAPI, StarrailInfoParsed from mihomo import tools as mihomo_tools from database import Database, StarrailShowcase @@ -11,7 +17,7 @@ class Showcase: def __init__(self, uid: int) -> None: self.uid = uid self.client = MihomoAPI() - self.data: StarrailInfoParsedV1 + self.data: StarrailInfoParsed self.is_cached_data: bool = False async def load_data(self) -> None: @@ -21,11 +27,11 @@ async def load_data(self) -> None: srshowcase = await Database.select_one( StarrailShowcase, StarrailShowcase.uid.is_(self.uid) ) - cached_data: StarrailInfoParsedV1 | None = None + cached_data: StarrailInfoParsed | None = None if srshowcase: cached_data = srshowcase.data try: - new_data = await self.client.fetch_user_v1(self.uid) + new_data = await self.client.fetch_user(self.uid) except Exception as e: # 無法從 API 取得時,改用資料庫資料,若兩者都沒有則拋出錯誤 if cached_data is None: @@ -43,21 +49,19 @@ def get_player_overview_embed(self) -> discord.Embed: """取得玩家基本資料的嵌入訊息""" player = self.data.player - player_details = self.data.player_details description = ( f"「{player.signature}」\n" f"開拓等級:{player.level}\n" - f"邂逅角色:{player_details.characters}\n" - f"達成成就:{player_details.achievements}\n" - f"模擬宇宙:第 {player_details.simulated_universes} 世界通過\n" + f"邂逅角色:{player.characters}\n" + f"達成成就:{player.achievements}\n" ) if self.is_cached_data is True: description += "(目前無法連接 API,顯示的為快取資料)\n" embed = discord.Embed(title=player.name, description=description) - embed.set_thumbnail(url=self.client.get_icon_url(player.icon)) + embed.set_thumbnail(url=self.client.get_icon_url(player.avatar.icon)) if len(self.data.characters) > 0: icon = self.data.characters[0].portrait @@ -67,6 +71,31 @@ def get_player_overview_embed(self) -> discord.Embed: return embed + async def get_character_card_embed_file( + self, index: int + ) -> Tuple[discord.Embed, discord.File]: + """取得角色的卡片資料""" + + embed = self.get_default_embed(index) + embed.set_thumbnail(url=None) + + data_dict = self.data.dict(by_alias=True) + data_dict["player"]["space_info"] = {} + data_hsrcard = StarRailApiDataV2.parse_raw(json.dumps(data_dict, ensure_ascii=False)) + + async with HonkaiCard(lang="cht") as card_creater: + result = await card_creater.creat(self.uid, data_hsrcard, index) + image = result.card[0].card + + fp = io.BytesIO() + image = image.convert("RGB") + image.save(fp, "jpeg", optimize=True, quality=90) + fp.seek(0) + + embed.set_image(url="attachment://image.jpeg") + file = discord.File(fp, "image.jpeg") + return (embed, file) + def get_character_stat_embed(self, index: int) -> discord.Embed: """取得角色屬性資料的嵌入訊息""" @@ -91,20 +120,43 @@ def get_character_stat_embed(self, index: int) -> discord.Embed: embed.add_field( name="技能", value="\n".join( - f"{trace.type}:Lv. {trace.level}" + f"{trace.type_text}:Lv. {trace.level}" for trace in character.traces - if trace.type != "秘技" + if trace.type_text != "" and trace.type_text != "秘技" ), inline=False, ) # 人物屬性 + attr_dict = { + "生命值": [0.0, 0.0], + "攻擊力": [0.0, 0.0], + "防禦力": [0.0, 0.0], + "速度": [0.0, 0.0], + "暴擊率": [5.0, 0.0], + "暴擊傷害": [50.0, 0.0], + "能量恢復效率": [100.0, 0.0], + } + for stat in character.attributes: + if stat.name not in attr_dict: + attr_dict[stat.name] = [0.0, 0.0] + attr_dict[stat.name][0] += stat.value * 100 if stat.is_percent else stat.value + + for stat in character.additions: + if stat.name not in attr_dict: + attr_dict[stat.name] = [0.0, 0.0] + attr_dict[stat.name][1] += stat.value * 100 if stat.is_percent else stat.value + + # 將傷害提高應用到所有屬性的傷害提高 + if "傷害提高" in attr_dict: + v = attr_dict["傷害提高"][0] + attr_dict["傷害提高"][1] + del attr_dict["傷害提高"] + for key in attr_dict: + if "傷害提高" in key: + attr_dict[key][1] += v + value = "" - for stat in character.stats: - if stat.addition is not None: - total = int(stat.base) + int(stat.addition) - value += f"{stat.name}:{total} ({stat.base} +{stat.addition})\n" - else: - value += f"{stat.name}:{stat.base}\n" + for k, v in attr_dict.items(): + value += f"{k}:{round(v[0] + v[1], 1)}\n" embed.add_field(name="屬性面板", value=value, inline=False) return embed @@ -122,11 +174,13 @@ def get_relic_stat_embed(self, index: int) -> discord.Embed: for relic in character.relics: # 主詞條 name = ( - relic.main_property.name.removesuffix("傷害提高").removesuffix("效率").removesuffix("加成") + relic.main_affix.name.removesuffix("傷害提高") + .removesuffix("效率") + .removesuffix("加成") ) - value = f"★{relic.rarity}{name}+{relic.main_property.value}\n" - for prop in relic.sub_property: - value += f"{prop.name}+{prop.value}\n" + value = f"★{relic.rarity}{name}+{relic.main_affix.displayed_value}\n" + for prop in relic.sub_affixes: + value += f"{prop.name}+{prop.displayed_value}\n" embed.add_field(name=relic.name, value=value) @@ -156,18 +210,26 @@ def get_relic_score_embed(self, index: int) -> discord.Embed: } crit_value: float = 0.0 # 雙爆分 - base_hp = float(next(s for s in character.stats if s.name == "生命值").base) # 生命白值 - base_atk = float(next(s for s in character.stats if s.name == "攻擊力").base) # 攻擊白值 - base_def = float(next(s for s in character.stats if s.name == "防禦力").base) # 防禦白值 + base_hp = float( + next(s for s in character.attributes if s.name == "生命值").value + ) # 生命白值 + base_atk = float( + next(s for s in character.attributes if s.name == "攻擊力").value + ) # 攻擊白值 + base_def = float( + next(s for s in character.attributes if s.name == "防禦力").value + ) # 防禦白值 for relic in relics: - main = relic.main_property + main = relic.main_affix if main.name == "暴擊率": - crit_value += float(main.value.removesuffix("%")) * 2 + crit_value += float(main.value) * 100 * 2 if main.name == "暴擊傷害": - crit_value += float(main.value.removesuffix("%")) - for prop in relic.sub_property: - v = prop.value + crit_value += float(main.value) * 100 + for prop in relic.sub_affixes: + v = prop.displayed_value + if v is None: + continue match prop.name: case "生命值": p = float(v.removesuffix("%")) if v.endswith("%") else float(v) / base_hp @@ -239,15 +301,14 @@ def get_default_embed(self, index: int) -> discord.Embed: } embed = discord.Embed( title=f"★{character.rarity} {character.name}", - color=color.get(character.element), + color=color.get(character.element.name), ) embed.set_thumbnail(url=self.client.get_icon_url(character.icon)) player = self.data.player embed.set_author( name=f"{player.name} 的角色展示櫃", - url=f"https://api.mihomo.me/sr_panel/{player.uid}?lang=cht&chara_index={index}", - icon_url=self.client.get_icon_url(player.icon), + icon_url=self.client.get_icon_url(player.avatar.icon), ) embed.set_footer(text=f"{player.name}.Lv. {player.level}.UID: {player.uid}") From 2c20eb86cc212bcedd08bd051dba74ffbea4d3a2 Mon Sep 17 00:00:00 2001 From: KT Date: Tue, 13 Feb 2024 21:42:43 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E6=98=9F=E9=90=B5=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E6=AB=83=E5=9C=96=E7=89=87=E5=A2=9E=E5=8A=A0=E5=BF=AB?= =?UTF-8?q?=E5=8F=96=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 星鐵展示櫃圖片增加快取 --- star_rail/showcase.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/star_rail/showcase.py b/star_rail/showcase.py index dc43011..1e79fee 100644 --- a/star_rail/showcase.py +++ b/star_rail/showcase.py @@ -3,10 +3,12 @@ from typing import Tuple import discord +from cachetools import LRUCache from honkairail.src.tools.modalV2 import StarRailApiDataV2 from hsrcard.hsr import HonkaiCard from mihomo import MihomoAPI, StarrailInfoParsed from mihomo import tools as mihomo_tools +from PIL.Image import Image from database import Database, StarrailShowcase @@ -18,6 +20,7 @@ def __init__(self, uid: int) -> None: self.uid = uid self.client = MihomoAPI() self.data: StarrailInfoParsed + self.image_cache: LRUCache[int, Image] = LRUCache(maxsize=10) self.is_cached_data: bool = False async def load_data(self) -> None: @@ -79,13 +82,17 @@ async def get_character_card_embed_file( embed = self.get_default_embed(index) embed.set_thumbnail(url=None) - data_dict = self.data.dict(by_alias=True) - data_dict["player"]["space_info"] = {} - data_hsrcard = StarRailApiDataV2.parse_raw(json.dumps(data_dict, ensure_ascii=False)) - - async with HonkaiCard(lang="cht") as card_creater: - result = await card_creater.creat(self.uid, data_hsrcard, index) - image = result.card[0].card + if self.image_cache.get(index) is not None: + image = self.image_cache.get(index) + else: + data_dict = self.data.dict(by_alias=True) + data_dict["player"]["space_info"] = {} + data_hsrcard = StarRailApiDataV2.parse_raw(json.dumps(data_dict, ensure_ascii=False)) + + async with HonkaiCard(lang="cht") as card_creater: + result = await card_creater.creat(self.uid, data_hsrcard, index) + image = result.card[0].card + self.image_cache[index] = image fp = io.BytesIO() image = image.convert("RGB") From f7687dcbcc4d254d65b7ba32676f7992a3938c95 Mon Sep 17 00:00:00 2001 From: KT Date: Tue, 13 Feb 2024 21:43:09 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix:=20Enka=20Card=20=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=AB=8B=E7=B9=AA=E7=BD=AE=E4=B8=AD=E5=95=8F=E9=A1=8C=20(#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- enka_network/enka_card | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enka_network/enka_card b/enka_network/enka_card index 0d4c007..bf070b7 160000 --- a/enka_network/enka_card +++ b/enka_network/enka_card @@ -1 +1 @@ -Subproject commit 0d4c007daa1c3f39581f2f1a2f0e7d958037af5c +Subproject commit bf070b778229083292172bcae7613806764940c1 From 488b077a256a8c4d6402445051397f0c70453286 Mon Sep 17 00:00:00 2001 From: KT Date: Tue, 13 Feb 2024 23:10:00 +0800 Subject: [PATCH 5/8] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=20Pillow=20?= =?UTF-8?q?=E7=89=88=E6=9C=ACFix=20Dependabot=20alerts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: 更新 Pillow 版本 Fix Dependabot alerts --- Pipfile | 2 +- Pipfile.lock | 138 ++++++++++++++++++++++++++------------------------- 2 files changed, 71 insertions(+), 69 deletions(-) diff --git a/Pipfile b/Pipfile index 6a90c0c..b82f4dd 100644 --- a/Pipfile +++ b/Pipfile @@ -6,7 +6,7 @@ name = "pypi" [packages] genshin = {ref = "gdb", git = "https://github.com/KT-Yeh/genshin.py"} "discord.py" = "~=2.2" -pillow = "~=9.4" +pillow = "~=10.2.0" sentry-sdk = "~=1.16" jishaku = "~=2.5" aiosqlite = "~=0.18" diff --git a/Pipfile.lock b/Pipfile.lock index 457c3d0..ef05aad 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5d5fea8c64b02b7f7cd28c37be219bae82f11b60d00ee4e61e250700ac24a362" + "sha256": "362f48baef8b3f416a2924b92a85eab6e607009e72d6a05a360d78f39d369ca9" }, "pipfile-spec": 6, "requires": { @@ -562,75 +562,77 @@ }, "pillow": { "hashes": [ - "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1", - "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba", - "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a", - "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799", - "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51", - "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb", - "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5", - "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270", - "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6", - "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47", - "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf", - "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e", - "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b", - "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66", - "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865", - "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec", - "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c", - "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1", - "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38", - "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906", - "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705", - "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef", - "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc", - "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f", - "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf", - "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392", - "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d", - "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe", - "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32", - "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5", - "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7", - "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44", - "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d", - "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3", - "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625", - "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e", - "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829", - "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089", - "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3", - "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78", - "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96", - "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964", - "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597", - "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99", - "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a", - "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140", - "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7", - "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16", - "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903", - "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1", - "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296", - "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572", - "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115", - "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a", - "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd", - "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4", - "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1", - "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb", - "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa", - "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a", - "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569", - "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c", - "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf", - "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082", - "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062", - "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], "index": "pypi", - "version": "==9.5.0" + "version": "==10.2.0" }, "prometheus-client": { "hashes": [ From 2083d5aa0867d4e6b5f4ebf9e6546d474f930344 Mon Sep 17 00:00:00 2001 From: KT Date: Wed, 14 Feb 2024 11:20:23 +0800 Subject: [PATCH 6/8] docs: Update README.md --- README.md | 67 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index ae1c004..55242e4 100644 --- a/README.md +++ b/README.md @@ -11,23 +11,28 @@ Discord 支援伺服器:https://discord.gg/myugWxgRjd ## 簡介 使用機器人直接在 Discord 聊天頻道內查看原神、星穹鐵道內各項資訊,包含: -- 查詢**即時便箋** - - 原神:包含樹脂、洞天寶錢、參數質變儀、探索派遣完成時間...等 - - 星穹鐵道:包含開拓力、委託執行 -- 每日早上 8 點開始 Hoyolab **自動簽到** (包含簽到**崩壞3**、**星穹鐵道**) -- **自動檢查即時便箋 (原神、星鐵)**、樹脂 (開拓力)、寶錢、質變儀、探索派遣,當快額滿時發送提醒 -- 查詢深境螺旋紀錄 -- 查詢旅行者札記 -- 個人紀錄卡片(遊戲天數、成就、神瞳、世界探索度...等等) -- 查詢任意玩家的原神/星穹鐵道**角色展示櫃**,顯示展示櫃內角色的面板、聖遺物詳情 -- 查看原神遊戲內公告,包含活動、卡池資訊 -- 採用新的斜線指令,輸入 / 自動彈出指令提示,不需要記憶任何指令的使用方式 +- 原神、崩壞3、星穹鐵道、未定事件簿: + - **自動簽到**:設定時間每天自動幫你簽到 Hoyolab 領獎 + +- 原神、星穹鐵道: + - 查詢**即時便箋** + - 原神:包含樹脂、每日委託、洞天寶錢、參數質變儀、探索派遣 + - 星穹鐵道:包含開拓力、每日實訓、模擬宇宙、歷戰餘響、委託執行 + - **自動檢查即時便箋**:樹脂 (開拓力)、每日、寶錢、質變儀、探索派遣,當快額滿時發送提醒 + - 查詢深境螺旋、忘卻之庭、虛構敘事紀錄,並可以保存每一期紀錄 + - 查詢任意玩家的**角色展示櫃**,顯示展示櫃內角色的面板、聖遺物詳情 + +- 原神: + - 個人紀錄卡片,包含遊戲天數、成就、神瞳、世界探索度...等等 + - 查詢旅行者札記 + - 查看遊戲內公告,包含活動、卡池資訊 + - 搜尋資料庫,包含角色、武器、各項物品、成就、七聖卡牌資料 ## 使用方式 - 邀請到自己伺服器後,輸入斜線 `/` 查看各項指令 - 第一次請先使用指令 `/cookie設定`,Cookie 取得方式:https://bit.ly/3LgQkg0 -- 設定自動簽到與樹脂提醒,使用指令 `/schedule排程` +- 設定自動簽到與即時便箋提醒,使用指令 `/schedule排程` ## 展示 更多展示圖片、GIF 請參考巴哈介紹文章:https://forum.gamer.com.tw/Co.php?bsn=36730&sn=162433 @@ -47,6 +52,7 @@ Genshin-Discord-Bot ├── cogs_external= 存放自訂的 discord.py cog 資料夾,你可以將自己指令的檔案放在這裡 ├── configs = 存放設定檔的資料夾 ├── database = SQLAlchemy ORM、資料庫操作相關的程式碼 +| ├── alembic = = 資料庫結構變動版本控制 | ├── dataclass = 自定義的 data class | └── legacy = 以前的資料庫程式碼,用來遷移舊資料之外沒有用 ├── enka_network = 與 Enka Network API 相關的程式碼 @@ -114,14 +120,14 @@ Genshin-Discord-Bot 接下來沒特別說明都以 Windows、使用 Powershell 來說明 -2. 找到你想放資料的地方,建立機器人資料夾 `Genshin-Discord-Bot`,然後進入 +2. 找到你想放資料的地方,建立新資料夾 `Genshin-Discord-Bot`,然後進入 3. 下載 [docker-compose.yml](https://github.com/KT-Yeh/Genshin-Discord-Bot/blob/master/docker-compose.yml) 檔案,放在資料夾內 4. 文字編輯器開啟 `docker-compose.yml` 檔案,基本上都不用動,只要把你剛剛在 [#網頁端](#網頁端) 拿到的三個資料填入底下三個欄位即可,其他設定可根據自己的需求再改,完成後保存 - - APPLICATION_ID=123456789 - - TEST_SERVER_ID=123456789 - - BOT_TOKEN=ABCD123456789 + - APPLICATION_ID=`123456789` + - TEST_SERVER_ID=`123456789` + - BOT_TOKEN=`ABCD123456789` 5. 在此資料夾開啟 Powershell,輸入底下命令即可運行 ``` @@ -140,7 +146,9 @@ Windows 右下角的鯨魚圖示打開 Docker Desktop 可以隨時管理機器 註3:若要在多個伺服器間使用,請在你機器人的私訊頻道內輸入 `$jsk sync`,並等待(約幾分鐘)Discord 將指令推送,稱為「全域同步」。 -#### 從 v1.2.1 版升級上來 +#### 從舊版 v1.2.1 版升級上來 (新安裝者不用看) + +
>>> 點此查看完整內容 <<< 1. 建立新的資料夾 `Genshin-Discord-Bot`,一樣先照上面做到第 4 步驟 2. 將舊版的 `data` 資料夾內的資料:`bot.db` (`emoji.json`),複製到新資料夾對應位置 @@ -159,6 +167,10 @@ Genshin-Discord-Bot/ - Linux:`sudo docker run -v $(pwd)/data:/app/data ghcr.io/kt-yeh/genshin-discord-bot:latest python main.py --migrate_database` 5. 完成變更資料庫後,執行 `docker-compose up` 即可開始運行機器人 +
+ +--- + ### 檔案說明 & 資料備份 成功運行機器人後,你的資料夾結構應該是這樣: ``` @@ -175,7 +187,7 @@ Genshin-Discord-Bot/ ├── grafana_dashboard.json = grafana 面板設定檔案 └── prometheus.yml = prometheus 伺服器設定擋 ``` -資料都放在 `data` 資料夾內,備份整個資料夾即可 +資料都放在 `data` 資料夾內,備份整個資料夾即可;還原的時候將備份的資料覆蓋回 `data` 資料夾即可 ### 如何更新 當專案有更新時,到 `Genshin-Discord-Bot` 目錄開啟 Powershell @@ -293,8 +305,17 @@ remote_write: ## 致謝 -- 原神 API 使用自: https://github.com/thesadru/genshin.py -- Discord API 使用自: https://github.com/Rapptz/discord.py -- Enka Network API 使用自: https://github.com/EnkaNetwork/API-docs -- Genshin-DB API 使用自: https://github.com/theBowja/genshin-db -- d.py-ext-prometheus: https://github.com/Apollo-Roboto/discord.py-ext-prometheus +API: +- Hoyolab: https://github.com/thesadru/genshin.py +- Discord: https://github.com/Rapptz/discord.py +- Enka Network: https://github.com/EnkaNetwork/API-docs +- Mihomo: https://march7th.xiaohei.moe/en/resource/mihomo_api.html +- Genshin-DB: https://github.com/theBowja/genshin-db + +Card: +- [hattvr/enka-card](https://github.com/hattvr/enka-card) +- [DEViantUA/HSRCard](https://github.com/DEViantUA/HSRCard) +- [DEViantUA/GenshinPyRail](https://github.com/DEViantUA/GenshinPyRail) + +Misc: +- [Apollo-Roboto/discord.py-ext-prometheus](https://github.com/Apollo-Roboto/discord.py-ext-prometheus) From 817afbe0a263f888d656468df9d147c4b93f2f0b Mon Sep 17 00:00:00 2001 From: KT Date: Thu, 15 Feb 2024 22:19:58 +0800 Subject: [PATCH 7/8] chore: Update packages --- Pipfile | 2 +- Pipfile.lock | 114 +++++++++++++++++++++++++-------------------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/Pipfile b/Pipfile index b82f4dd..4bc16c2 100644 --- a/Pipfile +++ b/Pipfile @@ -14,7 +14,7 @@ beautifulsoup4 = "~=4.11" prometheus-client = "~=0.16" psutil = "~=5.9" "enkanetwork.py" = {git = "https://github.com/KT-Yeh/EnkaNetwork.py"} -mihomo = {git = "https://github.com/KT-Yeh/mihomo", ref = "v1.1.7"} +mihomo = {git = "https://github.com/KT-Yeh/mihomo", ref = "pydantic-v1"} sqlalchemy = {version = "~=2.0.16", extras = ["asyncio"]} python-dotenv = "~=1.0.0" alembic = "~=1.11.1" diff --git a/Pipfile.lock b/Pipfile.lock index ef05aad..cc6f192 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "362f48baef8b3f416a2924b92a85eab6e607009e72d6a05a360d78f39d369ca9" + "sha256": "52f8c7224e56fd40830ffe5a8561aee1e6ed99238e302269ea52e34882631f7e" }, "pipfile-spec": 6, "requires": { @@ -281,7 +281,7 @@ }, "genshin": { "git": "https://github.com/KT-Yeh/genshin.py", - "ref": "454ac3400aaa5cbde2fd381cae9c348356a72762" + "ref": "c989ea6cbea824c5aad0ed620ba7e6be8e9c6819" }, "genshinpyrail": { "git": "https://github.com/KT-Yeh/GenshinPyRail.git", @@ -361,7 +361,7 @@ }, "hsrcard": { "git": "https://github.com/KT-Yeh/HSRCard.git", - "ref": "c5a95feb8389db0b31375e695acf0de5b1562784" + "ref": "4dafd981c09be60d9c37f2661484aee92b1b83da" }, "idna": { "hashes": [ @@ -462,7 +462,7 @@ }, "mihomo": { "git": "https://github.com/KT-Yeh/mihomo", - "ref": "24011870ea34d760b40528cf2642dae07369501d" + "ref": "151f509f1af7fd45fe6e7910c526cb55c6dd942a" }, "multidict": { "hashes": [ @@ -636,11 +636,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1", - "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92" + "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89", + "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7" ], "index": "pypi", - "version": "==0.19.0" + "version": "==0.20.0" }, "psutil": { "hashes": [ @@ -743,58 +743,58 @@ "asyncio" ], "hashes": [ - "sha256:02a4f954ccb17bd8cff56662efc806c5301508233dc38d0253a5fdb2f33ca3ba", - "sha256:06ed4d6bb2365222fb9b0a05478a2d23ad8c1dd874047a9ae1ca1d45f18a255e", - "sha256:1128b2cdf49107659f6d1f452695f43a20694cc9305a86e97b70793a1c74eeb4", - "sha256:1a870e6121a052f826f7ae1e4f0b54ca4c0ccd613278218ca036fa5e0f3be7df", - "sha256:379af901ceb524cbee5e15c1713bf9fd71dc28053286b7917525d01b938b9628", - "sha256:3f06afe8e96d7f221cc0b59334dc400151be22f432785e895e37030579d253c3", - "sha256:3fc557f5402206c18ec3d288422f8e5fa764306d49f4efbc6090a7407bf54938", - "sha256:4b4d848b095173e0a9e377127b814490499e55f5168f617ae2c07653c326b9d1", - "sha256:4f57af0866f6629eae2d24d022ba1a4c1bac9b16d45027bbfcda4c9d5b0d8f26", - "sha256:4fc0628d2026926404dabc903dc5628f7d936a792aa3a1fc54a20182df8e2172", - "sha256:5310958d08b4bafc311052be42a3b7d61a93a2bf126ddde07b85f712e7e4ac7b", - "sha256:56524d767713054f8758217b3a811f6a736e0ae34e7afc33b594926589aa9609", - "sha256:5901eed6d0e23ca4b04d66a561799d4f0fe55fcbfc7ca203bb8c3277f442085b", - "sha256:651d10fdba7984bf100222d6e4acc496fec46493262b6170be1981ef860c6184", - "sha256:691d68a4fca30c9a676623d094b600797699530e175b6524a9f57e3273f5fa8d", - "sha256:6d68e6b507a3dd20c0add86ac0a0ca061d43c9a0162a122baa5fe952f14240f1", - "sha256:6e25f029e8ad6d893538b5abe8537e7f09e21d8e96caee46a7e2199f3ddd77b0", - "sha256:750d1ef39d50520527c45c309c3cb10bbfa6131f93081b4e93858abb5ece2501", - "sha256:79a74a4ca4310c812f97bf0f13ce00ed73c890954b5a20b32484a9ab60e567e9", - "sha256:79e629df3f69f849a1482a2d063596b23e32036b83547397e68725e6e0d0a9ab", - "sha256:84d377645913d47f0dc802b415bcfe7fb085d86646a12278d77c12eb75b5e1b4", - "sha256:872f2907ade52601a1e729e85d16913c24dc1f6e7c57d11739f18dcfafde29db", - "sha256:8b39462c9588d4780f041e1b84d2ba038ac01c441c961bbee622dd8f53dec69f", - "sha256:8cbeb0e49b605cd75f825fb9239a554803ef2bef1a7b2a8b428926ed518b6b63", - "sha256:8f95ede696ab0d7328862d69f29b643d35b668c4f3619cb2f0281adc16e64c1b", - "sha256:94a78f56ea13f4d6e9efcd2a2d08cc13531918e0516563f6303c4ad98c81e21d", - "sha256:98f4d0d2bda2921af5b0c2ca99207cdab00f2922da46a6336c62c8d6814303a7", - "sha256:996b41c38e34a980e9f810d6e2709a3196e29ee34e46e3c16f96c63da10a9da1", - "sha256:99a9a8204b8937aa72421e31c493bfc12fd063a8310a0522e5a9b98e6323977c", - "sha256:a481cc2eec83776ff7b6bb12c8e85d0378af0e2ec4584ac3309365a2a380c64b", - "sha256:a678f728fb075e74aaa7fdc27f8af8f03f82d02e7419362cc8c2a605c16a4114", - "sha256:a9846ffee3283cff4ec476e7ee289314290fcb2384aab5045c6f481c5c4d011f", - "sha256:b39503c3a56e1b2340a7d09e185ddb60b253ad0210877a9958ac64208eb23674", - "sha256:b7ee16afd083bb6bb5ab3962ac7f0eafd1d196c6399388af35fef3d1c6d6d9bb", - "sha256:ba46fa770578b3cf3b5b77dadb7e94fda7692dd4d1989268ef3dcb65f31c40a3", - "sha256:c2d8a2c68b279617f13088bdc0fc0e9b5126f8017f8882ff08ee41909fab0713", - "sha256:caa79a6caeb4a3cc4ddb9aba9205c383f5d3bcb60d814e87e74570514754e073", - "sha256:d25fe55aab9b20ae4a9523bb269074202be9d92a145fcc0b752fff409754b5f6", - "sha256:dc32ecf643c4904dd413e6a95a3f2c8a89ccd6f15083e586dcf8f42eb4e317ae", - "sha256:e1a532bc33163fb19c4759a36504a23e63032bc8d47cee1c66b0b70a04a0957b", - "sha256:e1bcd8fcb30305e27355d553608c2c229d3e589fb7ff406da7d7e5d50fa14d0d", - "sha256:e70cce65239089390c193a7b0d171ce89d2e3dedf797f8010031b2aa2b1e9c80", - "sha256:ec3717c1efee8ad4b97f6211978351de3abe1e4b5f73e32f775c7becec021c5c", - "sha256:ed4667d3d5d6e203a271d684d5b213ebcd618f7a8bc605752a8865eb9e67a79a", - "sha256:f2efbbeb18c0e1c53b670a46a009fbde7b58e05b397a808c7e598532b17c6f4b", - "sha256:f75ac12d302205e60f77f46bd162d40dc37438f1f8db160d2491a78b19a0bd61", - "sha256:fab1bb909bd24accf2024a69edd4f885ded182c079c4dbcd515b4842f86b07cb", - "sha256:fb97a9b93b953084692a52a7877957b7a88dfcedc0c5652124f5aebf5999f7fe", - "sha256:fd133afb7e6c59fad365ffa97fb06b1001f88e29e1de351bef3d2b1224e2f132" + "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07", + "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71", + "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5", + "sha256:120af1e49d614d2525ac247f6123841589b029c318b9afbfc9e2b70e22e1827d", + "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131", + "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4", + "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac", + "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51", + "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230", + "sha256:30d81cc1192dc693d49d5671cd40cdec596b885b0ce3b72f323888ab1c3863d5", + "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c", + "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876", + "sha256:48217be1de7d29a5600b5c513f3f7664b21d32e596d69582be0a94e36b8309cb", + "sha256:5ada0438f5b74c3952d916c199367c29ee4d6858edff18eab783b3978d0db16d", + "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5", + "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6", + "sha256:611068511b5531304137bcd7fe8117c985d1b828eb86043bd944cebb7fae3910", + "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45", + "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6", + "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d", + "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254", + "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8", + "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18", + "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951", + "sha256:9e56afce6431450442f3ab5973156289bd5ec33dd618941283847c9fd5ff06bf", + "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a", + "sha256:ad862295ad3f644e3c2c0d8b10a988e1600d3123ecb48702d2c0f26771f1c396", + "sha256:b1d9d1bfd96eef3c3faedb73f486c89e44e64e40e5bfec304ee163de01cf996f", + "sha256:b86abba762ecfeea359112b2bb4490802b340850bbee1948f785141a5e020de8", + "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979", + "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc", + "sha256:ca891af9f3289d24a490a5fde664ea04fe2f4984cd97e26de7442a4251bd4b7c", + "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a", + "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32", + "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a", + "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac", + "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c", + "sha256:d7b5a3e2120982b8b6bd1d5d99e3025339f7fb8b8267551c679afb39e9c7c7f1", + "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd", + "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4", + "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd", + "sha256:e36aa62b765cf9f43a003233a8c2d7ffdeb55bc62eaa0a0380475b228663a38f", + "sha256:e97cf143d74a7a5a0f143aa34039b4fecf11343eed66538610debc438685db4a", + "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f", + "sha256:ec1f5a328464daf7a1e4e385e4f5652dd9b1d12405075ccba1df842f7774b4fc", + "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd", + "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8", + "sha256:fd8aafda7cdff03b905d4426b714601c0978725a19efc39f5f207b86d188ba01", + "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620" ], "index": "pypi", - "version": "==2.0.26" + "version": "==2.0.27" }, "typing-extensions": { "hashes": [ From 6709ff3baad9e5d430497c2af2ba1bc76940319d Mon Sep 17 00:00:00 2001 From: KT Date: Thu, 15 Feb 2024 22:28:04 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20=E6=98=9F=E9=90=B5=E6=B7=B1=E6=B7=B5?= =?UTF-8?q?=E6=88=B0=E9=AC=A5=E6=AC=A1=E6=95=B8=E7=9A=87=E5=86=A0=20(#61)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- genshin_py/parser/starrail.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/genshin_py/parser/starrail.py b/genshin_py/parser/starrail.py index 82b8a1b..1698966 100644 --- a/genshin_py/parser/starrail.py +++ b/genshin_py/parser/starrail.py @@ -135,11 +135,26 @@ def parse_starrail_character(character: genshin.models.StarRailDetailCharacter) return embed -def parse_starrail_hall_overview(hall: genshin.models.StarRailChallenge) -> discord.Embed: +def parse_starrail_hall_overview( + hall: genshin.models.StarRailChallenge | genshin.models.StarRailPureFiction, +) -> discord.Embed: """解析星穹鐵道忘卻之庭概述資料,包含關卡進度、戰鬥次數、獲得星數、期數""" - has_crown: bool = hall.total_battles == 10 and hall.total_stars == 30 - desc: str = f"{hall.begin_time.datetime.strftime('%Y.%m.%d')} ~ {hall.end_time.datetime.strftime('%Y.%m.%d')}\n" + # 檢查皇冠資格 + has_crown: bool = False + if isinstance(hall, genshin.models.StarRailChallenge): + if hall.total_stars == 36: + non_skip_battles = [floor.is_fast for floor in hall.floors].count(False) + has_crown = hall.total_battles == non_skip_battles + else: # isinstance(hall, genshin.models.StarRailPureFiction) + if hall.total_stars == 12: + non_skip_battles = [floor.is_fast for floor in hall.floors].count(False) + has_crown = hall.total_battles == non_skip_battles + battle_nums = f"👑 ({hall.total_battles})" if has_crown else hall.total_battles + + desc: str = ( + f"{hall.begin_time.datetime.strftime('%Y.%m.%d')} ~ {hall.end_time.datetime.strftime('%Y.%m.%d')}\n" + ) desc += f"關卡進度:{hall.max_floor}\n" - desc += f"戰鬥次數:{'👑 (10)' if has_crown else hall.total_battles} ★:{hall.total_stars}\n" + desc += f"戰鬥次數:{battle_nums} ★:{hall.total_stars}\n" embed = discord.Embed(description=desc, color=0x934151) return embed