diff --git a/.gitignore b/.gitignore index d3beee5..361ba49 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ *.a *.so +# YAML +*.yaml + # Folders _obj _test diff --git a/cmd/main/main.go b/cmd/main/main.go new file mode 100644 index 0000000..e8760f7 --- /dev/null +++ b/cmd/main/main.go @@ -0,0 +1,123 @@ +package main + +import ( + "fmt" + "log" + "os" + "time" + + "github.com/go-vgo/robotgo" + "gopkg.in/yaml.v3" +) + +type Point struct { + X int + Y int +} + +func (p Point) String() string { + return fmt.Sprintf("(%v, %v)", p.X, p.Y) +} + +func (p Point) Click() { + robotgo.Move(p.X, p.Y) + robotgo.Click("left", false) +} + +type PointGroup struct { + Name string + Points []Point +} + +type SavedGroups struct { + Groups []PointGroup +} + +func getSavedGroups(yamlFile string) *SavedGroups { + s := SavedGroups{} + inputFile, err := os.ReadFile(yamlFile) + if err == nil { // No yaml file found + err = yaml.Unmarshal(inputFile, &s) + if err != nil { + log.Fatalf("%v - Exiting", err) + } + } + return &s +} + +func addSavedGroup(s *SavedGroups) { + g := PointGroup{} + var name string + var points int + for { + name = "" + fmt.Print("If you want to add a new group of locations, enter a name. Press enter to skip. ") + fmt.Scanln(&name) + if name == "" { + break + } + fmt.Printf("How many positions are there in group %v? ", name) + _, err := fmt.Scanln(&points) + if err != nil { + fmt.Println("I haven't understood, try again...") + var discard string + fmt.Scanln(&discard) + continue + } + for i := 0; i < points; i++ { + fmt.Printf("Please move your mouse into position %v of %v (group %v)\n", i+1, points, name) + time.Sleep(2 * time.Second) + x, y := robotgo.GetMousePos() + fmt.Printf("Added point (x=%v, y=%v) to %v\n", x, y, name) + p := Point{X: x, Y: y} + g.Points = append(g.Points, p) + } + g.Name = name + s.Groups = append(s.Groups, g) + } +} + +func storeSavedGroups(s *SavedGroups, yamlFile string) { + d, err := yaml.Marshal(s) + if err != nil { + log.Fatalf("error: %v", err) + } + err = os.WriteFile(yamlFile, d, 0644) + if err != nil { + log.Fatalf("error: %v", err) + } + //fmt.Printf("--- d dump:\n%s\n\n", string(d)) +} + +func main() { + yamlFile := "SavedGroups.yaml" + s := getSavedGroups(yamlFile) + addSavedGroup(s) + storeSavedGroups(s, yamlFile) + for index, g := range s.Groups { + fmt.Printf("- Press %v to select %v\n", index+1, g.Name) + } + var choice int + for choice < 1 { + fmt.Print("Your selection: ") + _, err := fmt.Scanln(&choice) + if err != nil { + fmt.Println("I haven't understood, try again...") + var discard string + fmt.Scanln(&discard) + continue + } + } + selection := s.Groups[choice-1] + fmt.Printf("You selected %v. I'll be clicking in the following positions:\n", selection.Name) + for index, p := range selection.Points { + fmt.Printf("%v - %v\n", index+1, p) + } + for { + for _, p := range selection.Points { + p.Click() + time.Sleep(100 * time.Millisecond) + } + time.Sleep(500 * time.Millisecond) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d181f2c --- /dev/null +++ b/go.mod @@ -0,0 +1,27 @@ +module gogs.davte.it/Davte/autoclick + +go 1.19 + +require ( + github.com/go-vgo/robotgo v0.100.10 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b +) + +require ( + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect + github.com/otiai10/gosseract v2.2.1+incompatible // indirect + github.com/robotn/gohook v0.31.3 // indirect + github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 // indirect + github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 // indirect + github.com/shirou/gopsutil v3.21.10+incompatible // indirect + github.com/tklauser/go-sysconf v0.3.9 // indirect + github.com/tklauser/numcpus v0.3.0 // indirect + github.com/vcaesar/gops v0.21.3 // indirect + github.com/vcaesar/imgo v0.30.0 // indirect + github.com/vcaesar/keycode v0.10.0 // indirect + github.com/vcaesar/tt v0.20.0 // indirect + golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect + golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0bf7821 --- /dev/null +++ b/go.sum @@ -0,0 +1,52 @@ +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/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-vgo/robotgo v0.100.10 h1:bZe7AslG6oq5ops1SWUxsPfM9Z3QQvlqfA3ezxLFNO4= +github.com/go-vgo/robotgo v0.100.10/go.mod h1:7QeIpSHX7bjeXWRPxvQeKSx9mHI+3l80Ahq+CQF0C68= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= +github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= +github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= +github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= +github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/robotn/gohook v0.31.3 h1:kGX8iukJ9ensVRwRKnTtdojAMQOpa6KFnXDi4OA4RaI= +github.com/robotn/gohook v0.31.3/go.mod h1:wyGik0yb4iwCfJjDprtNkTyxkgQWuKoVPQ3hkz6+6js= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 h1:2lhSR8N3T6I30q096DT7/5AKEIcf1vvnnWAmS0wfnNY= +github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= +github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 h1:2uX8QRLkkxn2EpAQ6I3KhA79BkdRZfvugJUzJadiJwk= +github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= +github.com/shirou/gopsutil v3.21.10+incompatible h1:AL2kpVykjkqeN+MFe1WcwSBVUjGjvdU8/ubvCuXAjrU= +github.com/shirou/gopsutil v3.21.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= +github.com/vcaesar/gops v0.21.3 h1:VR7amkxVv9CQfsotkXrmMyT19dVuNTa1PM/oopJeIc0= +github.com/vcaesar/gops v0.21.3/go.mod h1:3e2EnlZTI9/44bqzRwkeZ3s0ZQwK2Cn4QPLx8Ii8Agk= +github.com/vcaesar/imgo v0.30.0 h1:ODQVX0EFJEh+WkKahCBtE0SqcDCIjl/kjiOplR0Ouh8= +github.com/vcaesar/imgo v0.30.0/go.mod h1:8TGnt5hjaMgwDByvMFIzUDSh5uSea4n1tAbSvnhvA6U= +github.com/vcaesar/keycode v0.10.0 h1:Qx5QE8ZXHyRyjoA2QOxBp25OKMKB+zxMVqm0FWGV0d4= +github.com/vcaesar/keycode v0.10.0/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= +github.com/vcaesar/tt v0.20.0 h1:9t2Ycb9RNHcP0WgQgIaRKJBB+FrRdejuaL6uWIHuoBA= +github.com/vcaesar/tt v0.20.0/go.mod h1:GHPxQYhn+7OgKakRusH7KJ0M5MhywoeLb8Fcffs/Gtg= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab h1:rfJ1bsoJQQIAoAxTxB7bme+vHrNkRw8CqfsYh9w54cw= +golang.org/x/sys v0.0.0-20211123173158-ef496fb156ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=