~aleteoryx/tclfeed-bsky

ref: 73be936f3cdfd24d95c4f4dd4f3b44127d7dab95 tclfeed-bsky/bin/addpost.tcl -rwxr-xr-x 1.5 KiB
73be936fAleteoryx heuristic tweaks 28 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/env tclsh

if {$argc < 4 || $argc % 2} { return -code error "Usage: bin/rmpost.tcl DB FEED URI ORD ?URI ORD ...?" }
set uris [lassign $argv db feed]

cd [file dirname [file dirname [dict get [info frame [info frame]] file]]]

package require sqlite3
package require json
package require http
package require tls
::http::register https 443 ::tls::socket

sqlite3 db $db

foreach {uri ord} $uris {
  switch -regexp -matchvar matches -- $uri {
    {^at://.+} {
      if {$ord == "-ts"} {
        set endpoint {https://public.api.bsky.app/xrpc/app.bsky.feed.getPostThread}
        set http_state [http::geturl "$endpoint?uri=$uri&depth=0&parentHeight=0"]
        set ord [dict get [::json::json2dict [::http::data $http_state]] thread post record createdAt]
      }
    }
    {^(?:(?:(?:(?:(?:https://)?bsky.app)?/)?profile)?/)?([^/]+)/post/(.+)$} {
      lassign $matches _ pub rkey

      set endpoint {https://public.api.bsky.app/xrpc/com.atproto.repo.getRecord}

      set http_state [http::geturl "$endpoint?repo=$pub&collection=app.bsky.feed.post&rkey=$rkey"]
      if {[::http::ncode $http_state] != 200} { return -code error "couldn't resolve bsky.app URI!\n[::http::data $http_state]" }
      set data [::json::json2dict [::http::data $http_state]]
      set uri [dict get $data uri]

      if {$ord == "-ts"} {
        set ord [dict get $data value createdAt]
      }
    }
    default { return -code error "unknown URI format!" }
  }

  db eval "INSERT OR IGNORE INTO $feed (uri, ord) VALUES (:uri, :ord);"
}