Compare commits
6 Commits
60b4af4139
...
6a4892944b
Author | SHA1 | Date | |
---|---|---|---|
6a4892944b | |||
ef9886efc5 | |||
d4d49cbbad | |||
9fe5927465 | |||
8b1ad852f2 | |||
1b0c87f813 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,3 +1,3 @@
|
|||||||
.env
|
.env*
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
unpaywall
|
nitterbot
|
||||||
|
2
Makefile
Normal file
2
Makefile
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
nitterbot: *.go go.sum go.mod
|
||||||
|
go build -o nitterbot .
|
6
db.go
6
db.go
@ -42,7 +42,9 @@ func ItemHasComment(parentId int) bool {
|
|||||||
err := db.QueryRow(`SELECT COUNT(1) FROM comments WHERE parent_id = ?`, parentId).Scan(&count)
|
err := db.QueryRow(`SELECT COUNT(1) FROM comments WHERE parent_id = ?`, parentId).Scan(&count)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("error during item check: %w", err)
|
err = fmt.Errorf("error during item check: %w", err)
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
|
// pretend that item has comment to avoid duplicate comments
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
return count > 0
|
return count > 0
|
||||||
}
|
}
|
||||||
@ -51,6 +53,6 @@ func SaveComment(comment *sn.Comment) {
|
|||||||
_, err := db.Exec(`INSERT INTO comments(id, text, parent_id) VALUES (?, ?, ?)`, comment.Id, comment.Text, comment.ParentId)
|
_, err := db.Exec(`INSERT INTO comments(id, text, parent_id) VALUES (?, ?, ?)`, comment.Id, comment.Text, comment.ParentId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("error during item insert: %w", err)
|
err = fmt.Errorf("error during item insert: %w", err)
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
go.mod
2
go.mod
@ -3,6 +3,6 @@ module git.ekzyis.com/ekzyis/unpaywall
|
|||||||
go 1.21.0
|
go 1.21.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/ekzyis/snappy v0.5.2
|
github.com/ekzyis/snappy v0.5.3
|
||||||
github.com/mattn/go-sqlite3 v1.14.17
|
github.com/mattn/go-sqlite3 v1.14.17
|
||||||
)
|
)
|
||||||
|
4
go.sum
4
go.sum
@ -1,4 +1,4 @@
|
|||||||
github.com/ekzyis/snappy v0.5.2 h1:3dZyj3Kz7fV3OStllq/koL6d5qNfBRK+4UB2L3RNmiQ=
|
github.com/ekzyis/snappy v0.5.3 h1:Pq8b2s4WPz5gnHgCoZR2LVqArEVqWeVCyHSVZCawat4=
|
||||||
github.com/ekzyis/snappy v0.5.2/go.mod h1:BxJwdGlCwUw0Q5pQzBr59weAIS6pkVdivBBaZkkWTSo=
|
github.com/ekzyis/snappy v0.5.3/go.mod h1:BxJwdGlCwUw0Q5pQzBr59weAIS6pkVdivBBaZkkWTSo=
|
||||||
github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
|
github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
|
||||||
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
|
74
main.go
74
main.go
@ -25,31 +25,6 @@ var (
|
|||||||
NitterClearnetUrls = []string{
|
NitterClearnetUrls = []string{
|
||||||
"xcancel.com",
|
"xcancel.com",
|
||||||
}
|
}
|
||||||
|
|
||||||
// since v0.4.0, bot also replaces nostr links with nostr.com so users can pick their client
|
|
||||||
NostrUrlRegexp = regexp.MustCompile(
|
|
||||||
`^(?:https?:\/\/)?(?:www\.)?` +
|
|
||||||
`(?:` +
|
|
||||||
`primal\.net\/(?:e\/)?` +
|
|
||||||
`|snort\.social\/(?:e\/)?` +
|
|
||||||
`|iris\.to\/` +
|
|
||||||
`|highlighter\.com\/(?:a\/)?` +
|
|
||||||
`|nostter\.app\/` +
|
|
||||||
`|coracle\.social\/(?:notes\/)?` +
|
|
||||||
`|satellite\.earth\/` +
|
|
||||||
`|nostrudel\.ninja\/(?:#\/n\/)?` +
|
|
||||||
`)((note|nevent)[a-zA-Z0-9]+)$`)
|
|
||||||
NostrClients = []NostrClient{
|
|
||||||
// list from nostr.com
|
|
||||||
NostrClient{"https://primal.net/e/", "primal.net"},
|
|
||||||
NostrClient{"https://snort.social/e/", "snort.social"},
|
|
||||||
NostrClient{"https://nostrudel.ninja/#/n/", "nostrudel.ninja"},
|
|
||||||
NostrClient{"https://satellite.earth/thread/", "satellite.earth"},
|
|
||||||
NostrClient{"https://coracle.social/", "coracle.social"},
|
|
||||||
NostrClient{"https://nostter.app/", "nostter.app"},
|
|
||||||
NostrClient{"https://highlighter.com/a/", "highlighter.com"},
|
|
||||||
NostrClient{"https://iris.to/", "iris.to"},
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func WaitUntilNext(d time.Duration) {
|
func WaitUntilNext(d time.Duration) {
|
||||||
@ -69,7 +44,7 @@ func main() {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
log.Println("fetching items ...")
|
log.Println("fetching items ...")
|
||||||
r, err := c.Items(&sn.ItemsQuery{Sort: "recent", Limit: 21})
|
r, err := c.Items(&sn.ItemsQuery{Sort: "recent", Type: "all", Limit: 100})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
SendToNostr(fmt.Sprint(err))
|
SendToNostr(fmt.Sprint(err))
|
||||||
@ -78,54 +53,35 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, item := range r.Items {
|
for _, item := range r.Items {
|
||||||
if m := TwitterUrlRegexp.FindStringSubmatch(item.Url); m != nil {
|
var m []string
|
||||||
|
var comment string
|
||||||
|
|
||||||
|
if m = TwitterUrlRegexp.FindStringSubmatch(item.Url); m != nil {
|
||||||
|
comment = strings.Replace(item.Url, m[1], "xcancel.com", 1)
|
||||||
|
} else if m = TwitterUrlRegexp.FindStringSubmatch(item.Text); m != nil {
|
||||||
|
comment = strings.Replace(item.Text, m[1], "xcancel.com", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if comment != "" {
|
||||||
log.Printf("item %d is twitter link\n", item.Id)
|
log.Printf("item %d is twitter link\n", item.Id)
|
||||||
|
|
||||||
if ItemHasComment(item.Id) {
|
if ItemHasComment(item.Id) {
|
||||||
log.Printf("item %d already has nitter links comment\n", item.Id)
|
log.Printf("item %d already has nitter links comment\n", item.Id)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
comment := "**Twitter2Nitter**\n\nClearnet: "
|
|
||||||
for _, nUrl := range NitterClearnetUrls {
|
|
||||||
nitterLink := strings.Replace(item.Url, m[1], nUrl, 1)
|
|
||||||
comment += fmt.Sprintf("[%s](%s) | ", nUrl, nitterLink)
|
|
||||||
}
|
|
||||||
comment = strings.TrimRight(comment, "| ")
|
|
||||||
comment += "\n\n_Nitter is a free and open source alternative Twitter front-end focused on privacy and performance. "
|
|
||||||
comment += "Click [here](https://github.com/zedeus/nitter) for more information._"
|
|
||||||
cId, err := c.CreateComment(item.Id, comment)
|
cId, err := c.CreateComment(item.Id, comment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println("create comment failed:", err)
|
||||||
SendToNostr(fmt.Sprint(err))
|
SendToNostr(fmt.Sprint(err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("created comment %d\n", cId)
|
log.Printf("created comment %d\n", cId)
|
||||||
SaveComment(&sn.Comment{Id: cId, Text: comment, ParentId: item.Id})
|
SaveComment(&sn.Comment{Id: cId, Text: comment, ParentId: item.Id})
|
||||||
} else {
|
} else {
|
||||||
log.Printf("item %d is not twitter link\n", item.Id)
|
log.Printf("item %d is not twitter link\n", item.Id)
|
||||||
}
|
}
|
||||||
if m := NostrUrlRegexp.FindStringSubmatch(item.Url); m != nil {
|
|
||||||
log.Printf("item %d is nostr link\n", item.Id)
|
|
||||||
if ItemHasComment(item.Id) {
|
|
||||||
log.Printf("item %d already has nostr links comment\n", item.Id)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
noteId := m[1]
|
|
||||||
comment := "**Nostr Client Picker**\n\n"
|
|
||||||
for _, client := range NostrClients {
|
|
||||||
comment += fmt.Sprintf("[%s](%s) | ", client.Name, client.Url+noteId)
|
|
||||||
}
|
|
||||||
comment = strings.TrimRight(comment, "| ")
|
|
||||||
cId, err := c.CreateComment(item.Id, comment)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
SendToNostr(fmt.Sprint(err))
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Printf("created comment %d\n", cId)
|
|
||||||
SaveComment(&sn.Comment{Id: cId, Text: comment, ParentId: item.Id})
|
|
||||||
} else {
|
|
||||||
log.Printf("item %d is not nostr link\n", item.Id)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitUntilNext(time.Minute)
|
WaitUntilNext(time.Minute)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user