X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=udp.go;h=e3ca0fa0e028bf22560fd6a5569b00906b44914a;hb=d5fc5a1b93c9361c08d181a1cb4dca447e9edf84;hp=89b39d8ee3b7008db1482116393c63a1ad3b7ae0;hpb=b5d7724e6c92388c4726c6c495b4f67443dc7056;p=go-anidb.git diff --git a/udp.go b/udp.go index 89b39d8..e3ca0fa 100644 --- a/udp.go +++ b/udp.go @@ -1,42 +1,32 @@ package anidb import ( - "encoding/gob" "github.com/Kovensky/go-anidb/udp" - "log" "sync" "time" ) -func init() { - gob.RegisterName("*github.com/Kovensky/go-anidb.banCache", &banCache{}) -} - const banDuration = 30*time.Minute + 1*time.Second -type banCache struct{ time.Time } - -func (c *banCache) Touch() { - c.Time = time.Now() -} -func (c *banCache) IsStale() bool { - return time.Now().Sub(c.Time) > banDuration -} - // Returns whether the last UDP API access returned a 555 BANNED message. func Banned() bool { - var banTime banCache - cache.Get(&banTime, "banned") + stat, err := Cache.Stat("banned") + if err != nil { + return false + } - stale := banTime.IsStale() - if stale { - cache.Delete("banned") + switch ts := stat.ModTime(); { + case ts.IsZero(): + return false + case time.Now().Sub(ts) > banDuration: + return false + default: + return true } - return !stale } func setBanned() { - cache.Set(&banCache{}, "banned") + Cache.Touch("banned") } type paramSet struct { @@ -48,17 +38,22 @@ type paramSet struct { type udpWrap struct { *udpapi.AniDBUDP + adb *AniDB + sendLock sync.Mutex sendQueueCh chan paramSet credLock sync.Mutex credentials *credentials connected bool + + user *User } -func newUDPWrap() *udpWrap { +func newUDPWrap(adb *AniDB) *udpWrap { u := &udpWrap{ AniDBUDP: udpapi.NewAniDBUDP(), + adb: adb, sendQueueCh: make(chan paramSet, 10), } go u.sendQueue() @@ -99,17 +94,17 @@ func (r *bannedAPIReply) Error() error { var bannedReply udpapi.APIReply = &bannedAPIReply{} -func logRequest(set paramSet) { +func (udp *udpWrap) logRequest(set paramSet) { switch set.cmd { case "AUTH": - log.Printf("UDP>>> AUTH user=%s\n", set.params["user"]) + udp.adb.Logger.Printf("UDP>>> AUTH user=%s\n", set.params["user"]) default: - log.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String()) + udp.adb.Logger.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String()) } } -func logReply(reply udpapi.APIReply) { - log.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text()) +func (udp *udpWrap) logReply(reply udpapi.APIReply) { + udp.adb.Logger.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text()) } func (udp *udpWrap) sendQueue() { @@ -123,7 +118,7 @@ func (udp *udpWrap) sendQueue() { continue } - logRequest(set) + udp.logRequest(set) reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params)) if reply.Error() == udpapi.TimeoutError { @@ -132,7 +127,7 @@ func (udp *udpWrap) sendQueue() { if wait > time.Minute { wait = time.Minute } - log.Printf("UDP--- Timeout; waiting %s before retry", wait) + udp.adb.Logger.Printf("UDP--- Timeout; waiting %s before retry", wait) delete(set.params, "s") delete(set.params, "tag") @@ -140,7 +135,7 @@ func (udp *udpWrap) sendQueue() { time.Sleep(wait) goto Retry } - logReply(reply) + udp.logReply(reply) wait = initialWait