Archived
1
0
Fork 0

Use array of key/value for Twitter hashtags (#1)

With Go, maps are not ordered the way they are declared. Keys can be read at any
order. When a pattern is too large ("rtx 3060"), when placed first, it can match
a name of another product ("rtx 3060 ti"). When placed second, the good hashtag
is chosen. This commit uses an array of maps because arrays are ordered.

Signed-off-by: Julien Riou <julien@riou.xyz>
This commit is contained in:
Julien Riou 2021-02-27 18:31:11 +01:00
parent 40b0ba999a
commit 4342f65211
No known key found for this signature in database
GPG key ID: FF42D23B580C89F7
4 changed files with 26 additions and 24 deletions

View file

@ -72,7 +72,7 @@ Options:
* `consumer_secret`: API secret of your Twitter application
* `access_token`: authentication token generated for your Twitter account
* `access_token_secret`: authentication token secret generated for your Twitter account
* `hashtags`: map of key/values used to append hashtags to each tweet. Key is the pattern to match in the product name, value is the string to append to the tweet. For example, `{"twitter": {"hashtags": {"rtx 3090": "#nvidia #rtx3090"}}}` will detect `rtx 3090` to append `#nvidia #rtx3090` at the end of the tweet.
* `hashtags`: list of key/value used to append hashtags to each tweet. Key is the pattern to match in the product name, value is the string to append to the tweet. For example, `{"twitter": {"hashtags": [{"rtx 3090": "#nvidia #rtx3090"}]}}` will detect `rtx 3090` to append `#nvidia #rtx3090` at the end of the tweet.
* `include_regex` (optional): include products with a name matching this regexp
* `exclude_regex` (optional): exclude products with a name matching this regexp

View file

@ -16,11 +16,11 @@ type Config struct {
// TwitterConfig to store Twitter API secrets
type TwitterConfig struct {
ConsumerKey string `json:"consumer_key"`
ConsumerSecret string `json:"consumer_secret"`
AccessToken string `json:"access_token"`
AccessTokenSecret string `json:"access_token_secret"`
Hashtags map[string]string `json:"hashtags"`
ConsumerKey string `json:"consumer_key"`
ConsumerSecret string `json:"consumer_secret"`
AccessToken string `json:"access_token"`
AccessTokenSecret string `json:"access_token_secret"`
Hashtags []map[string]string `json:"hashtags"`
}
// NewConfig creates a Config struct

View file

@ -25,7 +25,7 @@ type TwitterNotifier struct {
db *gorm.DB
client *twitter.Client
user *twitter.User
hashtagsMap map[string]string
hashtagsMap []map[string]string
}
// NewTwitterNotifier creates a TwitterNotifier
@ -80,9 +80,11 @@ func (c *TwitterNotifier) replyToTweet(tweetID int64, message string) (int64, er
// parse product name to build a list of hashtags
func (c *TwitterNotifier) buildHashtags(productName string) string {
productName = strings.ToLower(productName)
for pattern, value := range c.hashtagsMap {
if ok, _ := regexp.MatchString(pattern, productName); ok {
return value
for _, rule := range c.hashtagsMap {
for pattern, value := range rule {
if ok, _ := regexp.MatchString(pattern, productName); ok {
return value
}
}
}
return ""

View file

@ -27,20 +27,20 @@ func TestBuildHashtags(t *testing.T) {
client: nil,
user: nil,
db: nil,
hashtagsMap: map[string]string{
"rtx 3060 ti": "#nvidia #rtx3060ti",
"rtx 3060ti": "#nvidia #rtx3060ti",
"rtx 3060": "#nvidia #rtx3060",
"rtx 3070": "#nvidia #rtx3070",
"rtx 3080": "#nvidia #rtx3080",
"rtx 3090": "#nvidia #rtx3090",
"rx 6800 xt": "#amd #rx6800xt",
"rx 6800xt": "#amd #rx6800xt",
"rx 6900xt": "#amd #rx6900xt",
"rx 6900 xt": "#amd #rx6900xt",
"rx 6800": "#amd #rx6800",
"rx 5700 xt": "#amd #rx5700xt",
"rx 5700xt": "#amd #rx5700xt",
hashtagsMap: []map[string]string{
{"rtx 3060 ti": "#nvidia #rtx3060ti"},
{"rtx 3060ti": "#nvidia #rtx3060ti"},
{"rtx 3060": "#nvidia #rtx3060"},
{"rtx 3070": "#nvidia #rtx3070"},
{"rtx 3080": "#nvidia #rtx3080"},
{"rtx 3090": "#nvidia #rtx3090"},
{"rx 6800 xt": "#amd #rx6800xt"},
{"rx 6800xt": "#amd #rx6800xt"},
{"rx 6900xt": "#amd #rx6900xt"},
{"rx 6900 xt": "#amd #rx6900xt"},
{"rx 6800": "#amd #rx6800"},
{"rx 5700 xt": "#amd #rx5700xt"},
{"rx 5700xt": "#amd #rx5700xt"},
},
}