diff --git a/database.go b/database.go index af6d2d0..16de1a9 100644 --- a/database.go +++ b/database.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/gobuffalo/packr/v2" _ "github.com/mattn/go-sqlite3" + "github.com/mssola/user_agent" "github.com/rubenv/sql-migrate" "net/url" "os" @@ -39,7 +40,7 @@ func migrateDatabase(database *sql.DB) (e error) { // Tracking -func (db *Database) trackView(urlString string, ref string) { +func (db *Database) trackView(urlString string, ref string, ua string) { if len(urlString) == 0 { // Don't track empty urls return @@ -49,7 +50,12 @@ func (db *Database) trackView(urlString string, ref string) { parsedRef, _ := url.Parse(ref) ref = parsedRef.Hostname() } - _, e := db.sqlDB.Exec("insert into views(url, ref) values(:url, :ref)", sql.Named("url", urlString), sql.Named("ref", ref)) + if ua != "" { + // Parse Useragent + uaName, uaVersion := user_agent.New(ua).Browser() + ua = uaName + " " + uaVersion + } + _, e := db.sqlDB.Exec("insert into views(url, ref, useragent) values(:url, :ref, :ua)", sql.Named("url", urlString), sql.Named("ref", ref), sql.Named("ua", ua)) if e != nil { fmt.Println("Inserting into DB failed:", e) } diff --git a/go.mod b/go.mod index c12122d..0fb6946 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.7.1 github.com/mattn/go-sqlite3 v1.10.0 + github.com/mssola/user_agent v0.5.0 github.com/rubenv/sql-migrate v0.0.0-20190327083759-54bad0a9b051 github.com/wcharczuk/go-chart v2.0.1+incompatible golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f // indirect diff --git a/go.sum b/go.sum index 046494f..6efc4b6 100644 --- a/go.sum +++ b/go.sum @@ -126,6 +126,8 @@ github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK86 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mongodb/mongo-go-driver v0.1.0/go.mod h1:NK/HWDIIZkaYsnYa0hmtP443T5ELr0KDecmIioVuuyU= +github.com/mssola/user_agent v0.5.0 h1:gRF7/x8cKt8qzAosYGsBNyirta+F8fvYDlJrgXws9AQ= +github.com/mssola/user_agent v0.5.0/go.mod h1:UFiKPVaShrJGW93n4uo8dpPdg1BSVpw2P9bneo0Mtp8= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= diff --git a/main.go b/main.go index f7c948e..f4571f5 100644 --- a/main.go +++ b/main.go @@ -69,8 +69,9 @@ func (kis3 kis3) startListening() { func (kis3 kis3) trackView(w http.ResponseWriter, r *http.Request) { url := r.Header.Get("Referer") // URL of requesting source ref := r.URL.Query().Get("ref") + ua := r.Header.Get("User-Agent") if !(r.Header.Get("DNT") == "1" && appConfig.dnt) { - go kis3.db.trackView(url, ref) // run with goroutine for awesome speed! + go kis3.db.trackView(url, ref, ua) // run with goroutine for awesome speed! _, _ = fmt.Fprint(w, "true") } } diff --git a/migrations/2_Add_UserAgent.sql b/migrations/2_Add_UserAgent.sql new file mode 100644 index 0000000..0b3174d --- /dev/null +++ b/migrations/2_Add_UserAgent.sql @@ -0,0 +1,13 @@ +-- +migrate Up +ALTER TABLE views + ADD COLUMN useragent TEXT DEFAULT '' NOT NULL; + +-- +migrate Down +BEGIN TRANSACTION; +CREATE TABLE views_new AS +SELECT url, time, ref +FROM views; +DROP TABLE views; +ALTER TABLE views_new + RENAME TO views; +COMMIT;