4 "github.com/Kovensky/go-anidb/udp"
9 const banDuration = 30*time.Minute + 1*time.Second
11 // Returns whether the last UDP API access returned a 555 BANNED message.
13 stat, err := Cache.Stat("banned")
18 switch ts := stat.ModTime(); {
21 case time.Now().Sub(ts) > banDuration:
32 type paramSet struct {
35 ch chan udpapi.APIReply
44 sendQueueCh chan paramSet
47 credentials *credentials
53 func newUDPWrap(adb *AniDB) *udpWrap {
55 AniDBUDP: udpapi.NewAniDBUDP(),
57 sendQueueCh: make(chan paramSet, 10),
63 type paramMap udpapi.ParamMap // shortcut
65 type noauthAPIReply struct {
69 func (r *noauthAPIReply) Code() int {
73 func (r *noauthAPIReply) Text() string {
77 func (r *noauthAPIReply) Error() error {
78 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
81 type bannedAPIReply struct {
85 func (r *bannedAPIReply) Code() int {
88 func (r *bannedAPIReply) Text() string {
91 func (r *bannedAPIReply) Error() error {
92 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
95 var bannedReply udpapi.APIReply = &bannedAPIReply{}
97 func (udp *udpWrap) logRequest(set paramSet) {
100 udp.adb.Logger.Printf("UDP>>> AUTH user=%s\n", set.params["user"])
102 udp.adb.Logger.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String())
106 func (udp *udpWrap) logReply(reply udpapi.APIReply) {
107 udp.adb.Logger.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text())
110 func (udp *udpWrap) sendQueue() {
111 initialWait := 5 * time.Second
113 for set := range udp.sendQueueCh {
116 set.ch <- bannedReply
122 reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params))
124 if reply.Error() == udpapi.TimeoutError {
127 if wait > time.Minute {
130 udp.adb.Logger.Printf("UDP--- Timeout; waiting %s before retry", wait)
132 delete(set.params, "s")
133 delete(set.params, "tag")
142 switch reply.Code() {
143 case 403, 501, 506: // not logged in, or session expired
144 if r := udp.ReAuth(); r.Error() == nil {
147 delete(set.params, "s")
148 delete(set.params, "tag")
152 case 503, 504: // client library rejected
154 // 555: IP (and user, possibly client) temporarily banned
155 // 601: Server down (treat the same as a ban)
164 func (udp *udpWrap) SendRecv(cmd string, params paramMap) <-chan udpapi.APIReply {
165 ch := make(chan udpapi.APIReply, 1)
168 defer udp.sendLock.Unlock()
177 if r := udp.ReAuth(); r.Error() != nil {
184 udp.sendQueueCh <- paramSet{