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}