summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/config/server/mastodon.go1
-rw-r--r--internal/config/server/secrets.go44
-rw-r--r--internal/server/repository/stats.go22
-rw-r--r--internal/social/mastodon.go15
-rw-r--r--internal/types/platformname.go9
-rw-r--r--internal/types/shared.go29
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
+}