package utils import ( "crypto/md5" "fmt" "net/http" "net/url" "strings" "strconv" "time" "git.1750studios.com/gronkhDE/gogronkh/config" "github.com/gin-gonic/gin" ) type Message struct { Type string String string } func CleanParam(p string) (string, bool) { if (len(p) < 1) { return "", false } // Remove leading and trailing slash p = strings.Trim(p, "/") if (len(p) < 1) { return "", false } return p, true } func HandleEtag(c *gin.Context, dataString string) (bool) { checksum := md5.Sum([]byte(dataString)) etag := fmt.Sprintf("\"%x\"", checksum) c.Header("Etag", etag) header := c.Request.Header.Get("If-None-Match") if header == etag { c.AbortWithStatus(304) return true } return false } func makePiwikRequest(data url.Values) { _, _ = http.PostForm(config.C.PiwikURL + "/piwik.php", data) } func PiwikRequest() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() if c.Request.Header.Get("DNT") == "1" { return } if strings.HasPrefix(c.Request.URL.Path, "/api") == false { return } var path string var version string if strings.HasPrefix(c.Request.URL.Path, "/api/version") { path = strings.Split(c.Request.URL.Path, "/api/")[1] } else if strings.HasPrefix(c.Request.URL.Path, "/api/v") { path = strings.Split(c.Request.URL.Path, "/api/v")[1] frags := strings.SplitN(path, "/", 2) version = frags[0] path = frags[1] } else { path = strings.Split(c.Request.URL.Path, "/api/")[1] version = "unversioned" } diff := int(time.Since(start).Seconds() * 1000) c.Request.URL.Scheme = "http" c.Request.URL.Host = "gronkh.1750studios.com" options := url.Values{ "idsite": {strconv.Itoa(config.C.PiwikID)}, "rec": {"1"}, "url": {c.Request.URL.String()}, "apiv": {"1"}, "token_auth": {config.C.PiwikToken}, "cip": {c.ClientIP()}, "send_image": {"0"}, "gt_ms": {strconv.Itoa(diff)}, "cvar": {"{\"1\":[\"HTTP Code\",\"" + strconv.Itoa(c.Writer.Status()) + "\"]}"}, } if c.Request.Header.Get("Referer") != "" { options.Add("urlref", c.Request.Header.Get("Referer")) } if version != "" { if c.Request.Header.Get("User-Agent") != "" { options.Add("ua", c.Request.Header.Get("User-Agent")) fragments := strings.Split(options.Get("ua"), "/") if len(fragments) > 1 && strings.HasSuffix(fragments[len(fragments)-2], "plugin.video.gronkh.de") && fragments[0] == "Kodi" && strings.Split(fragments[1], " ")[0] != "System.BuildVersionShort" { options.Add("_cvar", "{\"1\":[\"API Version\",\"" + version + "\"],\"2\":[\"Plugin Version\",\"" + fragments[len(fragments)-1] + "\"],\"3\":[\"Kodi Version\",\"" + strings.Split(fragments[1], " ")[0] + "\"]}") } else if len(fragments) > 1 && strings.HasSuffix(fragments[len(fragments)-2], "plugin.video.gronkh.de") { options.Add("_cvar", "{\"1\":[\"API Version\",\"" + version + "\"],\"2\":[\"Plugin Version\",\"" + fragments[len(fragments)-1] + "\"]}") } else { options.Add("_cvar", "{\"1\":[\"API Version\",\"" + version + "\"]}") } } else { options.Add("_cvar", "{\"1\":[\"API Version\",\"" + version + "\"]}") } } else { if c.Request.Header.Get("User-Agent") != "" { options.Add("ua", c.Request.Header.Get("User-Agent")) fragments := strings.Split(options.Get("ua"), "/") if len(fragments) > 1 && strings.HasSuffix(fragments[len(fragments)-2], "plugin.video.gronkh.de") { options.Add("_cvar", "{\"2\":[\"Plugin Version\",\"" + fragments[len(fragments)-1] + "\"]}") } } } if c.Request.Header.Get("Accept-Language") != "" { options.Add("lang", c.Request.Header.Get("Accept-Language")) } if c.Request.Header.Get("X-UID") != "" { options.Add("_id", c.Request.Header.Get("X-UID")) } if c.Request.Header.Get("X-Resolution") != "" { if strings.HasSuffix(c.Request.Header.Get("X-Resolution"), " -") { options.Add("res", strings.Split(c.Request.Header.Get("X-Resolution"), " ")[0]) } else { options.Add("res", c.Request.Header.Get("X-Resolution")) } } go makePiwikRequest(options) } }