Archived
1
0
Fork 0
This repository has been archived on 2024-12-18. You can view files and clone it, but cannot push or open issues or pull requests.
restockbot/config.go
Julien Riou 305b3eeb76
Enable replies on Twitter and Telegram
By default, when a product is available, a notification is sent. When that same
product is not available, a reply is sent to the original message. With tons of
notifications, replies might be seen as flooding. This commit adds an option to
explicitly enable replies on Twitter and Telegram notifiers. By default, reply
messages are disabled.

Signed-off-by: Julien Riou <julien@riou.xyz>
2021-04-01 13:14:00 +02:00

111 lines
3.2 KiB
Go

package main
import (
"encoding/json"
"io/ioutil"
"path/filepath"
)
// Config to store JSON configuration
type Config struct {
TwitterConfig `json:"twitter"`
TelegramConfig `json:"telegram"`
ApiConfig `json:"api"`
AmazonConfig `json:"amazon"`
URLs []string `json:"urls"`
IncludeRegex string `json:"include_regex"`
ExcludeRegex string `json:"exclude_regex"`
BrowserAddress string `json:"browser_address"`
}
// 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"`
EnableReplies bool `json:"enable_replies"`
}
// TelegramConfig to store Telegram API key
type TelegramConfig struct {
Token string `json:"token"`
ChatID int64 `json:"chat_id"`
ChannelName string `json:"channel_name"`
EnableReplies bool `json:"enable_replies"`
}
// ApiConfig to store HTTP API configuration
type ApiConfig struct {
Address string `json:"address"`
Certfile string `json:"cert_file"`
Keyfile string `json:"key_file"`
}
// AmazonConfig to store Amazon API secrets
type AmazonConfig struct {
Searches []string `json:"searches"`
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
Marketplaces []struct {
Name string `json:"name"`
PartnerTag string `json:"partner_tag"`
} `json:"marketplaces"`
AmazonFulfilled bool `json:"amazon_fulfilled"`
AmazonMerchant bool `json:"amazon_merchant"`
AffiliateLinks bool `json:"affiliate_links"`
}
// NewConfig creates a Config struct
func NewConfig() *Config {
return &Config{}
}
// Read Config from configuration file
func (c *Config) Read(file string) error {
file, err := filepath.Abs(file)
if err != nil {
return err
}
jsonFile, err := ioutil.ReadFile(file)
if err != nil {
return err
}
err = json.Unmarshal(jsonFile, &c)
if err != nil {
return err
}
return nil
}
// HasTwitter returns true when Twitter has been configured
func (c *Config) HasTwitter() bool {
return (c.TwitterConfig.AccessToken != "" && c.TwitterConfig.AccessTokenSecret != "" && c.TwitterConfig.ConsumerKey != "" && c.TwitterConfig.ConsumerSecret != "")
}
// HasTelegram returns true when Telegram has been configured
func (c *Config) HasTelegram() bool {
return c.TelegramConfig.Token != "" && (c.TelegramConfig.ChatID != 0 || c.TelegramConfig.ChannelName != "")
}
// HasURL returns true when list of URLS has been configured
func (c *Config) HasURLs() bool {
return len(c.URLs) > 0
}
// HasAmazon returns true when Amazon has been configured
func (c *Config) HasAmazon() bool {
var hasKeys, hasSearches, hasMarketplaces bool
hasKeys = c.AmazonConfig.AccessKey != "" && c.AmazonConfig.SecretKey != ""
hasSearches = len(c.AmazonConfig.Searches) > 0
for _, marketplace := range c.AmazonConfig.Marketplaces {
if marketplace.PartnerTag != "" && marketplace.Name != "" {
hasMarketplaces = true
break
}
}
return hasKeys && hasSearches && hasMarketplaces
}