all repos — underbbs @ c00eb7d9b30b68086ab36ef214024ea68637bba4

decentralized social media client

got mentions from misskey adapter to the client
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iHUEABYKAB0WIQT/foVVmI9pK13hPWFohAcXSWbK8wUCZneeRwAKCRBohAcXSWbK
85v2AP9V7RmVVmZ2OcvJjJbX7/mGuUgqdPNiKJSFgaVpEIgmFgD+Og5LPyQIe0c7
00/8eTHG59ZVFCmux1/GRC2cJAiWjws=
=H7Gi
-----END PGP SIGNATURE-----
commit

c00eb7d9b30b68086ab36ef214024ea68637bba4

parent

678e5e62584a2edc9f909c0b02247fa7ba95f71c

3 files changed, 85 insertions(+), 31 deletions(-)

jump to
M adapter/misskey.goadapter/misskey.go

@@ -32,10 +32,14 @@ follows chan mkm.FollowStatus

} func (self *MisskeyAdapter) Init(settings Settings, data chan SocketData) error { + fmt.Println("initializing misskey adapter") + self.nickname = settings.Nickname self.server = *settings.Server self.apiKey = *settings.ApiKey self.data = data + + fmt.Println("getting ready to initialize internal client") client, err := misskey.NewClientWithOptions( misskey.WithAPIToken(self.apiKey),

@@ -43,9 +47,14 @@ misskey.WithBaseURL("https", self.server, ""),

) if err != nil { + fmt.Println(err.Error()) return err } + fmt.Println("misskey client initialized") self.mk = client + + self.cache = make(map[string]time.Time) + return nil }

@@ -72,37 +81,49 @@ notesService := self.mk.Notes()

timelineService := notesService.Timeline() for { - _, moar := <-self.stop - if !moar { - break - } + select { + case _, ok := <-self.stop: + if !ok { + return + } + default: + + // TODO: we have to actually decode and pass our filter criteria + tlnotes, tlerr := timelineService.Get(tl.GetRequest{ + Limit: 50, + // how are you supposed to bootstrap these?? + SinceID: "xxxxxxxxxx", + UntilID: "xxxxxxxxxx", + SinceDate: 0, + }) + mentions, merr := notesService.Mentions(notes.MentionsRequest{ + Limit: 50, + }) - // TODO: we have to actually decode and pass our filter criteria - tlnotes, tlerr := timelineService.Get(tl.GetRequest{}) - mentions, merr := notesService.Mentions(notes.MentionsRequest{}) + if tlerr != nil { + fmt.Println(tlerr.Error()) + } + if merr != nil { + fmt.Println(merr.Error()) + } - if tlerr != nil { - fmt.Println(tlerr.Error()) - } - if merr != nil { - fmt.Println(merr.Error()) + // check the cache for everything we just collected + // if anything is newer or as of yet not in the cache, add it + // and convert it to a SocketData implementation before sending on data channel + for _, n := range tlnotes { + msg := self.cacheAndConvert(n) + if msg != nil { + self.data <- msg + } + } + for _, n := range mentions { + msg := self.cacheAndConvert(n) + if msg != nil { + self.data <- msg + } + } } - // check the cache for everything we just collected - // if anything is newer or as of yet not in the cache, add it - // and convert it to a SocketData implementation before sending on data channel - for _, n := range tlnotes { - fmt.Println(n.ID) - // check existence and cache - // convert - // send - } - for _, n := range mentions { - fmt.Println(n.ID) - // check existence and cache - // convert - // send - } } }()

@@ -110,6 +131,28 @@

return nil } +func (self *MisskeyAdapter) cacheAndConvert(n mkm.Note) *Message { + timestamp, exists := self.cache[n.ID] + if !exists || timestamp.Before(n.CreatedAt) { + self.cache[n.ID] = n.CreatedAt + msg := Message{ + Uri: n.URI, + Author: Author{ + Id: n.User.ID, + Name: n.User.Name, + // ProfileUri: *n.User.URL, + ProfilePic: n.User.AvatarURL, + }, + Protocol: "misskey", + Adapter: self.nickname, + Created: n.CreatedAt, + Content: n.Text, + } + return &msg + } + return nil +} + func (self *MisskeyAdapter) Fetch(query string) error { return nil }

@@ -117,3 +160,7 @@

func (self *MisskeyAdapter) Do(action string) error { return nil } + +func (self *MisskeyAdapter) DefaultSubscriptionFilter() string { + return "" +}
M server/api.goserver/api.go

@@ -79,6 +79,8 @@ case "nostr":

a = &adapter.NostrAdapter{} case "mastodon": a = &adapter.MastoAdapter{} + case "misskey": + a = &adapter.MisskeyAdapter{} default: break
M ts/index.tsts/index.ts

@@ -91,7 +91,7 @@ const tabcontent = $("tabcontent");

if (tabcontent) { // dropdown for protocol let html = "<select id='settings_newadapter_protocolselect' onchange='fillAdapterProtocolOptions()'>"; - html += [ "nostr", "mastodon" ].reduce((self, p)=>{ + html += [ "nostr", "mastodon", "misskey" ].reduce((self, p)=>{ self += `<option value='${p}'>${p}</option>`; return self; }, "");

@@ -123,6 +123,7 @@ html += " <label>privkey<input id='settings_newadapter_nostr_privkey'/></label>";

html += " <label>default relays<input id='settings_newadapter_nostr_default_relays'/></label>"; break; case "mastodon": + case "misskey": html += " <label>nickname<input id='settings_newadapter_nickname'/></label>"; html += " <label>server<input id='settings_newadapter_masto_server'/></label>"; html += " <label>API key<input id='settings_newadapter_masto_apikey'/></label>";

@@ -171,18 +172,22 @@ const relays = ($("settings_newadapter_nostr_default_relays") as HTMLInputElement)?.value ?? "";

self = { nickname: nickname, protocol: "nostr", privkey: privkey, relays: relays.split(",").map(r=>r.trim()) }; break; case "mastodon": + case "misskey": const server = ($("settings_newadapter_masto_server") as HTMLInputElement)?.value ?? ""; const apiKey = ($("settings_newadapter_masto_apikey") as HTMLInputElement)?.value ?? ""; - self = { nickname: nickname, protocol: "mastodon", server: server, apiKey: apiKey }; + self = { nickname: nickname, protocol: proto.options[proto.selectedIndex].value, server: server, apiKey: apiKey }; break; } const settings = _("settings"); - const adapters = _("adapters"); - if (settings && adapters) { + let adapters = _("adapters"); + if (settings) { if (!settings.adapters) { settings.adapters = []; } settings.adapters.push(self); + if (!adapters) { + adapters = [] + } let a: Adapter = Adapter.create(); switch (self.protocol) { case "nostr":