diff options
| -rw-r--r-- | internal/config/server/mastodon.go | 1 | ||||
| -rw-r--r-- | internal/config/server/secrets.go | 44 | ||||
| -rw-r--r-- | internal/server/repository/stats.go | 22 | ||||
| -rw-r--r-- | internal/social/mastodon.go | 15 | ||||
| -rw-r--r-- | internal/types/platformname.go | 9 | ||||
| -rw-r--r-- | internal/types/shared.go | 29 |
6 files changed, 120 insertions, 0 deletions
diff --git a/internal/config/server/mastodon.go b/internal/config/server/mastodon.go new file mode 100644 index 0000000..abb4e43 --- /dev/null +++ b/internal/config/server/mastodon.go @@ -0,0 +1 @@ +package server diff --git a/internal/config/server/secrets.go b/internal/config/server/secrets.go new file mode 100644 index 0000000..0e8aab2 --- /dev/null +++ b/internal/config/server/secrets.go @@ -0,0 +1,44 @@ +package server + +import ( + "fmt" + "log" + "os" + + "codeberg.org/snonux/gos/internal/config" +) + +type SecretsConfig struct { + MastodonEnable bool `json:"MastodonEnable,omitempty"` + MastodonDomain string `json:"MastodonDomain,omitempty"` + MastodonAccessToken string `json:"MastodonAccessToken,omitempty"` +} + +func newSecretsConfig(secretsFile string) (SecretsConfig, error) { + if isWorldReadable(secretsFile) { + return SecretsConfig{}, fmt.Errorf("config '%s' is world readable", secretsFile) + } + + conf, err := config.FromFile[SecretsConfig](secretsFile) + if err != nil { + if _, ok := err.(*os.PathError); !ok { + return conf, err + } + log.Println("Skipping config file:", err) + } + + conf.MastodonEnable = config.Bool("GOS_MASTODON_ENABLE", conf.MastodonEnable) + conf.MastodonDomain = config.Str("GOS_MASTODON_DOMAIN", conf.MastodonDomain) + conf.MastodonAccessToken = config.Str("GOS_MASTODON_ACCESS_TOKEN", conf.MastodonAccessToken) + + return conf, nil +} + +func isWorldReadable(file string) bool { + fileInfo, err := os.Stat(file) + if err != nil { + return false + } + + return fileInfo.Mode().Perm()&00004 != 0 +} diff --git a/internal/server/repository/stats.go b/internal/server/repository/stats.go new file mode 100644 index 0000000..005ef80 --- /dev/null +++ b/internal/server/repository/stats.go @@ -0,0 +1,22 @@ +package repository + +import "codeberg.org/snonux/gos/internal/types" + +// Keeps track of how many messages were posted to social media over the last week and month. +type stats struct { + // Sliding window of entries shared last 7 days + last7Days map[types.PlatformName][]types.UnixEpoch + // Sliding window of entries shared last 30 days + last30Days map[types.PlatformName][]types.UnixEpoch +} + +func newStats() stats { + return stats{ + last7Days: make(map[types.PlatformName][]types.UnixEpoch), + last30Days: make(map[types.PlatformName][]types.UnixEpoch), + } +} + +// func (s stats) add(platform types.PlatformName, entry types.Entry) { + +// } diff --git a/internal/social/mastodon.go b/internal/social/mastodon.go new file mode 100644 index 0000000..bf4bcff --- /dev/null +++ b/internal/social/mastodon.go @@ -0,0 +1,15 @@ +package social + +import "codeberg.org/snonux/gos/internal/config/server" + +type Mastodon struct { + conf server.ServerConfig +} + +func NewMastodon(conf server.ServerConfig) Mastodon { + return Mastodon{conf} +} + +func Post(content string) error { + return nil +} diff --git a/internal/types/platformname.go b/internal/types/platformname.go new file mode 100644 index 0000000..e94d422 --- /dev/null +++ b/internal/types/platformname.go @@ -0,0 +1,9 @@ +package types + +type PlatformName = string + +const ( + Mastodon PlatformName = "Mastodon" + LinkedIn PlatformName = "LinkedIn" + Textfile PlatformName = "Textfile" +) diff --git a/internal/types/shared.go b/internal/types/shared.go new file mode 100644 index 0000000..c2d5a65 --- /dev/null +++ b/internal/types/shared.go @@ -0,0 +1,29 @@ +package types + +import ( + "fmt" + "time" +) + +type UnixEpoch int64 + +// Tells me whether the entry was Shared to the sm platform named Name +type Shared struct { + Is bool `json:"is,omitempty"` + Timestamp UnixEpoch `json:"timestamp,omitempty"` +} + +func newShared(is bool) Shared { + return Shared{ + Is: is, + Timestamp: UnixEpoch(time.Now().Unix()), + } +} + +func (s Shared) String() string { + return fmt.Sprintf("Is:%v;Timestamp:%v", s.Is, s.Timestamp) +} + +func (s Shared) Equals(other Shared) bool { + return s.Timestamp == other.Timestamp && s.Is == other.Is +} |
