Ejemplo n.º 1
0
 def toggle_sub():
     if web.is_subbed(config.get("uid"))[0]:
         if web.unsub(config.get("uid")):
             gui._notify.set(0)
     else:
         if web.sub(config.get("uid")):
             gui._notify.set(1)
Ejemplo n.º 2
0
def initialize(window_to_hide):
    helper.create_shortcut_first()
    helper.initialize_uid()

    new_session = web.get_session()
    if new_session is None:
        logging.error(
            "Couldn't create a session, some features might not work")
    print(f"created session {new_session}")

    try:
        is_admin = os.getuid() == 0
    except AttributeError:
        is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0

    if is_admin:
        logging.info("Running with admin privileges")

    try:
        helper.auto_upgrade()
    except Exception:
        logging.error(traceback.format_exc())

    if not config.get("debug", False) and check_window_name(
            win32gui.GetWindowText(window_to_hide)):
        win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE)
        helper.install_thread_excepthook()
        sys.excepthook = helper.unhandled_exception_logging

    helper.check_addon("ProvisionsChalutier")

    if config.get("debug", False):
        helper.check_addon("FooAddon")
Ejemplo n.º 3
0
def init():
    subscribe()
    FishEvent.jitter = config.get("jitter", False)
    FishEvent.action_key = config.get("action_key", 'e')
    FishEvent.collect_key = config.get("collect_key", 'r')
    FishEvent.uid = config.get("uid")
    FishEvent.sound = config.get("sound_notification", False)
Ejemplo n.º 4
0
    def run(self):
        old_timeline: Optional[List] = None
        start_from = None
        if config.get("edit_recorder_mode"):
            logging.info("moving to nearest coord in recording")

            old_timeline = player.get_rec_file()
            if not old_timeline:
                logging.error("Edit mode selected, but no fishy file selected")
                return

            coords = self.engine.get_coords()
            if not coords:
                logging.error("QR not found")
                return

            start_from = player.find_nearest(old_timeline, coords)
            if not self.engine.move_to(start_from[2]):
                logging.error("QR not found")
                return

        logging.info("starting, press LMB to mark hole")
        hotkey.hook(Key.LMB, self._mark_hole)

        self.timeline = []
        last_coord = None
        while self.engine.start:
            start_time = time.time()
            coords = self.engine.get_coords()
            if not coords:
                logging.warning(
                    "missed a frame, as qr not be read properly...")
                time.sleep(0.1)
                continue

            self.timeline.append(("move_to", (coords[0], coords[1])))

            # maintaining constant frequency for recording
            time_took = time.time() - start_time
            if time_took <= Recorder.recording_fps:
                time.sleep(Recorder.recording_fps - time_took)
            else:
                logging.warning("Took too much time to record")
            last_coord = coords

        hotkey.free(Key.LMB)

        if config.get("edit_recorder_mode"):
            logging.info("moving to nearest coord in recording")
            end = player.find_nearest(old_timeline, last_coord)
            self.engine.move_to(end[2])

            # recording stitching
            part1 = old_timeline[:start_from[0]]
            part2 = old_timeline[end[0]:]
            self.timeline = part1 + self.timeline + part2

        self._ask_to_save()
Ejemplo n.º 5
0
def initialize(window_to_hide):
    helper.create_shortcut_first()
    helper.initialize_uid()

    new_session = web.get_session()
    if new_session is None:
        logging.error(
            "Couldn't create a session, some features might not work")
    print(f"created session {new_session}")

    try:
        is_admin = os.getuid() == 0
    except AttributeError:
        is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
    if is_admin:
        logging.info("Running with admin privileges")

    try:
        if helper.upgrade_avail() and not config.get("dont_ask_update", False):
            cv, hv = helper.versions()
            update_now, dont_ask_update = update_dialog.start(cv, hv)
            if dont_ask_update:
                config.set("dont_ask_update", dont_ask_update)
            else:
                config.delete("dont_ask_update")

            if update_now:
                helper.auto_upgrade()
    except Exception:
        logging.error(traceback.format_exc())

    if not config.get("debug", False) and check_window_name(
            win32gui.GetWindowText(window_to_hide)):
        win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE)
        helper.install_thread_excepthook()
        sys.excepthook = helper.unhandled_exception_logging

    if not config.get("addoninstalled", 0) or helper.get_addonversion(
            chalutier[0]) < chalutier[2]:
        helper.install_addon(*chalutier)
        helper.install_addon(*lam2)
        helper.remove_addon(
            "ProvisionsChalutier")  #TODO delete with fishy 0.4.6
        helper.remove_addon("FooAddon")  #TODO delete with fishy 0.4.6
    config.set("addoninstalled", helper.get_addonversion(chalutier[0]))
Ejemplo n.º 6
0
        def func():
            _file = None
            files = [('Fishy File', '*.fishy')]

            while True:
                button = self._open_save_popup()
                if button == 0 and config.get("full_auto_rec_file"):
                    return open(config.get("full_auto_rec_file"), 'wb')

                if button == 1:
                    _file = asksaveasfile(mode='wb',
                                          filetypes=files,
                                          defaultextension=files)
                    if _file:
                        return _file

                if button == 2:
                    return None
Ejemplo n.º 7
0
    def run(self):
        self.mode = None
        if config.get("calibrate", False):
            self.mode = Calibrator(self)
        elif FullAutoMode(config.get("full_auto_mode", 0)) == FullAutoMode.Player:
            self.mode = Player(self)
        elif FullAutoMode(config.get("full_auto_mode", 0)) == FullAutoMode.Recorder:
            self.mode = Recorder(self)
        else:
            logging.error("not a valid mode selected")
            return

        # block thread until game window becomes active
        if not is_eso_active():
            logging.info("Waiting for eso window to be active...")
            wait_until(lambda: is_eso_active() or not self.start)
            if self.start:
                logging.info("starting in 2 secs...")
                time.sleep(2)

        if not (type(self.mode) is Calibrator) and not self.calibrator.all_calibrated():
            logging.error("you need to calibrate first")
            return

        if not qr_detection.get_values(self.window):
            logging.error("FishyQR not found, if its not hidden, try to drag it around, "
                          "or increase/decrease its size and try again\nStopping engine...")
            return

        if config.get("tabout_stop", 1):
            self.stop_on_inactive()

        # noinspection PyBroadException
        try:
            self.mode.run()
        except Exception:
            logging.error("exception occurred while running full auto mode")
            print_exc()
Ejemplo n.º 8
0
def get_rec_file():
    file = config.get("full_auto_rec_file")

    if not file:
        logging.error("Please select a fishy file first from config")
        return None

    file = open(file, 'rb')
    data = pickle.load(file)
    file.close()
    if "full_auto_path" not in data:
        logging.error("invalid file")
        return None
    return data["full_auto_path"]
Ejemplo n.º 9
0
def check_update(gui, manual_check=False):
    if not auto_update.upgrade_avail() or config.get("dont_ask_update", False):
        if manual_check:
            logging.info("No update is available.")
        return

    cv, hv = auto_update.versions()
    returns = [None, None]
    _show(gui, cv, hv, returns)
    [update_now, dont_ask_update] = returns
    if dont_ask_update:
        config.set("dont_ask_update", dont_ask_update)
    else:
        config.delete("dont_ask_update")

    if update_now:
        gui.engine.set_update(hv)
Ejemplo n.º 10
0
def install_required_addons(force=False):
    addons_req = [libgps, lam2, fishyqr]
    addon_version = config.get("addon_version", {})
    installed = False
    for addon in addons_req:
        if force or (addon_exists(*addon) and
                     (addon[0] not in addon_version or
                      (addon[0] in addon_version
                       and addon_version[addon[0]] < addon[2]))):
            remove_addon(*addon)
            install_addon(*addon)
            addon_version[addon[0]] = addon[2]
            installed = True
    config.set("addon_version", addon_version)
    if installed:
        logging.info(
            "Please make sure to enable \"Allow outdated addons\" in ESO")
Ejemplo n.º 11
0
    def __init__(self):
        StreamHandler.__init__(self)

        self.renderer = None
        self._temp_buffer = []

        formatter = Formatter('%(levelname)s - %(message)s')
        self.setFormatter(formatter)
        logging_config = {"comtypes": logging.INFO,
                          "PIL": logging.INFO,
                          "urllib3": logging.WARNING,
                          "": logging.DEBUG}
        for name, level in logging_config.items():
            _logger = logging.getLogger(name)
            _logger.setLevel(level)
        self.setLevel(logging.DEBUG if config.get("debug", False) else logging.INFO)
        logging.getLogger("").addHandler(self)
Ejemplo n.º 12
0
    def look_for_hole(self) -> bool:
        valid_states = [fishing_mode.State.LOOKING, fishing_mode.State.FISHING]
        _hole_found_flag = FishingMode.CurrentMode in valid_states

        # if vertical movement is disabled
        if not config.get("look_for_hole", 1):
            return _hole_found_flag

        t = 0
        while not _hole_found_flag and t <= 2.5:
            direction = -1 if t > 1.25 else 1
            mse.move(0, FullAuto.rotate_by*direction)
            time.sleep(0.05)
            t += 0.05
            _hole_found_flag = FishingMode.CurrentMode in valid_states

        self._curr_rotate_y = t
        return _hole_found_flag
Ejemplo n.º 13
0
def init():
    """
    Executed once before the main loop,
    Finds the game window, and calculates the offset to remove the title bar
    """
    try:
        WindowServer.hwnd = win32gui.FindWindow(None, "Elder Scrolls Online")
        rect = win32gui.GetWindowRect(WindowServer.hwnd)
        client_rect = win32gui.GetClientRect(WindowServer.hwnd)
        WindowServer.windowOffset = math.floor(
            ((rect[2] - rect[0]) - client_rect[2]) / 2)
        WindowServer.titleOffset = (
            (rect[3] - rect[1]) - client_rect[3]) - WindowServer.windowOffset
        if config.get("borderless"):
            WindowServer.titleOffset = 0
        WindowServer.status = Status.RUNNING
    except pywintypes.error:
        logging.error("Game window not found")
        WindowServer.status = Status.CRASHED
Ejemplo n.º 14
0
    def _open_save_popup(self):
        top = PopUp(empty_function,
                    self.engine.get_gui()._root,
                    background=self.engine.get_gui()._root["background"])
        recorder_frame = ttk.Frame(top)
        top.title("Save Recording?")

        button = [-1]

        def button_pressed(_button):
            button[0] = _button
            top.quit_top()

        selected_text = f"\n\nSelected: {os.path.basename(config.get('full_auto_rec_file'))}" if config.get(
            'edit_recorder_mode') else ""
        ttk.Label(
            recorder_frame,
            text=f"Do you want to save the recording?{selected_text}").grid(
                row=0, column=0, columnspan=3, pady=(0, 5))

        _overwrite = tk.NORMAL if config.get(
            "edit_recorder_mode") else tk.DISABLED
        ttk.Button(recorder_frame,
                   text="Overwrite",
                   command=lambda: button_pressed(0),
                   state=_overwrite).grid(row=1, column=0, pady=(5, 0))
        ttk.Button(recorder_frame,
                   text="Save As",
                   command=lambda: button_pressed(1)).grid(row=1, column=1)
        ttk.Button(recorder_frame,
                   text="Cancel",
                   command=lambda: button_pressed(2)).grid(row=1, column=2)

        recorder_frame.pack(padx=(5, 5), pady=(5, 5))
        recorder_frame.update()
        top.start()

        return button[0]
Ejemplo n.º 15
0
def initialize(window_to_hide):
    Migration.migrate()

    helper.create_shortcut_first()

    new_session = web.get_session()

    if new_session is None:
        logging.error("Couldn't create a session, some features might not work")
    logging.debug(f"created session {new_session}")

    try:
        is_admin = os.getuid() == 0
    except AttributeError:
        is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
    if is_admin:
        logging.info("Running with admin privileges")

    if not config.get("debug", False) and check_window_name(win32gui.GetWindowText(window_to_hide)):
        win32gui.ShowWindow(window_to_hide, win32con.SW_HIDE)
        helper.install_thread_excepthook()
        sys.excepthook = helper.unhandled_exception_logging

    helper.install_required_addons()
Ejemplo n.º 16
0
 def file_name():
     file = config.get("full_auto_rec_file", None)
     if file is None:
         return "Not Selected"
     return os.path.basename(file)
Ejemplo n.º 17
0
def create_shortcut_first():
    from .config import config

    if not config.get("shortcut_created", False):
        create_shortcut(False)
        config.set("shortcut_created", True)
Ejemplo n.º 18
0
def check_eula():
    if not config.get("eula", False):
        _run_terms_window()
        return config.get("eula", False)

    return config.get("eula", False)
Ejemplo n.º 19
0
def start():
    q = Queue()
    Process(target=show, args=(config.get("win_loc"), q,)).start()
    return create_finish(q)
Ejemplo n.º 20
0
def start():
    Process(target=show, args=(config.get("win_loc"), )).start()
Ejemplo n.º 21
0
def _get_factor(key):
    return config.get("full_auto_factors", {}).get(key)
Ejemplo n.º 22
0
def _update_factor(key, value):
    full_auto_factors = config.get("full_auto_factors", {})
    full_auto_factors[key] = value
    config.set("full_auto_factors", full_auto_factors)
Ejemplo n.º 23
0
def start_semifisher_config(gui: 'GUI'):
    def save():
        gui.config.set("action_key", action_key_entry.get(), False)
        gui.config.set("collect_key", collect_key_entry.get(), False)
        gui.config.set("collect_allow_auto",
                       collect_allow_auto.instate(['selected']), False)
        gui.config.set("borderless", borderless.instate(['selected']), False)
        gui.config.set("jitter", jitter.instate(['selected']), False)
        gui.config.set("sound_notification", sound.instate(['selected']),
                       False)
        gui.config.save_config()

    def toggle_sub():
        if web.is_subbed()[0]:
            if web.unsub():
                gui._notify.set(0)
        else:
            if web.sub():
                gui._notify.set(1)

    def toggle_collect():
        gui.config.set("collect_allow_auto",
                       collect_allow_auto.instate(['selected']), False)
        collect_key_entry['state'] = NORMAL if config.get(
            "collect_allow_auto") else DISABLED

    def del_entry_key(event):
        event.widget.delete(0, "end")
        event.widget.insert(0, str(event.char))

    top = PopUp(save, gui._root, background=gui._root["background"])
    controls_frame = Frame(top)
    top.title("Config")

    Label(controls_frame, text="Notification:").grid(row=0, column=0)

    gui._notify = IntVar(0)
    gui._notify_check = Checkbutton(controls_frame,
                                    command=toggle_sub,
                                    variable=gui._notify)
    gui._notify_check.grid(row=0, column=1)
    gui._notify_check['state'] = DISABLED
    is_subbed = web.is_subbed()
    if is_subbed[1]:
        gui._notify_check['state'] = NORMAL
        gui._notify.set(is_subbed[0])

    Label(controls_frame, text="Fullscreen: ").grid(row=1,
                                                    column=0,
                                                    pady=(5, 5))
    borderless = Checkbutton(controls_frame,
                             var=BooleanVar(value=config.get("borderless")))
    borderless.grid(row=1, column=1)

    Label(controls_frame, text="Action Key:").grid(row=2, column=0)
    action_key_entry = Entry(controls_frame, justify=CENTER)
    action_key_entry.grid(row=2, column=1)
    action_key_entry.insert(0, config.get("action_key", "e"))
    action_key_entry.bind("<KeyRelease>", del_entry_key)

    Label(controls_frame, text="Auto-Looting: ").grid(row=3,
                                                      column=0,
                                                      pady=(15, 0))
    collect_allow_auto = Checkbutton(
        controls_frame,
        command=toggle_collect,
        var=BooleanVar(value=config.get("collect_allow_auto")))
    collect_allow_auto.grid(row=3, column=1, pady=(15, 0))

    Label(controls_frame, text="Looting Key:").grid(row=4,
                                                    column=0,
                                                    pady=(0, 15))
    collect_key_entry = Entry(controls_frame, justify=CENTER)
    collect_key_entry.grid(row=4, column=1, pady=(0, 15))
    collect_key_entry.insert(0, config.get("collect_key", "r"))
    collect_key_entry['state'] = NORMAL if config.get(
        "collect_allow_auto") else DISABLED
    collect_key_entry.bind("<KeyRelease>", del_entry_key)

    Label(controls_frame, text="Sound Notification: ").grid(row=5,
                                                            column=0,
                                                            pady=(5, 5))
    sound = Checkbutton(controls_frame,
                        var=BooleanVar(value=config.get("sound_notification")))
    sound.grid(row=5, column=1)

    Label(controls_frame, text="Human-Like Delay: ").grid(row=6,
                                                          column=0,
                                                          pady=(5, 5))
    jitter = Checkbutton(controls_frame,
                         var=BooleanVar(value=config.get("jitter")))
    jitter.grid(row=6, column=1)

    controls_frame.pack(padx=(5, 5), pady=(5, 5))
    top.start()
Ejemplo n.º 24
0
 def mode_command():
     config.set("full_auto_mode", mode_var.get())
     edit_cb['state'] = "normal" if config.get(
         "full_auto_mode", 0) == FullAutoMode.Recorder.value else "disable"
Ejemplo n.º 25
0
 def toggle_collect():
     gui.config.set("collect_allow_auto",
                    collect_allow_auto.instate(['selected']), False)
     collect_key_entry['state'] = NORMAL if config.get(
         "collect_allow_auto") else DISABLED
Ejemplo n.º 26
0
def start_fullfisher_config(gui: 'GUI'):
    top = PopUp(helper.empty_function,
                gui._root,
                background=gui._root["background"])
    controls_frame = ttk.Frame(top)
    top.title("Config")

    def file_name():
        file = config.get("full_auto_rec_file", None)
        if file is None:
            return "Not Selected"
        return os.path.basename(file)

    def select_file():
        file = askopenfilename(filetypes=[('Python Files', '*.fishy')])
        if not file:
            logging.error("file not selected")
        else:
            config.set("full_auto_rec_file", file)
            logging.info(f"loaded {file}")

        file_name_label.set(file_name())

    def start_calibrate():
        top.quit_top()
        config.set("calibrate", True)
        gui.engine.toggle_fullfisher()

    def mode_command():
        config.set("full_auto_mode", mode_var.get())
        edit_cb['state'] = "normal" if config.get(
            "full_auto_mode", 0) == FullAutoMode.Recorder.value else "disable"

    # todo repetitive code fix
    file_name_label = tk.StringVar(value=file_name())
    mode_var = tk.IntVar(value=config.get("full_auto_mode", 0))
    edit_var = tk.IntVar(value=config.get("edit_recorder_mode", 0))
    tabout_var = tk.IntVar(value=config.get("tabout_stop", 1))
    look_for_hole = tk.IntVar(value=config.get("look_for_hole", 1))
    row = 0

    ttk.Label(controls_frame, text="Calibration: ").grid(row=row,
                                                         column=0,
                                                         pady=(5, 0))
    ttk.Button(controls_frame, text="RUN",
               command=start_calibrate).grid(row=row, column=1)

    row += 1

    ttk.Label(controls_frame, text="Mode: ").grid(row=row, column=0, rowspan=2)
    ttk.Radiobutton(controls_frame,
                    text="Player",
                    variable=mode_var,
                    value=FullAutoMode.Player.value,
                    command=mode_command).grid(row=row,
                                               column=1,
                                               sticky="w",
                                               pady=(5, 0))
    row += 1
    ttk.Radiobutton(controls_frame,
                    text="Recorder",
                    variable=mode_var,
                    value=FullAutoMode.Recorder.value,
                    command=mode_command).grid(row=2, column=1, sticky="w")

    row += 1

    ttk.Label(controls_frame, text="Edit Mode: ").grid(row=row, column=0)
    edit_state = tk.NORMAL if config.get(
        "full_auto_mode", 0) == FullAutoMode.Recorder.value else tk.DISABLED
    edit_cb = ttk.Checkbutton(
        controls_frame,
        variable=edit_var,
        state=edit_state,
        command=lambda: config.set("edit_recorder_mode", edit_var.get()))
    edit_cb.grid(row=row, column=1, pady=(5, 0))

    row += 1

    ttk.Label(controls_frame, text="Tabout Stop: ").grid(row=row, column=0)
    ttk.Checkbutton(
        controls_frame,
        variable=tabout_var,
        command=lambda: config.set("tabout_stop", tabout_var.get())).grid(
            row=row, column=1, pady=(5, 0))

    row += 1

    ttk.Label(controls_frame, text="Look for hole: ").grid(row=row, column=0)
    ttk.Checkbutton(
        controls_frame,
        variable=look_for_hole,
        command=lambda: config.set("look_for_hole", look_for_hole.get())).grid(
            row=row, column=1, pady=(5, 0))

    row += 1

    ttk.Label(controls_frame, text="Fishy file: ").grid(row=row,
                                                        column=0,
                                                        rowspan=2)
    ttk.Button(controls_frame, text="Select",
               command=select_file).grid(row=row, column=1, pady=(5, 0))
    row += 1
    ttk.Label(controls_frame, textvariable=file_name_label).grid(row=row,
                                                                 column=1,
                                                                 columnspan=2)

    row += 1

    ttk.Label(controls_frame,
              text="Use semi-fisher config for rest").grid(row=row,
                                                           column=0,
                                                           columnspan=2,
                                                           pady=(20, 0))

    controls_frame.pack(padx=(5, 5), pady=(5, 10))
    controls_frame.update()

    top.start()