diff --git a/go.mod b/go.mod index edc9b6e..7b25657 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,10 @@ require ( github.com/gin-gonic/gin v1.8.1 github.com/go-playground/validator/v10 v10.11.0 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/robfig/cron/v3 v3.0.0 github.com/spf13/viper v1.12.0 github.com/tidwall/gjson v1.14.2 + github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 golang.org/x/net v0.0.0-20220722155237-a158d28d115b gorm.io/driver/sqlite v1.3.6 gorm.io/gorm v1.23.8 @@ -37,7 +39,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.2 // indirect - github.com/robfig/cron/v3 v3.0.0 // indirect github.com/spf13/afero v1.8.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect diff --git a/go.sum b/go.sum index a003cc8..1547fde 100644 --- a/go.sum +++ b/go.sum @@ -243,6 +243,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRFc9q3yYbBkB6tsm4aCwwQV/j1JQAQ= +github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= diff --git a/scraping.go b/scraping.go index 833ee1b..f993815 100644 --- a/scraping.go +++ b/scraping.go @@ -16,6 +16,7 @@ import ( "github.com/andybalholm/cascadia" "github.com/antchfx/htmlquery" "github.com/tidwall/gjson" + lua "github.com/yuin/gopher-lua" "golang.org/x/net/html" "gorm.io/gorm" ) @@ -130,6 +131,10 @@ func getFilterResult(filters []Filter, filter *Filter, watch *Watch, web *Web, d { notifyFilter(filters, filter, watch, web, debug) } + case filter.Type == "lua": + { + luaFilter(filter) + } case filter.Type == "cron": { @@ -791,3 +796,28 @@ func triggerSchedule(watchID uint, web *Web) { buildFilterTree(filters, connections) processFilters(filters, web, watch, false) } + +func luaFilter(filter *Filter) { + L := lua.NewState() + defer L.Close() + + inputs := L.CreateTable(10, 0) + for _, parent := range filter.Parents { + for _, result := range parent.Results { + inputs.Append(lua.LString(result)) + } + } + L.SetGlobal("inputs", inputs) + outputs := L.CreateTable(10, 0) + L.SetGlobal("outputs", outputs) + err := L.DoString(filter.Var1) + if err != nil { + filter.log(err) + return + } + outputs.ForEach( + func(key lua.LValue, value lua.LValue) { + filter.Results = append(filter.Results, value.String()) + }, + ) +} diff --git a/static/edit.js b/static/edit.js index cfc6229..12d38f8 100644 --- a/static/edit.js +++ b/static/edit.js @@ -469,7 +469,7 @@ function onTypeChange(node) { var1Input.value = var1Value; var1Input.classList.add("form-control"); var1Label.innerHTML = "Template"; - var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!"; + var1Input.placeholder = "{{ .WatchName }} new lowest price: {{ .Price }}!"; var1Div.appendChild(var1Input); var var2Input = document.createElement("input"); var2Input.name = "var2"; @@ -528,6 +528,37 @@ function onTypeChange(node) { var3Div.appendChild(var3Input); break; } + case "lua": { + var var1Input = document.createElement("textarea"); + var1Input.name = "var1"; + var1Input.id = "var1Input"; + var1Input.value = var1Value; + var1Input.classList.add("form-control"); + var1Label.innerHTML = "Template"; + var1Input.placeholder = "for i,input in pairs(inputs) do\n\ttable.insert(outputs, input)\nend"; + if (var1Value == "") { + var1Input.value = "for i,input in pairs(inputs) do\n\ttable.insert(outputs, input)\nend"; + } + var1Input.rows = 10; + var1Div.appendChild(var1Input); + var var2Input = document.createElement("input"); + var2Input.name = "var2"; + var2Input.id = "var2Input"; + var2Input.value = var2Value; + var2Input.classList.add("form-control"); + var2Input.disabled = true; + var2Label.innerHTML = "-"; + var2Div.appendChild(var2Input); + var var3Input = document.createElement("input"); + var3Input.name = "var3"; + var3Input.id = "var3Input"; + var3Input.value = var3Value; + var3Input.classList.add("form-control"); + var3Input.disabled = true; + var3Label.innerHTML = "-"; + var3Div.appendChild(var3Input); + break; + } } } function onMathChange(node) { diff --git a/static/edit.ts b/static/edit.ts index 048ede1..6b0d29d 100644 --- a/static/edit.ts +++ b/static/edit.ts @@ -463,7 +463,7 @@ function onTypeChange(node: DiagramNode | null = null){ var1Input.value = var1Value; var1Input.classList.add("form-control") var1Label.innerHTML = "Template"; - var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!"; + var1Input.placeholder = "{{ .WatchName }} new lowest price: {{ .Price }}!"; var1Div.appendChild(var1Input); let var2Input = document.createElement("input"); @@ -515,6 +515,39 @@ function onTypeChange(node: DiagramNode | null = null){ var2Div.appendChild(enabledSelect); var2Label.innerHTML = "Enabled" + let var3Input = document.createElement("input"); + var3Input.name = "var3"; + var3Input.id = "var3Input"; + var3Input.value = var3Value; + var3Input.classList.add("form-control"); + var3Input.disabled = true; + var3Label.innerHTML = "-"; + var3Div.appendChild(var3Input); + break; + } + case "lua":{ + let var1Input = document.createElement("textarea"); + var1Input.name = "var1"; + var1Input.id = "var1Input"; + var1Input.value = var1Value; + var1Input.classList.add("form-control") + var1Label.innerHTML = "Template"; + var1Input.placeholder = "for i,input in pairs(inputs) do\n\ttable.insert(outputs, input)\nend"; + if (var1Value == "") { + var1Input.value = "for i,input in pairs(inputs) do\n\ttable.insert(outputs, input)\nend"; + } + var1Input.rows = 10; + var1Div.appendChild(var1Input); + + let var2Input = document.createElement("input"); + var2Input.name = "var2"; + var2Input.id = "var2Input"; + var2Input.value = var2Value; + var2Input.classList.add("form-control") + var2Input.disabled = true; + var2Label.innerHTML = "-"; + var2Div.appendChild(var2Input); + let var3Input = document.createElement("input"); var3Input.name = "var3"; var3Input.id = "var3Input"; diff --git a/templates/watch/edit.html b/templates/watch/edit.html index fc0448d..941a940 100644 --- a/templates/watch/edit.html +++ b/templates/watch/edit.html @@ -83,8 +83,9 @@ - ` + +