├── .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 |
--------------------------------------------------------------------------------