hanayo/tracking.go

65 lines
1.5 KiB
Go

package main
import (
"crypto/sha256"
"database/sql"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
"zxq.co/x/rs"
"github.com/gin-gonic/gin"
)
func setYCookie(userID int, c *gin.Context) {
var token string
err := db.QueryRow("SELECT token FROM identity_tokens WHERE userid = ? LIMIT 1", userID).Scan(&token)
if err != nil && err != sql.ErrNoRows {
c.Error(err)
return
}
if token != "" {
addY(c, token)
return
}
for {
token = fmt.Sprintf("%x", sha256.Sum256([]byte(rs.String(32))))
if db.QueryRow("SELECT 1 FROM identity_tokens WHERE token = ? LIMIT 1", token).Scan(new(int)) == sql.ErrNoRows {
break
}
}
db.Exec("INSERT INTO identity_tokens(userid, token) VALUES (?, ?)", userID, token)
addY(c, token)
}
func addY(c *gin.Context, y string) {
http.SetCookie(c.Writer, &http.Cookie{
Name: "y",
Value: y,
Expires: time.Now().Add(time.Hour * 24 * 30 * 6),
})
}
func logIP(c *gin.Context, user int) {
db.Exec(`INSERT INTO ip_user (userid, ip, occurencies) VALUES (?, ?, '1')
ON DUPLICATE KEY UPDATE occurencies = occurencies + 1`, user, clientIP(c))
}
func setCountry(c *gin.Context, user int) error {
raw, err := http.Get(config.IP_API + "/" + clientIP(c) + "/country")
if err != nil {
return err
}
data, err := ioutil.ReadAll(raw.Body)
if err != nil {
return err
}
country := strings.TrimSpace(string(data))
if country == "" || len(country) != 2 {
return nil
}
db.Exec("UPDATE users_stats SET country = ? WHERE id = ?", country, user)
return nil
}