moira

Форк
0
93 строки · 2.6 Кб
1
package redis
2

3
import (
4
	"fmt"
5
	"strings"
6
	"time"
7

8
	"github.com/garyburd/redigo/redis"
9
	"github.com/patrickmn/go-cache"
10
	"gopkg.in/redsync.v1"
11

12
	"go.avito.ru/DO/moira/database"
13
)
14

15
const (
16
	botUsername = "moira-bot-host"
17
)
18

19
// GetIDByUsername read ID of user by messenger username
20
func (connector *DbConnector) GetIDByUsername(messenger, username string) (string, error) {
21
	if messenger == "telegram" && strings.HasPrefix(username, "#") {
22
		result := "@" + username[1:]
23
		return result, nil
24
	}
25
	c := connector.pool.Get()
26
	defer c.Close()
27
	result, err := redis.String(c.Do("GET", usernameKey(messenger, username)))
28
	if err == redis.ErrNil {
29
		return result, database.ErrNil
30
	}
31
	return result, err
32
}
33

34
// SetUsernameID store id of username
35
func (connector *DbConnector) SetUsernameID(messenger, username, id string) error {
36
	c := connector.pool.Get()
37
	defer c.Close()
38
	_, err := c.Do("SET", usernameKey(messenger, username), id)
39
	return err
40
}
41

42
// RemoveUser removes username from messenger data
43
func (connector *DbConnector) RemoveUser(messenger, username string) error {
44
	c := connector.pool.Get()
45
	defer c.Close()
46
	_, err := c.Do("DEL", usernameKey(messenger, username))
47
	if err != nil {
48
		return fmt.Errorf("Failed to delete username '%s' from messenger '%s', error: %s", username, messenger, err.Error())
49
	}
50
	return nil
51
}
52

53
// RegisterBotIfAlreadyNot creates registration of bot instance in redis
54
func (connector *DbConnector) RegisterBotIfAlreadyNot(messenger string, ttl time.Duration) bool {
55
	mutex := connector.sync.NewMutex(usernameKey(messenger, botUsername), redsync.SetExpiry(ttl), redsync.SetTries(1))
56
	if err := mutex.Lock(); err != nil {
57
		return false
58
	}
59
	connector.messengersCache.Set(messenger, mutex, cache.NoExpiration)
60
	return true
61
}
62

63
// RenewBotRegistration extends bot lock registrations for given ttl
64
func (connector *DbConnector) RenewBotRegistration(messenger string) bool {
65
	mutexInterface, ok := connector.messengersCache.Get(messenger)
66
	if !ok {
67
		return false
68
	}
69
	mutex := mutexInterface.(*redsync.Mutex)
70
	return mutex.Extend()
71
}
72

73
// DeregisterBots cancels registration for all registered messengers
74
func (connector *DbConnector) DeregisterBots() {
75
	messengers := connector.messengersCache.Items()
76
	for messenger := range messengers {
77
		connector.DeregisterBot(messenger)
78
	}
79
}
80

81
// DeregisterBot removes registration of bot instance in redis
82
func (connector *DbConnector) DeregisterBot(messenger string) bool {
83
	mutexInterface, ok := connector.messengersCache.Get(messenger)
84
	if !ok {
85
		return false
86
	}
87
	mutex := mutexInterface.(*redsync.Mutex)
88
	return mutex.Unlock()
89
}
90

91
func usernameKey(messenger, username string) string {
92
	return fmt.Sprintf("moira-%s-users:%s", messenger, username)
93
}
94

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.