diff --git a/main.go b/main.go
index aef5923..6eebde8 100644
--- a/main.go
+++ b/main.go
@@ -72,13 +72,17 @@ func (web Web) watchView(c *gin.Context) {
var connections []FilterConnection
web.db.Model(&FilterConnection{}).Where("watch_id = ?", watch.ID).Find(&connections)
+ var values []FilterOutput
+ web.db.Model(&FilterOutput{}).Where("watch_id = ?", watch.ID).Find(&values)
+
buildFilterTree(filters, connections)
- fillFilterResults(filters)
+ processFilters(filters, web.db)
c.HTML(http.StatusOK, "watchView", gin.H{
"Watch": watch,
"Filters": filters,
"Connections": connections,
+ "Values": values,
})
}
@@ -219,7 +223,7 @@ func main() {
}
db, _ := gorm.Open(sqlite.Open(viper.GetString("database.dsn")))
- db.AutoMigrate(&Watch{}, &Filter{}, &FilterConnection{})
+ db.AutoMigrate(&Watch{}, &Filter{}, &FilterConnection{}, &FilterOutput{})
//bot, _ := tgbotapi.NewBotAPI(viper.GetString("telegram.token"))
diff --git a/models.go b/models.go
index cef025d..d35847b 100644
--- a/models.go
+++ b/models.go
@@ -1,5 +1,7 @@
package main
+import "time"
+
type Watch struct {
ID uint `form:"watch_id" yaml:"watch_id"`
Name string `form:"watch_name" yaml:"watch_name" binding:"required" validate:"min=1"`
@@ -12,7 +14,7 @@ type Filter struct {
Name string `form:"filter_name" yaml:"filter_name" json:"filter_name" binding:"required" validate:"min=1"`
X int `form:"x" yaml:"x" json:"x" validate:"default=0"`
Y int `form:"y" yaml:"y" json:"y" validate:"default=0"`
- Type string `form:"filter_type" yaml:"filter_type" json:"filter_type" binding:"required" validate:"oneof=url xpath json css replace match substring math"`
+ Type string `form:"filter_type" yaml:"filter_type" json:"filter_type" binding:"required" validate:"oneof=url xpath json css replace match substring math store"`
Var1 string `form:"var1" yaml:"var1" json:"var1" binding:"required"`
Var2 *string `form:"var2" yaml:"var2" json:"var2"`
Var3 *string `form:"var3" yaml:"var3" json:"var3"`
@@ -27,3 +29,11 @@ type FilterConnection struct {
OutputID uint `form:"filter_output_id" yaml:"filter_output_id" json:"filter_output_id" binding:"required"`
InputID uint `form:"filter_input_id" yaml:"filter_input_id" json:"filter_input_id" binding:"required"`
}
+
+type FilterOutput struct {
+ ID uint `yaml:"filter_output_id" json:"filter_output_id"`
+ WatchID uint `yaml:"filter_output_watch_id" json:"filter_output_watch_id"`
+ Name string `yaml:"filter_output_name" json:"filter_output_name"`
+ Value string `yaml:"filter_output_value" json:"filter_output_value"`
+ Time time.Time `yaml:"filter_output_time" json:"filter_output_time"`
+}
diff --git a/scraping.go b/scraping.go
index 2542a4f..ef5fc64 100644
--- a/scraping.go
+++ b/scraping.go
@@ -10,14 +10,16 @@ import (
"regexp"
"strconv"
"strings"
+ "time"
"github.com/andybalholm/cascadia"
"github.com/antchfx/htmlquery"
"github.com/tidwall/gjson"
"golang.org/x/net/html"
+ "gorm.io/gorm"
)
-func fillFilterResults(filters []Filter) {
+func processFilters(filters []Filter, db *gorm.DB) {
processedMap := make(map[uint]bool, len(filters))
for len(filters) > 0 {
filter := &filters[0]
@@ -33,12 +35,12 @@ func fillFilterResults(filters []Filter) {
filters = append(filters, *filter)
continue
}
- getFilterResult(filter)
+ getFilterResult(filter, db)
processedMap[filter.ID] = true
}
}
-func getFilterResult(filter *Filter) {
+func getFilterResult(filter *Filter, db *gorm.DB) {
switch {
case filter.Type == "gurl":
{
@@ -101,7 +103,10 @@ func getFilterResult(filter *Filter) {
}
}
}
-
+ case filter.Type == "store":
+ {
+ storeFilterResult(filter, db)
+ }
default:
log.Println("getFilterResult called with filter.Type == ", filter.Type)
}
@@ -386,3 +391,24 @@ func getFilterResultRound(filter *Filter) {
}
}
}
+
+func storeFilterResult(filter *Filter, db *gorm.DB) {
+ var previousOutput FilterOutput
+ db.Model(&FilterOutput{}).Order("time desc").Limit(1).Find(&previousOutput, "watch_id = ? AND name = ?", filter.WatchID, filter.Name)
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ if previousOutput.WatchID == 0 {
+ previousOutput.Name = filter.Name
+ previousOutput.Time = time.Now()
+ previousOutput.Value = result
+ previousOutput.WatchID = filter.WatchID
+ db.Create(&previousOutput)
+ } else {
+ previousOutput.Time = time.Now()
+ previousOutput.ID = 0
+ previousOutput.Value = result
+ db.Create(&previousOutput)
+ }
+ }
+ }
+}
diff --git a/static/edit.js b/static/edit.js
index 0d322e9..55fc2f5 100644
--- a/static/edit.js
+++ b/static/edit.js
@@ -341,6 +341,33 @@ function onTypeChange(node) {
var3Div.appendChild(var3Input);
break;
}
+ case "store": {
+ var var1Input = document.createElement("input");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control");
+ var1Input.disabled = true;
+ var1Label.innerHTML = "-";
+ var1Input.placeholder = "";
+ 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);
+ }
}
}
function onMathChange(node) {
diff --git a/static/edit.ts b/static/edit.ts
index dc188fc..490867a 100644
--- a/static/edit.ts
+++ b/static/edit.ts
@@ -330,6 +330,35 @@ function onTypeChange(node: DiagramNode | null = null){
var3Div.appendChild(var3Input);
break;
}
+ case "store": {
+ let var1Input = document.createElement("input");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control")
+ var1Input.disabled = true;
+ var1Label.innerHTML = "-";
+ var1Input.placeholder = "";
+ 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";
+ var3Input.value = var3Value;
+ var3Input.classList.add("form-control");
+ var3Input.disabled = true;
+ var3Label.innerHTML = "-";
+ var3Div.appendChild(var3Input);
+ }
}
}
diff --git a/templates/watch/view.html b/templates/watch/view.html
index 9e12630..61afff2 100644
--- a/templates/watch/view.html
+++ b/templates/watch/view.html
@@ -45,6 +45,7 @@
+
@@ -141,7 +142,7 @@ function canvasInit() {
{{ .ID }},
{{ .X }},
{{ .Y }},
- {{ .Name }},
+ "{{ .Name }}",
{
type: "{{ .Type }}",
var1: "{{ .Var1 }}",
@@ -154,8 +155,15 @@ function canvasInit() {
diagrams.addConnectionById({{ .OutputID }}, {{ .InputID }});
{{ end }}
diagrams.fillParent();
+
+
+ {{ range .Values }}
+ console.log("{{ .Name }}", "{{ .Value }}", "{{ .Time }}")
+ {{ end }}
}
document.addEventListener('DOMContentLoaded', canvasInit, false);
+
+
{{ end }}
\ No newline at end of file