From: Diogo Franco (Kovensky) Date: Fri, 26 Jul 2013 01:42:41 +0000 (-0300) Subject: anidb: Automatically run USER query after AUTH X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=b05b1e6b9de5552741cbc11eed8badb29175143b;p=go-anidb.git anidb: Automatically run USER query after AUTH This also lets us have a convenient adb.User() that returns the current user; this only works though if we're already authenticated. --- diff --git a/anidb.go b/anidb.go index ee0e0c9..b553108 100644 --- a/anidb.go +++ b/anidb.go @@ -30,3 +30,10 @@ func NewAniDB() *AniDB { udp: newUDPWrap(), } } + +func (adb *AniDB) User() *User { + if adb != nil && adb.udp != nil { + return adb.udp.user + } + return nil +} diff --git a/auth.go b/auth.go index 3d346e4..26714fd 100644 --- a/auth.go +++ b/auth.go @@ -97,7 +97,6 @@ func (udp *udpWrap) ReAuth() udpapi.APIReply { decrypt(c.username), decrypt(c.password), decrypt(c.udpKey)) - runtime.GC() // any better way to clean the plaintexts? logReply(r) err := r.Error() @@ -116,6 +115,23 @@ func (udp *udpWrap) ReAuth() udpapi.APIReply { } } udp.connected = err == nil + + if udp.connected { + ch := make(chan udpapi.APIReply, 1) + udp.sendQueueCh <- paramSet{ + cmd: "USER", + params: paramMap{"user": decrypt(c.username)}, + ch: ch, + } + reply := <-ch + + if reply != nil { + uid, _ := parseUserReply(reply) + udp.user = uid.User() + } + } + + runtime.GC() return r } return &noauthAPIReply{} @@ -160,6 +176,8 @@ func (adb *AniDB) Logout() error { adb.udp.sendLock.Lock() defer adb.udp.sendLock.Unlock() + adb.udp.user = nil + if adb.udp.connected { adb.udp.connected = false logRequest(paramSet{cmd: "LOGOUT"}) diff --git a/udp.go b/udp.go index 59d6c27..b43d0f6 100644 --- a/udp.go +++ b/udp.go @@ -45,6 +45,8 @@ type udpWrap struct { credLock sync.Mutex credentials *credentials connected bool + + user *User } func newUDPWrap() *udpWrap { diff --git a/usercache.go b/usercache.go index 9ad8113..f1e4491 100644 --- a/usercache.go +++ b/usercache.go @@ -11,6 +11,14 @@ import ( type UID int +func (uid UID) User() *User { + var u User + if CacheGet(&u, "user", uid) == nil { + return &u + } + return nil +} + func (adb *AniDB) GetCurrentUser() <-chan *User { ch := make(chan *User, 1)