From 698cdb8bd8730ab19722477449d6bc29809f1329 Mon Sep 17 00:00:00 2001 From: mkwcat Date: Mon, 4 Dec 2023 23:28:01 -0500 Subject: [PATCH] ServerBrowser: Custom handling of Mario Kart Wii filters --- serverbrowser/filter.go | 2 +- serverbrowser/filter/eval.go | 42 ++++++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/serverbrowser/filter.go b/serverbrowser/filter.go index d1261df..a258afc 100644 --- a/serverbrowser/filter.go +++ b/serverbrowser/filter.go @@ -82,7 +82,7 @@ func filterServers(servers []map[string]string, queryGame string, expression str continue } - ret, err := filter.Eval(tree, server) + ret, err := filter.Eval(tree, server, queryGame) if err != nil { logging.Error(ModuleName, "Error evaluating filter:", err.Error()) return []map[string]string{} diff --git a/serverbrowser/filter/eval.go b/serverbrowser/filter/eval.go index cf1faf7..ad747da 100644 --- a/serverbrowser/filter/eval.go +++ b/serverbrowser/filter/eval.go @@ -4,15 +4,17 @@ package filter import ( "errors" "strconv" + "strings" ) type expression struct { - ast *TreeNode - context map[string]string + ast *TreeNode + context map[string]string + queryGame string } // Bug(zdebeer): functions is eval from right to left instead from left to right. -func Eval(basenode *TreeNode, context map[string]string) (value int64, err error) { +func Eval(basenode *TreeNode, context map[string]string, queryGame string) (value int64, err error) { defer func() { if str := recover(); str != nil { value = 0 @@ -20,7 +22,7 @@ func Eval(basenode *TreeNode, context map[string]string) (value int64, err error } }() - this := &expression{basenode, context} + this := &expression{basenode, context, queryGame} return this.eval(basenode), nil } @@ -116,6 +118,12 @@ func (this *expression) evalEquals(args []*TreeNode) int64 { case cnt < 2: panic("operator missing arguments") case cnt == 2: + if n, ok := args[0].Value.(*IdentityToken); ok { + if n.Name == "rk" && this.queryGame == "mariokartwii" { + return this.evalEqualsRK(this.getString(args[1])) + } + } + if this.getString(args[0]) == this.getString(args[1]) { return 1 } @@ -131,6 +139,25 @@ func (this *expression) evalEquals(args []*TreeNode) int64 { } } +// Operator override +func (this *expression) evalEqualsRK(value string) int64 { + rk := this.context["rk"] + // Check and remove regional searches due to the limited player count + // China (ID 6) gets a pass because it was never released + if len(rk) == 4 && (strings.HasPrefix(rk, "vs_") || strings.HasPrefix(rk, "bt_")) && rk[3] >= '0' && rk[3] < '6' { + rk = rk[:2] + } + + if len(value) == 4 && (strings.HasPrefix(value, "vs_") || strings.HasPrefix(value, "bt_")) && value[3] >= '0' && value[3] < '6' { + value = value[:2] + } + + if rk == value { + return 1 + } + return 0 +} + func (this *expression) evalNotEquals(args []*TreeNode) int64 { cnt := len(args) switch { @@ -208,6 +235,13 @@ func (this *expression) evalMathOperator(fn func(int64, int64) int64, args []*Tr case cnt < 2: panic("operator missing arguments") case cnt == 2: + if n, ok := args[0].Value.(*IdentityToken); ok { + // Remove VR search due to the limited player count + if (n.Name == "ev" || n.Name == "eb") && this.queryGame == "mariokartwii" { + return 1 + } + } + return fn(this.getNumber(args[0]), this.getNumber(args[1])) default: answ := fn(this.getNumber(args[0]), this.getNumber(args[1]))