diff --git a/scraping.go b/scraping.go
index ef5fc64..10150e6 100644
--- a/scraping.go
+++ b/scraping.go
@@ -107,6 +107,39 @@ func getFilterResult(filter *Filter, db *gorm.DB) {
{
storeFilterResult(filter, db)
}
+ case filter.Type == "condition":
+ {
+ switch filter.Var1 {
+ case "diff":
+ {
+ getFilterResultConditionDiff(filter, db)
+ }
+ case "lowerl":
+ {
+ getFilterResultConditionLowerLast(filter, db)
+ }
+ case "lowest":
+ {
+ getFilterResultConditionLowest(filter, db)
+ }
+ case "lowert":
+ {
+ getFilterResultConditionLowerThan(filter, db)
+ }
+ case "higherl":
+ {
+ getFilterResultConditionHigherLast(filter, db)
+ }
+ case "highest":
+ {
+ getFilterResultConditionHighest(filter, db)
+ }
+ case "highert":
+ {
+ getFilterResultConditionHigherThan(filter, db)
+ }
+ }
+ }
default:
log.Println("getFilterResult called with filter.Type == ", filter.Type)
}
@@ -394,9 +427,10 @@ 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)
+ db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
for _, parent := range filter.Parents {
for _, result := range parent.Results {
+ log.Println(previousOutput)
if previousOutput.WatchID == 0 {
previousOutput.Name = filter.Name
previousOutput.Time = time.Now()
@@ -412,3 +446,185 @@ func storeFilterResult(filter *Filter, db *gorm.DB) {
}
}
}
+
+func getFilterResultConditionDiff(filter *Filter, db *gorm.DB) {
+ var previousOutput FilterOutput
+ db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ if previousOutput.WatchID == 0 {
+ filter.Results = append(filter.Results, result)
+ } else if previousOutput.Value != result {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+}
+
+func getFilterResultConditionLowerLast(filter *Filter, db *gorm.DB) {
+ var previousOutput FilterOutput
+ db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ if previousOutput.WatchID == 0 {
+ filter.Results = append(filter.Results, result)
+ } else {
+ lastValue, err := strconv.ParseFloat(previousOutput.Value, 64)
+ if err != nil {
+ log.Println("Could not convert previous value to number:", previousOutput.Value)
+ continue
+ }
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert new value to number:", result)
+ continue
+ }
+ if number < lastValue {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+ }
+}
+
+func getFilterResultConditionLowest(filter *Filter, db *gorm.DB) {
+ var previousOutputs []FilterOutput
+ db.Model(&FilterOutput{}).Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Find(&previousOutputs)
+ lowest := math.MaxFloat64
+ if previousOutputs != nil {
+ for _, previousOutput := range previousOutputs {
+ number, err := strconv.ParseFloat(previousOutput.Value, 64)
+ if err != nil {
+ log.Println("Could not convert result to number:", previousOutput.Value)
+ continue
+ }
+ if number < lowest {
+ lowest = number
+ }
+ }
+ return
+ }
+
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert result to number:", result)
+ continue
+ }
+ if number < lowest {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+}
+
+func getFilterResultConditionLowerThan(filter *Filter, db *gorm.DB) {
+ if filter.Var2 == nil {
+ log.Println("No threshold given for Lower Than Filter")
+ return
+ }
+ threshold, err := strconv.ParseFloat(*filter.Var2, 64)
+ if err != nil {
+ log.Println("Could not convert convert threshold to number:", *filter.Var2)
+ return
+ }
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert new value to number:", result)
+ continue
+ }
+ if number < threshold {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+}
+
+func getFilterResultConditionHigherLast(filter *Filter, db *gorm.DB) {
+ var previousOutput FilterOutput
+ db.Model(&FilterOutput{}).Order("time desc").Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Limit(1).Find(&previousOutput)
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ if previousOutput.WatchID == 0 {
+ filter.Results = append(filter.Results, result)
+ } else {
+ lastValue, err := strconv.ParseFloat(previousOutput.Value, 64)
+ if err != nil {
+ log.Println("Could not convert previous value to number:", previousOutput.Value)
+ continue
+ }
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert new value to number:", result)
+ continue
+ }
+ if number > lastValue {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+ }
+}
+
+func getFilterResultConditionHighest(filter *Filter, db *gorm.DB) {
+ var previousOutputs []FilterOutput
+ db.Model(&FilterOutput{}).Where("watch_id = ? AND name = ?", filter.WatchID, filter.Name).Find(&previousOutputs)
+ highest := math.MaxFloat64
+ if previousOutputs != nil {
+ for _, previousOutput := range previousOutputs {
+ number, err := strconv.ParseFloat(previousOutput.Value, 64)
+ if err != nil {
+ log.Println("Could not convert result to number:", previousOutput.Value)
+ continue
+ }
+ if number > highest {
+ highest = number
+ }
+ }
+ return
+ }
+
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert result to number:", result)
+ continue
+ }
+ if number > highest {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+}
+
+func getFilterResultConditionHigherThan(filter *Filter, db *gorm.DB) {
+ if filter.Var2 == nil {
+ log.Println("No threshold given for Higher Than Filter")
+ return
+ }
+ threshold, err := strconv.ParseFloat(*filter.Var2, 64)
+ if err != nil {
+ log.Println("Could not convert convert threshold to number:", *filter.Var2)
+ return
+ }
+ for _, parent := range filter.Parents {
+ for _, result := range parent.Results {
+ number, err := strconv.ParseFloat(result, 64)
+ if err != nil {
+ log.Println("Could not convert new value to number:", result)
+ continue
+ }
+ if number > threshold {
+ filter.Results = append(filter.Results, result)
+ }
+ }
+ }
+}
+
+func notifyFilter(filter *Filter, db *gorm.DB) {
+
+}
diff --git a/static/edit.js b/static/edit.js
index 55fc2f5..7274e97 100644
--- a/static/edit.js
+++ b/static/edit.js
@@ -367,6 +367,87 @@ function onTypeChange(node) {
var3Input.disabled = true;
var3Label.innerHTML = "-";
var3Div.appendChild(var3Input);
+ break;
+ }
+ case "condition": {
+ var conditionSelect = document.createElement("select");
+ conditionSelect.name = "var1";
+ conditionSelect.id = "var1Input";
+ conditionSelect.classList.add("form-control");
+ var differentThenLast = document.createElement("option");
+ differentThenLast.value = "diff";
+ differentThenLast.innerHTML = "Different Then Last";
+ conditionSelect.appendChild(differentThenLast);
+ var lowerThenLast = document.createElement("option");
+ lowerThenLast.value = "lowerl";
+ lowerThenLast.innerHTML = "Lower Then Last";
+ conditionSelect.appendChild(lowerThenLast);
+ var lowestEver = document.createElement("option");
+ lowestEver.value = "lowest";
+ lowestEver.innerHTML = "Lowest Ever";
+ conditionSelect.appendChild(lowestEver);
+ var lowerThan = document.createElement("option");
+ lowerThan.value = "lowert";
+ lowerThan.innerHTML = "Lower Than";
+ conditionSelect.appendChild(lowerThan);
+ var higherThenLast = document.createElement("option");
+ higherThenLast.value = "higherl";
+ higherThenLast.innerHTML = "Higher Then Last";
+ conditionSelect.appendChild(higherThenLast);
+ var highestEver = document.createElement("option");
+ highestEver.value = "highest";
+ highestEver.innerHTML = "Highest Ever";
+ conditionSelect.appendChild(highestEver);
+ var higherThan = document.createElement("option");
+ higherThan.value = "highert";
+ higherThan.innerHTML = "Higher Than";
+ conditionSelect.appendChild(higherThan);
+ conditionSelect.onchange = function () { onConditionChange(node); };
+ var1Div.appendChild(conditionSelect);
+ 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;
+ }
+ case "notify": {
+ var var1Input = document.createElement("textarea");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control");
+ var1Label.innerHTML = "Template";
+ var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!";
+ 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;
}
}
}
@@ -399,8 +480,47 @@ function onMathChange(node) {
var2Label.innerHTML = "-";
}
}
+function onConditionChange(node) {
+ if (node === void 0) { node = null; }
+ var var1Input = document.getElementById("var1Input");
+ var var1Label = document.getElementById("var1Label");
+ var var2Input = document.getElementById("var2Input");
+ var var2Label = document.getElementById("var2Label");
+ var var3Input = document.getElementById("var3Input");
+ var var3Label = document.getElementById("var3Label");
+ var var2Value = "";
+ var var3Value = "";
+ if (node != null) {
+ // @ts-ignore
+ var2Value = node.meta.var2;
+ // @ts-ignore
+ var3Value = node.meta.var3;
+ }
+ switch (var1Input.value) {
+ case "lowert": {
+ var2Input.disabled = false;
+ var2Input.type = "number";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "Threshold";
+ break;
+ }
+ case "highert": {
+ var2Input.disabled = false;
+ var2Input.type = "number";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "Threshold";
+ break;
+ }
+ default: {
+ var2Input.disabled = true;
+ var2Input.type = "text";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "-";
+ break;
+ }
+ }
+}
function onSubmitNewFilter() {
- console.log("TEST");
var nameInput = document.getElementById("nameInput");
var name = nameInput.value;
var selectType = document.getElementById("typeInput");
diff --git a/static/edit.ts b/static/edit.ts
index 490867a..6b12b44 100644
--- a/static/edit.ts
+++ b/static/edit.ts
@@ -358,6 +358,91 @@ function onTypeChange(node: DiagramNode | null = null){
var3Input.disabled = true;
var3Label.innerHTML = "-";
var3Div.appendChild(var3Input);
+ break;
+ }
+ case "condition":{
+ let conditionSelect = document.createElement("select");
+ conditionSelect.name = "var1";
+ conditionSelect.id = "var1Input";
+ conditionSelect.classList.add("form-control");
+ let differentThenLast = document.createElement("option");
+ differentThenLast.value = "diff"
+ differentThenLast.innerHTML = "Different Then Last";
+ conditionSelect.appendChild(differentThenLast);
+ let lowerThenLast = document.createElement("option");
+ lowerThenLast.value = "lowerl"
+ lowerThenLast.innerHTML = "Lower Then Last";
+ conditionSelect.appendChild(lowerThenLast);
+ let lowestEver = document.createElement("option");
+ lowestEver.value = "lowest"
+ lowestEver.innerHTML = "Lowest Ever";
+ conditionSelect.appendChild(lowestEver);
+ let lowerThan = document.createElement("option");
+ lowerThan.value = "lowert"
+ lowerThan.innerHTML = "Lower Than";
+ conditionSelect.appendChild(lowerThan);
+ let higherThenLast = document.createElement("option");
+ higherThenLast.value = "higherl"
+ higherThenLast.innerHTML = "Higher Then Last";
+ conditionSelect.appendChild(higherThenLast);
+ let highestEver = document.createElement("option");
+ highestEver.value = "highest"
+ highestEver.innerHTML = "Highest Ever";
+ conditionSelect.appendChild(highestEver);
+ let higherThan = document.createElement("option");
+ higherThan.value = "highert"
+ higherThan.innerHTML = "Higher Than";
+ conditionSelect.appendChild(higherThan);
+ conditionSelect.onchange = function() {onConditionChange(node)}
+ var1Div.appendChild(conditionSelect);
+
+ 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);
+ break;
+ }
+ case "notify":{
+ let var1Input = document.createElement("textarea");
+ var1Input.name = "var1";
+ var1Input.id = "var1Input";
+ var1Input.value = var1Value;
+ var1Input.classList.add("form-control")
+ var1Label.innerHTML = "Template";
+ var1Input.placeholder = "{{ .Watch.Name }} new lowest price: {{ Price }}!";
+ 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);
+ break;
}
}
}
@@ -393,8 +478,49 @@ function onMathChange(node: DiagramNode | null = null){
}
}
+function onConditionChange(node: DiagramNode | null = null){
+ let var1Input = document.getElementById("var1Input") as HTMLSelectElement;
+ let var1Label = document.getElementById("var1Label") as HTMLLabelElement;
+ let var2Input = document.getElementById("var2Input") as HTMLInputElement;
+ let var2Label = document.getElementById("var2Label") as HTMLLabelElement;
+ let var3Input = document.getElementById("var3Input") as HTMLInputElement;
+ let var3Label = document.getElementById("var3Label") as HTMLLabelElement;
+
+ let var2Value = "";
+ let var3Value = "";
+ if (node != null){
+ // @ts-ignore
+ var2Value = node.meta.var2;
+ // @ts-ignore
+ var3Value = node.meta.var3;
+ }
+
+ switch(var1Input.value) {
+ case "lowert": {
+ var2Input.disabled = false;
+ var2Input.type = "number";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "Threshold";
+ break;
+ }
+ case "highert": {
+ var2Input.disabled = false;
+ var2Input.type = "number";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "Threshold";
+ break;
+ }
+ default: {
+ var2Input.disabled = true;
+ var2Input.type = "text";
+ var2Input.value = var2Value;
+ var2Label.innerHTML = "-";
+ break;
+ }
+ }
+}
+
function onSubmitNewFilter(){
- console.log("TEST")
let nameInput = document.getElementById("nameInput") as HTMLInputElement;
let name = nameInput.value;
let selectType = document.getElementById("typeInput") as HTMLSelectElement;
diff --git a/templates/watch/view.html b/templates/watch/view.html
index 61afff2..a2ca0cd 100644
--- a/templates/watch/view.html
+++ b/templates/watch/view.html
@@ -46,6 +46,8 @@
+
+