From 544d2cbdc60a0d4bb6a687cfc62c3df10cc13ea9 Mon Sep 17 00:00:00 2001 From: Levent Date: Mon, 14 Aug 2023 05:34:38 +0500 Subject: [PATCH] Add files via upload --- Pipfile | 16 + Pipfile.lock | 272 ++++++ add_banner.py | 32 + banner_history.json | 1262 +++++++++++++++++++++++++++ banner_parser.py | 107 +++ generated_history.xlsx | Bin 0 -> 27025 bytes genshin_wish_history.json | 1612 +++++++++++++++++++++++++++++++++++ main.py | 168 ++++ paimonmoe_wish_history.xlsx | Bin 0 -> 22253 bytes 9 files changed, 3469 insertions(+) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 add_banner.py create mode 100644 banner_history.json create mode 100644 banner_parser.py create mode 100644 generated_history.xlsx create mode 100644 genshin_wish_history.json create mode 100644 main.py create mode 100644 paimonmoe_wish_history.xlsx diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..b23d425 --- /dev/null +++ b/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +bs4 = "*" +lxml = "*" +requests = "*" +openpyxl = "*" + +[dev-packages] + +[requires] +python_version = "3.10" +python_full_version = "3.10.4" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..b2d2af5 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,272 @@ +{ + "_meta": { + "hash": { + "sha256": "8871c039e14bbf1832721a618b525d9e1c9e897c336eb813be3d1543abef854f" + }, + "pipfile-spec": 6, + "requires": { + "python_full_version": "3.10.4", + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "beautifulsoup4": { + "hashes": [ + "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", + "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.12.2" + }, + "bs4": { + "hashes": [ + "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a" + ], + "index": "pypi", + "version": "==0.0.1" + }, + "certifi": { + "hashes": [ + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.7.22" + }, + "charset-normalizer": { + "hashes": [ + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.2.0" + }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_version >= '3.6'", + "version": "==1.1.0" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "lxml": { + "hashes": [ + "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3", + "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d", + "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a", + "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", + "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305", + "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287", + "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", + "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52", + "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", + "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4", + "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584", + "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f", + "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693", + "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef", + "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", + "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02", + "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc", + "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7", + "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", + "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a", + "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", + "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", + "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", + "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601", + "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", + "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", + "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2", + "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c", + "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129", + "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", + "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2", + "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1", + "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", + "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", + "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477", + "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d", + "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", + "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7", + "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2", + "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574", + "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", + "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", + "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98", + "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12", + "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", + "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", + "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", + "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", + "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d", + "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", + "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", + "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4", + "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", + "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", + "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2", + "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", + "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96", + "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d", + "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", + "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", + "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", + "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", + "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", + "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458", + "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", + "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c", + "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", + "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", + "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", + "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", + "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf", + "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb", + "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b", + "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833", + "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", + "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85", + "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e", + "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", + "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8", + "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", + "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", + "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5", + "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190", + "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", + "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", + "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", + "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9", + "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0", + "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", + "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", + "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", + "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4" + ], + "index": "pypi", + "version": "==4.9.3" + }, + "openpyxl": { + "hashes": [ + "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", + "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" + ], + "index": "pypi", + "version": "==3.1.2" + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "index": "pypi", + "version": "==2.31.0" + }, + "soupsieve": { + "hashes": [ + "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8", + "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea" + ], + "markers": "python_version >= '3.7'", + "version": "==2.4.1" + }, + "urllib3": { + "hashes": [ + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.4" + } + }, + "develop": {} +} diff --git a/add_banner.py b/add_banner.py new file mode 100644 index 0000000..535eff4 --- /dev/null +++ b/add_banner.py @@ -0,0 +1,32 @@ +import json +from contextlib import suppress + + +def main(): + banner_history = [] # Used for suppression + with suppress(FileNotFoundError, json.decoder.JSONDecodeError): + with open('banner_history.json', 'r') as f: + banner_history = json.load(f) + + when = input('When did you see banner update (UNIX timestamp)? ') + banner_count = int(input('How many banners did you see? ')) + for i in range(banner_count): + banner = input('Enter a banner name: ') + banner_type = input('What type of banner was it ([W]eapon/[C]haracter/[2]-nd Character)? ') + banner_type = banner_type.lower() + if banner_type == 'w': + banner_type = '301' + elif banner_type == 'c': + banner_type = '302' + elif banner_type == '2': + banner_type = '400' + + banner_history.append({'banner': banner, 'when': when, 'type': banner_type}) + + with open('banner_history.json', 'w') as f: + json.dump(banner_history, f, indent=4) + + +if __name__ == '__main__': + print("Deprecated! Use banner_parser.py instead.") + # main() diff --git a/banner_history.json b/banner_history.json new file mode 100644 index 0000000..7ad386a --- /dev/null +++ b/banner_history.json @@ -0,0 +1,1262 @@ +[ + { + "name": "Ballad in Goblets", + "type": "301", + "when": 1601247600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1601247600 + }, + { + "name": "Sparkling Steps", + "type": "301", + "when": 1603148400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1603148400 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1605049200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1605049200 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1606777200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1606777200 + }, + { + "name": "Secretum Secretorum", + "type": "301", + "when": 1608678000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1608678000 + }, + { + "name": "Adrift in the Harbor", + "type": "301", + "when": 1610406000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1610406000 + }, + { + "name": "Invitation to Mundane Life", + "type": "301", + "when": 1612306800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1612306800 + }, + { + "name": "Dance of Lanterns", + "type": "301", + "when": 1613516400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1614034800 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1614639600 + }, + { + "name": "Ballad in Goblets", + "type": "301", + "when": 1615935600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1615935600 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1617663600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1617663600 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1619564400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1619564400 + }, + { + "name": "Born of Ocean Swell", + "type": "301", + "when": 1621292400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1621292400 + }, + { + "name": "Sparkling Steps", + "type": "301", + "when": 1623193200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1623193200 + }, + { + "name": "Leaves in the Wind", + "type": "301", + "when": 1624921200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1624921200 + }, + { + "name": "The Heron's Court", + "type": "301", + "when": 1626822000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1626822000 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1628550000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1628550000 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1630450800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1630450800 + }, + { + "name": "Drifting Luminescence", + "type": "301", + "when": 1632178800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1632178800 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1634079600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1634079600 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1635807600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1635807600 + }, + { + "name": "Secretum Secretorum", + "type": "301", + "when": 1637708400 + }, + { + "name": "Born of Ocean Swell", + "type": "400", + "when": 1637708400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1637708400 + }, + { + "name": "Oni's Royale", + "type": "301", + "when": 1639436400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1639436400 + }, + { + "name": "The Transcendent One Returns", + "type": "301", + "when": 1641337200 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1641337200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1641337200 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1643065200 + }, + { + "name": "Adrift in the Harbor", + "type": "400", + "when": 1643065200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1643065200 + }, + { + "name": "Everbloom Violet", + "type": "301", + "when": 1644966000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1644966000 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1646694000 + }, + { + "name": "Drifting Luminescence", + "type": "400", + "when": 1646694000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1646694000 + }, + { + "name": "Azure Excursion", + "type": "301", + "when": 1648594800 + }, + { + "name": "Ballad in Goblets", + "type": "400", + "when": 1648594800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1648594800 + }, + { + "name": "The Heron's Court", + "type": "301", + "when": 1650322800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1650322800 + }, + { + "name": "Discerner of Enigmas", + "type": "301", + "when": 1653951600 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1653951600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1653951600 + }, + { + "name": "Oni's Royale", + "type": "301", + "when": 1655766000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1655766000 + }, + { + "name": "Leaves in the Wind", + "type": "301", + "when": 1657666800 + }, + { + "name": "Sparkling Steps", + "type": "400", + "when": 1657666800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1657666800 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1659394800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1659394800 + }, + { + "name": "Viridescent Vigil", + "type": "301", + "when": 1661295600 + }, + { + "name": "Gentry of Hermitage", + "type": "400", + "when": 1661295600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1661295600 + }, + { + "name": "Adrift in the Harbor", + "type": "301", + "when": 1662678000 + }, + { + "name": "Drifting Luminescence", + "type": "400", + "when": 1662678000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1662678000 + }, + { + "name": "Twilight Arbiter", + "type": "301", + "when": 1664319600 + }, + { + "name": "Ballad in Goblets", + "type": "400", + "when": 1664319600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1664319600 + }, + { + "name": "Twirling Lotus", + "type": "301", + "when": 1665702000 + }, + { + "name": "Secretum Secretorum", + "type": "400", + "when": 1665702000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1665702000 + }, + { + "name": "The Moongrass' Enlightenment", + "type": "301", + "when": 1667343600 + }, + { + "name": "Tapestry of Golden Flames", + "type": "400", + "when": 1667343600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1667343600 + }, + { + "name": "Everbloom Violet", + "type": "301", + "when": 1668726000 + }, + { + "name": "Farewell of Snezhnaya", + "type": "400", + "when": 1668726000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1668726000 + }, + { + "name": "From Ashes Reborn", + "type": "301", + "when": 1670367600 + }, + { + "name": "Oni's Royale", + "type": "400", + "when": 1670367600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1670367600 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1672095600 + }, + { + "name": "Azure Excursion", + "type": "400", + "when": 1672095600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1672095600 + }, + { + "name": "Caution in Confidence", + "type": "301", + "when": 1673996400 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1673996400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1673996400 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1675724400 + }, + { + "name": "Discerner of Enigmas", + "type": "400", + "when": 1675724400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1675724400 + }, + { + "name": "Auric Blaze", + "type": "301", + "when": 1677625200 + }, + { + "name": "Twilight Arbiter", + "type": "400", + "when": 1677625200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1677625200 + }, + { + "name": "The Transcendent One Returns", + "type": "301", + "when": 1679353200 + }, + { + "name": "The Heron's Court", + "type": "400", + "when": 1679353200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1679353200 + }, + { + "name": "The Moongrass' Enlightenment", + "type": "301", + "when": 1681254000 + }, + { + "name": "Twirling Lotus", + "type": "400", + "when": 1681254000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1681254000 + }, + { + "name": "Immaculate Pulse", + "type": "301", + "when": 1682982000 + }, + { + "name": "Adrift in the Harbor", + "type": "400", + "when": 1682982000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1682982000 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1684882800 + }, + { + "name": "Everbloom Violet", + "type": "400", + "when": 1684882800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1684882800 + }, + { + "name": "Caution in Confidence", + "type": "301", + "when": 1686610800 + }, + { + "name": "Leaves in the Wind", + "type": "400", + "when": 1686610800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1686610800 + }, + { + "name": "Born of Ocean Swell", + "type": "301", + "when": 1688511600 + }, + { + "name": "Sparkling Steps", + "type": "400", + "when": 1688511600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1688511600 + }, + { + "name": "Drifting Luminescence", + "type": "301", + "when": 1690239600 + }, + { + "name": "From Ashes Reborn", + "type": "400", + "when": 1690239600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1690239600 + }, + { + "name": "Ballad in Goblets", + "type": "301", + "when": 1601247600 + }, + { + "name": "Sparkling Steps", + "type": "301", + "when": 1603148400 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1605049200 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1606777200 + }, + { + "name": "Secretum Secretorum", + "type": "301", + "when": 1608678000 + }, + { + "name": "Adrift in the Harbor", + "type": "301", + "when": 1610406000 + }, + { + "name": "Invitation to Mundane Life", + "type": "301", + "when": 1612306800 + }, + { + "name": "Dance of Lanterns", + "type": "301", + "when": 1613516400 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1614639600 + }, + { + "name": "Ballad in Goblets", + "type": "301", + "when": 1615935600 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1617663600 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1619564400 + }, + { + "name": "Born of Ocean Swell", + "type": "301", + "when": 1621292400 + }, + { + "name": "Sparkling Steps", + "type": "301", + "when": 1623193200 + }, + { + "name": "Leaves in the Wind", + "type": "301", + "when": 1624921200 + }, + { + "name": "The Heron's Court", + "type": "301", + "when": 1626822000 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1628550000 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1630450800 + }, + { + "name": "Drifting Luminescence", + "type": "301", + "when": 1632178800 + }, + { + "name": "Farewell of Snezhnaya", + "type": "301", + "when": 1634079600 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1635807600 + }, + { + "name": "Secretum Secretorum", + "type": "301", + "when": 1637708400 + }, + { + "name": "Born of Ocean Swell", + "type": "400", + "when": 1637708400 + }, + { + "name": "Oni's Royale", + "type": "301", + "when": 1639436400 + }, + { + "name": "The Transcendent One Returns", + "type": "301", + "when": 1641337200 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1641337200 + }, + { + "name": "Gentry of Hermitage", + "type": "301", + "when": 1643065200 + }, + { + "name": "Adrift in the Harbor", + "type": "400", + "when": 1643065200 + }, + { + "name": "Everbloom Violet", + "type": "301", + "when": 1644966000 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1646694000 + }, + { + "name": "Drifting Luminescence", + "type": "400", + "when": 1646694000 + }, + { + "name": "Azure Excursion", + "type": "301", + "when": 1648594800 + }, + { + "name": "Ballad in Goblets", + "type": "400", + "when": 1648594800 + }, + { + "name": "The Heron's Court", + "type": "301", + "when": 1650322800 + }, + { + "name": "Discerner of Enigmas", + "type": "301", + "when": 1653951600 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1653951600 + }, + { + "name": "Oni's Royale", + "type": "301", + "when": 1655766000 + }, + { + "name": "Leaves in the Wind", + "type": "301", + "when": 1657666800 + }, + { + "name": "Sparkling Steps", + "type": "400", + "when": 1657666800 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1659394800 + }, + { + "name": "Viridescent Vigil", + "type": "301", + "when": 1661295600 + }, + { + "name": "Gentry of Hermitage", + "type": "400", + "when": 1661295600 + }, + { + "name": "Adrift in the Harbor", + "type": "301", + "when": 1662678000 + }, + { + "name": "Drifting Luminescence", + "type": "400", + "when": 1662678000 + }, + { + "name": "Twilight Arbiter", + "type": "301", + "when": 1664319600 + }, + { + "name": "Ballad in Goblets", + "type": "400", + "when": 1664319600 + }, + { + "name": "Twirling Lotus", + "type": "301", + "when": 1665702000 + }, + { + "name": "Secretum Secretorum", + "type": "400", + "when": 1665702000 + }, + { + "name": "The Moongrass' Enlightenment", + "type": "301", + "when": 1667343600 + }, + { + "name": "Tapestry of Golden Flames", + "type": "400", + "when": 1667343600 + }, + { + "name": "Everbloom Violet", + "type": "301", + "when": 1668726000 + }, + { + "name": "Farewell of Snezhnaya", + "type": "400", + "when": 1668726000 + }, + { + "name": "From Ashes Reborn", + "type": "301", + "when": 1670367600 + }, + { + "name": "Oni's Royale", + "type": "400", + "when": 1670367600 + }, + { + "name": "Reign of Serenity", + "type": "301", + "when": 1672095600 + }, + { + "name": "Azure Excursion", + "type": "400", + "when": 1672095600 + }, + { + "name": "Caution in Confidence", + "type": "301", + "when": 1673996400 + }, + { + "name": "Invitation to Mundane Life", + "type": "400", + "when": 1673996400 + }, + { + "name": "Moment of Bloom", + "type": "301", + "when": 1675724400 + }, + { + "name": "Discerner of Enigmas", + "type": "400", + "when": 1675724400 + }, + { + "name": "Auric Blaze", + "type": "301", + "when": 1677625200 + }, + { + "name": "Twilight Arbiter", + "type": "400", + "when": 1677625200 + }, + { + "name": "The Transcendent One Returns", + "type": "301", + "when": 1679353200 + }, + { + "name": "The Heron's Court", + "type": "400", + "when": 1679353200 + }, + { + "name": "The Moongrass' Enlightenment", + "type": "301", + "when": 1681254000 + }, + { + "name": "Twirling Lotus", + "type": "400", + "when": 1681254000 + }, + { + "name": "Immaculate Pulse", + "type": "301", + "when": 1682982000 + }, + { + "name": "Adrift in the Harbor", + "type": "400", + "when": 1682982000 + }, + { + "name": "Tapestry of Golden Flames", + "type": "301", + "when": 1684882800 + }, + { + "name": "Everbloom Violet", + "type": "400", + "when": 1684882800 + }, + { + "name": "Caution in Confidence", + "type": "301", + "when": 1686610800 + }, + { + "name": "Leaves in the Wind", + "type": "400", + "when": 1686610800 + }, + { + "name": "Born of Ocean Swell", + "type": "301", + "when": 1688511600 + }, + { + "name": "Sparkling Steps", + "type": "400", + "when": 1688511600 + }, + { + "name": "Drifting Luminescence", + "type": "301", + "when": 1690239600 + }, + { + "name": "From Ashes Reborn", + "type": "400", + "when": 1690239600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1601247600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1603148400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1605049200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1606777200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1608678000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1610406000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1612306800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1614034800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1615935600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1617663600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1619564400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1621292400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1623193200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1624921200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1626822000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1628550000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1630450800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1632178800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1634079600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1635807600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1637708400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1639436400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1641337200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1643065200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1644966000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1646694000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1648594800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1650322800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1653951600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1655766000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1657666800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1659394800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1661295600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1662678000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1664319600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1665702000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1667343600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1668726000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1670367600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1672095600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1673996400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1675724400 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1677625200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1679353200 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1681254000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1682982000 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1684882800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1686610800 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1688511600 + }, + { + "name": "Epitome Invocation", + "type": "302", + "when": 1690239600 + } +] \ No newline at end of file diff --git a/banner_parser.py b/banner_parser.py new file mode 100644 index 0000000..8dae216 --- /dev/null +++ b/banner_parser.py @@ -0,0 +1,107 @@ +import json + +import requests +from bs4 import BeautifulSoup, Tag +from datetime import date, time, datetime, timezone, timedelta + +YOUR_GENSHIN_REGION = "Europe" # Possible values: "Europe", "America", "Asia" + + +def proper_timezone(): + if YOUR_GENSHIN_REGION.lower().startswith("am"): + tz = timezone(timedelta(hours=-5)) + elif YOUR_GENSHIN_REGION.lower().startswith("as"): + tz = timezone(timedelta(hours=8)) + else: # YOUR_GENSHIN_REGION.lower().startswith("eu") + tz = timezone(timedelta(hours=1)) + return tz + + +def load_page(): + url = 'https://genshin-impact.fandom.com/wiki/Wish/History' + r = requests.get(url) + return r.text + + +def load_page_static(): + with open('banner_history_wiki\Wish History _ Genshin Impact Wiki _ Fandom.html', 'r') as f: + return f.read() + + +def parse_table(table: Tag): + header = table.find('thead') + header_row = header.find('tr') + header_cells = header_row.find_all('th') + header_titles = [x.text.strip() for x in header_cells] + # print(header_titles) + if header_titles[0] != 'Wish': + print('Skipping table {}, possible table was reformatted since parser was written'.format(header_titles)) + return None + + body = table.find('tbody') + body_rows = body.find_all('tr') + + reset_time = time(hour=5, minute=0, second=0) # UTC+1 == Europe + + banners = [] + last_banner_time = None + + for body_row in body_rows: + body_cells = body_row.find_all('td') + body_values = [x.text.strip() for x in body_cells] + + banner_name = body_values[0] + if banner_name in ["Beginners' Wish", "Wanderlust Invocation"] or "TBA" in body_values[2]: + continue + banner_date = [x for x in banner_name.split(' ') if x.startswith('20')][0] + + banner_name = " ".join(banner_name.split(" ")[:-1]).strip() + + banner_type = "301" if banner_name != "Epitome Invocation" else "302" + + banner_date += " 04:00:00" + banner_dt = datetime.strptime(banner_date, '%Y-%m-%d %H:%M:%S') + tz = proper_timezone() + banner_dt = banner_dt.astimezone(tz) + + banner_when = int(banner_dt.timestamp()) + + second_character_wish = all([ + last_banner_time is not None, + last_banner_time == banner_when, # First character wish was present + banner_type == "301" # Character wish + ]) + if second_character_wish: + print(second_character_wish) + banner_type = "400" + last_banner_time = banner_when + + banners.append({ + 'name': banner_name, + 'type': banner_type, + 'when': banner_when, + }) + + return banners + + +def parse_page(page_text): + results = [] + + soup = BeautifulSoup(page_text, 'lxml') + tables = soup.find_all('table', class_='article-table alternating-colors-table sortable jquery-tablesorter') + for table in tables: + results += parse_table(table) + + return results + + +def main(): + page = load_page_static() + banners = parse_page(page) + with open('banner_history.json', 'w') as f: + json.dump(banners, f, indent=4) + + +if __name__ == '__main__': + main() diff --git a/generated_history.xlsx b/generated_history.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8947f328192e2d7c4a1153b656ed742d4c68eaf3 GIT binary patch literal 27025 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 W6BpeBe~pObSRCkVy|K-&yZ-|n!X2If literal 0 HcmV?d00001 diff --git a/genshin_wish_history.json b/genshin_wish_history.json new file mode 100644 index 0000000..c1b1731 --- /dev/null +++ b/genshin_wish_history.json @@ -0,0 +1,1612 @@ +{ + "uid": "7**4824", + "history": [{ + "gacha_type": "301", + "time": "2023-08-12 12:37:14", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 10:52:10", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 10:52:07", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 10:52:04", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 10:51:41", + "name": "Faruzan", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-08-12 10:51:35", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 10:48:19", + "name": "Lost Prayer to the Sacred Winds", + "rank_type": "5", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 09:30:33", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 09:18:55", + "name": "Favonius Warbow", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 09:18:50", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 05:41:17", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 04:30:28", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-12 03:55:03", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 03:34:41", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 00:29:02", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-12 00:27:15", + "name": "Sucrose", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-08-12 00:02:32", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-11 23:44:05", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-11 23:44:01", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-11 22:04:03", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-11 22:01:03", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-09 00:57:45", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-09 00:57:32", + "name": "Sacrificial Greatsword", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-07 15:15:12", + "name": "Yanfei", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2023-08-06 16:12:07", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-06 13:46:07", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-06 13:46:04", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-06 13:46:01", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-06 13:45:56", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-05 12:28:32", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-05 10:42:57", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 16:56:11", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 16:56:06", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 14:56:24", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 14:30:07", + "name": "Rainslasher", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 12:59:03", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 12:58:57", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 11:40:09", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 09:52:43", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 09:52:38", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-04 06:51:47", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 06:50:11", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 06:49:23", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-04 06:49:05", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 07:38:11", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 07:38:06", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-03 05:12:07", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 05:11:56", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 05:11:47", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 05:11:41", + "name": "Rosaria", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-08-03 05:11:36", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-03 01:38:34", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 14:15:04", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 14:15:00", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 14:14:54", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 14:14:49", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 14:14:42", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 07:26:22", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 01:30:06", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-02 00:59:07", + "name": "Thoma", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-08-02 00:58:53", + "name": "Eye of Perception", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-08-01 21:35:01", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:32", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:10", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:07", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:04", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:02", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:34:00", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-08-01 21:33:54", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-31 22:46:57", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-31 21:31:01", + "name": "Faruzan", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-07-31 21:30:53", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-30 18:46:26", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-30 15:35:15", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-30 15:35:10", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:33:56", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:33:51", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:33:28", + "name": "Yanfei", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:32:56", + "name": "Rosaria", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:32:51", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:32:47", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-30 15:32:43", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-29 21:14:22", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-29 21:14:18", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-29 21:11:54", + "name": "Beidou", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-07-29 21:10:44", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-29 21:10:38", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-28 15:22:34", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-28 15:22:30", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-28 15:22:23", + "name": "Sacrificial Bow", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-28 13:20:48", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-27 14:17:39", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-27 14:17:36", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-27 14:17:32", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-27 11:36:29", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-27 11:35:00", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:18", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:15", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:13", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:10", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:07", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:34:00", + "name": "Faruzan", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:33:55", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:33:52", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2023-07-27 11:33:46", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:47", + "name": "Lost Prayer to the Sacred Winds", + "rank_type": "5", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Favonius Lance", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 17:02:35", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-25 14:18:08", + "name": "Eye of Perception", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-25 14:18:04", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-25 08:49:33", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-25 08:49:28", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:49:05", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Rainslasher", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-25 08:48:42", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:11:06", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:49", + "name": "Gorou", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:36", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:33", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:31", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:28", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:25", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 16:09:21", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "The Alley Flash", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Rainslasher", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 16:08:47", + "name": "The Alley Flash", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "The Alley Flash", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-24 08:50:25", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 05:48:47", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-24 05:29:17", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:51", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:44", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Favonius Lance", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-23 06:23:07", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2023-07-22 12:59:44", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:57:41", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:57:30", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:57:23", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:56:15", + "name": "Rainslasher", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:56:10", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:55:42", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:55:36", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:55:30", + "name": "The Alley Flash", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:55:24", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "302", + "time": "2023-07-22 12:55:16", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "400", + "time": "2023-07-22 12:54:35", + "name": "Klee", + "rank_type": "5", + "item_type": "Character" + }, { + "gacha_type": "400", + "time": "2023-07-22 12:54:28", + "name": "Favonius Sword", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "400", + "time": "2023-07-22 12:54:15", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-28 18:47:48", + "name": "The Widsith", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-28 17:56:03", + "name": "Thoma", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2022-11-28 17:55:58", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-28 09:49:00", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-28 09:48:51", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-27 10:36:35", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-26 20:20:17", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 20:20:07", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 20:20:01", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:52:32", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:39:51", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:39:39", + "name": "The Bell", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:39:37", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:39:34", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 18:39:27", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-26 00:40:44", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-26 00:40:24", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-26 00:40:17", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:14:56", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:14:45", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:14:32", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:14:29", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:14:25", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:14:22", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:14:18", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:13:58", + "name": "The Bell", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:13:55", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:13:53", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-25 23:13:48", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:13:09", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:13:04", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:12:57", + "name": "Layla", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:12:51", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:12:47", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:12:43", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 23:12:37", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Layla", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-25 03:21:50", + "name": "Lion's Roar", + "rank_type": "4", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-24 15:13:06", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 14:22:04", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 08:38:49", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Thrilling Tales of Dragon Slayers", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Layla", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:57:32", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 05:57:18", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 05:57:12", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Skyrider Sword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Cool Steel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Harbinger of Dawn", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Debate Club", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Raven Bow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Kujou Sara", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "301", + "time": "2022-11-23 05:55:56", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Kujou Sara", + "rank_type": "4", + "item_type": "Character" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Magic Guide", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Sharpshooter's Oath", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Ferrous Shadow", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Slingshot", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Bloodtainted Greatsword", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Emerald Orb", + "rank_type": "3", + "item_type": "Weapon" + }, { + "gacha_type": "200", + "time": "2022-11-23 04:10:26", + "name": "Black Tassel", + "rank_type": "3", + "item_type": "Weapon" + }] +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..3ff0afd --- /dev/null +++ b/main.py @@ -0,0 +1,168 @@ +import json +from typing import List, Dict, Optional + +import openpyxl +from openpyxl.workbook import Workbook +from openpyxl.worksheet.worksheet import Worksheet +from datetime import datetime + + +def load_banner_history(): + with open('banner_history.json', 'r') as f: + banners = json.load(f) + return banners + + +def convert_to_hg_format(): + return + + +def load_banner_history_xlsx(): + workbook: Workbook = openpyxl.load_workbook('paimonmoe_wish_history.xlsx') + workbook[0]: Worksheet + pass + + +def find_banner(banners: List[Dict], wish: Dict) -> Optional[Dict]: + # Convert the time string in the wish to a UNIX timestamp + wish_time = datetime.strptime(wish['time'], '%Y-%m-%d %H:%M:%S').timestamp() + + split_banners = {} + for banner in banners: + if not split_banners.get(banner['type']): + split_banners[banner['type']] = [] + split_banners[banner['type']].append(banner) + + # sort banners + for banner_type in split_banners: + split_banners[banner_type] = sorted(split_banners[banner_type], key=lambda x: x['when'], reverse=False) + + if wish['gacha_type'] not in split_banners.keys(): + return None + + proper_banners = split_banners[wish['gacha_type']] + for i, banner in enumerate(proper_banners): + # If gacha_type matches + # print(f'banner: {banner} | {datetime.fromtimestamp(banner["when"])}') + # If wish_time is within the banner's time range + after_start = banner['when'] <= wish_time + before_end = i == len(proper_banners) - 1 or wish_time < proper_banners[i + 1]['when'] + # print(f'after_start: {after_start}, before_end: {before_end}') + if after_start and before_end: + return banner + return None + + +def fill_history(wb: Workbook, banners: list[dict], wish_history: list[dict]): + # fill headers + for sheet_name in wb.sheetnames[:-2]: + sheet = wb[sheet_name] + sheet.append(['Type', 'Name', 'Time', '⭐', 'Pity', '#Roll', 'Group', 'Banner', 'Part']) + + pity_counters = {} + roll_count = {} + + for wish in wish_history: + + banner = find_banner(banners, wish) + + if banner is None and wish['gacha_type'] in ['301', '302', '400']: + print(f'Could not find banner for wish: {wish}') + continue + else: + if wish['gacha_type'] == "100": + banner = {"name": "Beginners' Wish", "type": "100"} + elif wish['gacha_type'] == "200": + banner = {"name": "Wanderlust Invocation", "type": "200"} + + sheet_name = 'Beginners\' Wish' + if wish['gacha_type'] == '100': + sheet_name = 'Beginners\' Wish' + elif wish['gacha_type'] == '200': + sheet_name = 'Standard' + elif wish['gacha_type'] == '301': + sheet_name = 'Character Event' + elif wish['gacha_type'] == '302': + sheet_name = 'Weapon Event' + elif wish['gacha_type'] == '400': + sheet_name = 'Character Event' + + sheet = wb[sheet_name] + entry = [] + + # Type + entry.append(wish['item_type']) + + # Name + entry.append(wish['name']) + + # Time + entry.append(wish['time']) + + # ⭐ + entry.append(wish['rank_type']) + + # Pity + pity_type = "301" if wish['gacha_type'] == '400' else wish['gacha_type'] + + if not pity_counters.get(pity_type): + pity_counters[pity_type] = {"4": 0, "5": 0} + + pity = 1 + if wish['rank_type'] in ['5', '4']: + pity = pity_counters[pity_type][wish['rank_type']] + entry.append(str(pity)) + + if wish['rank_type'] in ['5', '4']: + pity_counters[pity_type][wish['rank_type']] = 0 + else: + pity_counters[pity_type]['5'] += 1 + pity_counters[pity_type]['4'] += 1 + print(f'{pity_type} | {wish["gacha_type"]}') + + # #Roll + roll_count[banner['name']] = roll_count.get(banner['name'], 0) + 1 + entry.append(roll_count[banner['name']]) + + # Group + entry.append(roll_count[banner['name']]) # IDK what this is + + # Banner + entry.append(banner['name']) + + # Part + entry.append("") + + sheet.append(entry) + + return + + +def generate_history(): + with open('banner_history.json', 'r') as f: + banners = json.load(f) + + with open('genshin_wish_history.json', 'r') as f: + genshin_wish_history = json.load(f) + + wb = openpyxl.Workbook() + wb.create_sheet('Character Event') + wb.create_sheet('Weapon Event') + wb.create_sheet('Standard') + wb.create_sheet('Beginners\' Wish') + wb.create_sheet('Banner List') + wb.create_sheet('Information') + + fill_history(wb, banners, reversed(genshin_wish_history['history'])) + + wb.save('generated_history.xlsx') + + return + + +def main(): + generate_history() + + +if __name__ == '__main__': + main() diff --git a/paimonmoe_wish_history.xlsx b/paimonmoe_wish_history.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dd1be531d90eb7ed12092c43fc5e19f0d56b2e01 GIT binary patch literal 22253 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 literal 0 HcmV?d00001