/* * @Author: Bartuccio Antoine * @Date: 2018-07-24 01:27:11 * @Last Modified by: klmp200 * @Last Modified time: 2018-07-24 02:09:53 */ package shared import ( "sync" ) type history struct { mutex sync.Mutex size int data map[int64][]string } var History history func InitHistory(size int) { History = history{} History.mutex.Lock() defer History.mutex.Unlock() History.size = size History.data = make(map[int64][]string) } func (h history) Size() int { h.mutex.Lock() defer h.mutex.Unlock() return h.size } 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 "" } 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) } 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 "" } 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 } // 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 }