]> git.lizzy.rs Git - go-anidb.git/commitdiff
anidb: Automatically run USER query after AUTH
authorDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Fri, 26 Jul 2013 01:42:41 +0000 (22:42 -0300)
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Fri, 26 Jul 2013 01:42:41 +0000 (22:42 -0300)
This also lets us have a convenient adb.User() that returns the current
user; this only works though if we're already authenticated.

anidb.go
auth.go
udp.go
usercache.go

index ee0e0c98dd85c6fb47f262ed0909fd8cfb9a1e78..b553108674a4549e209e00c037be3aff17b56036 100644 (file)
--- 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 3d346e4d443d86617a4344886b77e42940624e03..26714fd6b8e8d9c9443b912bbdde546e0915ec0a 100644 (file)
--- 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 59d6c27d0c36f182161c61115a73fdf35b7fe8d5..b43d0f65c309ffdcd02884f71afa69ef74088970 100644 (file)
--- 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 {
index 9ad8113d14a732d36fe893ec6c0982bd6df79327..f1e44918ae65c2ca3d89251f89b1daf472bdaa59 100644 (file)
@@ -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)