From b781ae9f53bac1ab615302d03c91f300c334f5cb Mon Sep 17 00:00:00 2001 From: klmp200 Date: Fri, 27 Jul 2018 16:50:13 +0200 Subject: [PATCH] Add specific chat data and pass chaos to an entire day --- .gitignore | 3 +- alfred.go | 4 ++- commands/twitter.go | 38 +++++++++------------ settings.json | 3 +- shared/chat.go | 82 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 26 deletions(-) create mode 100644 shared/chat.go diff --git a/.gitignore b/.gitignore index ee19125..eb5b34a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ settings_custom.json history.json -users.json \ No newline at end of file +users.json +chat_data.json \ No newline at end of file diff --git a/alfred.go b/alfred.go index e765490..b8d4956 100644 --- a/alfred.go +++ b/alfred.go @@ -2,7 +2,7 @@ * @Author: Bartuccio Antoine * @Date: 2018-07-23 15:24:22 * @Last Modified by: klmp200 -* @Last Modified time: 2018-07-26 22:32:59 +* @Last Modified time: 2018-07-27 16:13:32 */ package main @@ -40,6 +40,8 @@ func main() { settings.Settings["history file"].(string)) log.Println("Initialize users infos") shared.InitUsers(settings.Settings["users file"].(string)) + log.Println("Initialize chat data") + shared.InitChatData(settings.Settings["chat data file"].(string)) log.Println("Bot initialisation") b, err := tb.NewBot(tb.Settings{ diff --git a/commands/twitter.go b/commands/twitter.go index cac9b4f..42e9ad8 100644 --- a/commands/twitter.go +++ b/commands/twitter.go @@ -2,7 +2,7 @@ * @Author: Bartuccio Antoine * @Date: 2018-07-25 18:51:38 * @Last Modified by: klmp200 -* @Last Modified time: 2018-07-26 22:52:51 +* @Last Modified time: 2018-07-27 16:49:59 */ package commands @@ -15,17 +15,10 @@ import ( tb "gopkg.in/tucnak/telebot.v2" "strconv" "strings" - "sync" "time" ) -type sjw struct { - usable bool - mutex sync.Mutex -} - var client *twitter.Client -var sjw_usable sjw func initTwitter() { config := oauth1.NewConfig( @@ -39,7 +32,6 @@ func initTwitter() { http_client := config.Client(oauth1.NoContext, token) client = twitter.NewClient(http_client) - sjw_usable = sjw{usable: true} } func testOrInitTwitter() { @@ -52,13 +44,6 @@ func twitterCommunicationError(m *tb.Message) { shared.Bot.Send(m.Chat, "Désolé, les serveurs de twitter sont injoignables.") } -func unlockSjw() { - time.Sleep(time.Hour) - sjw_usable.mutex.Lock() - sjw_usable.usable = true - sjw_usable.mutex.Unlock() -} - func LastTrumpTweet(m *tb.Message) { testOrInitTwitter() user, _, err := client.Users.Show(&twitter.UserShowParams{ScreenName: "realDonaldTrump"}) @@ -101,13 +86,21 @@ func TwitterTrends(m *tb.Message) { func TwitterSJW(m *tb.Message) { testOrInitTwitter() - sjw_usable.mutex.Lock() - defer sjw_usable.mutex.Unlock() - if !sjw_usable.usable { - shared.Bot.Send(m.Chat, "Arioch ne répondra pas à votre appel.") - return + last_use, exists := shared.ChatData.Get(m.Chat.ID, "last chaos use") + if exists { + var date time.Time + if _, is_string := last_use.(string); is_string { + date, _ = time.Parse(time.RFC3339, last_use.(string)) + } else { + date = last_use.(time.Time) + } + if time.Now().Before(date.Add(time.Hour * 24)) { + shared.Bot.Send(m.Chat, "Arioch ne répondra pas à votre appel.") + return + } } - sjw_usable.usable = false + shared.ChatData.Set(m.Chat.ID, "last chaos use", time.Now()) + tweets, _, err := client.Search.Tweets(&twitter.SearchTweetParams{ Query: "#SJW", }) @@ -118,5 +111,4 @@ func TwitterSJW(m *tb.Message) { for _, tweet := range tweets.Statuses { shared.Bot.Send(m.Chat, tweet.Text) } - go unlockSjw() } diff --git a/settings.json b/settings.json index df3e4a7..de9860a 100644 --- a/settings.json +++ b/settings.json @@ -6,5 +6,6 @@ "twitter consumer secret": "INSERT TOKEN HERE", "history size": 10, "history file": "history.json", - "users file": "users.json" + "users file": "users.json", + "chat data file": "chat_data.json" } \ No newline at end of file diff --git a/shared/chat.go b/shared/chat.go new file mode 100644 index 0000000..6158a28 --- /dev/null +++ b/shared/chat.go @@ -0,0 +1,82 @@ +/* +* @Author: Bartuccio Antoine +* @Date: 2018-07-27 15:37:59 +* @Last Modified by: klmp200 +* @Last Modified time: 2018-07-27 16:06:51 + */ + +package shared + +import ( + "encoding/json" + "io/ioutil" + "sync" +) + +// General purpose chat info storage +type chatData struct { + mutex sync.Mutex + data map[int64]map[string]interface{} +} + +type chatDataFile struct { + mutex sync.Mutex + path string +} + +var ChatData chatData +var cdf chatDataFile + +// Init chat data meant to store infos about a chat. +func InitChatData(path string) { + cdf = chatDataFile{path: path} + ChatData = chatData{data: make(map[int64]map[string]interface{})} + ChatData.mutex.Lock() + defer ChatData.mutex.Unlock() + cdf.read() + +} + +func (c chatData) Set(chat int64, key string, data interface{}) { + c.mutex.Lock() + defer c.mutex.Unlock() + if _, exists := c.data[chat]; !exists { + c.data[chat] = make(map[string]interface{}) + } + c.data[chat][key] = data + go cdf.write() +} + +func (c chatData) Get(chat int64, key string) (interface{}, bool) { + c.mutex.Lock() + defer c.mutex.Unlock() + m, exists := c.data[chat] + if !exists { + return nil, false + } + data, ok := m[key] + if !ok { + return nil, false + } + return data, true +} + +func (c chatDataFile) read() { + c.mutex.Lock() + defer c.mutex.Unlock() + data, err := ioutil.ReadFile(c.path) + if err != nil { + // File doesn't exist, skip import + return + } + json.Unmarshal(data, &ChatData.data) +} + +func (c chatDataFile) write() { + c.mutex.Lock() + defer c.mutex.Unlock() + ChatData.mutex.Lock() + defer ChatData.mutex.Unlock() + data, _ := json.Marshal(ChatData.data) + ioutil.WriteFile(c.path, data, 0770) +}