# Go Watch [![Build Status](https://drone.broodjeaap.net/api/badges/broodjeaap/go-watch/status.svg)](https://drone.broodjeaap.net/broodjeaap/go-watch) A change detection server that can notify through various services written in Go # Intro GoWatch works through filters, a filter performs operations on the input it recieves. Here is an example of a 'Watch' that calculates the lowest and average price of 4090s on NewEgg and notifies the user if the lowest price changed: ![NewEgg 4090](docs/images/newegg_4090.png) Note that everything, including scheduling/storing/notifying, is a `filter`. `Schedule` is a [cron](#cron) filter with a '@every 15m' value, so this will run every 15 minutes. `NewEgg Fetch` is a [Get URL](#get-url) filter with a 'https://www.newegg.com/p/pl?N=100007709&d=4090&isdeptsrh=1&PageSize=96' value, it's output will be the HTTP response. `Select Price` is a [CSS](#css) filter with the value '.item-container .item-action strong[class!="item-buying-choices-price"]' value, it's output will be the html elements containing the prices. An [XPath](#xpath) filter could also have been used. `Sanitize` is a [Replace](#replace) filter, using a regular expression ('[^0-9]') it removes anything that's not a number. `Avg` is an [Average](#average) filter, it calculates the average value of its inputs. `Min` is a [Minimum](#minimum) filter, it calculates the minimum value of its inputs. `Store Avg` and `Store Min` are [Store](#store) filters, they store its input values in the database. `Diff` is a [Different Than Last](#different-then-last) filter, only passing on the inputs that are different then the last value stored in the database. `Notify` is a [Notify](#notify) filter, if there are any inputs to this filter, it will execute a template and send the result to a user defined 'notifier' (Telegram/Discord/Matrix/etc). # Filters ## Cron ## Get URL ## Get URLs ## CSS ## XPath ## JSON ## Replace ## Match ## Substring ## Contains ## Store ## Notify ## Math ### Sum ### Minimum ### Maximum ### Average ### Count ### Round ## Condition ### Different Than Last ### Lower Than Last ### Lowest ### Lower Than ### Higher Than Last ### Highest ### Higher Than ## Lua ## type script compilation `tsc static/*.ts --lib es2020,dom --watch --downlevelIteration` # Dependencies The following libaries are used in Go-Watch: - [Gin](https://github.com/gin-gonic/gin) for HTTP server - [multitemplate](https://github.com/gin-contrib/multitemplate) for template inheritance - [Cascadia](https://pkg.go.dev/github.com/andybalholm/cascadia) for CSS selectors - [htmlquery](https://pkg.go.dev/github.com/antchfx/htmlquery) for XPath selectors - [validator](https://pkg.go.dev/github.com/go-playground/validator/v10@v10.11.0) for user user input validation - [tgbotapi](https://pkg.go.dev/github.com/go-telegram-bot-api/telegram-bot-api/v5@v5.5.1) for Telegram - [cron](https://pkg.go.dev/github.com/robfig/cron/v3@v3.0.0) for job scheduling - [viper](https://pkg.go.dev/github.com/spf13/viper@v1.12.0) for config management - [gjson](https://pkg.go.dev/github.com/tidwall/gjson@v1.14.2) for JSON selectors - [gopher-lua](https://github.com/yuin/gopher-lua) for Lua scripting - [gopher-lua-libs](https://pkg.go.dev/github.com/vadv/gopher-lua-libs@v0.4.0) for expanding the Lua scripting functionality - [net](https://pkg.go.dev/golang.org/x/net) for http fetching - [gorm](https://pkg.go.dev/gorm.io/gorm@v1.23.8) for database abstraction - [sqlite](https://pkg.go.dev/gorm.io/driver/sqlite@v1.3.6) - [postgres](https://github.com/go-gorm/postgres) - [mysql](https://github.com/go-gorm/mysql) - [sqlserver](https://github.com/go-gorm/sqlserver) - [bootstrap](https://getbootstrap.com/)