/
anidb.go
55 lines (50 loc) · 1.59 KB
/
anidb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Attempt at high level client library for AniDB's APIs
package anidb
import (
"io/ioutil"
"log"
"time"
)
// Main struct for the client, contains all non-shared state.
//
// All ObjectByKey methods (AnimeByID, GroupByName, etc) first try to read
// from the cache. If the sought object isn't cached, or if the cache is
// stale, then the appropriate API is queried.
//
// Queries return their results using channels. Most queries only have one result,
// but some have 0 or more. All result channels are closed after sending their data.
//
// Queries that depend on the UDP API can't be used without first authenticating
// to the API server. This uses the credentials stored by SetCredentials, or
// by a previous Auth() call.
type AniDB struct {
Timeout time.Duration // Timeout for the various calls (default: 45s)
Logger *log.Logger // Logger where HTTP/UDP traffic is logged
udp *udpWrap
}
// Initialises a new AniDB.
func NewAniDB() *AniDB {
ret := &AniDB{
Timeout: 45 * time.Second,
Logger: log.New(ioutil.Discard, "", log.LstdFlags),
}
ret.udp = newUDPWrap(ret)
return ret
}
func (adb *AniDB) User() *User {
if adb != nil && adb.udp != nil {
if adb.udp.user != nil {
return adb.udp.user
} else if adb.udp.credentials != nil {
// see if we can get it from the cache (we don't care if it's stale)
adb.udp.user = UserByName(decrypt(adb.udp.credentials.username))
if adb.udp.user != nil {
return adb.udp.user
}
// we have to go through the slow path
adb.udp.user = <-adb.GetUserByName(decrypt(adb.udp.credentials.username))
return adb.udp.user
}
}
return nil
}