Skip to content

Commit

Permalink
Merge pull request taojy123#116 from Monomux/Cont'd
Browse files Browse the repository at this point in the history
自定义功能扩展(Cont'd)
  • Loading branch information
taojy123 committed Jun 1, 2022
2 parents f7bb11e + d41f571 commit 673373f
Show file tree
Hide file tree
Showing 12 changed files with 318 additions and 181 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ scripts/
*.ini
.github
plugins/
logs/
52 changes: 24 additions & 28 deletions KeymouseGo.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,53 +7,44 @@

import pyWinhook
import pythoncom
from PySide2 import QtWidgets
from PySide2.QtWidgets import QApplication

import UIFunc
import argparse

from qt_material import apply_stylesheet
# DPI感知
# try:
# # win10 version 1607及以上
# ctypes.windll.shcore.SetProcessDpiAwarenessContext(ctypes.windll.shcore.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)
# except:
# try:
# # win 8.1 及以上
# ctypes.windll.shcore.SetProcessDpiAwareness(ctypes.windll.shcore.PROCESS_PER_MONITOR_DPI_AWARE)
# except:
# # win vista 及以上
# ctypes.windll.user32.SetProcessDPIAware()
#
from loguru import logger


def main():
app = QtWidgets.QApplication(sys.argv)
app = QApplication(sys.argv)
apply_stylesheet(app, theme='light_cyan_500.xml')
ui = UIFunc.UIFunc()
ui.show()
sys.exit(app.exec_())


def single_run(script_path, run_times=1, speed=100):
@logger.catch
def single_run(script_path, run_times=1, speed=100, module_name='Extension'):
t = HookThread()
t.start()

try:
for path in script_path:
print(path)
events, extension = UIFunc.RunScriptClass.parsescript(path, speed=speed)
logger.info('Script path:%s' % path)
events = UIFunc.RunScriptClass.parsescript(path, speed=speed)
extension = UIFunc.RunScriptClass.getextension(module_name)
j = 0
while j < run_times or run_times == 0:
j += 1
print('===========', j, '==============')
logger.info('===========%d==============' % j)
if extension.onbeforeeachloop(j):
UIFunc.RunScriptClass.run_script_once(events, extension, j)
extension.onaftereachloop(j)
print(path + ' run finish')
print('scripts run finish!')
j += 1
logger.info('%s run finish' % path)
logger.info('Scripts run finish!')
except Exception as e:
print(e)
logger.error(e)
raise e
finally:
os._exit(0)
Expand All @@ -66,7 +57,7 @@ def on_keyboard_event(event):
key_name = event.Key.lower()
stop_name = 'f9'
if key_name == stop_name:
print('break exit!')
logger.debug('break exit!')
os._exit(0)
return True

Expand All @@ -77,8 +68,7 @@ def on_keyboard_event(event):


if __name__ == '__main__':
print(sys.argv)

logger.debug(sys.argv)
if len(sys.argv) > 1:
parser = argparse.ArgumentParser()
parser.add_argument('sctipts',
Expand All @@ -96,14 +86,20 @@ def on_keyboard_event(event):
type=int,
default=100
)
parser.add_argument('-m', '--module',
help='Extension for the program',
type=str,
default='Extension'
)
args = vars(parser.parse_args())
print(args)
logger.debug(args)
if args['speed'] <= 0:
print('Unsupported speed')
logger.warning('Unsupported speed')
else:
single_run(args['sctipts'],
run_times=args['runtimes'],
speed=args['speed']
speed=args['speed'],
module_name=args['module']
)
else:
main()
68 changes: 35 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,67 +106,63 @@ Monomux

# 自定义扩展功能:

程序提供了插件扩展接口,默认扩展类位于`plugins/Extension.py`,可以通过派生`Extension`类实现自定义功能。
`Extension`类提供以下四个接口:
程序提供了插件扩展接口,默认扩展类位于`assets/plugins/Extension.py`,可以通过派生`Extension`类实现自定义功能。
`Extension`类提供以下接口:
+ `onbeforeeachloop(currentloop)`,在每次执行脚本前执行,返回False时跳过本次执行
+ `onrunbefore(event, currentindex)`,在每行脚本执行前执行,返回False时跳过本行执行
+ `onrunafter(event, currentindex)`,在每行脚本执行后执行
+ `onaftereachloop(currentloop)`,在每次执行脚本后执行
+ `onrunbefore(event, currentindex)`,在每行脚本执行前执行,返回False时跳过本行执行,返回数字索引(从0开始)则跳转到索引对应脚本行继续执行
+ `onrunafter(event, currentindex)`,在每行脚本执行后执行,默认无返回值,返回数字索引(从0开始)则跳转到索引对应脚本行继续执行
+ `onaftereachloop(currentloop)`,在每次执行脚本后执行,默认无返回值
+ `onrecord(event, currentindex)`,在每次录制到一个操作后执行,返回True记录本次操作

`currentindex``currentloop`分别指代当前脚本执行到第几条和当前脚本循环了多少次
`currentindex``currentloop`分别指代当前脚本的行索引与循环索引(从0开始)

`event`为当前脚本执行的操作,其内容包含
+ `delay`操作延时(ms)
+ `event_type`事件类型
+ `message`操作类型
+ `action`操作参数
+ `addon`用户自定义内容,可以是任意数据类型,在自定义扩展中可使用

编写自定义扩展后,需要在脚本文件中显式指定编写的模块:
```json
[
"模块名(不带.py后缀)",
// 录制的脚本
]
```
如果扩展中继承`Extension`的类名与模块名不一致,则需要同时显式指定模块名和类名:
```json
[
"模块名(不带.py后缀)",
"继承Extension的类名",
// 录制的脚本
]
定义`Extension`子类`<name>`时,确保模块名`<name>.py`与子类名`<name>`相同

__日志调试__:

本程序使用`loguru`作为日志模块,在自定义扩展中可直接引入模块进行日志调试
```python
from loguru import logger
```
日志内容默认保存在主程序日志中,如果有其它的需求可以参阅loguru的[文档](https://loguru.readthedocs.io/en/stable/overview.html)进行改动

示例:

需要在第二次脚本执行时跳过第1条脚本内容,在`plugins/`目录下新建`MyExtension.py`,其内容为:
需要在第一次脚本执行完第1条(索引0)脚本内容后跳转到第3条脚本(索引2), 在第二次脚本执行时跳过第1条(索引0)脚本内容,在`plugins/`目录下新建`MyExtension.py`,其内容为:
```python
from plugins.Extension import Extension
from assets.plugins.Extension import *
from loguru import logger

logger.info('Import MyExtension')


class MyExtension2(Extension):
class MyExtension(Extension):
def __init(self):
self.currentloop = 1
self.currentloop = 0

def onbeforeeachloop(self, currentloop):
self.currentloop = currentloop
return True

def onrunbefore(self, event, currentindex):
if self.currentloop == 2 and currentindex == 1:
if self.currentloop == 1 and currentindex == 0:
return False
else:
return True
```
在录制的脚本开头加入:
```json
[
"MyExtension",
"MyExtension2",
// 录制的脚本
]

def onrunafter(self, event, currentindex):
if self.currentloop == 0 and currentindex == 0:
return 2
```


# 使用命令行运行:

直接运行指定脚本:
Expand All @@ -186,6 +182,12 @@ class MyExtension2(Extension):
> KeymouseGo.exe scripts/0314_1452.txt --speed 200
```

加载自定义扩展`MyExtension`运行指定脚本:
```
> KeymouseGo.exe scripts/0314_1452.txt -m MyExtension
> KeymouseGo.exe scripts/0314_1452.txt --module MyExtension
```

# 源码编译, 打包 exe 文件:
```
1. 安装 Python3.10
Expand Down
Loading

0 comments on commit 673373f

Please sign in to comment.