├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.yaml │ ├── config.yml │ └── new-feature.yaml └── workflows │ ├── 1.build_release.yml │ ├── 2.realtime_release.yml │ ├── 3.update_submodule.yml │ ├── 4.upload_mirrorchyan.yml │ └── 5.upload_mirrorchyan_release_note.yml ├── .gitignore ├── .gitmodules ├── .nojekyll ├── LICENSE ├── README.md ├── README_EN.md ├── README_TW.md ├── app.py ├── app ├── __init__.py ├── card │ ├── __init__.py │ ├── comboboxsettingcard1.py │ ├── comboboxsettingcard2.py │ ├── mask_dialog_base.py │ ├── messagebox_custom.py │ ├── pushsettingcard1.py │ ├── rangesettingcard1.py │ ├── samplecardview1.py │ ├── switchsettingcard1.py │ └── timepickersettingcard1.py ├── changelog_interface.py ├── common │ ├── config.py │ ├── icon.py │ ├── signal_bus.py │ ├── style_sheet.py │ ├── translator.py │ └── trie.py ├── components │ ├── link_card.py │ ├── pivot.py │ └── sample_card.py ├── help_interface.py ├── home_interface.py ├── main_window.py ├── setting_interface.py ├── sub_interfaces │ ├── accounts_interface.py │ └── push_interface.py ├── tools │ ├── __init__.py │ ├── account_manager.py │ ├── announcement.py │ ├── check_theme_change.py │ ├── check_update.py │ ├── disclaimer.py │ └── warp_export.py ├── tools_interface.py └── warp_interface.py ├── assets ├── app │ ├── images │ │ ├── Bronya.jpg │ │ ├── Herta.jpg │ │ ├── JingYuan.jpg │ │ ├── March7th.jpg │ │ ├── SilverWolf.jpg │ │ ├── Yanqing.jpg │ │ ├── bg37.jpg │ │ └── sponsor.jpg │ └── qss │ │ ├── dark │ │ ├── changelogs_interface.qss │ │ ├── gallery_interface.qss │ │ ├── help_interface.qss │ │ ├── home_interface.qss │ │ ├── icon_interface.qss │ │ ├── link_card.qss │ │ ├── navigation_view_interface.qss │ │ ├── pivot.qss │ │ ├── sample_card.qss │ │ ├── setting_interface.qss │ │ ├── tools_interface.qss │ │ ├── view_interface.qss │ │ └── warp_interface.qss │ │ └── light │ │ ├── changelogs_interface.qss │ │ ├── gallery_interface.qss │ │ ├── help_interface.qss │ │ ├── home_interface.qss │ │ ├── icon_interface.qss │ │ ├── link_card.qss │ │ ├── navigation_view_interface.qss │ │ ├── pivot.qss │ │ ├── sample_card.qss │ │ ├── setting_interface.qss │ │ ├── tools_interface.qss │ │ ├── view_interface.qss │ │ └── warp_interface.qss ├── audio │ └── pa.mp3 ├── binary │ ├── 7za.exe │ └── aria2c.exe ├── config │ ├── character_names.json │ ├── config.example.yaml │ ├── get-pip.py │ ├── instance_names.json │ ├── ocr_replacements.json │ ├── screens.json │ ├── task_mappings.json │ └── version.txt ├── docs │ ├── Background.md │ ├── Changelog.md │ ├── FAQ.md │ ├── Tutorial.md │ └── _sidebar.md ├── images │ ├── apocalyptic │ │ ├── back.png │ │ ├── begin.png │ │ ├── next_node.png │ │ ├── team.png │ │ └── warning.png │ ├── forgottenhall │ │ ├── again.png │ │ ├── back.png │ │ ├── memory-fin.png │ │ ├── memory.png │ │ ├── memory_of_chaos.png │ │ ├── pause.png │ │ ├── prepare_fight.png │ │ ├── receive.png │ │ ├── reset.png │ │ ├── star.png │ │ ├── start.png │ │ ├── start2.png │ │ ├── switch.png │ │ ├── team1.png │ │ └── team2.png │ ├── purefiction │ │ ├── back.png │ │ ├── choose.png │ │ ├── confirm.png │ │ ├── fail.png │ │ ├── plus.png │ │ ├── prepare_fight.png │ │ ├── star.png │ │ ├── start.png │ │ └── start_story.png │ ├── screen │ │ ├── account_and_password.png │ │ ├── account_field.png │ │ ├── activity.png │ │ ├── agree_conditions.png │ │ ├── agree_update.png │ │ ├── apocalyptic │ │ │ └── apocalyptic.png │ │ ├── bag │ │ │ ├── bag_consumables.png │ │ │ └── bag_relicset.png │ │ ├── bilibili_login.png │ │ ├── camera.png │ │ ├── click_enter.png │ │ ├── configure_team.png │ │ ├── dispatch.png │ │ ├── enter_game.png │ │ ├── forgottenhall │ │ │ ├── memory.png │ │ │ └── memory_of_chaos.png │ │ ├── guide │ │ │ ├── enter_guide2.png │ │ │ ├── enter_guide3.png │ │ │ ├── enter_guide4.png │ │ │ ├── enter_guide5.png │ │ │ ├── guide2.png │ │ │ ├── guide3.png │ │ │ ├── guide4.png │ │ │ ├── guide5.png │ │ │ ├── plus.png │ │ │ └── power.png │ │ ├── mail.png │ │ ├── main.png │ │ ├── map.png │ │ ├── map3d.png │ │ ├── menu.png │ │ ├── monthly_card.png │ │ ├── pass │ │ │ ├── pass1.png │ │ │ └── pass2.png │ │ ├── password_field.png │ │ ├── photo_preview.png │ │ ├── purefiction │ │ │ └── purefiction.png │ │ ├── redemption.png │ │ ├── start_game.png │ │ ├── start_srpass.png │ │ ├── synthesis │ │ │ ├── consumables.png │ │ │ └── material.png │ │ ├── universe │ │ │ ├── divergent_main.png │ │ │ ├── leave_temporarily.png │ │ │ ├── switch.png │ │ │ ├── universe_expansion.png │ │ │ ├── universe_main.png │ │ │ ├── universe_map.png │ │ │ └── universe_report.png │ │ ├── visa.png │ │ ├── wallpaper.png │ │ ├── warp │ │ │ ├── character_warp.png │ │ │ ├── himeko_prepare.png │ │ │ ├── himeko_try.png │ │ │ ├── himeko_try_banner.png │ │ │ └── stellar_warp.png │ │ └── welcome.png │ ├── share │ │ ├── bag │ │ │ └── defensive_medicine_selected.png │ │ ├── base │ │ │ ├── F.png │ │ │ ├── RedExclamationMark.png │ │ │ └── not_auto.png │ │ ├── calyx │ │ │ ├── crimson │ │ │ │ ├── abundance1.png │ │ │ │ ├── destruction1.png │ │ │ │ ├── destruction2.png │ │ │ │ ├── erudition1.png │ │ │ │ ├── harmony1.png │ │ │ │ ├── harmony2.png │ │ │ │ ├── hunt1.png │ │ │ │ ├── nihility1.png │ │ │ │ ├── nihility2.png │ │ │ │ └── preservation1.png │ │ │ └── golden │ │ │ │ ├── Jarilo-VI.png │ │ │ │ ├── Penacony.png │ │ │ │ └── XianzhouLuofu.png │ │ ├── character │ │ │ ├── Acheron.png │ │ │ ├── Aglaea.png │ │ │ ├── Argenti.png │ │ │ ├── Arlan.png │ │ │ ├── Asta.png │ │ │ ├── Aventurine.png │ │ │ ├── Bailu.png │ │ │ ├── BlackSwan.png │ │ │ ├── Blade.png │ │ │ ├── Boothill.png │ │ │ ├── Bronya.png │ │ │ ├── CaelumDestruction.png │ │ │ ├── CaelumImaginary.png │ │ │ ├── CaelumPreservation.png │ │ │ ├── CaelumRemembrance.png │ │ │ ├── Castorice.png │ │ │ ├── Clara.png │ │ │ ├── DanHeng.png │ │ │ ├── DanHengImbibitorLunae.png │ │ │ ├── DrRatio.png │ │ │ ├── Feixiao.png │ │ │ ├── Firefly.png │ │ │ ├── FuXuan.png │ │ │ ├── Fugue.png │ │ │ ├── Gallagher.png │ │ │ ├── Gepard.png │ │ │ ├── Guinaifen.png │ │ │ ├── Hanya.png │ │ │ ├── Herta.png │ │ │ ├── Himeko.png │ │ │ ├── Hook.png │ │ │ ├── Huohuo.png │ │ │ ├── Jade.png │ │ │ ├── Jiaoqiu.png │ │ │ ├── JingYuan.png │ │ │ ├── Jingliu.png │ │ │ ├── Kafka.png │ │ │ ├── Lingsha.png │ │ │ ├── Luka.png │ │ │ ├── Luocha.png │ │ │ ├── Lynx.png │ │ │ ├── March7th.png │ │ │ ├── March7thImaginary.png │ │ │ ├── Misha.png │ │ │ ├── Moze.png │ │ │ ├── Natasha.png │ │ │ ├── Pela.png │ │ │ ├── Qingque.png │ │ │ ├── Rappa.png │ │ │ ├── Robin.png │ │ │ ├── RuanMei.png │ │ │ ├── Sampo.png │ │ │ ├── Seele.png │ │ │ ├── Serval.png │ │ │ ├── SilverWolf.png │ │ │ ├── Sparkle.png │ │ │ ├── StelleDestruction.png │ │ │ ├── StelleImaginary.png │ │ │ ├── StellePreservation.png │ │ │ ├── StelleRemembrance.png │ │ │ ├── Sunday.png │ │ │ ├── Sushang.png │ │ │ ├── TheHerta.png │ │ │ ├── Tingyun.png │ │ │ ├── TopazandNumby.png │ │ │ ├── Tribbie.png │ │ │ ├── Welt.png │ │ │ ├── Xueyi.png │ │ │ ├── Yanqing.png │ │ │ ├── Yukong.png │ │ │ └── Yunli.png │ │ ├── map │ │ │ └── back.png │ │ ├── menu │ │ │ ├── activity.png │ │ │ ├── activity_2nd.png │ │ │ ├── assist_reward.png │ │ │ ├── bag.png │ │ │ ├── bag_consumables.png │ │ │ ├── bag_relicset.png │ │ │ ├── camera.png │ │ │ ├── configure_team.png │ │ │ ├── dispatch.png │ │ │ ├── dispatch_reward.png │ │ │ ├── guide.png │ │ │ ├── mail.png │ │ │ ├── mail_reward.png │ │ │ ├── more.png │ │ │ ├── pass.png │ │ │ ├── pass_reward.png │ │ │ ├── quest_reward.png │ │ │ └── synthesis.png │ │ ├── plot │ │ │ ├── select.png │ │ │ ├── start.png │ │ │ ├── start_ps5.png │ │ │ └── start_xbox.png │ │ ├── power │ │ │ ├── immersifier │ │ │ │ └── immersifier.png │ │ │ └── trailblaze_power │ │ │ │ ├── button.png │ │ │ │ ├── fuel.png │ │ │ │ ├── plus.png │ │ │ │ ├── reserved_trailblaze_power.png │ │ │ │ ├── stellar_jade.png │ │ │ │ └── trailblaze_power.png │ │ ├── redemption │ │ │ ├── clear.png │ │ │ └── paste.png │ │ ├── reward │ │ │ ├── assist │ │ │ │ └── gift.png │ │ │ ├── pass │ │ │ │ ├── enter_pass1.png │ │ │ │ ├── enter_pass2.png │ │ │ │ └── lock.png │ │ │ └── quest │ │ │ │ ├── 500.png │ │ │ │ └── gift.png │ │ ├── synthesis │ │ │ ├── defensive_medicine.png │ │ │ ├── defensive_medicine_selected.png │ │ │ ├── enter_consumables.png │ │ │ ├── enter_material.png │ │ │ ├── filter.png │ │ │ ├── nuclear.png │ │ │ └── nuclear_selected.png │ │ └── warp │ │ │ └── stellar_warp.png │ └── zh_CN │ │ ├── activity │ │ └── double │ │ │ ├── receive.png │ │ │ ├── receive2.png │ │ │ └── receive_fin.png │ │ ├── base │ │ ├── auto.png │ │ ├── click_close.png │ │ ├── confirm.png │ │ ├── restart.png │ │ └── use.png │ │ ├── exception │ │ ├── relogin.png │ │ └── retry.png │ │ ├── fight │ │ ├── fight_again.png │ │ ├── fight_exit.png │ │ ├── fight_fail.png │ │ └── retreat.png │ │ ├── map │ │ └── back.png │ │ ├── relicset │ │ ├── break.png │ │ ├── enter_break.png │ │ ├── level_four.png │ │ ├── relic_inventory_full.png │ │ ├── screen.png │ │ └── select.png │ │ ├── reward │ │ ├── dispatch │ │ │ ├── again.png │ │ │ ├── one_key_receive.png │ │ │ └── receive.png │ │ ├── mail │ │ │ └── receive_all.png │ │ ├── pass │ │ │ └── one_key_receive.png │ │ └── quest │ │ │ ├── activity.png │ │ │ └── receive.png │ │ ├── synthesis │ │ └── synthesis_button.png │ │ ├── universe │ │ └── one_key_receive.png │ │ └── warp │ │ ├── character_trial.png │ │ └── start_trial.png ├── logo │ ├── March7th.ico │ ├── Terminal.ico │ └── Updater.ico └── screenshot │ ├── March7th.png │ ├── README.png │ └── sponsor.jpg ├── build.py ├── index.html ├── main.py ├── module ├── automation │ ├── __init__.py │ ├── automation.py │ ├── input.py │ └── screenshot.py ├── config │ ├── __init__.py │ ├── asu_config.py │ ├── config.py │ └── fhoe_config.py ├── logger │ └── __init__.py ├── notification │ ├── __init__.py │ ├── custom.py │ ├── gocqhttp.py │ ├── lark.py │ ├── matrix.py │ ├── notification.py │ ├── notifier.py │ ├── onebot.py │ ├── onepush.py │ ├── pac.py │ ├── serverchan3.py │ ├── smtp.py │ ├── telegram.py │ ├── wechatworkapp.py │ └── winotify.py ├── ocr │ ├── PPOCR_api.py │ ├── __init__.py │ └── ocr.py ├── screen │ ├── __init__.py │ └── screen.py └── update │ ├── __init__.py │ └── update_handler.py ├── requirements.txt ├── tasks ├── activity │ ├── __init__.py │ ├── activitytemplate.py │ ├── checkInactivity.py │ ├── doubleactivity.py │ ├── gardenofplenty.py │ ├── planarfissure.py │ └── realmofthestrange.py ├── base │ ├── __init__.py │ ├── base.py │ ├── download.py │ ├── fastest_mirror.py │ ├── pythonchecker.py │ ├── tasks.py │ └── team.py ├── challenge │ ├── __init__.py │ ├── apocalyptic.py │ ├── basechallenge.py │ ├── memoryofchaos.py │ ├── memoryone.py │ └── purefiction.py ├── daily │ ├── __init__.py │ ├── daily.py │ ├── fight.py │ ├── himekotry.py │ ├── photo.py │ ├── redemption.py │ ├── synthesis.py │ └── tasks.py ├── game │ ├── __init__.py │ └── starrailcontroller.py ├── power │ ├── __init__.py │ ├── character.py │ ├── instance.py │ ├── power.py │ └── relicset.py ├── reward │ ├── __init__.py │ ├── assist.py │ ├── dispatch.py │ ├── mail.py │ ├── quest.py │ ├── rewardtemplate.py │ └── srpass.py ├── tool │ ├── __init__.py │ ├── autoplot.py │ └── screenshot.py ├── version │ └── __init__.py └── weekly │ ├── __init__.py │ ├── echoofwar.py │ └── universe.py ├── updater.py └── utils ├── __init__.py ├── color.py ├── command.py ├── date.py ├── gamecontroller.py ├── image_utils.py ├── logger ├── colorcodefilter.py ├── coloredformatter.py └── logger.py ├── registry ├── __init__.py ├── game_auto_hdr.py ├── gameaccount.py └── star_rail_setting.py ├── schedule.py └── singleton.py /.github/ISSUE_TEMPLATE/bug-report.yaml: -------------------------------------------------------------------------------- 1 | name: 回报错误 2 | description: 在使用 March7thAssistant 过程中遇到了错误 3 | title: '[Bug]: ' 4 | labels: [ "bug / 缺陷" ] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | ## 感谢您愿意填写错误回报! 11 | ## 以下是一些注意事项,请务必阅读让我们能够更容易处理 12 | 13 | ### ❗ | 确定没有相同问题的ISSUE已被提出。 14 | ### 🌎 | 请准确填写环境信息。 15 | ### 如果您不知道如何有效、精准地表述,我们建议您先阅读《提问的智慧》 16 | 17 | --- 18 | - type: checkboxes 19 | id: terms 20 | attributes: 21 | label: 请确保您已阅读以上注意事项,并勾选下方的确认框。 22 | options: 23 | - label: "我已经使用一个干净且无其它非必要的插件的环境测试过,问题依旧存在。" 24 | required: true 25 | - label: "我已经在 [Issue Tracker](https://github.com/moesnow/March7thAssistant/issues) 中找过我要提出的问题,没有找到相同问题的ISSUE。" 26 | required: true 27 | - label: 我已知晓并同意,若这个 Issue 是关于其他非程序本身问题,则我的 Issue 可能会被无条件自动关闭/锁定。 28 | required: true 29 | - label: 我已知晓并同意,如果我不按照模板提供的指示进行填写,则我的 Issue 可能会被无条件删除。 30 | required: true 31 | 32 | - type: markdown 33 | attributes: 34 | value: | 35 | ## 环境信息 36 | 37 | - type: input 38 | id: env-March7thAssistant-ver 39 | attributes: 40 | label: March7thAssistant 版本 (或 Commit Id) 41 | validations: 42 | required: true 43 | 44 | - type: textarea 45 | id: reproduce-steps 46 | attributes: 47 | label: 重现步骤 48 | description: | 49 | 我们需要执行哪些操作才能让 Bug 出现? 50 | 简洁清晰的重现步骤能够帮助我们更迅速地定位问题所在。 51 | validations: 52 | required: true 53 | 54 | - type: textarea 55 | id: expected 56 | attributes: 57 | label: 期望的结果是什么? 58 | validations: 59 | required: true 60 | 61 | - type: textarea 62 | id: actual 63 | attributes: 64 | label: 实际的结果是什么? 65 | validations: 66 | required: true 67 | 68 | - type: textarea 69 | id: logging 70 | attributes: 71 | label: 日志记录 72 | description: | 73 | 将日志等级(log_level)修改为 DEBUG 后再次运行, 74 | 从 logs 文件夹内获取日志文件,按照日期命名。 75 | 76 | - type: textarea 77 | id: extra-desc 78 | attributes: 79 | label: 补充说明(可选) 80 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Community 4 | url: https://github.com/moesnow/March7thAssistant/discussions 5 | about: QQ群 855392201 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new-feature.yaml: -------------------------------------------------------------------------------- 1 | name: 新功能提议 2 | description: 提出新功能 3 | title: '[Feat]: ' 4 | labels: [ "enhancement / 功能请求" ] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | ## 感谢您愿意为 March7thAssistant 提出建议! 11 | ## 以下是一些注意事项,请务必阅读让我们能够更容易处理 12 | 13 | ### ❗ | 确定没有相同问题的 Feature 已被提出或实现。 14 | ### 📝 | 确定现有的PR和代码并没有该功能的实现/相似的功能。 15 | ### 如果您不知道如何有效、精准地表述,我们建议您先阅读《提问的智慧》 16 | 17 | --- 18 | - type: checkboxes 19 | id: terms 20 | attributes: 21 | label: 请确保您已阅读以上注意事项,并勾选下方的确认框。 22 | options: 23 | - label: "我确定这是一个从未被提出和实现过的功能。" 24 | required: true 25 | - label: "我已经在 [Issue Tracker](https://github.com/moesnow/March7thAssistant/issues) 以及 [Pull Request](https://github.com/moesnow/March7thAssistant/pulls) 中找过我要提出的功能,没有找到相同功能的 Issue 和 PR。" 26 | required: true 27 | - label: 我已知晓并同意,此处仅用于建议新功能。若这个 Issue 是关于其他非主题的问题,则我的 Issue 可能会被无条件自动关闭/锁定。 28 | required: true 29 | - label: 我已知晓并同意,如果我不按照模板提供的指示进行填写,则我的 Issue 可能会被无条件删除。 30 | required: true 31 | 32 | - type: textarea 33 | id: feature-to-add 34 | attributes: 35 | label: 需要添加的功能内容 36 | description: | 37 | 请具体提出想添加的功能,包括实现的模拟(如有) 38 | 是否有类似的功能已经实现?如有请肯定地提出与该功能不同的地方/想改进/添加该功能的哪一部分。 39 | validations: 40 | required: true 41 | -------------------------------------------------------------------------------- /.github/workflows/2.realtime_release.yml: -------------------------------------------------------------------------------- 1 | name: Build realtime release 2 | 3 | # 触发条件:手动触发或推送触发 4 | on: 5 | workflow_dispatch: 6 | pull_request: 7 | paths: 8 | - "**.py" 9 | push: 10 | branches: 11 | - main 12 | paths: 13 | - "**.py" 14 | 15 | # 权限设置:需要写入仓库内容的权限 16 | permissions: 17 | contents: write 18 | 19 | jobs: 20 | build: 21 | name: Build 22 | runs-on: windows-latest 23 | 24 | steps: 25 | # 步骤1:签出代码 26 | - name: Checkout code 27 | uses: actions/checkout@v3 28 | with: 29 | submodules: "false" 30 | 31 | # 步骤2:设置Python环境 32 | - name: Set up python 33 | uses: actions/setup-python@v4 34 | with: 35 | python-version: "3.13" 36 | cache: "pip" 37 | 38 | # 步骤3:安装依赖 39 | - name: Install dependencies 40 | run: | 41 | python -m pip install --upgrade pip 42 | pip install -r requirements.txt pyinstaller 43 | 44 | # 步骤4:生成程序 45 | - name: Generate program 46 | run: | 47 | pyinstaller -D --distpath .\dist\ -i .\assets\logo\Terminal.ico --contents-directory libraries --exclude-module PyQt5 --uac-admin -n "March7th Assistant" main.py -y 48 | pyinstaller -D --distpath .\dist\ -i .\assets\logo\March7th.ico --contents-directory libraries --uac-admin -n "March7th Launcher" app.py -y -w 49 | pyinstaller -F --distpath .\dist\March7thAssistant\ -i .\assets\logo\Updater.ico -n "March7th Updater" updater.py -y 50 | 51 | # 步骤5:移动资源到dist目录 52 | - name: Move assets to dist directory 53 | run: | 54 | Copy-Item -Path ".\dist\March7th Assistant\*" -Destination ".\dist\March7thAssistant\" -Recurse -Force 55 | Copy-Item -Path ".\dist\March7th Launcher\*" -Destination ".\dist\March7thAssistant\" -Recurse -Force 56 | Copy-Item -Path ".\assets\" -Destination ".\dist\March7thAssistant\assets\" -Recurse -Force 57 | Copy-Item -Path ".\README.md" -Destination ".\dist\March7thAssistant\" -Force 58 | 59 | # 步骤6:创建压缩包 60 | - name: Create archive 61 | run: | 62 | Rename-Item -Path .\dist\March7thAssistant -NewName March7thAssistant_${{ github.run_number }} 63 | .\assets\binary\7za.exe a -t7z .\dist\March7thAssistant_${{ github.run_number }}.7z .\dist\March7thAssistant_${{ github.run_number }}\ 64 | 65 | # 步骤7:上传压缩包 66 | - name: Upload artifact 67 | uses: actions/upload-artifact@v4 68 | with: 69 | name: March7thAssistant_${{ github.run_number }}.7z 70 | path: ./dist/March7thAssistant_${{ github.run_number }}.7z 71 | compression-level: 0 # no compression 72 | -------------------------------------------------------------------------------- /.github/workflows/3.update_submodule.yml: -------------------------------------------------------------------------------- 1 | name: Update Submodules 2 | 3 | # 触发条件:手动触发或定时触发 4 | on: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: "0 20 * * *" # 每天运行一次 凌晨4点 CST时间 8 | 9 | # 权限设置:需要写入仓库内容的权限 10 | permissions: 11 | contents: write 12 | 13 | jobs: 14 | update-submodules: 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | # 步骤1:签出代码 19 | - name: Checkout code 20 | uses: actions/checkout@v3 21 | with: 22 | submodules: "true" 23 | 24 | # 步骤2:更新子模块 25 | - name: Update submodules 26 | run: | 27 | git submodule update --remote --recursive 28 | 29 | # 步骤3:提交 30 | - name: Commit and push if there are changes 31 | run: | 32 | git config --global user.name 'github-actions[bot]' 33 | git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com' 34 | git add . 35 | git commit -m "Automated submodule update" || exit 0 # 如果没有更改,退出 36 | git push 37 | -------------------------------------------------------------------------------- /.github/workflows/4.upload_mirrorchyan.yml: -------------------------------------------------------------------------------- 1 | name: MirrorChyan Uploading 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | mirrorchyan: 8 | runs-on: macos-latest 9 | 10 | steps: 11 | - id: uploading 12 | uses: MirrorChyan/uploading-action@v1 13 | with: 14 | filetype: latest-release 15 | filename: "*full.zip" 16 | mirrorchyan_rid: March7thAssistant 17 | 18 | github_token: ${{ secrets.GITHUB_TOKEN }} 19 | owner: ${{ github.repository_owner }} 20 | repo: ${{ github.event.repository.name }} 21 | upload_token: ${{ secrets.MirrorChyanUploadToken }} 22 | -------------------------------------------------------------------------------- /.github/workflows/5.upload_mirrorchyan_release_note.yml: -------------------------------------------------------------------------------- 1 | name: MirrorChyan Release Note 2 | 3 | on: 4 | workflow_dispatch: 5 | release: 6 | types: [edited] 7 | 8 | jobs: 9 | mirrorchyan: 10 | runs-on: macos-latest 11 | 12 | steps: 13 | - id: uploading 14 | uses: MirrorChyan/release-note-action@v1 15 | with: 16 | mirrorchyan_rid: March7thAssistant 17 | 18 | upload_token: ${{ secrets.MirrorChyanUploadToken }} 19 | github_token: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "3rdparty/Auto_Simulated_Universe"] 2 | path = 3rdparty/Auto_Simulated_Universe 3 | url = https://github.com/CHNZYX/Auto_Simulated_Universe 4 | [submodule "3rdparty/Fhoe-Rail"] 5 | path = 3rdparty/Fhoe-Rail 6 | url = https://github.com/linruowuyin/Fhoe-Rail 7 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/.nojekyll -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | # 将当前工作目录设置为程序所在的目录,确保无论从哪里执行,其工作目录都正确设置为程序本身的位置,避免路径错误。 4 | os.chdir(os.path.dirname(sys.executable) if getattr(sys, 'frozen', False)else os.path.dirname(os.path.abspath(__file__))) 5 | 6 | import pyuac 7 | if not pyuac.isUserAdmin(): 8 | try: 9 | pyuac.runAsAdmin(False) 10 | sys.exit(0) 11 | except Exception: 12 | sys.exit(1) 13 | 14 | from PyQt5.QtCore import Qt 15 | from PyQt5.QtWidgets import QApplication 16 | from app.main_window import MainWindow 17 | 18 | # 启用 DPI 缩放 19 | QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) 20 | QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) 21 | QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) 22 | 23 | if __name__ == "__main__": 24 | app = QApplication(sys.argv) 25 | app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings) 26 | 27 | w = MainWindow() 28 | 29 | sys.exit(app.exec_()) 30 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/app/__init__.py -------------------------------------------------------------------------------- /app/card/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/app/card/__init__.py -------------------------------------------------------------------------------- /app/card/comboboxsettingcard1.py: -------------------------------------------------------------------------------- 1 | from qfluentwidgets import (ComboBox, SettingCard, FluentIconBase) 2 | from typing import Union 3 | from PyQt5.QtCore import Qt 4 | from PyQt5.QtGui import QIcon 5 | 6 | from module.config import cfg 7 | 8 | 9 | class ComboBoxSettingCard1(SettingCard): 10 | """ Setting card with a combo box """ 11 | 12 | def __init__(self, configname: str, icon: Union[str, QIcon, FluentIconBase], title, content=None, texts=None, parent=None): 13 | super().__init__(icon, title, content, parent) 14 | self.configname = configname 15 | self.comboBox = ComboBox(self) 16 | self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignRight) 17 | self.hBoxLayout.addSpacing(16) 18 | 19 | for text, option in zip(texts, texts): 20 | self.comboBox.addItem(text, userData=option) 21 | 22 | self.comboBox.setCurrentText(cfg.get_value(configname)) 23 | self.comboBox.currentIndexChanged.connect(self._onCurrentIndexChanged) 24 | 25 | def _onCurrentIndexChanged(self, index: int): 26 | cfg.set_value(self.configname, self.comboBox.itemData(index)) 27 | -------------------------------------------------------------------------------- /app/card/comboboxsettingcard2.py: -------------------------------------------------------------------------------- 1 | from qfluentwidgets import (ComboBox, SettingCard, FluentIconBase) 2 | from typing import Union 3 | from PyQt5.QtCore import Qt 4 | from PyQt5.QtGui import QIcon 5 | from PyQt5.QtWidgets import QPushButton 6 | 7 | from module.config import cfg 8 | import os 9 | 10 | 11 | class ComboBoxSettingCard2(SettingCard): 12 | """ Setting card with a combo box """ 13 | 14 | def __init__(self, configname: str, icon: Union[str, QIcon, FluentIconBase], title, content=None, texts=None, parent=None): 15 | super().__init__(icon, title, content, parent) 16 | self.configname = configname 17 | self.comboBox = ComboBox(self) 18 | self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignRight) 19 | self.hBoxLayout.addSpacing(16) 20 | 21 | for key, value in texts.items(): 22 | self.comboBox.addItem(key, userData=value) 23 | if value == cfg.get_value(configname): 24 | self.comboBox.setCurrentText(key) 25 | 26 | self.comboBox.currentIndexChanged.connect(self._onCurrentIndexChanged) 27 | 28 | def _onCurrentIndexChanged(self, index: int): 29 | cfg.set_value(self.configname, self.comboBox.itemData(index)) 30 | 31 | 32 | class ComboBoxSettingCardLog(SettingCard): 33 | """ Setting card with a combo box """ 34 | 35 | def __init__(self, configname: str, icon: Union[str, QIcon, FluentIconBase], title, content=None, texts=None, parent=None): 36 | super().__init__(icon, title, content, parent) 37 | self.configname = configname 38 | 39 | self.button = QPushButton("打开日志文件夹", self) 40 | self.button.setObjectName('primaryButton') 41 | self.hBoxLayout.addWidget(self.button, 0, Qt.AlignRight) 42 | self.hBoxLayout.addSpacing(10) 43 | self.button.clicked.connect(self._onClicked) 44 | 45 | self.comboBox = ComboBox(self) 46 | self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignRight) 47 | self.hBoxLayout.addSpacing(16) 48 | 49 | for key, value in texts.items(): 50 | self.comboBox.addItem(key, userData=value) 51 | if value == cfg.get_value(configname): 52 | self.comboBox.setCurrentText(key) 53 | 54 | self.comboBox.currentIndexChanged.connect(self._onCurrentIndexChanged) 55 | 56 | def _onCurrentIndexChanged(self, index: int): 57 | cfg.set_value(self.configname, self.comboBox.itemData(index)) 58 | 59 | def _onClicked(self): 60 | os.startfile(os.path.abspath("./logs")) 61 | -------------------------------------------------------------------------------- /app/card/rangesettingcard1.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | from PyQt5.QtCore import Qt, pyqtSignal 4 | from PyQt5.QtGui import QColor, QIcon, QPainter 5 | from PyQt5.QtWidgets import (QFrame, QHBoxLayout, QLabel, QToolButton, QVBoxLayout, QPushButton) 6 | from qfluentwidgets import (SettingCard, FluentIconBase, SwitchButton, IndicatorPosition, Slider) 7 | 8 | from module.config import cfg 9 | 10 | 11 | class RangeSettingCard1(SettingCard): 12 | """ Setting card with a slider """ 13 | 14 | valueChanged = pyqtSignal(int) 15 | 16 | def __init__(self, configname: str, Range: dict, icon: Union[str, QIcon, FluentIconBase], title, content=None, parent=None): 17 | """ 18 | Parameters 19 | ---------- 20 | configItem: RangeConfigItem 21 | configuration item operated by the card 22 | 23 | icon: str | QIcon | FluentIconBase 24 | the icon to be drawn 25 | 26 | title: str 27 | the title of card 28 | 29 | content: str 30 | the content of card 31 | 32 | parent: QWidget 33 | parent widget 34 | """ 35 | super().__init__(icon, title, content, parent) 36 | self.configname = configname 37 | self.slider = Slider(Qt.Horizontal, self) 38 | self.valueLabel = QLabel(self) 39 | self.slider.setMinimumWidth(268) 40 | 41 | self.slider.setSingleStep(1) 42 | self.slider.setRange(Range[0], Range[1]) 43 | self.slider.setValue(int(cfg.get_value(self.configname))) 44 | self.valueLabel.setNum(int(cfg.get_value(self.configname))) 45 | 46 | self.hBoxLayout.addStretch(1) 47 | self.hBoxLayout.addWidget(self.valueLabel, 0, Qt.AlignRight) 48 | self.hBoxLayout.addSpacing(6) 49 | self.hBoxLayout.addWidget(self.slider, 0, Qt.AlignRight) 50 | self.hBoxLayout.addSpacing(16) 51 | 52 | self.valueLabel.setObjectName('valueLabel') 53 | # configname.valueChanged.connect(self.setValue) 54 | self.slider.valueChanged.connect(self.__onValueChanged) 55 | 56 | def __onValueChanged(self, value: int): 57 | """ slider value changed slot """ 58 | self.setValue(value) 59 | self.valueChanged.emit(value) 60 | 61 | def setValue(self, value): 62 | cfg.set_value(self.configname, value) 63 | self.valueLabel.setNum(value) 64 | self.valueLabel.adjustSize() 65 | self.slider.setValue(value) 66 | -------------------------------------------------------------------------------- /app/card/timepickersettingcard1.py: -------------------------------------------------------------------------------- 1 | from qfluentwidgets import (TimePicker, SettingCard, FluentIconBase) 2 | from typing import Union 3 | from PyQt5.QtCore import Qt, QTime 4 | from PyQt5.QtGui import QIcon 5 | 6 | from module.config import cfg 7 | 8 | 9 | class TimePickerSettingCard1(SettingCard): 10 | """ Setting card with a TimePicker """ 11 | 12 | def __init__(self, configname: str, icon: Union[str, QIcon, FluentIconBase], title, content=None, texts=None, parent=None): 13 | super().__init__(icon, title, content, parent) 14 | self.configname = configname 15 | self.timePicker = TimePicker(self) 16 | self.hBoxLayout.addWidget(self.timePicker, 0, Qt.AlignRight) 17 | 18 | time_str = cfg.get_value(configname) 19 | time_parts = list(map(int, time_str.split(":"))) # 分割小时和分钟 20 | qtime = QTime(*time_parts) # 创建 QTime 对象 21 | self.timePicker.setTime(qtime) 22 | 23 | self.timePicker.timeChanged.connect(self._onTimeChanged) 24 | 25 | def _onTimeChanged(self, time: QTime): 26 | cfg.set_value(self.configname, time.toString("HH:mm")) # 保存24小时制的时间到配置文件 27 | -------------------------------------------------------------------------------- /app/changelog_interface.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | from PyQt5.QtCore import Qt, QUrl 3 | from PyQt5.QtGui import QDesktopServices 4 | from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel 5 | 6 | from qfluentwidgets import ScrollArea 7 | from .common.style_sheet import StyleSheet 8 | 9 | import markdown 10 | import sys 11 | 12 | 13 | class ChangelogInterface(ScrollArea): 14 | def __init__(self, parent=None): 15 | super().__init__(parent=parent) 16 | self.view = QWidget(self) 17 | self.vBoxLayout = QVBoxLayout(self.view) 18 | self.titleLabel = QLabel(self.tr("更新日志"), self) 19 | self.contentLabel = QLabel("html_content", parent) 20 | html_style = """ 21 | 27 | """ 28 | try: 29 | with open("./assets/docs/Changelog.md", 'r', encoding='utf-8') as file: 30 | self.content = file.read() 31 | self.content = '\n'.join(self.content.split('\n')[2:]) 32 | except FileNotFoundError: 33 | sys.exit(1) 34 | html_content = html_style + markdown.markdown(self.content).replace('

', '

').replace('

', '
').replace('
', '', 1) + '
' 35 | self.contentLabel.setText(html_content) 36 | self.contentLabel.setOpenExternalLinks(True) 37 | self.contentLabel.linkActivated.connect(self.open_url) 38 | 39 | self.__initWidget() 40 | 41 | def __initWidget(self): 42 | self.titleLabel.move(36, 30) 43 | self.view.setObjectName('view') 44 | self.setViewportMargins(0, 80, 0, 20) 45 | self.setObjectName('changelogsInterface') 46 | self.contentLabel.setObjectName('contentLabel') 47 | self.titleLabel.setObjectName('changelogsLabel') 48 | StyleSheet.CHANGELOGS_INTERFACE.apply(self) 49 | 50 | self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) 51 | self.setWidget(self.view) 52 | self.setWidgetResizable(True) 53 | 54 | # self.vBoxLayout.setSpacing(8) 55 | # self.vBoxLayout.setAlignment(Qt.AlignTop) 56 | # self.vBoxLayout.addWidget(self.titleLabel, 0, Qt.AlignTop) 57 | 58 | # self.vBoxLayout.setSpacing(28) 59 | self.vBoxLayout.setContentsMargins(36, 0, 36, 0) 60 | self.vBoxLayout.addWidget(self.contentLabel, 0, Qt.AlignTop) 61 | 62 | def open_url(self, url): 63 | QDesktopServices.openUrl(QUrl(url)) 64 | -------------------------------------------------------------------------------- /app/common/config.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import sys 3 | from enum import Enum 4 | 5 | from PyQt5.QtCore import QLocale 6 | from qfluentwidgets import (qconfig, QConfig, ConfigItem, OptionsConfigItem, BoolValidator, 7 | OptionsValidator, RangeConfigItem, RangeValidator, 8 | FolderListValidator, EnumSerializer, FolderValidator, ConfigSerializer, __version__) 9 | 10 | 11 | class Language(Enum): 12 | """ Language enumeration """ 13 | 14 | CHINESE_SIMPLIFIED = QLocale(QLocale.Chinese, QLocale.China) 15 | CHINESE_TRADITIONAL = QLocale(QLocale.Chinese, QLocale.HongKong) 16 | ENGLISH = QLocale(QLocale.English) 17 | AUTO = QLocale() 18 | 19 | 20 | class LanguageSerializer(ConfigSerializer): 21 | """ Language serializer """ 22 | 23 | def serialize(self, language): 24 | return language.value.name() if language != Language.AUTO else "Auto" 25 | 26 | def deserialize(self, value: str): 27 | return Language(QLocale(value)) if value != "Auto" else Language.AUTO 28 | 29 | 30 | def isWin11(): 31 | return sys.platform == 'win32' and sys.getwindowsversion().build >= 22000 32 | 33 | 34 | class Config(QConfig): 35 | """ Config of application """ 36 | 37 | # folders 38 | musicFolders = ConfigItem( 39 | "Folders", "LocalMusic", [], FolderListValidator()) 40 | downloadFolder = ConfigItem( 41 | "Folders", "Download", "app/download", FolderValidator()) 42 | 43 | # main window 44 | micaEnabled = ConfigItem("MainWindow", "MicaEnabled", isWin11(), BoolValidator()) 45 | dpiScale = OptionsConfigItem( 46 | "MainWindow", "DpiScale", "Auto", OptionsValidator([1, 1.25, 1.5, 1.75, 2, "Auto"]), restart=True) 47 | language = OptionsConfigItem( 48 | "MainWindow", "Language", Language.AUTO, OptionsValidator(Language), LanguageSerializer(), restart=True) 49 | 50 | # Material 51 | blurRadius = RangeConfigItem("Material", "AcrylicBlurRadius", 15, RangeValidator(0, 40)) 52 | 53 | # software update 54 | checkUpdateAtStartUp = ConfigItem("Update", "CheckUpdateAtStartUp", True, BoolValidator()) 55 | 56 | 57 | YEAR = 2023 58 | AUTHOR = "zhiyiYo" 59 | VERSION = __version__ 60 | HELP_URL = "https://pyqt-fluent-widgets.readthedocs.io/zh_CN/latest" 61 | REPO_URL = "https://github.com/zhiyiYo/PyQt-Fluent-Widgets" 62 | EXAMPLE_URL = "https://github.com/zhiyiYo/PyQt-Fluent-Widgets/tree/master/examples" 63 | FEEDBACK_URL = "https://github.com/zhiyiYo/PyQt-Fluent-Widgets/issues" 64 | RELEASE_URL = "https://github.com/zhiyiYo/PyQt-Fluent-Widgets/releases/latest" 65 | SUPPORT_URL = "https://afdian.net/a/zhiyiYo" 66 | 67 | 68 | cfg = Config() 69 | # qconfig.load('app/config/config.json', cfg) -------------------------------------------------------------------------------- /app/common/icon.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from enum import Enum 3 | 4 | from qfluentwidgets import FluentIconBase, getIconColor, Theme 5 | 6 | 7 | class Icon(FluentIconBase, Enum): 8 | 9 | GRID = "Grid" 10 | MENU = "Menu" 11 | TEXT = "Text" 12 | EMOJI_TAB_SYMBOLS = "EmojiTabSymbols" 13 | 14 | def path(self, theme=Theme.AUTO): 15 | return f":/gallery/images/icons/{self.value}_{getIconColor(theme)}.svg" 16 | -------------------------------------------------------------------------------- /app/common/signal_bus.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from PyQt5.QtCore import QObject, pyqtSignal 3 | 4 | 5 | class SignalBus(QObject): 6 | """ Signal bus """ 7 | 8 | switchToSampleCard = pyqtSignal(str, int) 9 | micaEnableChanged = pyqtSignal(bool) 10 | supportSignal = pyqtSignal() 11 | 12 | 13 | signalBus = SignalBus() -------------------------------------------------------------------------------- /app/common/style_sheet.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from enum import Enum 3 | 4 | from qfluentwidgets import StyleSheetBase, Theme, isDarkTheme, qconfig 5 | 6 | 7 | class StyleSheet(StyleSheetBase, Enum): 8 | """ Style sheet """ 9 | 10 | LINK_CARD = "link_card" 11 | SAMPLE_CARD = "sample_card" 12 | HOME_INTERFACE = "home_interface" 13 | ICON_INTERFACE = "icon_interface" 14 | VIEW_INTERFACE = "view_interface" 15 | SETTING_INTERFACE = "setting_interface" 16 | GALLERY_INTERFACE = "gallery_interface" 17 | NAVIGATION_VIEW_INTERFACE = "navigation_view_interface" 18 | 19 | Tutorial_INTERFACE = "tutorial_interface" 20 | HELP_INTERFACE = "help_interface" 21 | CHANGELOGS_INTERFACE = "changelogs_interface" 22 | WARP_INTERFACE = "warp_interface" 23 | TOOLS_INTERFACE = "tools_interface" 24 | PIVOT = "pivot" 25 | 26 | def path(self, theme=Theme.AUTO): 27 | theme = qconfig.theme if theme == Theme.AUTO else theme 28 | return f"./assets/app/qss/{theme.value.lower()}/{self.value}.qss" 29 | -------------------------------------------------------------------------------- /app/common/translator.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from PyQt5.QtCore import QObject 3 | 4 | 5 | class Translator(QObject): 6 | 7 | def __init__(self, parent=None): 8 | super().__init__(parent=parent) 9 | self.text = self.tr('Text') 10 | self.view = self.tr('View') 11 | self.menus = self.tr('Menus & toolbars') 12 | self.icons = self.tr('Icons') 13 | self.layout = self.tr('Layout') 14 | self.dialogs = self.tr('Dialogs & flyouts') 15 | self.scroll = self.tr('Scrolling') 16 | self.material = self.tr('Material') 17 | self.dateTime = self.tr('Date & time') 18 | self.navigation = self.tr('Navigation') 19 | self.basicInput = self.tr('Basic input') 20 | self.statusInfo = self.tr('Status & info') -------------------------------------------------------------------------------- /app/common/trie.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from queue import Queue 3 | 4 | 5 | class Trie: 6 | """ String trie """ 7 | 8 | def __init__(self): 9 | self.key = '' 10 | self.value = None 11 | self.children = [None] * 26 12 | self.isEnd = False 13 | 14 | def insert(self, key: str, value): 15 | """ insert item """ 16 | key = key.lower() 17 | 18 | node = self 19 | for c in key: 20 | i = ord(c) - 97 21 | if not 0 <= i < 26: 22 | return 23 | 24 | if not node.children[i]: 25 | node.children[i] = Trie() 26 | 27 | node = node.children[i] 28 | 29 | node.isEnd = True 30 | node.key = key 31 | node.value = value 32 | 33 | def get(self, key, default=None): 34 | """ get value of key """ 35 | node = self.searchPrefix(key) 36 | if not (node and node.isEnd): 37 | return default 38 | 39 | return node.value 40 | 41 | def searchPrefix(self, prefix): 42 | """ search node matchs the prefix """ 43 | prefix = prefix.lower() 44 | node = self 45 | for c in prefix: 46 | i = ord(c) - 97 47 | if not (0 <= i < 26 and node.children[i]): 48 | return None 49 | 50 | node = node.children[i] 51 | 52 | return node 53 | 54 | def items(self, prefix): 55 | """ search items match the prefix """ 56 | node = self.searchPrefix(prefix) 57 | if not node: 58 | return [] 59 | 60 | q = Queue() 61 | result = [] 62 | q.put(node) 63 | 64 | while not q.empty(): 65 | node = q.get() 66 | if node.isEnd: 67 | result.append((node.key, node.value)) 68 | 69 | for c in node.children: 70 | if c: 71 | q.put(c) 72 | 73 | return result 74 | -------------------------------------------------------------------------------- /app/components/pivot.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtWidgets import QApplication 2 | from ..common.style_sheet import StyleSheet 3 | from qfluentwidgets import PushButton, pyqtSignal, setFont, Pivot 4 | 5 | 6 | class PivotItem(PushButton): 7 | """ Pivot item """ 8 | 9 | itemClicked = pyqtSignal(bool) 10 | 11 | def _postInit(self): 12 | self.isSelected = False 13 | self.setProperty('isSelected', False) 14 | self.clicked.connect(lambda: self.itemClicked.emit(True)) 15 | 16 | StyleSheet.PIVOT.apply(self) 17 | setFont(self, 18) 18 | 19 | def setSelected(self, isSelected: bool): 20 | if self.isSelected == isSelected: 21 | return 22 | 23 | self.isSelected = isSelected 24 | self.setProperty('isSelected', isSelected) 25 | self.setStyle(QApplication.style()) 26 | self.update() 27 | 28 | 29 | class SettingPivot(Pivot): 30 | def __init__(self, parent=None): 31 | super().__init__(parent) 32 | 33 | def insertItem(self, index: int, routeKey: str, text: str, onClick=None, icon=None): 34 | """ insert item 35 | 36 | Parameters 37 | ---------- 38 | index: int 39 | insert position 40 | 41 | routeKey: str 42 | the unique name of item 43 | 44 | text: str 45 | the text of navigation item 46 | 47 | onClick: callable 48 | the slot connected to item clicked signal 49 | 50 | icon: str 51 | the icon of navigation item 52 | """ 53 | if routeKey in self.items: 54 | return 55 | 56 | item = PivotItem(text, self) 57 | if icon: 58 | item.setIcon(icon) 59 | 60 | self.insertWidget(index, routeKey, item, onClick) 61 | return item 62 | -------------------------------------------------------------------------------- /app/tools/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/app/tools/__init__.py -------------------------------------------------------------------------------- /app/tools/check_theme_change.py: -------------------------------------------------------------------------------- 1 | # check_theme_change.py 修改如下 2 | from qfluentwidgets import setTheme, Theme, qconfig 3 | from PyQt5.QtCore import QThread, pyqtSignal 4 | import darkdetect 5 | import sys 6 | 7 | class SystemThemeListener(QThread): 8 | systemThemeChanged = pyqtSignal() 9 | 10 | def __init__(self, parent=None): 11 | super().__init__(parent=parent) 12 | self._isSupported = False # 初始设为不支持 13 | 14 | def run(self): 15 | # 运行时检测监听能力 16 | try: 17 | # 测试性调用检测实际支持情况 18 | darkdetect.listener(lambda _: None) 19 | self._isSupported = True 20 | except NotImplementedError: 21 | return 22 | 23 | # 正式注册监听(仅当支持时) 24 | darkdetect.listener(self._onThemeChanged) 25 | 26 | def _onThemeChanged(self, theme: str): 27 | theme = Theme.DARK if theme.lower() == "dark" else Theme.LIGHT 28 | if qconfig.themeMode.value != Theme.AUTO or theme == qconfig.theme: 29 | return 30 | qconfig.theme = Theme.AUTO 31 | qconfig._cfg.themeChanged.emit(Theme.AUTO) 32 | self.systemThemeChanged.emit() 33 | 34 | 35 | def checkThemeChange(self): 36 | def handle_theme_change(): 37 | setTheme(Theme.AUTO, lazy=True) 38 | 39 | # 先创建监听器(总是创建以保持接口一致) 40 | self.themeListener = SystemThemeListener(self) 41 | 42 | # 仅在检测到支持时启用 43 | if self.themeListener.isRunning(): # 通过运行状态判断 44 | self.themeListener.systemThemeChanged.connect(handle_theme_change) 45 | else: 46 | # 自动降级为手动模式 47 | # qconfig.set(qconfig.themeMode, Theme.LIGHT) # 或从配置读取 48 | self.themeListener = None # 释放无效监听器 49 | 50 | return self.themeListener -------------------------------------------------------------------------------- /assets/app/images/Bronya.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/Bronya.jpg -------------------------------------------------------------------------------- /assets/app/images/Herta.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/Herta.jpg -------------------------------------------------------------------------------- /assets/app/images/JingYuan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/JingYuan.jpg -------------------------------------------------------------------------------- /assets/app/images/March7th.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/March7th.jpg -------------------------------------------------------------------------------- /assets/app/images/SilverWolf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/SilverWolf.jpg -------------------------------------------------------------------------------- /assets/app/images/Yanqing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/Yanqing.jpg -------------------------------------------------------------------------------- /assets/app/images/bg37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/bg37.jpg -------------------------------------------------------------------------------- /assets/app/images/sponsor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/app/images/sponsor.jpg -------------------------------------------------------------------------------- /assets/app/qss/dark/changelogs_interface.qss: -------------------------------------------------------------------------------- 1 | #view { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | QLabel#contentLabel { 11 | font: 14px 'Microsoft YaHei Light'; 12 | color: white; 13 | } 14 | 15 | QLabel#changelogsLabel { 16 | font: 33px 'Microsoft YaHei Light'; 17 | background-color: transparent; 18 | color: white; 19 | } -------------------------------------------------------------------------------- /assets/app/qss/dark/gallery_interface.qss: -------------------------------------------------------------------------------- 1 | GalleryInterface, 2 | ToolBar, 3 | #view { 4 | background-color: transparent; 5 | } 6 | 7 | QScrollArea { 8 | border: none; 9 | } 10 | 11 | 12 | ToolBar>CaptionLabel { 13 | color: white; 14 | } 15 | 16 | ExampleCard { 17 | background-color: transparent; 18 | color: white; 19 | } 20 | 21 | TitleLabel, 22 | StrongBodyLabel { 23 | color: white; 24 | } 25 | 26 | ExampleCard>#card { 27 | border: 1px solid rgb(36, 36, 36); 28 | border-radius: 10px; 29 | background-color: rgba(0, 0, 0, 0.1795); 30 | } 31 | 32 | ExampleCard>#card QLabel { 33 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 34 | color: white; 35 | } 36 | 37 | ExampleCard>#card InfoBadge { 38 | font-size: 11px; 39 | } 40 | 41 | 42 | #sourceWidget { 43 | background-color: rgba(255, 255, 255, 0.09); 44 | border-top: 1px solid rgb(36, 36, 36); 45 | border-bottom-left-radius: 10px; 46 | border-bottom-right-radius: 10px; 47 | } 48 | -------------------------------------------------------------------------------- /assets/app/qss/dark/help_interface.qss: -------------------------------------------------------------------------------- 1 | HelpInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#helpLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | color: white; 16 | } 17 | 18 | #tutorialLabel { 19 | font: 14px 'Microsoft YaHei Light'; 20 | color: white; 21 | } 22 | 23 | QLabel#faqLabel { 24 | font: 14px 'Microsoft YaHei Light'; 25 | color: white; 26 | } 27 | 28 | QLabel#tasksLabel { 29 | font: 14px 'Microsoft YaHei Light'; 30 | color: white; 31 | } 32 | 33 | QLabel#changelogLabel { 34 | font: 14px 'Microsoft YaHei Light'; 35 | color: white; 36 | } 37 | 38 | 39 | -------------------------------------------------------------------------------- /assets/app/qss/dark/home_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, 2 | #view { 3 | background-color: transparent; 4 | } 5 | 6 | QScrollArea { 7 | border: none; 8 | background-color: transparent; 9 | } 10 | 11 | 12 | BannerWidget > #galleryLabel { 13 | font: 42px 'Segoe UI SemiBold', 'Microsoft YaHei SemiBold'; 14 | background-color: transparent; 15 | color: white; 16 | padding-left: 28px; 17 | } 18 | -------------------------------------------------------------------------------- /assets/app/qss/dark/icon_interface.qss: -------------------------------------------------------------------------------- 1 | IconCard { 2 | background-color: rgb(43, 43, 43); 3 | border: 1px solid rgb(29, 29, 29); 4 | border-radius: 6px; 5 | } 6 | 7 | IconCard > QLabel { 8 | color: rgb(207, 207, 207); 9 | font: 11px 'Segoe UI', 'PingFang SC'; 10 | } 11 | 12 | IconCard[isSelected=true] { 13 | background-color: --ThemeColorPrimary; 14 | } 15 | 16 | IconCard[isSelected=true] > QLabel { 17 | color: black; 18 | } 19 | 20 | #scrollWidget, #iconView { 21 | background-color: rgb(32, 32, 32); 22 | } 23 | 24 | IconCardView { 25 | background-color: transparent; 26 | } 27 | 28 | #iconView { 29 | border: 1px solid rgb(36, 36, 36); 30 | border-radius: 10px; 31 | } 32 | 33 | IconInfoPanel { 34 | background-color: rgb(43, 43, 43); 35 | border-left: 1px solid rgb(29, 29, 29); 36 | border-top-right-radius: 10px; 37 | border-bottom-right-radius: 10px; 38 | } 39 | 40 | IconInfoPanel>#nameLabel { 41 | font: 15px 'Segoe UI', 'PingFang SC'; 42 | font-weight: bold; 43 | color: white; 44 | } 45 | 46 | IconInfoPanel>#subTitleLabel { 47 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 48 | color: white; 49 | } 50 | 51 | IconInfoPanel>QLabel { 52 | font: 12px 'Segoe UI', 'PingFang SC'; 53 | color: rgb(207, 207, 207); 54 | } 55 | 56 | -------------------------------------------------------------------------------- /assets/app/qss/dark/link_card.qss: -------------------------------------------------------------------------------- 1 | LinkCard { 2 | border: 1px solid rgb(46, 46, 46); 3 | border-radius: 10px; 4 | background-color: rgba(39, 39, 39, 0.95); 5 | } 6 | 7 | LinkCard:hover { 8 | background-color: rgba(39, 39, 39, 0.93); 9 | border: 1px solid rgb(66, 66, 66); 10 | } 11 | 12 | #titleLabel { 13 | font: 18px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 14 | color: white; 15 | } 16 | 17 | #contentLabel { 18 | font: 12px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 19 | color: rgb(208, 208, 208); 20 | } 21 | 22 | LinkCardView { 23 | background-color: transparent; 24 | border: none; 25 | } 26 | 27 | #view { 28 | background-color: transparent; 29 | } -------------------------------------------------------------------------------- /assets/app/qss/dark/navigation_view_interface.qss: -------------------------------------------------------------------------------- 1 | PivotInterface QLabel, 2 | TabInterface QLabel { 3 | padding-left: 10px; 4 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 5 | color: white; 6 | } 7 | 8 | #controlPanel BodyLabel { 9 | padding-left: 0px; 10 | } 11 | 12 | #controlPanel { 13 | background-color: rgb(43, 43, 43); 14 | border-left: 1px solid rgb(50, 50, 50); 15 | border-top-right-radius: 10px; 16 | } -------------------------------------------------------------------------------- /assets/app/qss/dark/pivot.qss: -------------------------------------------------------------------------------- 1 | PivotItem { 2 | padding: 10px 12px; 3 | color: white; 4 | background-color: transparent; 5 | border: none; 6 | outline: none; 7 | } 8 | 9 | PivotItem[isSelected=true]:hover { 10 | color: rgba(255, 255, 255, 0.63); 11 | } 12 | 13 | PivotItem[isSelected=true]:pressed { 14 | color: rgba(255, 255, 255, 0.53); 15 | } 16 | 17 | PivotItem[isSelected=false]:pressed { 18 | color: rgba(255, 255, 255, 0.75); 19 | } 20 | 21 | PivotItem[hasIcon=false] { 22 | padding-left: 10px; 23 | padding-right: 10px; 24 | } 25 | 26 | PivotItem[hasIcon=true] { 27 | padding-left: 36px; 28 | padding-right: 12px; 29 | } 30 | 31 | Pivot { 32 | border: none; 33 | background-color: transparent; 34 | } 35 | 36 | #view { 37 | background-color: transparent; 38 | } 39 | 40 | SegmentedToolItem { 41 | padding: 5px 9px 6px 8px; 42 | } 43 | 44 | SegmentedWidget, 45 | SegmentedToolWidget { 46 | background-color: rgba(0, 0, 0, 0.1); 47 | border: 1px solid rgba(255, 255, 255, 0.08); 48 | border-radius: 6px; 49 | } 50 | 51 | SegmentedItem[isSelected=false], SegmentedToolItem[isSelected=false] { 52 | padding-top: 3px; 53 | padding-bottom: 3px; 54 | background-color: transparent; 55 | border: none; 56 | border-radius: 6px; 57 | margin: 3px 0px; 58 | } 59 | 60 | SegmentedItem[isSelected=false]:hover, 61 | SegmentedToolItem[isSelected=false]:hover { 62 | background-color: rgba(255, 255, 255, 9); 63 | } 64 | 65 | SegmentedItem[isSelected=false]:pressed, 66 | SegmentedToolItem[isSelected=false]:pressed { 67 | background-color: rgba(255, 255, 255, 6); 68 | } 69 | 70 | SegmentedItem[isSelected=true], 71 | SegmentedToolItem[isSelected=true] { 72 | padding-top: 6px; 73 | padding-bottom: 6px; 74 | margin: 0px; 75 | color: white; 76 | background-color: transparent; 77 | } 78 | -------------------------------------------------------------------------------- /assets/app/qss/dark/sample_card.qss: -------------------------------------------------------------------------------- 1 | #titleLabel { 2 | color: white; 3 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 4 | font-weight: bold; 5 | } 6 | 7 | #contentLabel { 8 | color: rgb(208, 208, 208); 9 | font: 12px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 10 | } 11 | 12 | #viewTitleLabel { 13 | color: white; 14 | font: 20px "Segoe UI SemiBold", "Microsoft YaHei", 'PingFang SC'; 15 | } -------------------------------------------------------------------------------- /assets/app/qss/dark/setting_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#settingLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | color: white; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /assets/app/qss/dark/tools_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#toolsLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | color: white; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /assets/app/qss/dark/view_interface.qss: -------------------------------------------------------------------------------- 1 | #frame { 2 | border: 1px solid rgba(255, 255, 255, 13); 3 | border-radius: 5px; 4 | background-color: transparent; 5 | } -------------------------------------------------------------------------------- /assets/app/qss/dark/warp_interface.qss: -------------------------------------------------------------------------------- 1 | #view { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | QLabel#contentLabel { 11 | font: 14px 'Microsoft YaHei Light'; 12 | color: white; 13 | } 14 | 15 | QLabel#warpLabel { 16 | font: 33px 'Microsoft YaHei Light'; 17 | background-color: transparent; 18 | color: white; 19 | } -------------------------------------------------------------------------------- /assets/app/qss/light/changelogs_interface.qss: -------------------------------------------------------------------------------- 1 | #view { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | QLabel#contentLabel { 11 | font: 14px 'Microsoft YaHei Light'; 12 | } 13 | 14 | QLabel#changelogsLabel { 15 | font: 33px 'Microsoft YaHei Light'; 16 | background-color: transparent; 17 | } -------------------------------------------------------------------------------- /assets/app/qss/light/gallery_interface.qss: -------------------------------------------------------------------------------- 1 | GalleryInterface, ToolBar, #view { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | } 8 | 9 | ToolBar > StrongBodyLabel { 10 | color: black; 11 | } 12 | 13 | ToolBar > CaptionLabel { 14 | color: rgb(95, 95, 95); 15 | } 16 | 17 | ExampleCard { 18 | background-color: transparent; 19 | } 20 | 21 | TitleLabel, 22 | StrongBodyLabel { 23 | color: black; 24 | } 25 | 26 | ExampleCard > #card { 27 | border: 1px solid rgba(0, 0, 0, 0.05); 28 | border-radius: 10px; 29 | background-color: rgba(0, 0, 0, 0.024); 30 | } 31 | 32 | ExampleCard > #card QLabel { 33 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 34 | color: black; 35 | } 36 | 37 | ExampleCard> #card InfoBadge { 38 | font-size: 11px; 39 | } 40 | 41 | #sourceWidget { 42 | background-color: rgba(255, 255, 255, 0.667); 43 | border-top: 1px solid rgba(0, 0, 0, 0.05); 44 | border-bottom-left-radius: 10px; 45 | border-bottom-right-radius: 10px; 46 | } 47 | -------------------------------------------------------------------------------- /assets/app/qss/light/help_interface.qss: -------------------------------------------------------------------------------- 1 | HelpInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | background-color: transparent; 7 | border: none; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#helpLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | } 16 | 17 | QLabel#tutorialLabel { 18 | font: 14px 'Microsoft YaHei Light'; 19 | } 20 | 21 | QLabel#faqLabel { 22 | font: 14px 'Microsoft YaHei Light'; 23 | } 24 | 25 | QLabel#tasksLabel { 26 | font: 14px 'Microsoft YaHei Light'; 27 | } 28 | 29 | QLabel#changelogLabel { 30 | font: 14px 'Microsoft YaHei Light'; 31 | } 32 | -------------------------------------------------------------------------------- /assets/app/qss/light/home_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, 2 | #view { 3 | background-color: transparent; 4 | } 5 | 6 | QScrollArea { 7 | border: none; 8 | background-color: transparent; 9 | } 10 | 11 | 12 | BannerWidget > #galleryLabel { 13 | font: 42px 'Segoe UI SemiBold', 'Microsoft YaHei SemiBold'; 14 | background-color: transparent; 15 | color: black; 16 | padding-left: 28px; 17 | } 18 | 19 | 20 | -------------------------------------------------------------------------------- /assets/app/qss/light/icon_interface.qss: -------------------------------------------------------------------------------- 1 | IconCard { 2 | background-color: rgb(251, 251, 251); 3 | border: 1px solid rgb(229, 229, 229); 4 | border-radius: 6px; 5 | } 6 | 7 | IconCard > QLabel { 8 | color: rgb(96, 96, 96); 9 | font: 11px 'Segoe UI', 'PingFang SC'; 10 | } 11 | 12 | IconCard[isSelected=true] { 13 | background-color: --ThemeColorPrimary; 14 | } 15 | 16 | IconCard[isSelected=true] > QLabel { 17 | color: white; 18 | } 19 | 20 | #scrollWidget, #iconView { 21 | background-color: rgb(243, 243, 243); 22 | } 23 | 24 | IconCardView { 25 | background-color: transparent; 26 | } 27 | 28 | #iconView { 29 | border: 1px solid rgb(234, 234, 234); 30 | border-radius: 10px; 31 | } 32 | 33 | 34 | IconInfoPanel { 35 | background-color: rgb(251, 251, 251); 36 | border-left: 1px solid rgb(229, 229, 229); 37 | border-top-right-radius: 10px; 38 | border-bottom-right-radius: 10px; 39 | } 40 | 41 | 42 | IconInfoPanel > #nameLabel { 43 | font: 15px 'Segoe UI', 'PingFang SC'; 44 | font-weight: bold; 45 | color: black; 46 | } 47 | 48 | IconInfoPanel > #subTitleLabel { 49 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 50 | color: black; 51 | } 52 | 53 | IconInfoPanel > QLabel { 54 | font: 12px 'Segoe UI', 'PingFang SC'; 55 | color: rgb(96, 96, 96); 56 | } 57 | 58 | -------------------------------------------------------------------------------- /assets/app/qss/light/link_card.qss: -------------------------------------------------------------------------------- 1 | LinkCard { 2 | border: 1px solid rgb(234, 234, 234); 3 | border-radius: 10px; 4 | background-color: rgba(249, 249, 249, 0.95); 5 | } 6 | 7 | LinkCard:hover { 8 | background-color: rgba(249, 249, 249, 0.93); 9 | border: 1px solid rgb(220, 220, 220); 10 | } 11 | 12 | #titleLabel { 13 | font: 18px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 14 | color: black; 15 | } 16 | 17 | #contentLabel { 18 | font: 12px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 19 | color: rgb(93, 93, 93); 20 | } 21 | 22 | LinkCardView { 23 | background-color: transparent; 24 | border: none; 25 | } 26 | 27 | #view { 28 | background-color: transparent; 29 | } -------------------------------------------------------------------------------- /assets/app/qss/light/navigation_view_interface.qss: -------------------------------------------------------------------------------- 1 | PivotInterface QLabel, 2 | TabInterface QLabel { 3 | padding-left: 10px; 4 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 5 | color: black; 6 | } 7 | 8 | #controlPanel BodyLabel { 9 | padding-left: 0px; 10 | } 11 | 12 | #controlPanel { 13 | background-color: white; 14 | border-left: 1px solid rgb(229, 229, 229); 15 | border-top-right-radius: 10px; 16 | } -------------------------------------------------------------------------------- /assets/app/qss/light/pivot.qss: -------------------------------------------------------------------------------- 1 | PivotItem { 2 | padding: 10px 12px; 3 | color: black; 4 | background-color: transparent; 5 | border: none; 6 | outline: none; 7 | margin: 0; 8 | } 9 | 10 | PivotItem[isSelected=true]:hover { 11 | color: rgba(0, 0, 0, 0.63); 12 | } 13 | 14 | PivotItem[isSelected=true]:pressed { 15 | color: rgba(0, 0, 0, 0.53); 16 | } 17 | 18 | PivotItem[isSelected=false]:pressed { 19 | color: rgba(0, 0, 0, 0.75); 20 | } 21 | 22 | PivotItem[hasIcon=false] { 23 | padding-left: 10px; 24 | padding-right: 10px; 25 | } 26 | 27 | PivotItem[hasIcon=true] { 28 | padding-left: 36px; 29 | padding-right: 12px; 30 | } 31 | 32 | Pivot { 33 | border: none; 34 | background-color: transparent; 35 | } 36 | 37 | #view { 38 | background-color: transparent; 39 | } 40 | 41 | SegmentedToolItem { 42 | padding: 5px 9px 6px 8px; 43 | } 44 | 45 | SegmentedWidget, SegmentedToolWidget { 46 | background-color: rgba(0, 0, 0, 0.0241); 47 | border: 1px solid rgba(0, 0, 0, 0.0578); 48 | border-radius: 6px; 49 | } 50 | 51 | SegmentedItem[isSelected=false], 52 | SegmentedToolItem[isSelected=false] { 53 | padding-top: 3px; 54 | padding-bottom: 3px; 55 | background-color: transparent; 56 | border: none; 57 | border-radius: 6px; 58 | margin: 3px 0px; 59 | } 60 | 61 | SegmentedItem[isSelected=false]:hover, 62 | SegmentedToolItem[isSelected=false]:hover { 63 | background-color: rgba(0, 0, 0, 9); 64 | } 65 | 66 | SegmentedItem[isSelected=false]:pressed, 67 | SegmentedToolItem[isSelected=false]:pressed { 68 | background-color: rgba(0, 0, 0, 6); 69 | } 70 | 71 | SegmentedItem[isSelected=true], 72 | SegmentedToolItem[isSelected=true] { 73 | padding-top: 6px; 74 | padding-bottom: 6px; 75 | margin: 0px; 76 | background-color: transparent; 77 | } 78 | 79 | SegmentedItem[isSelected=true]:hover, 80 | SegmentedItem[isSelected=true]:pressed, 81 | SegmentedToolItem[isSelected=true]:hover, 82 | SegmentedToolItem[isSelected=true]:pressed { 83 | color: black; 84 | } -------------------------------------------------------------------------------- /assets/app/qss/light/sample_card.qss: -------------------------------------------------------------------------------- 1 | #titleLabel { 2 | color: black; 3 | font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 4 | font-weight: bold; 5 | } 6 | 7 | #contentLabel { 8 | color: rgb(118, 118, 118); 9 | font: 12px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; 10 | } 11 | 12 | #viewTitleLabel { 13 | color: black; 14 | font: 20px "Segoe UI SemiBold", "Microsoft YaHei", 'PingFang SC'; 15 | } -------------------------------------------------------------------------------- /assets/app/qss/light/setting_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | background-color: transparent; 7 | border: none; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#settingLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | } 16 | -------------------------------------------------------------------------------- /assets/app/qss/light/tools_interface.qss: -------------------------------------------------------------------------------- 1 | SettingInterface, #scrollWidget { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | background-color: transparent; 7 | border: none; 8 | } 9 | 10 | 11 | /* 标签 */ 12 | QLabel#toolsLabel { 13 | font: 33px 'Microsoft YaHei Light'; 14 | background-color: transparent; 15 | } 16 | -------------------------------------------------------------------------------- /assets/app/qss/light/view_interface.qss: -------------------------------------------------------------------------------- 1 | #frame { 2 | border: 1px solid rgba(0, 0, 0, 15); 3 | border-radius: 5px; 4 | background-color: transparent; 5 | } -------------------------------------------------------------------------------- /assets/app/qss/light/warp_interface.qss: -------------------------------------------------------------------------------- 1 | #view { 2 | background-color: transparent; 3 | } 4 | 5 | QScrollArea { 6 | border: none; 7 | background-color: transparent; 8 | } 9 | 10 | QLabel#contentLabel { 11 | font: 14px 'Microsoft YaHei Light'; 12 | } 13 | 14 | QLabel#warpLabel { 15 | font: 33px 'Microsoft YaHei Light'; 16 | background-color: transparent; 17 | } -------------------------------------------------------------------------------- /assets/audio/pa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/audio/pa.mp3 -------------------------------------------------------------------------------- /assets/binary/7za.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/binary/7za.exe -------------------------------------------------------------------------------- /assets/binary/aria2c.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/binary/aria2c.exe -------------------------------------------------------------------------------- /assets/config/character_names.json: -------------------------------------------------------------------------------- 1 | { 2 | "Arlan": "阿兰", 3 | "Asta": "艾丝妲", 4 | "Bailu": "白露", 5 | "Bronya": "布洛妮娅", 6 | "Boothill": "波提欧", 7 | "DanHeng": "丹恒", 8 | "DanHengImbibitorLunae": "丹恒·饮月", 9 | "Jade": "翡翠", 10 | "Feixiao": "飞霄", 11 | "FuXuan": "符玄", 12 | "Guinaifen": "桂乃芬", 13 | "Huohuo": "藿藿", 14 | "Sparkle": "花火", 15 | "Hook": "虎克", 16 | "Acheron": "黄泉", 17 | "Herta": "黑塔", 18 | "BlackSwan": "黑天鹅", 19 | "Hanya": "寒鸦", 20 | "Jingliu": "镜流", 21 | "Gallagher": "加拉赫", 22 | "Gepard": "杰帕德", 23 | "Jiaoqiu": "椒丘", 24 | "JingYuan": "景元", 25 | "Himeko": "姬子", 26 | "Kafka": "卡芙卡", 27 | "Clara": "克拉拉", 28 | "Luocha": "罗刹", 29 | "Luka": "卢卡", 30 | "Lynx": "玲可", 31 | "Rappa": "乱破", 32 | "Lingsha": "灵砂", 33 | "Firefly": "流萤", 34 | "Misha": "米沙", 35 | "Moze": "貊泽", 36 | "Natasha": "娜塔莎", 37 | "Pela": "佩拉", 38 | "Qingque": "青雀", 39 | "CaelumPreservation": "穹(存护)", 40 | "CaelumDestruction": "穹(毁灭)", 41 | "CaelumImaginary": "穹(同谐)", 42 | "CaelumRemembrance": "穹(记忆)", 43 | "Blade": "刃", 44 | "RuanMei": "阮·梅", 45 | "Sampo": "桑博", 46 | "Aventurine": "砂金", 47 | "Sushang": "素裳", 48 | "March7th": "三月七(冰)", 49 | "March7thImaginary": "三月七(虚数)", 50 | "TopazandNumby": "托帕&账账", 51 | "Tingyun": "停云", 52 | "Welt": "瓦尔特", 53 | "Seele": "希儿", 54 | "Serval": "希露瓦", 55 | "Sunday": "星期日", 56 | "Xueyi": "雪衣", 57 | "StellePreservation": "星(存护)", 58 | "StelleDestruction": "星(毁灭)", 59 | "StelleImaginary": "星(同谐)", 60 | "StelleRemembrance": "星(记忆)", 61 | "Yukong": "驭空", 62 | "SilverWolf": "银狼", 63 | "Yunli": "云璃", 64 | "Yanqing": "彦卿", 65 | "Argenti": "银枝", 66 | "Robin": "知更鸟", 67 | "DrRatio": "真理医生", 68 | "Fugue": "忘归人", 69 | "TheHerta": "大黑塔", 70 | "Aglaea": "阿格莱雅", 71 | "Tribbie": "缇宝", 72 | "Castorice": "遐蝶" 73 | } 74 | -------------------------------------------------------------------------------- /assets/config/instance_names.json: -------------------------------------------------------------------------------- 1 | { 2 | "拟造花萼(金)": { 3 | "无": "跳过", 4 | "回忆之蕾": "角色经验", 5 | "以太之蕾": "武器经验", 6 | "藏珍之蕾": "信用点" 7 | }, 8 | "拟造花萼(赤)": { 9 | "无": "跳过", 10 | "收容舱段": "毁灭之蕾", 11 | "支援舱段": "存护之蕾", 12 | "城郊雪原": "巡猎之蕾", 13 | "边缘通路": "丰饶之蕾", 14 | "铆钉镇": "智识之蕾", 15 | "机械聚落": "同谐之蕾", 16 | "大矿区": "虚无之蕾", 17 | "鳞渊境": "毁灭之蕾", 18 | "丹鼎司": "虚无之蕾", 19 | "「白日梦」酒店-梦境": "同谐之蕾", 20 | "绥园": "丰饶之蕾", 21 | "克劳克影视乐园": "存护之蕾", 22 | "苏乐达™热砂海选会场": "巡猎之蕾", 23 | "匹诺康尼大剧院": "智识之蕾", 24 | "「纷争荒墟」悬锋城": "记忆之蕾" 25 | }, 26 | "凝滞虚影": { 27 | "无": "跳过", 28 | "空海之形": "希儿 / 银狼 / 青雀", 29 | "巽风之形": "布洛妮娅 / 丹恒 / 桑博", 30 | "鸣雷之形": "白露 / 停云 / 希露瓦 / 阿兰", 31 | "炎华之形": "姬子 / 艾丝妲 / 虎克", 32 | "锋芒之形": "克拉拉 / 素裳 / 娜塔莎 / 卢卡", 33 | "霜晶之形": "杰帕德 / 三月七 / 佩拉 / 黑塔", 34 | "幻光之形": "罗刹 / 瓦尔特 / 驭空", 35 | "冰棱之形": "镜流 / 彦卿 / 阮·梅", 36 | "震厄之形": "景元 / 卡芙卡 / 黄泉", 37 | "偃偶之形": "丹恒·饮月 / 真理医生 / 砂金", 38 | "孽兽之形": "符玄 / 玲可 / 雪衣", 39 | "天人之形": "刃 / 藿藿 / 黑天鹅", 40 | "幽府之形": "银枝 / 寒鸦", 41 | "燔灼之形": "托帕&账账 / 桂乃芬 / 忘归人", 42 | "冰酿之形": "米沙 / 大黑塔", 43 | "焦炙之形": "花火 / 翡翠", 44 | "嗔怒之形": "加拉赫 / 流萤 / 椒丘 / 灵砂", 45 | "职司之形": "知更鸟 / 波提欧 / 云璃", 46 | "机狼之形": "貊泽 / 阿格莱亚", 47 | "今宵之形": "飞霄", 48 | "弦音之形": "乱破 / 星期日", 49 | "凛月之形": "缇宝 / 遐蝶", 50 | "役轮之形": "万敌" 51 | }, 52 | "侵蚀隧洞": { 53 | "无": "跳过", 54 | "霜风之径": "冰套 / 风套", 55 | "迅拳之径": "物理套 / 击破套", 56 | "漂泊之径": "治疗套 / 快枪手", 57 | "睿治之径": "铁卫套 / 量子套", 58 | "圣颂之径": "防御套 / 雷套", 59 | "野焰之径": "火套 / 虚数套", 60 | "药使之径": "生命套 / 速度套", 61 | "幽冥之径": "追击套 / dot套", 62 | "梦潜之径": "负面套 / 新击破套", 63 | "勇骑之径": "铁骑套 / 勇烈套", 64 | "迷识之径": "司铎套 / 学者套", 65 | "弦歌之径": "英豪套 / 诗人套" 66 | }, 67 | "饰品提取": { 68 | "无": "跳过", 69 | "纷争不休": "拾骨地 / 巨树", 70 | "蠹役饥肠": "露莎卡 / 蕉乐园", 71 | "永恒笑剧": "奔狼 / 劫火", 72 | "伴你入眠": "茨冈尼亚 / 高天神国", 73 | "天剑如雨": "苍穹 / 匹诺康尼", 74 | "孽果盘生": "繁星 / 龙骨", 75 | "百年冻土": "贝洛伯格 / 萨尔索图", 76 | "温柔话语": "公司 / 差分机", 77 | "浴火钢心": "盗贼 / 翁瓦克", 78 | "坚城不倒": "太空 / 仙舟" 79 | }, 80 | "历战余响": { 81 | "无": "跳过", 82 | "心兽的战场": "「飞霄」之影", 83 | "尘梦的赞礼": "「齐响诗班」神主日", 84 | "蛀星的旧靥": "碎星王虫", 85 | "不死的神实": "幻胧", 86 | "寒潮的落幕": "可可利亚,虚妄之母", 87 | "毁灭的开端": "末日兽" 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /assets/config/ocr_replacements.json: -------------------------------------------------------------------------------- 1 | { 2 | "direct": { 3 | "翼风之形": "巽风之形", 4 | "嘎偶之形": "偃偶之形", 5 | "優偶之形": "偃偶之形", 6 | "厦偶之形": "偃偶之形", 7 | "潘灼之形": "燔灼之形", 8 | "熠灼之形": "燔灼之形", 9 | "幽寞之径": "幽冥之径", 10 | "幽幂之径": "幽冥之径", 11 | "焦灸之形": "焦炙之形", 12 | "集多之形": "焦炙之形", 13 | "蛀星的旧履": "蛀星的旧靥", 14 | "蛀星的旧膚": "蛀星的旧靥", 15 | "蛀星的旧魔": "蛀星的旧靥", 16 | "蛀星的日履": "蛀星的旧靥", 17 | "蛀星的日膚": "蛀星的旧靥", 18 | "蛀星的日魔": "蛀星的旧靥", 19 | "“异器盈界": "异器盈界", 20 | "“花藏繁生": "花藏繁生", 21 | "“位面分裂": "位面分裂", 22 | "拟造花萼 (赤)": "拟造花萼(赤)", 23 | "拟造花萼 (金)": "拟造花萼(金)", 24 | "拟造花萼 (赤)": "拟造花萼(赤)", 25 | "拟造花萼 (金)": "拟造花萼(金)", 26 | "「庆典祝礼": "庆典祝礼", 27 | "“庆典祝礼": "庆典祝礼", 28 | "苏乐达TM": "苏乐达™", 29 | "囊役饥肠": "蠹役饥肠", 30 | "锋芒薪露": "锋芒斩露", 31 | "锋芒蕲露": "锋芒斩露" 32 | }, 33 | "conditional": { 34 | "风之形": "巽风之形", 35 | "芒之形": "锋芒之形", 36 | "偶之形": "偃偶之形", 37 | "兽之形": "孽兽之形", 38 | "灼之形": "燔灼之形", 39 | "幽之径": "幽冥之径", 40 | "冥之径": "幽冥之径", 41 | "怒之形": "嗔怒之形", 42 | "蛀星的旧": "蛀星的旧靥", 43 | "果盘生": "孽果盘生", 44 | "役饥肠": "蠹役饥肠" 45 | } 46 | } -------------------------------------------------------------------------------- /assets/config/task_mappings.json: -------------------------------------------------------------------------------- 1 | { 2 | "完成1个日常任务": "完成1个日常任务", 3 | "金": "完成1次「拟造花萼(金)」", 4 | "赤": "完成1次「拟造花萼(赤)」", 5 | "凝滞虚": "完成1次「凝滞虚影」", 6 | "侵蚀隧": "完成1次「侵蚀隧洞」", 7 | "属性": "单场战斗中,触发3种不同属性的弱点击破", 8 | "效果": "累计触发弱点击破效果5次", 9 | "敌人": "累计消灭20个敌人", 10 | "利用弱点": "利用弱点进入战斗并获胜3次", 11 | "秘技": "累计施放2次秘技", 12 | "委托": "派遣1次委托", 13 | "拍照": "拍照1次", 14 | "可破坏": "累计击碎3个可破坏物", 15 | "忘却之": "完成1次「忘却之庭」", 16 | "历战余": "完成1次「历战余响」", 17 | "模拟宇宙": "通关「模拟宇宙」(任意世界)的1个区域", 18 | "支援角色": "使用支援角色并获得战斗胜利1次", 19 | "终结技": "施放终结技造成制胜一击1次", 20 | "角色等级": "将任意角色等级提升1次", 21 | "光锥等级": "将任意光锥等级提升1次", 22 | "遗器等级": "将任意遗器等级提升1次", 23 | "分解任意1件遗器": "分解任意1件遗器", 24 | "合成1次消耗品": "合成1次消耗品", 25 | "合成1次材料": "合成1次材料", 26 | "使用1件消耗品": "使用1件消耗品", 27 | "登录游戏": "登录游戏", 28 | "累计消耗": "累计消耗120点开拓力", 29 | "万能合成": "使用1次「万能合成机」", 30 | "模拟宇": "完成1次「差分宇宙」或「模拟宇宙」" 31 | } -------------------------------------------------------------------------------- /assets/config/version.txt: -------------------------------------------------------------------------------- 1 | v2025.4.18 -------------------------------------------------------------------------------- /assets/docs/Background.md: -------------------------------------------------------------------------------- 1 | # 后台运行 2 | 3 | > 远程本地多用户桌面(是一台电脑,不需要两台电脑) 4 | 5 | * 模拟器运行拥有卡顿,性能消耗大等诸多缺点 6 | * 我们推荐您使用 Windows 自带的远程桌面服务进行该程序 7 | * 在电脑上直接运行的性能消耗要小于模拟器 8 | * Windows 开启远程桌面多用户教程: 9 | * [详细教程 by_Rin](https://www.bilibili.com/read/cv24286313/)(⭐推荐⭐) 10 | * [RDPWrap 方法](https://blog.sena.moe/win10-multiple-RDP/) 11 | * [修改文件方法](https://www.wyr.me/post/701) 12 | * [详细教程 by_Rin](https://www.bilibili.com/read/cv24286313/) 中所有相关文件:[下载链接](https://github.com/CHNZYX/asu_version_latest/releases/download/RDP/LocalRemoteDesktop1.191_by_lin.zip) 13 | * 备用链接 14 | * [百度网盘](https://pan.baidu.com/s/13aoll4n1gmKlPT9WwNYeEw?pwd=jbha) 提取码:jbha 15 | * [GitHub镜像](https://github.kotori.top/https://github.com/CHNZYX/asu_version_latest/releases/download/RDP/LocalRemoteDesktop1.191_by_lin.zip) 16 | 17 | 18 | 19 | ## 对于 Windows 11 用户 20 | 21 | 在 [详细教程 by_Rin](https://www.bilibili.com/read/cv24286313/) 中提到的 `SuperRDP` 软件可能已无法使用,建议改用 [TermsrvPatcher](https://github.com/fabianosrc/TermsrvPatcher)。如果你在国内使用,可以通过备用链接下载:[蓝奏云](https://wwsj.lanzout.com/i4V8u2np8dna)。 22 | 23 | **注意:** 此方法仅实现了[详细教程 by_Rin](https://www.bilibili.com/read/cv24286313/)中`4. 多用户同时登陆补丁`的功能,其余步骤请继续按照原教程进行。 24 | 25 | **使用方法:** 26 | 27 | 1. 使用 `git clone` 克隆仓库,或直接下载压缩包。 28 | 2. 下载完成后,解压压缩包,找到 `TermsrvPatcher.ps1` 文件,右键点击选择“运行”,脚本将自动完成所有操作。 29 | 30 | 此外,如果你希望手动修改文件,可以参考博客文章:[修改文件方法](https://www.wyr.me/post/701)。不过需要注意的是,该博客中的部分操作在 Windows 11 上可能不适用,具体如下: 31 | 32 | - **在 Windows 11 中需搜索的字符串(正则):** 33 | `39 81 3C 06 00 00 0F (?:[0-9A-F]{2} ){4}00`(实际操作中,仅需搜索`39 81 3C 06 00 00 0F`即可,剩下的两个16进制数符合正则表达式再进行修改) 34 | - **替换为的字符串:** 35 | `8B 81 38 06 00 00 39 81 3C 06 00 00 75` 36 | 37 | -------------------------------------------------------------------------------- /assets/docs/FAQ.md: -------------------------------------------------------------------------------- 1 | # 常见问题 2 | 3 | 视频教程 [https://search.bilibili.com/all?keyword=三月七小助手](https://search.bilibili.com/all?keyword=%E4%B8%89%E6%9C%88%E4%B8%83%E5%B0%8F%E5%8A%A9%E6%89%8B) 4 | 5 | ### Q:小助手总是更新失败/下载速度缓慢 怎么办? 6 | 7 | A:March7thAssistant 接入了第三方服务 [Mirror酱](https://mirrorchyan.com/)(一个给开源社区做有偿内容分发的平台)。 8 | 9 | 它为我们提供了免费的检查更新接口,但它的下载是有偿的,需要用户付费使用。 10 | 11 | 不过,即使不购买 Mirror 酱的下载服务,你也可以在检测到更新后,在设置里选择从海外源(GitHub)下载~ 12 | 13 | 如果你购买并填写了 CDK,更新时就再也不用和自己的网络环境斗智斗勇咯,下载更快更稳定! 14 | 15 | 同时 CDK 也可以用于其他接入 Mirror酱 的项目,例如 MAA 等。 16 | 17 | [首次下载可点我前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/download?rid=March7thAssistant&os=&arch=&channel=stable) 18 | 19 | ### Q:小助手启动慢/出现错误 2147942402/总是被杀毒软件删除 怎么办? 20 | 21 | A:将`小助手文件夹`加入杀毒软件排除项/白名单/信任区,然后使用 `March7th Updater.exe` 自动更新或手动更新一次。 22 | 23 | Windows Defender:`病毒和威胁防护` → `管理设置` → `添加或删除排除项` 可以参考 [#373](https://github.com/moesnow/March7thAssistant/issues/373) 图示操作 24 | 25 | 火绒安全软件:`主界面` → `右上角菜单` → `信任区` 可以参考 [教程](https://cs.xunyou.com/html/282/15252.shtml) 图示操作 26 | 27 | ### Q:缺少新增加的副本?逐光捡金缺少新角色? 28 | 29 | A:在`副本名称`界面手动输入名称,或编辑 `assets\config\instance_names.json` 文件手动添加。 30 | 31 | 在忘却之庭的界面,用小助手工具箱中的`捕获截图`功能,勾选角色头像,点击`保存所选截图`后, 32 | 33 | 放入 `assets\images\share\character` ,并修改 `assets\config\character_names.json` 文件。 34 | 35 | 同时欢迎用`未压缩`的方式上传到 [Issue](https://github.com/moesnow/March7thAssistant/issues),比如压缩包,或者 [PR](https://github.com/moesnow/March7thAssistant/pulls) 也可以。 36 | 37 | ### Q:完整运行的作用是什么 38 | 39 | A:按照 `日常`→`清体力`→`锄大地`→`模拟宇宙`→`逐光捡金`→`领取奖励` 的顺序依次执行 40 | 41 | 已经判断为完成的任务不会重复运行,其中日常和锄大地的重置时间为每天凌晨4点, 42 | 43 | 模拟宇宙和逐光捡金的重置时间为每周一凌晨4点。 44 | 45 | ### Q:开始运行后就不能移动键盘鼠标和切换到后台了吗 46 | 47 | A:是的,如果需要后台运行,请尝试 [远程本地多用户桌面](https://moesnow.github.io/March7thAssistant/#/assets/docs/Background) 48 | 49 | ### Q:添加自定义通知的方式 50 | 51 | A:图形界面内只支持启用`Windows原生通知`,需要其他通知请在 `config.yaml` 中开启。 52 | 53 | ### Q:模拟宇宙能修改第几个世界、角色、命途以及难度吗? 54 | 55 | A:选好世界和角色进入一次再退出即可,命途和难度可以在设置中找到模拟宇宙,点击原版运行,在图形界面内修改 56 | 57 | ### Q:模拟宇宙其他问题 58 | 59 | A:快速上手,请访问:[项目文档](https://github.com/Night-stars-1/Auto_Simulated_Universe_Docs/blob/docs/docs/guide/index.md) 60 | 61 | 遇到问题,请在提问前查看:[Q&A](https://github.com/Night-stars-1/Auto_Simulated_Universe_Docs/blob/docs/docs/guide/qa.md) 62 | 63 | ### Q:锄大地卡住不动,总是就是不正常运行 64 | 65 | A:请检查是否存在未解锁的传送点、地图大门,未完成的机巧鸟等任务。 66 | 67 | ### Q:锄大地中途中断了,怎么从指定地图运行呢 68 | 69 | A:在设置中找到锄大地,点击原版运行,选择调试模式就可以选地图。 70 | -------------------------------------------------------------------------------- /assets/docs/_sidebar.md: -------------------------------------------------------------------------------- 1 | - [主页](/README.md) 2 | - [使用教程](/assets/docs/Tutorial.md) 3 | - [常见问题](/assets/docs/FAQ.md) 4 | - [更新日志](/assets/docs/Changelog.md) 5 | - [后台运行](/assets/docs/Background.md) -------------------------------------------------------------------------------- /assets/images/apocalyptic/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/apocalyptic/back.png -------------------------------------------------------------------------------- /assets/images/apocalyptic/begin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/apocalyptic/begin.png -------------------------------------------------------------------------------- /assets/images/apocalyptic/next_node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/apocalyptic/next_node.png -------------------------------------------------------------------------------- /assets/images/apocalyptic/team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/apocalyptic/team.png -------------------------------------------------------------------------------- /assets/images/apocalyptic/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/apocalyptic/warning.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/again.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/again.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/back.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/memory-fin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/memory-fin.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/memory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/memory.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/memory_of_chaos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/memory_of_chaos.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/pause.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/prepare_fight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/prepare_fight.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/receive.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/reset.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/star.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/start.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/start2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/start2.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/switch.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/team1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/team1.png -------------------------------------------------------------------------------- /assets/images/forgottenhall/team2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/forgottenhall/team2.png -------------------------------------------------------------------------------- /assets/images/purefiction/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/back.png -------------------------------------------------------------------------------- /assets/images/purefiction/choose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/choose.png -------------------------------------------------------------------------------- /assets/images/purefiction/confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/confirm.png -------------------------------------------------------------------------------- /assets/images/purefiction/fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/fail.png -------------------------------------------------------------------------------- /assets/images/purefiction/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/plus.png -------------------------------------------------------------------------------- /assets/images/purefiction/prepare_fight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/prepare_fight.png -------------------------------------------------------------------------------- /assets/images/purefiction/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/star.png -------------------------------------------------------------------------------- /assets/images/purefiction/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/start.png -------------------------------------------------------------------------------- /assets/images/purefiction/start_story.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/purefiction/start_story.png -------------------------------------------------------------------------------- /assets/images/screen/account_and_password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/account_and_password.png -------------------------------------------------------------------------------- /assets/images/screen/account_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/account_field.png -------------------------------------------------------------------------------- /assets/images/screen/activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/activity.png -------------------------------------------------------------------------------- /assets/images/screen/agree_conditions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/agree_conditions.png -------------------------------------------------------------------------------- /assets/images/screen/agree_update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/agree_update.png -------------------------------------------------------------------------------- /assets/images/screen/apocalyptic/apocalyptic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/apocalyptic/apocalyptic.png -------------------------------------------------------------------------------- /assets/images/screen/bag/bag_consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/bag/bag_consumables.png -------------------------------------------------------------------------------- /assets/images/screen/bag/bag_relicset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/bag/bag_relicset.png -------------------------------------------------------------------------------- /assets/images/screen/bilibili_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/bilibili_login.png -------------------------------------------------------------------------------- /assets/images/screen/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/camera.png -------------------------------------------------------------------------------- /assets/images/screen/click_enter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/click_enter.png -------------------------------------------------------------------------------- /assets/images/screen/configure_team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/configure_team.png -------------------------------------------------------------------------------- /assets/images/screen/dispatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/dispatch.png -------------------------------------------------------------------------------- /assets/images/screen/enter_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/enter_game.png -------------------------------------------------------------------------------- /assets/images/screen/forgottenhall/memory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/forgottenhall/memory.png -------------------------------------------------------------------------------- /assets/images/screen/forgottenhall/memory_of_chaos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/forgottenhall/memory_of_chaos.png -------------------------------------------------------------------------------- /assets/images/screen/guide/enter_guide2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/enter_guide2.png -------------------------------------------------------------------------------- /assets/images/screen/guide/enter_guide3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/enter_guide3.png -------------------------------------------------------------------------------- /assets/images/screen/guide/enter_guide4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/enter_guide4.png -------------------------------------------------------------------------------- /assets/images/screen/guide/enter_guide5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/enter_guide5.png -------------------------------------------------------------------------------- /assets/images/screen/guide/guide2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/guide2.png -------------------------------------------------------------------------------- /assets/images/screen/guide/guide3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/guide3.png -------------------------------------------------------------------------------- /assets/images/screen/guide/guide4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/guide4.png -------------------------------------------------------------------------------- /assets/images/screen/guide/guide5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/guide5.png -------------------------------------------------------------------------------- /assets/images/screen/guide/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/plus.png -------------------------------------------------------------------------------- /assets/images/screen/guide/power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/guide/power.png -------------------------------------------------------------------------------- /assets/images/screen/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/mail.png -------------------------------------------------------------------------------- /assets/images/screen/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/main.png -------------------------------------------------------------------------------- /assets/images/screen/map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/map.png -------------------------------------------------------------------------------- /assets/images/screen/map3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/map3d.png -------------------------------------------------------------------------------- /assets/images/screen/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/menu.png -------------------------------------------------------------------------------- /assets/images/screen/monthly_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/monthly_card.png -------------------------------------------------------------------------------- /assets/images/screen/pass/pass1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/pass/pass1.png -------------------------------------------------------------------------------- /assets/images/screen/pass/pass2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/pass/pass2.png -------------------------------------------------------------------------------- /assets/images/screen/password_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/password_field.png -------------------------------------------------------------------------------- /assets/images/screen/photo_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/photo_preview.png -------------------------------------------------------------------------------- /assets/images/screen/purefiction/purefiction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/purefiction/purefiction.png -------------------------------------------------------------------------------- /assets/images/screen/redemption.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/redemption.png -------------------------------------------------------------------------------- /assets/images/screen/start_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/start_game.png -------------------------------------------------------------------------------- /assets/images/screen/start_srpass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/start_srpass.png -------------------------------------------------------------------------------- /assets/images/screen/synthesis/consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/synthesis/consumables.png -------------------------------------------------------------------------------- /assets/images/screen/synthesis/material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/synthesis/material.png -------------------------------------------------------------------------------- /assets/images/screen/universe/divergent_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/divergent_main.png -------------------------------------------------------------------------------- /assets/images/screen/universe/leave_temporarily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/leave_temporarily.png -------------------------------------------------------------------------------- /assets/images/screen/universe/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/switch.png -------------------------------------------------------------------------------- /assets/images/screen/universe/universe_expansion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/universe_expansion.png -------------------------------------------------------------------------------- /assets/images/screen/universe/universe_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/universe_main.png -------------------------------------------------------------------------------- /assets/images/screen/universe/universe_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/universe_map.png -------------------------------------------------------------------------------- /assets/images/screen/universe/universe_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/universe/universe_report.png -------------------------------------------------------------------------------- /assets/images/screen/visa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/visa.png -------------------------------------------------------------------------------- /assets/images/screen/wallpaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/wallpaper.png -------------------------------------------------------------------------------- /assets/images/screen/warp/character_warp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/warp/character_warp.png -------------------------------------------------------------------------------- /assets/images/screen/warp/himeko_prepare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/warp/himeko_prepare.png -------------------------------------------------------------------------------- /assets/images/screen/warp/himeko_try.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/warp/himeko_try.png -------------------------------------------------------------------------------- /assets/images/screen/warp/himeko_try_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/warp/himeko_try_banner.png -------------------------------------------------------------------------------- /assets/images/screen/warp/stellar_warp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/warp/stellar_warp.png -------------------------------------------------------------------------------- /assets/images/screen/welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/screen/welcome.png -------------------------------------------------------------------------------- /assets/images/share/bag/defensive_medicine_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/bag/defensive_medicine_selected.png -------------------------------------------------------------------------------- /assets/images/share/base/F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/base/F.png -------------------------------------------------------------------------------- /assets/images/share/base/RedExclamationMark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/base/RedExclamationMark.png -------------------------------------------------------------------------------- /assets/images/share/base/not_auto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/base/not_auto.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/abundance1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/abundance1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/destruction1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/destruction1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/destruction2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/destruction2.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/erudition1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/erudition1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/harmony1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/harmony1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/harmony2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/harmony2.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/hunt1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/hunt1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/nihility1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/nihility1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/nihility2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/nihility2.png -------------------------------------------------------------------------------- /assets/images/share/calyx/crimson/preservation1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/crimson/preservation1.png -------------------------------------------------------------------------------- /assets/images/share/calyx/golden/Jarilo-VI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/golden/Jarilo-VI.png -------------------------------------------------------------------------------- /assets/images/share/calyx/golden/Penacony.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/golden/Penacony.png -------------------------------------------------------------------------------- /assets/images/share/calyx/golden/XianzhouLuofu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/calyx/golden/XianzhouLuofu.png -------------------------------------------------------------------------------- /assets/images/share/character/Acheron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Acheron.png -------------------------------------------------------------------------------- /assets/images/share/character/Aglaea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Aglaea.png -------------------------------------------------------------------------------- /assets/images/share/character/Argenti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Argenti.png -------------------------------------------------------------------------------- /assets/images/share/character/Arlan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Arlan.png -------------------------------------------------------------------------------- /assets/images/share/character/Asta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Asta.png -------------------------------------------------------------------------------- /assets/images/share/character/Aventurine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Aventurine.png -------------------------------------------------------------------------------- /assets/images/share/character/Bailu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Bailu.png -------------------------------------------------------------------------------- /assets/images/share/character/BlackSwan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/BlackSwan.png -------------------------------------------------------------------------------- /assets/images/share/character/Blade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Blade.png -------------------------------------------------------------------------------- /assets/images/share/character/Boothill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Boothill.png -------------------------------------------------------------------------------- /assets/images/share/character/Bronya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Bronya.png -------------------------------------------------------------------------------- /assets/images/share/character/CaelumDestruction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/CaelumDestruction.png -------------------------------------------------------------------------------- /assets/images/share/character/CaelumImaginary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/CaelumImaginary.png -------------------------------------------------------------------------------- /assets/images/share/character/CaelumPreservation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/CaelumPreservation.png -------------------------------------------------------------------------------- /assets/images/share/character/CaelumRemembrance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/CaelumRemembrance.png -------------------------------------------------------------------------------- /assets/images/share/character/Castorice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Castorice.png -------------------------------------------------------------------------------- /assets/images/share/character/Clara.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Clara.png -------------------------------------------------------------------------------- /assets/images/share/character/DanHeng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/DanHeng.png -------------------------------------------------------------------------------- /assets/images/share/character/DanHengImbibitorLunae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/DanHengImbibitorLunae.png -------------------------------------------------------------------------------- /assets/images/share/character/DrRatio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/DrRatio.png -------------------------------------------------------------------------------- /assets/images/share/character/Feixiao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Feixiao.png -------------------------------------------------------------------------------- /assets/images/share/character/Firefly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Firefly.png -------------------------------------------------------------------------------- /assets/images/share/character/FuXuan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/FuXuan.png -------------------------------------------------------------------------------- /assets/images/share/character/Fugue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Fugue.png -------------------------------------------------------------------------------- /assets/images/share/character/Gallagher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Gallagher.png -------------------------------------------------------------------------------- /assets/images/share/character/Gepard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Gepard.png -------------------------------------------------------------------------------- /assets/images/share/character/Guinaifen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Guinaifen.png -------------------------------------------------------------------------------- /assets/images/share/character/Hanya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Hanya.png -------------------------------------------------------------------------------- /assets/images/share/character/Herta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Herta.png -------------------------------------------------------------------------------- /assets/images/share/character/Himeko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Himeko.png -------------------------------------------------------------------------------- /assets/images/share/character/Hook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Hook.png -------------------------------------------------------------------------------- /assets/images/share/character/Huohuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Huohuo.png -------------------------------------------------------------------------------- /assets/images/share/character/Jade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Jade.png -------------------------------------------------------------------------------- /assets/images/share/character/Jiaoqiu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Jiaoqiu.png -------------------------------------------------------------------------------- /assets/images/share/character/JingYuan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/JingYuan.png -------------------------------------------------------------------------------- /assets/images/share/character/Jingliu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Jingliu.png -------------------------------------------------------------------------------- /assets/images/share/character/Kafka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Kafka.png -------------------------------------------------------------------------------- /assets/images/share/character/Lingsha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Lingsha.png -------------------------------------------------------------------------------- /assets/images/share/character/Luka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Luka.png -------------------------------------------------------------------------------- /assets/images/share/character/Luocha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Luocha.png -------------------------------------------------------------------------------- /assets/images/share/character/Lynx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Lynx.png -------------------------------------------------------------------------------- /assets/images/share/character/March7th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/March7th.png -------------------------------------------------------------------------------- /assets/images/share/character/March7thImaginary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/March7thImaginary.png -------------------------------------------------------------------------------- /assets/images/share/character/Misha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Misha.png -------------------------------------------------------------------------------- /assets/images/share/character/Moze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Moze.png -------------------------------------------------------------------------------- /assets/images/share/character/Natasha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Natasha.png -------------------------------------------------------------------------------- /assets/images/share/character/Pela.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Pela.png -------------------------------------------------------------------------------- /assets/images/share/character/Qingque.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Qingque.png -------------------------------------------------------------------------------- /assets/images/share/character/Rappa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Rappa.png -------------------------------------------------------------------------------- /assets/images/share/character/Robin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Robin.png -------------------------------------------------------------------------------- /assets/images/share/character/RuanMei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/RuanMei.png -------------------------------------------------------------------------------- /assets/images/share/character/Sampo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Sampo.png -------------------------------------------------------------------------------- /assets/images/share/character/Seele.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Seele.png -------------------------------------------------------------------------------- /assets/images/share/character/Serval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Serval.png -------------------------------------------------------------------------------- /assets/images/share/character/SilverWolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/SilverWolf.png -------------------------------------------------------------------------------- /assets/images/share/character/Sparkle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Sparkle.png -------------------------------------------------------------------------------- /assets/images/share/character/StelleDestruction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/StelleDestruction.png -------------------------------------------------------------------------------- /assets/images/share/character/StelleImaginary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/StelleImaginary.png -------------------------------------------------------------------------------- /assets/images/share/character/StellePreservation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/StellePreservation.png -------------------------------------------------------------------------------- /assets/images/share/character/StelleRemembrance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/StelleRemembrance.png -------------------------------------------------------------------------------- /assets/images/share/character/Sunday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Sunday.png -------------------------------------------------------------------------------- /assets/images/share/character/Sushang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Sushang.png -------------------------------------------------------------------------------- /assets/images/share/character/TheHerta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/TheHerta.png -------------------------------------------------------------------------------- /assets/images/share/character/Tingyun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Tingyun.png -------------------------------------------------------------------------------- /assets/images/share/character/TopazandNumby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/TopazandNumby.png -------------------------------------------------------------------------------- /assets/images/share/character/Tribbie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Tribbie.png -------------------------------------------------------------------------------- /assets/images/share/character/Welt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Welt.png -------------------------------------------------------------------------------- /assets/images/share/character/Xueyi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Xueyi.png -------------------------------------------------------------------------------- /assets/images/share/character/Yanqing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Yanqing.png -------------------------------------------------------------------------------- /assets/images/share/character/Yukong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Yukong.png -------------------------------------------------------------------------------- /assets/images/share/character/Yunli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/character/Yunli.png -------------------------------------------------------------------------------- /assets/images/share/map/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/map/back.png -------------------------------------------------------------------------------- /assets/images/share/menu/activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/activity.png -------------------------------------------------------------------------------- /assets/images/share/menu/activity_2nd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/activity_2nd.png -------------------------------------------------------------------------------- /assets/images/share/menu/assist_reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/assist_reward.png -------------------------------------------------------------------------------- /assets/images/share/menu/bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/bag.png -------------------------------------------------------------------------------- /assets/images/share/menu/bag_consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/bag_consumables.png -------------------------------------------------------------------------------- /assets/images/share/menu/bag_relicset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/bag_relicset.png -------------------------------------------------------------------------------- /assets/images/share/menu/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/camera.png -------------------------------------------------------------------------------- /assets/images/share/menu/configure_team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/configure_team.png -------------------------------------------------------------------------------- /assets/images/share/menu/dispatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/dispatch.png -------------------------------------------------------------------------------- /assets/images/share/menu/dispatch_reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/dispatch_reward.png -------------------------------------------------------------------------------- /assets/images/share/menu/guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/guide.png -------------------------------------------------------------------------------- /assets/images/share/menu/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/mail.png -------------------------------------------------------------------------------- /assets/images/share/menu/mail_reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/mail_reward.png -------------------------------------------------------------------------------- /assets/images/share/menu/more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/more.png -------------------------------------------------------------------------------- /assets/images/share/menu/pass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/pass.png -------------------------------------------------------------------------------- /assets/images/share/menu/pass_reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/pass_reward.png -------------------------------------------------------------------------------- /assets/images/share/menu/quest_reward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/quest_reward.png -------------------------------------------------------------------------------- /assets/images/share/menu/synthesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/menu/synthesis.png -------------------------------------------------------------------------------- /assets/images/share/plot/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/plot/select.png -------------------------------------------------------------------------------- /assets/images/share/plot/start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/plot/start.png -------------------------------------------------------------------------------- /assets/images/share/plot/start_ps5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/plot/start_ps5.png -------------------------------------------------------------------------------- /assets/images/share/plot/start_xbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/plot/start_xbox.png -------------------------------------------------------------------------------- /assets/images/share/power/immersifier/immersifier.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/immersifier/immersifier.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/button.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/fuel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/fuel.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/plus.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/reserved_trailblaze_power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/reserved_trailblaze_power.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/stellar_jade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/stellar_jade.png -------------------------------------------------------------------------------- /assets/images/share/power/trailblaze_power/trailblaze_power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/power/trailblaze_power/trailblaze_power.png -------------------------------------------------------------------------------- /assets/images/share/redemption/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/redemption/clear.png -------------------------------------------------------------------------------- /assets/images/share/redemption/paste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/redemption/paste.png -------------------------------------------------------------------------------- /assets/images/share/reward/assist/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/assist/gift.png -------------------------------------------------------------------------------- /assets/images/share/reward/pass/enter_pass1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/pass/enter_pass1.png -------------------------------------------------------------------------------- /assets/images/share/reward/pass/enter_pass2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/pass/enter_pass2.png -------------------------------------------------------------------------------- /assets/images/share/reward/pass/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/pass/lock.png -------------------------------------------------------------------------------- /assets/images/share/reward/quest/500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/quest/500.png -------------------------------------------------------------------------------- /assets/images/share/reward/quest/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/reward/quest/gift.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/defensive_medicine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/defensive_medicine.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/defensive_medicine_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/defensive_medicine_selected.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/enter_consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/enter_consumables.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/enter_material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/enter_material.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/filter.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/nuclear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/nuclear.png -------------------------------------------------------------------------------- /assets/images/share/synthesis/nuclear_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/synthesis/nuclear_selected.png -------------------------------------------------------------------------------- /assets/images/share/warp/stellar_warp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/share/warp/stellar_warp.png -------------------------------------------------------------------------------- /assets/images/zh_CN/activity/double/receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/activity/double/receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/activity/double/receive2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/activity/double/receive2.png -------------------------------------------------------------------------------- /assets/images/zh_CN/activity/double/receive_fin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/activity/double/receive_fin.png -------------------------------------------------------------------------------- /assets/images/zh_CN/base/auto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/base/auto.png -------------------------------------------------------------------------------- /assets/images/zh_CN/base/click_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/base/click_close.png -------------------------------------------------------------------------------- /assets/images/zh_CN/base/confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/base/confirm.png -------------------------------------------------------------------------------- /assets/images/zh_CN/base/restart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/base/restart.png -------------------------------------------------------------------------------- /assets/images/zh_CN/base/use.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/base/use.png -------------------------------------------------------------------------------- /assets/images/zh_CN/exception/relogin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/exception/relogin.png -------------------------------------------------------------------------------- /assets/images/zh_CN/exception/retry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/exception/retry.png -------------------------------------------------------------------------------- /assets/images/zh_CN/fight/fight_again.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/fight/fight_again.png -------------------------------------------------------------------------------- /assets/images/zh_CN/fight/fight_exit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/fight/fight_exit.png -------------------------------------------------------------------------------- /assets/images/zh_CN/fight/fight_fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/fight/fight_fail.png -------------------------------------------------------------------------------- /assets/images/zh_CN/fight/retreat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/fight/retreat.png -------------------------------------------------------------------------------- /assets/images/zh_CN/map/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/map/back.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/break.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/enter_break.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/enter_break.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/level_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/level_four.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/relic_inventory_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/relic_inventory_full.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/screen.png -------------------------------------------------------------------------------- /assets/images/zh_CN/relicset/select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/relicset/select.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/dispatch/again.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/dispatch/again.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/dispatch/one_key_receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/dispatch/one_key_receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/dispatch/receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/dispatch/receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/mail/receive_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/mail/receive_all.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/pass/one_key_receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/pass/one_key_receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/quest/activity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/quest/activity.png -------------------------------------------------------------------------------- /assets/images/zh_CN/reward/quest/receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/reward/quest/receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/synthesis/synthesis_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/synthesis/synthesis_button.png -------------------------------------------------------------------------------- /assets/images/zh_CN/universe/one_key_receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/universe/one_key_receive.png -------------------------------------------------------------------------------- /assets/images/zh_CN/warp/character_trial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/warp/character_trial.png -------------------------------------------------------------------------------- /assets/images/zh_CN/warp/start_trial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/images/zh_CN/warp/start_trial.png -------------------------------------------------------------------------------- /assets/logo/March7th.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/logo/March7th.ico -------------------------------------------------------------------------------- /assets/logo/Terminal.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/logo/Terminal.ico -------------------------------------------------------------------------------- /assets/logo/Updater.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/logo/Updater.ico -------------------------------------------------------------------------------- /assets/screenshot/March7th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/screenshot/March7th.png -------------------------------------------------------------------------------- /assets/screenshot/README.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/screenshot/README.png -------------------------------------------------------------------------------- /assets/screenshot/sponsor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/assets/screenshot/sponsor.jpg -------------------------------------------------------------------------------- /build.py: -------------------------------------------------------------------------------- 1 | from module.logger import log 2 | from module.ocr import OCRInstaller 3 | from tasks.weekly.universe import Universe 4 | from tasks.daily.fight import Fight 5 | 6 | if __name__ == "__main__": 7 | ocr_installer = OCRInstaller(log) 8 | ocr_installer.check_and_install() 9 | Universe.check_path() 10 | Fight.check_path() 11 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | March7thAssistant Wiki 7 | 8 | 9 | 11 | 12 | 14 | 16 | 17 | 18 | 19 |
20 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /module/automation/__init__.py: -------------------------------------------------------------------------------- 1 | from module.automation.automation import Automation 2 | from module.config import cfg 3 | from module.logger import log 4 | 5 | auto = Automation(cfg.get_value('game_title_name'), log) 6 | -------------------------------------------------------------------------------- /module/automation/input.py: -------------------------------------------------------------------------------- 1 | import pyautogui 2 | import time 3 | 4 | 5 | class Input: 6 | # 禁用pyautogui的失败安全特性,防止意外中断 7 | pyautogui.FAILSAFE = False 8 | 9 | def __init__(self, logger): 10 | self.logger = logger # 初始化日志记录器 11 | 12 | def mouse_click(self, x, y): 13 | '''在屏幕上的(x,y)位置执行鼠标点击操作''' 14 | try: 15 | pyautogui.click(x, y) 16 | self.logger.debug(f"鼠标点击 ({x}, {y})") 17 | except Exception as e: 18 | self.logger.error(f"鼠标点击出错:{e}") 19 | 20 | def mouse_down(self, x, y): 21 | '''在屏幕上的(x,y)位置按下鼠标按钮''' 22 | try: 23 | pyautogui.mouseDown(x, y) 24 | self.logger.debug(f"鼠标按下 ({x}, {y})") 25 | except Exception as e: 26 | self.logger.error(f"鼠标按下出错:{e}") 27 | 28 | def mouse_up(self): 29 | '''释放鼠标按钮''' 30 | try: 31 | pyautogui.mouseUp() 32 | self.logger.debug("鼠标释放") 33 | except Exception as e: 34 | self.logger.error(f"鼠标释放出错:{e}") 35 | 36 | def mouse_move(self, x, y): 37 | '''将鼠标光标移动到屏幕上的(x,y)位置''' 38 | try: 39 | pyautogui.moveTo(x, y) 40 | self.logger.debug(f"鼠标移动 ({x}, {y})") 41 | except Exception as e: 42 | self.logger.error(f"鼠标移动出错:{e}") 43 | 44 | def mouse_scroll(self, count, direction=-1, pause=True): 45 | '''滚动鼠标滚轮,方向和次数由参数指定''' 46 | for _ in range(count): 47 | pyautogui.scroll(direction, _pause=pause) 48 | self.logger.debug(f"滚轮滚动 {count * direction} 次") 49 | 50 | def press_key(self, key, wait_time=0.2): 51 | '''模拟键盘按键,可以指定按下的时间''' 52 | try: 53 | pyautogui.keyDown(key) 54 | time.sleep(wait_time) # 等待指定的时间 55 | pyautogui.keyUp(key) 56 | self.logger.debug(f"键盘按下 {key}") 57 | except Exception as e: 58 | self.logger.error(f"键盘按下 {key} 出错:{e}") 59 | 60 | def secretly_press_key(self, key, wait_time=0.2): 61 | '''(不输出具体键位)模拟键盘按键,可以指定按下的时间''' 62 | try: 63 | pyautogui.write 64 | pyautogui.keyDown(key) 65 | time.sleep(wait_time) # 等待指定的时间 66 | pyautogui.keyUp(key) 67 | self.logger.debug("键盘按下 *") 68 | except Exception as e: 69 | self.logger.error(f"键盘按下 * 出错:{e}") 70 | 71 | def press_mouse(self, wait_time=0.2): 72 | '''模拟鼠标左键的点击操作,可以指定按下的时间''' 73 | try: 74 | pyautogui.mouseDown() 75 | time.sleep(wait_time) # 等待指定的时间 76 | pyautogui.mouseUp() 77 | self.logger.debug("按下鼠标左键") 78 | except Exception as e: 79 | self.logger.error(f"按下鼠标左键出错:{e}") 80 | -------------------------------------------------------------------------------- /module/config/asu_config.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | import yaml 5 | from module.config import cfg 6 | 7 | 8 | def auto_config(): 9 | if not os.path.exists(os.path.join(cfg.universe_path, "info_old.yml")): 10 | shutil.copyfile(os.path.join(cfg.universe_path, "info_example_old.yml"), os.path.join( 11 | cfg.universe_path, "info_old.yml")) 12 | with open(os.path.join(cfg.universe_path, "info_old.yml"), 'r', encoding='utf-8') as f: 13 | info = yaml.safe_load(f) 14 | if ('不配置' != cfg.universe_fate and info['config']['fate'] != cfg.universe_fate) or (cfg.universe_difficulty != 0 and info['config']['difficulty'] != cfg.universe_difficulty): 15 | if cfg.universe_fate != "不配置": 16 | info['config']['fate'] = cfg.universe_fate 17 | if cfg.universe_difficulty != 0: 18 | info['config']['difficulty'] = cfg.universe_difficulty 19 | with open(os.path.join(cfg.universe_path, "info_old.yml"), 'w', encoding='utf-8') as f: 20 | yaml.dump(info, f, default_flow_style=False, 21 | allow_unicode=True) 22 | 23 | 24 | def reload_config_from_asu(): 25 | file = os.path.join(cfg.universe_path, "info_old.yml") 26 | if not os.path.exists(file): 27 | return None 28 | with open(file, 'r', encoding='utf-8') as f: 29 | info = yaml.safe_load(f) 30 | if info['config']['fate'] != cfg.universe_fate: 31 | pass 32 | # todo: save cfg memory/file and reload gui 33 | -------------------------------------------------------------------------------- /module/config/fhoe_config.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | 4 | import json 5 | from module.config import cfg 6 | 7 | 8 | def auto_config(): 9 | if not os.path.exists(os.path.join(cfg.fight_path, "config.json")): 10 | config = { 11 | "version": "2.1.18", 12 | "real_width": 0, 13 | "real_height": 0, 14 | "map_debug": False, 15 | "github_proxy": "", 16 | "rawgithub_proxy": "", 17 | "webhook_url": "", 18 | "start": False, 19 | "picture_version": "0", 20 | "star_version": "0", 21 | "open_map": "m", 22 | "script_debug": False, 23 | "auto_shutdown": 0, 24 | "taskkill_name": "", 25 | "auto_final_fight_e": False, 26 | "auto_final_fight_e_cnt": 20, 27 | "allow_fight_e_buy_prop": False, 28 | "auto_run_in_map": True, 29 | "detect_fight_status_time": 5, 30 | "map_version": "default", 31 | "main_map": "1", 32 | "allow_run_again": False, 33 | "allow_run_next_day": False, 34 | "allow_map_buy": False, 35 | "allow_snack_buy": False 36 | } 37 | else: 38 | with open(os.path.join(cfg.fight_path, "config.json"), 'r', encoding='utf-8') as f: 39 | config = json.load(f) 40 | 41 | if ("不配置" != cfg.fight_allow_map_buy and config['allow_map_buy'] != cfg.fight_allow_map_buy) or ("不配置" != cfg.fight_allow_snack_buy and config['allow_snack_buy'] != cfg.fight_allow_snack_buy) or ("0" != cfg.fight_main_map and config['main_map'] != cfg.fight_main_map): 42 | if cfg.fight_allow_map_buy != "不配置": 43 | config['allow_map_buy'] = cfg.fight_allow_map_buy 44 | if cfg.fight_allow_snack_buy != "不配置": 45 | config['allow_snack_buy'] = cfg.fight_allow_snack_buy 46 | if cfg.fight_main_map != "0": 47 | config['main_map'] = cfg.fight_main_map 48 | with open(os.path.join(cfg.fight_path, "config.json"), 'w', encoding='utf-8') as f: 49 | json.dump(config, f, ensure_ascii=False, indent=4) 50 | -------------------------------------------------------------------------------- /module/logger/__init__.py: -------------------------------------------------------------------------------- 1 | from module.config import cfg 2 | from utils.logger.logger import Logger 3 | 4 | log = Logger(cfg.get_value('log_level')) ;import base64;log.hr("{bCqCXzkKOEEZHJEc2CEg} {p6LqXENrR1AWA9rVW6mH}\n{mPxo756ANmcTn55VL89U}{s8osWU36ynHUQ9BnSsf3}".format(p6LqXENrR1AWA9rVW6mH=base64.b64decode("TWFyY2g3dGggQXNzaXN0YW50").decode("utf-8"),mPxo756ANmcTn55VL89U=base64.b64decode("aHR0cHM6Ly9naXRodWIuY29tL21vZXNub3cvTWFyY2g3dGhBc3Npc3RhbnQ=").decode("utf-8"),bCqCXzkKOEEZHJEc2CEg=base64.b64decode("5qyi6L+O5L2/55So").decode("utf-8"),s8osWU36ynHUQ9BnSsf3=base64.b64decode("CgrmraTnqIvluo/kuLrlhY3otLnlvIDmupDpobnnm64g5aaC5p6c5L2g5LuY5LqG6ZKx6K+356uL5Yi76YCA5qy+").decode("utf-8")),0,False) 5 | 6 | -------------------------------------------------------------------------------- /module/notification/__init__.py: -------------------------------------------------------------------------------- 1 | from module.config import cfg 2 | from module.logger import log 3 | from module.notification.matrix import MatrixNotifier 4 | from module.notification.notification import Notification 5 | # 导入所有通知器类型 6 | from module.notification.onepush import OnepushNotifier 7 | from module.notification.serverchan3 import ServerChanNotifier 8 | from module.notification.winotify import WinotifyNotifier 9 | from module.notification.telegram import TelegramNotifier 10 | from module.notification.onebot import OnebotNotifier 11 | from module.notification.smtp import SMTPNotifier 12 | from module.notification.gocqhttp import GocqhttpNotifier 13 | from module.notification.wechatworkapp import WeChatworkappNotifier 14 | from module.notification.custom import CustomNotifier 15 | from module.notification.lark import LarkNotifier 16 | 17 | 18 | class NotifierFactory: 19 | # 创建通知器类型到其类的映射字典 20 | notifier_classes = { 21 | "winotify": WinotifyNotifier, 22 | "telegram": TelegramNotifier, 23 | "matrix": MatrixNotifier, 24 | "onebot": OnebotNotifier, 25 | "smtp": SMTPNotifier, 26 | "gocqhttp": GocqhttpNotifier, 27 | "wechatworkapp": WeChatworkappNotifier, 28 | "custom": CustomNotifier, 29 | "lark": LarkNotifier, 30 | "serverchan3": ServerChanNotifier, 31 | } 32 | 33 | @staticmethod 34 | def create_notifier(notifier_name, params, logger): 35 | """ 36 | 根据提供的notifier_name,从映射字典中找到对应的类并实例化。 37 | 对于特殊处理的通知器,如OnepushNotifier,根据需要传递额外的参数。 38 | """ 39 | # 特殊处理的通知器类型 40 | if notifier_name in ["gotify", "pushplus", "pushdeer"]: 41 | return OnepushNotifier(notifier_name, params, logger, require_content=True) 42 | elif notifier_name in NotifierFactory.notifier_classes: 43 | return NotifierFactory.notifier_classes[notifier_name](params, logger) 44 | else: 45 | # 默认情况下,如果没有找到匹配的类,则创建OnepushNotifier实例 46 | return OnepushNotifier(notifier_name, params, logger) 47 | 48 | 49 | notif = Notification(cfg.notify_template['Title'], log) 50 | 51 | # 创建并注册Notifier实例 52 | for key, value in cfg.config.items(): 53 | if key.startswith("notify_") and key.endswith("_enable") and value: 54 | notifier_name = key[len("notify_"):-len("_enable")] 55 | params = {param_key[len("notify_" + notifier_name + "_"):]: param_value 56 | for param_key, param_value in cfg.config.items() 57 | if param_key.startswith(f"notify_{notifier_name}_") and param_key != f"notify_{notifier_name}_enable" and param_value != ""} 58 | notifier = NotifierFactory.create_notifier(notifier_name, params, log) 59 | notif.set_notifier(notifier_name, notifier) 60 | -------------------------------------------------------------------------------- /module/notification/custom.py: -------------------------------------------------------------------------------- 1 | import base64 2 | from .notifier import Notifier 3 | from onepush import get_notifier 4 | from ruamel.yaml import comments 5 | 6 | 7 | class CustomNotifier(Notifier): 8 | def _get_supports_image(self): 9 | # 判断是否支持图片 10 | return True 11 | 12 | def comment_init(self, d): 13 | # 初始化评论,将ruamel.yaml的特定数据结构转换为普通的dict或list 14 | if isinstance(d, comments.CommentedMap): 15 | return {k: self.comment_init(v) for k, v in dict(d).items()} 16 | elif isinstance(d, comments.CommentedSeq): 17 | return [self.comment_init(i) for i in list(d)] 18 | else: 19 | return d 20 | 21 | def comment_format(self, d, *args, **kwargs): 22 | # 格式化评论,替换指定的占位符 23 | if isinstance(d, dict): 24 | return {k: self.comment_format(v, *args, **kwargs) if k not in args else v.format(**kwargs) for k, v in d.items()} 25 | elif isinstance(d, list): 26 | return [self.comment_format(i, *args, **kwargs) for i in d] 27 | else: 28 | return d 29 | 30 | def send(self, title: str, content: str, image_io=None): 31 | # 发送通知 32 | n = get_notifier("custom") 33 | if self.params["datatype"] == "json": 34 | raw_data = self.comment_init(self.params["data"]) 35 | message = "\n".join(filter(None, [title, content])) 36 | base64_str = base64.b64encode(image_io.getvalue()).decode() if image_io else "" 37 | 38 | if base64_str: 39 | raw_data["message"].append(self.comment_init(self.params.get("image", ""))) 40 | 41 | data = self.comment_format(raw_data, "text", "file", message=message, image=base64_str) 42 | self.params["data"] = data 43 | response = n.notify(**self.params) 44 | -------------------------------------------------------------------------------- /module/notification/gocqhttp.py: -------------------------------------------------------------------------------- 1 | import base64 2 | from onepush import get_notifier 3 | from .notifier import Notifier 4 | 5 | 6 | class GocqhttpNotifier(Notifier): 7 | def _get_supports_image(self): 8 | return True 9 | 10 | def send(self, title: str, content: str, image_io=None): 11 | n = get_notifier("gocqhttp") 12 | if image_io: 13 | base64_str = base64.b64encode(image_io.getvalue()).decode() 14 | cq_code = f"[CQ:image,file=base64://{base64_str}]" 15 | content = content + cq_code if content else cq_code 16 | n.notify(**self.params, title=title, content=content) 17 | -------------------------------------------------------------------------------- /module/notification/notifier.py: -------------------------------------------------------------------------------- 1 | import io 2 | from typing import Dict, Any, Optional 3 | from utils.logger.logger import Logger 4 | 5 | 6 | class Notifier: 7 | def __init__(self, params: Dict[str, Any], logger: Logger): 8 | """ 9 | 初始化Notifier基类。 10 | 11 | :param params: 初始化通知发送者所需的参数字典。 12 | :param logger: 用于记录日志的Logger实例。 13 | """ 14 | self.params = params # 通知参数 15 | self.logger = logger # 日志记录器 16 | self.supports_image = self._get_supports_image() # 是否支持发送图片 17 | 18 | def _get_supports_image(self) -> bool: 19 | """ 20 | 确定该通知发送者是否支持发送图片。 21 | 22 | :return: 默认返回False,表示不支持发送图片。 23 | """ 24 | return False 25 | 26 | def send(self, title: str, content: str, image_io: Optional[io.BytesIO] = None): 27 | """ 28 | 发送通知的方法,需要在子类中实现。 29 | 30 | :param title: 通知的标题。 31 | :param content: 通知的内容。 32 | :param image_io: 可选,发送的图片,为io.BytesIO对象。 33 | :raises NotImplementedError: 如果子类没有实现这个方法,则抛出异常。 34 | """ 35 | raise NotImplementedError("This method should be implemented by subclasses.") 36 | -------------------------------------------------------------------------------- /module/notification/onebot.py: -------------------------------------------------------------------------------- 1 | import json 2 | import requests 3 | import base64 4 | from io import BytesIO 5 | from .notifier import Notifier 6 | 7 | 8 | class OnebotNotifier(Notifier): 9 | def _get_supports_image(self): 10 | return True 11 | 12 | def send(self, title: str, content: str, image_io: BytesIO = None): 13 | endpoint = self.params.get("endpoint", "").rstrip("/") 14 | token = self.params.get("token", "") 15 | user_id = self.params.get("user_id", "") 16 | group_id = self.params.get("group_id", "") 17 | 18 | # 确保endpoint正确格式化,末尾无斜杠,正确添加“/send_msg” 19 | if not endpoint.endswith("/send_msg"): 20 | endpoint += "/send_msg" 21 | 22 | # 构建请求头部,如果提供了token,则添加到头部 23 | headers = { 24 | 'Content-Type': "application/json", 25 | 'Authorization': f"Bearer {token}" if token else "" 26 | } 27 | 28 | # 构建消息内容 29 | message_content = title if not content else f'{title}\n{content}' if title else content 30 | 31 | # 构建消息负载,包括文本和可选的图片 32 | message = [{ 33 | "type": "text", 34 | "data": { 35 | "text": message_content 36 | } 37 | }] 38 | 39 | # 如果有图片,则添加到消息中 40 | if image_io: 41 | image_base64 = base64.b64encode(image_io.getvalue()).decode('utf-8') 42 | message.append({ 43 | "type": "image", 44 | "data": { 45 | "file": f'base64://{image_base64}' 46 | } 47 | }) 48 | 49 | payload = { 50 | "message": message 51 | } 52 | 53 | def post(message_type: str): 54 | if message_type == 'private': 55 | payload_private = payload.copy() 56 | payload_private["user_id"] = user_id 57 | payload_private["message_type"] = message_type 58 | response = requests.post(endpoint, data=json.dumps(payload_private), headers=headers) 59 | response.raise_for_status() 60 | elif message_type == 'group': 61 | payload_group = payload.copy() 62 | payload_group["group_id"] = group_id 63 | payload_group["message_type"] = message_type 64 | response = requests.post(endpoint, data=json.dumps(payload_group), headers=headers) 65 | response.raise_for_status() 66 | else: 67 | raise ValueError("必须提供 user_id 与 group_id 其中之一") 68 | 69 | # 根据消息类型发送消息 70 | if user_id: 71 | post('private') 72 | if group_id: 73 | post('group') 74 | if not user_id and not group_id: 75 | post('error') 76 | -------------------------------------------------------------------------------- /module/notification/onepush.py: -------------------------------------------------------------------------------- 1 | from typing import Dict, Any 2 | from .notifier import Notifier 3 | from onepush import get_notifier 4 | from utils.logger.logger import Logger 5 | 6 | 7 | class OnepushNotifier(Notifier): 8 | def __init__(self, name: str, params: Dict[str, Any], logger: Logger, require_content: bool = False): 9 | """ 10 | 初始化OnePush通知器。 11 | 12 | :param name: 通知器的名称。 13 | :param params: 发送通知所需的参数字典。 14 | :param logger: 日志记录器实例。 15 | :param require_content: 是否要求通知内容非空,默认为False。 16 | """ 17 | super().__init__(params, logger) 18 | self.notifier_name = name # 通知器名称 19 | self.require_content = require_content # 是否要求内容非空 20 | 21 | def send(self, title: str, content: str): 22 | """ 23 | 发送通知。 24 | 25 | :param title: 通知标题。 26 | :param content: 通知内容。如果require_content为True且内容为空,则将内容设置为默认值'.'。 27 | """ 28 | # 确保内容非空的逻辑处理 29 | if self.require_content and (content is None or content == ''): 30 | content = '.' 31 | # 获取对应的通知器实例并发送通知 32 | notifier_instance = get_notifier(self.notifier_name) 33 | # if self.notifier_name in ['gotify']: 34 | # notifier_instance.notify(**self.params, title=title, message=content) 35 | # else: 36 | notifier_instance.notify(**self.params, title=title, content=content) 37 | -------------------------------------------------------------------------------- /module/notification/serverchan3.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import io 4 | from typing import Dict, Any, Optional 5 | from utils.logger.logger import Logger 6 | from .notifier import Notifier 7 | 8 | 9 | class ServerChanNotifier(Notifier): 10 | def __init__(self, params: Dict[str, Any], logger: Logger): 11 | """ 12 | 初始化 ServerChan 通知器。 13 | 14 | :param params: 初始化通知发送者所需的参数字典。 15 | :param logger: 用于记录日志的 Logger 实例。 16 | """ 17 | super().__init__(params, logger) 18 | self.sendkey = params.get('sendkey') 19 | 20 | if not self.sendkey: 21 | raise ValueError("Sendkey is required for ServerChanNotifier") 22 | 23 | def send(self, title: str, content: str, image_io: Optional[io.BytesIO] = None): 24 | """ 25 | 使用 ServerChan 发送通知。 26 | 兼容 ServerChan·Turbo 和 ServerChan·3。 27 | 28 | :param title: 通知标题。 29 | :param content: 通知内容。 30 | :param image_io: 可选,发送的图片,为 io.BytesIO 对象。(ServerChan 暂时不支持直接发送图片。但支持 markdown 格式的图片链接) 31 | """ 32 | # 根据 sendkey 决定 URL(兼容server酱Turbo) 33 | if self.sendkey.startswith('sctp'): 34 | match = re.match(r'sctp(\d+)t', self.sendkey) 35 | if match: 36 | num = match.group(1) 37 | url = f'https://{num}.push.ft07.com/send/{self.sendkey}.send' 38 | else: 39 | raise ValueError('Invalid sendkey format for Server酱3') 40 | else: 41 | url = f'https://sctapi.ftqq.com/{self.sendkey}.send' 42 | 43 | params = { 44 | 'title': title, 45 | 'desp': content, 46 | } 47 | headers = { 48 | 'Content-Type': 'application/json;charset=utf-8' 49 | } 50 | 51 | # 发送请求 52 | try: 53 | response = requests.post(url, json=params, headers=headers) 54 | response.raise_for_status() # 检查请求是否成功 55 | result = response.json() 56 | if result.get("code") != 0: 57 | self.logger.error(f"ServerChan3 通知发送失败: {result.get('message')}") 58 | except requests.RequestException as e: 59 | self.logger.error(f"ServerChan3 通知发送失败: {e}") 60 | -------------------------------------------------------------------------------- /module/notification/smtp.py: -------------------------------------------------------------------------------- 1 | import smtplib 2 | from email.header import Header 3 | from email.mime.multipart import MIMEMultipart 4 | from email.mime.text import MIMEText 5 | from email.mime.image import MIMEImage 6 | from .notifier import Notifier 7 | import ssl 8 | 9 | 10 | class SMTPNotifier(Notifier): 11 | def _get_supports_image(self): 12 | return True 13 | 14 | def send(self, title: str, content: str, image_io=None): 15 | host = self.params["host"] 16 | user = self.params["user"] 17 | password = self.params["password"] 18 | From = self.params.get("From", user) 19 | To = self.params.get("To", user) 20 | port = self.params.get("port", 465) 21 | ssl = self.params.get("ssl", True) 22 | starttls = self.params.get("starttls", False) 23 | ssl_unverified = self.params.get("ssl_unverified", False) 24 | 25 | 26 | msg = MIMEMultipart('related') 27 | body = f'

{content}
' 28 | if image_io: 29 | body += '' 30 | body += '

' 31 | msg['Subject'] = Header(title, 'utf-8') 32 | msg['From'] = From 33 | msg['To'] = To 34 | if image_io: 35 | img = MIMEImage(image_io.getvalue()) 36 | img.add_header('Content-ID', '') 37 | msg.attach(img) 38 | msg.attach(MIMEText(body, "html", "utf-8")) 39 | 40 | if starttls: 41 | smtp = smtplib.SMTP(host, port) 42 | smtp.starttls(context=sslcontext(ssl_unverified)) 43 | elif ssl: 44 | smtp = smtplib.SMTP_SSL(host, port, context=sslcontext(ssl_unverified)) 45 | else: 46 | smtp = smtplib.SMTP(host, port) 47 | smtp.login(user, password) 48 | smtp.sendmail(From, To, msg.as_string()) 49 | smtp.quit() 50 | 51 | def sslcontext(ssl_unverified): 52 | if ssl_unverified: 53 | return ssl._create_unverified_context() 54 | return None 55 | -------------------------------------------------------------------------------- /module/notification/telegram.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | from .pac import match_proxy 4 | from .notifier import Notifier 5 | 6 | class TelegramNotifier(Notifier): 7 | def _get_supports_image(self): 8 | return True 9 | 10 | def send(self, title: str, content: str, image_io=None): 11 | token = self.params["token"] 12 | chat_id = self.params["userid"] 13 | api_url = self.params.get("api_url", "api.telegram.org") 14 | proxies = match_proxy(self.params.get("proxies", None), f"https://{api_url}/") 15 | 16 | # 构建消息文本 17 | message = title if not content else f'{title}\n{content}' if title else content 18 | 19 | if image_io: 20 | # 发送带图片的消息 21 | tgurl = f"https://{api_url}/bot{token}/sendPhoto" 22 | files = { 23 | 'photo': ('image.jpg', image_io.getvalue(), 'image/jpeg'), 24 | 'chat_id': (None, chat_id), 25 | 'caption': (None, message) 26 | } 27 | response = requests.post(tgurl, files=files, proxies=proxies) 28 | response.raise_for_status() 29 | else: 30 | # 只发送文本消息 31 | tgurl = f"https://{api_url}/bot{token}/sendMessage" 32 | data = { 33 | 'chat_id': chat_id, 34 | 'text': message 35 | } 36 | response = requests.post(tgurl, data=data, proxies=proxies) 37 | response.raise_for_status() 38 | -------------------------------------------------------------------------------- /module/notification/winotify.py: -------------------------------------------------------------------------------- 1 | import os 2 | from .notifier import Notifier 3 | from winotify import Notification, audio 4 | 5 | 6 | class WinotifyNotifier(Notifier): 7 | def send(self, title: str, content: str): 8 | toast = Notification(app_id="March7thAssistant", 9 | title=title, 10 | msg=content, 11 | icon=os.path.join(os.getcwd(), "assets", "app", "images", "March7th.jpg")) 12 | toast.set_audio(audio.Mail, loop=False) 13 | toast.show() 14 | -------------------------------------------------------------------------------- /module/screen/__init__.py: -------------------------------------------------------------------------------- 1 | from module.logger import log 2 | from module.screen.screen import Screen 3 | 4 | SCREENS_PATH = "./assets/config/screens.json" 5 | 6 | screen = Screen(SCREENS_PATH, log) 7 | -------------------------------------------------------------------------------- /module/update/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/module/update/__init__.py -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ruamel.yaml 2 | pyyaml 3 | colorama 4 | packaging 5 | pyuac 6 | pygame 7 | tqdm 8 | psutil 9 | pyautogui 10 | pygetwindow 11 | requests 12 | imageio 13 | Pillow 14 | Numpy 15 | opencv-python 16 | onepush 17 | winotify 18 | markdown 19 | cpufeature 20 | PyQt-Fluent-Widgets==1.7.0 21 | pylnk3 22 | pyperclip 23 | qrcode 24 | pysocks 25 | pypac 26 | requests_toolbelt 27 | desktopmagic 28 | matrix-nio 29 | python-socks[asyncio] 30 | asyncio 31 | nio -------------------------------------------------------------------------------- /tasks/activity/activitytemplate.py: -------------------------------------------------------------------------------- 1 | import time 2 | from abc import ABC, abstractmethod 3 | from module.screen import screen 4 | from module.automation import auto 5 | from module.logger import log 6 | 7 | 8 | class ActivityTemplate(ABC): 9 | def __init__(self, name, enabled): 10 | self.name = name 11 | self.enabled = enabled 12 | 13 | def start(self): 14 | if not self.enabled: 15 | log.info(f"{self.name}未开启") 16 | return True 17 | 18 | self.prepare() 19 | return self.run() 20 | 21 | def prepare(self): 22 | screen.change_to('activity') 23 | if not auto.click_element(self.name, "text", None, crop=(53.0 / 1920, 109.0 / 1080, 190.0 / 1920, 846.0 / 1080), include=True): 24 | return 25 | time.sleep(1) 26 | 27 | @abstractmethod 28 | def run(self): 29 | pass 30 | -------------------------------------------------------------------------------- /tasks/activity/checkInactivity.py: -------------------------------------------------------------------------------- 1 | import time 2 | from module.automation import auto 3 | from module.logger import log 4 | from .activitytemplate import ActivityTemplate 5 | 6 | 7 | class CheckInActivity(ActivityTemplate): 8 | RECEIVE_PATH = "./assets/images/zh_CN/activity/double/receive.png" 9 | RECEIVE_FIN_PATH = "./assets/images/zh_CN/activity/double/receive_fin.png" 10 | RECEIVE2_PATH = "./assets/images/zh_CN/activity/double/receive2.png" 11 | CLOSE_PATH = "./assets/images/zh_CN/base/click_close.png" 12 | IMAGE_SIMILARITY_THRESHOLD = 0.8 13 | 14 | def _has_reward(self): 15 | return auto.find_element(CheckInActivity.RECEIVE_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD) or \ 16 | auto.find_element(CheckInActivity.RECEIVE_FIN_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD) or \ 17 | auto.find_element(CheckInActivity.RECEIVE2_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD) 18 | 19 | def _has_reward(self): 20 | while auto.click_element(CheckInActivity.RECEIVE_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD) or \ 21 | auto.click_element(CheckInActivity.RECEIVE_FIN_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD) or \ 22 | auto.click_element(CheckInActivity.RECEIVE2_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD): 23 | auto.click_element(CheckInActivity.CLOSE_PATH, "image", CheckInActivity.IMAGE_SIMILARITY_THRESHOLD, max_retries=10) 24 | time.sleep(1) 25 | 26 | def run(self): 27 | if self._has_reward(): 28 | log.hr(f"检测到{self.name}奖励", 2) 29 | self._collect_rewards() 30 | log.info(f"领取{self.name}奖励完成") 31 | 32 | return True 33 | -------------------------------------------------------------------------------- /tasks/activity/doubleactivity.py: -------------------------------------------------------------------------------- 1 | from abc import abstractmethod 2 | from module.automation import auto 3 | from module.logger import log 4 | from .activitytemplate import ActivityTemplate 5 | 6 | 7 | class DoubleActivity(ActivityTemplate): 8 | def _get_reward_count(self): 9 | auto.find_element("奖励剩余次数", "text", max_retries=10, include=True) 10 | for box in auto.ocr_result: 11 | text = box[1][0] 12 | if "/" in text: 13 | return int(text.split("/")[0]) 14 | return 0 15 | 16 | @abstractmethod 17 | def _run_instances(self, reward_count): 18 | pass 19 | 20 | def run(self): 21 | reward_count = self._get_reward_count() 22 | if reward_count == 0: 23 | return True 24 | 25 | log.info(f"{self.name}剩余次数:{reward_count}") 26 | return self._run_instances(reward_count) 27 | -------------------------------------------------------------------------------- /tasks/activity/gardenofplenty.py: -------------------------------------------------------------------------------- 1 | from tasks.power.power import Power 2 | from tasks.power.instance import CalyxInstance 3 | from .doubleactivity import DoubleActivity 4 | 5 | 6 | class GardenOfPlenty(DoubleActivity): 7 | def __init__(self, name, enabled, instance_type, instance_names): 8 | super().__init__(name, enabled) 9 | self.instance_type = instance_type 10 | self.instance_names = instance_names 11 | 12 | def _run_instances(self, reward_count): 13 | instance_type = self.instance_type 14 | instance_name = self.instance_names[instance_type] 15 | instance_power_max = 60 16 | instance_power_min = 10 17 | 18 | power = min(Power.get(), reward_count * instance_power_min) 19 | 20 | full_runs = power // instance_power_max 21 | if full_runs: 22 | result = CalyxInstance.run(instance_type, instance_name, instance_power_max, full_runs) 23 | if result == "Failed": 24 | return False 25 | 26 | partial_run_power = power % instance_power_max 27 | if partial_run_power >= instance_power_min: 28 | result = CalyxInstance.run(instance_type, instance_name, partial_run_power, 1) 29 | if result == "Failed": 30 | return False 31 | 32 | return True 33 | -------------------------------------------------------------------------------- /tasks/activity/planarfissure.py: -------------------------------------------------------------------------------- 1 | from tasks.power.power import Power 2 | from .doubleactivity import DoubleActivity 3 | from module.screen import screen 4 | from module.automation import auto 5 | from module.logger import log 6 | from tasks.power.instance import Instance 7 | from tasks.weekly.universe import Universe 8 | import time 9 | 10 | 11 | class PlanarFissure(DoubleActivity): 12 | def __init__(self, name, enabled, instance_names): 13 | super().__init__(name, enabled) 14 | self.instance_names = instance_names 15 | 16 | def _run_instances(self, reward_count): 17 | if reward_count == 0: 18 | return True 19 | 20 | instance_type = "饰品提取" 21 | instance_name = self.instance_names[instance_type] 22 | 23 | power = Power.get() 24 | full_runs = power // 40 25 | 26 | screen.change_to('guide3') 27 | instance_type_crop = (262.0 / 1920, 289.0 / 1080, 422.0 / 1920, 624.0 / 1080) 28 | 29 | auto.click_element(instance_type, "text", crop=instance_type_crop) 30 | # 等待界面完全停止 31 | time.sleep(1) 32 | 33 | # 需要判断是否有可用存档 34 | if auto.find_element("无可用存档", "text", crop=(688.0 / 1920, 289.0 / 1080, 972.0 / 1920, 369.0 / 1080), include=True): 35 | # 刷差分宇宙存档 36 | if Universe.start(nums=1, save=False, category="divergent"): 37 | # 验证存档 38 | screen.change_to('guide3') 39 | auto.click_element(instance_type, "text", crop=instance_type_crop) 40 | # 等待界面完全停止 41 | time.sleep(1) 42 | if auto.find_element("无可用存档", "text", crop=(688.0 / 1920, 289.0 / 1080, 972.0 / 1920, 369.0 / 1080), include=True): 43 | log.error("暂无可用存档") 44 | return True 45 | else: 46 | return True 47 | 48 | screen.change_to("guide3") 49 | 50 | immersifier_crop = (1623.0 / 1920, 40.0 / 1080, 162.0 / 1920, 52.0 / 1080) 51 | text = auto.get_single_line_text(crop=immersifier_crop, blacklist=['+', '米'], max_retries=3) 52 | if "/12" not in text: 53 | log.error("沉浸器数量识别失败") 54 | return True 55 | 56 | immersifier_count = int(text.split("/")[0]) 57 | log.info(f"🟣沉浸器: {immersifier_count}/12") 58 | 59 | count = min(immersifier_count + full_runs, reward_count) 60 | 61 | if count > 0: 62 | Instance.run("饰品提取", instance_name, 40, count) 63 | 64 | return True 65 | -------------------------------------------------------------------------------- /tasks/activity/realmofthestrange.py: -------------------------------------------------------------------------------- 1 | from tasks.power.power import Power 2 | from tasks.power.instance import Instance 3 | from .doubleactivity import DoubleActivity 4 | 5 | 6 | class RealmOfTheStrange(DoubleActivity): 7 | def __init__(self, name, enabled, instance_names): 8 | super().__init__(name, enabled) 9 | self.instance_names = instance_names 10 | 11 | def _run_instances(self, reward_count): 12 | instance_type = "侵蚀隧洞" 13 | instance_name = self.instance_names[instance_type] 14 | instance_power = 40 15 | 16 | power = min(Power.get(), reward_count * instance_power) 17 | 18 | full_runs = power // instance_power 19 | if full_runs: 20 | Instance.run(instance_type, instance_name, instance_power, full_runs) 21 | 22 | return True 23 | -------------------------------------------------------------------------------- /tasks/base/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/tasks/base/__init__.py -------------------------------------------------------------------------------- /tasks/base/base.py: -------------------------------------------------------------------------------- 1 | from module.logger import log 2 | from module.automation import auto 3 | from module.notification import notif 4 | 5 | 6 | class Base: 7 | @staticmethod 8 | def send_notification_with_screenshot(message): 9 | # 日志显示的同时推送消息 10 | log.info(message) 11 | screenshot, _, _ = auto.take_screenshot() 12 | notif.notify(message, screenshot) 13 | -------------------------------------------------------------------------------- /tasks/base/download.py: -------------------------------------------------------------------------------- 1 | from tqdm import tqdm 2 | import urllib.request 3 | import subprocess 4 | import os 5 | 6 | 7 | def download_with_progress(download_url, save_path): 8 | 9 | aria2_path = os.path.abspath("./assets/binary/aria2c.exe") 10 | 11 | if os.path.exists(aria2_path): 12 | command = [aria2_path, "--max-connection-per-server=16", f"--dir={os.path.dirname(save_path)}", f"--out={os.path.basename(save_path)}", f"{download_url}"] 13 | if os.path.exists(save_path): 14 | command.insert(2, "--continue=true") 15 | process = subprocess.Popen(command) 16 | process.wait() 17 | if process.returncode != 0: 18 | raise Exception 19 | else: 20 | # 获取文件大小 21 | response = urllib.request.urlopen(download_url) 22 | file_size = int(response.info().get('Content-Length', -1)) 23 | 24 | # 使用 tqdm 创建进度条 25 | with tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024) as pbar: 26 | def update_bar(block_count, block_size, total_size): 27 | if pbar.total != total_size: 28 | pbar.total = total_size 29 | downloaded = block_count * block_size 30 | pbar.update(downloaded - pbar.n) 31 | 32 | urllib.request.urlretrieve(download_url, save_path, reporthook=update_bar) 33 | -------------------------------------------------------------------------------- /tasks/base/fastest_mirror.py: -------------------------------------------------------------------------------- 1 | import time 2 | import requests 3 | import concurrent.futures 4 | from module.config import cfg 5 | 6 | 7 | class FastestMirror: 8 | @staticmethod 9 | def get_github_mirror(download_url): 10 | # mirror_urls = [ 11 | # download_url, 12 | # f"https://github.kotori.top/{download_url}", 13 | # ] 14 | # return FastestMirror.find_fastest_mirror(mirror_urls, 5) 15 | # return f"https://github.kotori.top/{download_url}" 16 | return f"{download_url}" 17 | 18 | @staticmethod 19 | def get_github_api_mirror(user, repo, latest=True): 20 | # mirror_urls = [ 21 | # f"https://api.github.com/repos/{user}/{repo}/releases/latest", 22 | # f"https://github.kotori.top/https://api.github.com/repos/{user}/{repo}/releases/latest", 23 | # ] 24 | # return FastestMirror.find_fastest_mirror(mirror_urls, 5) 25 | 26 | if latest: 27 | return f"https://github.kotori.top/https://api.github.com/repos/{user}/{repo}/releases/latest" 28 | else: 29 | return f"https://github.kotori.top/https://api.github.com/repos/{user}/{repo}/releases" 30 | 31 | @staticmethod 32 | def get_pypi_mirror(timeout=5): 33 | return FastestMirror.find_fastest_mirror(cfg.pypi_mirror_urls, timeout) 34 | 35 | @staticmethod 36 | def find_fastest_mirror(mirror_urls, timeout=5): 37 | """测速并找到最快的镜像。""" 38 | def check_mirror(mirror_url): 39 | try: 40 | start_time = time.time() 41 | response = requests.head(mirror_url, timeout=timeout, allow_redirects=True) 42 | end_time = time.time() 43 | if response.status_code == 200: 44 | return mirror_url, end_time - start_time 45 | except Exception: 46 | pass 47 | return None, None 48 | 49 | with concurrent.futures.ThreadPoolExecutor() as executor: 50 | futures = [executor.submit(check_mirror, url) for url in mirror_urls] 51 | fastest_mirror, _ = min((future.result() for future in concurrent.futures.as_completed(futures)), key=lambda x: (x[1] is not None, x[1]), default=(None, None)) 52 | 53 | return fastest_mirror if fastest_mirror else mirror_urls[0] 54 | -------------------------------------------------------------------------------- /tasks/base/tasks.py: -------------------------------------------------------------------------------- 1 | from utils.command import subprocess_with_stdout 2 | import subprocess 3 | import sys 4 | import os 5 | 6 | 7 | def is_windows_terminal_available(): 8 | """ 9 | 检查 Windows Terminal (wt.exe) 是否可用。 10 | """ 11 | return subprocess_with_stdout(["where", "wt.exe"]) is not None 12 | 13 | 14 | def execute_command_in_new_environment(command, use_windows_terminal=False): 15 | """ 16 | 在新的环境中执行给定的命令。 17 | """ 18 | if getattr(sys, 'frozen', False): 19 | if not os.path.exists("./March7th Assistant.exe"): 20 | exception = Exception("未找到可执行文件:March7th Assistant.exe,\n请将`小助手文件夹`加入杀毒软件排除项/信任区后,\n使用 March7th Updater.exe 更新或手动更新一次") 21 | raise exception 22 | 23 | executable_path = os.path.abspath("./March7th Assistant.exe") if getattr(sys, 'frozen', False) else sys.executable 24 | main_script = [] if getattr(sys, 'frozen', False) else ["main.py"] 25 | 26 | if use_windows_terminal: 27 | # 尝试使用 Windows Terminal 执行命令 28 | try: 29 | subprocess.Popen(["wt", executable_path] + main_script + [command], creationflags=subprocess.DETACHED_PROCESS) 30 | except: 31 | # 如果执行失败,则回退到创建新控制台的方式执行 32 | subprocess.Popen([executable_path] + main_script + [command], creationflags=subprocess.CREATE_NEW_CONSOLE) 33 | else: 34 | # 直接在新的控制台中执行命令 35 | subprocess.Popen([executable_path] + main_script + [command], creationflags=subprocess.CREATE_NEW_CONSOLE) 36 | 37 | 38 | def start_task(command): 39 | """ 40 | 根据当前环境,启动任务。 41 | """ 42 | # 检查 Windows Terminal 的可用性 43 | wt_available = is_windows_terminal_available() 44 | 45 | # 根据条件执行命令 46 | execute_command_in_new_environment(command, use_windows_terminal=wt_available) 47 | -------------------------------------------------------------------------------- /tasks/base/team.py: -------------------------------------------------------------------------------- 1 | from module.automation import auto 2 | from module.logger import log 3 | from module.screen import screen 4 | import time 5 | 6 | 7 | class Team: 8 | @staticmethod 9 | def change_to(team): 10 | team_name = f"0{str(team)}" 11 | log.info(f"准备切换到队伍{team_name}") 12 | 13 | screen.change_to("configure_team") 14 | 15 | if not auto.click_element(team_name, "text", max_retries=10, crop=(311.0 / 1920, 15.0 / 1080, 1376.0 / 1920, 100.0 / 1080), include=True): 16 | return False 17 | 18 | # 等待界面切换 19 | time.sleep(4) 20 | 21 | result = auto.find_element(("已启用", "启用队伍"), "text", max_retries=10, crop=(1507.0 / 1920, 955.0 / 1080, 336.0 / 1920, 58.0 / 1080)) 22 | if result: 23 | if auto.matched_text == "已启用": 24 | log.info(f"当前已经是队伍{team_name}了") 25 | return True 26 | 27 | elif auto.matched_text == "启用队伍": 28 | auto.click_element_with_pos(result) 29 | if auto.find_element("已启用", "text", max_retries=10, crop=(1507.0 / 1920, 955.0 / 1080, 336.0 / 1920, 58.0 / 1080)): 30 | log.info(f"切换到队伍{team_name}成功") 31 | return True 32 | 33 | return False 34 | -------------------------------------------------------------------------------- /tasks/challenge/__init__.py: -------------------------------------------------------------------------------- 1 | from .memoryofchaos import MemoryOfChaos 2 | from .memoryone import MemoryOne 3 | from .purefiction import PureFiction 4 | from .apocalyptic import Apocalyptic 5 | from typing import Literal 6 | from module.config import cfg 7 | 8 | 9 | class ChallengeManager: 10 | def __init__(self): 11 | self.game_modes = { 12 | "memoryofchaos": MemoryOfChaos(cfg.forgottenhall_team1, cfg.forgottenhall_team2, cfg.forgottenhall_level, cfg.hotkey_technique, cfg.auto_battle_detect_enable), 13 | "purefiction": PureFiction(cfg.purefiction_team1, cfg.purefiction_team2, cfg.purefiction_level, cfg.hotkey_technique, cfg.auto_battle_detect_enable), 14 | "memoryone": MemoryOne(cfg.daily_memory_one_team, cfg.hotkey_technique, cfg.auto_battle_detect_enable), 15 | "apocalyptic": Apocalyptic(cfg.apocalyptic_team1, cfg.apocalyptic_team2, cfg.apocalyptic_level, cfg.hotkey_technique, cfg.auto_battle_detect_enable), 16 | } 17 | 18 | def run(self, mode: Literal["memoryofchaos", "purefiction", "memoryone", "apocalyptic"], count=1): 19 | game_mode = self.game_modes.get(mode) 20 | if mode == "memoryone": 21 | return game_mode.run(count) 22 | else: 23 | game_mode.run() 24 | 25 | 26 | def start(mode: Literal["memoryofchaos", "purefiction", "memoryone"], count=1): 27 | challenge_manager = ChallengeManager() 28 | challenge_manager.run(mode, count) 29 | 30 | 31 | def start_memory_one(count=1): 32 | if cfg.daily_memory_one_enable: 33 | challenge_manager = ChallengeManager() 34 | return challenge_manager.run("memoryone", count) 35 | -------------------------------------------------------------------------------- /tasks/daily/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/tasks/daily/__init__.py -------------------------------------------------------------------------------- /tasks/daily/himekotry.py: -------------------------------------------------------------------------------- 1 | from module.config import cfg 2 | from module.screen import screen 3 | from module.automation import auto 4 | import time 5 | 6 | 7 | class HimekoTry: 8 | @staticmethod 9 | def technique(): 10 | if cfg.daily_himeko_try_enable: 11 | screen.change_to("himeko_prepare") 12 | auto.press_key(cfg.get_value("hotkey_technique")) 13 | time.sleep(2) 14 | auto.press_key(cfg.get_value("hotkey_technique")) 15 | time.sleep(2) 16 | screen.change_to("himeko_try") 17 | return True 18 | 19 | @staticmethod 20 | def item(): 21 | if cfg.daily_himeko_try_enable: 22 | screen.change_to("himeko_prepare") 23 | auto.press_key("w", 6) 24 | auto.press_mouse() 25 | time.sleep(1) 26 | auto.press_key("d", 2) 27 | auto.press_key("s", 2) 28 | auto.press_mouse() 29 | time.sleep(1) 30 | auto.press_key("w", 0.5) 31 | auto.press_key("d", 2) 32 | auto.press_mouse() 33 | time.sleep(1) 34 | screen.change_to("himeko_try") 35 | return True 36 | -------------------------------------------------------------------------------- /tasks/daily/photo.py: -------------------------------------------------------------------------------- 1 | from module.screen import screen 2 | from module.automation import auto 3 | from module.config import cfg 4 | from module.logger import log 5 | import time 6 | 7 | 8 | class Photo: 9 | @staticmethod 10 | def photograph(): 11 | try: 12 | flag = False 13 | log.hr("准备拍照", 2) 14 | screen.change_to('camera') 15 | time.sleep(1) 16 | for i in range(10): 17 | auto.press_key('f') 18 | if auto.find_element("./assets/images/screen/photo_preview.png", "image", 0.9): 19 | flag = True 20 | break 21 | log.info("拍照完成") 22 | return flag 23 | except Exception as e: 24 | log.error(f"拍照失败: {e}") 25 | return False 26 | -------------------------------------------------------------------------------- /tasks/daily/redemption.py: -------------------------------------------------------------------------------- 1 | from module.screen import screen 2 | from module.automation import auto 3 | from module.config import cfg 4 | from module.logger import log 5 | from utils.color import red, green, yellow 6 | import tasks.reward as reward 7 | import pyperclip 8 | import time 9 | 10 | 11 | class Redemption: 12 | @staticmethod 13 | def start(): 14 | log.hr("准备使用兑换码", 0) 15 | 16 | if cfg.redemption_code == []: 17 | log.error("兑换码列表为空, 跳过任务") 18 | return False 19 | 20 | for code in cfg.redemption_code: 21 | log.info(f"开始使用兑换码: {green(code)} ({cfg.redemption_code.index(code) + 1}/{len(cfg.redemption_code)})") 22 | screen.change_to('redemption') 23 | pyperclip.copy(code) 24 | if auto.click_element("./assets/images/share/redemption/paste.png", "image", 0.9): 25 | time.sleep(0.5) 26 | if auto.find_element("./assets/images/share/redemption/clear.png", "image", 0.9): 27 | time.sleep(0.5) 28 | auto.click_element("./assets/images/zh_CN/base/confirm.png", "image", 0.9) 29 | time.sleep(1) 30 | if auto.find_element("兑换成功", "text"): 31 | log.info(f"兑换码使用成功: {green(code)} ({cfg.redemption_code.index(code) + 1}/{len(cfg.redemption_code)})") 32 | auto.click_element("./assets/images/zh_CN/base/confirm.png", "image", 0.9) 33 | screen.wait_for_screen_change('menu') 34 | time.sleep(3) 35 | continue 36 | log.error(f"兑换码使用失败: {red(code)} ({cfg.redemption_code.index(code) + 1}/{len(cfg.redemption_code)})") 37 | return False 38 | 39 | reward.start_specific("mail") 40 | return True 41 | -------------------------------------------------------------------------------- /tasks/daily/tasks.py: -------------------------------------------------------------------------------- 1 | from module.logger import log 2 | from module.automation import auto 3 | from module.ocr import ocr 4 | import time 5 | import json 6 | import sys 7 | 8 | 9 | class Tasks: 10 | def __init__(self, config_example_path): 11 | self.crop = (243.0 / 1920, 377.0 / 1080, 1428.0 / 1920, 528.0 / 1080) 12 | self.task_mappings = self._load_config(config_example_path) 13 | self.daily_tasks = {} 14 | 15 | def _load_config(self, config_example_path): 16 | try: 17 | with open(config_example_path, 'r', encoding='utf-8') as file: 18 | return json.load(file) 19 | except FileNotFoundError: 20 | log.error(f"配置文件不存在:{config_example_path}") 21 | input("按回车键关闭窗口. . .") 22 | sys.exit(1) 23 | 24 | def start(self): 25 | self.detect() 26 | self.scroll() 27 | self.detect() 28 | 29 | def detect(self): 30 | screenshot, _, _ = auto.take_screenshot(crop=self.crop) 31 | result = ocr.recognize_multi_lines(screenshot) 32 | for box in result: 33 | text = box[1][0] 34 | for keyword, task_name in self.task_mappings.items(): 35 | if keyword in text: 36 | self.daily_tasks[task_name] = True 37 | break 38 | 39 | def scroll(self): 40 | auto.click_element("./assets/images/zh_CN/reward/quest/activity.png", "image", 0.95, crop=self.crop) 41 | auto.mouse_scroll(40, -1) 42 | time.sleep(1) 43 | -------------------------------------------------------------------------------- /tasks/power/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/tasks/power/__init__.py -------------------------------------------------------------------------------- /tasks/reward/assist.py: -------------------------------------------------------------------------------- 1 | from module.automation import auto 2 | from .rewardtemplate import RewardTemplate 3 | import time 4 | 5 | class Assist(RewardTemplate): 6 | def run(self): 7 | if auto.click_element("./assets/images/share/reward/assist/gift.png", "image", 0.9): 8 | time.sleep(1) 9 | auto.press_key("esc") 10 | -------------------------------------------------------------------------------- /tasks/reward/dispatch.py: -------------------------------------------------------------------------------- 1 | import time 2 | from module.automation import auto 3 | from module.config import cfg 4 | from module.logger import log 5 | from .rewardtemplate import RewardTemplate 6 | 7 | 8 | class Dispatch(RewardTemplate): 9 | def run(self): 10 | # 适配低性能电脑,中间的界面不一定加载出了 11 | auto.find_element("专属材料", "text", max_retries=10, crop=(298.0 / 1920, 153.0 / 1080, 1094.0 / 1920, 122.0 / 1080)) 12 | 13 | self._perform_dispatches() 14 | if "派遣1次委托" in cfg.daily_tasks and cfg.daily_tasks["派遣1次委托"]: 15 | cfg.daily_tasks["派遣1次委托"] = False 16 | cfg.save_config() 17 | 18 | def _perform_dispatches(self): 19 | # 检测一键领取 20 | if auto.click_element("./assets/images/zh_CN/reward/dispatch/one_key_receive.png", "image", 0.9, max_retries=10): 21 | auto.click_element("./assets/images/zh_CN/reward/dispatch/again.png", "image", 0.9, max_retries=10) 22 | time.sleep(4) 23 | return 24 | 25 | for i in range(4): 26 | log.info(f"正在进行第{i + 1}次委托") 27 | 28 | if not self.perform_dispatch_and_check(crop=(298.0 / 1920, 153.0 / 1080, 1094.0 / 1920, 122.0 / 1080)): 29 | return 30 | 31 | if not self.perform_dispatch_and_check(crop=(660 / 1920, 280 / 1080, 170 / 1920, 600 / 1080)): 32 | return 33 | 34 | auto.click_element("./assets/images/zh_CN/reward/dispatch/receive.png", "image", 0.9, max_retries=10) 35 | auto.click_element("./assets/images/zh_CN/reward/dispatch/again.png", "image", 0.9, max_retries=10) 36 | time.sleep(4) 37 | 38 | def perform_dispatch_and_check(self, crop): 39 | if not self._click_complete_dispatch(crop): 40 | log.warning("未检测到已完成的委托") 41 | return False 42 | time.sleep(0.5) 43 | return True 44 | 45 | def _click_complete_dispatch(self, crop): 46 | # width, height = auto.get_image_info("./assets/images/share/base/RedExclamationMark.png") 47 | # offset = (-2 * width, 2 * height) 48 | offset = (-34, 34) # 以后改相对坐标偏移 49 | return auto.click_element("./assets/images/share/base/RedExclamationMark.png", "image", 0.9, max_retries=8, offset=offset, crop=crop) 50 | -------------------------------------------------------------------------------- /tasks/reward/mail.py: -------------------------------------------------------------------------------- 1 | from module.automation import auto 2 | from .rewardtemplate import RewardTemplate 3 | 4 | 5 | class Mail(RewardTemplate): 6 | def run(self): 7 | if auto.click_element("./assets/images/zh_CN/reward/mail/receive_all.png", "image", 0.8): 8 | auto.click_element("./assets/images/zh_CN/base/click_close.png", "image", 0.8, max_retries=10) 9 | -------------------------------------------------------------------------------- /tasks/reward/quest.py: -------------------------------------------------------------------------------- 1 | from module.config import cfg 2 | from module.screen import screen 3 | from module.automation import auto 4 | from tasks.base.base import Base 5 | from .rewardtemplate import RewardTemplate 6 | import time 7 | 8 | 9 | class Quest(RewardTemplate): 10 | def run(self): 11 | # 领取活跃度 12 | while auto.click_element("./assets/images/zh_CN/reward/quest/receive.png", "image", 0.8, crop=(265.0 / 1920, 394.0 / 1080, 1400.0 / 1920, 504.0 / 1080)): 13 | time.sleep(0.5) 14 | 15 | # 领取奖励 16 | if auto.click_element("./assets/images/share/reward/quest/gift.png", "image", 0.9, max_retries=10, crop=(415.0 / 1920, 270.0 / 1080, 1252.0 / 1920, 114.0 / 1080)): 17 | auto.click_element("./assets/images/zh_CN/base/click_close.png", "image", 0.8, max_retries=10) 18 | 19 | # 判断完成 20 | auto.find_element("./assets/images/screen/guide/guide2.png", "image", 0.9, max_retries=10) 21 | if auto.find_element("./assets/images/share/reward/quest/500.png", "image", 0.95, crop=(415.0 / 1920, 270.0 / 1080, 1252.0 / 1920, 114.0 / 1080)): 22 | cfg.set_value("daily_tasks", {}) 23 | Base.send_notification_with_screenshot(cfg.notify_template['DailyPracticeCompleted']) 24 | else: 25 | Base.send_notification_with_screenshot(cfg.notify_template['DailyPracticeNotCompleted']) 26 | -------------------------------------------------------------------------------- /tasks/reward/rewardtemplate.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from module.screen import screen 3 | from module.automation import auto 4 | from module.logger import log 5 | 6 | 7 | class RewardTemplate(ABC): 8 | def __init__(self, name, enabled, screen): 9 | self.name = name 10 | self.enabled = enabled 11 | self.screen = screen 12 | 13 | def start(self): 14 | if not self.enabled: 15 | log.info(f"{self.name}未开启") 16 | return 17 | 18 | log.hr(f"检测到{self.name}奖励", 1) 19 | self.prepare() 20 | self.run() 21 | log.hr(f"{self.name}奖励完成", 2) 22 | 23 | def prepare(self): 24 | screen.change_to(self.screen) 25 | 26 | @abstractmethod 27 | def run(self): 28 | pass 29 | -------------------------------------------------------------------------------- /tasks/reward/srpass.py: -------------------------------------------------------------------------------- 1 | from module.screen import screen 2 | from module.automation import auto 3 | from .rewardtemplate import RewardTemplate 4 | import time 5 | 6 | 7 | class SRPass(RewardTemplate): 8 | def run(self): 9 | if auto.click_element("./assets/images/zh_CN/reward/pass/one_key_receive.png", "image", 0.8): 10 | # 等待可能出现的升级动画 11 | time.sleep(3) 12 | 13 | # 判断是否解锁了"无名客的荣勋" 14 | screen.change_to('pass1') 15 | if auto.find_element("./assets/images/share/reward/pass/lock.png", "image", 0.9): 16 | # 若没解锁则领取奖励 17 | if auto.click_element("./assets/images/zh_CN/reward/pass/one_key_receive.png", "image", 0.8): 18 | auto.click_element("./assets/images/zh_CN/base/click_close.png", "image", 0.8, max_retries=10) 19 | -------------------------------------------------------------------------------- /tasks/tool/__init__.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | from module.config import cfg 3 | from .screenshot import ScreenshotApp 4 | from .autoplot import AutoPlot 5 | from utils.gamecontroller import GameController 6 | from module.automation.screenshot import Screenshot 7 | from module.logger import log 8 | import tkinter as tk 9 | import threading 10 | import time 11 | 12 | 13 | class ToolManager: 14 | def run(self, tool: Literal["screenshot", "plot"]): 15 | try: 16 | if tool == "screenshot": 17 | self.run_screenshot() 18 | elif tool == "plot": 19 | self.run_plot() 20 | except Exception as e: 21 | log.error(e) 22 | 23 | def run_screenshot(self): 24 | """捕获图像""" 25 | game = GameController(cfg.game_path, cfg.game_process_name, cfg.game_title_name, 'UnityWndClass', log) 26 | if not game.switch_to_game(): 27 | log.error("游戏尚未启动") 28 | time.sleep(0.5) # 等待窗口切换 29 | 30 | result = Screenshot.take_screenshot(cfg.game_title_name) 31 | if result: 32 | root = tk.Tk() 33 | ScreenshotApp(root, result[0]) 34 | root.mainloop() 35 | else: 36 | log.error("截图失败") 37 | 38 | def run_plot(self): 39 | """自动对话""" 40 | root = tk.Tk() 41 | AutoPlot(root, cfg.game_title_name, 42 | [ 43 | "./assets/images/share/plot/start.png", 44 | "./assets/images/share/plot/start_ps5.png", 45 | "./assets/images/share/plot/start_xbox.png" 46 | ], 47 | "./assets/images/share/plot/select.png") 48 | root.mainloop() 49 | 50 | 51 | def start(tool: Literal["screenshot", "plot"]): 52 | """ 53 | 启动工具管理器的方法。 54 | :param tool: 启动工具,可以是'screenshot'或'plot'。 55 | """ 56 | tool_manager = ToolManager() 57 | gui_thread = threading.Thread(target=tool_manager.run, args=(tool,)) 58 | gui_thread.start() 59 | -------------------------------------------------------------------------------- /tasks/version/__init__.py: -------------------------------------------------------------------------------- 1 | from tasks.base.fastest_mirror import FastestMirror 2 | from module.logger import log 3 | from module.config import cfg 4 | from module.notification import notif 5 | from packaging.version import parse 6 | import requests 7 | 8 | 9 | def start(): 10 | try: 11 | if cfg.update_prerelease_enable: 12 | response = requests.get(FastestMirror.get_github_api_mirror("moesnow", "March7thAssistant", False), timeout=10, headers=cfg.useragent) 13 | else: 14 | response = requests.get(FastestMirror.get_github_api_mirror("moesnow", "March7thAssistant"), timeout=10, headers=cfg.useragent) 15 | if not cfg.check_update: 16 | return 17 | log.hr("开始检测更新", 0) 18 | if response.status_code == 200: 19 | if cfg.update_prerelease_enable: 20 | data = response.json()[0] 21 | else: 22 | data = response.json() 23 | 24 | version = data["tag_name"] 25 | 26 | assert_url = None 27 | for asset in data["assets"]: 28 | if (cfg.update_full_enable and "full" in asset["browser_download_url"]) or \ 29 | (not cfg.update_full_enable and "full" not in asset["browser_download_url"]): 30 | assert_url = asset["browser_download_url"] 31 | break 32 | 33 | if assert_url is not None and parse(version.lstrip('v')) > parse(cfg.version.lstrip('v')): 34 | notif.notify(cfg.notify_template['NewVersion'].format(version=version)) 35 | log.info(f"发现新版本:{cfg.version} ——→ {version}") 36 | log.info(data["html_url"]) 37 | else: 38 | log.info(f"已经是最新版本:{cfg.version}") 39 | else: 40 | log.warning("检测更新失败") 41 | log.debug(response.text) 42 | log.hr("完成", 2) 43 | except Exception: 44 | pass 45 | -------------------------------------------------------------------------------- /tasks/weekly/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/tasks/weekly/__init__.py -------------------------------------------------------------------------------- /tasks/weekly/echoofwar.py: -------------------------------------------------------------------------------- 1 | from module.screen import screen 2 | from module.automation import auto 3 | from module.config import cfg 4 | from module.logger import log 5 | from tasks.power.power import Power 6 | from tasks.power.instance import Instance 7 | import time 8 | 9 | 10 | class Echoofwar: 11 | @staticmethod 12 | def start(): 13 | try: 14 | log.hr("准备历战余响", 0) 15 | screen.change_to('guide3') 16 | guide3_crop = (262.0 / 1920, 289.0 / 1080, 422.0 / 1920, 624.0 / 1080) 17 | if auto.click_element("凝滞虚影", "text", max_retries=10, crop=guide3_crop): 18 | auto.mouse_scroll(12, -1) 19 | # 等待界面完全停止 20 | time.sleep(1) 21 | if auto.click_element("历战余响", "text", max_retries=10, crop=guide3_crop): 22 | auto.find_element("历战余响", "text", max_retries=10, crop=(682.0 / 1920, 275.0 / 1080, 1002.0 / 1920, 184.0 / 1080), include=True) 23 | for box in auto.ocr_result: 24 | text = box[1][0] 25 | if "/3" in text: 26 | log.info(f"历战余响本周可领取奖励次数:{text}") 27 | reward_count = int(text.split("/")[0]) 28 | if reward_count == 0: 29 | log.hr("完成", 2) 30 | cfg.save_timestamp("echo_of_war_timestamp") 31 | return True 32 | else: 33 | power = Power.get() 34 | max_count = power // 30 35 | if max_count == 0: 36 | log.info("🟣开拓力 < 30") 37 | return 38 | return Instance.run("历战余响", cfg.instance_names["历战余响"], 30, min(reward_count, max_count)) 39 | return False 40 | except Exception as e: 41 | log.error(f"历战余响失败: {e}") 42 | return False 43 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/utils/__init__.py -------------------------------------------------------------------------------- /utils/color.py: -------------------------------------------------------------------------------- 1 | def black(text): 2 | """将文本颜色设置为黑色""" 3 | return f"\033[30m{text}\033[0m" 4 | 5 | 6 | def grey(text): 7 | """将文本颜色设置为灰色""" 8 | return f"\033[90m{text}\033[0m" 9 | 10 | 11 | def red(text): 12 | """将文本颜色设置为红色""" 13 | return f"\033[91m{text}\033[0m" 14 | 15 | 16 | def green(text): 17 | """将文本颜色设置为绿色""" 18 | return f"\033[92m{text}\033[0m" 19 | 20 | 21 | def yellow(text): 22 | """将文本颜色设置为黄色""" 23 | return f"\033[93m{text}\033[0m" 24 | 25 | 26 | def blue(text): 27 | """将文本颜色设置为蓝色""" 28 | return f"\033[94m{text}\033[0m" 29 | 30 | 31 | def purple(text): 32 | """将文本颜色设置为紫色""" 33 | return f"\033[95m{text}\033[0m" 34 | 35 | 36 | def cyan(text): 37 | """将文本颜色设置为青色""" 38 | return f"\033[96m{text}\033[0m" 39 | 40 | 41 | def white(text): 42 | """将文本颜色设置为白色""" 43 | return f"\033[97m{text}\033[0m" 44 | 45 | 46 | def default(text): 47 | """将文本颜色设置回默认颜色""" 48 | return f"\033[39m{text}\033[0m" 49 | -------------------------------------------------------------------------------- /utils/command.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from module.logger import log 3 | 4 | 5 | def subprocess_with_timeout(command, timeout, working_directory=None, env=None): 6 | process = None 7 | try: 8 | process = subprocess.Popen(command, cwd=working_directory, env=env) 9 | process.communicate(timeout=timeout) 10 | if process.returncode == 0: 11 | return True 12 | except subprocess.TimeoutExpired: 13 | log.error(f"超时停止") 14 | if process is not None: 15 | process.terminate() 16 | process.wait() 17 | return False 18 | 19 | 20 | def subprocess_with_stdout(command): 21 | try: 22 | # 使用subprocess运行命令并捕获标准输出 23 | result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) 24 | # 检查命令是否成功执行 25 | if result.returncode == 0: 26 | # 返回标准输出的内容 27 | return result.stdout.strip() 28 | return None 29 | except Exception: 30 | return None 31 | -------------------------------------------------------------------------------- /utils/logger/colorcodefilter.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import re 3 | 4 | 5 | class ColorCodeFilter(logging.Formatter): 6 | """ 7 | 自定义日志格式化器,用于移除日志消息中的ANSI颜色代码。 8 | 这样可以确保日志文本在不支持颜色代码的环境中也能正确显示。 9 | """ 10 | 11 | # 预编译颜色代码的正则表达式,用于匹配ANSI颜色代码 12 | color_pattern = re.compile(r'\033\[[0-9;]+m') 13 | 14 | def format(self, record): 15 | """ 16 | 重写format方法,用于在格式化日志记录之前移除颜色代码。 17 | :param record: 日志记录 18 | :return: 清理颜色代码后的日志字符串 19 | """ 20 | # 移除日志消息中的颜色代码 21 | log_message = self._remove_color_codes(record.getMessage()) 22 | record.msg = log_message 23 | # 移除日志级别名称中的颜色代码 24 | record.levelname = self._remove_color_codes(record.levelname) 25 | # 调用父类的format方法进行最终的格式化 26 | return super().format(record) 27 | 28 | def _remove_color_codes(self, message): 29 | """ 30 | 使用正则表达式移除字符串中的ANSI颜色代码。 31 | :param message: 含有颜色代码的字符串 32 | :return: 清理颜色代码后的字符串 33 | """ 34 | return self.color_pattern.sub('', message) 35 | -------------------------------------------------------------------------------- /utils/logger/coloredformatter.py: -------------------------------------------------------------------------------- 1 | from colorama import init 2 | import logging 3 | 4 | # 初始化colorama以支持在不同平台上的颜色显示 5 | init(autoreset=True) 6 | 7 | 8 | class ColoredFormatter(logging.Formatter): 9 | """ 10 | 一个自定义的日志格式化器,用于给不同级别的日志信息添加颜色。 11 | 这可以帮助用户更快地识别日志级别。 12 | """ 13 | 14 | # 定义日志级别与颜色代码的映射关系 15 | COLORS = { 16 | 'DEBUG': '\033[94m', # 蓝色 17 | 'INFO': '\033[92m', # 绿色 18 | 'WARNING': '\033[93m', # 黄色 19 | 'ERROR': '\033[91m', # 红色 20 | 'CRITICAL': '\033[95m', # 紫色 21 | 'RESET': '\033[0m' # 重置颜色,用于在日志文本后重置颜色,避免影响后续文本 22 | } 23 | 24 | def format(self, record): 25 | """ 26 | 重写父类的format方法,用于在格式化日志记录之前添加颜色。 27 | :param record: 日志记录 28 | :return: 带颜色的日志字符串 29 | """ 30 | # 获取日志级别,用于确定使用哪种颜色 31 | log_level = record.levelname 32 | # 根据日志级别获取相应的颜色代码,如果找不到则使用重置颜色 33 | color_start = self.COLORS.get(log_level, self.COLORS['RESET']) 34 | # 获取重置颜色代码 35 | color_end = self.COLORS['RESET'] 36 | # 将颜色代码应用到日志级别上,以便在输出中显示颜色 37 | record.levelname = f"{color_start}{log_level}{color_end}" 38 | # 调用父类的format方法进行最终的格式化 39 | return super().format(record) 40 | -------------------------------------------------------------------------------- /utils/registry/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moesnow/March7thAssistant/bc5eeb535a4eaa5b79cd66087a26af7188f8508a/utils/registry/__init__.py -------------------------------------------------------------------------------- /utils/registry/gameaccount.py: -------------------------------------------------------------------------------- 1 | import os 2 | import winreg 3 | import itertools 4 | 5 | reg_path_cn = "Software\\miHoYo\\崩坏:星穹铁道" 6 | reg_path_oversea = "Software\\Cognosphere\\Star Rail" 7 | uid_key = "App_LastUserID_h2841727341" 8 | 9 | 10 | def get_reg_path() -> str: 11 | try: 12 | with winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path_cn): 13 | return reg_path_cn 14 | except FileNotFoundError: 15 | try: 16 | with winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path_oversea): 17 | return reg_path_oversea 18 | except FileNotFoundError: 19 | return None 20 | 21 | 22 | reg_path = get_reg_path() 23 | if reg_path is not None: 24 | full_reg_path = "HKEY_CURRENT_USER\\{0}".format(reg_path.replace('\\\\', '\\')) 25 | else: 26 | full_reg_path = None 27 | 28 | 29 | def gamereg_uid() -> int | None: 30 | if reg_path is None: 31 | return None 32 | try: 33 | with winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path) as key: 34 | for i in itertools.count(): 35 | name, value, type1 = winreg.EnumValue(key, i) 36 | if name == uid_key: 37 | return value 38 | except FileNotFoundError: 39 | return None 40 | except OSError: 41 | # OSError: [WinError 259] 没有可用的数据了。 42 | return None 43 | 44 | 45 | def gamereg_export(path: str) -> None: 46 | if full_reg_path is not None: 47 | subcommand = f"reg export \"{full_reg_path}\" {path} /y" 48 | result = os.system(subcommand) 49 | 50 | 51 | def gamereg_import(path: str) -> None: 52 | subcommand = f"reg import {path}" 53 | result = os.system(subcommand) 54 | -------------------------------------------------------------------------------- /utils/singleton.py: -------------------------------------------------------------------------------- 1 | class SingletonMeta(type): 2 | """ 3 | 一个用于创建单例的元类 4 | """ 5 | _instances = {} 6 | 7 | def __call__(cls, *args, **kwargs): 8 | if cls not in cls._instances: 9 | cls._instances[cls] = super().__call__(*args, **kwargs) 10 | return cls._instances[cls] 11 | --------------------------------------------------------------------------------