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
50 func newUDPWrap() *udpWrap {
52 AniDBUDP: udpapi.NewAniDBUDP(),
53 sendQueueCh: make(chan paramSet, 10),
59 type paramMap udpapi.ParamMap // shortcut
61 type noauthAPIReply struct {
65 func (r *noauthAPIReply) Code() int {
69 func (r *noauthAPIReply) Text() string {
73 func (r *noauthAPIReply) Error() error {
74 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
77 type bannedAPIReply struct {
81 func (r *bannedAPIReply) Code() int {
84 func (r *bannedAPIReply) Text() string {
87 func (r *bannedAPIReply) Error() error {
88 return &udpapi.APIError{Code: r.Code(), Desc: r.Text()}
91 var bannedReply udpapi.APIReply = &bannedAPIReply{}
93 func logRequest(set paramSet) {
96 log.Printf("UDP>>> AUTH user=%s\n", set.params["user"])
98 log.Printf("UDP>>> %s %s\n", set.cmd, udpapi.ParamMap(set.params).String())
102 func logReply(reply udpapi.APIReply) {
103 log.Printf("UDP<<< %d %s\n", reply.Code(), reply.Text())
106 func (udp *udpWrap) sendQueue() {
107 initialWait := 5 * time.Second
109 for set := range udp.sendQueueCh {
112 set.ch <- bannedReply
118 reply := <-udp.AniDBUDP.SendRecv(set.cmd, udpapi.ParamMap(set.params))
120 if reply.Error() == udpapi.TimeoutError {
123 if wait > time.Minute {
126 log.Printf("UDP--- Timeout; waiting %s before retry", wait)
128 delete(set.params, "s")
129 delete(set.params, "tag")
138 switch reply.Code() {
139 case 403, 501, 506: // not logged in, or session expired
140 if r := udp.ReAuth(); r.Error() == nil {
143 delete(set.params, "s")
144 delete(set.params, "tag")
148 case 503, 504: // client library rejected
150 // 555: IP (and user, possibly client) temporarily banned
151 // 601: Server down (treat the same as a ban)
160 func (udp *udpWrap) SendRecv(cmd string, params paramMap) <-chan udpapi.APIReply {
161 ch := make(chan udpapi.APIReply, 1)
164 defer udp.sendLock.Unlock()
173 if r := udp.ReAuth(); r.Error() != nil {
180 udp.sendQueueCh <- paramSet{