Skip to content

Commit

Permalink
Merge pull request #13 from Night-stars-1/dev
Browse files Browse the repository at this point in the history
feat: 优化自动跑商
  • Loading branch information
Night-stars-1 authored Apr 15, 2024
2 parents b67e9b0 + 5ce15a4 commit 2cf8787
Show file tree
Hide file tree
Showing 14 changed files with 267 additions and 141 deletions.
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"version": "0.2.0",
"configurations": [
{
"name": "Python 调试程序: 当前文件",
"name": "Python 调试程序: demo",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/demo.py",
Expand Down
18 changes: 9 additions & 9 deletions app/common/running_business_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,15 @@ class RunningBusinessConfig(QConfig):
伊尔 = ConfigItem("SkillLevel", "伊尔", 0, None)
卡洛琳 = ConfigItem("SkillLevel", "卡洛琳", 0, None)

七号自由港砍抬疲劳 = ConfigItem("Tired", "7号自由港", 30, None)
澄明数据中心砍抬疲劳 = ConfigItem("Tired", "澄明数据中心", 30, None)
阿妮塔战备工厂砍抬疲劳 = ConfigItem("Tired", "阿妮塔战备工厂", 30, None)
阿妮塔能源研究所砍抬疲劳 = ConfigItem("Tired", "阿妮塔能源研究所", 30, None)
淘金乐园砍抬疲劳 = ConfigItem("Tired", "淘金乐园", 30, None)
曼德矿场砍抬疲劳 = ConfigItem("Tired", "曼德矿场", 30, None)
荒原站砍抬疲劳 = ConfigItem("Tired", "荒原站", 30, None)
铁盟哨站砍抬疲劳 = ConfigItem("Tired", "铁盟哨站", 30, None)
修格里城砍抬疲劳 = ConfigItem("Tired", "修格里城", 30, None)
七号自由港砍抬疲劳 = ConfigItem("CityTired", "7号自由港", 30, None)
澄明数据中心砍抬疲劳 = ConfigItem("CityTired", "澄明数据中心", 30, None)
阿妮塔战备工厂砍抬疲劳 = ConfigItem("CityTired", "阿妮塔战备工厂", 30, None)
阿妮塔能源研究所砍抬疲劳 = ConfigItem("CityTired", "阿妮塔能源研究所", 30, None)
淘金乐园砍抬疲劳 = ConfigItem("CityTired", "淘金乐园", 30, None)
曼德矿场砍抬疲劳 = ConfigItem("CityTired", "曼德矿场", 30, None)
荒原站砍抬疲劳 = ConfigItem("CityTired", "荒原站", 30, None)
铁盟哨站砍抬疲劳 = ConfigItem("CityTired", "铁盟哨站", 30, None)
修格里城砍抬疲劳 = ConfigItem("CityTired", "修格里城", 30, None)

七号自由港声望 = ConfigItem("StationLevel", "7号自由港", 1, None)
澄明数据中心声望 = ConfigItem("StationLevel", "澄明数据中心", 1, None)
Expand Down
7 changes: 5 additions & 2 deletions app/common/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
LastEditors: Night-stars-1 nujj1042633805@gmail.com
"""

from PyQt5.QtCore import QThread
from PyQt5.QtCore import QThread, pyqtSignal

from core.exceptions import StopExecution

from .config import cfg


class Worker(QThread):
result = pyqtSignal(object) # 使用 object 类型的信号,以便发送任何类型的数据

def __init__(self, func, stop, **kargs):
super(Worker, self).__init__()
self.func = func
Expand All @@ -21,7 +23,8 @@ def __init__(self, func, stop, **kargs):

def run(self):
try:
self.func(**self.kargs)
result = self.func(**self.kargs)
self.result.emit(result)
except StopExecution:
pass

Expand Down
31 changes: 31 additions & 0 deletions app/components/primary_push_load_card.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from PyQt5.QtCore import Qt, pyqtSignal
from qfluentwidgets import PushSettingCard, IndeterminateProgressRing

class PrimaryPushLoadCard(PushSettingCard):
"""Push setting card with primary color"""

def __init__(self, text, icon, title, content=None, parent=None):
super().__init__(text, icon, title, content, parent)
self.text = text
self.spinner = IndeterminateProgressRing(self.button)
self.spinner.setFixedSize(24, 24)
self.centerProgressRing()
self.spinner.hide()

self.button.setObjectName("PrimaryPushLoadCard")

def centerProgressRing(self):
# 计算进度环在按钮中的居中位置
ring_size = self.spinner.size()
button_size = self.button.size()
new_x = (button_size.width() - ring_size.width()) // 2
new_y = (button_size.height() - ring_size.height()) // 2
self.spinner.move(new_x+5, new_y)

def loading(self, loading=True):
if loading:
self.spinner.show()
self.button.setText("")
else:
self.spinner.hide()
self.button.setText(self.text)
66 changes: 45 additions & 21 deletions app/view/running_business_interface.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""
Author: Night-stars-1 nujj1042633805@gmail.com
Date: 2024-04-10 22:54:08
LastEditTime: 2024-04-14 16:08:08
LastEditTime: 2024-04-15 13:58:24
LastEditors: Night-stars-1 nujj1042633805@gmail.com
"""

Expand All @@ -19,6 +19,7 @@
from ..common.signal_bus import signalBus
from ..common.style_sheet import StyleSheet
from ..common.worker import Worker
from ..components.primary_push_load_card import PrimaryPushLoadCard
from ..components.settings.spin_box_setting_card import SpinBoxSettingCard

SKILLS = [
Expand Down Expand Up @@ -105,7 +106,7 @@ def loadSamples(self):
spin_box_max=1000,
parent=self.scrollWidget,
)
self.testCard = PrimaryPushSettingCard(
self.testCard = PrimaryPushLoadCard(
"测试", FIF.TAG, "跑商测试", "测试跑商功能", self.scrollWidget
)
self.bookGroup = ExpandSettingCard(
Expand Down Expand Up @@ -146,7 +147,7 @@ def loadSamples(self):
self.skillGroup.viewLayout.addWidget(gz)

self.tiredGroup = ExpandSettingCard(
FIF.BRUSH, "进货书设置", parent=self.scrollWidget
FIF.BRUSH, "砍抬疲劳设置", parent=self.scrollWidget
)
for city in CITYS:
book = SpinBoxSettingCard(
Expand Down Expand Up @@ -197,42 +198,65 @@ def __connectSignalToSlot(self):
self.testCard.clicked.connect(self.createSuccessInfoBar)

def createSuccessInfoBar(self):

def result(route):
self.testCard.loading(False)
w = Dialog("详细", show(route), self)
if w.exec():
signalBus.switchToCard.emit("LoggerInterface")
self.workers = Worker(
run,
run,
order=cfg.adbOrder.value,
path=cfg.adbPath.value,
city_book=city_book,
skill_level=skill_level,
station_level=station_level,
city_tired=city_tired,
max_goods_num=max_goods_num,
route=route,
type_=cfg.goodsType.value,
uuid=cfg.uuid.value,
)
self.workers.start()

self.testCard.loading(True)
from auto.run_business import run
from core.goods.shop import show

city_book = cfg.toDict()["RunningBusiness"]
skill_level = cfg.toDict()["SkillLevel"]
station_level = cfg.toDict()["StationLevel"]
city_tired = cfg.toDict()["CityTired"]
max_goods_num = cfg.maxGoodsNum.value
uuid = cfg.uuid.value
if cfg.goodsType.value:
if uuid == "":
logger.info("未设置UUID")
return False
route = get_goods_info_kmou(
city_book, skill_level, station_level, max_goods_num, uuid
self.workers = Worker(
get_goods_info_kmou,
get_goods_info_kmou,
city_book=city_book,
skill_level=skill_level,
station_level=station_level,
city_tired=city_tired,
max_goods_num=max_goods_num,
)
self.workers.start()
self.workers.result.connect(result)
else:
route = get_goods_info_srap(
city_book, skill_level, station_level, max_goods_num
)
w = Dialog("详细", show(route), self)
if w.exec():
signalBus.switchToCard.emit("LoggerInterface")
self.workers = Worker(
run,
run,
order=cfg.adbOrder.value,
path=cfg.adbPath.value,
city_book=cfg.toDict()["RunningBusiness"],
skill_level=cfg.toDict()["SkillLevel"],
station_level=cfg.toDict()["StationLevel"],
get_goods_info_srap,
get_goods_info_srap,
city_book=city_book,
skill_level=skill_level,
station_level=station_level,
city_tired=city_tired,
max_goods_num=max_goods_num,
route=route,
type_=cfg.goodsType.value,
uuid=cfg.uuid.value,
)
self.workers.start()
self.workers.result.connect(result)

"""
InfoBar.success(
Expand Down
42 changes: 31 additions & 11 deletions auto/run_business/buy.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""
Author: Night-stars-1 nujj1042633805@gmail.com
Date: 2024-04-04 17:54:58
LastEditTime: 2024-04-14 23:25:56
LastEditTime: 2024-04-15 14:52:29
LastEditors: Night-stars-1 nujj1042633805@gmail.com
"""

Expand All @@ -20,27 +20,46 @@


def buy_business(
goods: List[str],
primary_goods: List[str],
secondary_goods: List[str],
num: int = 20,
max_book: int = 0,
):
"""
说明:
购买商品
参数:
:param goods: 商品列表
:param primary_goods: 主要商品列表
:param secondary_goods: 次要商品列表
:param num: 期望议价的价格
:param max_book: 最大使用进货书量
"""
book = 0
for good in goods:
result, book = buy_good(good, book, max_book)
if not result:
logger.info(f"商品{good}购买失败")

def process_goods(book, good):
if (boatload := get_boatload()) == 0:
logger.info("已满载")
break
return True
result, book = buy_good(good, book, max_book)
if result is None:
logger.info(f"进货书已用完")
elif not result:
logger.info(f"商品{good}购买失败")
logger.info(f"剩余载货量: {boatload}%")
return book

book = 0
done = False
for i in range(max_book + 1):
if done:
break
for good in primary_goods:
if (book := process_goods(book, good)) is True:
done = True
break
for good in secondary_goods:
if (book := process_goods(book, good)) is True:
break

click_bargain_button(num)
click_buy_button()
time.sleep(0.5)
Expand Down Expand Up @@ -69,7 +88,7 @@ def buy_good(good: str, book: int, max_book: int, again: bool = False):
book + 1,
)
else:
return False, book
return None, book
else:
click(pos)
return True, book
Expand All @@ -86,7 +105,8 @@ def use_book(pos: Tuple[int, int], book: int):
click((pos[0] - 215, pos[1]))
time.sleep(1.0)
click((959, 541))
while get_hsv(screenshot(), pos)[-1] < 80:
while (hsv := get_hsv(screenshot(), pos))[-1] < 60:
logger.info(f"进货书是否所有成功颜色检查: {hsv}")
time.sleep(0.5)


Expand Down
9 changes: 5 additions & 4 deletions auto/run_business/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ def run(
city_book: dict,
skill_level: dict,
station_level: dict,
city_tired: dict,
max_goods_num: int,
route: RoutesModel = None,
type_: bool = False,
Expand All @@ -71,11 +72,11 @@ def run(
logger.info("未设置UUID")
return False
route = get_goods_info_kmou(
city_book, skill_level, station_level, max_goods_num, uuid
city_book, skill_level, station_level, city_tired, max_goods_num, uuid
)
else:
route = get_goods_info_srap(
city_book, skill_level, station_level, max_goods_num
city_book, skill_level, station_level, city_tired, max_goods_num
)
city_name = get_city()
if route.city_data[0].sell_city_name == city_name:
Expand All @@ -90,8 +91,8 @@ def run(
click_station(city.buy_city_name).wait()
go_business("buy")
buy_business(
[good_name for good in city.buy_goods for good_name in good]
+ list(city.normal_goods.keys()),
city.primary_goods,
city.secondary_goods,
20,
max_book=city.book,
)
Expand Down
3 changes: 2 additions & 1 deletion core/goods/kmou.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ def get_goods_info(
city_book: Dict[str, int],
skill_level: Dict[str, int],
station_level: Dict[str, int],
city_tired: Dict[str, int],
max_goods_num: int,
uuid: str,
):
url = "https://reso-data.kmou424.moe/api/fetch/goods_info"
response = requests.get(url, params={"uuid": uuid})
data = KMouRequestModel.model_validate(response.json())
return SHOP(
data, city_book, skill_level, station_level, max_goods_num
data, city_book, skill_level, station_level, city_tired, max_goods_num
).get_optimal_route()
Loading

0 comments on commit 2cf8787

Please sign in to comment.