#!/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);"
}