4 "github.com/Kovensky/go-anidb/udp"
10 const banDuration = 30*time.Minute + 1*time.Second
12 // Returns whether the last UDP API access returned a 555 BANNED message.
14 stat, err := Cache.Stat("banned")
19 switch ts := stat.ModTime(); {
22 case time.Now().Sub(ts) > banDuration:
33 type paramSet struct {
36 ch chan udpapi.APIReply
43 sendQueueCh chan paramSet
46 credentials *credentials
52 func newUDPWrap() *udpWrap {
54 AniDBUDP: udpapi.NewAniDBUDP(),
55 sendQueueCh: make(chan paramSet, 10),
61 type paramMap udpapi.ParamMap // shortcut
63 type noauthAPIReply struct {
67 func (r *noauthAPIReply) Code() int {
71 func (r *noauthAPIReply) Text() string {
75 func (r *noauthAPIReply) Error() error {
76 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
79 type bannedAPIReply struct {
83 func (r *bannedAPIReply) Code() int {
86 func (r *bannedAPIReply) Text() string {
89 func (r *bannedAPIReply) Error() error {
90 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
93 var bannedReply udpapi.APIReply = &bannedAPIReply{}
95 func logRequest(set paramSet) {
98 log.Printf("UDP>>> AUTH user=%s\n", set.params["user"])
100 log.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String())
104 func logReply(reply udpapi.APIReply) {
105 log.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text())
108 func (udp *udpWrap) sendQueue() {
109 initialWait := 5 * time.Second
111 for set := range udp.sendQueueCh {
114 set.ch <- bannedReply
120 reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params))
122 if reply.Error() == udpapi.TimeoutError {
125 if wait > time.Minute {
128 log.Printf("UDP--- Timeout; waiting %s before retry", wait)
130 delete(set.params, "s")
131 delete(set.params, "tag")
140 switch reply.Code() {
141 case 403, 501, 506: // not logged in, or session expired
142 if r := udp.ReAuth(); r.Error() == nil {
145 delete(set.params, "s")
146 delete(set.params, "tag")
150 case 503, 504: // client library rejected
152 // 555: IP (and user, possibly client) temporarily banned
153 // 601: Server down (treat the same as a ban)
162 func (udp *udpWrap) SendRecv(cmd string, params paramMap) <-chan udpapi.APIReply {
163 ch := make(chan udpapi.APIReply, 1)
166 defer udp.sendLock.Unlock()
175 if r := udp.ReAuth(); r.Error() != nil {
182 udp.sendQueueCh <- paramSet{