// routine to poll message information for a given room at variable intervals func pollTfsRoomMessages(room *tfs.Room, tfsApi *tfs.Api, min time.Duration, max time.Duration, send *chan interface{}, recv *chan interface{}) { delay := min messageMap := make(map[int]*tfs.RoomMessage) messageLast := room.LastActivity timer := time.NewTimer(delay) defer timer.Stop() for { select { case <-timer.C: delay = delay * 2 if delay > max { delay = max } messages, err := tfsApi.GetRoomMessages(room, messageLast) if err != nil { trace.Log(err) *send <- fmt.Sprintf("messages error %d %s", room.Id, err) return } // new for _, message := range messages.Value { if _, ok := messageMap[message.Id]; ok { continue } json, err := json.Marshal(message) if err != nil { trace.Log(err) continue } *send <- fmt.Sprintf("messages new %d %s %d %s", message.PostedRoomId, message.PostedBy.Id, message.Id, json) messageMap[message.Id] = message messageLast = message.PostedTime delay = min } timer.Reset(delay) case <-*recv: // quit return } } }