parseUserAgent extracts browser, OS, and device from user agent string.
(ua string)
| 1137 | |
| 1138 | // parseUserAgent extracts browser, OS, and device from user agent string. |
| 1139 | func parseUserAgent(ua string) map[string]string { |
| 1140 | out := map[string]string{"browser": "Unknown", "os": "Unknown", "device": "Desktop"} |
| 1141 | if ua == "" { |
| 1142 | return out |
| 1143 | } |
| 1144 | lower := strings.ToLower(ua) |
| 1145 | if strings.Contains(lower, "chrome") && !strings.Contains(lower, "edg") { |
| 1146 | out["browser"] = "Chrome" |
| 1147 | } else if strings.Contains(lower, "firefox") { |
| 1148 | out["browser"] = "Firefox" |
| 1149 | } else if strings.Contains(lower, "safari") && !strings.Contains(lower, "chrome") { |
| 1150 | out["browser"] = "Safari" |
| 1151 | } else if strings.Contains(lower, "edg") { |
| 1152 | out["browser"] = "Edge" |
| 1153 | } else if strings.Contains(lower, "opera") { |
| 1154 | out["browser"] = "Opera" |
| 1155 | } |
| 1156 | if strings.Contains(lower, "windows") { |
| 1157 | out["os"] = "Windows" |
| 1158 | } else if strings.Contains(lower, "macintosh") || strings.Contains(lower, "mac os") { |
| 1159 | out["os"] = "macOS" |
| 1160 | } else if strings.Contains(lower, "linux") { |
| 1161 | out["os"] = "Linux" |
| 1162 | } else if strings.Contains(lower, "android") { |
| 1163 | out["os"] = "Android" |
| 1164 | } else if strings.Contains(lower, "iphone") || strings.Contains(lower, "ipad") { |
| 1165 | out["os"] = "iOS" |
| 1166 | } |
| 1167 | if strings.Contains(lower, "mobile") { |
| 1168 | out["device"] = "Mobile" |
| 1169 | } else if strings.Contains(lower, "tablet") || strings.Contains(lower, "ipad") { |
| 1170 | out["device"] = "Tablet" |
| 1171 | } |
| 1172 | return out |
| 1173 | } |
| 1174 | |
| 1175 | // getLocationFromIP returns basic location info (simplified; for local/private IPs returns "Local"). |
| 1176 | func getLocationFromIP(ip string) map[string]string { |
no outgoing calls
no test coverage detected