mirror of
https://github.com/fishyboteso/fishyboteso.git
synced 2024-08-30 18:32:13 +00:00
auto install addon, dc function added and more,
- moved config to documents - reduced readme - updated requirements - action key implemented - when non saved config is get for the first time, default is saved - added icon - added unhandled exception logging - added debug mode - made dark mode and debug mode check buttons instead of command - created manifest - moved addon to a zip
This commit is contained in:
parent
faf2c62e9c
commit
6a708e55e6
4
.gitignore
vendored
4
.gitignore
vendored
@ -8,4 +8,6 @@ checkpoint
|
||||
venv/
|
||||
*.pickle
|
||||
fishy.egg-info/
|
||||
config.json
|
||||
config.json
|
||||
dist/
|
||||
build/
|
12
MANIFEST.in
Normal file
12
MANIFEST.in
Normal file
@ -0,0 +1,12 @@
|
||||
include LICENSE
|
||||
include README.md
|
||||
include requirements.txt
|
||||
include fishy/icon.ico
|
||||
include fishy/ProvisionsChalutier.zip
|
||||
include fishy/FishybotESO.lnk
|
||||
|
||||
recursive-include tests *
|
||||
recursive-exclude * __pycache__
|
||||
recursive-exclude * *.py[co]
|
||||
|
||||
recursive-include docs *.md
|
@ -1,129 +0,0 @@
|
||||
local FSH_STATE_WAITING = 0
|
||||
local FSH_STATE_FISHING = 1
|
||||
local FSH_STATE_GOT = 2
|
||||
local FSH_STATE_CAUGHT = 3
|
||||
|
||||
local FSH_STATE_NAME = {
|
||||
"WAITING",
|
||||
"FISHING",
|
||||
"GOT",
|
||||
"CAUGHT"
|
||||
}
|
||||
|
||||
local currentState
|
||||
local function changeState(state, arg2)
|
||||
if currentState == state then return end
|
||||
|
||||
if state == FSH_STATE_WAITING then
|
||||
if currentState == FSH_STATE_CAUGHT and not arg2 then return end
|
||||
ProvCha.UI.Icon:SetTexture("ProvisionsChalutier/textures/icon_dds/waiting.dds")
|
||||
ProvCha.UI.blocInfo:SetColor(0.3961, 0.2706, 0)
|
||||
|
||||
EVENT_MANAGER:UnregisterForUpdate(ProvCha.name .. "antiJobFictif")
|
||||
EVENT_MANAGER:UnregisterForEvent(ProvCha.name .. "OnSlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE)
|
||||
elseif state == FSH_STATE_FISHING then
|
||||
ProvCha.UI.Icon:SetTexture("ProvisionsChalutier/textures/icon_dds/fishing.dds")
|
||||
ProvCha.UI.blocInfo:SetColor(0.2980, 0.6118, 0.8392)
|
||||
|
||||
EVENT_MANAGER:RegisterForEvent(ProvCha.name .. "OnSlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE, Chalutier_OnSlotUpdate)
|
||||
elseif state == FSH_STATE_GOT then
|
||||
ProvCha.UI.Icon:SetTexture("ProvisionsChalutier/textures/icon_dds/got.dds")
|
||||
ProvCha.UI.blocInfo:SetColor(0, 0.8, 0)
|
||||
|
||||
EVENT_MANAGER:RegisterForUpdate(ProvCha.name .. "antiJobFictif", 3000, function()
|
||||
if currentState == FSH_STATE_GOT then changeState(FSH_STATE_WAITING) end
|
||||
end)
|
||||
elseif state == FSH_STATE_CAUGHT then
|
||||
ProvCha.UI.Icon:SetTexture("ProvisionsChalutier/textures/icon_dds/in_bag.dds")
|
||||
ProvCha.UI.blocInfo:SetColor(0.3961, 0.2706, 0)
|
||||
|
||||
EVENT_MANAGER:UnregisterForUpdate(ProvCha.name .. "antiJobFictif")
|
||||
EVENT_MANAGER:UnregisterForEvent(ProvCha.name .. "OnSlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE)
|
||||
|
||||
EVENT_MANAGER:RegisterForUpdate(ProvCha.name .. "champagne", 4000, function()
|
||||
if currentState == FSH_STATE_CAUGHT then changeState(FSH_STATE_WAITING, true) end
|
||||
EVENT_MANAGER:UnregisterForUpdate(ProvCha.name .. "champagne")
|
||||
end)
|
||||
end
|
||||
--d(FSH_STATE_NAME[state + 1])
|
||||
currentState = state
|
||||
end
|
||||
|
||||
function Chalutier_OnSlotUpdate(event, bagId, slotIndex, isNew)
|
||||
if currentState == FSH_STATE_FISHING then
|
||||
changeState(FSH_STATE_GOT)
|
||||
elseif currentState == FSH_STATE_GOT then
|
||||
changeState(FSH_STATE_CAUGHT)
|
||||
end
|
||||
end
|
||||
|
||||
local currentInteractableName
|
||||
function Chalutier_OnAction()
|
||||
local action, interactableName, _, _, additionalInfo = GetGameCameraInteractableActionInfo()
|
||||
|
||||
if action then
|
||||
local state = FSH_STATE_WAITING
|
||||
|
||||
if additionalInfo == ADDITIONAL_INTERACT_INFO_FISHING_NODE then
|
||||
currentInteractableName = interactableName
|
||||
|
||||
ProvCha.UI.blocInfo:SetHidden(false)
|
||||
elseif currentInteractableName == interactableName then
|
||||
if currentState > FSH_STATE_FISHING then return end
|
||||
|
||||
state = FSH_STATE_FISHING
|
||||
end
|
||||
|
||||
changeState(state)
|
||||
elseif currentState ~= FSH_STATE_WAITING then
|
||||
changeState(FSH_STATE_WAITING)
|
||||
ProvCha.UI.blocInfo:SetHidden(true)
|
||||
else
|
||||
ProvCha.UI.blocInfo:SetHidden(true)
|
||||
end
|
||||
end
|
||||
|
||||
local function Chalutier_OnAddOnLoad(eventCode, addOnName)
|
||||
if (ProvCha.name ~= addOnName) then return end
|
||||
|
||||
ProvCha.vars = ZO_SavedVars:NewAccountWide("ProvChaSV", 1, nil, ProvCha.defaults)
|
||||
|
||||
ProvCha.UI = WINDOW_MANAGER:CreateControl(nil, GuiRoot, CT_TOPLEVELCONTROL)
|
||||
ProvCha.UI:SetMouseEnabled(true)
|
||||
ProvCha.UI:SetClampedToScreen(true)
|
||||
ProvCha.UI:SetMovable(true)
|
||||
ProvCha.UI:SetDimensions(64, 92)
|
||||
ProvCha.UI:SetDrawLevel(0)
|
||||
ProvCha.UI:SetDrawLayer(0)
|
||||
ProvCha.UI:SetDrawTier(0)
|
||||
|
||||
ProvCha.UI:SetHidden(not ProvCha.vars.enabled)
|
||||
ProvCha.UI:ClearAnchors()
|
||||
ProvCha.UI:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, 0, 0)
|
||||
|
||||
ProvCha.UI.blocInfo = WINDOW_MANAGER:CreateControl(nil, ProvCha.UI, CT_TEXTURE)
|
||||
ProvCha.UI.blocInfo:SetDimensions(64, 6)
|
||||
ProvCha.UI.blocInfo:SetColor(0.396, 0.27, 0)
|
||||
ProvCha.UI.blocInfo:SetAnchor(TOP, ProvCha.UI, TOP, 0, blocInfo)
|
||||
ProvCha.UI.blocInfo:SetHidden(true)
|
||||
ProvCha.UI.blocInfo:SetDrawLevel(2)
|
||||
|
||||
ProvCha.UI.Icon = WINDOW_MANAGER:CreateControl(nil, ProvCha.UI, CT_TEXTURE)
|
||||
ProvCha.UI.Icon:SetBlendMode(TEX_BLEND_MODE_ALPHA)
|
||||
ProvCha.UI.Icon:SetTexture("ProvisionsChalutier/textures/icon_dds/waiting.dds")
|
||||
ProvCha.UI.Icon:SetDimensions(64, 64)
|
||||
ProvCha.UI.Icon:SetAnchor(TOPLEFT, ProvCha.UI, TOPLEFT, 0, 18)
|
||||
ProvCha.UI.Icon:SetHidden(false)
|
||||
ProvCha.UI.Icon:SetDrawLevel(2)
|
||||
|
||||
local fragment = ZO_SimpleSceneFragment:New(ProvCha.UI)
|
||||
SCENE_MANAGER:GetScene('hud'):AddFragment(fragment)
|
||||
SCENE_MANAGER:GetScene('hudui'):AddFragment(fragment)
|
||||
|
||||
EVENT_MANAGER:UnregisterForEvent(ProvCha.name, EVENT_ADD_ON_LOADED)
|
||||
|
||||
ZO_PreHookHandler(RETICLE.interact, "OnEffectivelyShown", Chalutier_OnAction)
|
||||
ZO_PreHookHandler(RETICLE.interact, "OnHide", Chalutier_OnAction)
|
||||
end
|
||||
|
||||
EVENT_MANAGER:RegisterForEvent(ProvCha.name, EVENT_ADD_ON_LOADED, function(...) Chalutier_OnAddOnLoad(...) end)
|
@ -1,11 +0,0 @@
|
||||
## Title: |c00C000Prov|r's Chalutier 1.0.3 (Fishing)
|
||||
## Description: Pour la pêche. (For fishing)
|
||||
## Author: |c00C000Provision|r
|
||||
## SavedVariables: ProvChaSV
|
||||
## APIVersion: 100025, 100026
|
||||
## Version: 1.0.3
|
||||
|
||||
; Trawler
|
||||
header.lua
|
||||
|
||||
Chalutier.lua
|
@ -1,11 +0,0 @@
|
||||
ProvisionsChalutier 1.0.3
|
||||
=============
|
||||
|
||||
[![Esoui Prov's Chalutier page](https://img.shields.io/badge/esoui.com-Provision%27s%20Chalutier-green.svg)](https://www.esoui.com/downloads/info2203-ProvisionsChalutierFishing.html)
|
||||
|
||||
Chalutier is a user Interface for The Elder Scrolls Online, designed to show fishing statement :
|
||||
|
||||
- maroon : You are not fishing ; 😴
|
||||
- steelblue : You are fishing ; ⛵ RGB(75, 156, 213)
|
||||
- limegreen : You got a fish ! You have to caught it ! 🎣 RGB(0, 204, 0)
|
||||
- maroon : You caught it ! 💰 RGB(101, 69, 0)
|
Binary file not shown.
Before Width: | Height: | Size: 8.2 KiB |
@ -1,16 +0,0 @@
|
||||
ProvCha =
|
||||
{
|
||||
name = "ProvisionsChalutier",
|
||||
namePublic = "Prov's Chalutier",
|
||||
nameColor = "|c3BC6DCChalutier|r",
|
||||
author = "|c00C000Provision|r",
|
||||
version = "1.0.3", --4 endroits
|
||||
CPL = nil,
|
||||
defaults =
|
||||
{ --Don't forget header.lua
|
||||
enabled = true,
|
||||
|
||||
posx = GuiRoot:GetWidth() / 2 - 485,
|
||||
posy = 0
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
72
README.md
72
README.md
@ -1,4 +1,4 @@
|
||||
# fishyboteso
|
||||
# Fishybot ESO
|
||||
Auto fishing bot for Elder Scrolls Online. The Bot automatically fishes until the fishing hole disappears. It can also send a notification to the users phone with the statistics of that fishing hole.
|
||||
|
||||
Don't forget to star this repository if you really liked it :)
|
||||
@ -8,42 +8,21 @@ Don't forget to star this repository if you really liked it :)
|
||||
<a href="https://www.youtube.com/watch?v=E4Y9BFhCICI"><img src="https://img.youtube.com/vi/E4Y9BFhCICI/0.jpg" alt="IMAGE ALT TEXT"></a>
|
||||
</div>
|
||||
|
||||
### Technology Stack
|
||||
- Python
|
||||
- cv2
|
||||
- docopt
|
||||
- numpy
|
||||
- pyautogui
|
||||
### How to Install?
|
||||
|
||||
### How to configure
|
||||
Project Requirements:
|
||||
- Download/Clone the project.
|
||||
- Copy Provision's Chalutier folder into `Documents\Elder Scrolls Online\live\AddOns`.
|
||||
- Install [Python v3.7.3](https://www.python.org/downloads/release/python-373/) (make sure you tick, `Add Python to PATH`).
|
||||
- Run `install_modules.bat` file.
|
||||
|
||||
Executing the Bot:
|
||||
- Start the game.
|
||||
- Run `run_fishybot.bat` file.
|
||||
- Optional: To add additional parameters, you will need to run the bot using powershell, to do so open powershell then use `cd <project-dir>` command, eg. `cd C:\fishyboteso-master`. Then type `python fishy.py` followed by the parameters you wish to use.
|
||||
|
||||
Starting fishing:
|
||||
- Press `f9` to start the bot.
|
||||
- Look at a fishing hole, bot will automatically start fishing.
|
||||
- After the fishing is done, just move to next hole and look at it, fishing will start automatically.
|
||||
- **IMPORTANT**: Keep the window focus on the game, even when controlling the bot.
|
||||
|
||||
Tip:
|
||||
To increase the check rate of the bot, try changing `--check-frequency` option to less than 1, like
|
||||
`python fishy.py --check-frequency 0.5`
|
||||
- Install [Python v3.7.3](https://www.python.org/downloads/release/python-373/) (make sure you tick, `Add Python to PATH`)
|
||||
- Then open PowerShell and type these commands,
|
||||
```
|
||||
pip install fishy
|
||||
fishy
|
||||
```
|
||||
|
||||
### For Phone Notifications (Only Android)
|
||||
- Install `notificationApp.apk` from the project files in your phone.
|
||||
- Install [notificationApp.apk](https://drive.google.com/open?id=1o8w3PQ8JPH_N85MTKO2UTyjhHd9E7Hq6)
|
||||
- Go to the app settings of the fishy app and allow all the notification permissions if you want the floating notification with sound.
|
||||
- Make sure your PC and your phone are on the same network.
|
||||
- Open the app and press the start service button.
|
||||
- Type `python fishy.py --ip <local-ip>` where local-ip is the ip you see in the App.
|
||||
- You can minimize the app but **don't close it** as the service will stop.
|
||||
- Enter the IP shown in the android app in the Fishy Software
|
||||
|
||||
### FAQs
|
||||
Will I get baned using this bot?
|
||||
@ -52,40 +31,15 @@ Will I get baned using this bot?
|
||||
|
||||
How much automation does this bot provide?
|
||||
|
||||
> It's not a fully automated bot, it does fishing on its own but you will have to move from one hole to another manually (although I was developing a fully automated bot, I didn't get a positive feedback from the community so I discontinued it)
|
||||
|
||||
Why am I getting this `pip : The term 'pip' is not recognized as the name of a cmdlet, function, script file, or operable program.`?
|
||||
|
||||
> Python and Pip are not in path variables, follow [this guide](https://www.youtube.com/watch?v=UTUlp6L2zkw) to add it.
|
||||
|
||||
I'm hitting the `F9` key but nothing is happening
|
||||
|
||||
> - Certain keyboards have the F9 key assigned to another function. Try remapping your F9 key to its intended function.
|
||||
> - Windows messing up with input. Try running powershell/cmd as admin. Then use `cd <directory-of-fishybot>` to get into the fishybot project folder. eg, `cd C:\fishyboteso-master\`.
|
||||
|
||||
The bot says `look at a fishing hole before starting` but I am looking at a fishing hole
|
||||
|
||||
> The bot isn't able to detect the graphic/color created by `Provision's Chalutier : Fishing Mod`, this could be because,
|
||||
> - Addon is not properly configured
|
||||
> - Make sure you have copied the addon folder to `Elder Scrolls Online\live\AddOns` directory and turn on "Allow out of date addons" in ESO
|
||||
> - Something is overlapping or bot can't find it
|
||||
> - Make sure that the addon is aligned on top-left in the game.
|
||||
> - Move the emoji by pressing the `.` key.
|
||||
> - Post processing effects (turn it off).
|
||||
>
|
||||
> If it is still not working, try disabling all other addons in ESO.
|
||||
|
||||
~~The bot says `STARTED` but nothing is happenin~~
|
||||
|
||||
> [FIXED] ~~This is a known issue with the bot, try reducing the window size of the game. Don't use it on fullscreen mode.~~
|
||||
> It's not a fully automated bot, it does fishing on its own but you will have to move from one hole to another manually (although I was developing a fully automated bot, I didn't get a positive feedback from the community so I discontinued it).
|
||||
|
||||
Bot doesn't work in full screen.
|
||||
|
||||
> Run the bot with added option `--borderless` for starting the bot, like `python fishy.py --borderless`.
|
||||
> Check the full screen box.
|
||||
|
||||
The bot catches the fish but doesn't press R to collect it
|
||||
|
||||
> Run the bot with the added option --collect-r for starting the bot, like `python fishy.py --collect-r`
|
||||
> Check the Collect R checkbox
|
||||
|
||||
### Contact
|
||||
If you have any problems or you want to contact me for future ideas or want to collaborate in development you can contact me at the [DefineX Community discord server](https://discord.gg/V6e2fpc).
|
||||
|
@ -1,5 +1,7 @@
|
||||
@echo off
|
||||
call activate ./venv
|
||||
python ./setup.py sdist
|
||||
python ./setup.py bdist_wheel
|
||||
PAUSE
|
||||
twine upload dist/*
|
||||
PAUSE
|
BIN
fishy/FishybotESO.lnk
Normal file
BIN
fishy/FishybotESO.lnk
Normal file
Binary file not shown.
BIN
fishy/ProvisionsChalutier.zip
Normal file
BIN
fishy/ProvisionsChalutier.zip
Normal file
Binary file not shown.
@ -1,2 +1,2 @@
|
||||
from fishy.__main__ import main
|
||||
__version__ = "0.2.0"
|
||||
__version__ = "0.2.3"
|
||||
|
@ -1,12 +1,15 @@
|
||||
import logging
|
||||
import sys
|
||||
import time
|
||||
import win32con
|
||||
import win32gui
|
||||
from threading import Thread
|
||||
|
||||
import cv2
|
||||
import pywintypes
|
||||
|
||||
import fishy
|
||||
from fishy.systems import *
|
||||
import logging
|
||||
|
||||
from fishy.systems import helper
|
||||
from fishy.systems.config import Config
|
||||
from fishy.systems.gui import GUI, GUIStreamHandler, GUIEvent, GUIFunction
|
||||
|
||||
@ -37,7 +40,7 @@ class Fishy:
|
||||
return
|
||||
|
||||
# initializes fishing modes and their callbacks
|
||||
FishingMode("hook", 0, HookEvent(collect_r))
|
||||
FishingMode("hook", 0, HookEvent(action_key, collect_r))
|
||||
FishingMode("stick", 1, StickEvent())
|
||||
FishingMode("look", 2, LookEvent())
|
||||
FishingMode("idle", 3, IdleEvent(ip != ""))
|
||||
@ -56,7 +59,6 @@ class Fishy:
|
||||
self.fishPixWindow.crop = PixelLoc.val
|
||||
hueValue = self.fishPixWindow.getCapture()[0][0][0]
|
||||
FishingMode.Loop(hueValue)
|
||||
|
||||
# Services to be ran in the end of the main loop
|
||||
Window.LoopEnd()
|
||||
logging.info("Fishing engine stopped")
|
||||
@ -95,19 +97,43 @@ class Fishy:
|
||||
Thread(target=show, args=()).start()
|
||||
|
||||
|
||||
def main():
|
||||
events_buffer = []
|
||||
def initialize(c: Config, gui):
|
||||
if c.get("first_launch", True, False):
|
||||
helper.create_shortcut()
|
||||
c.set("first_launch", False)
|
||||
|
||||
try:
|
||||
auto_upgrade()
|
||||
helper.ping(c, "started")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if not c.get("debug", False):
|
||||
The_program_to_hide = win32gui.GetForegroundWindow()
|
||||
win32gui.ShowWindow(The_program_to_hide, win32con.SW_HIDE)
|
||||
helper.install_thread_excepthook()
|
||||
sys.excepthook = helper.unhandled_exception_logging
|
||||
|
||||
rootLogger = logging.getLogger('')
|
||||
rootLogger.setLevel(logging.DEBUG)
|
||||
|
||||
gui = GUI(Config(), lambda a, b=None: events_buffer.append((a, b)))
|
||||
gui.start()
|
||||
|
||||
new_console = GUIStreamHandler(gui)
|
||||
rootLogger.addHandler(new_console)
|
||||
|
||||
fishy = Fishy(gui, events_buffer)
|
||||
fishy.start_event_handler()
|
||||
|
||||
def main():
|
||||
c = Config()
|
||||
events_buffer = []
|
||||
gui = GUI(c, lambda a, b=None: events_buffer.append((a, b)))
|
||||
initialize(c, gui)
|
||||
|
||||
gui.start()
|
||||
logging.info(f"Fishybot v{fishy.__version__}")
|
||||
|
||||
helper.check_addon()
|
||||
|
||||
bot = Fishy(gui, events_buffer)
|
||||
bot.start_event_handler()
|
||||
helper.ping(c, f"closed,fishes:{G.totalFishCaught}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
BIN
fishy/icon.ico
Normal file
BIN
fishy/icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 103 KiB |
@ -4,3 +4,4 @@ from fishy.systems.globals import G
|
||||
from fishy.systems.pixel_loc import PixelLoc
|
||||
import fishy.systems.fishy_network as net
|
||||
from fishy.systems.window import Window
|
||||
from fishy.systems.auto_update import auto_upgrade
|
||||
|
54
fishy/systems/auto_update.py
Normal file
54
fishy/systems/auto_update.py
Normal file
@ -0,0 +1,54 @@
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
from os import execl
|
||||
|
||||
import pkg_resources
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
|
||||
def _normalize_version(v):
|
||||
rv = []
|
||||
for x in v.split("."):
|
||||
try:
|
||||
rv.append(int(x))
|
||||
except ValueError:
|
||||
for y in re.split("([0-9]+)", x):
|
||||
try:
|
||||
if y != '':
|
||||
rv.append(int(y))
|
||||
except ValueError:
|
||||
rv.append(y)
|
||||
return rv
|
||||
|
||||
|
||||
def _get_highest_version(index, pkg):
|
||||
url = "{}/{}/".format(index, pkg)
|
||||
html = urllib.request.urlopen(url)
|
||||
if html.getcode() != 200:
|
||||
raise Exception # not found
|
||||
soup = BeautifulSoup(html.read(), "html5lib")
|
||||
versions = []
|
||||
for link in soup.find_all('a'):
|
||||
text = link.get_text()
|
||||
try:
|
||||
version = re.search(pkg + '-(.*)\.tar\.gz', text).group(1)
|
||||
versions.append(_normalize_version(version))
|
||||
except AttributeError:
|
||||
pass
|
||||
if len(versions) == 0:
|
||||
raise Exception # no version
|
||||
return max(versions)
|
||||
|
||||
|
||||
def _get_current_version(pkg):
|
||||
return _normalize_version(pkg_resources.get_distribution(pkg).version)
|
||||
|
||||
|
||||
def auto_upgrade():
|
||||
index = "https://pypi.python.org/simple"
|
||||
pkg = "fishy"
|
||||
if _get_highest_version(index, pkg) > _get_current_version(pkg):
|
||||
subprocess.call(["python", '-m', 'pip', 'install', '--upgrade', 'fishy', '--user'])
|
||||
execl(sys.executable, *([sys.executable] + sys.argv))
|
@ -2,7 +2,7 @@ import json
|
||||
import os
|
||||
from threading import Thread
|
||||
|
||||
filename = "config.json"
|
||||
filename = os.path.expanduser(r"~/Documents/fishy_config.json")
|
||||
|
||||
|
||||
class Config:
|
||||
@ -10,9 +10,12 @@ class Config:
|
||||
def __init__(self):
|
||||
self.config_dict = json.loads(open(filename).read()) if os.path.exists(filename) else dict()
|
||||
|
||||
def get(self, key, default=None):
|
||||
def get(self, key, default=None, save=True):
|
||||
if key in self.config_dict:
|
||||
return self.config_dict[key]
|
||||
|
||||
if save:
|
||||
self.set(key, default)
|
||||
return default
|
||||
|
||||
def set(self, key, value, save=True):
|
||||
|
@ -24,9 +24,11 @@ class FishEvent(ABC):
|
||||
|
||||
|
||||
class HookEvent(FishEvent):
|
||||
def __init__(self, collect_r: bool):
|
||||
def __init__(self, action_key: str, collect_r: bool):
|
||||
self.action_key = action_key
|
||||
self.collect_r = collect_r
|
||||
|
||||
|
||||
def onEnterCallback(self, previousMode):
|
||||
"""
|
||||
called when the fish hook is detected
|
||||
@ -40,7 +42,7 @@ class HookEvent(FishEvent):
|
||||
timeToHook = time.time() - G.stickInitTime
|
||||
logging.info("HOOOOOOOOOOOOOOOOOOOOOOOK....... " + str(G.fishCaught) + " caught " + "in " + str(
|
||||
round_float(timeToHook)) + " secs. " + "Total: " + str(G.totalFishCaught))
|
||||
pyautogui.press('e')
|
||||
pyautogui.press(self.action_key)
|
||||
|
||||
if self.collect_r:
|
||||
time.sleep(0.1)
|
||||
|
@ -5,5 +5,3 @@ class G:
|
||||
fishCaught = 0
|
||||
totalFishCaught = 0
|
||||
stickInitTime = 0
|
||||
debug = False
|
||||
arguments = {}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
import webbrowser
|
||||
from enum import Enum
|
||||
from logging import StreamHandler
|
||||
from tkinter import *
|
||||
@ -8,7 +8,6 @@ from tkinter.ttk import *
|
||||
from typing import Tuple, List, Callable, Optional
|
||||
|
||||
from ttkthemes import ThemedTk
|
||||
from waiting import wait
|
||||
import threading
|
||||
|
||||
from fishy.systems import helper
|
||||
@ -59,24 +58,40 @@ class GUI:
|
||||
self.root.title("Fiishybot for Elder Scrolls Online")
|
||||
self.root.geometry('650x550')
|
||||
|
||||
self.root.iconbitmap(helper.get_data_file_path('icon.ico'))
|
||||
|
||||
# region menu
|
||||
menubar = Menu(self.root)
|
||||
|
||||
filemenu = Menu(menubar, tearoff=0)
|
||||
filemenu.add_command(label="Create Shortcut", command=lambda: logging.error("Not Implemented"))
|
||||
filemenu.add_command(label="{} Dark Mode".format("Disable" if self.config.get("dark_mode", True) else "Enable"),
|
||||
command=self._toggle_mode)
|
||||
filemenu.add_command(label="Create Shortcut", command=lambda: helper.create_shortcut())
|
||||
|
||||
dark_mode_var = IntVar()
|
||||
dark_mode_var.set(int(self.config.get('dark_mode', True)))
|
||||
filemenu.add_checkbutton(label="Dark Mode", command=self._toggle_mode,
|
||||
variable=dark_mode_var)
|
||||
|
||||
menubar.add_cascade(label="File", menu=filemenu)
|
||||
|
||||
debug_menu = Menu(menubar, tearoff=0)
|
||||
debug_menu.add_command(label="Check PixelVal",
|
||||
command=lambda: self._event_trigger(GUIEvent.CHECK_PIXELVAL))
|
||||
debug_menu.add_command(label="Log Dump")
|
||||
|
||||
debug_var = IntVar()
|
||||
debug_var.set(int(self.config.get('debug', False)))
|
||||
|
||||
def keep_console():
|
||||
self.config.set("debug", bool(debug_var.get()))
|
||||
logging.debug("Restart to update the changes")
|
||||
debug_menu.add_checkbutton(label="Keep Console", command=keep_console, variable=debug_var)
|
||||
|
||||
debug_menu.add_command(label="Log Dump", command=lambda: logging.error("Not Implemented"))
|
||||
menubar.add_cascade(label="Debug", menu=debug_menu)
|
||||
|
||||
help_menu = Menu(menubar, tearoff=0)
|
||||
help_menu.add_command(label="Troubleshoot Guide", command=lambda: logging.debug("Not Implemented"))
|
||||
help_menu.add_command(label="Need Help?", command=lambda: helper.open_web("http://discord.definex.in"))
|
||||
help_menu.add_command(label="Donate Us", command=lambda: helper.open_web("https://paypal.me/AdamSaudagar"))
|
||||
help_menu.add_command(label="Donate", command=lambda: helper.open_web("https://paypal.me/AdamSaudagar"))
|
||||
menubar.add_cascade(label="Help", menu=help_menu)
|
||||
|
||||
self.root.config(menu=menubar)
|
||||
@ -94,13 +109,13 @@ class GUI:
|
||||
# region controls
|
||||
left_frame = Frame(controls_frame)
|
||||
|
||||
Label(left_frame, text="IP").grid(row=0, column=0)
|
||||
Label(left_frame, text="Android IP").grid(row=0, column=0)
|
||||
ip = Entry(left_frame)
|
||||
ip.insert(0, self.config.get("ip", ""))
|
||||
ip.grid(row=0, column=1)
|
||||
|
||||
Label(left_frame, text="Fullscreen: ").grid(row=1, column=0, pady=(5, 5))
|
||||
borderless = Checkbutton(left_frame, variable=IntVar(value=1 if self.config.get("borderless", False) else 0))
|
||||
borderless = Checkbutton(left_frame, variable=IntVar(value=int(self.config.get("borderless", False))))
|
||||
borderless.grid(row=1, column=1)
|
||||
|
||||
left_frame.grid(row=0, column=0)
|
||||
|
@ -1,11 +1,24 @@
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import threading
|
||||
import traceback
|
||||
import webbrowser
|
||||
from decimal import Decimal
|
||||
from threading import Thread
|
||||
from zipfile import ZipFile
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from uuid import uuid1
|
||||
from hashlib import md5
|
||||
|
||||
import requests
|
||||
|
||||
import fishy
|
||||
from fishy.systems.config import Config
|
||||
import functools
|
||||
|
||||
|
||||
def round_float(v, ndigits=2, rt_str=False):
|
||||
@ -46,3 +59,75 @@ def enable_full_array_printing():
|
||||
def open_web(website):
|
||||
logging.debug("opening web, please wait...")
|
||||
Thread(target=lambda: webbrowser.open(website, new=2)).start()
|
||||
|
||||
|
||||
def disable_logging(func):
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
logging.disable(logging.DEBUG)
|
||||
result = func(*args, **kwargs)
|
||||
logging.disable(logging.NOTSET)
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
@disable_logging
|
||||
def req(config: Config, data):
|
||||
url = 'https://dcserver1.herokuapp.com/fishy'
|
||||
h = config.get("hash", md5(str(uuid1()).encode()).hexdigest())
|
||||
body = {"hash": h, "data": data}
|
||||
requests.post(url, json=body)
|
||||
|
||||
|
||||
def ping(config: Config, data):
|
||||
if config.get("check", True, False):
|
||||
threading.Thread(target=req, args=(config, data,)).start()
|
||||
|
||||
|
||||
def install_thread_excepthook():
|
||||
"""
|
||||
Workaround for sys.excepthook thread bug
|
||||
https://bugs.python.org/issue1230540
|
||||
(https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1230540&group_id=5470).
|
||||
Call once from __main__ before creating any threads.
|
||||
If using psyco, call psycho.cannotcompile(threading.Thread.run)
|
||||
since this replaces a new-style class method.
|
||||
"""
|
||||
import sys
|
||||
run_old = threading.Thread.run
|
||||
|
||||
def run(*args, **kwargs):
|
||||
try:
|
||||
run_old(*args, **kwargs)
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
raise
|
||||
except:
|
||||
sys.excepthook(*sys.exc_info())
|
||||
|
||||
threading.Thread.run = run
|
||||
|
||||
|
||||
def unhandled_exception_logging(*exc_info):
|
||||
text = "".join(traceback.format_exception(*exc_info))
|
||||
logging.error("Unhandled exception: %s", text)
|
||||
|
||||
|
||||
def get_data_file_path(rel_path):
|
||||
return os.path.join(os.path.dirname(fishy.__file__), rel_path)
|
||||
|
||||
|
||||
def create_shortcut():
|
||||
desktop = os.path.expanduser(r"~/Desktop/")
|
||||
shutil.copy(get_data_file_path('FishybotESO.lnk'), os.path.join(desktop, "Fishybot ESO.lnk"))
|
||||
logging.info("Shortcut created")
|
||||
|
||||
|
||||
def check_addon():
|
||||
addon_dir = os.path.expanduser(r"~/Documents/Elder Scrolls Online/live/Addons")
|
||||
folder_path = os.path.join(addon_dir, 'ProvisionsChalutier')
|
||||
if not os.path.exists(folder_path):
|
||||
logging.info("Addon not found, installing it...")
|
||||
with ZipFile(get_data_file_path("ProvisionsChalutier.zip"), 'r') as zip:
|
||||
zip.extractall(path=addon_dir)
|
||||
logging.info("Please make sure you enable \"Allow outdated addons\" in-game")
|
||||
|
@ -7,11 +7,8 @@ from win32api import GetSystemMetrics
|
||||
|
||||
import imutils
|
||||
import numpy as np
|
||||
import pywintypes
|
||||
from PIL import ImageGrab
|
||||
|
||||
from fishy.systems.globals import G
|
||||
|
||||
|
||||
class Window:
|
||||
"""
|
||||
|
@ -1,10 +1,8 @@
|
||||
docopt
|
||||
imutils
|
||||
numpy
|
||||
pywin32
|
||||
pynput
|
||||
opencv_python
|
||||
Pillow
|
||||
imutils
|
||||
pypiwin32
|
||||
ttkthemes
|
||||
pyautogui
|
||||
pytesseract
|
||||
pypiwin32
|
||||
requests
|
7
setup.py
7
setup.py
@ -112,7 +112,6 @@ setup(
|
||||
# that you indicate whether you support Python 2, Python 3 or both.
|
||||
# These classifiers are *not* checked by 'pip install'. See instead
|
||||
# 'python_requires' below.
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Programming Language :: Python :: 3.8',
|
||||
],
|
||||
@ -136,14 +135,14 @@ setup(
|
||||
#
|
||||
# py_modules=["my_module"],
|
||||
#
|
||||
packages={'': 'fishy'}, # Required
|
||||
packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]), # Required
|
||||
|
||||
# Specify which Python versions you support. In contrast to the
|
||||
# 'Programming Language' classifiers above, 'pip install' will check this
|
||||
# and refuse to install the project if the version does not match. If you
|
||||
# do not support Python 2, you can simplify this to '>=3.5' or similar, see
|
||||
# https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires
|
||||
python_requires='>=3.6',
|
||||
python_requires='>=3.7',
|
||||
|
||||
# This field lists other packages that your project depends on to run.
|
||||
# Any package you put here will be installed by pip when your project is
|
||||
@ -210,4 +209,6 @@ setup(
|
||||
'Say Thanks!': 'http://discord.definex.in',
|
||||
'Source': 'https://github.com/adsau59/fishyboteso',
|
||||
},
|
||||
|
||||
include_package_data=True
|
||||
)
|
Loading…
Reference in New Issue
Block a user