/* * @Author: Bartuccio Antoine * @Date: 2018-07-24 01:27:11 * @Last Modified by: klmp200 * @Last Modified time: 2018-07-24 11:51:52 */ package shared import ( "sync" ) type history struct { mutex sync.Mutex size int data map[int64][]string } var History history // Init a chat history of a given size func InitHistory(size int) { History = history{} History.mutex.Lock() defer History.mutex.Unlock() History.size = size History.data = make(map[int64][]string) } // Get the number of messages saved in the history func (h history) Size() int { h.mutex.Lock() defer h.mutex.Unlock() return h.size } // Get a selected message in a chat history func (h history) Message(chatID int64, n int) string { h.mutex.Lock() defer h.mutex.Unlock() array, exists := h.data[chatID] if exists && n >= 0 && n < len(array) { return array[n] } return "" } // Append a message to a given chat func (h history) AddMessage(chatID int64, m string) { h.mutex.Lock() defer h.mutex.Unlock() if _, exists := h.data[chatID]; !exists { h.data[chatID] = make([]string, h.size, h.size) } h.append(chatID, m) } // Get the last message of a given chat func (h history) LastMessage(chatID int64) string { h.mutex.Lock() defer h.mutex.Unlock() if _, exists := h.data[chatID]; exists { return h.data[chatID][h.size-1] } return "" } // Get a copy of a given chat history func (h history) ChatHistory(chatID int64) []string { h.mutex.Lock() defer h.mutex.Unlock() array, exists := h.data[chatID] if exists { c := make([]string, h.size, h.size) copy(c, array) return c } return nil } // Add a message at the end of a chat and move everithyng up // Assert that the slice exists and mutex already locked func (h history) append(chatID int64, m string) { c := make([]string, h.size-1, h.size-1) array, _ := h.data[chatID] copy(c, array[1:]) for i, val := range c { array[i] = val } array[h.size-1] = m }