88 "strings"
99)
1010
11+ const CRAWLER_CLASS_ID = 99
12+
1113// New creates a new instance of Udger from the dbPath database loaded in memory for fast lookup.
1214func New (dbPath string ) (* Udger , error ) {
1315 u := & Udger {
@@ -16,6 +18,8 @@ func New(dbPath string) (*Udger, error) {
1618 Devices : make (map [int ]Device ),
1719 browserTypes : make (map [int ]string ),
1820 browserOS : make (map [int ]int ),
21+ crawlerTypes : make (map [int ]string ),
22+ Crawlers : make (map [string ]Crawler ),
1923 }
2024 var err error
2125
@@ -53,6 +57,13 @@ func (udger *Udger) Lookup(ua string) (*Info, error) {
5357 info .Browser .typ = - 1
5458 }
5559
60+ if crawler , found := udger .Crawlers [ua ]; found {
61+ info .Crawler = crawler
62+ info .Crawler .Class = udger .crawlerTypes [crawler .ClassId ]
63+ info .Browser .typ = CRAWLER_CLASS_ID
64+ info .Browser .Type = udger .browserTypes [CRAWLER_CLASS_ID ]
65+ }
66+
5667 if val , ok := udger .browserOS [browserID ]; ok {
5768 info .OS = udger .OS [val ]
5869 } else {
@@ -71,7 +82,7 @@ func (udger *Udger) Lookup(ua string) (*Info, error) {
7182 Name : "Smartphone" ,
7283 Icon : "phone.png" ,
7384 }
74- } else if info .Browser .typ == 5 || info .Browser .typ == 10 || info .Browser .typ == 20 || info .Browser .typ == 50 {
85+ } else if info .Browser .typ == 5 || info .Browser .typ == 10 || info .Browser .typ == 20 || info .Browser .typ == 50 || info . Browser . typ == CRAWLER_CLASS_ID {
7586 info .Device = Device {
7687 Name : "Other" ,
7788 Icon : "other.png" ,
@@ -88,13 +99,8 @@ func (udger *Udger) Lookup(ua string) (*Info, error) {
8899
89100func (udger * Udger ) cleanRegex (r string ) string {
90101 // removes single-line and case-insensitive modifiers
91- if strings .HasSuffix (r , "/si" ) {
92- r = r [:len (r )- 3 ]
93- }
94- if strings .HasPrefix (r , "/" ) {
95- r = r [1 :]
96- }
97-
102+ r = strings .TrimSuffix (r , "/si" )
103+ r = strings .TrimPrefix (r , "/" )
98104 return r
99105}
100106
@@ -128,6 +134,9 @@ func (udger *Udger) init() error {
128134 if err := udger .initOS (); err != nil {
129135 return err
130136 }
137+ if err := udger .initCrawlers (); err != nil {
138+ return err
139+ }
131140 return nil
132141}
133142
@@ -253,3 +262,31 @@ func (udger *Udger) initOS() error {
253262 rows .Close ()
254263 return nil
255264}
265+
266+ func (udger * Udger ) initCrawlers () error {
267+ // Uncategorised, Search engine bot, Site monitor, etc.
268+ rows , err := udger .db .Query ("SELECT id, crawler_classification FROM udger_crawler_class" )
269+ if err != nil {
270+ return err
271+ }
272+ for rows .Next () {
273+ var crawlerClass string
274+ var id int
275+ rows .Scan (& id , & crawlerClass )
276+ udger .crawlerTypes [id ] = crawlerClass
277+ }
278+ rows .Close ()
279+
280+ rows , err = udger .db .Query ("SELECT ua_string, name, family, vendor, class_id FROM udger_crawler_list" )
281+ if err != nil {
282+ return err
283+ }
284+ for rows .Next () {
285+ var crawler Crawler
286+ var uaString string
287+ rows .Scan (& uaString , & crawler .Name , & crawler .Family , & crawler .Vendor , & crawler .ClassId )
288+ udger .Crawlers [uaString ] = crawler
289+ }
290+ rows .Close ()
291+ return nil
292+ }
0 commit comments