Raw
 1package web
 2
 3import (
 4	"strings"
 5	"unicode/utf8"
 6)
 7
 8var deviceBrowsers = []struct{ token, name string }{
 9	{"Edg/", "Edge"},
10	{"OPR/", "Opera"},
11	{"SamsungBrowser/", "Samsung Internet"},
12	{"Firefox/", "Firefox"},
13	{"FxiOS/", "Firefox"},
14	{"CriOS/", "Chrome"},
15	{"Chrome/", "Chrome"},
16	{"Version/", "Safari"},
17}
18
19var deviceSystems = []struct{ token, name string }{
20	{"Windows", "Windows"},
21	{"iPhone", "iOS"},
22	{"iPad", "iOS"},
23	{"Android", "Android"},
24	{"CrOS", "ChromeOS"},
25	{"Mac OS X", "macOS"},
26	{"Linux", "Linux"},
27}
28
29func deviceLabel(ua string) string {
30	browser := firstToken(ua, deviceBrowsers)
31	system := firstToken(ua, deviceSystems)
32	if browser == "" || system == "" {
33		return ""
34	}
35	return browser + ", " + system
36}
37
38func firstToken(ua string, table []struct{ token, name string }) string {
39	for _, e := range table {
40		if strings.Contains(ua, e.token) {
41			return e.name
42		}
43	}
44	return ""
45}
46
47var accountAgentShown = 80
48
49func clipAgent(ua string) string {
50	if len(ua) <= accountAgentShown {
51		return ua
52	}
53	cut := accountAgentShown
54	for cut > 0 && !utf8.RuneStart(ua[cut]) {
55		cut--
56	}
57	return ua[:cut] + "…"
58}