2023-08-23 02:06:37 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-07-03 06:49:33 +00:00
|
|
|
"bufio"
|
2023-08-23 02:06:37 +00:00
|
|
|
"fmt"
|
|
|
|
"log"
|
2024-07-03 06:49:33 +00:00
|
|
|
"os"
|
2023-08-23 02:06:37 +00:00
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
2024-07-03 06:49:33 +00:00
|
|
|
sn "github.com/ekzyis/snappy"
|
2023-08-23 02:06:37 +00:00
|
|
|
)
|
|
|
|
|
2024-02-26 14:43:34 +00:00
|
|
|
type NostrClient struct {
|
|
|
|
Url string
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
2023-08-23 02:06:37 +00:00
|
|
|
var (
|
2024-09-08 19:46:25 +00:00
|
|
|
TwitterUrlRegexp = regexp.MustCompile(`(?:https?:\/\/)?(?:www\.)?((?:twitter|x)\.com)\/\w+\/status(?:es)?\/\d+`)
|
2023-08-31 08:20:18 +00:00
|
|
|
// references:
|
|
|
|
// - https://github.com/zedeus/nitter/wiki/Instances
|
|
|
|
// - https://status.d420.de/
|
|
|
|
NitterClearnetUrls = []string{
|
2024-07-03 06:42:38 +00:00
|
|
|
"xcancel.com",
|
2023-08-31 08:20:18 +00:00
|
|
|
}
|
2023-08-23 02:06:37 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func WaitUntilNext(d time.Duration) {
|
|
|
|
now := time.Now()
|
|
|
|
dur := now.Truncate(d).Add(d).Sub(now)
|
|
|
|
log.Println("sleeping for", dur.Round(time.Second))
|
|
|
|
time.Sleep(dur)
|
|
|
|
}
|
|
|
|
|
2024-07-03 06:49:33 +00:00
|
|
|
func main() {
|
|
|
|
loadEnv()
|
2023-08-23 02:06:37 +00:00
|
|
|
|
2024-07-03 06:49:33 +00:00
|
|
|
c := sn.NewClient(
|
|
|
|
sn.WithBaseUrl(os.Getenv("SN_BASE_URL")),
|
|
|
|
sn.WithApiKey(os.Getenv("SN_API_KEY")),
|
|
|
|
)
|
2023-08-23 02:06:37 +00:00
|
|
|
|
|
|
|
for {
|
|
|
|
log.Println("fetching items ...")
|
2024-09-08 19:04:06 +00:00
|
|
|
r, err := c.Items(&sn.ItemsQuery{Sort: "recent", Type: "all", Limit: 100})
|
2023-08-23 02:06:37 +00:00
|
|
|
if err != nil {
|
2023-08-27 21:42:10 +00:00
|
|
|
log.Println(err)
|
2023-08-23 02:06:37 +00:00
|
|
|
SendToNostr(fmt.Sprint(err))
|
|
|
|
WaitUntilNext(time.Minute)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, item := range r.Items {
|
2024-09-08 19:04:06 +00:00
|
|
|
var m []string
|
|
|
|
var comment string
|
|
|
|
|
|
|
|
if m = TwitterUrlRegexp.FindStringSubmatch(item.Url); m != nil {
|
2024-09-08 19:46:25 +00:00
|
|
|
comment = strings.Replace(m[0], m[1], "xcancel.com", 1)
|
2024-09-08 19:04:06 +00:00
|
|
|
} else if m = TwitterUrlRegexp.FindStringSubmatch(item.Text); m != nil {
|
2024-09-08 19:46:25 +00:00
|
|
|
comment = strings.Replace(m[0], m[1], "xcancel.com", 1)
|
2024-09-08 19:04:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if comment != "" {
|
2023-08-23 02:06:37 +00:00
|
|
|
log.Printf("item %d is twitter link\n", item.Id)
|
2024-09-08 19:04:06 +00:00
|
|
|
|
2023-08-23 02:06:37 +00:00
|
|
|
if ItemHasComment(item.Id) {
|
|
|
|
log.Printf("item %d already has nitter links comment\n", item.Id)
|
|
|
|
continue
|
|
|
|
}
|
2024-09-08 19:04:06 +00:00
|
|
|
|
2024-07-03 06:49:33 +00:00
|
|
|
cId, err := c.CreateComment(item.Id, comment)
|
2023-08-23 02:06:37 +00:00
|
|
|
if err != nil {
|
2024-09-08 19:04:06 +00:00
|
|
|
log.Println("create comment failed:", err)
|
2023-08-23 02:06:37 +00:00
|
|
|
SendToNostr(fmt.Sprint(err))
|
|
|
|
continue
|
|
|
|
}
|
2024-09-08 19:04:06 +00:00
|
|
|
|
2023-08-23 02:06:37 +00:00
|
|
|
log.Printf("created comment %d\n", cId)
|
|
|
|
SaveComment(&sn.Comment{Id: cId, Text: comment, ParentId: item.Id})
|
|
|
|
} else {
|
|
|
|
log.Printf("item %d is not twitter link\n", item.Id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
WaitUntilNext(time.Minute)
|
|
|
|
}
|
|
|
|
}
|
2024-07-03 06:49:33 +00:00
|
|
|
|
|
|
|
func loadEnv() {
|
|
|
|
var (
|
|
|
|
f *os.File
|
|
|
|
s *bufio.Scanner
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
if f, err = os.Open(".env"); err != nil {
|
|
|
|
log.Fatalf("error opening .env: %v", err)
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
s = bufio.NewScanner(f)
|
|
|
|
s.Split(bufio.ScanLines)
|
|
|
|
for s.Scan() {
|
|
|
|
line := s.Text()
|
|
|
|
parts := strings.SplitN(line, "=", 2)
|
|
|
|
|
|
|
|
// Check if we have exactly 2 parts (key and value)
|
|
|
|
if len(parts) == 2 {
|
|
|
|
os.Setenv(parts[0], parts[1])
|
|
|
|
} else {
|
|
|
|
log.Fatalf(".env: invalid line: %s\n", line)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check for errors during scanning
|
|
|
|
if err = s.Err(); err != nil {
|
|
|
|
fmt.Println("error scanning .env:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|