Commit Diff


commit - 1d5ddf5d08ecf1b7bf60c8d4c9eefeda181183e3
commit + 711914363ec34c6669e7f4a1193b8854e5e81ad1
blob - e5b0d54e78ab010295f99484817e340f8cb316b7
blob + 7ceb350a035faeef4afb1cfb9156b07ce3f8783f
--- apub.go
+++ apub.go
@@ -25,6 +25,8 @@ const AcceptMediaType string = `application/activity+j
 
 const ToEveryone string = "https://www.w3.org/ns/activitystreams#Public"
 
+var ErrNotExist = errors.New("no such activity")
+
 type Activity struct {
 	AtContext    string     `json:"@context"`
 	ID           string     `json:"id"`
@@ -32,6 +34,7 @@ type Activity struct {
 	Name         string     `json:"name,omitempty"`
 	Actor        string     `json:"actor,omitempty"`
 	Username     string     `json:"preferredUsername,omitempty"`
+	Summary      string     `json:"summary"`
 	Inbox        string     `json:"inbox,omitempty"`
 	Outbox       string     `json:"outbox,omitempty"`
 	To           []string   `json:"to,omitempty"`
@@ -96,15 +99,25 @@ func Decode(r io.Reader) (*Activity, error) {
 	return &a, nil
 }
 
+func DecodeActor(r io.Reader) (*Actor, error) {
+	a, err := Decode(r)
+	if err != nil {
+		return nil, err
+	}
+	return activityToActor(a), nil
+}
+
 type Actor struct {
-	AtContext string    `json:"@context"`
-	ID        string    `json:"id"`
-	Type      string    `json:"type"`
-	Name      string    `json:"name"`
-	Username  string    `json:"preferredUsername"`
-	Inbox     string    `json:"inbox"`
-	Outbox    string    `json:"outbox"`
-	PublicKey PublicKey `json:"publicKey"`
+	AtContext string     `json:"@context"`
+	ID        string     `json:"id"`
+	Type      string     `json:"type"`
+	Name      string     `json:"name"`
+	Username  string     `json:"preferredUsername"`
+	Summary   string     `json:"summary"`
+	Inbox     string     `json:"inbox"`
+	Outbox    string     `json:"outbox"`
+	Published *time.Time `json:"published,omitempty"`
+	PublicKey PublicKey  `json:"publicKey"`
 }
 
 type PublicKey struct {
@@ -114,6 +127,9 @@ type PublicKey struct {
 }
 
 func (a *Actor) Address() *mail.Address {
+	if a.Username == "" && a.Name == "" {
+		return &mail.Address{"", a.ID}
+	}
 	trimmed := strings.TrimPrefix(a.ID, "https://")
 	host, _, _ := strings.Cut(trimmed, "/")
 	addr := fmt.Sprintf("%s@%s", a.Username, host)
blob - 49dbb7da0f2bd6225226119d717b06ac7f8ff56b
blob + 48caa59f42ce6b922cc52b4ea6784ad41c460d70
--- client.go
+++ client.go
@@ -3,12 +3,12 @@ package apub
 import (
 	"bytes"
 	"crypto/rsa"
-	"io"
-	"os"
 	"encoding/json"
+	"errors"
 	"fmt"
-	"log"
+	"io"
 	"net/http"
+	"os"
 	"strings"
 )
 
@@ -52,7 +52,7 @@ func (c *Client) Lookup(id string) (*Activity, error) 
 	}
 	defer resp.Body.Close()
 	if resp.StatusCode == http.StatusNotFound {
-		return nil, fmt.Errorf("no such activity")
+		return nil, ErrNotExist
 	} else if resp.StatusCode >= 400 {
 		return nil, fmt.Errorf("non-ok response status %s", resp.Status)
 	}
@@ -64,6 +64,10 @@ func (c *Client) LookupActor(id string) (*Actor, error
 	if err != nil {
 		return nil, err
 	}
+	return activityToActor(activity), nil
+}
+
+func activityToActor(activity *Activity) *Actor {
 	return &Actor{
 		AtContext: activity.AtContext,
 		ID:        activity.ID,
@@ -72,7 +76,9 @@ func (c *Client) LookupActor(id string) (*Actor, error
 		Username:  activity.Username,
 		Inbox:     activity.Inbox,
 		Outbox:    activity.Outbox,
-	}, nil
+		Published: activity.Published,
+		Summary:   activity.Summary,
+	}
 }
 
 func (c *Client) Send(inbox string, activity *Activity) (*Activity, error) {
@@ -85,7 +91,6 @@ func (c *Client) Send(inbox string, activity *Activity
 		return nil, err
 	}
 	req.Header.Set("Content-Type", ContentType)
-	req.Header.Set("Accept", ContentType)
 	if err := Sign(req, c.Key, c.Actor.PublicKey.ID); err != nil {
 		return nil, fmt.Errorf("sign outgoing request: %w", err)
 	}
@@ -93,14 +98,17 @@ func (c *Client) Send(inbox string, activity *Activity
 	if err != nil {
 		return nil, err
 	}
-	log.Println(req.Method, req.URL, resp.Status)
 	switch resp.StatusCode {
 	case http.StatusOK:
 		if resp.ContentLength == 0 {
 			return nil, nil
 		}
 		defer resp.Body.Close()
-		return Decode(resp.Body)
+		activity, err := Decode(resp.Body)
+		if errors.Is(err, io.EOF) {
+			return nil, nil
+		}
+		return activity, err
 	case http.StatusAccepted, http.StatusNoContent:
 		return nil, nil
 	case http.StatusNotFound:
blob - 3210efbe24849cd75541ae0d14bf766f8224ddc9
blob + e4a92d27ad20b682707738189287196211558fc0
--- cmd/listen/listen.go
+++ cmd/listen/listen.go
@@ -1,28 +1,36 @@
 package main
 
 import (
+	"crypto/x509"
+	"database/sql"
 	"encoding/json"
+	"encoding/pem"
 	"errors"
 	"fmt"
 	"io/fs"
 	"log"
+	"net"
 	"net/http"
+	"net/smtp"
 	"os"
 	"path"
 	"time"
 
+	_ "github.com/mattn/go-sqlite3"
 	"olowe.co/apub"
 )
 
 type server struct {
-	fsRoot string
+	fsRoot    string
+	db        *sql.DB
+	apClient  *apub.Client
+	relay     *smtp.Client
+	relayAddr string
 }
 
 func (srv *server) handleReceived(activity *apub.Activity) {
 	var err error
 	switch activity.Type {
-	default:
-		return
 	case "Note":
 		// check if we need to dereference
 		if activity.Content == "" {
@@ -44,15 +52,30 @@ func (srv *server) handleReceived(activity *apub.Activ
 	case "Create", "Update":
 		wrapped, err := activity.Unwrap(nil)
 		if err != nil {
-			log.Printf("unwrap apub in %s: %v", wrapped.ID, err)
+			log.Printf("unwrap apub in %s: %v", activity.ID, err)
 			return
 		}
 		srv.handleReceived(wrapped)
 		return
+	default:
+		return
 	}
-	if err := srv.deliver(activity); err != nil {
-		log.Printf("deliver %s %s: %v", activity.Type, activity.ID, err)
+	log.Printf("relaying %s %s to %s", activity.Type, activity.ID, srv.relayAddr)
+	err = srv.accept(activity)
+	if err != nil {
+		log.Printf("relay %s via SMTP: %v", activity.ID, err)
 	}
+	var netErr *net.OpError
+	if errors.As(err, &netErr) {
+		srv.relay, err = smtp.Dial(srv.relayAddr)
+		if err == nil {
+			log.Printf("reconnected to relay %s", srv.relayAddr)
+			log.Printf("retrying activity %s", activity.ID)
+			srv.handleReceived(activity)
+			return
+		}
+		log.Printf("reconnect to relay %s: %v", srv.relayAddr, err)
+	}
 }
 
 func (srv *server) handleInbox(w http.ResponseWriter, req *http.Request) {
@@ -80,38 +103,33 @@ func (srv *server) handleInbox(w http.ResponseWriter, 
 		activity, err = rcv.Unwrap(nil)
 		if err != nil {
 			err = fmt.Errorf("unwrap apub object in %s: %w", rcv.ID, err)
+			log.Println(err)
 			stat := http.StatusBadRequest
 			http.Error(w, err.Error(), stat)
 			return
 		}
 	}
+	raddr := req.RemoteAddr
+	if req.Header.Get("X-Forwarded-For") != "" {
+		raddr = req.Header.Get("X-Forwarded-For")
+	}
+	if activity.Type != "Like" && activity.Type != "Dislike" {
+		log.Printf("%s %s received from %s", activity.Type, activity.ID, raddr)
+	}
 	switch activity.Type {
-	case "Like", "Dislike", "Delete", "Accept", "Reject":
+	case "Accept", "Reject":
 		w.WriteHeader(http.StatusAccepted)
+		srv.deliver(activity)
 		return
-	case "Create", "Update", "Note", "Page", "Article":
+	case "Create", "Note", "Page", "Article":
 		w.WriteHeader(http.StatusAccepted)
 		srv.handleReceived(activity)
 		return
 	}
-	w.WriteHeader(http.StatusNotImplemented)
+	w.WriteHeader(http.StatusAccepted)
 }
 
 func (srv *server) deliver(a *apub.Activity) error {
-	name := fmt.Sprintf("%d.json", time.Now().UnixNano())
-	name = path.Join(srv.fsRoot, "inbox", name)
-	f, err := os.Create(name)
-	if err != nil {
-		return err
-	}
-	defer f.Close()
-	if err := json.NewEncoder(f).Encode(a); err != nil {
-		return err
-	}
-	return nil
-}
-
-	/*
 	p, err := apub.MarshalMail(a)
 	if err != nil {
 		return fmt.Errorf("marshal mail message: %w", err)
@@ -138,14 +156,98 @@ func (srv *server) deliver(a *apub.Activity) error {
 	}
 	return os.WriteFile(name, p, 0644)
 }
-	*/
 
+func (srv *server) accept(a *apub.Activity) error {
+	err := apub.SendMail(srv.relay, a, "nobody", "otl")
+	if err != nil {
+		srv.relay.Quit()
+		return fmt.Errorf("relay to SMTP server: %w", err)
+	}
+	return nil
+}
+
 var home string = os.Getenv("HOME")
 
+const FTS5 bool = true
+
+func logRequest(next http.Handler) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// skip logging from checks by load balancer
+		if req.URL.Path == "/" && req.Method == http.MethodHead {
+			next.ServeHTTP(w, req)
+			return
+		}
+		addr := req.RemoteAddr
+		if req.Header.Get("X-Forwarded-For") != "" {
+			addr = req.Header.Get("X-Forwarded-For")
+		}
+		log.Printf("%s %s %s", addr, req.Method, req.URL)
+		next.ServeHTTP(w, req)
+	}
+}
+
+func newClient(keyPath string, actorPath string) (*apub.Client, error) {
+	b, err := os.ReadFile(keyPath)
+	if err != nil {
+		return nil, fmt.Errorf("load private key: %w", err)
+	}
+	block, _ := pem.Decode(b)
+	key, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
+
+	f, err := os.Open(actorPath)
+	if err != nil {
+		return nil, fmt.Errorf("load actor file: %w", err)
+	}
+	defer f.Close()
+	actor, err := apub.DecodeActor(f)
+	if err != nil {
+		return nil, fmt.Errorf("decode actor: %w", err)
+	}
+
+	return &apub.Client{
+		Client: http.DefaultClient,
+		Key:    key,
+		Actor:  actor,
+	}, nil
+}
+
+func serveActorFile(name string) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		log.Printf("%s checked %s", req.Header.Get("X-Forwarded-For"), name)
+		// w.Header().Set("Content-Type", apub.ContentType)
+		http.ServeFile(w, req, name)
+	}
+}
+
 func main() {
-	srv := &server{fsRoot: home+"/apubtest"}
+	db, err := sql.Open("sqlite3", path.Join(home, "apubtest/index.db"))
+	if err != nil {
+		log.Fatal(err)
+	}
+	if err := db.Ping(); err != nil {
+		log.Fatal(err)
+	}
+
+	raddr := "[::1]:smtp"
+	sclient, err := smtp.Dial(raddr)
+	if err != nil {
+		log.Fatal(err)
+	}
+	if err := sclient.Noop(); err != nil {
+		log.Fatalf("check connection to %s: %v", raddr, err)
+	}
+
+	srv := &server{
+		fsRoot:    home + "/apubtest",
+		db:        db,
+		relay:     sclient,
+		relayAddr: raddr,
+	}
 	fsys := os.DirFS(srv.fsRoot)
-	http.Handle("/", http.FileServer(http.FS(fsys)))
+	hfsys := http.FileServer(http.FS(fsys))
+	http.HandleFunc("/actor.json", serveActorFile(home+"/apubtest/actor.json"))
+	http.HandleFunc("/", logRequest(hfsys))
 	http.HandleFunc("/inbox", srv.handleInbox)
+	http.HandleFunc("/search", srv.handleSearch)
 	log.Fatal(http.ListenAndServe("[::1]:8082", nil))
 }
blob - /dev/null
blob + cea54f93f5b47fca546a5617e3ee9991b12b7876 (mode 644)
--- /dev/null
+++ cmd/listen/create.sql
@@ -0,0 +1,39 @@
+CREATE TABLE IF NOT EXISTS actor(
+	id TEXT PRIMARY KEY,
+	type TEXT NOT NULL,
+	name TEXT,
+	username TEXT,
+	published INTEGER,
+	summary TEXT
+);
+
+CREATE TABLE IF NOT EXISTS activity(
+	id TEXT PRIMARY KEY,
+	type TEXT NOT NULL,
+	name TEXT,
+	published INTEGER,
+	summary TEXT,
+	content TEXT,
+	attributedTo REFERENCES actor(id),
+	inReplyTo INTEGER,
+	object INTEGER
+);
+
+CREATE TABLE IF NOT EXISTS recipient_to(
+	activity_id REFERENCES activity(id),
+	rcpt REFERENCES actor(id)
+);
+
+CREATE TABLE IF NOT EXISTS recipient_cc (
+	activity_id REFERENCES activity(id),
+	rcpt REFERENCES actor(id)
+);
+
+CREATE VIRTUAL TABLE post USING fts5(
+	id, -- AcitivityPub ID
+	from,
+	to,
+	date,
+	in_reply_to,
+	body
+);
blob - /dev/null
blob + a62fc6064bd6616d917f24b5f4c823c33a5b4905 (mode 644)
--- /dev/null
+++ cmd/listen/db.go
@@ -0,0 +1,180 @@
+package main
+
+import (
+	"bytes"
+	"database/sql"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"log"
+	"net/http"
+	"net/mail"
+	"strings"
+	"time"
+
+	"olowe.co/apub"
+)
+
+func (srv *server) index(activity *apub.Activity) error {
+	var who string
+	if activity.AttributedTo != "" {
+		who = activity.AttributedTo
+	} else if activity.Actor != "" {
+		who = activity.Actor
+	} else {
+		return fmt.Errorf("empty actor, empty attributedTo")
+	}
+	q := "SELECT id FROM actor WHERE id = ?"
+	row := srv.db.QueryRow(q, who)
+	var id string
+	err := row.Scan(&id)
+	if errors.Is(err, sql.ErrNoRows) {
+		actor, err := apub.LookupActor(who)
+		if err != nil {
+			return fmt.Errorf("lookup actor %s: %w", activity.AttributedTo, err)
+		}
+		if err := srv.indexActor(actor); err != nil {
+			return fmt.Errorf("index actor %s: %w", actor.ID, err)
+		}
+	} else if err != nil {
+		return fmt.Errorf("query index for actor %s: %w", who, err)
+	}
+
+	q = "INSERT INTO activity(id, type, name, published, summary, content, attributedTo) VALUES(?, ?, ?, ?, ?, ?, ?)"
+	_, err = srv.db.Exec(q, activity.ID, activity.Type, activity.Name, activity.Published.UnixNano(), activity.Summary, activity.Content, activity.AttributedTo)
+	if err != nil {
+		return err
+	}
+
+	if len(activity.To) >= 1 {
+		recipients := activity.To
+		recipients = append(recipients, activity.CC...)
+		for _, rcpt := range recipients {
+			if rcpt == apub.ToEveryone {
+				continue
+			}
+			q = "INSERT INTO recipient_to VALUES(?, ?)"
+			_, err = srv.db.Exec(q, activity.ID, rcpt)
+			if err != nil {
+				return fmt.Errorf("insert recipient_to: %w", err)
+			}
+		}
+	}
+
+	if err := insertFTS(srv.db, activity); err != nil {
+		return fmt.Errorf("add to full-text search: %w", err)
+	}
+	return nil
+}
+
+func (srv *server) indexActor(actor *apub.Actor) error {
+	q := "INSERT INTO actor(id, type, name, username, published, summary) VALUES (?, ?, ?, ?, ?, ?)"
+	_, err := srv.db.Exec(q, actor.ID, actor.Type, actor.Name, actor.Username, actor.Published.UnixNano(), actor.Summary)
+	return err
+}
+
+func insertFTS(db *sql.DB, activity *apub.Activity) error {
+	blob, err := apub.MarshalMail(activity)
+	if err != nil {
+		return fmt.Errorf("marshal activity to text blob: %w", err)
+	}
+	msg, err := mail.ReadMessage(bytes.NewReader(blob))
+	if err != nil {
+		return fmt.Errorf("parse intermediate mail message: %w", err)
+	}
+	q := `INSERT INTO post(id, "from", "to", date, in_reply_to, body) VALUES(?, ?, ?, ?, ?, ?)`
+	_, err = db.Exec(q, activity.ID, msg.Header.Get("From"), msg.Header.Get("To"), msg.Header.Get("Date"), msg.Header.Get("In-Reply-To"), blob)
+	return err
+}
+
+func (srv *server) handleSearch(w http.ResponseWriter, req *http.Request) {
+	if req.Method != http.MethodGet {
+		stat := http.StatusMethodNotAllowed
+		http.Error(w, http.StatusText(stat), stat)
+		return
+	}
+	query := req.URL.Query().Get("q")
+	if query == "" {
+		http.Error(w, "empty search query", http.StatusBadRequest)
+		return
+	} else if len(query) <= 3 {
+		http.Error(w, "search query too short: need at least 4 characters", http.StatusBadRequest)
+	}
+
+	found, err := srv.search(query)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	w.Header().Set("Content-Type", apub.ContentType)
+	if err := json.NewEncoder(w).Encode(found); err != nil {
+		log.Printf("encode search results: %v", err)
+	}
+}
+
+func (srv *server) search(query string) ([]apub.Activity, error) {
+	var stmt string
+	if FTS5 {
+		stmt = "SELECT id FROM post WHERE post MATCH ? ORDER BY rank"
+	} else {
+		stmt = "%" + query + "%"
+	}
+	q := strings.ReplaceAll(query, "@", `"@"`)
+	q = strings.ReplaceAll(q, ".", `"."`)
+	q = strings.ReplaceAll(q, "/", `"/"`)
+	q = strings.ReplaceAll(q, ":", `":"`)
+	log.Printf("search %s (escaped %s)", query, q)
+	rows, err := srv.db.Query(stmt, q)
+	if err != nil {
+		return nil, err
+	}
+	apids := []string{}
+	for rows.Next() {
+		var s string
+		err := rows.Scan(&s)
+		if errors.Is(err, sql.ErrNoRows) {
+			return []apub.Activity{}, nil
+		} else if err != nil {
+			return []apub.Activity{}, err
+		}
+		apids = append(apids, s)
+	}
+	return srv.lookupActivities(apids)
+}
+
+func (srv *server) lookupActivities(apid []string) ([]apub.Activity, error) {
+	q := "SELECT id, type, published, content FROM activity WHERE id " + sqlInExpr(len(apid))
+	args := make([]any, len(apid))
+	for i := range args {
+		args[i] = any(apid[i])
+	}
+	rows, err := srv.db.Query(q, args...)
+	if err != nil {
+		return nil, err
+	}
+
+	activities := []apub.Activity{}
+	for rows.Next() {
+		var a apub.Activity
+		var utime int64
+		err := rows.Scan(&a.ID, &a.Type, &utime, &a.Content)
+		if errors.Is(err, sql.ErrNoRows) {
+			return activities, nil
+		} else if err != nil {
+			return activities, err
+		}
+		t := time.Unix(0, utime)
+		a.Published = &t
+		activities = append(activities, a)
+	}
+	return activities, rows.Err()
+}
+
+// sqlInExpr returns the equivalent "IN(?, ?, ?, ...)" SQL expression for the given count.
+// This is only intended for use in "SELECT * WHERE id IN (?, ?, ?...)" statements.
+func sqlInExpr(count int) string {
+	if count <= 0 {
+		return "IN ()"
+	}
+	return "IN (?" + strings.Repeat(", ?", count-1) + ")"
+}
blob - /dev/null
blob + 9e7a89106283cd14ccbd65dd94f784f6d0d54fd7 (mode 644)
--- /dev/null
+++ cmd/listen/db_test.go
@@ -0,0 +1,12 @@
+package main
+
+import "testing"
+
+func TestSelectExpr(t *testing.T) {
+	columns := []string{"from", "to", "date", "subject"}
+	want := "IN (?, ?, ?, ?)"
+	got := sqlInExpr(len(columns))
+	if want != got {
+		t.Errorf("want %s, got %s", want, got)
+	}
+}
blob - /dev/null
blob + 8d7bfc91a256cc1d5ab4fde8fb98ed847e397c0e (mode 644)
--- /dev/null
+++ cmd/listen/watch.go
@@ -0,0 +1,25 @@
+package main
+
+import (
+	"log"
+	"time"
+
+	"olowe.co/apub/mastodon"
+)
+
+func (srv *server) watch(mastoURL, token string) {
+	for {
+		stream, err := mastodon.Watch(mastoURL, token)
+		if err != nil {
+			log.Printf("open mastodon stream: %v", err)
+			return
+		}
+		for stream.Next() {
+
+		}
+		if stream.Err() != nil {
+			log.Printf("read mastodon stream: %v", stream.Err())
+		}
+		time.Sleep(5)
+	}
+}
blob - d8dd1836aa16d8274d27b5a1480df17040a55f80
blob + 88354596aa7adde3b46dd2768e453b776bb3c78e
--- go.mod
+++ go.mod
@@ -1,3 +1,5 @@
 module olowe.co/apub
 
 go 1.19
+
+require github.com/mattn/go-sqlite3 v1.14.22 // indirect
blob - e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
blob + e8d092a96f051136dfa34966e255d3cedd866349
--- go.sum
+++ go.sum
@@ -0,0 +1,2 @@
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
blob - 42494826d064e201e5fddabbeed9df2311342b34
blob + 93e9b8a3bd6c3959154b7db16013ede15d00769f
--- mail.go
+++ mail.go
@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"fmt"
 	"net/mail"
+	"net/smtp"
 	"strings"
 	"time"
 )
@@ -59,3 +60,29 @@ func MarshalMail(activity *Activity) ([]byte, error) {
 	_, err = mail.ReadMessage(bytes.NewReader(buf.Bytes()))
 	return buf.Bytes(), err
 }
+
+func SendMail(client *smtp.Client, activity *Activity, from string, to ...string) error {
+	b, err := MarshalMail(activity)
+	if err != nil {
+		return fmt.Errorf("marshal to mail message: %w", err)
+	}
+	if err := client.Mail(from); err != nil {
+		return fmt.Errorf("mail command: %w", err)
+	}
+	for _, rcpt := range to {
+		if err := client.Rcpt(rcpt); err != nil {
+			return fmt.Errorf("rcpt command: %w", err)
+		}
+	}
+	wc, err := client.Data()
+	if err != nil {
+		return fmt.Errorf("data command: %w", err)
+	}
+	if _, err := wc.Write(b); err != nil {
+		return fmt.Errorf("write message: %w", err)
+	}
+	if err := wc.Close(); err != nil {
+		return fmt.Errorf("close message writer: %w", err)
+	}
+	return nil
+}
blob - 235301076f553c91b09cb0e478277d2bab4ac4c5
blob + 874d883c4e3b114252008c510be26e62bec5bd87
--- mail_test.go
+++ mail_test.go
@@ -2,7 +2,9 @@ package apub
 
 import (
 	"bytes"
+	"net"
 	"net/mail"
+	"net/smtp"
 	"os"
 	"testing"
 )
@@ -37,3 +39,26 @@ func TestMail(t *testing.T) {
 		t.Fatal(err)
 	}
 }
+
+func TestSendMail(t *testing.T) {
+	f, err := os.Open("testdata/note.json")
+	if err != nil {
+		t.Fatal(err)
+	}
+	a, err := Decode(f)
+	if err != nil {
+		t.Fatal(err)
+	}
+	f.Close()
+
+	conn, err := net.Dial("tcp", "[::1]:smtp")
+	if err != nil {
+		t.Fatal(err)
+	}
+	client, err := smtp.NewClient(conn, "localhost")
+	err = SendMail(client, a, "test@example.invalid", "otl")
+	if err != nil {
+		t.Error(err)
+	}
+	client.Quit()
+}
blob - 10ad89428310f2f22e18e031087c73487f173676
blob + 29ffc0cbad2b9729a9f8b2c5fa32f1ecdafd65af
--- mastodon/mastodon.go
+++ mastodon/mastodon.go
@@ -17,13 +17,13 @@ type Post struct {
 	ID        string    `json:"id"`
 	InReplyTo string    `json:"in_reply_to_id"`
 	Content   string    `json:"content"`
+	URL       string    `json:"url"`
 }
 
 // DecodeMail decodes the RFC822 message-encoded post from r.
 func DecodeMail(r io.Reader) (*Post, error) {
 	msg, err := mail.ReadMessage(r)
 	if err != nil {
-		panic(err)
 		return nil, err
 	}
 	var post Post
blob - /dev/null
blob + fb4cb9c3b465826674741cdfec76f3168cef4c71 (mode 644)
--- /dev/null
+++ mastodon/posts.txt
@@ -0,0 +1,123 @@
+:)
+event: update
+data: {"id":"111966189773859502","created_at":"2024-02-19T12:49:29.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://rss-mstdn.studiofreesia.com/users/fashionpress/statuses/111958227021266620","url":"https://rss-mstdn.studiofreesia.com/@fashionpress/111958227021266620","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>アニヴェン24年春コスメ、“大粒グリッター&パール”輝くブラウンカラーのリキッドアイシャドウなど<br><a href=\"https://www.fashion-press.net/news/115306?media=line\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"ellipsis\">fashion-press.net/news/115306?</span><span class=\"invisible\">media=line</span></a></p><p><a href=\"https://rss-mstdn.studiofreesia.com/tags/fashionpress\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>fashionpress</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%82%A2%E3%83%8B%E3%83%B4%E3%82%A7%E3%83%B3\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>アニヴェン</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/uneven\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>uneven</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%83%93%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>ビューティ</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>アイテム</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%82%B0%E3%83%AA%E3%83%83%E3%82%BF%E3%83%BC\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>グリッター</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%82%B3%E3%82%B9%E3%83%A1\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>コスメ</span></a> <a href=\"https://rss-mstdn.studiofreesia.com/tags/%E3%83%A1%E3%82%A4%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>メイクアップ</span></a></p>","reblog":null,"account":{"id":"110999845922001116","username":"fashionpress","acct":"fashionpress@rss-mstdn.studiofreesia.com","display_name":":rss: ファッションプレス","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2023-09-02T00:00:00.000Z","note":"<p>最新のファッションニュースを配信するRSS</p><p>このアカウントはRSSフィードの内容を投稿するbotアカウントです。<br>このアカウントの投稿に関するお問い合わせは <span class=\"h-card\"><a href=\"https://rss-mstdn.studiofreesia.com/@owner\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>owner</span></a></span> までお願いします。</p>","url":"https://rss-mstdn.studiofreesia.com/@fashionpress","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/999/845/922/001/116/original/52f8f5abc30b202a.png","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/999/845/922/001/116/original/52f8f5abc30b202a.png","header":"https://wayne.social/headers/original/missing.png","header_static":"https://wayne.social/headers/original/missing.png","followers_count":132,"following_count":0,"statuses_count":5251,"last_status_at":"2024-02-20","emojis":[{"shortcode":"rss","url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/100/815/original/8a2b8ff3cd5373f4.png","static_url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/100/815/static/8a2b8ff3cd5373f4.png","visible_in_picker":true}],"fields":[{"name":"Website","value":"<a href=\"https://www.fashion-press.net/\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"\">fashion-press.net/</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"RSS","value":"<a href=\"http://www.fashion-press.net/news/line.rss\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">http://www.</span><span class=\"ellipsis\">fashion-press.net/news/line.rs</span><span class=\"invisible\">s</span></a>","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"fashionpress","url":"https://wayne.social/tags/fashionpress"},{"name":"アニヴェン","url":"https://wayne.social/tags/%E3%82%A2%E3%83%8B%E3%83%B4%E3%82%A7%E3%83%B3"},{"name":"uneven","url":"https://wayne.social/tags/uneven"},{"name":"ビューティ","url":"https://wayne.social/tags/%E3%83%93%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3"},{"name":"アイテム","url":"https://wayne.social/tags/%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0"},{"name":"グリッター","url":"https://wayne.social/tags/%E3%82%B0%E3%83%AA%E3%83%83%E3%82%BF%E3%83%BC"},{"name":"コスメ","url":"https://wayne.social/tags/%E3%82%B3%E3%82%B9%E3%83%A1"},{"name":"メイクアップ","url":"https://wayne.social/tags/%E3%83%A1%E3%82%A4%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97"}],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966190795999271","created_at":"2024-02-19T12:49:35.526Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":null,"uri":"https://live-theater.net/notes/9pwhzrxi3x","url":"https://live-theater.net/notes/9pwhzrxi3x","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>ここでの会話に慣れてると現実でも「ありゃ〜」とか「労る」とか言っちゃいそうだから気をつけないと</p>","reblog":null,"account":{"id":"111687963672732051","username":"71chi","acct":"71chi@live-theater.net","display_name":"71CHI","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2024-01-02T00:00:00.000Z","note":"<p><span>七尾百合子にゾッコンなミリシタ初心者です HNの読みは「なないち」</span></p>","url":"https://live-theater.net/@71chi","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/111/687/963/672/732/051/original/f7d2175e78f9c4b0.png","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/111/687/963/672/732/051/original/f7d2175e78f9c4b0.png","header":"https://wayne.social/headers/original/missing.png","header_static":"https://wayne.social/headers/original/missing.png","followers_count":27,"following_count":28,"statuses_count":1378,"last_status_at":"2024-02-20","emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191211667265","created_at":"2024-02-20T22:34:49.846Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://firefish.ranranhome.info/notes/9pyic8zaxjm4d54g","url":"https://firefish.ranranhome.info/notes/9pyic8zaxjm4d54g","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><a href=\"https://firefish.ranranhome.info/@516\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@516</a></p>","reblog":null,"account":{"id":"111519723024966175","username":"710","acct":"710@firefish.ranranhome.info","display_name":"^るい^     (本垢~)","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2023-12-04T00:00:00.000Z","note":"<p><span><br><br><br>フォロー専用垢</span><a href=\"https://firefish.ranranhome.info/@710rui@firefish.ranranhome.info\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@710rui@firefish.ranranhome.info</a><span><br><br>リア友~!</span><a href=\"https://firefish.ranranhome.info/@koko@firefish.ranranhome.info\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@koko@firefish.ranranhome.info</a><span> </span><a href=\"https://firefish.ranranhome.info/@516@firefish.ranranhome.info\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@516@firefish.ranranhome.info</a><span><br><br></span></p>","url":"https://firefish.ranranhome.info/@710","avatar":"https://mstdn.nijist.info/system/cache/accounts/avatars/111/519/723/024/966/175/original/0d75dc3b6047477b.webp","avatar_static":"https://mstdn.nijist.info/system/cache/accounts/avatars/111/519/723/024/966/175/original/0d75dc3b6047477b.webp","header":"https://mstdn.nijist.info/system/cache/accounts/headers/111/519/723/024/966/175/original/f715d4caa16a5776.webp","header_static":"https://mstdn.nijist.info/system/cache/accounts/headers/111/519/723/024/966/175/original/f715d4caa16a5776.webp","followers_count":294,"following_count":314,"statuses_count":1993,"last_status_at":"2024-02-20","emojis":[],"fields":[{"name":"幼なじみ~!","value":"@Suna@firefish.ranranhome.info","verified_at":null},{"name":"大切な仲間!!!!","value":"@222@firefish.ranranhome.info","verified_at":null},{"name":"おにぃ~","value":"@REN857@firefish.ranranhome.info","verified_at":null},{"name":"おねぇ","value":"@516@firefish.ranranhome.info @222@firefish.ranranhome.info","verified_at":null},{"name":"いも~と","value":"@koko@firefish.ranranhome.info @nenenokatudouaka@firefish.ranranhome.info","verified_at":null},{"name":"愛方☆","value":"@Saikoudayo@firefish.ranranhome.info @akane295@firefish.ranranhome.info","verified_at":null},{"name":"大切で大好きな親友♡!!!","value":"@koko @516 @yukimi","verified_at":null}]},"media_attachments":[],"mentions":[{"id":"111622630927315181","username":"516","url":"https://firefish.ranranhome.info/@516","acct":"516@firefish.ranranhome.info"}],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966190778356456","created_at":"2024-02-19T12:49:36.006Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":null,"uri":"https://live-theater.net/notes/9pwhzsau40","url":"https://live-theater.net/notes/9pwhzsau40","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>未来ちゃ​:suu:​</p>","reblog":null,"account":{"id":"110944469778350772","username":"Grand_Sheet","acct":"Grand_Sheet@live-theater.net","display_name":"グランシート","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2023-08-24T00:00:00.000Z","note":"","url":"https://live-theater.net/@Grand_Sheet","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/944/469/778/350/772/original/2191fc2f75ac0789.webp","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/944/469/778/350/772/original/2191fc2f75ac0789.webp","header":"https://wayne.social/headers/original/missing.png","header_static":"https://wayne.social/headers/original/missing.png","followers_count":37,"following_count":39,"statuses_count":9314,"last_status_at":"2024-02-20","emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[{"shortcode":"suu","url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/106/138/original/4de9dc0e5eaae0cb.png","static_url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/106/138/static/4de9dc0e5eaae0cb.png","visible_in_picker":true}],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191213930436","created_at":"2024-02-20T22:34:53.867Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mastodon.social/users/pgdailynews/statuses/111966191213930436","url":"https://mastodon.social/@pgdailynews/111966191213930436","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>City urging residents to report accessibility issues in PG @Cityofpg <a href=\"https://mastodon.social/tags/princegeorgebc\" class=\"mention hashtag\" rel=\"tag\">#<span>princegeorgebc</span></a> <a href=\"https://pgdailynews.ca/index.php/2024/02/20/city-urging-residents-to-report-accessibility-issues-in-pg/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">pgdailynews.ca/index.php/2024/</span><span class=\"invisible\">02/20/city-urging-residents-to-report-accessibility-issues-in-pg/</span></a></p>","reblog":null,"application":{"name":"Web","website":null},"account":{"id":"110930138931752331","username":"pgdailynews","acct":"pgdailynews","display_name":"Prince George Daily News","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2023-08-21T00:00:00.000Z","note":"","url":"https://mastodon.social/@pgdailynews","uri":"https://mastodon.social/users/pgdailynews","avatar":"https://files.mastodon.social/accounts/avatars/110/930/138/931/752/331/original/edd105a0d7223379.jpg","avatar_static":"https://files.mastodon.social/accounts/avatars/110/930/138/931/752/331/original/edd105a0d7223379.jpg","header":"https://files.mastodon.social/accounts/headers/110/930/138/931/752/331/original/a1be9245b3109f62.jpeg","header_static":"https://files.mastodon.social/accounts/headers/110/930/138/931/752/331/original/a1be9245b3109f62.jpeg","followers_count":10,"following_count":13,"statuses_count":721,"last_status_at":"2024-02-20","hide_collections":false,"noindex":false,"emojis":[],"roles":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[{"name":"princegeorgebc","url":"https://mastodon.social/tags/princegeorgebc"}],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"created_at":"2024-02-20T22:34:46Z","url":"https://veganism.social/@old_hippie/111966190701157650","content":"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@phaedral\" class=\"u-url mention\">@<span>phaedral</span></a></span> W is a war criminal, plain and simple.</p>","account":{"username":"old_hippie","display_name":"Old Hippie Ⓥ","url":"https://veganism.social/@old_hippie","bot":false},"tags":[],"sensitive":false,"mentions":[],"language":"en","media_attachments":[],"reblog":null}
+
+event: update
+data: {"id":"111966191231994621","created_at":"2024-02-20T22:34:53.679Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":null,"uri":"https://misskey.io/notes/9pyicbxrqgya00o0","url":"https://misskey.io/notes/9pyicbxrqgya00o0","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>ヨルシカとYOASOBIを混同していた事が判明した朝​:meow_waitwhat:​</p>","reblog":null,"account":{"id":"110017919892433631","username":"bp090","acct":"bp090@misskey.io","display_name":"🔞呉 流木🔞","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2023-03-13T00:00:00.000Z","note":"<p><span>名前は「くれ りゅうぼく」です。 にわかな落書きアカウント。<br>18↑・成人済。<br>成人向け</span>🔞<span>かつ特殊性癖な内容も含みます、ご注意下さい。<br>フォロー返しは完全に気分でやってるのでまちまちです、ごめんね。<br>ちくちく言葉も出がちです…重ねてごめんね。<br></span><a href=\"https://linktr.ee/bp090\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https://linktr.ee/bp090</a><span><br></span><a href=\"https://misskey.io/tags/オリジナル\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#オリジナル</a> <a href=\"https://misskey.io/tags/一次創作\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#一次創作</a> <a href=\"https://misskey.io/tags/transfur\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#transfur</a></p>","url":"https://misskey.io/@bp090","avatar":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/accounts/avatars/110/017/919/892/433/631/original/bf936b24972149ac.png","avatar_static":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/accounts/avatars/110/017/919/892/433/631/original/bf936b24972149ac.png","header":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/accounts/headers/110/017/919/892/433/631/original/bef1144888f311cf.jpg","header_static":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/accounts/headers/110/017/919/892/433/631/original/bef1144888f311cf.jpg","followers_count":749,"following_count":426,"statuses_count":15811,"last_status_at":"2024-02-20","emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[{"shortcode":"meow_waitwhat","url":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/custom_emojis/images/000/108/651/original/c5af0935731bdd1f.png","static_url":"https://s3-ap-northeast-1.amazonaws.com/felesitas.cloud.storage/cache/custom_emojis/images/000/108/651/static/c5af0935731bdd1f.png","visible_in_picker":true}],"card":null,"poll":null}
+
+event: update
+data: {"account":{"acct":"NikoGory@misskey.io","avatar":"https://media.misskeyusercontent.com/misskey/64ab386e-ec34-4508-b48c-9df9e804150d.jpg","avatar_static":null,"bot":false,"created_at":"2024-02-20T22:34:53.429Z","display_name":"煮こごり:pudding_puddingified_verified:","emojis":[{"shortcode":"pudding_puddingified_verified","static_url":"https://mkkey.net/proxy/%2Femoji%2Fpudding_puddingified_verified.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fpudding_puddingified_verified.png","url":"https://mkkey.net/proxy/%2Femoji%2Fpudding_puddingified_verified.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fpudding_puddingified_verified.png","visible_in_picker":true},{"shortcode":"rn","static_url":"https://mkkey.net/proxy/%2Femoji%2Frn.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Frn.png","url":"https://mkkey.net/proxy/%2Femoji%2Frn.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Frn.png","visible_in_picker":true},{"shortcode":"reaction_shooting","static_url":"https://mkkey.net/proxy/%2Femoji%2Freaction_shooting.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Freaction_shooting.png","url":"https://mkkey.net/proxy/%2Femoji%2Freaction_shooting.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Freaction_shooting.png","visible_in_picker":true},{"shortcode":"man","static_url":"https://mkkey.net/proxy/%2Fmisskey%2F008bc549-46ff-49b3-8b06-3f134f0c1333.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fmisskey%2F008bc549-46ff-49b3-8b06-3f134f0c1333.png","url":"https://mkkey.net/proxy/%2Fmisskey%2F008bc549-46ff-49b3-8b06-3f134f0c1333.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fmisskey%2F008bc549-46ff-49b3-8b06-3f134f0c1333.png","visible_in_picker":true},{"shortcode":"note","static_url":"https://mkkey.net/proxy/%2Fmisskey%2F2ca4e3e6-8511-4f2d-978a-0c9b425e3b0d.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fmisskey%2F2ca4e3e6-8511-4f2d-978a-0c9b425e3b0d.png","url":"https://mkkey.net/proxy/%2Fmisskey%2F2ca4e3e6-8511-4f2d-978a-0c9b425e3b0d.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fmisskey%2F2ca4e3e6-8511-4f2d-978a-0c9b425e3b0d.png","visible_in_picker":true}],"fields":[],"followers_count":0,"following_count":0,"header":"","header_static":"","id":"952507410220051","locked":false,"moved":null,"note":"","statuses_count":0,"url":"https://misskey.io/@NikoGory","username":"NikoGory"},"application":null,"bookmarked":false,"card":null,"content":"<p></p><p></p>","created_at":"2024-02-20T22:34:22.720Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"987271626886254","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":null,"plain_content":null,"poll":null,"quote":null,"reblog":{"account":{"acct":"ju428an@misskey.io","avatar":"https://media.misskeyusercontent.com/misskey/ef1f0ae1-04ff-49c6-8977-267aa79012dd.jpg","avatar_static":null,"bot":false,"created_at":"2024-02-20T22:34:53.429Z","display_name":"じゅん:misubon::blobcatuwu:","emojis":[{"shortcode":"misubon","static_url":"https://mkkey.net/proxy/%2Fio%2F6b773060-5dd9-4742-93a6-62cfaba68036.gif?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fio%2F6b773060-5dd9-4742-93a6-62cfaba68036.gif","url":"https://mkkey.net/proxy/%2Fio%2F6b773060-5dd9-4742-93a6-62cfaba68036.gif?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fio%2F6b773060-5dd9-4742-93a6-62cfaba68036.gif","visible_in_picker":true},{"shortcode":"blobcatuwu","static_url":"https://mkkey.net/proxy/%2Femoji%2Fblobcatuwu.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fblobcatuwu.png","url":"https://mkkey.net/proxy/%2Femoji%2Fblobcatuwu.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fblobcatuwu.png","visible_in_picker":true}],"fields":[],"followers_count":0,"following_count":0,"header":"","header_static":"","id":"960793182120877","locked":false,"moved":null,"note":"","statuses_count":0,"url":"https://misskey.io/@ju428an","username":"ju428an"},"application":null,"bookmarked":false,"card":null,"content":"<p><a href=\"http://なおすきのお風呂.zip\" target=\"_blank\" rel=\"noopener noreferrer\">なおすきのお風呂.zip</a></p><p>:waai@misskey.io: (1), :henpin@misskey.io: (1)</p>","created_at":"2024-02-20T22:34:07.738Z","emoji_reactions":[{"count":1,"me":false,"name":":waai@misskey.io:"},{"count":1,"me":false,"name":":henpin@misskey.io:"}],"emojis":[{"shortcode":"waai@misskey.io","static_url":"https://mkkey.net/proxy/%2Femoji%2Fwaai.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fwaai.png","url":"https://mkkey.net/proxy/%2Femoji%2Fwaai.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fwaai.png","visible_in_picker":true},{"shortcode":"henpin@misskey.io","static_url":"https://mkkey.net/proxy/%2Femoji%2Fhenpin.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fhenpin.png","url":"https://mkkey.net/proxy/%2Femoji%2Fhenpin.png?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Femoji%2Fhenpin.png","visible_in_picker":true}],"favourited":false,"favourites_count":2,"id":"987271607468827","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":null,"plain_content":"なおすきのお風呂.zip","poll":null,"quote":null,"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"uri":"https://misskey.io/notes/9pyibchmp8ry0d97","url":"https://misskey.io/notes/9pyibchmp8ry0d97","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"uri":"https://misskey.io/notes/9pyibo1s8jby09jg/activity","url":"https://misskey.io/notes/9pyibo1s8jby09jg/activity","visibility":"public"}
+
+event: update
+data: {"account":{"acct":"taisyo@mstdn.jp","avatar":"https://media.mstdn.jp/accounts/avatars/000/010/984/original/87ba8b9268f40ff6.png","avatar_static":null,"bot":false,"created_at":"2024-02-20T22:34:53.429Z","display_name":"taisy0","emojis":[],"fields":[],"followers_count":0,"following_count":0,"header":"","header_static":"","id":"951290488188509","locked":false,"moved":null,"note":"","statuses_count":0,"url":"https://mstdn.jp/@taisyo","username":"taisyo"},"application":null,"bookmarked":false,"card":null,"content":"<p>Appleが開発者向けに「iOS 17.4 beta 4」や「macOS 14.4 beta 4」などの配信を開始しました。<br><a href=\"https://taisy0.com/2024/02/21/195338.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://taisy0.com/2024/02/21/195338.html</a></p><p></p>","created_at":"2024-02-20T22:34:12.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"987271612992382","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":null,"plain_content":"Appleが開発者向けに「iOS 17.4 beta 4」や「macOS 14.4 beta 4」などの配信を開始しました。\nhttps://taisy0.com/2024/02/21/195338.html","poll":null,"quote":null,"reblog":null,"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"uri":"https://mstdn.jp/users/taisyo/statuses/111966188471890699","url":"https://mstdn.jp/users/taisyo/statuses/111966188471890699","visibility":"public"}
+
+event: update
+data: {"id":"111966191266586607","created_at":"2024-02-20T22:33:28.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://sportsbots.xyz/users/penguins/statuses/1760070191017263208","url":"https://twitter.com/penguins/status/1760070191017263208","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>If a picture is worth 1,000 words, this video is definitely priceless.</p>","reblog":null,"account":{"id":"110176431213898137","username":"penguins","acct":"penguins@sportsbots.xyz","display_name":"Pittsburgh Penguins :verified_business: 🤖","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2008-06-05T00:00:00.000Z","note":"<p>Unofficial bot that mirrors Pittsburgh Penguins’s Twitter feed.</p><p>It's a great day for hockey! <a href=\"https://twitter.com/hashtag/LetsGoPens\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>LetsGoPens</span></a></p>","url":"https://sportsbots.xyz/users/penguins","uri":"https://sportsbots.xyz/users/penguins","avatar":"https://static.mamot.fr/cache/accounts/avatars/110/176/431/213/898/137/original/d5a7c3a7a14f6acc.jpg","avatar_static":"https://static.mamot.fr/cache/accounts/avatars/110/176/431/213/898/137/original/d5a7c3a7a14f6acc.jpg","header":"https://mamot.fr/headers/original/missing.png","header_static":"https://mamot.fr/headers/original/missing.png","followers_count":1870000,"following_count":0,"statuses_count":280,"last_status_at":"2024-02-20","emojis":[{"shortcode":"verified_business","url":"https://static.mamot.fr/cache/custom_emojis/images/000/287/084/original/bce8969bbbe3e066.png","static_url":"https://static.mamot.fr/cache/custom_emojis/images/000/287/084/static/bce8969bbbe3e066.png","visible_in_picker":true}],"fields":[{"name":"Twitter","value":"<a href=\"https://twitter.com/penguins\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">twitter.com/penguins</span></a>","verified_at":null},{"name":"Twitter Verified","value":"Business","verified_at":null},{"name":"Website","value":"<a href=\"http://linktr.ee/penguins\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">http://</span><span class=\"\">linktr.ee/penguins</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"Managed by","value":"<span class=\"h-card\"><a href=\"https://mastodon.social/@sportsbots\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>sportsbots</span></a></span>","verified_at":null},{"name":"Retention","value":"<span class=\"h-card\">90 days</span>","verified_at":null}]},"media_attachments":[{"id":"111966191020645059","type":"video","url":"https://static.mamot.fr/cache/media_attachments/files/111/966/191/020/645/059/original/d0ce17395fb482ed.mp4","preview_url":"https://static.mamot.fr/cache/media_attachments/files/111/966/191/020/645/059/small/d0ce17395fb482ed.png","remote_url":"https://video.twimg.com/amplify_video/1760062328123375616/vid/avc1/1280x720/1fzPPw8VSXy7ANpW.mp4?tag=14","preview_remote_url":null,"text_url":null,"meta":{"original":{"width":1280,"height":720,"frame_rate":"24000/1001","duration":147.2,"bitrate":1217440},"small":{"width":640,"height":360,"size":"640x360","aspect":1.7777777777777777}},"description":null,"blurhash":"UXCF;lNG0L-pD%ay-pofR*t6oJIoR*j@oLj["}],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191301192168","created_at":"2024-02-20T22:34:46.000Z","in_reply_to_id":"111966158621857480","in_reply_to_account_id":"109660883142160680","sensitive":true,"spoiler_text":"re: vegetarian food","visibility":"public","language":"en","uri":"https://mastodon.social/users/tanguyraton/statuses/111966190739059271","url":"https://mastodon.social/@tanguyraton/111966190739059271","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://tech.lgbt/@nina_kali_nina\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>nina_kali_nina</span></a></span> for tasting, yes probably. But as u seem interested in philosophy around, for full experience u hav to go to india :)</p>","reblog":null,"account":{"id":"111189963239918755","username":"tanguyraton","acct":"tanguyraton@mastodon.social","display_name":"tanguyraton","locked":false,"bot":false,"discoverable":false,"indexable":false,"group":false,"created_at":"2022-10-27T00:00:00.000Z","note":"","url":"https://mastodon.social/@tanguyraton","uri":"https://mastodon.social/users/tanguyraton","avatar":"https://cdn.expressional.social/avatars/original/missing.png","avatar_static":"https://cdn.expressional.social/avatars/original/missing.png","header":"https://cdn.expressional.social/headers/original/missing.png","header_static":"https://cdn.expressional.social/headers/original/missing.png","followers_count":19,"following_count":61,"statuses_count":683,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[]},"media_attachments":[],"mentions":[{"id":"109660883142160680","username":"nina_kali_nina","url":"https://tech.lgbt/@nina_kali_nina","acct":"nina_kali_nina@tech.lgbt"}],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191301828866","created_at":"2024-02-20T22:34:54.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://hackers.town/users/JoYo/statuses/111966191283457239","url":"https://hackers.town/@JoYo/111966191283457239","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"local_only":null,"activity_pub_type":"Note","content":"<p>850 ml != 1000 ml</p>","reblog":null,"account":{"id":"109154646091360580","username":"JoYo","acct":"JoYo@hackers.town","display_name":"JoYo","locked":true,"bot":false,"discoverable":true,"group":false,"created_at":"2020-06-03T00:00:00.000Z","note":"<p>Yo yo, this is JoYo.<br>I live at <span class=\"h-card\"><a href=\"https://hackers.town/@JoYo\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>JoYo</span></a></span> but this is my other home.</p><p>I am so very lucky in my life and will always be grateful for the people that stick around me.</p><p>🌐 Writing software and reverse engineering for computer network exploitation.</p><p>🍺 Find me brewing all-grain beers on the weekends.</p><p>🎸 I don't practice classical guitar everyday because I'm good at it.</p><p>🏹 Field archery if the weather is nice.</p>","url":"https://hackers.town/@JoYo","avatar":"https://petrous.vislae.town/system/cache/accounts/avatars/109/154/646/091/360/580/original/6af0614b479fa8e5.png","avatar_static":"https://petrous.vislae.town/system/cache/accounts/avatars/109/154/646/091/360/580/original/6af0614b479fa8e5.png","header":"https://petrous.vislae.town/system/cache/accounts/headers/109/154/646/091/360/580/original/ae5688c4965817bc.png","header_static":"https://petrous.vislae.town/system/cache/accounts/headers/109/154/646/091/360/580/original/ae5688c4965817bc.png","followers_count":222,"following_count":284,"statuses_count":3099,"last_status_at":"2024-02-20","emojis":[],"fields":[{"name":"Timezone","value":"UTC-05","verified_at":null},{"name":"Git","value":"<a href=\"https://joyo.dev\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">joyo.dev</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"Me","value":"they, he","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966189873698411","created_at":"2024-02-19T12:49:23.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://terere.social/users/0nuklqi8os/statuses/111958226567292437","url":"https://terere.social/@0nuklqi8os/111958226567292437","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><span class=\"h-card\"><a href=\"https://oyasumi.ski/@M\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>M</span></a></span><br><span class=\"h-card\"><a href=\"https://buttersc.one/@paradox\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>paradox</span></a></span><br><span class=\"h-card\"><a href=\"https://misskey.noellabo.jp/@Syokkan\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>Syokkan</span></a></span><br><span class=\"h-card\"><a href=\"https://mstdn.maud.io/@259_pokaiko\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>259_pokaiko</span></a></span><br><span class=\"h-card\"><a href=\"https://misskey.io/@ochan_nu\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>ochan_nu</span></a></span></p>","reblog":null,"account":{"id":"111956181472784308","username":"0nuklqi8os","acct":"0nuklqi8os@terere.social","display_name":"0nuklqi8os","locked":false,"bot":false,"discoverable":false,"group":false,"created_at":"2024-02-18T00:00:00.000Z","note":"","url":"https://terere.social/@0nuklqi8os","avatar":"https://wayne.social/avatars/original/missing.png","avatar_static":"https://wayne.social/avatars/original/missing.png","header":"https://wayne.social/headers/original/missing.png","header_static":"https://wayne.social/headers/original/missing.png","followers_count":0,"following_count":0,"statuses_count":1263,"last_status_at":"2024-02-20","emojis":[],"fields":[]},"media_attachments":[{"id":"111966188283649835","type":"image","url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/media_attachments/files/111/966/188/283/649/835/original/b22d65d679bddfb3.webp","preview_url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/media_attachments/files/111/966/188/283/649/835/small/b22d65d679bddfb3.webp","remote_url":"https://terere.social/system/media_attachments/files/111/958/226/486/237/590/original/b29ec0b2d5d8f02e.webp","preview_remote_url":null,"text_url":null,"meta":{"original":{"width":1009,"height":200,"size":"1009x200","aspect":5.045},"small":{"width":1009,"height":200,"size":"1009x200","aspect":5.045}},"description":null,"blurhash":"UTQcblVY%gIU8w8_%Mxu%2Rjayt7.8?bMxRj"}],"mentions":[{"id":"111945715784908537","username":"M","url":"https://oyasumi.ski/@M","acct":"M@oyasumi.ski"},{"id":"111958607211258317","username":"paradox","url":"https://buttersc.one/@paradox","acct":"paradox@buttersc.one"},{"id":"109968670614338257","username":"Syokkan","url":"https://misskey.noellabo.jp/@Syokkan","acct":"Syokkan@misskey.noellabo.jp"},{"id":"111960401317040004","username":"259_pokaiko","url":"https://mstdn.maud.io/@259_pokaiko","acct":"259_pokaiko@mstdn.maud.io"},{"id":"111945509817385855","username":"ochan_nu","url":"https://misskey.io/@ochan_nu","acct":"ochan_nu@misskey.io"}],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191021162810","created_at":"2024-02-19T12:49:39.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://social.vivaldi.net/users/hisumi/statuses/111958227628895323","url":"https://social.vivaldi.net/@hisumi/111958227628895323","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>今地金が値段上がってるから天然物も値段上がってますわよ…… <br>前に買ったやつも値上がりすごい</p>","reblog":null,"account":{"id":"109607437551666762","username":"hisumi","acct":"hisumi@vivaldi.net","display_name":"Hisumi","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2022-11-15T00:00:00.000Z","note":"<p>Twitter -&gt; <span class=\"h-card\"><a href=\"https://social.vivaldi.net/@hisumi\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>hisumi</span></a></span> </p><p>Opera user -&gt; Vivaldi user</p>","url":"https://social.vivaldi.net/@hisumi","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/607/437/551/666/762/original/c4f05fa38e39ece7.png","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/607/437/551/666/762/original/c4f05fa38e39ece7.png","header":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/109/607/437/551/666/762/original/88e1f04e27a1f7f3.png","header_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/109/607/437/551/666/762/original/88e1f04e27a1f7f3.png","followers_count":15,"following_count":8,"statuses_count":273,"last_status_at":"2024-02-20","emojis":[],"fields":[{"name":"Game","value":"","verified_at":null},{"name":"Draw","value":"","verified_at":null},{"name":"Gadget","value":"","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"account":{"acct":"sudaksis@tech.lgbt","avatar":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fmedia.tech.lgbt%2Faccounts%2Favatars%2F109%2F447%2F261%2F140%2F353%2F500%2Foriginal%2F355e27fcc1315ded.jpg&avatar=1","avatar_static":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fmedia.tech.lgbt%2Faccounts%2Favatars%2F109%2F447%2F261%2F140%2F353%2F500%2Foriginal%2F355e27fcc1315ded.jpg&avatar=1","bot":false,"created_at":"2023-06-19T23:39:31.532Z","discoverable":true,"display_name":"Sudaksis :v_ace: :flag_demisexual:","emojis":[{"shortcode":"techlgbt","static_url":"https://media.tech.lgbt/custom_emojis/images/000/250/617/original/f1badbdae3fa2024.png","url":"https://media.tech.lgbt/custom_emojis/images/000/250/617/original/f1badbdae3fa2024.png","visible_in_picker":true},{"shortcode":"v_ace","static_url":"https://media.tech.lgbt/custom_emojis/images/000/243/403/original/861a62be833d6aac.png","url":"https://media.tech.lgbt/custom_emojis/images/000/243/403/original/861a62be833d6aac.png","visible_in_picker":true},{"shortcode":"flag_demisexual","static_url":"https://media.tech.lgbt/custom_emojis/images/000/084/519/original/flag_demisexual.png","url":"https://media.tech.lgbt/custom_emojis/images/000/084/519/original/flag_demisexual.png","visible_in_picker":true}],"fields":[{"name":"Pronouns","value":"<span>He/him</span>","verified_at":null},{"name":"Orientation","value":"<span>Ace/Demi</span>","verified_at":null},{"name":"Circadian Rhythm","value":"<span>Crepuscular</span>","verified_at":null},{"name":"ESRB Rating","value":"<span>T for Teen</span>","verified_at":null}],"followers_count":487,"following_count":378,"fqn":"sudaksis@tech.lgbt","header":"https://sleepy.pleasant.rest/files/webpublic-b63afe04-f2bb-4824-b391-2a0665205254","header_static":"https://sleepy.pleasant.rest/files/webpublic-b63afe04-f2bb-4824-b391-2a0665205254","id":"9g72bw3wpbk2ax6b","locked":false,"moved":null,"note":"Internet transient. Tail dragger. Compassionate overthinker. Kivük.\n\nPosts and boosts furry things, art, music, games, tech, and social matters. Alt-text required for image boosts. More detail about me in the pinned introduction post!\n\nMusic recommendations daily at #AOTD\n\nmod on tech.lgbt but only posts with :techlgbt: are as a mod\n\n- Banner is my own pixel art of my character sitting on a brick wall overgrown with vines and flowers. Floating text reads \"Welcome Folks!\"\n- Avatar is a headshot of my character jamming out intensely in Rock Band with a guitar controller. Art by @slyasafoxibou@meow.social\n\n#furry #taur #transformation #ace #latinX #music #vinyl\n#noindex #nobot","statuses_count":17662,"uri":"https://tech.lgbt/users/sudaksis","url":"https://tech.lgbt/users/sudaksis","username":"sudaksis"},"application":null,"bookmarked":false,"card":null,"content":"","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:51.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyic9vcjzzy0j86","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":{"account":{"acct":"tauon@possum.city","avatar":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.possum.city%2Fuploads%2Fwebpublic-02e1c194-5336-4d33-8e12-819ce8f051cb.webp&avatar=1","avatar_static":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.possum.city%2Fuploads%2Fwebpublic-02e1c194-5336-4d33-8e12-819ce8f051cb.webp&avatar=1","bot":false,"created_at":"2023-10-17T15:34:08.329Z","discoverable":true,"display_name":"lily 🏳️‍⚧️ :flag_pansexual: θΔ ⋐","emojis":[{"shortcode":"flag_pansexual","static_url":"https://cdn.possum.city/uploads/f8f5f704-a225-4809-ae5f-e39d3fa740fa.png","url":"https://cdn.possum.city/uploads/f8f5f704-a225-4809-ae5f-e39d3fa740fa.png","visible_in_picker":true}],"fields":[{"name":"webbed site","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://tauon.dev/\">tauon.dev/</a>","verified_at":null},{"name":"dni list","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://tauon.dev/dni_list\">tauon.dev/dni_list</a>","verified_at":null},{"name":"i touch grass","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://graas.easrng.net/user/@tauon@possum.city\">graas.easrng.net/user/@tauon@possum.city</a>","verified_at":null}],"followers_count":212,"following_count":271,"fqn":"tauon@possum.city","header":"https://sleepy.pleasant.rest/files/webpublic-36bd3acd-aef7-4f33-a622-c7234d3c0b94","header_static":"https://sleepy.pleasant.rest/files/webpublic-36bd3acd-aef7-4f33-a622-c7234d3c0b94","id":"9ky1twi1tcsrh278","locked":false,"moved":null,"note":"the funny hackergirl in your free/libre computing device\neternally eepy and silly girl\n(i am called lily and my fursona is called tauon/tauri)\ni am 16 years old (this means don't be weird!!) (do be a bit weird though)\nmy pronouns are she/it (in english)\nin languages with grammatical genders such as french and russian, use the feminine form\ni am pansexual (i kiss anyone)\ni am a trans girl (god made me trans so that he'd have more time)\ni think i'm enby or something though i'm not sure (gender is confusing)\ni think i'm a therian cause i want a tail in real life\ni drew my avi (it's shit!) but twitter user @jankyoncoming@twitter.com drew my banner\nfollow requests are set to auto-accept\nwill probably follow back if it's clear you're human (esp. if you're queer)\ndms highly encouraged!\n#noindex","statuses_count":33,"uri":"https://possum.city/users/99smru4kxn","url":"https://possum.city/users/99smru4kxn","username":"tauon"},"application":null,"bookmarked":false,"card":null,"content":"<p><span>-: negative<br>+: positive<br>+/-: both negative and positive in some ways<br>mh: mental health<br>ph: physical health<br>what: if you read it, you'll say \"what (the fuck)\"<br>ec: eye contact<br>meta: related to fedi itself, like the spam problem could be considered a meta topic<br>uspol, ukpol, depol, ...: politics for the respective country code<br>ment: mention of something (for example, transphobia ment means a mention of transphobia)<br>oh: overheard, it's posting something someone else said sans context<br>subpost, subtoot, sub(other posting word): essentially vagueposting about something someone said or did without directly @'ing them in the post (tends to not mention the person by name either, if they have a chance of seeing it)<br>(also non-new people if you can think of any more, please suggest and i will add!)</span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T20:48:10.585Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyej3a1jzzy0j1u","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":null,"reblogged":false,"reblogs_count":2,"replies_count":0,"sensitive":false,"spoiler_text":"for people new to fedi, what common content warning components mean","tags":[],"text":"-: negative\n+: positive\n+/-: both negative and positive in some ways\nmh: mental health\nph: physical health\nwhat: if you read it, you'll say \"what (the fuck)\"\nec: eye contact\nmeta: related to fedi itself, like the spam problem could be considered a meta topic\nuspol, ukpol, depol, ...: politics for the respective country code\nment: mention of something (for example, transphobia ment means a mention of transphobia)\noh: overheard, it's posting something someone else said sans context\nsubpost, subtoot, sub(other posting word): essentially vagueposting about something someone said or did without directly @'ing them in the post (tends to not mention the person by name either, if they have a chance of seeing it)\n(also non-new people if you can think of any more, please suggest and i will add!)","uri":"https://possum.city/notes/9pyej3a1phl300c3","url":"https://possum.city/notes/9pyej3a1phl300c3","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":null,"uri":"https://tech.lgbt/users/sudaksis/statuses/111966191055326753/activity","url":"https://tech.lgbt/users/sudaksis/statuses/111966191055326753/activity","visibility":"public"}
+
+event: update
+data: {"account":{"acct":"brianleroux@indieweb.social","avatar":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F308%2F383%2F608%2F040%2F100%2Foriginal%2F73c96d34721dd60b.jpg&avatar=1","avatar_static":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F308%2F383%2F608%2F040%2F100%2Foriginal%2F73c96d34721dd60b.jpg&avatar=1","bot":false,"created_at":"2023-06-20T17:21:26.457Z","discoverable":true,"display_name":"Brian LeRoux 💚","emojis":[],"fields":[{"name":"me","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://brian.io\">brian.io</a>","verified_at":null},{"name":"work","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/brianleroux\">github.com/brianleroux</a>","verified_at":null},{"name":"backend","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://arc.codes\">arc.codes</a>","verified_at":null},{"name":"frontend","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://enhance.dev\">enhance.dev</a>","verified_at":null}],"followers_count":2656,"following_count":2558,"fqn":"brianleroux@indieweb.social","header":"https://sleepy.pleasant.rest/files/webpublic-88d8bb02-3805-4795-b47b-df2616f6ae01","header_static":"https://sleepy.pleasant.rest/files/webpublic-88d8bb02-3805-4795-b47b-df2616f6ae01","id":"9g849iuxr5mnykig","locked":false,"moved":null,"note":"Web developer, cofounder of Begin, maintainer of Architect, and Enhance. AWS serverless hero. \n\n#indieweb #webdev #enhance #fwa #serverless #aws","statuses_count":1877,"uri":"https://indieweb.social/users/brianleroux","url":"https://indieweb.social/users/brianleroux","username":"brianleroux"},"application":null,"bookmarked":false,"card":null,"content":"","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:43.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyic3p4jzzy0j85","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":{"account":{"acct":"mariohamann@indieweb.social","avatar":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F599%2F264%2F184%2F840%2F251%2Foriginal%2Fd3611491b713d660.png&avatar=1","avatar_static":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F599%2F264%2F184%2F840%2F251%2Foriginal%2Fd3611491b713d660.png&avatar=1","bot":false,"created_at":"2023-08-17T20:05:22.333Z","discoverable":true,"display_name":"Mario","emojis":[],"fields":[{"name":"Me","value":"<span>Web Developer • Musician</span>","verified_at":null},{"name":"Website","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://mariohamann.com\">mariohamann.com</a>","verified_at":null}],"followers_count":0,"following_count":0,"fqn":"mariohamann@indieweb.social","header":"https://dev.joinsharkey.org/static-assets/transparent.png","header_static":"https://dev.joinsharkey.org/static-assets/transparent.png","id":"9ij5nqxpx1097jad","locked":false,"moved":null,"note":"","statuses_count":21,"uri":"https://indieweb.social/users/mariohamann","url":"https://indieweb.social/users/mariohamann","username":"mariohamann"},"application":null,"bookmarked":false,"card":null,"content":"<p><span>I’m thrilled. Coming from </span><a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://indieweb.social/@brianleroux/111960008754305720\">indieweb.social/@brianleroux/111960008754305720</a><span> I just got enhance-ssr working with PHP:<br><br>1. Import </span><a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/extism/php-sdkExtismad\">github.com/extism/php-sdkExtismad</a><span> local WASM file…<br>3. …which was created with </span><a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/extism/js-pdk\">github.com/extism/js-pdk</a><span><br>4. Define input and components…<br>5. …run it...<br>6. …and get my enhanced component.<br><br>This is amazing. It means that I can build an Enhance component once and use it on a server in all the programming languages supported by Extism - and there are many: </span><a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/extism#run-webassembly-in-your-app\">github.com/extism#run-webassembly-in-your-app</a><span><br><br>cc </span><span class=\"h-card\" translate=\"no\"><a href=\"https://indieweb.social/@brianleroux\" class=\"u-url mention\">@<span>brianleroux</span></a></span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:28:43.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyi4dx4jzzy0j82","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[{"blurhash":"e03IP1}[];}A#T_NsCNFaes.?FI:RiOFo}%#s:NaJRxG.7ABEKN^JR","description":"Screenshot which shows Visual Studio Code, where PHP code is visible. It contains the first 5 steps of my post. At the bottom there is a terminal, which shows the output.","id":"9pyic3pnjzzy0j81","meta":{"height":1974,"width":2648},"preview_url":"https://sleepy.pleasant.rest/proxy/static.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Fmedia_attachments%2Ffiles%2F111%2F966%2F166%2F761%2F387%2F119%2Foriginal%2F2c08d769d04752c0.png&static=1","remote_url":"https://sleepy.pleasant.rest/files/webpublic-079c6242-73a3-4dcf-899e-e5863a5959f1","text_url":"https://sleepy.pleasant.rest/files/webpublic-079c6242-73a3-4dcf-899e-e5863a5959f1","type":"image","url":"https://sleepy.pleasant.rest/files/webpublic-079c6242-73a3-4dcf-899e-e5863a5959f1"},{"blurhash":"e13btA^+w=In9ba^W9WBj^t8XMX4bFjJnQxAw@oJS6Nzj_bJbIawjD","description":"List of all supported programming languages: https://github.com/extism#run-webassembly-in-your-app","id":"9pyic3mvjzzy0j80","meta":{"height":1568,"width":1070},"preview_url":"https://sleepy.pleasant.rest/proxy/static.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Fmedia_attachments%2Ffiles%2F111%2F966%2F166%2F868%2F795%2F580%2Foriginal%2F0c0daefb439be495.png&static=1","remote_url":"https://sleepy.pleasant.rest/files/webpublic-1041765f-6454-43e8-b5dc-a8a42d245068","text_url":"https://sleepy.pleasant.rest/files/webpublic-1041765f-6454-43e8-b5dc-a8a42d245068","type":"image","url":"https://sleepy.pleasant.rest/files/webpublic-1041765f-6454-43e8-b5dc-a8a42d245068"}],"mentions":[{"acct":"brianleroux@indieweb.social","id":"9g849iuxr5mnykig","url":"https://indieweb.social/@brianleroux","username":"brianleroux"}],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":1,"sensitive":false,"spoiler_text":"","tags":[],"text":"I’m thrilled. Coming from https://indieweb.social/@brianleroux/111960008754305720 I just got enhance-ssr working with PHP:\n\n1. Import https://github.com/extism/php-sdkExtismad local WASM file…\n3. …which was created with https://github.com/extism/js-pdk\n4. Define input and components…\n5. …run it...\n6. …and get my enhanced component.\n\nThis is amazing. It means that I can build an Enhance component once and use it on a server in all the programming languages supported by Extism - and there are many: https://github.com/extism#run-webassembly-in-your-app\n\ncc @brianleroux@indieweb.social","uri":"https://indieweb.social/users/mariohamann/statuses/111966166935508156","url":"https://indieweb.social/@mariohamann/111966166935508156","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":null,"uri":"https://indieweb.social/users/brianleroux/statuses/111966190514684187/activity","url":"https://indieweb.social/users/brianleroux/statuses/111966190514684187/activity","visibility":"public"}
+
+event: update
+data: {"account":{"acct":"brianleroux@indieweb.social","avatar":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F308%2F383%2F608%2F040%2F100%2Foriginal%2F73c96d34721dd60b.jpg&avatar=1","avatar_static":"https://sleepy.pleasant.rest/proxy/avatar.webp?url=https%3A%2F%2Fcdn.masto.host%2Findiewebsocial%2Faccounts%2Favatars%2F109%2F308%2F383%2F608%2F040%2F100%2Foriginal%2F73c96d34721dd60b.jpg&avatar=1","bot":false,"created_at":"2023-06-20T17:21:26.457Z","discoverable":true,"display_name":"Brian LeRoux 💚","emojis":[],"fields":[{"name":"me","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://brian.io\">brian.io</a>","verified_at":null},{"name":"work","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/brianleroux\">github.com/brianleroux</a>","verified_at":null},{"name":"backend","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://arc.codes\">arc.codes</a>","verified_at":null},{"name":"frontend","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://enhance.dev\">enhance.dev</a>","verified_at":null}],"followers_count":2656,"following_count":2558,"fqn":"brianleroux@indieweb.social","header":"https://sleepy.pleasant.rest/files/webpublic-88d8bb02-3805-4795-b47b-df2616f6ae01","header_static":"https://sleepy.pleasant.rest/files/webpublic-88d8bb02-3805-4795-b47b-df2616f6ae01","id":"9g849iuxr5mnykig","locked":false,"moved":null,"note":"Web developer, cofounder of Begin, maintainer of Architect, and Enhance. AWS serverless hero. \n\n#indieweb #webdev #enhance #fwa #serverless #aws","statuses_count":1877,"uri":"https://indieweb.social/users/brianleroux","url":"https://indieweb.social/users/brianleroux","username":"brianleroux"},"application":null,"bookmarked":false,"card":null,"content":"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://indieweb.social/@mariohamann\" class=\"u-url mention\">@<span>mariohamann</span></a></span><span> oh shit! that was fast haha …uh… can I give you commit privs to </span><a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://github.com/enhance-dev/enhance-ssr-php\">github.com/enhance-dev/enhance-ssr-php</a><span> ? this is fucking awesome!</span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:39.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyic0m0jzzy0j83","in_reply_to_account_id":"9ij5nqxpx1097jad","in_reply_to_id":"9pyi4dx4jzzy0j82","language":null,"media_attachments":[],"mentions":[{"acct":"mariohamann@indieweb.social","id":"9ij5nqxpx1097jad","url":"https://indieweb.social/@mariohamann","username":"mariohamann"}],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":null,"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":"@mariohamann@indieweb.social oh shit! that was fast haha …uh… can I give you commit privs to https://github.com/enhance-dev/enhance-ssr-php ? this is fucking awesome!","uri":"https://indieweb.social/users/brianleroux/statuses/111966190285323137","url":"https://indieweb.social/@brianleroux/111966190285323137","visibility":"public"}
+
+event: update
+data: {"id":"111966191326361533","created_at":"2024-02-20T22:34:55.580Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://mstdn.jp/users/YuyayayanZho/statuses/111966191326361533","url":"https://mstdn.jp/@YuyayayanZho/111966191326361533","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>だって課金する時は通帳の中に5万以上ある事が条件だもん。下回った場合課金しないって決めてる</p>","reblog":null,"application":{"name":"Moshidon","website":"https://github.com/LucasGGamerM/moshidon"},"account":{"id":"109386926753036204","username":"YuyayayanZho","acct":"YuyayayanZho","display_name":"ゆーや@自由鯖の主で誤字王で一応絵描き","locked":false,"bot":false,"discoverable":true,"group":false,"created_at":"2022-11-22T00:00:00.000Z","note":"<p>誤字王国へようこそ<br />ここには個性を爆発させた誤字王が居ます</p><p>何気にbot開発でプログラミングやってる</p><p>イラスト使用については固定された投稿の「イラストについて」をよく読んでください<br />絵のリクエストは固ツイの質問箱にて<br />フォロバ欲しかったら言ってくれー<br />フォロワーちゃんと見てるよ</p><p>(´・_・`)</p>","url":"https://mstdn.jp/@YuyayayanZho","avatar":"https://media.mstdn.jp/accounts/avatars/109/386/926/753/036/204/original/a540911e7eb6b15e.png","avatar_static":"https://media.mstdn.jp/accounts/avatars/109/386/926/753/036/204/original/a540911e7eb6b15e.png","header":"https://media.mstdn.jp/accounts/headers/109/386/926/753/036/204/original/860861e7d7efaf18.png","header_static":"https://media.mstdn.jp/accounts/headers/109/386/926/753/036/204/original/860861e7d7efaf18.png","followers_count":153,"following_count":56,"statuses_count":16218,"last_status_at":"2024-02-20","noindex":false,"emojis":[{"shortcode":"doge","url":"https://media.mstdn.jp/custom_emojis/images/000/000/783/original/eabe84867ef24f6d.png","static_url":"https://media.mstdn.jp/custom_emojis/images/000/000/783/static/eabe84867ef24f6d.png","visible_in_picker":true},{"shortcode":"discord","url":"https://media.mstdn.jp/custom_emojis/images/000/000/344/original/5aa1436f62fcb247.png","static_url":"https://media.mstdn.jp/custom_emojis/images/000/000/344/static/5aa1436f62fcb247.png","visible_in_picker":true},{"shortcode":"christmasparrot","url":"https://media.mstdn.jp/custom_emojis/images/000/002/772/original/668bb580d3c3e4ab.png","static_url":"https://media.mstdn.jp/custom_emojis/images/000/002/772/static/668bb580d3c3e4ab.png","visible_in_picker":true},{"shortcode":"nyancat","url":"https://media.mstdn.jp/custom_emojis/images/000/002/786/original/1be362722d3767aa.png","static_url":"https://media.mstdn.jp/custom_emojis/images/000/002/786/static/1be362722d3767aa.png","visible_in_picker":true}],"roles":[],"fields":[{"name":"Misskey :doge:","value":"<a href=\"https://misskey.io/@Yuya_Morax\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"><span class=\"invisible\">https://</span><span class=\"\">misskey.io/@Yuya_Morax</span><span class=\"invisible\"></span></a>","verified_at":"2024-02-17T07:17:17.429+00:00"},{"name":"すげー自由な鯖 :discord:","value":"<a href=\"https://discord.gg/EJ83RESZyk\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"><span class=\"invisible\">https://</span><span class=\"\">discord.gg/EJ83RESZyk</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"サブ垢 :christmasparrot:","value":"<a href=\"https://kirishima.cloud/@Yuyayaya\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"><span class=\"invisible\">https://</span><span class=\"\">kirishima.cloud/@Yuyayaya</span><span class=\"invisible\"></span></a>","verified_at":"2023-12-23T14:29:17.797+00:00"},{"name":"質問箱 :nyancat:","value":"<a href=\"https://fediqb.y-zu.org/questionbox/@YuyayayanZho@mstdn.jp\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">fediqb.y-zu.org/questionbox/@Y</span><span class=\"invisible\">uyayayanZho@mstdn.jp</span></a>","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"created_at":"2024-02-20T22:34:23.117Z","url":"https://transfem.social/notes/9pyiboct2x810blc","content":"<p><a href=\"https://digipres.club/@foone\" class=\"u-url mention\">@foone@digipres.club</a>  most efficient site on the web</p>","account":{"username":"Sapphicinsanity","display_name":"Samii","url":"https://transfem.social/@Sapphicinsanity","bot":false},"tags":[],"sensitive":false,"mentions":[],"language":null,"media_attachments":[],"reblog":null}
+
+event: update
+data: {"id":"111966191346566641","created_at":"2024-02-20T22:34:55.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://masto.ai/users/dustcircle/statuses/111966191315685098","url":"https://masto.ai/@dustcircle/111966191315685098","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>Common <a href=\"https://masto.ai/tags/Autistic\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Autistic</span></a> <a href=\"https://masto.ai/tags/Behaviors\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Behaviors</span></a> - as Observed by a <a href=\"https://masto.ai/tags/NonAutistic\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>NonAutistic</span></a></p><p><a href=\"https://www.youtube.com/watch?v=ARs4eAGfjFA\" rel=\"nofollow noopener noreferrer\" translate=\"no\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"ellipsis\">youtube.com/watch?v=ARs4eAGfjF</span><span class=\"invisible\">A</span></a></p>","reblog":null,"account":{"id":"109823729409253090","username":"dustcircle","acct":"dustcircle@masto.ai","display_name":"Steve Dustcircle 🌹","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2023-02-06T00:00:00.000Z","note":"<p>Activist &amp; Advocate in <a href=\"https://masto.ai/tags/Ohio\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Ohio</span></a>.</p><p><a href=\"https://masto.ai/tags/Author\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Author</span></a> and editor of over a dozen books. <br>Admin of Left of Left, Evangelically <a href=\"https://masto.ai/tags/Atheist\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Atheist</span></a>, &amp; <a href=\"https://masto.ai/tags/Secular\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Secular</span></a> Ohio.<br><a href=\"https://masto.ai/tags/Actor\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Actor</span></a> in film under the name, Steven Hudson.<br>Avid reader.</p><p>Tags you'll see from me:<br><a href=\"https://masto.ai/tags/DSA\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>DSA</span></a> <a href=\"https://masto.ai/tags/Coffee\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Coffee</span></a> <a href=\"https://masto.ai/tags/Writing\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Writing</span></a> <a href=\"https://masto.ai/tags/FTP\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>FTP</span></a> <a href=\"https://masto.ai/tags/Atheism\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Atheism</span></a> <a href=\"https://masto.ai/tags/LGBTQ\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>LGBTQ</span></a> <a href=\"https://masto.ai/tags/ACAB\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>ACAB</span></a> <a href=\"https://masto.ai/tags/AI\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>AI</span></a> <a href=\"https://masto.ai/tags/Science\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Science</span></a> <a href=\"https://masto.ai/tags/BLM\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>BLM</span></a> <a href=\"https://masto.ai/tags/HumanRights\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>HumanRights</span></a> <a href=\"https://masto.ai/tags/Comedy\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Comedy</span></a> <a href=\"https://masto.ai/tags/Gothic\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Gothic</span></a> <a href=\"https://masto.ai/tags/Crypto\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Crypto</span></a> <a href=\"https://masto.ai/tags/Cults\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Cults</span></a> <a href=\"https://masto.ai/tags/Religion\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Religion</span></a> <a href=\"https://masto.ai/tags/History\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>History</span></a> <a href=\"https://masto.ai/tags/Humanism\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Humanism</span></a> <a href=\"https://masto.ai/tags/HomeImprovement\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>HomeImprovement</span></a> <a href=\"https://masto.ai/tags/Acting\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>Acting</span></a> </p><p>Donate via PERA<br>2KFGNV7ENHKO4YD4QINYM4V62JAUYI5RYQFBKMCEIST3URTQLRVKTILEDE</p><p>Header art is mine.<br><a href=\"https://masto.ai/tags/fedi23\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>fedi23</span></a></p>","url":"https://masto.ai/@dustcircle","uri":"https://masto.ai/users/dustcircle","avatar":"https://media.infosec.exchange/infosec.exchange/cache/accounts/avatars/109/823/729/409/253/090/original/f59e6110ce2cceda.jpg","avatar_static":"https://media.infosec.exchange/infosec.exchange/cache/accounts/avatars/109/823/729/409/253/090/original/f59e6110ce2cceda.jpg","header":"https://media.infosec.exchange/infosec.exchange/cache/accounts/headers/109/823/729/409/253/090/original/cabbabcbebc65524.png","header_static":"https://media.infosec.exchange/infosec.exchange/cache/accounts/headers/109/823/729/409/253/090/original/cabbabcbebc65524.png","followers_count":485,"following_count":207,"statuses_count":18471,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[{"name":"Linktree","value":"<a href=\"https://linktr.ee/dustcircle\" rel=\"nofollow noopener noreferrer\" translate=\"no\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">linktr.ee/dustcircle</span><span class=\"invisible\"></span></a>","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"autistic","url":"https://infosec.exchange/tags/autistic"},{"name":"behaviors","url":"https://infosec.exchange/tags/behaviors"},{"name":"nonautistic","url":"https://infosec.exchange/tags/nonautistic"}],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191351142843","created_at":"2024-02-20T22:34:55.436Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":null,"uri":"https://misskey.io/notes/9pyicdakp8ry0dc7","url":"https://misskey.io/notes/9pyicdakp8ry0dc7","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>ちょっと見ない間にかわいいの絵文字がめっちゃ増えてる​:iinexe:​<span><br>レイドさん</span>​:super_kawaii:​</p>","reblog":null,"account":{"id":"110659769084980728","username":"morini_ochiteru","acct":"morini_ochiteru@misskey.io","display_name":"いが","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2023-07-05T00:00:00.000Z","note":"<p><span>ゲームとお絵描きするよ アークナイツが好き<br>ヴェンデッタ大好きクラブ<br>レイドさんとスージーちゃんはいいぞぉ</span></p>","url":"https://misskey.io/@morini_ochiteru","uri":"https://misskey.io/users/9go4xxl0oj","avatar":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/accounts/avatars/110/659/769/084/980/728/original/aafb3cebb574241e.gif","avatar_static":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/accounts/avatars/110/659/769/084/980/728/static/aafb3cebb574241e.png","header":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/accounts/headers/110/659/769/084/980/728/original/dff36063145483d8.webp","header_static":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/accounts/headers/110/659/769/084/980/728/original/dff36063145483d8.webp","followers_count":420,"following_count":46,"statuses_count":678,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[{"name":"絵倉庫など","value":"<a href=\"https://lit.link/moriochi\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https://lit.link/moriochi</a>","verified_at":null},{"name":"アクナイ絵クリップ","value":"<a href=\"https://misskey.io/clips/9i24efdcu4\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https://misskey.io/clips/9i24efdcu4</a>","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[{"shortcode":"iinexe","url":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/custom_emojis/images/000/045/121/original/b0634b9c6389f987.png","static_url":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/custom_emojis/images/000/045/121/static/b0634b9c6389f987.png","visible_in_picker":true},{"shortcode":"super_kawaii","url":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/custom_emojis/images/000/091/363/original/a82a59a8ed427c94.gif","static_url":"https://us-east-1.linodeobjects.com/sakurajima-mastodon/cache/custom_emojis/images/000/091/363/static/a82a59a8ed427c94.png","visible_in_picker":true}],"reactions":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191045052439","created_at":"2024-02-19T12:49:42.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://social.vivaldi.net/users/ffie6710/statuses/111958227836397893","url":"https://social.vivaldi.net/@ffie6710/111958227836397893","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>しごおつです</p>","reblog":null,"account":{"id":"110279644947129554","username":"ffie6710","acct":"ffie6710@vivaldi.net","display_name":"阿古久曽","locked":true,"bot":false,"discoverable":true,"group":false,"created_at":"2023-04-29T00:00:00.000Z","note":"","url":"https://social.vivaldi.net/@ffie6710","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/279/644/947/129/554/original/6e8e1c1c327ce827.jpeg","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/110/279/644/947/129/554/original/6e8e1c1c327ce827.jpeg","header":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/110/279/644/947/129/554/original/a8d46cbc59c1973c.jpg","header_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/110/279/644/947/129/554/original/a8d46cbc59c1973c.jpg","followers_count":8,"following_count":0,"statuses_count":723,"last_status_at":"2024-02-20","emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"account":{"acct":"frost@wolfdo.gg","avatar":"https://eepy.zone/proxy/avatar.webp?url=https%3A%2F%2Fmedia.eepy.zone%2Fmkmedia%2F96a360e7-eb15-4d95-955c-603f79485fa7.png&avatar=1","avatar_static":"https://eepy.zone/proxy/avatar.webp?url=https%3A%2F%2Fmedia.eepy.zone%2Fmkmedia%2F96a360e7-eb15-4d95-955c-603f79485fa7.png&avatar=1","bot":false,"created_at":"2023-11-08T12:03:02.439Z","discoverable":true,"display_name":"Noble :frostbite:","emojis":[{"shortcode":"frostbite","static_url":"https://arctic.wolfdo.gg/bowl/dfc27eaa-cda0-46a4-a1ff-cdf573ccd371.png","url":"https://arctic.wolfdo.gg/bowl/dfc27eaa-cda0-46a4-a1ff-cdf573ccd371.png","visible_in_picker":true},{"shortcode":"firefish","static_url":"https://arctic.wolfdo.gg/bowl/04aa0271-d2f5-44ef-a3bc-9f136cdd876d.png","url":"https://arctic.wolfdo.gg/bowl/04aa0271-d2f5-44ef-a3bc-9f136cdd876d.png","visible_in_picker":true}],"fields":[{"name":"👥 Pronouns","value":"<span>he/him</span>","verified_at":null},{"name":"❄️ Website","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://glacier.dog\">glacier.dog</a>","verified_at":null},{"name":"🔗 Find me","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://fursona.directory/@frost\">fursona.directory/@frost</a>","verified_at":null},{"name":"🖼️ PFP (Twitter)","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://gla.dog/wacky\">gla.dog/wacky</a>","verified_at":null},{"name":"📅 On Fedi since","value":"<span>Jul 14, 2021</span>","verified_at":null}],"followers_count":2,"following_count":0,"fqn":"frost@wolfdo.gg","header":"https://media.eepy.zone/mkmedia/ea2d144b-ada6-4544-8a89-d06beeb0931f.png","header_static":"https://media.eepy.zone/mkmedia/ea2d144b-ada6-4544-8a89-d06beeb0931f.png","id":"9lt9z63rwq4luqcd","locked":false,"moved":null,"note":"18 • Taken • SFW • Roblox Dev • Chronic Booster • Dog-Brained • Admin of :firefish: **wolfdo.gg**! :frostbite:\n\nquick facts about my account:\n◦ will only interact with nsfw if it's properly cw'd! (even then, unlikely to comment or boost)\n◦ i mostly boost #furry, #gamedev, and #meme content!\n◦ images i send will have alt text 99% of the time, boosted images not a guarantee\n◦ i try my best not to be a nuisance, if anything's wrong let me know!\n\nfeel free to drop a follow! i don't bite! ^^\n\nthe 'cule:\n💙 @frost\n🧡 @MLGBudderCD\n💛 @Meijer","statuses_count":1239,"uri":"https://wolfdo.gg/users/9df6vh7frj","url":"https://wolfdo.gg/users/9df6vh7frj","username":"frost"},"application":null,"bookmarked":false,"card":null,"content":"","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:51.812Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyicahw0zk901zi","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[],"reblog":{"account":{"acct":"hannu@meow.social","avatar":"https://eepy.zone/proxy/avatar.webp?url=https%3A%2F%2Fmedia.eepy.zone%2Fmkmedia%2Fcb2ae358-36fb-486f-a927-3f4f4a1c7e40.png&avatar=1","avatar_static":"https://eepy.zone/proxy/avatar.webp?url=https%3A%2F%2Fmedia.eepy.zone%2Fmkmedia%2Fcb2ae358-36fb-486f-a927-3f4f4a1c7e40.png&avatar=1","bot":false,"created_at":"2024-01-26T00:05:22.635Z","discoverable":true,"display_name":"Hannu","emojis":[],"fields":[{"name":"Website","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://hannu.art/\">hannu.art/</a>","verified_at":null},{"name":"Telegram channel","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://t.me/hannuart\">t.me/hannuart</a>","verified_at":null}],"followers_count":417,"following_count":104,"fqn":"hannu@meow.social","header":"https://media.eepy.zone/mkmedia/e39c458f-f09e-4262-b130-265339ee0c0f.jpg","header_static":"https://media.eepy.zone/mkmedia/e39c458f-f09e-4262-b130-265339ee0c0f.jpg","id":"9oxg4jm3ozcb047u","locked":false,"moved":null,"note":"⌘ QUEST BEAST ⌘ \nArtist trying to do my best! \nʙɪᴛᴇ ᴛʜᴇ ʜᴀɴᴅ!\n\n【vernid enjoyer】","statuses_count":154,"uri":"https://meow.social/users/hannu","url":"https://meow.social/users/hannu","username":"hannu"},"application":null,"bookmarked":false,"card":null,"content":"<p><span>Let the current take you.</span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T17:33:33.000Z","emoji_reactions":[{"count":1,"me":false,"name":"⭐"}],"emojis":[],"favourited":false,"favourites_count":1,"id":"9py7kssorf6300ic","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[{"blurhash":"eM5RJRYRpIj?adUGcXa2aia#TIpHaKaKn+kppHX7nNfhjZbvoci{jF","description":"Vernid floating in water","id":"9py7l1ihrf6300ib","meta":{"height":2054,"width":1800},"preview_url":"https://media.eepy.zone/mkmedia/thumbnail-ae8b68ea-f767-4120-80d5-a9048a806f49.webp","remote_url":"https://media.eepy.zone/mkmedia/ab1ff415-a5eb-452b-9ac2-9e5e11eeed2b.png","text_url":"https://media.eepy.zone/mkmedia/ab1ff415-a5eb-452b-9ac2-9e5e11eeed2b.png","type":"image","url":"https://media.eepy.zone/mkmedia/ab1ff415-a5eb-452b-9ac2-9e5e11eeed2b.png"}],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":null,"reactions":[{"count":1,"me":false,"name":"⭐"}],"reblog":null,"reblogged":false,"reblogs_count":2,"replies_count":1,"sensitive":false,"spoiler_text":"","tags":[],"text":"Let the current take you.","uri":"https://meow.social/users/hannu/statuses/111965006318269779","url":"https://meow.social/@hannu/111965006318269779","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":null,"uri":"https://wolfdo.gg/notes/9pyicahwyq8zrzbg/activity","url":"https://wolfdo.gg/notes/9pyicahwyq8zrzbg/activity","visibility":"public"}
+
+event: update
+data: {"id":"111966190966570840","created_at":"2024-02-19T12:49:26.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://social.vivaldi.net/users/jessica762/statuses/111958226802227094","url":"https://social.vivaldi.net/@jessica762/111958226802227094","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>疲れすぎて忘れてた!fediverseに再入学して今日で1年です!(最初の入学は2017年ごろのMastodonブーム)</p>","reblog":null,"account":{"id":"109892163286390282","username":"jessica762","acct":"jessica762@vivaldi.net","display_name":"みずいろ :tony_happy:","locked":true,"bot":false,"discoverable":false,"group":false,"created_at":"2023-02-19T00:00:00.000Z","note":"<p>勉強とお笑い<br>🎓放送大学🌎自然と環境コース🌳2021.10〜</p>","url":"https://social.vivaldi.net/@jessica762","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/892/163/286/390/282/original/0596c139b781b013.jpeg","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/892/163/286/390/282/original/0596c139b781b013.jpeg","header":"https://wayne.social/headers/original/missing.png","header_static":"https://wayne.social/headers/original/missing.png","followers_count":25,"following_count":16,"statuses_count":1649,"last_status_at":"2024-02-20","emojis":[{"shortcode":"tony_happy","url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/006/845/original/47996939518ee6b6.png","static_url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/custom_emojis/images/000/006/845/static/47996939518ee6b6.png","visible_in_picker":true}],"fields":[{"name":"Instagram","value":"<a href=\"https://instagram.com/_with_jessica\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">instagram.com/_with_jessica</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"duolingo","value":"<a href=\"https://www.duolingo.com/profile/jessica_762\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"ellipsis\">duolingo.com/profile/jessica_7</span><span class=\"invisible\">62</span></a>","verified_at":null},{"name":"エンタメ感想","value":"<span class=\"h-card\"><a href=\"https://fedibird.com/@jessica_8877\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>jessica_8877@fedibird.com</span></a></span>","verified_at":null},{"name":"写真","value":"<span class=\"h-card\"><a href=\"https://pixelfed.tokyo/jessica842\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>jessica842@pixelfed.tokyo</span></a></span>","verified_at":null}]},"media_attachments":[{"id":"111966189365073470","type":"image","url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/media_attachments/files/111/966/189/365/073/470/original/0405306c2fc44510.jpg","preview_url":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/media_attachments/files/111/966/189/365/073/470/small/0405306c2fc44510.jpg","remote_url":"https://social-cdn.vivaldi.net/system/media_attachments/files/111/958/226/766/077/975/original/8ef2fdcce8ecea72.jpg","preview_remote_url":null,"text_url":null,"meta":{"original":{"width":750,"height":836,"size":"750x836","aspect":0.8971291866028708},"small":{"width":455,"height":507,"size":"455x507","aspect":0.8974358974358975}},"description":"2023/2/19登録","blurhash":"U67KrV^*-gtAxdsoxut89WE3SBavXUS$NMkC"}],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191391254994","created_at":"2024-02-20T22:34:55.000Z","in_reply_to_id":"111966150826871021","in_reply_to_account_id":"109392197848725056","sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://ravenation.club/users/ordosmarkzero/statuses/111966191294810395","url":"https://ravenation.club/@ordosmarkzero/111966191294810395","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://universeodon.com/@SrRochardBunson\" class=\"u-url mention\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">@<span>SrRochardBunson</span></a></span> </p><p>I thought there has to be one out there so I went to the place I thought would be most likely to have them... a facebook group for fans of spacex.</p><p>first thing I saw was five back to back tucker carlson videos so no I'm guessing even they know and are on board with all the other stuff.</p>","reblog":null,"account":{"id":"111048218017675547","username":"ordosmarkzero","acct":"ordosmarkzero@ravenation.club","display_name":"Ordos Mk.0","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2023-08-17T00:00:00.000Z","note":"<p>dance music &amp; ambient music</p>","url":"https://ravenation.club/@ordosmarkzero","uri":"https://ravenation.club/users/ordosmarkzero","avatar":"https://media.expressional.social/cache/accounts/avatars/111/048/218/017/675/547/original/25fc975365d54522.png","avatar_static":"https://media.expressional.social/cache/accounts/avatars/111/048/218/017/675/547/original/25fc975365d54522.png","header":"https://media.expressional.social/cache/accounts/headers/111/048/218/017/675/547/original/be65447c629044ed.png","header_static":"https://media.expressional.social/cache/accounts/headers/111/048/218/017/675/547/original/be65447c629044ed.png","followers_count":119,"following_count":180,"statuses_count":663,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[{"name":"bandcamp","value":"<a href=\"https://ordosmarkzero.bandcamp.com/music\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">ordosmarkzero.bandcamp.com/mus</span><span class=\"invisible\">ic</span></a>","verified_at":"2024-02-20T00:29:40.220+00:00"},{"name":"linktree","value":"<a href=\"https://linktr.ee/ordosmarkzero\" rel=\"nofollow noopener noreferrer\" translate=\"no\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">linktr.ee/ordosmarkzero</span><span class=\"invisible\"></span></a>","verified_at":null}]},"media_attachments":[],"mentions":[{"id":"109392197848725056","username":"SrRochardBunson","url":"https://universeodon.com/@SrRochardBunson","acct":"SrRochardBunson@universeodon.com"}],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191360766276","created_at":"2024-02-20T22:34:56.110Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mastodon.online/users/SocraticEthics/statuses/111966191360766276","url":"https://mastodon.online/@SocraticEthics/111966191360766276","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><a href=\"https://youtube.com/watch?v=VStIR5pRJiI&amp;si=UdqLXP3ruPb_dTVo\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">youtube.com/watch?v=VStIR5pRJi</span><span class=\"invisible\">I&amp;si=UdqLXP3ruPb_dTVo</span></a> <br />‼️🇺🇦Aeromedical evacuation of the wounded to hospitals by Ukrainian National police air-ambulance helicopters (Ukrinform - Ukrainian National News Agency VIDEO) <a href=\"https://mastodon.online/tags/Ukraine\" class=\"mention hashtag\" rel=\"tag\">#<span>Ukraine</span></a> <a href=\"https://mastodon.online/tags/Mastodon\" class=\"mention hashtag\" rel=\"tag\">#<span>Mastodon</span></a> <a href=\"https://mastodon.online/tags/Press\" class=\"mention hashtag\" rel=\"tag\">#<span>Press</span></a> <a href=\"https://mastodon.online/tags/News\" class=\"mention hashtag\" rel=\"tag\">#<span>News</span></a> <a href=\"https://mastodon.online/tags/russiaUkraineWar\" class=\"mention hashtag\" rel=\"tag\">#<span>russiaUkraineWar</span></a> <a href=\"https://mastodon.online/tags/9yrInvasionofUkraine\" class=\"mention hashtag\" rel=\"tag\">#<span>9yrInvasionofUkraine</span></a>  <a href=\"https://mastodon.online/tags/BoycottMusk\" class=\"mention hashtag\" rel=\"tag\">#<span>BoycottMusk</span></a><br /><a href=\"https://mastodon.online/tags/SupportEUfarmingBoycottPolishFarms\" class=\"mention hashtag\" rel=\"tag\">#<span>SupportEUfarmingBoycottPolishFarms</span></a><br /><a href=\"https://mastodon.online/tags/NoEUPresidencyForHungary\" class=\"mention hashtag\" rel=\"tag\">#<span>NoEUPresidencyForHungary</span></a><br /><a href=\"https://mastodon.online/tags/NoUSRepublicans2024\" class=\"mention hashtag\" rel=\"tag\">#<span>NoUSRepublicans2024</span></a><br /><a href=\"https://mastodon.online/tags/BetterOldThanSeditious\" class=\"mention hashtag\" rel=\"tag\">#<span>BetterOldThanSeditious</span></a></p>","reblog":null,"application":{"name":"Metatext","website":"https://metabolist.org/metatext"},"account":{"id":"108201884332506894","username":"SocraticEthics","acct":"SocraticEthics","display_name":"Ukraine War Bulletins and News","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2022-04-27T00:00:00.000Z","note":"<p>🇺🇦Clearing House for Ukrainian  News and War Updates from multiple English source located around the globe. News may be in real time or as close as possible.  <br />Not a bot.<br />⚠️Warning: Videos and Photos may contain Graphic and/or Violent content depicting actual war footage. Viewer discretion is advised <br />🫶Welcome Musk refugees from X and Twitter. Glad to see you safeguarded your user data. <br />
💙Slava Ukrayini! Heroyam Slava!💛</p>","url":"https://mastodon.online/@SocraticEthics","uri":"https://mastodon.online/users/SocraticEthics","avatar":"https://files.mastodon.online/accounts/avatars/108/201/884/332/506/894/original/b9668deaea2d2aca.png","avatar_static":"https://files.mastodon.online/accounts/avatars/108/201/884/332/506/894/original/b9668deaea2d2aca.png","header":"https://files.mastodon.online/accounts/headers/108/201/884/332/506/894/original/40a7dbd3c552da9f.jpeg","header_static":"https://files.mastodon.online/accounts/headers/108/201/884/332/506/894/original/40a7dbd3c552da9f.jpeg","followers_count":58123,"following_count":10,"statuses_count":144627,"last_status_at":"2024-02-20","hide_collections":false,"noindex":false,"emojis":[],"roles":[],"fields":[{"name":"Ukraine","value":"Crimea is Ukraine","verified_at":null},{"name":"War","value":"2014 started the War in Ukraine","verified_at":null},{"name":"Russia","value":"Russia invaded in 2014","verified_at":null},{"name":"News","value":"About Ukraine and Other News","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"ukraine","url":"https://mastodon.online/tags/ukraine"},{"name":"mastodon","url":"https://mastodon.online/tags/mastodon"},{"name":"press","url":"https://mastodon.online/tags/press"},{"name":"news","url":"https://mastodon.online/tags/news"},{"name":"russiaukrainewar","url":"https://mastodon.online/tags/russiaukrainewar"},{"name":"9yrinvasionofukraine","url":"https://mastodon.online/tags/9yrinvasionofukraine"},{"name":"boycottMusk","url":"https://mastodon.online/tags/boycottMusk"},{"name":"supporteufarmingboycottpolishfarms","url":"https://mastodon.online/tags/supporteufarmingboycottpolishfarms"},{"name":"noeupresidencyforhungary","url":"https://mastodon.online/tags/noeupresidencyforhungary"},{"name":"nousrepublicans2024","url":"https://mastodon.online/tags/nousrepublicans2024"},{"name":"betteroldthanseditious","url":"https://mastodon.online/tags/betteroldthanseditious"}],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191396820616","created_at":"2024-02-20T22:34:56.654Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":true,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mastodon.social/users/SoLSec/statuses/111966191396820616","url":"https://mastodon.social/@SoLSec/111966191396820616","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p><a href=\"https://www.timesnownews.com/world/who-is-christopher-pohlhaus-blood-tribe-nazi-group-leader-marching-in-nashville-article-107785195\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://www.</span><span class=\"ellipsis\">timesnownews.com/world/who-is-</span><span class=\"invisible\">christopher-pohlhaus-blood-tribe-nazi-group-leader-marching-in-nashville-article-107785195</span></a></p>","reblog":null,"account":{"id":"111405900861538169","username":"SoLSec","acct":"SoLSec","display_name":"▌║█║│║▌│0xDEADBEEF│▌│║▌║▌│║║","locked":false,"bot":false,"discoverable":true,"indexable":true,"group":false,"created_at":"2023-11-13T00:00:00.000Z","note":"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://mastodon.social/@SoLSec\" class=\"u-url mention\">@<span>SoLSec</span></a></span>:~# lsof /<br /><a href=\"https://mastodon.social/tags/Anonymous\" class=\"mention hashtag\" rel=\"tag\">#<span>Anonymous</span></a> <a href=\"https://mastodon.social/tags/Linux\" class=\"mention hashtag\" rel=\"tag\">#<span>Linux</span></a> <a href=\"https://mastodon.social/tags/GNU\" class=\"mention hashtag\" rel=\"tag\">#<span>GNU</span></a> <a href=\"https://mastodon.social/tags/GreyHat\" class=\"mention hashtag\" rel=\"tag\">#<span>GreyHat</span></a> <a href=\"https://mastodon.social/tags/Privacy\" class=\"mention hashtag\" rel=\"tag\">#<span>Privacy</span></a> <a href=\"https://mastodon.social/tags/GoodTrouble\" class=\"mention hashtag\" rel=\"tag\">#<span>GoodTrouble</span></a> <a href=\"https://mastodon.social/tags/OSINT\" class=\"mention hashtag\" rel=\"tag\">#<span>OSINT</span></a> <a href=\"https://mastodon.social/tags/Encryption\" class=\"mention hashtag\" rel=\"tag\">#<span>Encryption</span></a> <a href=\"https://mastodon.social/tags/Legion\" class=\"mention hashtag\" rel=\"tag\">#<span>Legion</span></a> <a href=\"https://mastodon.social/tags/OpSec\" class=\"mention hashtag\" rel=\"tag\">#<span>OpSec</span></a> <a href=\"https://mastodon.social/tags/Antifa\" class=\"mention hashtag\" rel=\"tag\">#<span>Antifa</span></a> <a href=\"https://mastodon.social/tags/ParrotSec\" class=\"mention hashtag\" rel=\"tag\">#<span>ParrotSec</span></a> <a href=\"https://mastodon.social/tags/OffSec\" class=\"mention hashtag\" rel=\"tag\">#<span>OffSec</span></a> <a href=\"https://mastodon.social/tags/AnonOps\" class=\"mention hashtag\" rel=\"tag\">#<span>AnonOps</span></a> <br />🏴🏴‍☠️</p>","url":"https://mastodon.social/@SoLSec","uri":"https://mastodon.social/users/SoLSec","avatar":"https://files.mastodon.social/accounts/avatars/111/405/900/861/538/169/original/0a283d34717e29a9.png","avatar_static":"https://files.mastodon.social/accounts/avatars/111/405/900/861/538/169/original/0a283d34717e29a9.png","header":"https://files.mastodon.social/accounts/headers/111/405/900/861/538/169/original/d519fd913bf3fe34.png","header_static":"https://files.mastodon.social/accounts/headers/111/405/900/861/538/169/original/d519fd913bf3fe34.png","followers_count":39,"following_count":93,"statuses_count":1563,"last_status_at":"2024-02-20","hide_collections":true,"noindex":true,"emojis":[],"roles":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191046405881","created_at":"2024-02-19T12:49:37.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://machikadon.online/users/gonnta/statuses/111958227493133789","url":"https://machikadon.online/@gonnta/111958227493133789","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>今週試験なのに1章まるまる終わってないの頭おかしい</p>","reblog":null,"account":{"id":"109607414794656459","username":"gonnta","acct":"gonnta@machikadon.online","display_name":"四季ごんた","locked":false,"bot":false,"discoverable":false,"group":false,"created_at":"2020-08-07T00:00:00.000Z","note":"<p>進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入編入進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級進級</p>","url":"https://machikadon.online/@gonnta","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/607/414/794/656/459/original/f19f45e6ed866102.jpeg","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/109/607/414/794/656/459/original/f19f45e6ed866102.jpeg","header":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/109/607/414/794/656/459/original/ddb4448ee2d7b810.png","header_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/109/607/414/794/656/459/original/ddb4448ee2d7b810.png","followers_count":329,"following_count":261,"statuses_count":2051,"last_status_at":"2024-02-20","emojis":[],"fields":[{"name":"ブログ","value":"<a href=\"https://gonntantan.hatenablog.com/\" rel=\"nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">gonntantan.hatenablog.com/</span><span class=\"invisible\"></span></a>","verified_at":null},{"name":"高専","value":"大好きだよ♥","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"account":{"acct":"SnotFlickerman@lemmy.blahaj.zone","avatar":"https://friend.ketterle.ch/photo/contact/320/1ad98b32-ddd84706-d26d73b7848f1f0d?ts=1704496067","avatar_static":"https://friend.ketterle.ch/photo/contact/320/1ad98b32-ddd84706-d26d73b7848f1f0d?ts=1704496067&static=1","bot":false,"created_at":"2024-01-05T23:07:47.000Z","discoverable":true,"display_name":"Snot Flickerman","emojis":[],"fields":[],"followers_count":0,"following_count":0,"group":false,"header":"https://friend.ketterle.ch/photo/header/1ad98b32-ddd84706-d26d73b7848f1f0d?ts=1704496067","header_static":"https://friend.ketterle.ch/photo/header/1ad98b32-ddd84706-d26d73b7848f1f0d?ts=1704496067&static=1","id":"1252118","last_status_at":"2024-02-20T00:00:00.000Z","locked":false,"note":"Our News Team @ 11 with host Snot Flickerman","statuses_count":0,"url":"https://lemmy.blahaj.zone/u/SnotFlickerman","username":"SnotFlickerman"},"application":{"name":"lemmy (AP)"},"bookmarked":false,"card":null,"content":"<p>Exactly. The ACA made it so the homeless could get medical care without going broke. In my state, they’re mostly fully covered if they’ve bothered to apply for it.</p><p><strong>However,</strong> most homeless organizations still push a “housing first” model because access to medical care doesn’t really make life on the street any better. In fact, being on the street leads to higher instances of needing emergency services. When people have a “home” to go to, you’ll less often needing to be treating them for frostbite in the middle of winter, for example.</p>","created_at":"2024-02-20T22:34:50.000Z","edited_at":null,"emojis":[],"favourited":false,"favourites_count":0,"friendica":{"changed_at":"2024-02-20T22:34:52.000Z","commented_at":"2024-02-20T22:34:52.000Z","delivery_data":{"delivery_queue_count":null,"delivery_queue_done":null,"delivery_queue_failed":null},"disliked":false,"dislikes_count":0,"received_at":"2024-02-20T22:34:52.000Z","title":"","visibility":{"allow_cid":[],"allow_gid":[],"deny_cid":[],"deny_gid":[]}},"id":"3790784","in_reply_to_account_id":"915081","in_reply_to_id":"3790565","in_reply_to_status":{"account":{"acct":"FlyingSquid@lemmy.world","avatar":"https://friend.ketterle.ch/photo/contact/320/788257c4-0d7ef408-cc05100a2616cd4c?ts=1690975416","avatar_static":"https://friend.ketterle.ch/photo/contact/320/788257c4-0d7ef408-cc05100a2616cd4c?ts=1690975416&static=1","bot":false,"created_at":"2023-08-02T11:23:36.000Z","discoverable":true,"display_name":"Flying Squid","emojis":[],"fields":[],"followers_count":0,"following_count":0,"group":false,"header":"https://friend.ketterle.ch/photo/header/788257c4-0d7ef408-cc05100a2616cd4c?ts=1690975416","header_static":"https://friend.ketterle.ch/photo/header/788257c4-0d7ef408-cc05100a2616cd4c?ts=1690975416&static=1","id":"901387","last_status_at":"2024-02-20T00:00:00.000Z","locked":false,"note":"","statuses_count":0,"url":"https://lemmy.world/u/FlyingSquid","username":"FlyingSquid"},"application":{"name":"lemmy (AP)"},"bookmarked":false,"card":{"author_name":"Aimee Picchi","author_url":"https://x.com/@aimeepicchi","blurhash":"|DDlpAxXRgRPRPWHNGxtoz5AE1aboJogogRjjEa~}*Rjj]ozg5xWsSR+RjInozS7jERjRjbHbcs+-R%LR:R*ROWVkDoLoLIoocIqt8xss,t7kCR+$zs.NGbJogRjWCs:a}S6xtj=NHWBWBWBayofNLW;axV@t6t7ogWEoc","description":"A record 650,000 people experienced homelessness on a single January night, a 12% jump from a year earlier.","height":630,"history":[],"image":"https://assets1.cbsnewsstatic.com/hub/i/r/2023/12/05/b6e25347-757d-4382-b4c2-39ba01e8e176/thumbnail/1200x630/5126dbba33c3af9a48399a7f4ed69b69/homeless-veterans.jpg?v=2a01790210e495d24a119503c08f840d","provider_name":"CBS News","provider_url":"https://www.cbsnews.com/","title":"Homelessness in America reaches record level amid rising rents and end of COVID aid","type":"link","url":"https://www.cbsnews.com/news/homeless-record-america-12-percent-jump-high-rents/","width":1200},"content":"<p>I don’t know that I agree with that, and I say that as someone with a massive amount of medical debt. Putting someone in a home is more important than getting them socialized medical care. Both are very important, but your health is not going to improve if you live on the streets or in your car. And homelessness is booming.</p><p>I <em>absolutely</em> want socialized medicine in the U.S. No question. But homelessness in the U.S. is at record levels. And many of them have jobs, they just don’t have homes they can afford. This is a major crisis.</p><p><a href=\"https://www.cbsnews.com/news/homeless-record-america-12-percent-jump-high-rents/\" target=\"_blank\" rel=\"noopener noreferrer\">cbsnews.com/…/homeless-record-america-12-percent-…</a></p>","created_at":"2024-02-20T22:30:33.000Z","edited_at":null,"emojis":[],"favourited":false,"favourites_count":1,"friendica":{"changed_at":"2024-02-20T22:34:52.000Z","commented_at":"2024-02-20T22:34:52.000Z","delivery_data":{"delivery_queue_count":null,"delivery_queue_done":null,"delivery_queue_failed":null},"disliked":false,"dislikes_count":0,"received_at":"2024-02-20T22:30:33.000Z","title":"","visibility":{"allow_cid":[],"allow_gid":[],"deny_cid":[],"deny_gid":[]}},"id":"3790565","in_reply_to_account_id":"915081","in_reply_to_id":"3789988","in_reply_to_status":null,"language":"en","media_attachments":[],"mentions":[{"acct":"reddig33@lemmy.world","id":"853470","url":"https://lemmy.world/u/reddig33","username":"reddig33"}],"muted":false,"poll":null,"quote":null,"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":1,"sensitive":false,"spoiler_text":"","tags":[],"uri":"https://lemmy.world/comment/7739508","url":"https://lemmy.world/comment/7739508","visibility":"public"},"language":"en","media_attachments":[],"mentions":[{"acct":"FlyingSquid@lemmy.world","id":"901387","url":"https://lemmy.world/u/FlyingSquid","username":"FlyingSquid"}],"muted":false,"poll":null,"quote":null,"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"uri":"https://lemmy.blahaj.zone/comment/6644260","url":"https://lemmy.blahaj.zone/comment/6644260","visibility":"public"}
+
+event: update
+data: {"id":"111966191438297063","created_at":"2024-02-20T22:34:19.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"es","uri":"https://social.anacreonte.eu/objects/1c6c5223-1965-d528-ebaf-a91259778813","url":"https://social.anacreonte.eu/display/1c6c5223-1965-d528-ebaf-a91259778813","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"📊 <a href=\"https://social.anacreonte.eu/search?tag=mexico\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>mexico</span></a> ¿ya te enteraste de esta <a href=\"https://social.anacreonte.eu/search?tag=noticia\" class=\"mention hashtag\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">#<span>noticia</span></a>? Estado de salud de Daniel Bisogno HOY: Está intubado y en terapia intensiva <a href=\"https://www.elfinanciero.com.mx/espectaculos/2024/02/20/estado-de-salud-de-daniel-bisogno-hoy-esta-intubado-y-en-terapia-intensiva/\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">www.elfinanciero.com.mx/espect…</a>","reblog":null,"account":{"id":"111489321190816555","username":"lcrmx","acct":"lcrmx@social.anacreonte.eu","display_name":"LCR MX","locked":true,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2023-11-28T00:00:00.000Z","note":"Ser bruja, Lic.  en Comunicación y periodismo y además lesbi no es fácil, pues aún falta en el mundo más aceptación y tolerancia.<br>Comparto noticias y opiniones sobre todo de México y artículos relacionados con el LGBTQ+<br>Si quieres saber algo más de mi, simplemente pregunta.","url":"https://social.anacreonte.eu/profile/lcrmx","uri":"https://social.anacreonte.eu/profile/lcrmx","avatar":"https://files.mastodon.social/cache/accounts/avatars/111/489/321/190/816/555/original/82b56496d4715d41.jpeg","avatar_static":"https://files.mastodon.social/cache/accounts/avatars/111/489/321/190/816/555/original/82b56496d4715d41.jpeg","header":"https://files.mastodon.social/cache/accounts/headers/111/489/321/190/816/555/original/a652148649e58027.png","header_static":"https://files.mastodon.social/cache/accounts/headers/111/489/321/190/816/555/original/a652148649e58027.png","followers_count":31,"following_count":31,"statuses_count":4900,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[{"name":"mexico","url":"https://mastodon.social/tags/mexico"},{"name":"noticia","url":"https://mastodon.social/tags/noticia"}],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191448665990","created_at":"2024-02-20T22:34:57.448Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mastodon.social/users/psiodon/statuses/111966191448665990","url":"https://mastodon.social/@psiodon/111966191448665990","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>Ia m not an elephant</p>","reblog":null,"application":{"name":"Mastodon for Android","website":"https://app.joinmastodon.org/android"},"account":{"id":"111245986503922426","username":"psiodon","acct":"psiodon","display_name":"Psiodon","locked":false,"bot":false,"discoverable":null,"indexable":false,"group":false,"created_at":"2023-10-16T00:00:00.000Z","note":"<p>dad³ | Coder extraordinaire ¦ Love pure CSS ̣¦ Consultant at Extrapreneur, DevX, GitOps &amp; FE ¦ Cybersec enthusiast, OSINT ¦ Automation</p>","url":"https://mastodon.social/@psiodon","uri":"https://mastodon.social/users/psiodon","avatar":"https://mastodon.social/avatars/original/missing.png","avatar_static":"https://mastodon.social/avatars/original/missing.png","header":"https://mastodon.social/headers/original/missing.png","header_static":"https://mastodon.social/headers/original/missing.png","followers_count":0,"following_count":7,"statuses_count":9,"last_status_at":"2024-02-20","hide_collections":null,"noindex":false,"emojis":[],"roles":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191463800890","created_at":"2024-02-20T22:34:57.677Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mastodon.social/users/PCMag/statuses/111966191463800890","url":"https://mastodon.social/@PCMag/111966191463800890","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>OnePlus is ready to return to the smartwatch market, nearly three years after releasing its first-generation model.  <a href=\"https://www.pcmag.com/news/oneplus-preps-second-gen-smartwatch-that-promises-100-hour-battery-life\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://www.</span><span class=\"ellipsis\">pcmag.com/news/oneplus-preps-s</span><span class=\"invisible\">econd-gen-smartwatch-that-promises-100-hour-battery-life</span></a></p>","reblog":null,"application":{"name":"Web","website":null},"account":{"id":"108245701221172049","username":"PCMag","acct":"PCMag","display_name":"PCMag","locked":false,"bot":false,"discoverable":false,"indexable":false,"group":false,"created_at":"2022-05-04T00:00:00.000Z","note":"<p>For 40 years, your independent guide to technology with expert reviews, advice, news, and video. Full site at PCMag.com</p>","url":"https://mastodon.social/@PCMag","uri":"https://mastodon.social/users/PCMag","avatar":"https://files.mastodon.social/accounts/avatars/108/245/701/221/172/049/original/2dd173d21c49ed5d.jpeg","avatar_static":"https://files.mastodon.social/accounts/avatars/108/245/701/221/172/049/original/2dd173d21c49ed5d.jpeg","header":"https://files.mastodon.social/accounts/headers/108/245/701/221/172/049/original/37fdb69b17dfa7fe.jpeg","header_static":"https://files.mastodon.social/accounts/headers/108/245/701/221/172/049/original/37fdb69b17dfa7fe.jpeg","followers_count":6791,"following_count":52,"statuses_count":4491,"last_status_at":"2024-02-20","hide_collections":false,"noindex":false,"emojis":[],"roles":[],"fields":[{"name":"PCMag","value":"pcmag.com","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191484561703","created_at":"2024-02-20T22:34:57.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"zh-CN","uri":"https://m.cmx.im/users/kanita1921/statuses/111966191425277749","url":"https://m.cmx.im/@kanita1921/111966191425277749","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>家人们 我车的catalytic converter 被偷了两周。。。。我才发现。。还开车到了Michigan 车开起来没啥问题。。而且我的车因为是柴油 本身就有点噪音 我是看到check engine light而且闻到汽油之后去修车行 车行告诉我的 :0190: 现在面临要花七千修车还是干脆换车了 :0190:</p>","reblog":null,"account":{"id":"104504","username":"kanita1921","acct":"kanita1921@m.cmx.im","display_name":"阁楼上的沙发西葫芦小青","locked":true,"bot":false,"discoverable":false,"indexable":false,"group":false,"created_at":"2020-10-19T00:00:00.000Z","note":"<p>浅尝辄止,遍地开花。话痨型选手。</p>","url":"https://m.cmx.im/@kanita1921","uri":"https://m.cmx.im/users/kanita1921","avatar":"https://files.mastodon.online/cache/accounts/avatars/000/104/504/original/220c588d82b56a90.png","avatar_static":"https://files.mastodon.online/cache/accounts/avatars/000/104/504/original/220c588d82b56a90.png","header":"https://mastodon.online/headers/original/missing.png","header_static":"https://mastodon.online/headers/original/missing.png","followers_count":136,"following_count":68,"statuses_count":3856,"last_status_at":"2024-02-20","hide_collections":true,"emojis":[],"fields":[{"name":"简陋的博客","value":"<a href=\"https://pacificotter.wordpress.com/\" rel=\"nofollow noopener noreferrer\" translate=\"no\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">pacificotter.wordpress.com/</span><span class=\"invisible\"></span></a>","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[{"shortcode":"0190","url":"https://files.mastodon.online/cache/custom_emojis/images/000/002/730/original/27d5a88f74318ef4.png","static_url":"https://files.mastodon.online/cache/custom_emojis/images/000/002/730/static/27d5a88f74318ef4.png","visible_in_picker":true}],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"account":{"acct":"diu13131@misskey.io","avatar":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fio%2Fwebpublic-76b619b0-0627-4c95-8408-0af7cdb30060.png&avatar=1","avatar_static":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fmedia.misskeyusercontent.com%2Fio%2Fwebpublic-76b619b0-0627-4c95-8408-0af7cdb30060.png&avatar=1","bot":false,"created_at":"2024-02-06T02:09:36.115Z","discoverable":true,"display_name":"ぢう🔞:skeb::ablobblewobble:","emojis":[{"shortcode":"skeb","static_url":"https://media.misskeyusercontent.com/misskey/03e01164-c5f3-42e4-9c70-1619fef7f076.png","url":"https://media.misskeyusercontent.com/misskey/03e01164-c5f3-42e4-9c70-1619fef7f076.png","visible_in_picker":true},{"shortcode":"ablobblewobble","static_url":"https://media.misskeyusercontent.com/emoji/ablobblewobble.apng","url":"https://media.misskeyusercontent.com/emoji/ablobblewobble.apng","visible_in_picker":true},{"shortcode":"nsfw","static_url":"https://media.misskeyusercontent.com/misskey/webpublic-f376a594-1159-42c2-b7de-8676f89d7db3.png","url":"https://media.misskeyusercontent.com/misskey/webpublic-f376a594-1159-42c2-b7de-8676f89d7db3.png","visible_in_picker":true},{"shortcode":"renote_bakugeki","static_url":"https://media.misskeyusercontent.com/misskey/5a986f83-8ffd-4fbd-a8c8-f8ba4291ff12.png","url":"https://media.misskeyusercontent.com/misskey/5a986f83-8ffd-4fbd-a8c8-f8ba4291ff12.png","visible_in_picker":true},{"shortcode":"hunikideyatteru","static_url":"https://media.misskeyusercontent.com/emoji/hunikideyatteru.png","url":"https://media.misskeyusercontent.com/emoji/hunikideyatteru.png","visible_in_picker":true},{"shortcode":"oki_wo_tukete","static_url":"https://media.misskeyusercontent.com/misskey/1302f878-794a-4dff-bf74-b13cb36e1860.png","url":"https://media.misskeyusercontent.com/misskey/1302f878-794a-4dff-bf74-b13cb36e1860.png","visible_in_picker":true},{"shortcode":"twitter","static_url":"https://media.misskeyusercontent.com/emoji/twitter.png","url":"https://media.misskeyusercontent.com/emoji/twitter.png","visible_in_picker":true},{"shortcode":"tuduki_ha_fanbox_de","static_url":"https://media.misskeyusercontent.com/misskey/76bdf816-bded-435d-ac0f-821852204e81.png","url":"https://media.misskeyusercontent.com/misskey/76bdf816-bded-435d-ac0f-821852204e81.png","visible_in_picker":true},{"shortcode":"pixiv_icon","static_url":"https://media.misskeyusercontent.com/emoji/pixiv_icon.png","url":"https://media.misskeyusercontent.com/emoji/pixiv_icon.png","visible_in_picker":true}],"fields":[],"followers_count":13,"following_count":10,"fqn":"diu13131@misskey.io","header":"https://media.misskeyusercontent.com/io/04bb776f-328d-4c5a-9596-28d2542aed6a.png","header_static":"https://media.misskeyusercontent.com/io/04bb776f-328d-4c5a-9596-28d2542aed6a.png","id":"9pdaeo376unp5vqu","locked":false,"moved":null,"note":"ブルアカの:nsfw:を描きます!!作品はクリップを見てね\n:renote_bakugeki::hunikideyatteru::oki_wo_tukete:\n18歳未満は見ないでね\n:twitter:→https://twitter.com/7vUKaVNSQz48026\n:skeb:→https://skeb.jp/@7vUKaVNSQz48026\n:tuduki_ha_fanbox_de:→https://diu131.fanbox.cc\n:pixiv_icon:→https://www.pixiv.net/users/102967477\n#ブルアカ #ブルーアーカイブ ","statuses_count":153,"uri":"https://misskey.io/users/9pbrzkamm7sp0jy9","url":"https://misskey.io/users/9pbrzkamm7sp0jy9","username":"diu13131"},"application":null,"bookmarked":false,"card":null,"content":"","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:45.930Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyic5yiq3p70ykk","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":false,"reactions":[],"reblog":{"account":{"acct":"UnoRyoku@misskey.io","avatar":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-257e172d-a82e-47ff-aade-1f77e218292a.webp&avatar=1","avatar_static":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-257e172d-a82e-47ff-aade-1f77e218292a.webp&avatar=1","bot":false,"created_at":"2023-12-14T11:11:16.388Z","discoverable":true,"display_name":"温野りょく@1日目西め25a","emojis":[],"fields":[{"name":"Twitter","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://twitter.com/UnoRyoku\">twitter.com/UnoRyoku</a>","verified_at":null},{"name":"pixiv","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http://pixiv.me/aka_oni22\">pixiv.me/aka_oni22</a>","verified_at":null},{"name":"Skeb","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http://skeb.jp/@UnoRyoku\">skeb.jp/@UnoRyoku</a>","verified_at":null}],"followers_count":1177,"following_count":64,"fqn":"UnoRyoku@misskey.io","header":"https://s3.arkjp.net/misskey/webpublic-cef65967-42ac-4f90-abc1-2bdb0d09cd34.png","header_static":"https://s3.arkjp.net/misskey/webpublic-cef65967-42ac-4f90-abc1-2bdb0d09cd34.png","id":"9n8nz9gkbreugplv","locked":false,"moved":null,"note":"絵を描いたり漫画かいたりソシャゲしたり。","statuses_count":54,"uri":"https://misskey.io/users/9h7fh6i4ln","url":"https://misskey.io/users/9h7fh6i4ln","username":"UnoRyoku"},"application":null,"bookmarked":false,"card":null,"content":"<p><span>ミサキ</span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:14.549Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyibhqtq3p70ykj","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[{"blurhash":"eQJtb#n,56s:xu_Nspt7s:of^,Rj%LWBRj55t7ofW=RP%3t7WBj]WB","description":null,"id":"9pyic8d0q3p70yki","meta":{"height":1328,"width":2048},"preview_url":"https://media.misskeyusercontent.com/io/4632e661-90d6-4b6f-a552-67b3114efa7b.webp","remote_url":"https://media.misskeyusercontent.com/io/4632e661-90d6-4b6f-a552-67b3114efa7b.webp","text_url":"https://media.misskeyusercontent.com/io/4632e661-90d6-4b6f-a552-67b3114efa7b.webp","type":"image","url":"https://media.misskeyusercontent.com/io/4632e661-90d6-4b6f-a552-67b3114efa7b.webp"}],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":false,"reactions":[],"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":0,"sensitive":true,"spoiler_text":"","tags":[],"text":"ミサキ","uri":"https://misskey.io/notes/9pyibhqtfzjv00n8","url":"https://misskey.io/notes/9pyibhqtfzjv00n8","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":null,"uri":"https://misskey.io/notes/9pyic5yil0c30143/activity","url":"https://misskey.io/notes/9pyic5yil0c30143/activity","visibility":"public"}
+
+event: update
+data: {"account":{"acct":"C_Chell@equestria.social","avatar":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fcr2.wubba.boo%2Fcalckey%2Fa920d85f-2ccf-465c-9cce-9b32cefea2b0.png&avatar=1","avatar_static":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fcr2.wubba.boo%2Fcalckey%2Fa920d85f-2ccf-465c-9cce-9b32cefea2b0.png&avatar=1","bot":false,"created_at":"2023-05-17T13:18:35.588Z","discoverable":true,"display_name":"C_Chell","emojis":[],"fields":[{"name":"Comics website","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://www.canterlotcomics.com/\">www.canterlotcomics.com/</a>","verified_at":null},{"name":"News website","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://www.c-chell.fr/\">www.c-chell.fr/</a>","verified_at":null},{"name":"Alternative account","value":"<span>@C_Chell@framapiaf.org</span>","verified_at":null},{"name":"Pronoun","value":"<span>he/him</span>","verified_at":null}],"followers_count":1022,"following_count":1401,"fqn":"C_Chell@equestria.social","header":"https://dev.joinsharkey.org/static-assets/transparent.png","header_static":"https://dev.joinsharkey.org/static-assets/transparent.png","id":"9evam98ksc","locked":false,"moved":null,"note":"Administrator of http://www.canterlotcomics.com ( @CanterlotComics@equestria.social ), http://www.c-chell.fr and this instance.\nMy OCs can be found on this page : https://www.canterlotcomics.com/comic/en/404_kimi_not_found-404","statuses_count":34624,"uri":"https://equestria.social/users/C_Chell","url":"https://equestria.social/users/C_Chell","username":"C_Chell"},"application":null,"bookmarked":false,"card":null,"content":"","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:34:45.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyic58oq3p70ykm","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":false,"reactions":[],"reblog":{"account":{"acct":"Shyle@mastodon.social","avatar":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fcr2.wubba.boo%2Fcalckey%2Fb5879f42-5e03-4fac-9d5a-02e556ba02e1.png&avatar=1","avatar_static":"https://wubba.boo/proxy/avatar.webp?url=https%3A%2F%2Fcr2.wubba.boo%2Fcalckey%2Fb5879f42-5e03-4fac-9d5a-02e556ba02e1.png&avatar=1","bot":false,"created_at":"2023-05-13T22:41:37.504Z","discoverable":false,"display_name":"Shyle","emojis":[],"fields":[{"name":"Site","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http://shylezalewski.com\">shylezalewski.com</a>","verified_at":null},{"name":"Instagram","value":"<a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https://www.instagram.com/shylezalewski/\">www.instagram.com/shylezalewski/</a>","verified_at":null}],"followers_count":3555,"following_count":10,"fqn":"Shyle@mastodon.social","header":"https://dev.joinsharkey.org/static-assets/transparent.png","header_static":"https://dev.joinsharkey.org/static-assets/transparent.png","id":"9eq4ywv4o0","locked":false,"moved":null,"note":"Multitâches, fait des BD un peu partout, mini-punk chez Edam Edam, coupe des légumes chez l'empereur du Japon et dessine des fesses","statuses_count":259,"uri":"https://mastodon.social/users/Shyle","url":"https://mastodon.social/users/Shyle","username":"Shyle"},"application":null,"bookmarked":false,"card":null,"content":"<p><span>Je pense que j'aurais vu cette pub ado j'aurais plus jamais lâché ma GBA de toute la vie.</span></p>","content_type":"text/x.misskeymarkdown","created_at":"2024-02-20T22:33:18.000Z","emoji_reactions":[],"emojis":[],"favourited":false,"favourites_count":0,"id":"9pyiaa40q3p70yi8","in_reply_to_account_id":null,"in_reply_to_id":null,"language":null,"media_attachments":[{"blurhash":"eVPpTU}tGEb^LKjsrrrrjFrrJ7jFW;eojZTJo2jFbvn%Kiayi_i_ni","description":null,"id":"9pyiabu0q3p70yi7","meta":{"height":1226,"width":1692},"preview_url":"https://files.mastodon.social/media_attachments/files/111/966/183/140/231/207/original/6a97f1edd5671b82.jpg","remote_url":"https://files.mastodon.social/media_attachments/files/111/966/183/140/231/207/original/6a97f1edd5671b82.jpg","text_url":"https://files.mastodon.social/media_attachments/files/111/966/183/140/231/207/original/6a97f1edd5671b82.jpg","type":"image","url":"https://files.mastodon.social/media_attachments/files/111/966/183/140/231/207/original/6a97f1edd5671b82.jpg"}],"mentions":[],"muted":false,"pinned":false,"poll":null,"quote":false,"reactions":[],"reblog":null,"reblogged":false,"reblogs_count":1,"replies_count":2,"sensitive":false,"spoiler_text":"","tags":[],"text":"Je pense que j'aurais vu cette pub ado j'aurais plus jamais lâché ma GBA de toute la vie.","uri":"https://mastodon.social/users/Shyle/statuses/111966184973498432","url":"https://mastodon.social/@Shyle/111966184973498432","visibility":"public"},"reblogged":false,"reblogs_count":0,"replies_count":0,"sensitive":false,"spoiler_text":"","tags":[],"text":null,"uri":"https://equestria.social/users/C_Chell/statuses/111966190694157432/activity","url":"https://equestria.social/users/C_Chell/statuses/111966190694157432/activity","visibility":"public"}
+
+event: update
+data: {"id":"111966191496658436","created_at":"2024-02-20T22:34:57.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://rubber.social/users/zwolf59661/statuses/111966191416928903","url":"https://rubber.social/@zwolf59661/111966191416928903","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>I've been thinking recently about just going to a regular women's clothing store and looking around, and if they ask if I need help with something, to tell them flat out that I'm shopping for myself.</p>","reblog":null,"account":{"id":"109329799538851267","username":"zwolf59661","acct":"zwolf59661@rubber.social","display_name":"Z Wolf","locked":false,"bot":false,"discoverable":true,"indexable":false,"group":false,"created_at":"2018-12-04T00:00:00.000Z","note":"<p>Just a regular guy. Doesn't exist when you're not looking. Pup, kink, furry, and personal stuff, I guess.</p>","url":"https://rubber.social/@zwolf59661","uri":"https://rubber.social/users/zwolf59661","avatar":"https://medias.meow.social/cache/accounts/avatars/109/329/799/538/851/267/original/7d1cea8185da2692.jpeg","avatar_static":"https://medias.meow.social/cache/accounts/avatars/109/329/799/538/851/267/original/7d1cea8185da2692.jpeg","header":"https://meow.social/headers/original/missing.png","header_static":"https://meow.social/headers/original/missing.png","followers_count":49,"following_count":182,"statuses_count":265,"last_status_at":"2024-02-20","hide_collections":false,"emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191494595160","created_at":"2024-02-20T22:34:57.943Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://mk.shrimpia.network/notes/9pyicf87nc","url":"https://mk.shrimpia.network/notes/9pyicf87nc","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"<p>抱えきれないよ〜〜〜</p>","reblog":null,"account":{"id":"199865","username":"7n4_sh","acct":"7n4_sh@mk.shrimpia.network","display_name":"かがみ","locked":true,"bot":false,"created_at":"2023-02-11T09:09:17.771Z","note":"<p><span>帝国民になりました</span></p>","url":"https://mk.shrimpia.network/@7n4_sh","avatar":"https://d.c-cha.cc/system/accounts/avatars/000/199/865/original/399b04479514461f.png?1707927365","avatar_static":"https://d.c-cha.cc/system/accounts/avatars/000/199/865/original/399b04479514461f.png?1707927365","header":"https://d.c-cha.cc/headers/original/missing.png","header_static":"https://d.c-cha.cc/headers/original/missing.png","followers_count":83,"following_count":83,"statuses_count":5673,"last_status_at":"2024-02-20T22:34:58.153Z","emojis":[],"fields":[{"name":"本垢","value":"@7n4@kagamisskey.com","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191520705857","created_at":"2024-02-20T22:34:58.546Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mas.to/users/SwiftPackageUpdates/statuses/111966191520705857","url":"https://mas.to/@SwiftPackageUpdates/111966191520705857","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>⬆️ Behrouz just released FAWS v1.0.2</p><p><a href=\"https://swiftpackageindex.com/behrouzz/FAWS#releases\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">swiftpackageindex.com/behrouzz</span><span class=\"invisible\">/FAWS#releases</span></a></p>","reblog":null,"application":{"name":"Swift Package Updates","website":"https://swiftpackageindex.com"},"account":{"id":"109307242754420486","username":"SwiftPackageUpdates","acct":"SwiftPackageUpdates","display_name":"Swift Package Updates","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2022-11-08T00:00:00.000Z","note":"<p>Get updates on new packages as they happen! Sourced from the <span class=\"h-card\" translate=\"no\"><a href=\"https://mas.to/@SwiftPackageIndex\" class=\"u-url mention\">@<span>SwiftPackageIndex</span></a></span>.</p>","url":"https://mas.to/@SwiftPackageUpdates","uri":"https://mas.to/users/SwiftPackageUpdates","avatar":"https://media.mas.to/masto-public/accounts/avatars/109/307/242/754/420/486/original/90f014feb1575bf1.png","avatar_static":"https://media.mas.to/masto-public/accounts/avatars/109/307/242/754/420/486/original/90f014feb1575bf1.png","header":"https://media.mas.to/masto-public/accounts/headers/109/307/242/754/420/486/original/677ad4760739841c.jpeg","header_static":"https://media.mas.to/masto-public/accounts/headers/109/307/242/754/420/486/original/677ad4760739841c.jpeg","followers_count":178,"following_count":3,"statuses_count":16586,"last_status_at":"2024-02-20","noindex":false,"emojis":[],"roles":[],"fields":[{"name":"Website","value":"<a href=\"https://swiftpackageindex.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"\">swiftpackageindex.com</span><span class=\"invisible\"></span></a>","verified_at":"2022-11-08T14:42:13.463+00:00"}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null,"filtered":[]}
+
+event: update
+data: {"id":"111966191536876866","created_at":"2024-02-20T22:34:58.792Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"ja","uri":"https://mstdn.jp/users/t41sei/statuses/111966191536876866","url":"https://mstdn.jp/@t41sei/111966191536876866","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>今日はニンダイ</p>","reblog":null,"application":{"name":"Mastodon for Android","website":"https://app.joinmastodon.org/android"},"account":{"id":"569049","username":"t41sei","acct":"t41sei","display_name":"たいせい","locked":true,"bot":false,"discoverable":false,"group":false,"created_at":"2018-08-16T00:00:00.000Z","note":"<p>おれのきんたまでんきだま</p>","url":"https://mstdn.jp/@t41sei","avatar":"https://media.mstdn.jp/accounts/avatars/000/569/049/original/7c3dde16908781727d2ae9aa11d19cbb.png","avatar_static":"https://media.mstdn.jp/accounts/avatars/000/569/049/original/7c3dde16908781727d2ae9aa11d19cbb.png","header":"https://media.mstdn.jp/accounts/headers/000/569/049/original/96791484bc9c1389.jpg","header_static":"https://media.mstdn.jp/accounts/headers/000/569/049/original/96791484bc9c1389.jpg","followers_count":41,"following_count":42,"statuses_count":3596,"last_status_at":"2024-02-20","noindex":true,"emojis":[],"roles":[],"fields":[{"name":"出身地","value":"でんがなまんがな","verified_at":null},{"name":"職業","value":"エンジニア","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"id":"111966191163324399","created_at":"2024-02-19T12:47:57.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://gamepad.club/users/Vysk/statuses/111958220965873136","url":"https://gamepad.club/@Vysk/111958220965873136","replies_count":0,"reblogs_count":0,"favourites_count":0,"edited_at":null,"content":"<p>Been playing a lot of Remnant 2 lately and that game is great. I dunno what I expected but it's got stuff in there. It's weird and isn't afraid to be esoteric in old school ways.</p>","reblog":null,"account":{"id":"111852664249947525","username":"Vysk","acct":"Vysk@gamepad.club","display_name":"Vysk","locked":false,"bot":false,"discoverable":false,"group":false,"created_at":"2024-01-31T00:00:00.000Z","note":"<p>I play lots of things, but I talk mostly about FFXIV<br>Be good to one another</p><p>he/him/his</p>","url":"https://gamepad.club/@Vysk","avatar":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/111/852/664/249/947/525/original/15c6d1bb9e292a19.jpg","avatar_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/avatars/111/852/664/249/947/525/original/15c6d1bb9e292a19.jpg","header":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/111/852/664/249/947/525/original/9c8669b5be76ce3e.jpg","header_static":"https://nyc3.digitaloceanspaces.com/waynesocialfiles/cache/accounts/headers/111/852/664/249/947/525/original/9c8669b5be76ce3e.jpg","followers_count":40,"following_count":0,"statuses_count":19,"last_status_at":"2024-02-20","emojis":[],"fields":[{"name":"Aether","value":"Midgardsormr","verified_at":null},{"name":"Cats","value":"Luka and Mellie","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}
+
+event: update
+data: {"created_at":"2024-02-20T22:34:26.806Z","url":"https://transfem.social/notes/9pyibr7a2x810blf","content":"<p>you know i think it's time to mix up the jungle juice of my exported blog and post some shit from there :)</p>","account":{"username":"puppygirlhornypost","display_name":"Amber","url":"https://transfem.social/@puppygirlhornypost","bot":false},"tags":[],"sensitive":false,"mentions":[],"language":null,"media_attachments":[],"reblog":null}
blob - /dev/null
blob + 98920cf1f952c00418589b08f7b34bebf76b344f (mode 644)
--- /dev/null
+++ mastodon/stream.go
@@ -0,0 +1,98 @@
+package mastodon
+
+import (
+	"bufio"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"strings"
+)
+
+type notification struct {
+	Post Post `json:"status"`
+}
+
+type Stream struct {
+	rc   io.ReadCloser
+	sc   *bufio.Scanner
+	err  error
+	post Post
+}
+
+type field struct {
+	Name string
+	Data []byte
+}
+
+func parseField(line []byte) field {
+	name, data, found := bytes.Cut(line, []byte(":"))
+	if !found {
+		return field{}
+	}
+	return field{string(name), bytes.TrimSpace(data)}
+}
+
+func (st *Stream) Next() bool {
+	if !st.sc.Scan() {
+		return false
+	}
+	if st.sc.Text() == "" {
+		return st.Next()
+	} else if strings.HasPrefix(st.sc.Text(), ":") {
+		// comment message; safe to ignore
+		return st.Next()
+	}
+	ev := parseField(st.sc.Bytes())
+	switch ev.Name {
+	default:
+		st.err = fmt.Errorf("invalid field in message: %s", ev.Name)
+	case "event":
+		if string(ev.Data) != "update" {
+			st.err = fmt.Errorf("unhandled event type %s", string(ev.Data))
+			st.rc.Close()
+			return false
+		}
+		return st.Next()
+	case "data":
+		var p Post
+		if err := json.Unmarshal(ev.Data, &p); err != nil {
+			st.err = err
+			st.rc.Close()
+			return false
+		}
+		st.post = p
+		return true
+	}
+	st.rc.Close()
+	return false
+}
+
+func (st *Stream) Post() Post {
+	return st.post
+}
+
+func (st *Stream) Err() error {
+	return st.err
+}
+
+func Watch(streamURL, token string) (*Stream, error) {
+	req, err := http.NewRequest(http.MethodGet, streamURL, nil)
+	if err != nil {
+		return nil, err
+	}
+	req.Header.Set("Accept", "text/event-stream")
+	req.Header.Set("Authorization", "Bearer "+token)
+	resp, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	if resp.StatusCode >= 400 {
+		return nil, fmt.Errorf("non-ok response status: %s", resp.Status)
+	}
+	return &Stream{
+		rc: resp.Body,
+		sc: bufio.NewScanner(resp.Body),
+	}, nil
+}
blob - /dev/null
blob + 97a3da359c939b4c144dc861d988481f094fa619 (mode 644)
--- /dev/null
+++ mastodon/stream_test.go
@@ -0,0 +1,26 @@
+package mastodon
+
+import (
+	"bufio"
+	"os"
+	"testing"
+)
+
+func TestStream(t *testing.T) {
+	f, err := os.Open("posts.txt")
+	if err != nil {
+		t.Fatal(err)
+	}
+	sc := bufio.NewScanner(f)
+	stream := &Stream{
+		rc: f,
+		sc: sc,
+	}
+	for stream.Next() {
+		post := stream.Post()
+		t.Log(post.URL)
+	}
+	if stream.Err() != nil {
+		t.Error(stream.Err())
+	}
+}
blob - 3a1cec9332e93a2092f1280ed7f9164d03bfcf60 (mode 644)
blob + /dev/null
--- post.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package apub
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/sha256"
-	"encoding/base64"
-	"encoding/json"
-	"fmt"
-	"io"
-	"log"
-	"net/http"
-	"net/http/httputil"
-	"time"
-)
-
-// Sign signs the given HTTP request with the matching private key of the
-// public key available at pubkeyURL.
-func Sign(req *http.Request, key *rsa.PrivateKey, pubkeyURL string) error {
-	date := time.Now().UTC().Format(http.TimeFormat)
-	hash := sha256.New()
-	fmt.Fprintf(hash, "(request-target): post %s\n", req.URL.Path)
-	fmt.Fprintf(hash, "host: %s\n", req.URL.Host)
-	fmt.Fprintf(hash, "date: %s", date)
-	if req.Method == http.MethodPost {
-		buf := &bytes.Buffer{}
-		io.Copy(buf, req.Body)
-		req.Body.Close()
-		req.Body = io.NopCloser(buf)
-		digest := sha256.Sum256(buf.Bytes())
-		d := fmt.Sprintf("sha-256=%s", base64.StdEncoding.EncodeToString(digest[:]))
-		// append a newline to the "date" key as we assumed we didn't
-		// need one before.
-		fmt.Fprintf(hash, "\n")
-		fmt.Fprintf(hash, "digest: %s", d)
-		req.Header.Set("Digest", d)
-	}
-	sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, hash.Sum(nil))
-	if err != nil {
-		return err
-	}
-
-	sigKeys := "(request-target) host date"
-	if req.Method == http.MethodPost {
-		sigKeys += " digest"
-	}
-	val := fmt.Sprintf("keyId=%q,headers=%q,signature=%q", pubkeyURL, sigKeys, base64.StdEncoding.EncodeToString(sig))
-
-	req.Header.Set("Signature", val)
-	req.Header.Set("Date", date)
-	return nil
-}
-
-func Post(inbox string, key *rsa.PrivateKey, activity *Activity) error {
-	body := &bytes.Buffer{}
-	if err := json.NewEncoder(body).Encode(activity); err != nil {
-		return fmt.Errorf("encode activity: %w", err)
-	}
-	req, err := http.NewRequest(http.MethodPost, inbox, body)
-	if err != nil {
-		return err
-	}
-	req.Header.Set("Content-Type", ContentType)
-	/*
-		if err := Sign(req, key, activity.Object.AttributedTo+"#main-key"); err != nil {
-			return fmt.Errorf("sign request: %w", err)
-		}
-	*/
-
-	b, err := httputil.DumpRequestOut(req, true)
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Println(string(b))
-
-	resp, err := http.DefaultClient.Do(req)
-	if err != nil {
-		return err
-	}
-	defer resp.Body.Close()
-	b, err = httputil.DumpResponse(resp, true)
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Println(string(b))
-
-	if resp.StatusCode != http.StatusOK {
-		return fmt.Errorf("non-ok response status %s", resp.Status)
-	}
-	return nil
-}
blob - /dev/null
blob + a6afe2d49dbeeb9ae3eed08968c193250a9ceadb (mode 644)
--- /dev/null
+++ sign.go
@@ -0,0 +1,89 @@
+package apub
+
+import (
+	"bytes"
+	"crypto"
+	"crypto/rand"
+	"crypto/rsa"
+	"crypto/sha256"
+	"encoding/base64"
+	"fmt"
+	"io"
+	"net/http"
+	"strings"
+	"time"
+)
+
+const requiredSigHeaders = "(request-target) host date digest"
+
+// Sign signs the given HTTP request with the matching private key of the
+// public key available at pubkeyURL.
+func Sign(req *http.Request, key *rsa.PrivateKey, pubkeyURL string) error {
+	date := time.Now().UTC().Format(http.TimeFormat)
+	req.Header.Set("Date", date)
+	hash := sha256.New()
+	fmt.Fprintln(hash, "(request-target):", strings.ToLower(req.Method), req.URL.Path)
+	fmt.Fprintln(hash, "host:", req.URL.Hostname())
+	fmt.Fprintln(hash, "date:", date)
+
+	buf := &bytes.Buffer{}
+	io.Copy(buf, req.Body)
+	req.Body.Close()
+	req.Body = io.NopCloser(buf)
+	digest := sha256.Sum256(buf.Bytes())
+	d := "SHA-256=" + base64.StdEncoding.EncodeToString(digest[:])
+	fmt.Fprintf(hash, "digest: %s", d)
+	req.Header.Set("Digest", d)
+
+	sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, hash.Sum(nil))
+	if err != nil {
+		return err
+	}
+	bsig := base64.StdEncoding.EncodeToString(sig)
+
+	sigKeys := "(request-target) host date digest"
+	val := fmt.Sprintf("keyId=%q,algorithm=%q,headers=%q,signature=%q", pubkeyURL, "rsa-sha256", sigKeys, bsig)
+	req.Header.Set("Signature", val)
+	return nil
+}
+
+type signature struct {
+	keyID     string
+	algorithm string
+	headers   string
+	signature string
+}
+
+func parseSignatureHeader(line string) (signature, error) {
+	var sig signature
+	for _, v := range strings.Split(line, ",") {
+		name, val, ok := strings.Cut(v, "=")
+		if !ok {
+			return sig, fmt.Errorf("bad field: %s from %s", v, line)
+		}
+		val = strings.Trim(val, `"`)
+		switch name {
+		case "keyId":
+			sig.keyID = val
+		case "algorithm":
+			sig.algorithm = val
+		case "headers":
+			sig.headers = val
+		case "signature":
+			sig.signature = val
+		default:
+			return signature{}, fmt.Errorf("bad field name %s", name)
+		}
+	}
+
+	if sig.keyID == "" {
+		return sig, fmt.Errorf("missing signature field keyId")
+	} else if sig.algorithm == "" {
+		return sig, fmt.Errorf("missing signature field algorithm")
+	} else if sig.headers == "" {
+		return sig, fmt.Errorf("missing signature field headers")
+	} else if sig.signature == "" {
+		return sig, fmt.Errorf("missing signature field signature")
+	}
+	return sig, nil
+}
blob - /dev/null
blob + 884413133471fb99cba255807cf494132b0a8bdc (mode 644)
--- /dev/null
+++ sign_test.go
@@ -0,0 +1,37 @@
+package apub
+
+import (
+	"crypto/rsa"
+	"crypto/x509"
+	"encoding/pem"
+	"fmt"
+	"net/http"
+	"os"
+	"strings"
+	"testing"
+)
+
+func readPrivKey(name string) (*rsa.PrivateKey, error) {
+	b, err := os.ReadFile(name)
+	if err != nil {
+		return nil, err
+	}
+	block, _ := pem.Decode(b)
+	return x509.ParsePKCS1PrivateKey(block.Bytes)
+}
+
+func TestSign(t *testing.T) {
+	req, err := http.NewRequest(http.MethodPost, "http://example.invalid", strings.NewReader("hello, world!"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	key, err := readPrivKey("testdata/private.pem")
+	if err != nil {
+		t.Fatal(err)
+	}
+	if err := Sign(req, key, "http://from.invalid/actor"); err != nil {
+		t.Fatal(err)
+	}
+	fmt.Println(req.Header.Get("Digest"))
+	fmt.Println(req.Header.Get("Signature"))
+}