Активные сессии — строками: «Завершить» не вылезает за карточку; браузер и система одним словом

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-07 10:24:27 +03:00
parent 8f86f9d25a
commit ed598281e8
3 changed files with 54 additions and 4 deletions
+41
View File
@@ -486,6 +486,47 @@ type SessionView struct {
Created, Seen time.Time
}
// Device — браузер и система одним словом («Chrome · Windows») вместо строки User-Agent.
func (v SessionView) Device() string {
ua := v.UA
var b, o string
switch {
case strings.Contains(ua, "YaBrowser"):
b = "Яндекс Браузер"
case strings.Contains(ua, "Edg/"):
b = "Edge"
case strings.Contains(ua, "Firefox/"):
b = "Firefox"
case strings.Contains(ua, "Chrome/"):
b = "Chrome"
case strings.Contains(ua, "Safari/"):
b = "Safari"
case strings.Contains(ua, "curl/"):
b = "curl"
}
switch {
case strings.Contains(ua, "Windows"):
o = "Windows"
case strings.Contains(ua, "iPhone"), strings.Contains(ua, "iPad"):
o = "iOS"
case strings.Contains(ua, "Mac OS"):
o = "macOS"
case strings.Contains(ua, "Android"):
o = "Android"
case strings.Contains(ua, "Linux"):
o = "Linux"
}
switch {
case b != "" && o != "":
return b + " · " + o
case b != "" || o != "":
return b + o
case ua == "":
return "браузер неизвестен"
}
return "другой браузер"
}
// sessionID — короткий отпечаток токена: им список ссылается на сессию, сам токен в страницу не попадает.
func sessionID(token string) string {
sum := sha256.Sum256([]byte("bj-session-id:" + token))