created interface for engines

This commit is contained in:
DESKTOP-JVKHS7I\Adam 2020-06-01 18:28:18 +05:30
parent cd1b2dd8f6
commit 686252d39e
10 changed files with 107 additions and 73 deletions

View File

@ -8,6 +8,7 @@ import win32gui
import fishy import fishy
from fishy import web, helper, gui from fishy import web, helper, gui
from fishy.engine.event_handler import EngineEventHandler
from fishy.gui import GUI from fishy.gui import GUI
from fishy.helper import Config from fishy.helper import Config
from fishy.engine import SemiFisherEngine from fishy.engine import SemiFisherEngine
@ -53,7 +54,7 @@ def main():
if not gui.check_eula(c): if not gui.check_eula(c):
return return
bot = SemiFisherEngine(c, lambda: gui_window) bot = EngineEventHandler(c, lambda: gui_window)
gui_window = GUI(c, lambda: bot) gui_window = GUI(c, lambda: bot)
gui_window.start() gui_window.start()

31
fishy/engine/IEngine.py Normal file
View File

@ -0,0 +1,31 @@
import typing
from abc import ABC, abstractmethod
from threading import Thread
from typing import Callable
if typing.TYPE_CHECKING:
from fishy.gui import GUI
class IEngine(ABC):
def __init__(self, config, gui_ref: 'Callable[[], GUI]'):
self.get_gui = gui_ref
self.start = False
self.fishPixWindow = None
self.thread = None
self.config = config
@property
def gui(self):
return self.get_gui().funcs
def toggle_start(self):
self.start = not self.start
if self.start:
self.thread = Thread(target=self.run)
self.thread.start()
@abstractmethod
def run(self):
...

View File

@ -1,2 +1 @@
from fishy.engine.semifisher.funcs import SemiFisherFuncs
from fishy.engine.semifisher.engine import SemiFisherEngine from fishy.engine.semifisher.engine import SemiFisherEngine

View File

@ -0,0 +1,40 @@
import logging
from fishy.engine import SemiFisherEngine
from fishy.engine.fullautofisher.engine import FullAuto
class EngineEventHandler:
def __init__(self, config, gui_ref):
self.event_handler_running = True
self.event = []
self.semi_fisher_engine = SemiFisherEngine(config, gui_ref)
self.full_fisher_engine = FullAuto(config, gui_ref)
def start_event_handler(self):
while self.event_handler_running:
while len(self.event) > 0:
event = self.event.pop(0)
event()
def toggle_semifisher(self):
self.event.append(self.semi_fisher_engine.toggle_start)
def toggle_fullfisher(self):
self.event.append(self.full_fisher_engine.toggle_start)
def check_pixel_val(self):
def func():
if self.semi_fisher_engine.start:
self.semi_fisher_engine.show_pixel_vals()
else:
logging.debug("Start the engine first before running this command")
self.event.append(func)
def quit(self):
def func():
self.semi_fisher_engine.start = False
self.event_handler_running = False
self.event.append(func)

View File

@ -0,0 +1,13 @@
import logging
import time
from fishy.engine.IEngine import IEngine
class FullAuto(IEngine):
def run(self):
self.gui.bot_started(True)
while self.start:
logging.debug("running full auto")
time.sleep(0.5)
self.gui.bot_started(False)

View File

@ -8,12 +8,12 @@ import logging
import pywintypes import pywintypes
from fishy.engine.semifisher.funcs import SemiFisherFuncs from fishy.engine.IEngine import IEngine
from fishy.engine.semifisher import fishing_event from fishy.engine.semifisher import fishing_event
from .fishing_event import HookEvent, StickEvent, LookEvent, IdleEvent from .fishing_event import HookEvent, StickEvent, LookEvent, IdleEvent
from .fishing_mode import FishingMode from .fishing_mode import FishingMode
from .pixel_loc import PixelLoc from .pixel_loc import PixelLoc
from .window import Window from fishy.engine.window import Window
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from fishy.gui import GUI from fishy.gui import GUI
@ -23,31 +23,14 @@ def _wait_and_check(gui):
time.sleep(10) time.sleep(10)
if not fishing_event._FishingStarted: if not fishing_event._FishingStarted:
gui.show_error("Doesn't look like fishing has started\n\n" gui.show_error("Doesn't look like fishing has started\n\n"
"Make sure ProvisionsChalutier addon is visible clearly on top " "Check out #faqs on our discord channel to troubleshoot the issue")
"left corner of the screen, either,\n"
"1) Outdated addons are disabled\n"
"2) Other addons are overlapping ProvisionsChalutier\n"
"3) Post processing (re shader) is on\n\n"
"If fixing those doesnt work, try running the bot as admin")
class SemiFisherEngine: class SemiFisherEngine(IEngine):
def __init__(self, config, gui_ref: 'Callable[[], GUI]'): def __init__(self, config, gui_ref: 'Callable[[], GUI]'):
self.funcs = SemiFisherFuncs(self) super().__init__(config, gui_ref)
self.get_gui = gui_ref
self.start = False def run(self):
self.fishPixWindow = None
self.fishy_thread = None
self.config = config
self.event_handler_running = True
self.gui_events = []
@property
def gui(self):
return self.get_gui().funcs
def start_fishing(self):
""" """
Starts the fishing Starts the fishing
code explained in comments in detail code explained in comments in detail
@ -90,13 +73,7 @@ class SemiFisherEngine:
logging.info("Fishing engine stopped") logging.info("Fishing engine stopped")
self.gui.bot_started(False) self.gui.bot_started(False)
def start_event_handler(self): def show_pixel_vals(self):
while self.event_handler_running:
while len(self.gui_events) > 0:
event = self.gui_events.pop(0)
event()
def _show_pixel_vals(self):
def show(): def show():
freq = 0.5 freq = 0.5
t = 0 t = 0

View File

@ -1,33 +0,0 @@
import logging
from threading import Thread
# noinspection PyProtectedMember
class SemiFisherFuncs:
def __init__(self, engine):
self.engine = engine
def start_button_pressed(self):
def func():
self.engine.start = not self.engine.start
if self.engine.start:
self.engine.fishy_thread = Thread(target=self.engine.start_fishing)
self.engine.fishy_thread.start()
self.engine.gui_events.append(func)
def check_pixel_val(self):
def func():
if self.engine.start:
self.engine._show_pixel_vals()
else:
logging.debug("Start the engine first before running this command")
self.engine.gui_events.append(func)
def quit(self):
def func():
self.engine.start = False
self.engine.event_handler_running = False
self.engine.gui_events.append(func)

View File

@ -2,6 +2,7 @@ import logging
from typing import List, Callable from typing import List, Callable
import threading import threading
from fishy.engine.event_handler import EngineEventHandler
from fishy.gui.funcs import GUIFuncs from fishy.gui.funcs import GUIFuncs
from fishy.engine import SemiFisherEngine from fishy.engine import SemiFisherEngine
from . import main_gui from . import main_gui
@ -10,7 +11,7 @@ from fishy.helper import Config
class GUI: class GUI:
def __init__(self, config: Config, get_engine: Callable[[], SemiFisherEngine]): def __init__(self, config: Config, get_engine: Callable[[], EngineEventHandler]):
""" """
:param config: used to get and set configuration settings :param config: used to get and set configuration settings
""" """
@ -41,7 +42,7 @@ class GUI:
@property @property
def engine(self): def engine(self):
return self.get_engine().funcs return self.get_engine()
def create(self): def create(self):
main_gui._create(self) main_gui._create(self)

View File

@ -24,11 +24,15 @@ def _apply_theme(gui: 'GUI'):
def _create(gui: 'GUI'): def _create(gui: 'GUI'):
engines = { engines = {
"Semi Fisher": [lambda: config_top.start_semifisher_config(gui), gui.engine.start_button_pressed], "Semi Fisher": [lambda: config_top.start_semifisher_config(gui), gui.engine.toggle_semifisher],
# "Full-Auto Fisher": [not_implemented, not_implemented], "Full-Auto Fisher": [not_implemented, gui.engine.toggle_fullfisher],
# "Lock Picker": [not_implemented, not_implemented] # "Lock Picker": [not_implemented, not_implemented]
} }
def start_engine(label):
gui._config.set("last_started", label)
engines[label][1]()
gui._root = ThemedTk(theme="equilux", background=True) gui._root = ThemedTk(theme="equilux", background=True)
gui._root.title("Fishybot for Elder Scrolls Online") gui._root.title("Fishybot for Elder Scrolls Online")
@ -88,14 +92,15 @@ def _create(gui: 'GUI'):
engine_var = StringVar(start_frame) engine_var = StringVar(start_frame)
labels = list(engines.keys()) labels = list(engines.keys())
engine_select = OptionMenu(start_frame, engine_var, labels[0], *labels) last_started = gui._config.get("last_started", labels[0])
engine_select = OptionMenu(start_frame, engine_var, last_started, *labels)
engine_select.pack(side=LEFT) engine_select.pack(side=LEFT)
button = Button(start_frame, text="", width=0, command=lambda: engines[engine_var.get()][0]()) config_button = Button(start_frame, text="", width=0, command=lambda: engines[engine_var.get()][0]())
button.pack(side=RIGHT) config_button.pack(side=RIGHT)
gui._start_button = Button(start_frame, text="STOP" if gui._bot_running else "START", width=25, gui._start_button = Button(start_frame, text="STOP" if gui._bot_running else "START", width=25,
command=lambda: engines[engine_var.get()][1]()) command=lambda: start_engine(engine_var.get()))
gui._start_button.pack(side=RIGHT) gui._start_button.pack(side=RIGHT)
start_frame.pack(padx=(10, 10), pady=(5, 15), fill=X) start_frame.pack(padx=(10, 10), pady=(5, 15), fill=X)