func monitorChannel(channelID string, api *slack.Client, messageChan <-chan *slack.MessageEvent, msgQueue *utility.Queue, monitorSize, doLogging bool, histCond *sync.Cond, threadWait *sync.WaitGroup) { defer threadWait.Done() defer logging.Log.Noticef("(%s) Finished monitoring channel", channelID) logging.Log.Infof("(%s) Waiting for history", channelID) histCond.L.Lock() histCond.Wait() histCond.L.Unlock() logging.Log.Debugf("(%s) Message queue has %v items", channelID, msgQueue.Len()) logging.Log.Infof("(%s) Monitor size: %v", channelID, monitorSize) logging.Log.Infof("(%s) Do logging: %v", channelID, doLogging) logging.Log.Infof("(%s) Waiting for events", channelID) monitorLoop: for { select { case message, chanOpen := <-messageChan: if !chanOpen { logging.Log.Errorf("(%s) Incoming message channel is closed", channelID) break monitorLoop } /* logging.Log.Debugf("(%s) Received message", channelID) logging.Log.Debugf("\tUser: %s", message.User) logging.Log.Debugf("\tChannel: %s", message.Channel) logging.Log.Debugf("\tTimestamp: %s", message.Timestamp) logging.Log.Debugf("\tText: %s", message.Text) logging.Log.Debugf("\tSubtype: %s", message.SubType) */ msgQueue.Push(message.Timestamp) toDelete := msgQueue.Poll().(string) //logging.Log.Debugf("(%s) Adding to queue: %s; Removing from queue: %s", channelID, message.Timestamp, toDelete) api.DeleteMessage(channelID, toDelete) } } return }