aboutsummaryrefslogtreecommitdiff
path: root/persistence
diff options
context:
space:
mode:
authorBohdan Horbeshko <bodqhrohro@gmail.com>2024-05-05 20:16:38 +0300
committerBohdan Horbeshko <bodqhrohro@gmail.com>2024-05-05 20:16:38 +0300
commita74e2bcb7d3262073d05aa89140b1d202b7f179d (patch)
tree2f207931cd694c8254dc920f2174c53719e32024 /persistence
parenta3f6d5f77402bf4a4d3fa01297f9fd78cc69a3b3 (diff)
Mute/unmute whole chats with no argumentsv1.9.4
Diffstat (limited to 'persistence')
-rw-r--r--persistence/sessions.go100
-rw-r--r--persistence/sessions_test.go28
2 files changed, 117 insertions, 11 deletions
diff --git a/persistence/sessions.go b/persistence/sessions.go
index 29c4918..0454d97 100644
--- a/persistence/sessions.go
+++ b/persistence/sessions.go
@@ -3,6 +3,7 @@ package persistence
import (
"github.com/pkg/errors"
"io/ioutil"
+ "sync"
"time"
"dev.narayana.im/narayana/telegabber/yamldb"
@@ -34,16 +35,18 @@ type SessionsMap struct {
// Session is a key-values subtree
type Session struct {
- Login string `yaml:":login"`
- Timezone string `yaml:":timezone"`
- KeepOnline bool `yaml:":keeponline"`
- RawMessages bool `yaml:":rawmessages"`
- AsciiArrows bool `yaml:":asciiarrows"`
- OOBMode bool `yaml:":oobmode"`
- Carbons bool `yaml:":carbons"`
- HideIds bool `yaml:":hideids"`
- Receipts bool `yaml:":receipts"`
- NativeEdits bool `yaml:":nativeedits"`
+ Login string `yaml:":login"`
+ Timezone string `yaml:":timezone"`
+ KeepOnline bool `yaml:":keeponline"`
+ RawMessages bool `yaml:":rawmessages"`
+ AsciiArrows bool `yaml:":asciiarrows"`
+ OOBMode bool `yaml:":oobmode"`
+ Carbons bool `yaml:":carbons"`
+ HideIds bool `yaml:":hideids"`
+ Receipts bool `yaml:":receipts"`
+ NativeEdits bool `yaml:":nativeedits"`
+ IgnoredChats []int64 `yaml:":ignoredchats"`
+ ignoredChatsMap map[int64]bool `yaml:"-"`
}
var configKeys = []string{
@@ -59,14 +62,21 @@ var configKeys = []string{
}
var sessionDB *SessionsYamlDB
+var sessionsLock sync.Mutex
// SessionMarshaller implementation for YamlDB
func SessionMarshaller() ([]byte, error) {
cleanedMap := SessionsMap{}
emptySessionsMap(&cleanedMap)
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
for jid, session := range sessionDB.Data.Sessions {
if session.Login != "" {
+ session.IgnoredChats = make([]int64, 0, len(session.ignoredChatsMap))
+ for chatID := range session.ignoredChatsMap {
+ session.IgnoredChats = append(session.IgnoredChats, chatID)
+ }
cleanedMap.Sessions[jid] = session
}
}
@@ -108,6 +118,16 @@ func initYamlDB(path string, dataPtr *SessionsMap) (*SessionsYamlDB, error) {
emptySessionsMap(dataPtr)
}
+ // convert ignored users slice to map
+ for jid, session := range dataPtr.Sessions {
+ session.ignoredChatsMap = make(map[int64]bool)
+ for _, chatID := range session.IgnoredChats {
+ session.ignoredChatsMap[chatID] = true
+ }
+ session.IgnoredChats = nil
+ dataPtr.Sessions[jid] = session
+ }
+
return &SessionsYamlDB{
YamlDB: yamldb.YamlDB{
Path: path,
@@ -119,6 +139,13 @@ func initYamlDB(path string, dataPtr *SessionsMap) (*SessionsYamlDB, error) {
// Get retrieves a session value
func (s *Session) Get(key string) (string, error) {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
+ return s.get(key)
+}
+
+func (s *Session) get(key string) (string, error) {
switch key {
case "timezone":
return s.Timezone, nil
@@ -145,9 +172,12 @@ func (s *Session) Get(key string) (string, error) {
// ToMap converts the session to a map
func (s *Session) ToMap() map[string]string {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
m := make(map[string]string)
for _, configKey := range configKeys {
- value, _ := s.Get(configKey)
+ value, _ := s.get(configKey)
m[configKey] = value
}
@@ -156,6 +186,9 @@ func (s *Session) ToMap() map[string]string {
// Set sets a session value
func (s *Session) Set(key string, value string) (string, error) {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
switch key {
case "timezone":
s.Timezone = value
@@ -232,6 +265,51 @@ func (s *Session) TimezoneToLocation() *time.Location {
return zeroLocation
}
+// IgnoreChat adds a chat id to ignore list, returns false if already ignored
+func (s *Session) IgnoreChat(chatID int64) bool {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
+ if s.ignoredChatsMap == nil {
+ s.ignoredChatsMap = make(map[int64]bool)
+ } else if _, ok := s.ignoredChatsMap[chatID]; ok {
+ return false
+ }
+
+ s.ignoredChatsMap[chatID] = true
+ return true
+}
+
+// UnignoreChat removes a chat id from ignore list, returns false if not already ignored
+func (s *Session) UnignoreChat(chatID int64) bool {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
+ if s.ignoredChatsMap == nil {
+ return false
+ }
+
+ if _, ok := s.ignoredChatsMap[chatID]; !ok {
+ return false
+ }
+
+ delete(s.ignoredChatsMap, chatID)
+ return true
+}
+
+// IsChatIgnored checks the chat id against the ignore list
+func (s *Session) IsChatIgnored(chatID int64) bool {
+ sessionsLock.Lock()
+ defer sessionsLock.Unlock()
+
+ if s.ignoredChatsMap == nil {
+ return false
+ }
+
+ _, ok := s.ignoredChatsMap[chatID]
+ return ok
+}
+
func fromBool(b bool) string {
if b {
return "true"
diff --git a/persistence/sessions_test.go b/persistence/sessions_test.go
index 0339378..001cfa0 100644
--- a/persistence/sessions_test.go
+++ b/persistence/sessions_test.go
@@ -88,3 +88,31 @@ func TestSessionSetAbsent(t *testing.T) {
t.Error("There shouldn't come a donkey!")
}
}
+
+func TestSessionIgnore(t *testing.T) {
+ session := Session{}
+ if session.IsChatIgnored(3) {
+ t.Error("Shouldn't be ignored yet")
+ }
+ if !session.IgnoreChat(3) {
+ t.Error("Shouldn't have been ignored")
+ }
+ if session.IgnoreChat(3) {
+ t.Error("Shouldn't ignore second time")
+ }
+ if !session.IsChatIgnored(3) {
+ t.Error("Should be ignored already")
+ }
+ if session.IsChatIgnored(-145) {
+ t.Error("Wrong chat is ignored")
+ }
+ if !session.UnignoreChat(3) {
+ t.Error("Should successfully unignore")
+ }
+ if session.UnignoreChat(3) {
+ t.Error("Should unignore second time")
+ }
+ if session.IsChatIgnored(3) {
+ t.Error("Shouldn't be ignored already")
+ }
+}