Skip to content

Commit 8385483

Browse files
author
hgjazhgj
committed
v10.4.0
1 parent 984375f commit 8385483

File tree

7 files changed

+34
-14
lines changed

7 files changed

+34
-14
lines changed

FGO-py/fgo.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
import argparse
1+
import argparse,os
22
from fgoConst import VERSION
33

44
parser=argparse.ArgumentParser(description=f'FGO-py {VERSION}')
55
parser.add_argument('entrypoint',help='Program entry point (default: %(default)s)',type=str.lower,choices=['gui','cli','web'],default='gui',nargs='?')
66
parser.add_argument('-v','--version',help='Show FGO-py version',action='version',version=VERSION)
77
parser.add_argument('-l','--loglevel',help='Change the console log level (default: %(default)s)',type=str.upper,choices=['DEBUG','INFO','WARNING','CRITICAL','ERROR'],default='INFO')
88
parser.add_argument('-c','--config',help='Config file path (default: %(default)s)',type=str,default='fgoConfig.json')
9+
parser.add_argument('--no-color',help='Disable colored console output',action='store_true')
910
arg=parser.parse_args()
1011

12+
if arg.no_color:os.environ['NO_COLOR']='1'
13+
1114
if arg.entrypoint=='gui':from fgoGui import main
1215
elif arg.entrypoint=='cli':from fgoCli import main
1316
elif arg.entrypoint=='web':from fgoWebServer import main

FGO-py/fgoCli.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from fgoTeamupParser import IniParser
77
logger=getLogger('Cli')
88

9+
prompt='FGO-py@{Device}({Team})> 'if os.getenv('NO_COLOR')else'FGO-py\033[32m@{Device}\033[36m({Team})\033[0m> '
910
def wrapTry(func):
1011
@wraps(func)
1112
def wrapper(self,*args,**kwargs):
@@ -14,7 +15,7 @@ def wrapper(self,*args,**kwargs):
1415
if e.args[0]is not None:logger.error(e)
1516
except KeyboardInterrupt:logger.critical('KeyboardInterrupt')
1617
except BaseException as e:logger.exception(e)
17-
finally:self.prompt=f'FGO-py\033[32m@{fgoDevice.device.name}\033[36m({fgoKernel.Main.teamIndex})\033[0m> '
18+
finally:self.prompt=prompt.format(Device=fgoDevice.device.name,Team=fgoKernel.Main.teamIndex)
1819
return wrapper
1920
def countdown(x):
2021
timer=time.time()+x
@@ -31,7 +32,7 @@ class Cmd(cmd.Cmd,metaclass=lambda name,bases,attrs:type(name,bases,{i:wrapTry(j
3132
Type help or ? to list commands, help <command> to get more information.
3233
Some commands support <command> [<subcommand> ...] {{-h, --help}} for further information.
3334
'''
34-
prompt='FGO-py\033[32m@Device\033[36m(Team)\033[0m> '
35+
prompt=prompt.format(Device='Device',Team='Team')
3536
def __init__(self,config):
3637
super().__init__()
3738
fgoDevice.Device.enumDevices()

FGO-py/fgoConst.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION='v10.3.0'
1+
VERSION='v10.4.0'
22
CONFIG={
33
'runOnce':'',
44
'device':'',

FGO-py/fgoDetect.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ def getTeamServantClassRank(self):return[(lambda x:x if x is None else divmod(x,
158158
def findFriend(self,img):return self._find(img,(13,166,1233,720))
159159
def findLastExec(self):return self._find(IMG.LASTEXEC,(200,160,1280,560))
160160
def findMail(self,img):return self._find(img,(73,166,920,720),threshold=.016)
161+
@classmethod
162+
def saveGachaHistory(cls):return(lambda c:(lambda img:(c,cls.__new__(cls).inject(img).save(f'GachaHistory({c})',(0,0,*img.shape[::-1]))))(numpy.vstack((cv2.putText(numpy.zeros((36,XDetect._gachaHistory.shape[1]),numpy.uint8),f'GachaHistory({c}) generated by FGO-py',(8,26),cv2.FONT_HERSHEY_DUPLEX,0.85,255,2,cv2.LINE_4),XDetect._gachaHistory[:numpy.flatnonzero(numpy.max(XDetect._gachaHistory,axis=1))[-1]+2]))))(cls.getGachaHistoryCount())
161163
def isGameAnnounce(self):raise NotImplementedError
162164
def isGameLaunch(self):raise NotImplementedError
163165
def isInCampaign(self):raise NotImplementedError

FGO-py/fgoKernel.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,7 @@ def gachaHistory():
112112
Detect().getGachaHistory()
113113
fgoDevice.device.swipe((930,500,930,200))
114114
Detect().getGachaHistory()
115-
gachaHistory.result={
116-
'type':'GachaHistory',
117-
'value':(t:=Detect.getGachaHistoryCount()),
118-
'file':Detect.__new__(Detect).inject(XDetect._gachaHistory).save(f'GachaHistory({t})',(0,0,*XDetect._gachaHistory.shape[::-1]))
119-
}
115+
gachaHistory.result={'type':'GachaHistory'}|dict(zip(('value','file'),Detect.saveGachaHistory()))
120116
@withLock(lock)
121117
def bench(times=20,touch=True,screenshot=True):
122118
if not(touch or screenshot):touch=screenshot=True

FGO-py/fgoLogging.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
import logging,platform,time
1+
import logging,platform,os,time
22
from copy import copy
33
from functools import wraps
44
from fgoConst import VERSION
55
if platform.system()=='Windows':(lambda k:k.SetConsoleMode(k.GetStdHandle(-11),7))(__import__('ctypes').windll.kernel32) # -11:STD_OUTPUT_HANDLE, 7:ENABLE_VIRTUAL_TERMINAL_PROCESSING
6-
def color(c=None,f='38'):return'\033[0m'if c is None else f'\033[{f};2;{c>>16&0xFF};{c>>8&0xFF};{c&0xFF}m'
7-
logging.root.addHandler((lambda handler:(handler.setFormatter(logging.Formatter('[%(asctime)s][%(levelname)s]<%(name)s> %(message)s')),handler.setLevel(logging.DEBUG),handler)[-1])(logging.FileHandler(time.strftime('fgoLog/Log_%Y-%m-%d_%H.%M.%S.txt'))))
6+
monoFormatter=logging.Formatter('[%(asctime)s][%(levelname)s]<%(name)s> %(message)s')
7+
if os.getenv('NO_COLOR'):
8+
def color(c=None,f='38'):return''
9+
coloredFormatter=monoFormatter
10+
else:
11+
def color(c=None,f='38'):return'\033[0m'if c is None else f'\033[{f};2;{c>>16&0xFF};{c>>8&0xFF};{c&0xFF}m'
12+
coloredFormatter=type('ColoredFormatter',(logging.Formatter,),{'__init__':lambda self,*args,**kwargs:logging.Formatter.__init__(self,*args,**kwargs),'format':lambda self,record:((lambda record:(setattr(record,'levelname','\033[{}m[{}]'.format({'DEBUG':'37','INFO':'34','WARNING':'33','CRITICAL':'35','ERROR':'31'}.get(record.levelname,'0'),record.levelname)),logging.Formatter.format(self,record))[-1])(copy(record)))})('\033[32m[%(asctime)s]%(levelname)s\033[36m<%(name)s>\033[0m %(message)s')
13+
logging.root.addHandler((lambda handler:(handler.setFormatter(monoFormatter),handler.setLevel(logging.DEBUG),handler)[-1])(logging.FileHandler(time.strftime('fgoLog/Log_%Y-%m-%d_%H.%M.%S.txt'))))
814
logger=logging.getLogger('fgo')
9-
(logger.setLevel(logging.DEBUG),logger.addHandler((lambda handler:(handler.setFormatter(type('ColoredFormatter',(logging.Formatter,),{'__init__':lambda self,*args,**kwargs:logging.Formatter.__init__(self,*args,**kwargs),'format':lambda self,record:((lambda record:(setattr(record,'levelname','\033[{}m[{}]'.format({'DEBUG':'37','INFO':'34','WARNING':'33','CRITICAL':'35','ERROR':'31'}.get(record.levelname,'0'),record.levelname)),logging.Formatter.format(self,record))[-1])(copy(record)))})('\033[32m[%(asctime)s]%(levelname)s\033[36m<%(name)s>\033[0m %(message)s')),handler.setLevel(logging.INFO),handler)[-1])(logging.StreamHandler())))
15+
(logger.setLevel(logging.DEBUG),logger.addHandler((lambda handler:(handler.setFormatter(coloredFormatter),handler.setLevel(logging.INFO),handler)[-1])(logging.StreamHandler())))
1016
(lambda handler:(handler.setLevel(logging.INFO),handler.setFormatter(logger.handlers[-1].formatter)))((lambda logger:(logger.setLevel(logging.DEBUG),logger)[-1])(logging.getLogger('airtest')).handlers[0])
1117
def getLogger(name):return logging.getLogger('fgo.'+name)
1218
def logit(logger,level=logging.DEBUG):return lambda func:wraps(func)(lambda*args,**kwargs:(lambda x:(logger.log(level,' '.join((func.__name__,str(x)[:100].split('\n',1)[0]))),x)[-1]if x is not None else x)(func(*args,**kwargs)))

readme.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ FGO-py一经立项,就把*打破当前游戏版本下想尽办法3t速刷的固
8181
- 不管什么本直接上就行连作业都不用抄
8282
- 可以一键清完所有强化本
8383
- 剧情关锁人?游戏内组好队就行程序内还是只点击完成战斗
84+
- 可以在高难中帮你收拾残局
8485
- 不像有些3T脚本需要用户删掉练度不足的好友
8586
- 把你喜欢的从者编入队伍中
8687
- 拥有一队15羁绊的伊莉雅小黑美游真的超酷的好吗
@@ -265,7 +266,18 @@ Add:onepush
265266

266267
# 版本记录 Version Logs
267268

268-
## 2022/01/01 v10.3.0
269+
## 2023/01/29 v10.4.0
270+
271+
Add:NO_COLOR
272+
起因是我拥有了一个灰度的水墨屏(e-ink display)设备,如果能在压泡面的同时打打FGO那便是极好的,然而此时彩色的输出将难以辨识
273+
运行时附加`--no-color`参数可以使程序不输出任何颜色
274+
遵循[NO_COLOR标准](http://no-color.org/),非空的`NO_COLOR`环境变量将会打开本开关而无需每次运行都附加参数
275+
禁用彩色时,Windows cmd的模拟终端开关仍会被打开
276+
此外,NO_COLOR标准记录了符合该标准的系列应用程序,但是在这个列表中出现一个中文二刺螈项目似乎有些ky,所以就暂时不开pr了
277+
Opt:抽卡统计图片美化
278+
主要是裁去了滑动到底后多余的空白
279+
280+
## 2023/01/01 v10.3.0
269281

270282
Add:抽卡记录统计导出
271283
获取当前抽数以知晓保底还有多远

0 commit comments

Comments
 (0)