From 6a708e55e69d666a0d726b469afbeb8e669e82d6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-JVKHS7I\\Adam" Date: Sun, 19 Apr 2020 17:22:42 +0530 Subject: [PATCH] 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 --- .gitignore | 4 +- MANIFEST.in | 12 ++ ProvisionsChalutier/Chalutier.lua | 129 ------------------ ProvisionsChalutier/ProvisionsChalutier.txt | 11 -- ProvisionsChalutier/README.md | 11 -- ProvisionsChalutier/chalutier_low.jpg | Bin 8403 -> 0 bytes ProvisionsChalutier/header.lua | 16 --- .../textures/icon_dds/caught.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/caught_one.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/fish.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/fish_crown.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/fishing.dds | Bin 5616 -> 0 bytes ProvisionsChalutier/textures/icon_dds/got.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/in_bag.dds | Bin 5616 -> 0 bytes .../textures/icon_dds/waiting.dds | Bin 5616 -> 0 bytes README.md | 72 ++-------- build.bat | 2 + fishy/FishybotESO.lnk | Bin 0 -> 2220 bytes fishy/ProvisionsChalutier.zip | Bin 0 -> 32498 bytes fishy/__init__.py | 2 +- fishy/__main__.py | 52 +++++-- fishy/icon.ico | Bin 0 -> 105721 bytes fishy/systems/__init__.py | 1 + fishy/systems/auto_update.py | 54 ++++++++ fishy/systems/config.py | 7 +- fishy/systems/fishing_event.py | 6 +- fishy/systems/globals.py | 2 - fishy/systems/gui.py | 33 +++-- fishy/systems/helper.py | 85 ++++++++++++ fishy/systems/window.py | 3 - requirements.txt | 10 +- setup.py | 7 +- 32 files changed, 251 insertions(+), 268 deletions(-) create mode 100644 MANIFEST.in delete mode 100644 ProvisionsChalutier/Chalutier.lua delete mode 100644 ProvisionsChalutier/ProvisionsChalutier.txt delete mode 100644 ProvisionsChalutier/README.md delete mode 100644 ProvisionsChalutier/chalutier_low.jpg delete mode 100644 ProvisionsChalutier/header.lua delete mode 100644 ProvisionsChalutier/textures/icon_dds/caught.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/caught_one.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/fish.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/fish_crown.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/fishing.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/got.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/in_bag.dds delete mode 100644 ProvisionsChalutier/textures/icon_dds/waiting.dds create mode 100644 fishy/FishybotESO.lnk create mode 100644 fishy/ProvisionsChalutier.zip create mode 100644 fishy/icon.ico create mode 100644 fishy/systems/auto_update.py diff --git a/.gitignore b/.gitignore index 21d344b..97677a9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ checkpoint venv/ *.pickle fishy.egg-info/ -config.json \ No newline at end of file +config.json +dist/ +build/ \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..af97d8e --- /dev/null +++ b/MANIFEST.in @@ -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 \ No newline at end of file diff --git a/ProvisionsChalutier/Chalutier.lua b/ProvisionsChalutier/Chalutier.lua deleted file mode 100644 index f780a58..0000000 --- a/ProvisionsChalutier/Chalutier.lua +++ /dev/null @@ -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) diff --git a/ProvisionsChalutier/ProvisionsChalutier.txt b/ProvisionsChalutier/ProvisionsChalutier.txt deleted file mode 100644 index d415891..0000000 --- a/ProvisionsChalutier/ProvisionsChalutier.txt +++ /dev/null @@ -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 diff --git a/ProvisionsChalutier/README.md b/ProvisionsChalutier/README.md deleted file mode 100644 index 0544a09..0000000 --- a/ProvisionsChalutier/README.md +++ /dev/null @@ -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) diff --git a/ProvisionsChalutier/chalutier_low.jpg b/ProvisionsChalutier/chalutier_low.jpg deleted file mode 100644 index 94a220f1254da211bad7a6d4377c9a55e975408b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8403 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 diff --git a/ProvisionsChalutier/textures/icon_dds/fish_crown.dds b/ProvisionsChalutier/textures/icon_dds/fish_crown.dds deleted file mode 100644 index 628f4ba88976fcc9e76fad49b598cdb578859f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 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 diff --git a/ProvisionsChalutier/textures/icon_dds/fishing.dds b/ProvisionsChalutier/textures/icon_dds/fishing.dds deleted file mode 100644 index b3f40774753bf19bb5e9be4f1d62b115ee2e0af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 zcmdT|4^UJ09slKp|22XW1O#@J1ek2zsuBd&HtFPCv&O-ld5@e;yB9!5*pPs(^-z}( z&fR(9fVKgP2DKJWvfGetq<7|8z-?68E%Q79n}~m?I>+n)!9NK}-o7v47eXj^c-5Qx z-Ai(x_xt_c_xJh!&&$i(n!FDo6dDzQ#PG|0P!#(G_q;z#{!WIKLGa0w%YSvf-YwHW1M|EtLRi#*(s;x9Nj@61?%|s7#oWXb;N!}4ii8PGy{-=$fG=Ekf8GiXAX}CtNP{`E*eB7&TcPeh0ieAV3 zm@qN-1cV62KXXDbok_Zkalrm37B5eOzkmL;SxQv2SnI1NZK^)n)N$Znxfv62l8KuBn<)x0n9(`maE>q zdFOXA-pH&u7A?Jte`_8>Tpm6jj_<(whw~qv4_rTox0ORTA;wtL*_N%Q z$9(mbE-l?Qzkj+xga43k`1Ik$ZZ0Z7&o@NzRUX`yG?ng*(mWDj{nWAfBmaYR57uZj zSRP+BDmVJ&=Rh3D-)6B&g@YuC_nR$eUu5;MbpE;9{rQ?L);zVM(D%I6TdY$5dJ$h< zqEf&HERQm@smQOvJ)D8Yo05A~Z|nI=vY;0+FN023h&jKn9i>T<+!OQfc<0|V(>;Vz zOS4Z)VD%x&soPKg zfzPMf9MV)6bNneiEB~eICMAFKf83P8i~sJrKE*IoBFeC0H$qxDU$8vPKV=d%F!tjNJ|B}Jfi4#zjFT8`3mcy^ zSFL%%?(XiyKOdX`T8wSzY@WKhx*D&y${bP`+)ojpd+fY#{|NkF=t{C-jO8!JpAoO1 zQ810(GOPl9jE!M__v<=~Wrc->9{z|(rVRDPLcLzkI6U+-o56o*7)35{29OW^DE-@x zjt(c1j0*PZJoOdwuTLMCKQqaRLU7^pVR?Z#p%wfA_~ZE*1Nb+~e^&p2>oFcduj&MF zVeI2?@Yp|Q4twlyDmxc!mg>%>&|8w|Ji5kWnj@`c& z2F8~S=V&<$?iN#V0+dM1H}t0cA5BrT52u#Zl-pn)^T+$m7WV%OgRY|1T?5ZYM;x_4 zz9p+^;uiGlx;Ogp^YHp_if3+@sA6E?=iz$V9v0u!7vFlrY&obC_iE9?T^%oVJl(yTItUgHDSCOSeX7FkPpC_VpY5mbc`PRcg zlhf|Uf4=-5w8OlwpE0!am4%dI+YBeCai65s*Pq#mG9st;7q8&+1ikD%Pm1bGct2ot zU_LXqH+k$I9sqfLe)BR~PLafHegDZWyFv&G_>y4bttE~! zl-IKT!%Re%IuauOZGDNVaF6youAsfTmk{@SRh`Fw6yE3Q1X%tdySM(a@d)n39J)i_ zXMYpg9kM=2d3oIonh-(##q*+F-g>t2Fyyb87`;0rym6VNaUWZ+#>yaHKY&9ZI$5Z{ z@bl)uCNz_QLeS~nXi85g6%d~cH~*ZVib%uyXQqP-AYYqszF_R^{suwrc87ET_&uBf z;mjX-SbpU$Z$62K`IteHB!pQ-Y`jxYPY}Tk{}>SuL~Q=l$NdszW@ZwDI-)kKB;nF~ ze5FDmlR1b6?h8k!(y{z56#jm+r1?EFyw4%WwCE%uxhN5xSl+)?V$z|<{(2r~L_p*NVU#jU57ytkO diff --git a/ProvisionsChalutier/textures/icon_dds/got.dds b/ProvisionsChalutier/textures/icon_dds/got.dds deleted file mode 100644 index 10c560d511adeab1987e47dae8d5c48ecbdabe32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 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 NA@swW7ob1G_}{kG{TKiM diff --git a/ProvisionsChalutier/textures/icon_dds/in_bag.dds b/ProvisionsChalutier/textures/icon_dds/in_bag.dds deleted file mode 100644 index 13ac6d68c3f068a9fbf70c9b6a6a69779ee894a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5616 zcmcJT4Ny~87RPVi3rYfkDA0DQPN5B;sqs7NjRzi1Y+3F(WTO*t6X1$vWtLWVHsoaW6V z&N*p=QLAKGI^EE2fUSuz=I|FisfqaQrO6;(t(M~5q zuL!*g8Rz|Od=N5(v0E=FcGc34Q|E@q8|d$D9ALXzwOZ{%*FPMOvFnFHzKA@8-8d`= z@PtG81AOp@SOxXd0Q%8B^-^y|--V(+FEt(!geZdgos!JtdrV>H$`&~>*k2@(Q(bdf z+`5(t1N`5QTOt04h*%|F^o#M|pIubm|FFM{-aFsWuJ3Z^lu1jjBC~%5C(KE`k{0q8 z{VMiQJ@8N$6&U*t?Q(xuJ`QqCZB-R@Jd6DwG@i%L{|D3m+HELy?q9xy@x>iGaZ%1- z_ULk8{+%OQ&_B+{lhV%*&`Z^p^4MqZ z(0eFXwMjpnCDvrOAy-z9T1f~GTRW(LR#|N-si~<+M=q|OTcT2_!uq9K_OTWD z@Z^L2GkqTW>IK3kWDnI>X*4{E_Wgdu*3;Pb+GkiE2_ZZ(*YU39{J zwkTU+C*4@xI7-E#-6lE97cI6pUq#$F}9_u4Z`R^4vej`lCxO(h9ta}{z= zdwe}1dj;e#+s#cN*M#h(&FxWDaKZ@Xlauze6HcdmU)~>Kdvq`;Kj~uht2iG~jayC4 zP!gY({>7p5O(%VOCFG;#rOW<`zBiVylk@)oPMYZxmo0O!8=#6<4K`_R z$)6*11ldUw>V*Z@$&H(G|JX#A1T5r>H@}j38!7fB)E^au$Q$4G+ee-OyRosG#2a&68hN~7=OS( z;7Ih7nf*M!XLKMoooGjgIAM`$c7Y*dqhWcyO1^(7_oXejlg!}Wh~r~kg*op}cjkMB zk29GyJojs2DW75a=!!?$a20M_0$b}()Nt9vMw8!x1C4|JHj~r9zHFnf|E3i96EdeD zb=H3jF1q0=s8j9-huPk5j7H-<^fz3EV)%KY8ury^W%s%J#;=PohY9lG71dm;l_9G z=O6Shk=o61ezQ(jEPVf z_UAQA!tu%Vn^*B9pn~}jW4^w>|5f|t`R98Eo>rz?`!VK+RoH| zYgDa1%IPaSwcXK8ddMI7sUCikQ`&b*>sYL;cgk+IYNK@8!Pne5{N$xC%k^6JKel&i zeIICW(Vtb-WG!6HMu{=m^7EA5tL8PE%&JXJQ_K7E{sucLv~#4^wh-25fPJuTdrx!o z9=Jg53uUtQi)eTZZ-IS5sSV~qDq^#)zy`k@`N0lwCwGA(6PcqM+ zzn)wq83$8WbE#_?nQ1l~jf{u`zQ@zd`+E zrgi2O;?Q~AD{n0YQbHA$@kSbY$T;9tH@x->GlWzu~`1-GHO%a z`z!BXHh!smbLA2qS75$HHhx^O*nHjw4`T`PsVvgz8ILQy<-VvI|9Il&mu2W3F3({J ze^_2=QsokEIg3z;*Y5>|_Jc=W^)dN0KRDHS2-Euirbvgj(|)e#!4{~0b6^%p9p63F zZsze{U$~#SJloGpaRF}I6B465{+5JgHO!{Ulf8PFP0l-#H_HX1z?s^Q(2YRjPsszh3q(4@$HN0{Tb{l+IY177Rh(u4)wugCjUk3 zeY%8PGrk%(!+xgfS7Uh@Y*B(UK{7Ycgx6y|=uaeOJ4xz)S?}G=C@Myo|5l6|k?9oQ zpIR}<5$wO&d|R>TM`(g`6V?A#nUl$-B;|U(-)HpS;QF`Q1O4GAx!jMxvkwV6f!SN6 zzGNanrZ45 zzOC5muQclUc*M^VM|!L-T9;YvJ*^_83QCJ?F*L=T$3yy5Fs-k01ZEzevNapnr=H6B|$YpM(rE zruu<-`cL;C(J=K_r+Gg5fob&W_=VX*q*o3~N4HS@AZVA4oomCNJbPuihtr^y^61NEI752q@v8;EHbu#K{|StF+4BeV^+_1|9!t& zvfeDeRvdlI2Oq{(zqL`@ZaEmJ@f6d)YyUjn?q)Hh?icG|{$<(C`#r-)_Fb8uFXgZP7QSTi@hkMPhT@YS zmV0MIQS!x$`g8CW!g$SPk2#Bs#pHKIsN#6VS5CR??)rLnQJRk(bY<_O)Zf{`WBmT% zR-XA}q5CHI{{Z%n5L*wevFB>!p*2;E2S-Y5`@FM!zle`qctR*E<6MC2YH`%(Ey0f_ zR;*ofdN0HS%k2y)IbqhXtmE}$_IUo;{saH-z;%Y(lkju3+WVP=|8iKnUrG392^11V zX0K(^-$1y%Cqa@hLe%`g9`FTW|9(;nB0u*?hc&^#>5rCzw46+km_N zKA#IUO!Y%gsd8#huOq)l`VcaReq4=D(erX2I5*t>ypwQzQiOR`$8Yv~8oE?YZuUEi z^z*nO5K2z9o49-CDDWbMAUyltuqAyzgQ0`QdzRs&qP4 zUikb&N>JfA5+30G1Y`Stse`Xaw*u?;gSJsFU&Oxz=TGmjwm#NI?R}h$2Yav||GShi z5qu}B9?859TWCKf!gRPp^ZbE$t?0FIKOf%*MMUNu^VzzAGrScM&6oIoNQ9TqRB7zx z?hkbRbSgqrv1#f6Qg~c)TgH z`*YC0RR7!vsEMrpaJxP1rRB-iPr|SDL*xC3yb#j+kO8er?y9*3GO`=;GnjSsJ`n{2 zOn+UnyZIPW-v?3t2nj~ehX+tWHPuh|ldv{iJb0YXAC)7$xlqCfUh+|Ul#yWrWg}$) z9e8lRT7RgwPX~r1{ALHdujsIMAGE ALT TEXT -### 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 ` 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 ` 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 ` 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). diff --git a/build.bat b/build.bat index c382409..4de4449 100644 --- a/build.bat +++ b/build.bat @@ -1,5 +1,7 @@ @echo off +call activate ./venv python ./setup.py sdist python ./setup.py bdist_wheel +PAUSE twine upload dist/* PAUSE \ No newline at end of file diff --git a/fishy/FishybotESO.lnk b/fishy/FishybotESO.lnk new file mode 100644 index 0000000000000000000000000000000000000000..4b51d48493215408bcd2ed978978f6d793416718 GIT binary patch literal 2220 zcmds2TSydP6#h2LOKrK~B?Ze%Z4Z^}r5kMs+AgBxWnjY%8me_2+wrn1JJY)QQ1nm< z6`e=T=*fRM=RbS?bH4vvX3o?A zFr+Ua4vc6Vm2b+Ekw@~u(HE{`8RLez`<^of%~I#O6Z4CPbmR)}>!0UMS!L7JSIJmk zT-=|HBAZo=Sw$rgC7RqLY*I~d)K~6uRvaRg9Vu9d&-WMCK1}HmDpU(ur4I0A8Bt$d zcrsA{2YhITicYxThXjR=vamOdT_(saCe&8fRom(ryE2SzuQLqu8DrZYF!o9vGRj|$ zw`& zn<$5fbLG8|h?kQn5@Y_(%Rf!5q=q?s&1$F1FDYWJ?3LXn zWATX5=fDz{_EVv#vx8h&UQLqHs`@$#TLP^fWvh(hx}vPq(+6!wk3YN7f1$=ZdDql= z^T^cld!{de9M9x|zn!NOcoN~89bJklwcGu2Kr)L?pTAWU{Js{+ttw)7cemb*MxUw+ zBKOKdOb=?Fa5MG4i=Jzhy4Fr_1iv`}lFihk|KHhpQnY!P#u(*9AFIJs%+PEzuMT3> ztSpmZ!WPo>(wMVpQ(Gb4Mw6RotVDBrGwrXweLoy?OVDN_Pr=@plBDeLKc1KoDkXVg zSZ_2MfvvBRc4Zl?eG_<;nv0$l=kf3oFg7-ZKp=qa!4NVZ8{rxs$H%G$+`#~Te7%n8 z>1h-aXbR=>iSSAsf+H!>Y3xgQYwLG?$bb1xSR0wjSV9J&kUpl#0Z7vnp%7b846_wW zS-~#6*n(r9g`s`z<3Y8I;$0Hih0W+z4MY3V@U^@cRI`qcV-cUkgD#FJc;~f^i1WOa u*>1mas-tSCs@!s|EO?T?ydE~FBHH(KaOO_QXwA_6_R;b+1?yNJS-$}PK}C=N literal 0 HcmV?d00001 diff --git a/fishy/ProvisionsChalutier.zip b/fishy/ProvisionsChalutier.zip new file mode 100644 index 0000000000000000000000000000000000000000..58f9774bffe98c108a76380110e981609d705380 GIT binary patch literal 32498 zcmb5V18`(9wa`x8GWq_Q@#6 zsgtzF%n*MZte|}#Gi+|;Z3nZ6gN}PywEb_e&n)iQ>TZszSaWP z2=v`l6cQ3K+9h#KScSPs{7f!<^xX{fG@fuE#K`KTQ zK#gA(!~4^}7)*!%GjT@vG(s6O*_}X5{GS0W$7KpNj^p%#R58qd!pTF3>(IxmcrBi8 z3|`1=8+({k9{rkSNG~CNg~t~^bJNKX)`zneU+18_E$6_X&KI3|3MGAgh#TN2vBUbh zp1>OQ-5Dui7&h_1ZqUa6U7mhS1CRfEARp%VhB-EfZ@9+9_p8OyPR%T!rGQN*Qbu+U zE*2*N?6@hY^d*>7L&9Hv{sy5dKkUzEB?~aflpjpV12wV}O^zMMAIbtyHnpAe>eP$i zrx$Up8-L8=I4sQgELIf8QBGS|{7phg@tR)#yHlap4{x@ehrIk8{hR05`3Vz>k^ARk zNf8Umuijgizdyu)Bt~{=y=e?0N_uecK3l3m@VrEb(6T&;lrACr3c6tdtlYLpEI3o} zP9qhQ*=YmUkGWL-@Fi67&twfdp z7t}C)2&wMApc6Woa?<5pmf?3pcI#TIv7w`&p{8%0lNMBp+~mx(TrHJCz- zbm=QQgFSdXhF$%cnHFscjPxG;g<8jm9Nx@AxsGM!!#8dTn(aI`^?OBjlw)@Rytw_d zI>O@7yeVqA&zHLeuYzl8)(36Mf&DJvl%T5@<^b|OCco|wn*yeEd%5{8*3mlp84o9u z_WnoF0cnwNe__oZ1f|h_L7l8%_kWv5{u=NQJ!SxUc#CZ&$z_7%+jeu*l1ZA3QBI2B@&EVfBiAL`bO<5t`(feEgkDlD2PgbWpVl; zFOoh0or)`@ml!LJ-wb=ph293&!-wq%9Y??;wwsuvq&?~LN7UJtY_bE#s?GX>*Df)!9Dk5B z!X^c3>XrTM8dab+MFNZWwUmCtw}AKpo4Uets+oHsy$FG)I+MHiED!d1-MD}oIdce8 zPA@AapT&NNRQ<#HCq-smK;^Sis4NrQ>r31%K62&}1e4#7xTr456nR%L5{EhDgyODF z69S9cogy6QxyY&SFQi6&7fkl0;Ga-c4l9n!=e-U;nbRy+ApJ(3n4|~@_7P#gyQ9bA z8i1A=&}fq>9lM#G7Qcrqs&9}sv}<7X>4X=#yaw`YjBK=j9xU&RxJna92DCLZU)RMs zIeBSmXgGEtgww9)fuR1oeEzH8E;{GoK#~9e^P~U()xRm9X8(WbHL`c|Vzza*3U{~C zPF|n$B#(O7LPIQ!BrcKgK{61HoWbxxDukDXQ{bHwfh-9PlEy&81PcyQEsdV*f|X4w z>ONV0zqsyR_SkYVm`<>o>b%xrf1b>WJ&lzBH2EY}VE_tBp}6UG3}jP(&3w5Q_wS$Q^O~!A>K83xl5UeAX{5$ zv3TDs;}{qxGRP9!Q&-TG9T&%Vx`am>&q$KJ4abvR#W&K{7lBJN!(tzt?ne)=g@*78 zbblC&-0cYcHAx2nr;3bcNMM%?h^s%|0p_({1SMxbMM5bhD8q<`28TpcRmu0bs7gx) z!-bXETz>yvIi#Ut48WkKg9?=m{nFi;SZAfB!4*~5uj^v=y4wN%f=5KegiAra9p;XW znHV4cdIAfFHzE)F4C$$V66rS#&=2%g7JKJ0)%UNj-7+lL_VtBv3asYG{qTa%6TI62 z$yI@1ewRN7iU|mSem)J5&nSYp)~2~vV3=Zr-@V_>2xrrsYq!lwGU%Zl5*~+feSLjD zYW5s(oT}UMW7|-q7p36`osQ1J?~orbUP71WLv6fYO)h%~XLW7wcI0BCsuo0eaA1If5)d8}C0rO2;~EnK;%@%|RX_&a4#ou=Wc&vUpA-z~rU*tE37}5~01pOr z2LKX-ZqBfZ?1TYeH-RMjWZkmjNC0&3I{gk=QE_SMAD3--!fxR~iOHHDm5nC&8GpC9 zz+-UPi>zpgHFkZ3ADSEV_8#|o&xom2=L!eeV&2Qxkapm2;QKgtG|0(A0(pAD3&?gb z%Qe0?1KovB2viUyW`M*7>bs^ZzGsQdE?C89KiCjRX#j@Mioy`ekj)$c=`FJ}GoK+0 zdwVVO@DTOq870Vya0t)wQ>fY-gDL6UVQg@JhdYT0h)K^kR~U|J_)QU&oHk{X7KPR) zyh{XssPhwizr`7L&uIfaXHLe}ZG!sF3Ag=KYsXs}ni$$%UYVJA!dR%HoAr4HIs+SG zq`V4}pb(;=ZLJXy&yGsZm5zV46&LirwcYc~N2%R=zq`mq_$8e`MM+|#ln@C$U#!em z^4v6=h^0c+iM(3_3`}EsB)#b1ea_)5+ML$njV+WOxUD)l?){HY%rsKjn;BJobol*5 zXZJTgx!VnGg%np&Bzkv9lX(>8qUywpErv)<4myYMG$7EHk4OuZhnYW@k$D< z5IqKC5r1k^>_VcK?EUTCzcK%vN!U@l?wq#ZZa*wr6Tz)G6`YCwI|~8BZygs`kLGVx zma>w24#|zcn=SRKL)5%L8d9G1W2GrqIo^-kndm@@P&~~xeY*I{aTBu41t zn1~<^5hmg^V4}a4)g2_eX*&jKdn{+Wu_jwC$hNLtktxYZDCcD-qRgZ^S$IxnxY4IAdub9VO@b$M^~3do&SBL2TZ~2FoeR6_$;wvH%u5W*Q3xtb*^A{DQl4(S%IV zjGC6q@22uhoW2_}RMr#@w{8^j+jP{-#(D9uW#HI8M9tpM4L=l*m@q!`oN_mLm_3{} zHa7~GF1&=9Ru?iZK<&PE(>J#-%A3QKRtcAA%_%^*q0nzRohsS7k_5WF2AECvZ~ZEn zoO<~p+9vFE#~9l5c4y2x{)}?6$KqAkx{9vQe8btA>Ku6H5$iw>=!{^|W&sfD3*}#v zz;ZyQi>lQAgpZS*fHb@39shkT=7YqDF_M=mBk-jiQC%f&(XH~UZS4Va%+#Y_2HG^^ z`5yiLH9w}FRVg6l)XQj_Bc}HfI_XSF1NstEzxOj>VNVD@t?D1P7F7k;OR%(&nFH<} z!0+$bXH%mpQQny{`-Rsy8Sr`gODm^B$%KK0P@|D^ZSvZI7)AO!IN9jZeN1+%J)5`l z_It;P_~!22GW9Dy8?ojTb1|HCM4ruF9M|-3? ze0_h3!ofJ^Ri33SYgZfiXwDm)&;} zxf6n43>FMJ30cng5C&3tVEP}Yzt+smT2>eUVTtMCA=_e&lE3dmVglpIIOR?ST8*I_ zcRXINq+X_nt-q#P^Y-I;JCn#>Al(|<*@hsF`6nlR@>hCuew>9pK0Ofg!vs#5m8Ut;V75FcEHK6S4mUp7G(Hr)?uZ9^#8Q9;pU_lGmo9^^my zxP&6YGI+A2GxPJqXeEc~4Yu1Q*YTpQY-RIoaJqwc7_?Ets4Yv7;AdEm&uC})LI*r% zt+yAF1m{r(?`#=c-nIs+z9<9)kSxJNO=a36UYa`;IY|oUy^xuB<|IJ&O4&DT%!cZVV;d_!AVVr}~sCp}pdSUjWC3zXMf zcwEU;M`A)zDohHRA3mmTopLyve|}@u1ye#(DV4KJd_@qGQGjJA=VxEw1U){m!F5vB z6BQ6dYZ?oJs_kL@#r>DNR?LQEm?T>$+}|ay`g7hW2Cf>u92Q!rJQJ`NYTB;*ZDtR^ zKL_+Pe-RcFt&K8kUuy2G<9J5Knw3mVA#aC6=D!;O9K8}$a!U+>p5$?q`HxkmIrI+m z=`f3~hYmg?o3Ctf>Pv1tfdkJJw!tv!&<_wAx6Vl%jRim)pLJLjX-h79?a!Ub-8xyy zsd*ika)*Eo2QR-e3 z=1Iildx{+hPP4mce~NPGc=F}0rcoY+<9jcdqrRJe^&9LSENHwa^VC zU|PebSt7}*W%R54IE_(+^d{7EOP7-ot43#`W zDfqf%&ExmxV|5ALFdx6CC_;!PbvVsUdk)0#KU`*zOTdBpBVly~771f~aLa_J$M$Lw{n!5R$W5OG{ulC;?G*uw zmT^wLX%VJYA*b|aXzj$fx{>Bl!TjqmNl)8$_i0Kz)7bK zA+ne3oGUGXX1FcZSL-%UF)ClL0-P{TRXHaX?07S8*XNaPG9^I>y?TzH+^$bbuJQ&7 zg|3XZLf3@x=v}9|z8!}Au#$+^J*_Z;214_}aTJM*udS1*&Zq5J72fhapTb{kCDb*j zTDv#_5T`)_so}ZDV_&bLX^%1wE}>wbr~VE$mwS*T!WRQ(FM2UL$869qUTxXwVa^B> zEPuedZX4TgFNENCl?9PHGG3-0Qemziu>6Gz&70rZpoBEgA@k`Bmi5 z`{@L@|7MAI{#&-WsCMsOBKFX@T>;7h5S*6zmPYcd{C2|-_kATWSK^ygM^^2WpqID5ZEr>KWAdp3nR$W3MqB8GM)Yra}O851u$%|Y5n6b`W)z}N4XpzO4 z7bS1LNSF=Q#bLD0pGl9SyI!`(A>qjI=4Y<3PlcLD(h+JO3E$RJJhIUmUu=^k62;ez z)jzDs;iyb!*LD6--sO4vjp7<*b<&xjc~wJF>g#FazA~S$9#$K}A;{;AF29TrPgv`3 z=lDHB5EA?W79iibowdreE(jS8?_z)~&bJl;OSwB<#dBfifw{GGaix{|>T$GzQo=9h zT+RqTE?5jbwdJ#=*SaN>NNfNhyqcvCBihFh>*nES2EJ^f*Hhb!~{ecPS zQW0MhF>PVkQ;|Pc?te}b7rSKNLpJd64s&2V0IiKgY4m8!(Z{Cvx%e@0eUYSTp9mD(e?pXT zHqcnoP17ES$U*UPVz&Fbt6|fYI$3}73nmCeK}Mj?u}EE`OH6a5R_UVR;8jh2OE*aocWjs;Af6eZ)a{Xih*}qbeZRjP-`G>3SRO;BQGvoA5u>l; z7;u{4C2UHD1E`_F2|Dg)X$d^7dWSf*RpUTA7hoGOI&Q1kSC^SL@1_k)-AH&(9z3T{ zN3-w60f>L5cyD5bINxPaF(kV?Y8_u>ebM}svC}w|<(*&azk*H4xn9(Docz`#c8CUwF}c&dZ8MI<32R@2orXsW8#w#j z;y*t5wA?nqh37wV-ZS02`PJ~X&+0q3u5{bg>HOHy4 z4!*v4(!H!5?FbyU6~*ww18q)|<|G6RjKmf|a|%*o|3#ll%I3r|lCEDK_|nr0{B*X- ztLdGgbw7m7rKdCOF?1-Zsl*EV!=rq5-5wxNSQz)v^Ciwf_rmPdTrA9 z`0;90vXN`0Rwh*lcR7tf_x6Wn0exFxB#LpJzpzxe=0~1DK=(O1wTnZN>qmQKS!a)Q z{SpQaq<*e?OSos-MY(o*hUGe#09AT~E&GI|-{VV;2MqQ6nV$U3F=4`!d>YgOZ+*yF z$q#vRNr#0=aVPeEo2r1V4bM8E+PAP)rZ$Aq%pPCo%)#pmJ8@^`R=kXi5u#6x9x9pqQMl65rT*%z z9^r)94DDZ%q-Mv3Z{MJ*7(K6VEWjbC-eh`sw==vVM7``{4FuUzxHdK_F6HVc2=XzM zsqm|nHUe&9HlG5dc#F46vVnj6?h@dXK|Um_?_G8>Qu%6eL{E)#y^mI_;>kYVtxl?~ zKSRCwYod*$ny?|C-aA=A8H8$->Z8WS0Cz(s=0U=b4Q`JjpDDxJMGlYohfw+OfcnqxQp?za z4Mzo`^s2k}a)AW0#1xY3_k;g*1^1~?#!{vRYj2&Po)Cq(#t89!+uy}?{+!Z52+%p&l2Cjo=@NC{_D)&G%Bb1cRIfI4Y8u6iu~Xo1v- zvzDn&e%CtIXLh!Hs};ELZO(Zx2uCPTqT*J5geJ#&OxW|XXVkbc(Hh; z&)zxxW=f)~Vx{(CNLShKT2R-ZU~~4&oSZ&24S( zH;%ktI#LjWA{yu&1JK{2w5I3sY6`95vy@877AnSB5ZI1BA8K#7E?U9lrFS6&0&Ro{C`uh6^MIuFW z9_|B@vo>;acj$o9x-JyDX>)pXXe!t$y&g#wMRNz!?wR(45*U{o(q-$K>|=O>0V${8 z=5v1})NS3nQ`6hw3Iw-%{AR>9|4i+gk_(7Jc_OfX=m+Fj-I5PMtvQW!QBgM0I*?()v=$# z0%~=P)}Zi1mP}23Qj=2Eqv=O|Lv}E`{m&Cc3>Y7JGAyK*Md91wmq{Ml!hMOnRM}N8 z>V)Q3*+i7c+t*ytMd3fMEgVl)M3qD==<7v~I`TuW@@kgTKi7NPtOIB~cXsABf^nMS zqTlVnCbf+hW(S_PuD-XaOBJGA3*FZIj-zL(DDVqn>~}E@DLuF{r!dNcnp`H{%qOkS zNyOanp26liXw}fo!&xd2{ak5q67p{u3i8@u1sB~|Hyl%k$hm03$)jMAz^9_{za`x3 zZoj(nZGnEr!kfj@kZ9Xgy`8sLY(XacCbVEga3+B6ps;}6QK#mzFgbX0lwpL;wB|7})ipp2b_;3vTmssj( zVvlmfov9Os7aJbqg5Zz_Dpk*d-KQ$YFh*^_J8b=uSGl9(BVUoF*3C#HmjL;h^DGX6 zqu>lC`ihwI+!yqO{-@*odOlbnauk7L#??|Kqwhtp*OIGSwXMUBqdTCaYNN$?979!A z#fJJuzV=Uz6id~6%qKd&`=*d4+%|&j06Ioxsms%a0at2-Mr?i}GujARFn3r9t^CeY zKC4XeE!SA`Tt|$Y#Vqkaq2aoc$-GpJ~h`NT(wPuFw}V!wjfcn#;%fy;Bj{Wk`(E!z-3z0U3Pbf#Tjn9U>F+W9+%q z+{Ly4?)koP1**FGw`xE4f`soXbtZT^K^G9=K#g%O>{HsM zyw(LiB^#kF>paA((4`jCii}K*7gvG6n&ny9dVqGE_V*KaHmMgZ&A$WZ?4NPR`GPKl0n7voXCNL}XmV6{OS9u^`?@u1X$-w;IM+BSHbkO>p!uN-bec4yN&iNNxqWvcl|`#h(*j$coiS^V zD1ksb_naO+Ldhc4F_8@^{KoX8{64SjC;`Uc`T6ws<-Y8E^$wwDt$m)Pr(D{x{2hYd zf$hV?Wm6N4UnM9pjy_MOr!3{yNaFG!y;$jjw>(^xy1br8u=#p2vI9AkuUJ(s?m@cQ zcMPw6Z(VApB)&=~Pb{ktL6M!O{e#73-Bna?-w$T@`+;GArW$SfZ{vK9SJGZA`01*4A^8u7F_B2L3>uc$g86Z{&Jj z!?3YqNHfwvNFJYAJH~?hgt?VuBI>~Uz{L7nlGMPTz@=rEE|C|i}CM*Ag!;9Jd zhr33C0(?I!YWQ>bmPr8u7G+5c^O-DtNSCPGa|4kADTl?cB?YAe&h88wgs*DoBVVVj zY}yb}o}X}tSjTk7{1o#j&Gm`0g?#0Sq?S1jCf=Hwl}Eks5ZAngHPS7Lnbg6P?vT2| z?>?I7nd$f;>vbP1JT@mn5;{)A)_WZ%4a`tI=j_|y`(Jhb*$)ih007aynZ2rnh`53T zvxB)qqJZLn@IM7tx_6)?DvAmeNl6|Bjfsi{YppEa&@ghIy400qMYJ6f0v{a`f}s2- zoEuE)&-YQ}kP6A-=bmRz7K9!w%I2cvxUo4{M$!jxCsU+&&k=m>&_(AKN&|T70)ddc z71nsK{mBd@CO@Ntjbix%`B98Dqo%Op1fzjZ}LRfT$JggIqvWD`|L&Q=;=#T0YwuC@!oS|z67c`$9MBco9 zyeyrKl8(19x=5`}?ChTs)&7kixvzlObw3iuRJ_1WAs=~44iGkcZ^8~Y@f}^k&MsnO z@U|4j#a(K6W~nh!=7V}ihW!3f^Pc_VheI?gEKvp#M-=DFf9%Nr*y7OE!qn+Gd}PvIjr38O};J)SGx3fV#ud-^Gl+=f>Y!DLVV zoTOHt)PZJRUbrmdpY~>7$&>xi!Vz`WcPSzovGU8rwHfkdwDs9$72Rl6G(WHPO|J{z z=}@_ul`BNAdo$qX_50}- zEC!7Y0a+CXiMv7(BM@?k`KZMJTFFC;Dg8J7=NO)Ayu54!^MU~?ohx*0tRG?IMpk(G zJ$il7?^FY02R{W0$EB^;;Ubp5Y^D^?4dOIj4g0|E-;nGLrz0uE22h5Dm;@dkdFnN<9a+dE zvk%kl`ow=aKhYoY>LL!eIY*C)zk|dB2ib1DoJM}0WF5OE-zr7;ZZKTHk`cs%D>W$5 zleQx{bJYH!nSE90%KV@{hVK;QwFM@EyQ%wj>REc`V^bi4>RzW|v?#`4ID2sn@NE;9 z)my0VS}4ZLCx+{l?pA6f6|T`_MA>q?Q8qpJF!?yV)sN^#mN7H-U9b;eLi;f0YnPwA z2pQuj-`+t(LTp0vWWNXt9ps+45iYpnn#@dNqUE3xXB@366_s|=tm#roSdgWU_B_H^ zp+OVj>#taX;(Hbo7K>X!=t9~8H{^i+ zgWH*!vl)}X=#Sx_^Pk=M#xi$g@F0b=P>WB3w4ehC3G{MyMhn4?&iQdRgC;mt%{KrpHJfQB#f7mCmA7Kz)s!L z4MxY!8+OT^1SARtQC=3peOF>DsN4-e-BVl#)3Oc>kZI=5~7DGr(R_RUxvOCL`S10xpwW6O_xCdLCw zk7GNjD|~=*e<7ee9`kObe8C=$gQffC^YdqIu`s56??&WoebPpc{eF*J_C)66{EP%? z8NoUDGBvxUo`LvmkatFUf!XZr*_^(V?xG`s%^<3WUdOM1bF$R!%=+!=kr|q=Z(@$q ziM}WNnejFsB`&v0tAsvl@~U~a`9Bc6OqCWMZMKT~h4P{yi2KglKwXz=4$>WyF+WYAt{%u@4gkog_20CEnWC!eGE z<%D2FBk*O0?JmZ~%lcMSa6FMYe=L$zH~ALt{Uhc(KV!|vm}Z#|mMA^1%eAXA^~??-QsWEVmXn(>z{6<%8({9*hw~jw z`VBsRic7!bl8a!iswdDASFTNqL}1N_KMfqi@cG``UVuyW8h7dCr581DyiEsFVu#~h z`etuLYA^JZVPME3tuY2lR$%G2@bRRMSHS(tk+B2lui68)HX+C19i)}*U<=CmRDerO za}X_)L*f)*8T=IBCq%4#qJPCg6l4UceHFzEHF2RiDRL)NfbeZ&{gq8DUu}RQLhDDB zekk*cJPGsnC09qxOT^#uuqil%x(%ILc8A+4p+(oHWV=y6@9XyZ;@`%lzkQC?Z-LD2 zIbl-Xk@Xcu^nbE6`lYkC)e8PSw)s?yIWIfxtk2zb8rgm>;>|y^zl{TDBT(P>cKS zT}(%cdDU)=R~I0-`;64j(;HpVP@#P1 z(D}ZgL-}U7s%J3u^Mm-8d|-+flx>_EHQVR$0dgs@>^;ecB5p1{%Iwd11OItN`m$Ke zfYg#Nf8MXvbET=c?k3v)2e*W9`l&*zEwi`sZ8{-3P%qBNw$t0&{66(%?)Y;2_oMzR zAfx3ZYq7?8ag90Y|{Q}Tg~ z`O{#197$&^^yE19nAVT#S6XY+X4Qw!*`4n~xBS1m=bYpz#zjWeu0nV1Isxx_&5|J}di z#KJ=J491;BVqhV4j6}X#kiPC4e5Z0|!iY;)DujT@lPG$gn>-k4^<$jt=!0=_Fgtc1 zsD&6(Wm~+bl%=Fs#RjZ$yt>CZ@$I*vg5W)I#2_|1HydU@eAtxwxNMHe2{MA(5<(Xm zzsBRQAn_L^8y0Zv+N1ro)POdZBKl$9|)woR!* zI8z=n2I8nD-44Q6j>t?eRWP%P*Gp2RD=+zL^dx+o@u^@}&iXYQ{#F~D_w(mQ619c8 z&6D45dp6sF(a=iwb#H9G@A+TjOVv_A)IKX+|^er;sP%c(Me0bJlHg3$oG z5a>aydw<#pDo!v$1*!FdzXI-KAoqJfCH+RIlBU^xQP6#v)Y)J~eE_$gOZpgMHYf4dnWCK`Q4A@I#;(xY$40I&7nG?B*$45M$NYS>%T+Z59@f7EC5;@=M9 zDJlVdAiJ;m;12wu&>ui61Hv`pNhYW9Zw{k3K0RdQ%YRG-tsWrxc(O&xQy!LF2nl}W zCM5UdT47!!E;VWDv0b1WS5BowA95v}*Pc17=MqIdJcD9|`gF<+@V4gW=0@yPoL@9i z9Nkfvjqxm1PhM9byARmCN-Z*{W@R6oH`ovwfx$Z$ZH z%e-NDh>3&^sRyS!$5CUl8+82#G~PPVu1BF;97**L-|KBUU4uygvGLp3;A&#&+f198 zbM;Etz?gf&yYjc%`_Xvr1cj>vFzYnuO$`YwfGO>-}TD>75& zz>tsW`?j~LKmGqGy=z^RfFT;5K9p`75}!S}DHAQ6O5 zpWE)Oy?f9w_>7!0^RxvbUyQ-rR~j53?hUDrSTXc&qz~Hr>*1Zu?}EkIT1Uf)?3Ces)K(Um)tguqW@!*Sam8nvIcW*%luZpTJ$K ziAFWm5Awf<_y0%{3TS>o+soEsVt;{kN_+VePNuWX2DR5(&$H!kj~T}28OAhuBad2p zBLb+PjM82#e9XHr&}eo&(b{-h^cRT6P(#54RDSScaqINwv6=@z5Ty|&JQkN^n`C8B zwX)ch{}{R3Frt@oQp@#^2HBp+HQy?@&R0~5(%n>(z~f&xy=1M`agIYiCdcMs} zMM{uO*UMR|-l2l_HW|>UIo&K9Q?ghtC7Tt7C*9)m*C(Lh#-iwzeR4UUVk{e0m*}Yp zQtWCeBqE|Lv=EooG(T36=DmXNHQqQn;hyhy#LrHH9;<-zJw*DeneRFDq)BwbvZlp6 zA~E559F*&QY~geBafuqHat_rd0j3*^BX=UmhJ4~YjI3q5{QE0 zJM=Y8cVJZatnx~7uQm39;Y)El7j^&RVr`~yCK??nT4})J<5@Xt)Qe>+mlr9Y#*@pV zcD#na2!7|Ke*F@8=&|MSvsVLux0m#DzOKKomB}L5`mNZc19UyDwU2g2#JYUJr3IAP z6Zmb|x;mZm_v#yqwx1dz!$G`Yf z;MzT13WrFj{u)e}}|3xK#`8A6;Hyf}kIUs{Z|B z4sPdzZ~yV;?grp-{G4e0=Dl`Np&m~p@j!yo3irtwxfOU_l@ixY;?6erz8AumIX?n{ zgBZR&KcWmYh{HeFNoM)rAQ{9}3A7Y`bh{n=NIUp5s{>Y)pLNDC|DqWn`;Y)Cdl}ft zXBN@lE-=aqZfP!XBF-fv~Qy>~BwxWE1*e3@Gl zt4fGsuWIvpXfTL5#HbzhFN!mvDsqNd|1p1Qs`qoj4NQoNH70sdIMbZF#1=IDQd<<`p)xjRHX^R zL_;8t!=}wg9_#50z(IR0s={2T1Q}<)_vwQVe_}XU&GuYWqepLdDyQVRu|s!L2F6_Z z>%^py%pGUv6V9JT_O0gd6jd|q8D`)s&(lQEmSv$RP^i7g!~uCEmfvhWr!^)opMC5{%w(6CQyIs=2H_gT1+m0AIV6qsJUbyi9^7ig2+4wXbNg}T zH&aJLMa8n-z>RH&K$7#XwVjIk>y6h9jK66Mn$<29O>Rs|BO_hUVVC*GIX4u9BcT6H z;rtix<9)__Ao(vji~0YW_gUJwS^taiU1lKJV=NQ>0eLA(6QY|6&T$~16}o^U>=%dm z$$O;Aw^u8Ujm8-HUHbKz7fmIqR)32w8ETRfIiqf2jY2vg<2v^pOz(J?)%$5OBp z)+RsBYXhG1Z)K|yw~e!LFK{q&0rl`~1ESMdMk|Mt4s^9%|AHLZ3F1PTF4aOVo( zgzz6c@`fE+Y1Kt)Wwk0q*s4K9%fdd6scRTa_tzS zmiNU)C>uiu7_w05thqDfDm!A!H-00(SIf?(;796C8|Wr}p%fM)4vpnDa zx$0w-cHNwpw*Q##grcV4(Xd>F;jhrqn_Fd2(yzXJ66|at%X9*e9}Uw#%KR$ocV+xb zet(5~OfR2>w?2s#!%qj|r8RKgt~9?}ExL6DzLgsl-oDz>`3jzsA9invzX?@bEawes zA2D4{RozkC27xvBb?;JtW;UYihmHjjzD5j#icZK=n(qUUy2O1Il<&J^VawivveKDV z9m!iQ6K?YzRR0K^U2|9!cdJU{w7|^QanrNxOW;i8b$ArYS^8PjDy^oTc70JiTc`71 zS>0#vKh$JDaZ1k{d`rcdts55uMnY)>y!G^oRgp+~Ww7Zf`S-5M&qv(Cv9&=jUdytS>?;AI{ zT0it+o|oZf73p1A1>3Ox*tV?Uc^w1vsVU`(QBF^m-}h;CO6v5{gu(Pu{ER&$Aj8%<>B2}5;F$A<>wX*8xlBk#Rc7SF6I7IiK5D-I{d z(X*4NAtk?$&$jp3w_SJc93_R^vGfv&yC;F6mi21ir#dA>Smn>~}_kM|O!b2p0+ko7g{P7=B zl21O|rB<)kqMuQCe6cJcn%*50mb(RYA)X8Kk1RkoXH?g2n465CFuQjxuMW77qi9P!{U?=ihMP5DL&ls6t>{cam_bsq2KmP?+v< zUA7yl=UD5b*!5KHngc23N1pnwHT;CZ-2<`Atk$oiD_zjxb~Hrp$UAy2h#=5lN%-8% zJ`g$L@iSM_0+g3WoY|XlhWJi?8@S~ajjtm}7;`kR9{mvg7iRHC(26Z2l|Tpd2Z!?6K<#UV{N2%BGOt;mG-=R{<&Ho- z>7SR0=Rk6iN8jd)fd*6HjhKYs0Xz3rWN8gqO61)-cjG&w4OmY3+Z)4Y0B)WRDB22a z(qZbmzb+R~#{s_M-SVVlUrx^{KR&J4snU0$>5pXiG`r!EI=oXq?fHcKfq;{lnGc^{ zv~#>C_J)^$dJu~*KIbt}oVnoSW+BMJ^R4oS^;v?#4>J1vCRIgmjBukJI`he{Bmr-m zxczIOQQ6np&!B<2&s4!Rqi=r$)1J10I@nDh?kAeO<~i-p37;1>#fpT_hwj%d!adWw z#~(eLw!QkBF_+Rw{4jpaLLAE|5R;TWqc|F;Z{nhdP5C(yUwAXur=!Rjap=Rdief-|%>%HH*{{QD; z)~wGu!&>utpMCb3v*WYhTgwP0 zRXizA>zba2OvC91I5Be=rdER&Gg+(#ofI&Jj zimQ&dEONkT*AhgaHrF_saNAKxVJ}FOns~Tfr^94l@mz5UxNgAM1w|-Wpz0?~8EAYM{G zfz&&fu4sSYGU|o5A9lZxP=K?DHEzvxD#=-?!G|rK@T97mR49h>$7a^!lbAq0H1VyT zI(0vUVmsGFi$<_(aE_hVv8>-fag@oo?{}S=RiPu#)gF0c09b4~eYQ$ygtYHHZNwf>{Ev8aDrD|U+keEb1M+eU+fdXLhYu#kih%ZGtoI1)*Y7<( z1oDaKjI!bQ9#guESq~|8D&0f%!hH!Rw7Rm$KlrpA&GKuu{V)QTer6wB8$K;CO;fA$ z_^ybvYksTxva@nz7CrMiKB!3R5rGD6G&{QxMw{5R!izC@N!1$fo^2jB)-osd-eZ?G z(PaEGLCVsJO$~#o8M+1Q^mi!fsd!8w+BPwS+KXrmX&m&!!HRx2!=ruq;>Rz)#+~Ly z>z?;D7YV-oAVqex3udUWGhq7VO!&)k}_6)RR^pqKR%&=&| z=kwvACzg^aRlnI>>@Z;M6Gp0(PN^2>-8rVq^tkhsjcIOqK62j~0zw4)E%E^H?$fq+ zf|u>Fy+E@0(uZ#pvJlg;B5uGn_v$h;UuJrMx-ltN`F+oU{IN18_c<6Kg^$N7swV|P zv=MCLTyDCwFIva%;9`Z63$bOb@WBnu0um(t{qI>-R$A z@i7t*1s4eY`ZrAn3-tFq>MZS&oY7Lx48NbXp>{X}>z?slAFOmR^0H%SPWKG1)UEHl z)BAMTl6X|ub;*Jj-7zT{-`O0YdzOfOfwyLcaxYeArOhhvLTXBfAHa`pT8e8 zTFG-LVHsq{$~#kKWO*@khEXSw>_mQbaJ|Wleh^w%V~KZs|GXFZ{s?i|vy0gdF5Uzm z=h_QuVnCNqc0}^+@6w)tY+2I5hhg#$XMT1>+rS>CNmjGA0uF|CL>SEhXBYPG+9tjQ zV`@WW?=-Ewq^QC#9j!W2{8;0C$ddu~l$l09%YQ7rC)R!kIrE%@ctSL3Qq&xr+H5gE z;pXANhP-TjAk!lQ;?y+K)s>%`U)M;YL#A`$)We&=Xm)SYZIwD8H~2->C(KM@&&e9B z6}WRdOvAytvZQZf4!k?be)k&z@+pCbto z)JGCbQI;H?gl!GQ_PVeVc2LUhe?Kws5@r-uI3~y)Jw3;J~(& zn~LF+{z#Zvs{bv{%@i!AD#e!q&DZQqTjP1hugOWVmb}tfBqVm$Sl^-5OaW^Kk@3M( zu3tIjF&pSVi_ss@jt$Wp?4tnj;1ijAwGUXlWOmp`R2z_2kZ1Q)wV%J2Uf(tmZ`49H ze!Pje2;{;MgfN1zSFRr}7rdYYbAdN>n!7bpR?ji1zp*kjT}Ygdus#!R@#6spED5;Q zZ#O_7i5Mp62VzAKtJ5{}K9P2GKLf&YYVnc{f_moZ)_gRu%5iTC;Q3{_I=lC>(Ua%~ z&=bzPEK>oL`xqwI2Ir50CD@E5_BdZpeSLC-J8rAskLOXHD@Got)Gm6HyatF6_yj2D zES{PfyJ^1)hMMX-5!M{igOUN0ukSJ$ceU=_OJ6*4L1!NVtsK7;n2#|fPQ;#veCS4f zm@1Z@!p2k1V7%d4sN0y@?WUf6Qev99uvzK>Rzml$1A{*JY}6AkUtl}#+(%90K%ip< z8EF`LQ<~jfK>6WuuQP!h@ZDoTNx8#a_SUnNbN{T@;r)KuSo47~VA_|rgk<%eLcj?! z#^4&QmIJaf?(hM$iH}*cP%Y8(pc!NSW+BAj3;*f^UmG8Btp zD>VT!#s%y&D!(rQrHf!j37dz0cdADj9e$SnxP^gGvn-tkf4T2^9eNW;Vv6j5hnz`!#(oQgP|T+t z`xPoYlO$s8DnP|}!8J^!=bZ>P%4hVm*|@7-h1R^{E7M!EWCtvC?I%)3!}mv$Khn0@ z;}Kx9U0u|W7ky!uF?frzef3a{<=oo(DUnu7-Ni{Lw&#iR;m;eA4BjXj{-GMYPJVe; z()aQK=1@--3MZ^8%&BSZ29rtjSQ-Ns=8SsOjmEODvTDDNUDC&?EQQW{ocp|gLqmVW zH_uWctrvzB?Rb)_?s%?``{s=?Y2=d~@mIFmR-SQuOZQGPwmrVyf}#E3fyh@Ly>lHG zzM?2!|KxZsBJKv%n`ukFx{P}1Vo%?D2pUH;0gE0F=4E}*C4bLE%MLD&Yy19tJ);3q z>TEfM9DpvKl$N&}+O{x|!IsP`x#btlt=PaufZrug`UPQU%WE72#u~I#J_-5bH4A&23oK zGQvG@`R3x{3j*uMLhw(}znO~tF|a|b>4Q~4^xsZs{V}j%YVP9b@%E1fN9oT7$MZ=> zpbwR^hqM1p`=ALKcgEF&%SQ>AZYSSx`qX?DBy06vs4*zNHl34W_3q*x%g^NFj^Gmp z?CE5&s)=jt+xWdVXt@A1sHEC$wR;<7x|fP&Jba~6V1!Bj62iV_j$@YWLsyO;_LOf zk6wwb3=ijen|d~0y9CP?81j#Iqg=;iKihIpEejVLMFQxi9l zO}kxTT5C7mgckm5RB3_$B)LKCZn>1Ef&XCQ(7;7t{1F}`b6#3mJtHBtdI+|uF+X(; z4Naq=BIAipYejuYb#;v2|@+!A$zPBgKk%_U3OW7t_(c)4ZyEi(m!`XG& zvLVv!XS%)F7U{xlEn?cYvat+LKVJDNjKjB`2Ty!gb`#x1i`-|pKz4D)No|rC&FQ2q z$(`ED6>Fr&7Go*6@@EO$#WBEPVk;ZR^zd+|w*kqW~* z*GhX_4Qs{H-#z}cB}^?F9>Q`lJ&wWu{j&D!+6X75-&<7v==_jGT1T@Cv95@0NGCGe zX_p}0q;YY)g?&0c?1j1UK^;O{W@Y>Mu0nAypI0NN#sh&5$>0q$1h7$?&=wH z53^Nc)QmARN`%bzdvWa1r7^4Tu5aiA?ETs%Rz&O2`N+kgiJp<1sfjN zf=Ot;c66ZWRAXZ?D5o9QsJDd`aFv3vc;}zr)>Ix{V8@i9D5~A4yo+*<7ff=mM@s z07S?>SzR(mpMS8BqKA+}HkGA2S}esu=O!@zjumMceIrEIhjIFwMH0`gFB7x3?sdZ#QRwO&c_ecXGYO4y58? z?e~LQJryj8w7Re(&2?skL7#5aDf-p1%Y zwUKVzu?RgY)-Jc7$-OEvskbxd0qHBp_Y273lINB?`Y+#tqEqT)wqvCOM=1*UE}5s# zEOE7F)XfCy6v4eJhqr4dzhrK`KYtI_!W*^Q>^3Yq@l~H=6&^`~IP~TBe}o=y3CU<;sW6jI3wf56 z4NH@<;RW6bd}0jYy@gRI*Qw^6pO31L5v2eP>GElmjs!dFgU8DO)4^NE`g3w;Ddou} zy(_D#c37|BF7-`V(2(JwI@pa!9f4;J+6Qdd$a*vfKEMK#dVS58x*P<3epU5-%~|X= z20^&Lm?_{vblBPO0TAn>Yrqb1wze^lOtY7@vj5|!RCymlkF|8u>;I$gv` zl7HeC%Hl>w;`}pdn&9BAYvn-EDO7L^fFwU!28#!)>ee#dQcQfoM^!h8H&=v~b`Had zH-%?#0}IBNQnv;-NfvL?Gd&pUUFT`2Kg7NW2nJvGe70ZP0mwlh8E7Bv7j|Lus5jf| z;BEVKz%f^c4-S=f;lAp%^+Tu4#h_gYy@i90`|4qkz_?!Sg`Sf`;r?(t1VwAeLogRKrHJ4y!ye_&zTf=x+ZSfP#fV38`cj1Il6-S^EIB zP$ggf&?_Y^?AEu5VmZ>w*Z0QP+oL0nb&Xs?q$~%WlDl5V4^mg^(WHwmuVCm91Fh-pXOf0J4+dFqXvU~RJPb)+g)*5d2Z?M2jNtThhl z`6^5M%rY;DYOZ<4Z<8N)1}>CeOF|gEyPigYsOCatbiJ3^1nbtxycAC|PU#S)`-|}- z90yCNK%o~la9`}La>|X?pd;p&Cy-vGM%nZJQnS7YzI5e8dVgmSD0Npz#Yd1Ewl2j3 z9>#k-j#x9kWV1g-o)EW;skh0t+FimgS}aU<520x@SPWJ9VFe*3q4AArn3xnR(axK1aAxqeMQKI(rJyPf6C*Jik)0ssv zy}i8{n9yB1?sylnNRNJ_^B9k<%9C}!9!*mA7#xfDjpya4MH8m(;{BecjiBHz)Ju0B z=i8H?yR!KCGXu}kXvE28u?nbc3#(1%>0%@*thwwcVNofE>$U{o@-1WJW}aa84j6@4 zYdbG-WY|-o5eqsE$A7q9O;S)pN3F$kZj^(@`#KlF=X`31q2+EcE!vz=7)S z;)bnbgVYZ@i58WtdNN{s2L6$QlwxD~1@LVYYL|5g1>+W#=>$Pge4qm414E$K+wC#ZL zW&G*h5))Zd3pB{NzAe_?eXn_scyN5VDWy%_!m@IITJM;~@U|yG1|D51)Re$9o7_Ww ztvO5yb#E2jA|)$vvI$(gqB``Ly*W?081m-T@xZG+yH1u+|kCXN?sR3YK zcr*Z16U)~hsFF7EL_!nv*aZ#nB$n}`6FGQg!%e=?{D+5 z!}5I(Jlzq5A7|-K#v&Qa^mW(iOisHvux0JSBEecR?4*X;nmkKx6H8gxFUd@nSgnf8K@*bgtRdsbI|GuDS+xK?LVqXsusdUu$iQ06X$%Mv-DS;(&V|8K&M`QZg zcqQfx5teWEm`lY}Caw+)CwCsvhMI;Umur^sX=VD-Tq#UUb|-dDOCD6Xjx=r^x(-Wk zEsdVu)Jzg&M)x@@1!-+Z#AquiWM#109!2_#mX5Rg*+_{PoIy=*wS#jkzmNysP&4`r z)D9**n^Sc%GNNNIpd*QpwGlBZRTvdMWNSeO+V+N1 z5IX2M5vZSb@hCX(8I+v)bkI1U{FQOI{E7Ry!Yp8RP31`3+hoJ(-b_N_bUy(vMyLsl zj38K5|BXMzhYspz3giUA^=S)jg4CISj<%$1gBLkZxHJz($)&Dbbjm!y0gfBWh0(95 z8FZANUR4iB%!~lhH{F_NjuH~j_^?$vGx8sI`@Swpyv@7SZC-Je$USR8+kNkHC^*=p zRb6Zlaytr$*}sQ<$d6`1fiD497V~}EaQv0IdDJeJXHeyMQb@W9SD@Z}Ep}tP#>N?2 zhEKR<&G$WeKfBN`C5RjJ9%&>x@J#aEOQtNu2rq1q!=N`}4gR)2><9CeY4i=dVak(J zOcVjQQ;Oi4*Itrvgj6a7y*xRwsIfI6o{HLqovJN7c3!{CRt3ES5mB@;s2avqgc0QR z|IAXol@7)?GBUc}MQ;N6TUXw-YOr+!uMx8wZTXysFs3@V3kqICwV&dX)LFJC?%6>Dm zD||fsZ(H+3dZTxl=LB8hU|7Kmr-?qRlpEb-Z8uHA~CScvQYeCn(oKIn&8Sl^Y42LYez5b&9tf}53JBX zHp;t@)TY}Ga*`N=!{(^})94VZ$lsEa<` z%|2}<##cqMC&OgN5Y&6t$W}zm#RQp?q6gr23WWqdAu+|}wx(un2OP=dkN2H`@9Ydt z!7gQ)qr%(0HvtfC_GKrow5%rls+D&Rt=ILOuqW-n)@l3z@=bUNaQDlMdH6(dXk$-2 z%4)8~m;PMh?Pu?STTgHHUW@iSCDYP46N}P9=AwdjPq{~ZjWU6#LKK^kOae*%o zd1Pslj0ctp*~A_v>VPZQMtq!LE&vyiMb-wOf|8C*-`2>~Y_W)uO>JF7q3V6Z>K{U< zO%jWV2@vuZcRoc61t2#@EZI7rMf;VwU8r_3H364O)3K5GtI!6Gmx|zRv0JFoJrm$A zF!;LM`6dwmYDx{>9=-}fV|>y*-+|B1%+pC6J|nRn1|1(HUPK#NmPB_ga^iS1k14zG;>ii4iv3{R+UW2?(YB zW1|9h*EC&+JANSh>c( z=v{a;(i+70B=0}rUQ#Ne+6M$?hCLrwlI}I799{l=!(a9q6r`1_`wY?@$YRH4%8Z&Y zz2N1?l2+d>Er~13fi8ArB-D^J{@B!(JFhP_*n7YBNN6*#CG4$U(4#w0v+bDA3KuCu zC2{j$p%;4G9~zK?A8`A&H6u4zEA^>EdoY*F$85qB9qZ|MO9v23Q1l#;Tfew!+HmTM zUxibp1_#Q{8J+`9KO_N7;#}X?3te5W+Xi7&$s$$);QGzN2F8%^?M9z>bE&3~`ayi2 zio2^ksd-v*hxGI5BIcsqOP$HOC0JL2)eu5T!0Nq+ozEk!Zqc%^ zu#jit!*3t}Mb~pyFWmTcn38M>_$#$fW6z+Mqwptz<$;1(dlC+0(#dM-kBF37?3AR# z6rJDNt(uccpe?vPXh^@QX>Nb{rc%|+i;t8mWlH$yhb?$uhoKBPz9SQ#cQaGs$ej_E zX-OfYn=f<4zLz4TJVcM0o~ir_{V*H$CJV4_l;$oT@(N#g<+TLgBh&6P{+;S2aUN{PNL zhA1Xf?8lR0hG7WfBeyrl)?6my*w0?HdyD!X?G@&{Lfc$;Zg2vzLc7hM;B=gj`w}Xx zCIHa9n46LWXB+K#Ln&;xVc^&0)CaR2FrefRQww7VRm~4#me5Xg_no;0k8+``5xCdz zzF@AxB5B4!KveZ)qqr2~{Ou(~{&m)6Hb4x0Me0%UnMdi}!(d;B4;Qp&Ko`S5dkM5ZbI?Fg04QhrsO9RTy%va^NfIgFMq|0y_q7tXHWCjD^Gq@nVp zV$WUTE*dc;YqR7?G~AP^%Zr`OXO&1Af@(^mDXf4}@fhZ8?Pmzi*?tQi(afxjQ~08F zbE_o(dGlFzg)bgyXO-PXhRO*Zg#Grc<~N_J2S!HD;}}~GUUyVhcY`s9r>nFldZXUe)8l&X zI^E%0_^pfL>(yRetl!2_f;A^454N)nx?1>btwzK)DXw$^FKDay#LW({a?#`VhHIV0 z9C?v!N<&uG*N|C;9aXBy4%9VBamgAK!T2l=_#3#B+hFjhFyV$I$< z!KiDcaziJZ?%0i+@s*B^`n7dJ&~=-Gzn8VbtKd)7FuC1>*pUg%CGQx)m^JJD^emd6 zJ>|m2Tm_{B#*2PaVi5b9-bggkO^%;W+I+ElXAzwH^qMMLh~oqxNJQLt@Gh_CeWlIe zu)&o6saBV&5E5GyVoZxd%Cic;xW~$FKiIR~+`U#^_k!))=zqQ zd>5`DGbv-1u>x-C*eogEtn95iv%|EP!ezJH>=xgj&=^(sDFAj%AlyQ$J~1hYlvhQC5$e=la{yx8ugvbGde9jLSa zY22I%)#T_+%&%&4+5NUF-8}_HCJ5BO z=H_^aG?L*mSmSi8ter^xyxhT7@~wRT3K{HO**;#iK}DGP!RY%$F%=$`|BtQ}&zrq2 zO{y603&3AfKfXlKAh!SOMbox#O<%wISLVl1BB|ChMaCX5toew||1qVFE2kH#>`B8g_+|qQlz^unN(&Q}z$w4N9rn%_490WCa?|WFH*AEU0{IIqhI<~D77DUWYL*o^iP>IFW+RUl0GeGP8v}WV{&j<~Dq}=oGh>i7hAJMB0KcXkCmchNNKJE;ZEhdUF z8IVqG_`w*yCyDfXe(rgbM&4=ICA}WTQPy%;odD6VK!094U|_*zT;GR3a`;erQQpf4 zxWgQXjzdv*&X*tUIc(mk<< z$K!4`7lE+rhmTVj#)k^qxQ@thLkXf*hHuF%%1ev|&na6eEeyw7Jg#n2Ot;fIlOu&A z1_+E&w~G~zwN0^G|1Bmy?^VeS=)#{s39@;?loPw^tMvI8mrGOq_lMAn;!x@py}IHBGEqN$MPT!2IIipSr*diR71cpI3GU;_pI*{zs~S?M&!4yRL%>2* z)aW+2@I5X(o>^UcjfB>1KnosgSyCMQQ_HN$GVAc*ikasFerWp20W@JdbQNU{K#0!5 z(Tk^On?xYr&FVvcb6(@`LyArnG8Cfddw%PoSJ$`IUMS>Upi+o)jORJa@TCvIr=yId zwEB!@d?f=_CE1-Pvxr<^XQOF?3eI^e+bzL&hvu;H!8il|zT>@SZ}<{v+m{u}3*c>a zylnXBOMgvMdqE2;f#;7w)a->)2J2Gzeirv>v_uFP(g14$ULxt>@zcn@ADXy38xOwk zZd+rYl3YvR?D4$W1n=871BL_%cUh<>PONHiG9_11|3BD-F++HBVsHOwP4Cb zF<(KKN(UwD5o#o3{{FG0?Xe8m*#ObVJCkC{z1ofk@(dJbX;!4P5u}}$z13E@pNeU= zu)h(TWnC1TM|r-bPg+8q!hnLJ{Al@26V#=Zar^>+!yW3qwfCsUXkIGa8!_3;lo~6~KIpbYXuy zswbgcu7z_u%4V_Lwui&H>eP{58cOWs=+FUY_uVNgoAJ zz}cqR5bw(+Z%e|)x*N^=E@U&EUBW;1e7@F4IRetmtOUj{)u0JdfcJum#%o^5BrxQh z5pa#ROs}5g$-X#9ykBn_q*(7Sh4mVdw85Yci!DJvX3g_HnSbE zXwX~?rO6V}-GLEGk(JpgYZxKs*_t6Q7Bwe2R|L;JK`2~5=Oh^F9rbQ;`nWC^G^e@b zd{D9w2lU_yuELiuY3-Hu?6HX5mo>rAN!f0Bf|bEz~LNUZY;r0T34Dk9x+C zqrjEhYwBO-9dy{?qi(OA5Dkoixja;3OA1q2aAa@A_Tz#;IrrEdSLvV^Fz8lB z&{ea*$!QJ{A`ZGexUU?@6V!G9I?yyN5xzNb6i3|%);jnt3X=9K@-q3Jh}OTYR8d*< zp9DPIy8A$VACl|eMhGt2JL7Scb-h-%zb{kHk9pZtK>NPtD(L_?)*%-Zau$}HCQgjA z=@|C4Rd)H(EUP7X27OKo^BSN@_IWp!GM@accOg@v)ZL$g;jvy;?5Vx8@M7?MfSJ0|YlmW$nQa61Gwv23Hi9vaNDD0>S$<)?XDs zZ=(0;YZT*4O>y2^dP})6k@kox<9$t=br-J>t&9_{S&K=|WXi@@A>Q&I`m{YazB&`6 z9^t=Hrl=k5OmF!4tRS8-y_T>fcQKgpRTZhV86N<({2X_qnVr~nho6p17UD{#V9Ka(y?`LZxQvrM1-U{Y_` zuNEq+An&laIWAc)Z~(heLJ|G7)wFvSHj;w>YXJK{Pnh+1W&7@b5@u@?N!944X%yLM4 z1WqQoT~HJDy|hTqLY9ugB<5`=4CK?>nXADKcn8`{?L?JKc6}32>}{`A`WxAiMSUIfV7(stXt(w zH|vAa)LCG)Li$&!l`9T5oJXQFSH5@<%^J>9)%#h^u!t8UW8ii&4vu_HOI z5+2a-N$@{oXTcoJ@cQ@(R{G80PN-ZuZ=*?cm>-YsbZUvmtxBoDH>BkgjW`+5^5ZT? zL)A)<#kbTUh)HYrN$_+bcgJ$*(`=c@yxTO#1cm2K6f6UUC+5Iz)2HsJN%AH?yttD% zb>SH5(_&-k-6|r*MK2rLA8?x&b(*whVhv|_lCHRR5p2fp8PK&S>L>6bk8k@k(of9u z2b6CXy^9~jMZMjyK7sHZz#Jnup@_pe)BJ+7=Lbn!`^LG6k_{`oT3(dpq< zYnIObcb5^ucp{ud^x)|Y`_o(ApqLkpq4Km*Y*s25gI=6beJg3{yrZW`-6h@dNnG6} zqqVB+FWlu%0vW9505^J5XAokC<9T%NEOdSvY@GM=T{kD60ad+zrfp$%3SV*&D4GYR zH(Xj`T3VZUL7LjtT=&E=l*6GXf_?bq6`L%l%6>LQCtshgq8pj9?b$B(x3x>eP&{o0 z%aSeNip8v1u7E zQypOE*O6=&pNL6Rwg1pe#wD_yYpRxes^NvqS+5r8%~!S^mn&zGN>AO(*q(Wv@B>rA zmaDwsp?(rvW(h#&+GP0pGx5O@u6c|7@^~mIo5*bQ(wBP>Kn@~>5$aIIHI(OU>?SL8 z3CE!!^}l-{wsCPT-_w5M5{V)yv1sB4Re>%!b8%s&$w8JCx+Fs%Mi(Ae>y+{*vfZgp zV?VP!_wgW-6E96?(D_O@n2(zV7n5V(#KNGU6{WazjQdu5rgrD;sdYcZJ@~TX=7=KT z?Fix=%gzjDg_grocT{jqlQ7@fnsYhN&{Lc4b$DtyE^HKAU#SruO#Rtip1EAOXu+E> z8Rv=9-uXP%T~<7s^UyooF$n8nQEi1j(XPlBTBv&u8hyN(2adpH6pJ@8{Vz^?X?lhe z#xME!?n8_t&4$AXC$6L>VVSEGT7FBWa`5}yU?S558{A*7-oXIdtD3FIypV8jQNO%M;^L|SSG!bKUE_W?Nl|K9yGm(0Osr5^s`zpKB{C@Q zMfUUO8wUKfV1J;yMl6J6hv-7(8mtuRr`Q?QU-!N=bXc@KQ~sFs24v`)gnF-z(6iw5 zFmbnN9x>HuPNL;ZH@pOGzg>AC4HkXShdL*=KGqiEaWum?)CC$VxRPcw#ZE%!VUQIr zBIGR>^VUEU2`2X)dythgwCFMuqd&3oAZwQ3MK+wmQur(&O9$@(@*>G_oHVV51Uy zB%to+FutF%rD2{2LS_?juU(FAHaIIyQ(d(>MV&)K$-~b`%Q&VQERKSMh{a(uB~#}uU6$ZrKsV)UzccHsglCRVBxLK?eMtqGYw7i z?0oj29?}9N`F|qfo++Lo8#?K&K@;iQevvY%f`!L0A z?=CKg()&)^t(SWi%>yvFf|hNf18(-|xl(iWj`ID0D`I;7x`(F`F@BNW;MRS7vpW*= z0v^7JeL(=LepOAY;U4Ny!29Ud-stNi+dF8Pk_8)sr(jS_3l!cji&<_8+qztr#q=PL zZ9{$iav$JI_0xAs+2nLNz+(MtYu=Wg$!NvWYZE_dtt2Ai>l?r1p}TJpFVUu0L2Iot zU$+_yeF4yw(Gya)EX14wESuOx69rrlupS#$oEUXTL2R|JjowXty29U) zi!kyz079I>le-U$#qOz;k#z2+nUwPd(aQ8Z`7VGyL$TI0;LoD)?_Vg@%OiiLO>E3GiNKSZ4}913wmnR z`{n!KCm&94)=Re)+Vg6p_Q6hoyQc1jk19G_rX?Tn&gDu8b-K4%J4uThT+5k-^@15> z962`QN}Hdh%2CVhB#@HvcGEE;YnqeIRYae2WGtQ-Yu+_(wjhxG&X}wz+FqpFfljIi z3Ld}tRB-)sd;}8 zkAKBX0RO+@FUl|Ty8pY=?w^!DzDMxq`yYH9`Tnx+?(ay1-7m!75>{aZ&zJSDHkH4_2Y=ce{sV~b-=>wn<1Chbef{6# zuXFw9y2|jEx@yM$&$xe^D*le6O8aZ2{j(DPf8kjFf=l`T!~NUC@pmr6tkA!1j^)f> zH_M+oe!rxD)ZD*1J^o&*(EphGzrK&ZE0F2@GMe^>BVQ>Nb))cx!a{L^*)cR~OA z%zr8P)1v8j6(OX8|0;*S$G@xit3|-?D#|4PQx$(22K>(NHu}Z?GnNbgI{rKVuj>YX z=hMjjH~jzU6#Xv2llE6t_%rIA{~gRj{klg{yK>NJD$?&KgIv=kpAxq2&#V(|BP#& w{#n6aJH)>$P;vZE75vsc{$0YKKMH@3TB^8se>`T%e!dER_QfB0{BiXE0H|>SVE_OC literal 0 HcmV?d00001 diff --git a/fishy/__init__.py b/fishy/__init__.py index 205aa06..b7de9cf 100644 --- a/fishy/__init__.py +++ b/fishy/__init__.py @@ -1,2 +1,2 @@ from fishy.__main__ import main -__version__ = "0.2.0" +__version__ = "0.2.3" diff --git a/fishy/__main__.py b/fishy/__main__.py index 2d69cb9..cc00c03 100644 --- a/fishy/__main__.py +++ b/fishy/__main__.py @@ -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__": diff --git a/fishy/icon.ico b/fishy/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b53c4aec88c5e853cf168614a50441ac04bcf59d GIT binary patch literal 105721 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 literal 0 HcmV?d00001 diff --git a/fishy/systems/__init__.py b/fishy/systems/__init__.py index 85c0a39..cc3a7e3 100644 --- a/fishy/systems/__init__.py +++ b/fishy/systems/__init__.py @@ -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 diff --git a/fishy/systems/auto_update.py b/fishy/systems/auto_update.py new file mode 100644 index 0000000..b443710 --- /dev/null +++ b/fishy/systems/auto_update.py @@ -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)) diff --git a/fishy/systems/config.py b/fishy/systems/config.py index 025a044..42de830 100644 --- a/fishy/systems/config.py +++ b/fishy/systems/config.py @@ -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): diff --git a/fishy/systems/fishing_event.py b/fishy/systems/fishing_event.py index 16f765a..7ecb0c3 100644 --- a/fishy/systems/fishing_event.py +++ b/fishy/systems/fishing_event.py @@ -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) diff --git a/fishy/systems/globals.py b/fishy/systems/globals.py index d4b8c05..f5a0937 100644 --- a/fishy/systems/globals.py +++ b/fishy/systems/globals.py @@ -5,5 +5,3 @@ class G: fishCaught = 0 totalFishCaught = 0 stickInitTime = 0 - debug = False - arguments = {} diff --git a/fishy/systems/gui.py b/fishy/systems/gui.py index 739a056..793d2c2 100644 --- a/fishy/systems/gui.py +++ b/fishy/systems/gui.py @@ -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) diff --git a/fishy/systems/helper.py b/fishy/systems/helper.py index dd6e7a3..78e686c 100644 --- a/fishy/systems/helper.py +++ b/fishy/systems/helper.py @@ -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") diff --git a/fishy/systems/window.py b/fishy/systems/window.py index 862fe7d..adb5298 100644 --- a/fishy/systems/window.py +++ b/fishy/systems/window.py @@ -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: """ diff --git a/requirements.txt b/requirements.txt index 5f0ecd9..e82d9d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,8 @@ -docopt +imutils numpy -pywin32 -pynput opencv_python Pillow -imutils +pypiwin32 +ttkthemes pyautogui -pytesseract -pypiwin32 \ No newline at end of file +requests \ No newline at end of file diff --git a/setup.py b/setup.py index 41ca024..27e426c 100644 --- a/setup.py +++ b/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 ) \ No newline at end of file