From a6c1b04dae1f63de8f107b61d40a3c46b754375b Mon Sep 17 00:00:00 2001 From: Avii Date: Thu, 13 Nov 2025 14:43:59 +0100 Subject: [PATCH] inital commit0 --- fishing_target.png | Bin 0 -> 978 bytes go.mod | 37 +++++++++++++ go.sum | 63 ++++++++++++++++++++++ main.go | 132 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 232 insertions(+) create mode 100644 fishing_target.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/fishing_target.png b/fishing_target.png new file mode 100644 index 0000000000000000000000000000000000000000..ee41c4e75ac0cb37d1020a9ab47f73ab71e5d769 GIT binary patch literal 978 zcmV;@11EX>4Tx04R}tkv&MmKpe$iQ>CI6L4!zf$WWc^q9Ts93Pq?8YK2xE%tybVNkfw2 z;wZQl9Q;_UI=DFN>fkB}f*&A`PELw0QsV!TLW>v=j{EWM-sA2az%?q0W_85@O}EW- zG9hGht3v1%eTZNX!{8;wGUh}v1>f;?j{sZmVl2!5+@GUg&07i(5QyW7VcNtS#50?= z!FZpTS4xsfd`>)J(glehnJ#<$#<=J*$1-^{lb$E$iG^YZ%N?wgOpSP&II3zo<#Sn& zRmNM4wMtEC-IKjAoYz;DnND*QNi1RsA_T~&p^OS_#Aww?v5=Z+(5ySo_p#$NPk`VvaHY5X)dn#8NqW7l zMUQ}iZQ$a%t;u`91D!oeD0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbO zyh%hsR4C5{!Ap+QFc<(}KYlxjo2G4&wwe($8X>Xd0vv$@fP{oN#ax0Da1_=fA;f|W zAi-)hh(V=I^Nth8PHespzkKob>gn@tG~Dxe$g}LRDvtmxNiPLohe9mFNY(X^U*B%g z$0unN1q5Jo#W|4Cn7J7n*ER*EEKV+Cv0aH})waL0`#+EO@7JF$l9Ur%)g444z!)c5+Z-{rK~srq})51EUc*V=W*|D1^kpxyTq}yJR;_R!s(w zEm}34A5K!eF`qGI!(;%Hy-yRLt^zIs4q9nzZC0N1a=?gEf=1cNzI!!(LD>1!?UoC{ zso>aW&Qatj2F^HVJYXx22iDp~c6r~u(_a}-O0b}W5|^$#4m9#XfSVnHeY_7BAwp=- zb0KA37u=ca?IvCVL5N^P-Bh*1ptUp>dBmsWKWl{Y`%u;9JOBUy07*qoM6N<$f|Xdl AN&o-= literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0da5199 --- /dev/null +++ b/go.mod @@ -0,0 +1,37 @@ +module git.avii.nl/aviinl/fishbot + +go 1.25.1 + +require ( + github.com/ernyoke/imger v1.0.0 + github.com/vova616/screenshot v0.0.0-20220801010501-56c10359473c +) + +require ( + github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect + github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect + github.com/ebitengine/purego v0.8.3 // indirect + github.com/gen2brain/shm v0.1.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-vgo/robotgo v0.110.8 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/jezek/xgb v1.1.1 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/robotn/xgb v0.10.0 // indirect + github.com/robotn/xgbutil v0.10.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.4 // indirect + github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/vcaesar/gops v0.41.0 // indirect + github.com/vcaesar/imgo v0.41.0 // indirect + github.com/vcaesar/keycode v0.10.1 // indirect + github.com/vcaesar/screenshot v0.11.1 // indirect + github.com/vcaesar/tt v0.20.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + gocv.io/x/gocv v0.42.0 // indirect + golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect + golang.org/x/image v0.27.0 // indirect + golang.org/x/sys v0.33.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2a5c0fb --- /dev/null +++ b/go.sum @@ -0,0 +1,63 @@ +github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= +github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U= +github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU= +github.com/ebitengine/purego v0.8.3 h1:K+0AjQp63JEZTEMZiwsI9g0+hAMNohwUOtY0RPGexmc= +github.com/ebitengine/purego v0.8.3/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ernyoke/imger v1.0.0 h1:v+vnOpZwCfet5AUruwhN54g9v8CnhKOB3ZCsMIa5AZ0= +github.com/ernyoke/imger v1.0.0/go.mod h1:Ft4UQ3taMpn8EVVLWRlT0ijOvMTKZZqhXXR4VzCsAT4= +github.com/gen2brain/shm v0.1.1 h1:1cTVA5qcsUFixnDHl14TmRoxgfWEEZlTezpUj1vm5uQ= +github.com/gen2brain/shm v0.1.1/go.mod h1:UgIcVtvmOu+aCJpqJX7GOtiN7X2ct+TKLg4RTxwPIUA= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-vgo/robotgo v0.110.8 h1:tWoUyqlZgDJ61bQju3WGSb/NIIfNV4TkYL3GFeWcHio= +github.com/go-vgo/robotgo v0.110.8/go.mod h1:45w33PzprtFncpw4cAt9SzMtSY9XnVfotu+RrCVN8JE= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= +github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgb v0.10.0 h1:O3kFbIwtwZ3pgLbp1h5slCQ4OpY8BdwugJLrUe6GPIM= +github.com/robotn/xgb v0.10.0/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw= +github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= +github.com/shirou/gopsutil/v4 v4.25.4 h1:cdtFO363VEOOFrUCjZRh4XVJkb548lyF0q0uTeMqYPw= +github.com/shirou/gopsutil/v4 v4.25.4/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= +github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog= +github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vcaesar/gops v0.41.0 h1:FG748Jyw3FOuZnbzSgB+CQSx2e5LbLCPWV2JU1brFdc= +github.com/vcaesar/gops v0.41.0/go.mod h1:/3048L7Rj7QjQKTSB+kKc7hDm63YhTWy5QJ10TCP37A= +github.com/vcaesar/imgo v0.41.0 h1:kNLYGrThXhB9Dd6IwFmfPnxq9P6yat2g7dpPjr7OWO8= +github.com/vcaesar/imgo v0.41.0/go.mod h1:/LGOge8etlzaVu/7l+UfhJxR6QqaoX5yeuzGIMfWb4I= +github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw= +github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= +github.com/vcaesar/screenshot v0.11.1 h1:GgPuN89XC4Yh38dLx4quPlSo3YiWWhwIria/j3LtrqU= +github.com/vcaesar/screenshot v0.11.1/go.mod h1:gJNwHBiP1v1v7i8TQ4yV1XJtcyn2I/OJL7OziVQkwjs= +github.com/vcaesar/tt v0.20.1 h1:D/jUeeVCNbq3ad8M7hhtB3J9x5RZ6I1n1eZ0BJp7M+4= +github.com/vcaesar/tt v0.20.1/go.mod h1:cH2+AwGAJm19Wa6xvEa+0r+sXDJBT0QgNQey6mwqLeU= +github.com/vova616/screenshot v0.0.0-20220801010501-56c10359473c h1:mqgl+NQgzZ30EX7oA3uNIlPn6dAgG6sThBiUodUzZpU= +github.com/vova616/screenshot v0.0.0-20220801010501-56c10359473c/go.mod h1:gjlNhAXON0uGGilpsAZpMx5bN1ZVavUlJETHif7w4HQ= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +gocv.io/x/gocv v0.42.0 h1:AAsrFJH2aIsQHukkCovWqj0MCGZleQpVyf5gNVRXjQI= +gocv.io/x/gocv v0.42.0/go.mod h1:zYdWMj29WAEznM3Y8NsU3A0TRq/wR/cy75jeUypThqU= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= +golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w= +golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= diff --git a/main.go b/main.go new file mode 100644 index 0000000..fb6cc87 --- /dev/null +++ b/main.go @@ -0,0 +1,132 @@ +package main + +import ( + "embed" + "image" + _ "image/png" + "time" + + "github.com/go-vgo/robotgo" + "github.com/vova616/screenshot" + "gocv.io/x/gocv" +) + +const start_x = 2560 +const fish_key = "8" + +//go:embed fishing_target.png +var s embed.FS + +func check(e error) { + if e != nil { + panic(e) + } +} + +func imageToRGBA(img image.Image) []uint8 { + sz := img.Bounds() + raw := make([]uint8, (sz.Max.X-sz.Min.X)*(sz.Max.Y-sz.Min.Y)*4) + idx := 0 + for y := sz.Min.Y; y < sz.Max.Y; y++ { + for x := sz.Min.X; x < sz.Max.X; x++ { + r, g, b, a := img.At(x, y).RGBA() + raw[idx], raw[idx+1], raw[idx+2], raw[idx+3] = uint8(r), uint8(g), uint8(b), uint8(a) + idx += 4 + } + } + return raw +} + +func main() { + mask := gocv.NewMat() + mask.SetTo(gocv.NewScalar(255, 255, 255, 255)) + + fishing_target_src, err := s.Open("fishing_target.png") + check(err) + defer fishing_target_src.Close() + + fishing_target, _, err := image.Decode(fishing_target_src) + check(err) + + fishing_target_mat, err := gocv.NewMatFromBytes(fishing_target.Bounds().Max.Y, fishing_target.Bounds().Max.X, gocv.MatTypeCV8UC4, imageToRGBA(fishing_target)) + check(err) + + ticker := time.Now() + start := time.Now() + + fishing := false + mouse_set := false + block_everything := false + + // window := gocv.NewWindow("Hello") + + for { + result, loc, bobber := findBobber(fishing_target_mat) + + // window.IMShow(result) + // window.WaitKey(1) + + elapsed := time.Since(start) / time.Second + + if time.Since(ticker)/time.Second >= 1 { + ticker = time.Now() + println(elapsed) + } + + if !block_everything && (!fishing && elapsed >= 5) { + println("Start fishing") + // robotgo.KeyDown("CTRL") + robotgo.KeyPress(fish_key) + // robotgo.KeyUp("CTRL") + time.Sleep(time.Duration(100 * time.Millisecond)) + + mouse_set = false + fishing = true + start = time.Now() + } + + if !block_everything && (!mouse_set && fishing && bobber && elapsed >= 1) { + println("Moving to bobber") + robotgo.Move(loc.X+start_x, loc.Y) + time.Sleep(time.Duration(100 * time.Millisecond)) + + mouse_set = true + start = time.Now() + } + + if mouse_set && fishing && !bobber && elapsed >= 1 { + block_everything = true + println("Stop fishing") + robotgo.MouseDown("right") + time.Sleep(time.Duration(100 * time.Millisecond)) + robotgo.MouseUp("right") + time.Sleep(time.Duration(100 * time.Millisecond)) + block_everything = false + + fishing = false + start = time.Now() + // os.Exit(0) + } + result.Close() + } +} + +func findBobber(target gocv.Mat) (gocv.Mat, image.Point, bool) { + img, err := screenshot.CaptureRect(image.Rect(start_x, 0, 2560+start_x, 1440)) // *image.RGBA + if err != nil { + panic(err) + } + mat, _ := gocv.NewMatFromBytes(img.Bounds().Max.Y, img.Bounds().Max.X, gocv.MatTypeCV8UC4, img.Pix) + defer mat.Close() + result := gocv.NewMat() + defer result.Close() + err = gocv.MatchTemplate(mat, target, &result, gocv.TmCcoeffNormed, gocv.NewMat()) + check(err) + result2 := gocv.NewMat() + // defer result2.Close() + + gocv.Threshold(result, &result2, 0.8, 1, gocv.ThresholdBinary) + _, _, _, max_loc := gocv.MinMaxLoc(result2) + + return result2, max_loc, (max_loc.X > 0 && max_loc.Y > 0) +}