From aab64cc59bccf164bced2167383c08072a426907 Mon Sep 17 00:00:00 2001 From: BroodjeAap Date: Fri, 30 Sep 2022 14:22:37 +0000 Subject: [PATCH] added condition filter type --- scraping.go | 218 +++++++++++++++++++++++++++++++++++++- static/edit.js | 122 ++++++++++++++++++++- static/edit.ts | 128 +++++++++++++++++++++- templates/watch/view.html | 2 + 4 files changed, 467 insertions(+), 3 deletions(-) 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 @@ + +